am 24dde0e8: am c7375b1c: am cea5d1c2: am fffcb9d9: am 9661871f: am 8d38cdd2: Merge "Projection Widget Test: Remove two unnecessary buttons" into lollipop-mr1-cts-dev

* commit '24dde0e86ffd78a055539c4850f13756d252a12a':
  Projection Widget Test: Remove two unnecessary buttons
diff --git a/CtsBuild.mk b/CtsBuild.mk
index 1b12293..c745885 100644
--- a/CtsBuild.mk
+++ b/CtsBuild.mk
@@ -17,7 +17,7 @@
 # Functions to get the paths of the build outputs.
 
 define cts-get-lib-paths
-	$(foreach lib,$(1),$(HOST_OUT_JAVA_LIBRARIES)/$(lib).jar)
+	$(foreach lib,$(1),$(CTS_TESTCASES_OUT)/$(lib).jar)
 endef
 
 define cts-get-ui-lib-paths
@@ -25,7 +25,7 @@
 endef
 
 define cts-get-native-paths
-	$(foreach exe,$(1),$(call intermediates-dir-for,EXECUTABLES,$(exe),,,$(3))/$(exe)$(2))
+	$(foreach exe,$(1),$(CTS_TESTCASES_OUT)/$(exe)$(2))
 endef
 
 define cts-get-package-paths
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index 2ef9b62..4035af7 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -57,11 +57,17 @@
     CtsKeySetSigningBUpgradeB \
     CtsKeySetSigningAAndBUpgradeA \
     CtsKeySetSigningAAndCUpgradeB \
-    CtsKeySetSigningAUpgradeNone
+    CtsKeySetSigningAUpgradeNone \
+    CtsKeySetSharedUserSigningAUpgradeB \
+    CtsKeySetSharedUserSigningBUpgradeB \
+    CtsKeySetSigningABadUpgradeB \
+    CtsKeySetSigningCBadAUpgradeAB \
+    CtsKeySetSigningANoDefUpgradeB
 
 cts_support_packages := \
     CtsAccelerationTestStubs \
     CtsAppTestStubs \
+    CtsCertInstallerApp \
     CtsDeviceAdmin \
     CtsDeviceOpenGl \
     CtsDeviceOwnerApp \
@@ -128,9 +134,11 @@
     CtsGraphicsTestCases \
     CtsGraphics2TestCases \
     CtsHardwareTestCases \
+    CtsJankTestCases \
     CtsJobSchedulerDeviceTestCases \
     CtsJniTestCases \
     CtsKeystoreTestCases \
+    CtsLibcoreLegacy22TestCases \
     CtsLocationTestCases \
     CtsLocation2TestCases \
     CtsMediaStressTestCases \
@@ -165,7 +173,6 @@
     CtsUtilTestCases \
     CtsViewTestCases \
     CtsWebkitTestCases \
-    CtsWebGLTestCases \
     CtsWidgetTestCases
 
 # All APKs that need to be scanned by the coverage utilities.
@@ -177,6 +184,7 @@
 cts_host_libraries := \
     CtsAdbTests \
     CtsAppSecurityTests \
+    CtsAtraceHostTestCases \
     CtsDevicePolicyManagerTestCases \
     CtsDumpsysHostTestCases \
     CtsHostJank \
@@ -203,16 +211,14 @@
     CtsUiAutomatorTests
 
 cts_device_jars := \
-    CtsDeviceJank \
-    CtsPrintInstrument
-
-cts_device_executables := \
-    print-instrument
+    CtsDeviceJank
 
 cts_target_junit_tests := \
     CtsJdwp
 
 cts_deqp_test_apis := \
+    egl \
+    gles2 \
     gles3 \
     gles31
 
@@ -223,14 +229,8 @@
     $(call cts-get-ui-lib-paths,$(cts_ui_tests)) \
     $(call cts-get-ui-lib-paths,$(cts_device_jars)) \
     $(call cts-get-ui-lib-paths,$(cts_target_junit_tests)) \
-    $(call cts-get-executable-paths,$(cts_device_executables))
-
-# NOTE: If compiling on a 64 bit target, TARGET_2ND_ARCH will be non-empty
-# and will cause the function to expand to the secondary arch object
-# directory. If compiling on a 32 bit target, TARGET_2ND_ARCH will be
-# empty and will cause the function to expand to the primary arch object
-# directory.
-CTS_TEST_CASES += $(call cts-get-native-paths,$(cts_native_tests),32,$(TARGET_2ND_ARCH))
+    $(call cts-get-executable-paths,$(cts_device_executables)) \
+    $(call cts-get-native-paths,$(cts_native_tests),32)
 
 ifeq ($(TARGET_IS_64_BIT),true)
 CTS_TEST_CASES += $(call cts-get-native-paths,$(cts_native_tests),64)
diff --git a/apps/CameraITS/pymodules/its/caps.py b/apps/CameraITS/pymodules/its/caps.py
index 24f4e75..70bb2ca 100644
--- a/apps/CameraITS/pymodules/its/caps.py
+++ b/apps/CameraITS/pymodules/its/caps.py
@@ -133,6 +133,17 @@
     """
     return len(its.objects.get_available_output_sizes("raw10", props)) > 0
 
+def raw12(props):
+    """Returns whether a device supports RAW12 output.
+
+    Args:
+        props: Camera properties object.
+
+    Returns:
+        Boolean.
+    """
+    return len(its.objects.get_available_output_sizes("raw12", props)) > 0
+
 def sensor_fusion(props):
     """Returns whether the camera and motion sensor timestamps for the device
     are in the same time domain and can be compared directly.
@@ -222,6 +233,56 @@
     return props.has_key("android.control.aeCompensationRange") and \
            props["android.control.aeCompensationRange"] != [0, 0]
 
+def ae_lock(props):
+    """Returns whether a device supports AE lock
+
+    Args:
+        props: Camera properties object.
+
+    Return:
+        Boolean.
+    """
+    return props.has_key("android.control.aeLockAvailable") and \
+           props["android.control.aeLockAvailable"] == 1
+
+def awb_lock(props):
+    """Returns whether a device supports AWB lock
+
+    Args:
+        props: Camera properties object.
+
+    Return:
+        Boolean.
+    """
+    return props.has_key("android.control.awbLockAvailable") and \
+           props["android.control.awbLockAvailable"] == 1
+
+def lsc_map(props):
+    """Returns whether a device supports lens shading map output
+
+    Args:
+        props: Camera properties object.
+
+    Return:
+        Boolean.
+    """
+    return props.has_key(
+            "android.statistics.info.availableLensShadingMapModes") and \
+        1 in props["android.statistics.info.availableLensShadingMapModes"]
+
+def lsc_off(props):
+    """Returns whether a device supports disabling lens shading correction
+
+    Args:
+        props: Camera properties object.
+
+    Return:
+        Boolean.
+    """
+    return props.has_key(
+            "android.shading.availableModes") and \
+        0 in props["android.shading.availableModes"]
+
 class __UnitTest(unittest.TestCase):
     """Run a suite of unit tests on this module.
     """
diff --git a/apps/CameraITS/pymodules/its/device.py b/apps/CameraITS/pymodules/its/device.py
index 035e70b..e396483 100644
--- a/apps/CameraITS/pymodules/its/device.py
+++ b/apps/CameraITS/pymodules/its/device.py
@@ -368,7 +368,7 @@
 
         The out_surfaces field can specify the width(s), height(s), and
         format(s) of the captured image. The formats may be "yuv", "jpeg",
-        "dng", "raw", or "raw10". The default is a YUV420 frame ("yuv")
+        "dng", "raw", "raw10", or "raw12". The default is a YUV420 frame ("yuv")
         corresponding to a full sensor frame.
 
         Note that one or more surfaces can be specified, allowing a capture to
diff --git a/apps/CameraITS/pymodules/its/image.py b/apps/CameraITS/pymodules/its/image.py
index b3bdb65..03f8ff9 100644
--- a/apps/CameraITS/pymodules/its/image.py
+++ b/apps/CameraITS/pymodules/its/image.py
@@ -64,6 +64,9 @@
     if cap["format"] == "raw10":
         assert(props is not None)
         cap = unpack_raw10_capture(cap, props)
+    if cap["format"] == "raw12":
+        assert(props is not None)
+        cap = unpack_raw12_capture(cap, props)
     if cap["format"] == "yuv":
         y = cap["data"][0:w*h]
         u = cap["data"][w*h:w*h*5/4]
@@ -114,12 +117,12 @@
         raise its.error.Error('Invalid raw-10 buffer width')
     w = img.shape[1]*4/5
     h = img.shape[0]
-    # Cut out the 4x8b MSBs and shift to bits [10:2] in 16b words.
+    # Cut out the 4x8b MSBs and shift to bits [9:2] in 16b words.
     msbs = numpy.delete(img, numpy.s_[4::5], 1)
     msbs = msbs.astype(numpy.uint16)
     msbs = numpy.left_shift(msbs, 2)
     msbs = msbs.reshape(h,w)
-    # Cut out the 4x2b LSBs and put each in bits [2:0] of their own 8b words.
+    # Cut out the 4x2b LSBs and put each in bits [1:0] of their own 8b words.
     lsbs = img[::, 4::5].reshape(h,w/4)
     lsbs = numpy.right_shift(
             numpy.packbits(numpy.unpackbits(lsbs).reshape(h,w/4,4,2),3), 6)
@@ -128,6 +131,56 @@
     img16 = numpy.bitwise_or(msbs, lsbs).reshape(h,w)
     return img16
 
+def unpack_raw12_capture(cap, props):
+    """Unpack a raw-12 capture to a raw-16 capture.
+
+    Args:
+        cap: A raw-12 capture object.
+        props: Camera properties object.
+
+    Returns:
+        New capture object with raw-16 data.
+    """
+    # Data is packed as 4x10b pixels in 5 bytes, with the first 4 bytes holding
+    # the MSBs of the pixels, and the 5th byte holding 4x2b LSBs.
+    w,h = cap["width"], cap["height"]
+    if w % 2 != 0:
+        raise its.error.Error('Invalid raw-12 buffer width')
+    cap = copy.deepcopy(cap)
+    cap["data"] = unpack_raw12_image(cap["data"].reshape(h,w*3/2))
+    cap["format"] = "raw"
+    return cap
+
+def unpack_raw12_image(img):
+    """Unpack a raw-12 image to a raw-16 image.
+
+    Output image will have the 12 LSBs filled in each 16b word, and the 4 MSBs
+    will be set to zero.
+
+    Args:
+        img: A raw-12 image, as a uint8 numpy array.
+
+    Returns:
+        Image as a uint16 numpy array, with all row padding stripped.
+    """
+    if img.shape[1] % 3 != 0:
+        raise its.error.Error('Invalid raw-12 buffer width')
+    w = img.shape[1]*2/3
+    h = img.shape[0]
+    # Cut out the 2x8b MSBs and shift to bits [11:4] in 16b words.
+    msbs = numpy.delete(img, numpy.s_[2::3], 1)
+    msbs = msbs.astype(numpy.uint16)
+    msbs = numpy.left_shift(msbs, 4)
+    msbs = msbs.reshape(h,w)
+    # Cut out the 2x4b LSBs and put each in bits [3:0] of their own 8b words.
+    lsbs = img[::, 2::3].reshape(h,w/2)
+    lsbs = numpy.right_shift(
+            numpy.packbits(numpy.unpackbits(lsbs).reshape(h,w/2,2,4),3), 4)
+    lsbs = lsbs.reshape(h,w)
+    # Fuse the MSBs and LSBs back together
+    img16 = numpy.bitwise_or(msbs, lsbs).reshape(h,w)
+    return img16
+
 def convert_capture_to_planes(cap, props=None):
     """Convert a captured image object to separate image planes.
 
diff --git a/apps/CameraITS/pymodules/its/objects.py b/apps/CameraITS/pymodules/its/objects.py
index 22540b8..bc77a62 100644
--- a/apps/CameraITS/pymodules/its/objects.py
+++ b/apps/CameraITS/pymodules/its/objects.py
@@ -70,7 +70,8 @@
     else:
         return float(r["numerator"]) / float(r["denominator"])
 
-def manual_capture_request(sensitivity, exp_time, linear_tonemap=False):
+def manual_capture_request(
+        sensitivity, exp_time, linear_tonemap=False, props=None):
     """Return a capture request with everything set to manual.
 
     Uses identity/unit color correction, and the default tonemap curve.
@@ -82,6 +83,9 @@
             with.
         linear_tonemap: [Optional] whether a linear tonemap should be used
             in this request.
+        props: [Optional] the object returned from
+            its.device.get_camera_properties(). Must present when
+            linear_tonemap is True.
 
     Returns:
         The default manual capture request, ready to be passed to the
@@ -105,10 +109,20 @@
         "android.shading.mode": 1
         }
     if linear_tonemap:
-        req["android.tonemap.mode"] = 0
-        req["android.tonemap.curveRed"] = [0.0,0.0, 1.0,1.0]
-        req["android.tonemap.curveGreen"] = [0.0,0.0, 1.0,1.0]
-        req["android.tonemap.curveBlue"] = [0.0,0.0, 1.0,1.0]
+        assert(props is not None)
+        #CONTRAST_CURVE mode
+        if 0 in props["android.tonemap.availableToneMapModes"]:
+            req["android.tonemap.mode"] = 0
+            req["android.tonemap.curveRed"] = [0.0,0.0, 1.0,1.0]
+            req["android.tonemap.curveGreen"] = [0.0,0.0, 1.0,1.0]
+            req["android.tonemap.curveBlue"] = [0.0,0.0, 1.0,1.0]
+        #GAMMA_VALUE mode
+        elif 3 in props["android.tonemap.availableToneMapModes"]:
+            req["android.tonemap.mode"] = 3
+            req["android.tonemap.gamma"] = 1.0
+        else:
+            print "Linear tonemap is not supported"
+            assert(False)
     return req
 
 def auto_capture_request():
@@ -142,13 +156,15 @@
     """Return a sorted list of available output sizes for a given format.
 
     Args:
-        fmt: the output format, as a string in ["jpg", "yuv", "raw"].
+        fmt: the output format, as a string in
+            ["jpg", "yuv", "raw", "raw10", "raw12"].
         props: the object returned from its.device.get_camera_properties().
 
     Returns:
         A sorted list of (w,h) tuples (sorted large-to-small).
     """
-    fmt_codes = {"raw":0x20, "raw10":0x25, "yuv":0x23, "jpg":0x100, "jpeg":0x100}
+    fmt_codes = {"raw":0x20, "raw10":0x25, "raw12":0x26, "yuv":0x23,
+                 "jpg":0x100, "jpeg":0x100}
     configs = props['android.scaler.streamConfigurationMap']\
                    ['availableStreamConfigurations']
     fmt_configs = [cfg for cfg in configs if cfg['format'] == fmt_codes[fmt]]
diff --git a/apps/CameraITS/tests/inprog/test_burst_sameness_auto.py b/apps/CameraITS/tests/inprog/test_burst_sameness_auto.py
index 87500c7..6629df8 100644
--- a/apps/CameraITS/tests/inprog/test_burst_sameness_auto.py
+++ b/apps/CameraITS/tests/inprog/test_burst_sameness_auto.py
@@ -39,7 +39,8 @@
 
         # Capture at the smallest resolution.
         props = cam.get_camera_properties()
-        its.caps.skip_unless(its.caps.manual_sensor(props))
+        its.caps.skip_unless(its.caps.manual_sensor(props) and
+                             its.caps.awb_lock(props))
 
         _, fmt = its.objects.get_fastest_manual_capture_settings(props)
         w,h = fmt["width"], fmt["height"]
diff --git a/apps/CameraITS/tests/inprog/test_burst_sameness_fullres_auto.py b/apps/CameraITS/tests/inprog/test_burst_sameness_fullres_auto.py
index 932c051..fa37174 100644
--- a/apps/CameraITS/tests/inprog/test_burst_sameness_fullres_auto.py
+++ b/apps/CameraITS/tests/inprog/test_burst_sameness_fullres_auto.py
@@ -15,6 +15,7 @@
 import its.image
 import its.device
 import its.objects
+import its.caps
 import os.path
 import numpy
 import pylab
@@ -41,6 +42,8 @@
 
         # Capture at full resolution.
         props = cam.get_camera_properties()
+        its.caps.skip_unless(its.caps.manual_sensor(props) and
+                             its.caps.awb_lock(props))
         w,h = its.objects.get_available_output_sizes("yuv", props)[0]
 
         # Converge 3A prior to capture.
diff --git a/apps/CameraITS/tests/scene1/test_crop_region_raw.py b/apps/CameraITS/tests/scene1/test_crop_region_raw.py
index 189e987..7973755 100644
--- a/apps/CameraITS/tests/scene1/test_crop_region_raw.py
+++ b/apps/CameraITS/tests/scene1/test_crop_region_raw.py
@@ -64,7 +64,7 @@
         # Use a manual request with a linear tonemap so that the YUV and RAW
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["minSensitivity"]
-        req = its.objects.manual_capture_request(s,e, True)
+        req = its.objects.manual_capture_request(s,e, True, props)
         cap1_raw, cap1_yuv = cam.do_capture(req, cam.CAP_RAW_YUV)
 
         # Capture with a crop region.
diff --git a/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py b/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
index d09f2fd..e3755eb 100644
--- a/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
+++ b/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
@@ -29,7 +29,8 @@
 
     with its.device.ItsSession() as cam:
         props = cam.get_camera_properties()
-        its.caps.skip_unless(its.caps.ev_compensation(props))
+        its.caps.skip_unless(its.caps.ev_compensation(props) and
+                             its.caps.ae_lock(props))
 
         ev_per_step = its.objects.rational_to_float(
                 props['android.control.aeCompensationStep'])
diff --git a/apps/CameraITS/tests/scene1/test_jpeg.py b/apps/CameraITS/tests/scene1/test_jpeg.py
index 25c2038..7bc038d 100644
--- a/apps/CameraITS/tests/scene1/test_jpeg.py
+++ b/apps/CameraITS/tests/scene1/test_jpeg.py
@@ -33,7 +33,7 @@
                              its.caps.per_frame_control(props))
 
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         # YUV
         size = its.objects.get_available_output_sizes("yuv", props)[0]
diff --git a/apps/CameraITS/tests/scene1/test_latching.py b/apps/CameraITS/tests/scene1/test_latching.py
index 3bc4356..176f01b 100644
--- a/apps/CameraITS/tests/scene1/test_latching.py
+++ b/apps/CameraITS/tests/scene1/test_latching.py
@@ -45,20 +45,20 @@
         b_means = []
 
         reqs = [
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s*2,e,   True),
-            its.objects.manual_capture_request(s*2,e,   True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e*2, True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s*2,e,   True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e*2, True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e*2, True),
-            its.objects.manual_capture_request(s,  e*2, True),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s*2,e,   True, props),
+            its.objects.manual_capture_request(s*2,e,   True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e*2, True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s*2,e,   True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e*2, True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e*2, True, props),
+            its.objects.manual_capture_request(s,  e*2, True, props),
             ]
 
         caps = cam.do_capture(reqs, fmt)
diff --git a/apps/CameraITS/tests/scene1/test_locked_burst.py b/apps/CameraITS/tests/scene1/test_locked_burst.py
index a33a9f8..6552c73 100644
--- a/apps/CameraITS/tests/scene1/test_locked_burst.py
+++ b/apps/CameraITS/tests/scene1/test_locked_burst.py
@@ -38,6 +38,8 @@
 
     with its.device.ItsSession() as cam:
         props = cam.get_camera_properties()
+        its.caps.skip_unless(its.caps.ae_lock(props) and
+                             its.caps.awb_lock(props))
 
         # Converge 3A prior to capture.
         cam.do_3a(do_af=True, lock_ae=True, lock_awb=True)
diff --git a/apps/CameraITS/tests/scene1/test_param_color_correction.py b/apps/CameraITS/tests/scene1/test_param_color_correction.py
index b7fdc7b..09b3707 100644
--- a/apps/CameraITS/tests/scene1/test_param_color_correction.py
+++ b/apps/CameraITS/tests/scene1/test_param_color_correction.py
@@ -42,7 +42,7 @@
 
         # Baseline request
         e, s = its.target.get_target_exposure_combos(cam)["midSensitivity"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
         req["android.colorCorrection.mode"] = 0
 
         # Transforms:
diff --git a/apps/CameraITS/tests/scene1/test_param_exposure_time.py b/apps/CameraITS/tests/scene1/test_param_exposure_time.py
index e6078d9..0c0aab1 100644
--- a/apps/CameraITS/tests/scene1/test_param_exposure_time.py
+++ b/apps/CameraITS/tests/scene1/test_param_exposure_time.py
@@ -39,7 +39,7 @@
 
         e,s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
         for i,e_mult in enumerate([0.8, 0.9, 1.0, 1.1, 1.2]):
-            req = its.objects.manual_capture_request(s, e * e_mult, True)
+            req = its.objects.manual_capture_request(s, e * e_mult, True, props)
             cap = cam.do_capture(req)
             img = its.image.convert_capture_to_rgb_image(cap)
             its.image.write_image(
diff --git a/apps/CameraITS/tests/scene1/test_param_flash_mode.py b/apps/CameraITS/tests/scene1/test_param_flash_mode.py
index aae56aa..38f864f 100644
--- a/apps/CameraITS/tests/scene1/test_param_flash_mode.py
+++ b/apps/CameraITS/tests/scene1/test_param_flash_mode.py
@@ -39,7 +39,7 @@
         # linear tonemap.
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
         e /= 4
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         for f in [0,1,2]:
             req["android.flash.mode"] = f
diff --git a/apps/CameraITS/tests/scene1/test_param_shading_mode.py b/apps/CameraITS/tests/scene1/test_param_shading_mode.py
new file mode 100644
index 0000000..8538675
--- /dev/null
+++ b/apps/CameraITS/tests/scene1/test_param_shading_mode.py
@@ -0,0 +1,115 @@
+# Copyright 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import its.caps
+import its.device
+import its.objects
+import matplotlib
+import numpy
+import os
+import os.path
+import pylab
+
+def main():
+    """Test that the android.shading.mode param is applied.
+
+    Switching shading modes and checks that the lens shading maps are
+    modified as expected.
+    """
+    NAME = os.path.basename(__file__).split(".")[0]
+
+    NUM_SHADING_MODE_SWITCH_LOOPS = 3
+    THRESHOLD_DIFF_RATIO = 0.15
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+
+        its.caps.skip_unless(its.caps.per_frame_control(props) and
+                             its.caps.lsc_map(props) and
+                             its.caps.lsc_off(props))
+
+        assert(props.has_key("android.lens.info.shadingMapSize") and
+               props["android.lens.info.shadingMapSize"] != None)
+
+        # lsc_off devices should always support OFF(0), FAST(1), and HQ(2)
+        assert(props.has_key("android.shading.availableModes") and
+               set(props["android.shading.availableModes"]) == set([0, 1, 2]))
+
+        num_map_gains = props["android.lens.info.shadingMapSize"]["width"] * \
+                        props["android.lens.info.shadingMapSize"]["height"] * 4
+
+        # Test 1: Switching shading modes several times and verify:
+        #   1. Lens shading maps with mode OFF are all 1.0
+        #   2. Lens shading maps with mode FAST are similar after switching
+        #      shading modes.
+        #   3. Lens shading maps with mode HIGH_QUALITY are similar after
+        #      switching shading modes.
+        cam.do_3a();
+
+        # Get the reference lens shading maps for OFF, FAST, and HIGH_QUALITY
+        # in different sessions.
+        # reference_maps[mode]
+        reference_maps = [[] for mode in range(3)]
+        reference_maps[0] = [1.0] * num_map_gains
+        for mode in range(1, 3):
+            req = its.objects.auto_capture_request();
+            req["android.statistics.lensShadingMapMode"] = 1
+            req["android.shading.mode"] = mode
+            reference_maps[mode] = cam.do_capture(req)["metadata"] \
+                    ["android.statistics.lensShadingMap"]
+
+        # Get the lens shading maps while switching modes in one session.
+        reqs = []
+        for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
+            for mode in range(3):
+                req = its.objects.auto_capture_request();
+                req["android.statistics.lensShadingMapMode"] = 1
+                req["android.shading.mode"] = mode
+                reqs.append(req);
+
+        caps = cam.do_capture(reqs)
+
+        # shading_maps[mode][loop]
+        shading_maps = [[[] for loop in range(NUM_SHADING_MODE_SWITCH_LOOPS)]
+                for mode in range(3)]
+
+        # Get the shading maps out of capture results
+        for i in range(len(caps)):
+            shading_maps[i % 3][i / 3] = \
+                    caps[i]["metadata"]["android.statistics.lensShadingMap"]
+
+        # Draw the maps
+        for mode in range(3):
+            for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
+                pylab.clf()
+                pylab.plot(range(num_map_gains), shading_maps[mode][i], 'r')
+                pylab.plot(range(num_map_gains), reference_maps[mode], 'g')
+                pylab.xlim([0, num_map_gains])
+                pylab.ylim([0.9, 4.0])
+                matplotlib.pyplot.savefig("%s_ls_maps_mode_%d_loop_%d.png" %
+                                          (NAME, mode, i))
+
+        print "Verifying lens shading maps with mode OFF are all 1.0"
+        for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
+            assert(numpy.allclose(shading_maps[0][i], reference_maps[0]))
+
+        for mode in range(1, 3):
+            print "Verifying lens shading maps with mode", mode, "are similar"
+            for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
+                assert(numpy.allclose(shading_maps[mode][i],
+                                      reference_maps[mode],
+                                      THRESHOLD_DIFF_RATIO))
+
+if __name__ == '__main__':
+    main()
diff --git a/apps/CameraITS/tests/scene1/test_tonemap_sequence.py b/apps/CameraITS/tests/scene1/test_tonemap_sequence.py
index 18ca506..7c87ca2 100644
--- a/apps/CameraITS/tests/scene1/test_tonemap_sequence.py
+++ b/apps/CameraITS/tests/scene1/test_tonemap_sequence.py
@@ -40,7 +40,7 @@
         means = []
 
         # Capture 3 manual shots with a linear tonemap.
-        req = its.objects.manual_capture_request(sens, exp_time, True)
+        req = its.objects.manual_capture_request(sens, exp_time, True, props)
         for i in [0,1,2]:
             cap = cam.do_capture(req)
             img = its.image.convert_capture_to_rgb_image(cap)
diff --git a/apps/CameraITS/tests/scene1/test_yuv_jpeg_all.py b/apps/CameraITS/tests/scene1/test_yuv_jpeg_all.py
index 1b278ef..0c428fc 100644
--- a/apps/CameraITS/tests/scene1/test_yuv_jpeg_all.py
+++ b/apps/CameraITS/tests/scene1/test_yuv_jpeg_all.py
@@ -35,7 +35,7 @@
         # Use a manual request with a linear tonemap so that the YUV and JPEG
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         rgbs = []
 
diff --git a/apps/CameraITS/tests/scene1/test_yuv_plus_jpeg.py b/apps/CameraITS/tests/scene1/test_yuv_plus_jpeg.py
index 6daa243..9ce8d76 100644
--- a/apps/CameraITS/tests/scene1/test_yuv_plus_jpeg.py
+++ b/apps/CameraITS/tests/scene1/test_yuv_plus_jpeg.py
@@ -37,7 +37,7 @@
         # Use a manual request with a linear tonemap so that the YUV and JPEG
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         cap_yuv, cap_jpeg = cam.do_capture(req, [fmt_yuv, fmt_jpeg])
 
diff --git a/apps/CameraITS/tests/scene1/test_yuv_plus_raw.py b/apps/CameraITS/tests/scene1/test_yuv_plus_raw.py
index eb01c1a..f13801b 100644
--- a/apps/CameraITS/tests/scene1/test_yuv_plus_raw.py
+++ b/apps/CameraITS/tests/scene1/test_yuv_plus_raw.py
@@ -36,7 +36,7 @@
         # Use a manual request with a linear tonemap so that the YUV and RAW
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         cap_raw, cap_yuv = cam.do_capture(req, cam.CAP_RAW_YUV)
 
diff --git a/apps/CameraITS/tests/scene1/test_yuv_plus_raw10.py b/apps/CameraITS/tests/scene1/test_yuv_plus_raw10.py
index 910a8ea..e52946d 100644
--- a/apps/CameraITS/tests/scene1/test_yuv_plus_raw10.py
+++ b/apps/CameraITS/tests/scene1/test_yuv_plus_raw10.py
@@ -36,7 +36,7 @@
         # Use a manual request with a linear tonemap so that the YUV and RAW
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         cap_raw, cap_yuv = cam.do_capture(req,
                 [{"format":"raw10"}, {"format":"yuv"}])
diff --git a/apps/CameraITS/tests/scene1/test_yuv_plus_raw12.py b/apps/CameraITS/tests/scene1/test_yuv_plus_raw12.py
new file mode 100644
index 0000000..c5c3c73
--- /dev/null
+++ b/apps/CameraITS/tests/scene1/test_yuv_plus_raw12.py
@@ -0,0 +1,63 @@
+# Copyright 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import its.image
+import its.caps
+import its.device
+import its.objects
+import its.target
+import os.path
+import math
+
+def main():
+    """Test capturing a single frame as both RAW12 and YUV outputs.
+    """
+    NAME = os.path.basename(__file__).split(".")[0]
+
+    THRESHOLD_MAX_RMS_DIFF = 0.035
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+        its.caps.skip_unless(its.caps.compute_target_exposure(props) and
+                             its.caps.raw12(props) and
+                             its.caps.per_frame_control(props))
+
+        # Use a manual request with a linear tonemap so that the YUV and RAW
+        # should look the same (once converted by the its.image module).
+        e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
+        req = its.objects.manual_capture_request(s, e, True, props)
+
+        cap_raw, cap_yuv = cam.do_capture(req,
+                [{"format":"raw12"}, {"format":"yuv"}])
+
+        img = its.image.convert_capture_to_rgb_image(cap_yuv)
+        its.image.write_image(img, "%s_yuv.jpg" % (NAME), True)
+        tile = its.image.get_image_patch(img, 0.45, 0.45, 0.1, 0.1)
+        rgb0 = its.image.compute_image_means(tile)
+
+        # Raw shots are 1/2 x 1/2 smaller after conversion to RGB, so scale the
+        # tile appropriately.
+        img = its.image.convert_capture_to_rgb_image(cap_raw, props=props)
+        its.image.write_image(img, "%s_raw.jpg" % (NAME), True)
+        tile = its.image.get_image_patch(img, 0.475, 0.475, 0.05, 0.05)
+        rgb1 = its.image.compute_image_means(tile)
+
+        rms_diff = math.sqrt(
+                sum([pow(rgb0[i] - rgb1[i], 2.0) for i in range(3)]) / 3.0)
+        print "RMS difference:", rms_diff
+        assert(rms_diff < THRESHOLD_MAX_RMS_DIFF)
+
+if __name__ == '__main__':
+    main()
+
diff --git a/apps/CameraITS/tools/validate_scene.py b/apps/CameraITS/tools/validate_scene.py
index e1e89f2..ea851b7 100644
--- a/apps/CameraITS/tools/validate_scene.py
+++ b/apps/CameraITS/tools/validate_scene.py
@@ -16,6 +16,7 @@
 import its.device
 import its.objects
 import its.image
+import its.caps
 
 def main():
     """capture a yuv image and save it to argv[1]
@@ -39,8 +40,10 @@
         cam.do_3a(do_af=True, lock_ae=True, lock_awb=True)
         props = cam.get_camera_properties()
         req = its.objects.fastest_auto_capture_request(props)
-        req["android.control.awbLock"] = True
-        req["android.control.aeLock"] = True
+        if its.caps.ae_lock(props):
+            req["android.control.awbLock"] = True
+        if its.caps.awb_lock(props):
+            req["android.control.aeLock"] = True
         while True:
             print "Capture an image to check the test scene"
             cap = cam.do_capture(req)
diff --git a/apps/CtsVerifier/Android.mk b/apps/CtsVerifier/Android.mk
index dc5fda5..7f43962 100644
--- a/apps/CtsVerifier/Android.mk
+++ b/apps/CtsVerifier/Android.mk
@@ -30,11 +30,15 @@
                                compatibility-common-util-devicesidelib_v2 \
                                cts-sensors-tests \
                                ctstestrunner \
+                               apache-commons-math \
+                               androidplot \
+                               ctsverifier-opencv \
 
 LOCAL_PACKAGE_NAME := CtsVerifier
 
-LOCAL_JNI_SHARED_LIBRARIES := libctsverifier_jni \
-	#libcameraanalyzer # Needed for the disabled CameraAnalyzer tests
+LOCAL_AAPT_FLAGS += --version-name "5.0_r1.91 $(BUILD_NUMBER)"
+
+LOCAL_JNI_SHARED_LIBRARIES := libctsverifier_jni
 
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
 
@@ -44,6 +48,16 @@
 
 include $(BUILD_PACKAGE)
 
+
+# opencv library
+include $(CLEAR_VARS)
+
+LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
+        ctsverifier-opencv:libs/opencv-android.jar
+
+include $(BUILD_MULTI_PREBUILT)
+
+
 notification-bot := $(call intermediates-dir-for,APPS,NotificationBot)/package.apk
 
 # Builds and launches CTS Verifier on a device.
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index d74bfe5..4ce9ecd 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -17,8 +17,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.android.cts.verifier"
-      android:versionCode="5"
-      android:versionName="5.1_r1">
+      android:versionCode="5">
 
     <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="21"/>
 
@@ -720,6 +719,33 @@
                        android:value="android.hardware.sensor.compass" />
         </activity>
 
+        <activity
+            android:name=".sensors.RVCVXCheckTestActivity"
+            android:keepScreenOn="true"
+            android:label="@string/snsr_rvcvxchk_test"
+            android:screenOrientation="locked" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+            </intent-filter>
+
+            <meta-data
+                android:name="test_category"
+                android:value="@string/test_category_sensors" />
+            <meta-data
+                android:name="test_required_features"
+                android:value="android.hardware.sensor.accelerometer:android.hardware.sensor.gyroscope:android.hardware.sensor.compass:android.hardware.camera.any" />
+            <meta-data android:name="test_excluded_features"
+                    android:value="android.hardware.type.television" />
+        </activity>
+        <activity
+            android:name=".sensors.RVCVRecordActivity"
+            android:keepScreenOn="true"
+            android:label="@string/snsr_rvcvxchk_test_rec"
+            android:screenOrientation="locked" >
+        </activity>
+
+
         <!-- TODO: enable when a full set of verifications can be implemented -->
         <!--activity android:name=".sensors.RotationVectorTestActivity"
                   android:label="@string/snsr_rot_vec_test"
@@ -872,23 +898,6 @@
 
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
         </activity>
-<!-- Experimental. If re-enabling, libcameraanalyzer must be included in the build
-        <activity android:name=".camera.analyzer.CameraAnalyzerActivity"
-                 android:label="@string/camera_analyzer"
-                 android:screenOrientation="landscape">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.cts.intent.category.MANUAL_TEST" />
-            </intent-filter>
-            <meta-data android:name="test_category" android:value="@string/test_category_camera" />
-
-            <intent-filter>
-                <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
-            </intent-filter>
-            <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
-                android:resource="@xml/accessory_filter_adk" />
-        </activity>
--->
 
         <activity android:name=".camera.intents.CameraIntentsActivity"
                  android:label="@string/camera_intents">
@@ -1133,8 +1142,6 @@
             <meta-data android:name="test_category" android:value="@string/test_category_other" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.app_widgets" />
-            <meta-data android:name="test_excluded_features"
-                       android:value="android.software.leanback" />
         </activity>
 
         <activity android:name=".deskclock.DeskClockTestsActivity"
@@ -1297,6 +1304,7 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_QUERY" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_REMOVE" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_INSTALL_APK" />
+                <action android:name="com.android.cts.verifier.managedprovisioning.action.CHECK_INTENT_FILTERS" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_CAPTURE_AND_CHECK_IMAGE" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_CAPTURE_AND_CHECK_VIDEO" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_CAPTURE_AND_CHECK_AUDIO" />
@@ -1328,6 +1336,14 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".managedprovisioning.WorkStatusTestActivity">
+            <intent-filter>
+                <action android:name="com.android.cts.verifier.managedprovisioning.WORK_STATUS_ICON" />
+                <action android:name="com.android.cts.verifier.managedprovisioning.WORK_STATUS_TOAST" />
+                <category android:name="android.intent.category.DEFAULT"></category>
+            </intent-filter>
+        </activity>
+
         <activity android:name=".managedprovisioning.WorkNotificationTestActivity">
             <intent-filter>
                 <action android:name="com.android.cts.verifier.managedprovisioning.WORK_NOTIFICATION" />
@@ -1445,6 +1461,28 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".audio.HifiUltrasoundTestActivity"
+                android:label="@string/hifi_ultrasound_test"
+                android:screenOrientation="locked">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+        </activity>
+
+        <activity android:name=".audio.HifiUltrasoundSpeakerTestActivity"
+                android:label="@string/hifi_ultrasound_speaker_test"
+                android:screenOrientation="locked">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+        </activity>
+
         <service android:name=".tv.MockTvInputService"
             android:permission="android.permission.BIND_TV_INPUT">
             <intent-filter>
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk b/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
deleted file mode 100644
index d595a20..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2011 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_MODULE := libcameraanalyzer
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := com_android_cts_verifier_camera_analyzer_CameraTests.cpp \
-                com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp \
-                com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp \
-                com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp \
-                com_android_cts_verifier_camera_analyzer_MeteringTest.cpp \
-                com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker $(JNI_H_INCLUDE)
-
-LOCAL_CXX_STL := libc++
-LOCAL_STATIC_LIBRARIES := libcolorchecker
-LOCAL_SHARED_LIBRARIES := \
-    libjnigraphics \
-    libcutils \
-    libutils \
-    liblog \
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp
deleted file mode 100644
index fac39e1..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "AutoLockJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_AutoLockTest.h"
-
-#include <vector>
-#include <string>
-#include <string.h>
-
-#include "testingimage.h"
-#include "autolocktest.h"
-#include "vec2.h"
-#include "android/bitmap.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockTest(
-        JNIEnv*      env,
-        jobject      thiz) {
-
-    AutoLockTest* testHandler = new AutoLockTest();
-    long handlerAddress = (long)testHandler;
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress) {
-
-    ALOGV("JNI createAutoLockClass starts!");
-    long imageAddress = (long)inputImageAddress;
-    long handlerAddress = (long)inputHandlerAddress;
-
-    TestingImage *image = (TestingImage*) imageAddress;
-    AutoLockTest *testHandler = (AutoLockTest*) handlerAddress;
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
-    ALOGV("Classes recovered");
-
-    // Uses only the gray patches on the color checker for comparison.
-    testHandler->addDataToList(image->getColorChecker(3, 4, 0, 6,
-                                                      checkerCenter,
-                                                      checkerRadius));
-
-    delete image;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_processAutoLockTest(
-        JNIEnv*          env,
-        jobject          thiz,
-        jlong            inputHandlerAddress,
-        jbooleanArray    tempArray) {
-
-    ALOGV("Processing Auto Lock data!");
-
-    long handlerAddress = (long) inputHandlerAddress;
-    AutoLockTest *testHandler = (AutoLockTest*) handlerAddress;
-
-    testHandler->processData();
-
-    // Converts the native boolean array into a java boolean array.
-    const std::vector<bool>* nativeComparisonResults =
-            testHandler->getComparisonResults();
-    jboolean comparisonResults[nativeComparisonResults->size()];
-
-    for (int i = 0; i < nativeComparisonResults->size(); ++i) {
-        comparisonResults[i] = (jboolean) (*nativeComparisonResults)[i];
-    }
-
-    env->SetBooleanArrayRegion(tempArray,
-                               0, nativeComparisonResults->size(),
-                               comparisonResults);
-    testHandler->clearData();
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h
deleted file mode 100644
index dc40bc2..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef JNI_CAMERAANALYZER_AUTOLOCKTEST_H
-#define JNI_CAMERAANALYZER_AUTOLOCKTEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockTest(
-        JNIEnv*      env,
-        jobject      thiz);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockClass(
-        JNIEnv *env,
-        jobject thiz,
-        jlong inputImageAddress,
-        jlong inputHandlerAddress,
-        jlong checkercenterAddress,
-        jlong checkerradiusAddress);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_processAutoLockTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress,
-        jbooleanArray    tempArray);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp
deleted file mode 100644
index ed91233..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "CameraTestsJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_CameraTests.h"
-#include "android/bitmap.h"
-#include "testingimage.h"
-#include "imagetesthandler.h"
-
-#include <string.h>
-
-jlong Java_com_android_cts_verifier_camera_analyzer_CameraTests_findNative(
-        JNIEnv*      env,
-        jobject      thiz,
-        jobject      inputBitmap) {
-
-    ALOGV("JNI findNative starts!");
-
-    // Verify that we can handle the input bitmap
-    AndroidBitmapInfo inputInfo;
-    AndroidBitmap_getInfo(env, inputBitmap, &inputInfo);
-    if (inputInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888 &&
-        inputInfo.format != ANDROID_BITMAP_FORMAT_RGB_565) {
-        ALOGE("Only RGBA_8888 and RGB_565 bitmaps are supported, type was %d.",
-             inputInfo.format);
-    }
-
-    // Get some references to the fields and class type of ColorChecker
-    jclass thizCls = env->GetObjectClass(thiz);
-    ALOGV("ColorChecker field and classes reference finished!");
-
-    // Get raw inputs and outputs ready
-    uint8_t *inputBuffer = NULL;
-    int result = AndroidBitmap_lockPixels(
-            env,
-            inputBitmap,
-            reinterpret_cast<void**>(&inputBuffer));
-
-    if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
-        ALOGE("Unable to lock input bitmap");
-    }
-
-    uint8_t *outputImage = NULL;
-    int outputWidth, outputHeight;
-
-    ALOGV("Input and output images created!");
-
-    // Find the color checker
-    bool success;
-    uint8_t *inputBufferRGBA = NULL;
-    int inputStride;
-    bool freeInputRGBA = false;
-    switch (inputInfo.format) {
-        case ANDROID_BITMAP_FORMAT_RGB_565: {
-            // First convert to RGBA_8888
-            inputBufferRGBA = new uint8_t[inputInfo.width *
-                                          inputInfo.height *
-                                          4];
-            inputStride = inputInfo.width * 4;
-            uint8_t *outP = inputBufferRGBA;
-            for (int y = 0; y < inputInfo.height; y++ ) {
-                uint16_t *inP = (uint16_t*)(&inputBuffer[y * inputInfo.stride]);
-                for (int x = 0; x < inputInfo.width; x++) {
-                    *(outP++) = ( ((*inP) >> 0) & 0x001F) << 3;
-                    *(outP++) = ( ((*inP) >> 5) & 0x003F) << 2;
-                    *(outP++) = ( ((*inP) >> 11) & 0x001F) << 3;
-                    outP++;
-                    inP++;
-                }
-            }
-            freeInputRGBA = true;
-
-            ALOGV("RGB_565 Format with width, height and stride as %d, %d, %d",
-                 inputInfo.width, inputInfo.height, inputStride);
-            break;
-        }
-        case ANDROID_BITMAP_FORMAT_RGBA_8888: {
-            // Already in RGBA
-            inputBufferRGBA = inputBuffer;
-            inputStride = inputInfo.stride;
-            ALOGV("RGB_8888 Format with width, height and stride as %d, %d, %d",
-                 inputInfo.width, inputInfo.height, inputStride);
-            break;
-        }
-    }
-
-    TestingImage *input_testing_image =
-            new TestingImage(inputBufferRGBA, inputInfo.height, inputInfo.width,
-                             4, inputStride, 120, 160);
-
-    long lp = (long)input_testing_image;
-
-    result = AndroidBitmap_unlockPixels(env, inputBitmap);
-    if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
-        ALOGE("Unable to unlock input bitmap");
-    }
-
-    if (freeInputRGBA) {
-        ALOGV("Deleteing inputbufferRGBA");
-        delete[] inputBufferRGBA;
-    }
-
-    return lp;
-    ALOGV("Input format switched!");
-}
-
-jlong Java_com_android_cts_verifier_camera_analyzer_CameraTests_createImageTestHandler(
-        JNIEnv*      env,
-        jobject      thiz,
-        jint         debugHeight,
-        jint         debugWidth) {
-
-    ImageTestHandler* testHandler =
-            new ImageTestHandler(debugHeight, debugWidth);
-    long handlerAddress = (long)testHandler;
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_CameraTests_cleanUpHandler(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    ImageTestHandler* testHandler = (ImageTestHandler*) (long) inputHandlerAddress;
-    delete testHandler;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_CameraTests_displayHandlerDebugOutput(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    jclass thizCls = env->GetObjectClass(thiz);
-    jfieldID outputId = env->GetFieldID(thizCls, "mDebugOutput",
-                                        "Landroid/graphics/Bitmap;");
-
-    ImageTestHandler* testHandler = (ImageTestHandler*) (long) inputHandlerAddress;
-    uint8_t *outputImage =  new uint8_t[testHandler->getDebugHeight() *
-                                        testHandler->getDebugWidth() * 4];
-
-    const unsigned char *debugoutput = testHandler->debug_output();
-    memcpy(outputImage, debugoutput, testHandler->getDebugHeight() *
-            testHandler->getDebugWidth() * 4);
-
-    int outputWidth = testHandler->getDebugWidth();
-    int outputHeight = testHandler->getDebugHeight();
-    bool success = false;
-
-    if (outputImage == NULL) {
-        ALOGV("output Image is null!");
-    } else {
-        ALOGV("output Image is ready!");
-    }
-
-    // Create debug bitmap from output image data
-    if (outputImage != NULL) {
-        // Get method handles, create inputs to createBitmap
-        jclass bitmapClass =
-                env->FindClass("android/graphics/Bitmap");
-        jclass bitmapConfigClass =
-                env->FindClass("android/graphics/Bitmap$Config");
-
-        jmethodID createBitmap = env->GetStaticMethodID(
-            bitmapClass, "createBitmap",
-            "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
-
-        jmethodID getConfig = env->GetStaticMethodID(
-            bitmapConfigClass, "valueOf",
-            "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;");
-
-        // Create bitmap config and bitmap
-        jstring bitmapConfigValue = env->NewStringUTF("ARGB_8888");
-        jobject rgbaConfig = env->CallStaticObjectMethod(bitmapConfigClass,
-                                                         getConfig,
-                                                         bitmapConfigValue);
-        jobject outputBitmap = env->CallStaticObjectMethod(bitmapClass,
-                                                           createBitmap,
-                                                           outputWidth,
-                                                           outputHeight,
-                                                           rgbaConfig);
-        // Copy output image into it
-        uint8_t *outputBuffer;
-        int result = AndroidBitmap_lockPixels(
-                env,
-                outputBitmap,
-                reinterpret_cast<void**>(&outputBuffer) );
-
-        if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
-            ALOGE("Unable to lock output bitmap");
-        }
-
-        memcpy(outputBuffer, outputImage, outputWidth * outputHeight * 4);
-
-        result = AndroidBitmap_unlockPixels(env, outputBitmap);
-        if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
-            ALOGE("Unable to unlock output bitmap");
-        }
-
-        // Write new Bitmap reference into mDebugOutput class member
-        env->SetObjectField(thiz, outputId, outputBitmap);
-        ALOGV("Copied to outputBitmap");
-        delete [] outputImage;
-        env->DeleteLocalRef(outputBitmap);
-        env->DeleteLocalRef(rgbaConfig);
-        env->DeleteLocalRef(bitmapClass);
-        env->DeleteLocalRef(bitmapConfigClass);
-    }
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h
deleted file mode 100644
index e071dc1..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef JNI_CAMERAANALYZER_CAMERATESTS_H
-#define JNI_CAMERAANALYZER_CAMERATESTS_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_CameraTests_findNative(
-        JNIEnv *env,
-        jobject thiz,
-        jobject inputBitmap);
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_CameraTests_createImageTestHandler(
-        JNIEnv*      env,
-        jobject      thiz,
-        jint         debugHeight,
-        jint         debugWidth);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_CameraTests_cleanUpHandler(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_CameraTests_displayHandlerDebugOutput(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp
deleted file mode 100644
index 94e3ac2..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "FindColorCheckerJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h"
-
-#include <string.h>
-#include "android/bitmap.h"
-#include "colorcheckertest.h"
-#include "testingimage.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jint         debugHeight,
-        jint         debugWidth) {
-    ColorCheckerTest* testHandler = new ColorCheckerTest(debugHeight,
-                                                         debugWidth);
-    long testHandlerAddress = (long)testHandler;
-    return testHandlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress) {
-    ALOGV("JNI createColorCheckerClass starts!");
-
-    TestingImage *testImage = (TestingImage*) (long) inputImageAddress;
-    ColorCheckerTest *testHandler = (ColorCheckerTest*)
-            (long) inputHandlerAddress;
-
-    testHandler->addTestingImage(testImage);
-}
-
-jboolean Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_processColorCheckerTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    ColorCheckerTest *testHandler = (ColorCheckerTest*)
-            (long) inputHandlerAddress;
-    testHandler->processData();
-    return testHandler->getSuccess();
-}
-
-jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerRadiusAdd(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    ColorCheckerTest *testHandler = (ColorCheckerTest*)
-            (long) inputHandlerAddress;
-    long rtn = (long) testHandler->getCheckerRadiusAdd();
-    return rtn;
-}
-
-jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerCenterAdd(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    ColorCheckerTest *testHandler = (ColorCheckerTest*)
-            (long) inputHandlerAddress;
-
-    long rtn = (long) testHandler->getCheckerCenterAdd();
-    return rtn;
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h
deleted file mode 100644
index fb87735..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef JNI_CAMERAANALYZER_COLORCHECKERTEST_H
-#define JNI_CAMERAANALYZER_COLORCHECKERTEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerTest(
-    JNIEnv*      env,
-    jobject      thiz,
-    jint         output_height,
-    jint         output_width);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerClass(
-    JNIEnv *env,
-    jobject thiz,
-    jlong buffer_address,
-    jlong handler_address);
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerRadiusAdd(
-    JNIEnv *env,
-    jobject thiz,
-    jlong handler_address);
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerCenterAdd(
-    JNIEnv *env,
-    jobject thiz,
-    jlong handler_address);
-
-JNIEXPORT jboolean JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_processColorCheckerTest(
-    JNIEnv*      env,
-    jobject      thiz,
-    jlong        handler_address);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp
deleted file mode 100644
index 0224639..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "ExposureCompensationJNI"
-#include <utils/Log.h>
-#include <vector>
-#include <string.h>
-
-#include "android/bitmap.h"
-#include "testingimage.h"
-#include "exposurecompensationtest.h"
-#include "vec2.h"
-
-#include "com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationTest(
-      JNIEnv*      env,
-      jobject      thiz,
-      jint         debugHeight,
-      jint         debugWidth) {
-
-    ExposureCompensationTest* testHandler =
-            new ExposureCompensationTest(debugHeight, debugWidth);
-    long handlerAddress = (long)testHandler;
-
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkerCenterAddress,
-        jlong        checkerRadiusAddress,
-        jfloat       exposureValue) {
-
-    ALOGV("JNI createExposureCompensationClass starts!");
-
-    long imageAddress = (long)inputImageAddress;
-    long handlerAddress = (long)inputHandlerAddress;
-
-    TestingImage *inputImage = (TestingImage*) imageAddress;
-    ExposureCompensationTest *testHandler =
-            (ExposureCompensationTest*) handlerAddress;
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-            (std::vector<std::vector< Vec2f > >*) (long) checkerCenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-            (std::vector<std::vector< float > >*) (long) checkerRadiusAddress;
-
-    const std::vector<Vec3f>* checkerValue =
-            inputImage->getColorChecker(3, 4, 0, 6,
-                                        checkerCenter, checkerRadius);
-    testHandler->addDataToList((float) exposureValue, checkerValue);
-    delete inputImage;
-    delete checkerValue;
-}
-
-jstring Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_processExposureCompensationTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    long handlerAddress = (long) inputHandlerAddress;
-    ExposureCompensationTest *testHandler =
-            (ExposureCompensationTest*) handlerAddress;
-
-    testHandler->processData();
-
-    const char* nativeDebugText = testHandler->getDebugText();
-    ALOGV("%s", nativeDebugText);
-    return env->NewStringUTF(nativeDebugText);
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h
deleted file mode 100644
index 8e8761d..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef JNI_CAMERAANALYZER_EXPOSURECOMPENSATIONTEST_H
-#define JNI_CAMERAANALYZER_EXPOSURECOMPENSATIONTEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jint         debugHeight,
-        jint         debugWidth);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkerCenterAddress,
-        jlong        checkerRadiusAddress,
-        jfloat       exposureValue);
-
-
-JNIEXPORT jstring JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_processExposureCompensationTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress);
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp
deleted file mode 100644
index faebe21..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "MeteringJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_MeteringTest.h"
-
-#include <vector>
-#include <string>
-#include <string.h>
-#include <math.h>
-
-#include "testingimage.h"
-#include "meteringtest.h"
-#include "vec2.h"
-#include "android/bitmap.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringTest(
-        JNIEnv*      env,
-        jobject      thiz) {
-
-    MeteringTest* testHandler = new MeteringTest();
-    long handlerAddress = (long)testHandler;
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress){
-
-    ALOGV("JNI createMeteringClass starts!");
-    long imageAddress = (long)inputImageAddress;
-    long handlerAddress = (long)inputHandlerAddress;
-
-    TestingImage *image = (TestingImage*) imageAddress;
-    MeteringTest *testHandler = (MeteringTest*) handlerAddress;
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
-    ALOGV("Classes recovered");
-
-    testHandler->addDataToList(image->getColorChecker(3, 4, 0, 6,
-                                                      checkerCenter,
-                                                      checkerRadius));
-
-    delete image;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_processMeteringTest(
-        JNIEnv*          env,
-        jobject          thiz,
-        jlong            inputHandlerAddress,
-        jbooleanArray    tempArray) {
-
-    ALOGV("Processing Auto Lock data!");
-
-    long handlerAddress = (long) inputHandlerAddress;
-    MeteringTest *testHandler = (MeteringTest*) handlerAddress;
-
-    testHandler->processData();
-
-    const std::vector<bool>* nativeComparisonResults =
-            testHandler->getComparisonResults();
-    jboolean jComparisonResults[nativeComparisonResults->size()];
-
-    for (int i = 0; i < nativeComparisonResults->size(); ++i) {
-        jComparisonResults[i] = (jboolean) (*nativeComparisonResults)[i];
-    }
-
-    env->SetBooleanArrayRegion(tempArray,
-                               0, nativeComparisonResults->size(),
-                               jComparisonResults);
-    testHandler->clearData();
-}
-
-// Find the gray checker borders from the native array of checker center and
-// radius. Convert the coordinate to the coordinates accepted by Android
-// Camera.Area type, which defines the top left corner to (-1000, -1000) and
-// bottom right corner to (1000, 1000).
-void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_findGreyCoordinates(
-        JNIEnv*      env,
-        jobject      thiz,
-        jintArray    greyCoordinates,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress){
-
-    ALOGV("Start finding grey coordinates");
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
-
-    ALOGV("Checker recovered!");
-    int nativeGreyCoordinates[24];
-
-    for (int i = 0; i < 6; ++i) {
-        float radius = sqrt((*checkerRadius)[3][i]);
-        nativeGreyCoordinates[i * 4] = static_cast<int>(
-                ((*checkerCenter)[3][i].y() - radius)
-                / 160.0 * 2000.0 - 1000.0);
-        nativeGreyCoordinates[i * 4 + 1] = static_cast<int>(
-                ((*checkerCenter)[3][i].x() - radius)
-                / 120.0 * 2000.0 - 1000.0);
-        nativeGreyCoordinates[i * 4 + 2] = static_cast<int>(
-                ((*checkerCenter)[3][i].y() + radius)
-                / 160.0 * 2000.0 - 1000.0);
-        nativeGreyCoordinates[i * 4 + 3] = static_cast<int>(
-                ((*checkerCenter)[3][i].x() + radius)
-                / 120.0 * 2000.0 - 1000.0);
-
-        ALOGV("checker is bounded by %f, %f, %f",
-             (*checkerCenter)[3][i].x(), (*checkerCenter)[3][i].y(), radius);
-
-        ALOGV("Square is bounded by %d, %d, %d, %d",
-             nativeGreyCoordinates[i * 4], nativeGreyCoordinates[i * 4 + 1],
-             nativeGreyCoordinates[i * 4 + 2],
-             nativeGreyCoordinates[i * 4 + 3]);
-    }
-
-    env->SetIntArrayRegion(greyCoordinates, 0, 24, nativeGreyCoordinates);
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.h
deleted file mode 100644
index ecc1b96..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef JNI_CAMERAANALYZER_METERINGTEST_H
-#define JNI_CAMERAANALYZER_METERINGTEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringTest(
-        JNIEnv*      env,
-        jobject      thiz);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringClass(
-        JNIEnv *env,
-        jobject thiz,
-        jlong inputAddress,
-        jlong handlerAddress,
-        jlong checkercenterAddress,
-        jlong checkerradiusAddress);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_MeteringTest_processMeteringTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        handlerAddress,
-        jbooleanArray    tempArray);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_MeteringTest_findGreyCoordinates(
-        JNIEnv*      env,
-        jobject      thiz,
-        jintArray    greyCoordinates,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
deleted file mode 100644
index bce0fca..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "WhiteBalanceJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h"
-
-#include <vector>
-#include <string>
-#include <string.h>
-
-#include "testingimage.h"
-#include "whitebalancetest.h"
-#include "vec2.h"
-#include "android/bitmap.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceTest(
-        JNIEnv*      env,
-        jobject      thiz) {
-
-    WhiteBalanceTest* testHandler = new WhiteBalanceTest();
-    long handlerAddress = (long)testHandler;
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress,
-        jstring      whiteBalance){
-
-    ALOGV("JNI createWhiteBalanceClass starts!");
-    long imageAddress = (long)inputImageAddress;
-    long handlerAddress = (long)inputHandlerAddress;
-
-    TestingImage *image = (TestingImage*) imageAddress;
-    WhiteBalanceTest *testHandler = (WhiteBalanceTest*) handlerAddress;
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-        (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-        (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
-    ALOGV("Classes recovered");
-
-    jboolean isCopy;
-    const char* stringWhiteBalance =
-            env->GetStringUTFChars(whiteBalance, &isCopy);
-    ALOGV("White Balance is %s", stringWhiteBalance);
-
-    // Adds the gray checker's RGB values to the test handler.
-    testHandler->addDataToList(stringWhiteBalance,
-                               image->getColorChecker(3, 4, 0, 6,
-                                                      checkerCenter,
-                                                      checkerRadius));
-
-    env->ReleaseStringUTFChars(whiteBalance, stringWhiteBalance);
-    delete image;
-}
-
-jint Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_processWhiteBalanceTest(
-    JNIEnv*      env,
-    jobject      thiz,
-    jlong        inputHandlerAddress) {
-  ALOGV("Processing white balance test");
-
-  long handlerAddress = (long) inputHandlerAddress;
-  WhiteBalanceTest *testHandler = (WhiteBalanceTest*) handlerAddress;
-
-  testHandler->processData();
-
-  ALOGV("CCT is %d", testHandler->getCorrelatedColorTemp());
-  return testHandler->getCorrelatedColorTemp();
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h
deleted file mode 100644
index 88cf52e..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef JNI_CAMERAANALYZER_WHITEBALANCETEST_H
-#define JNI_CAMERAANALYZER_WHITEBALANCETEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceTest(
-        JNIEnv*      env,
-        jobject      thiz);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceClass(
-        JNIEnv *env,
-        jobject thiz,
-        jlong inputAddress,
-        jlong handlerAddress,
-        jlong checkercenterAddress,
-        jlong checkerradiusAddress,
-        jstring whiteBalance);
-
-JNIEXPORT jint JNICALL
-Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_processWhiteBalanceTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        handlerAddress);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/lib/colorchecker/Android.mk b/apps/CtsVerifier/lib/colorchecker/Android.mk
deleted file mode 100644
index 48f1356..0000000
--- a/apps/CtsVerifier/lib/colorchecker/Android.mk
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (C) 2011 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-#####################
-# Build image analysis library
-
-include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE := libcolorchecker
-
-LOCAL_SRC_FILES += testingimage.cpp \
-                   vec3.cpp \
-                   vec2.cpp \
-                   imagetesthandler.cpp \
-                   colorcheckertest.cpp \
-                   exposurecompensationtest.cpp \
-                   autolocktest.cpp \
-                   meteringtest.cpp \
-                   whitebalancetest.cpp
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker
-LOCAL_CXX_STL := libc++
-LOCAL_SHARED_LIBRARIES := \
-    libcutils \
-    libutils \
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp b/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp
deleted file mode 100644
index 6bfa922..0000000
--- a/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "AutoLockTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "autolocktest.h"
-
-const float kOverExposure = 230.f;
-const float kEqThreshold = 0.05f;
-// Processes the color checker values and compare the two values from
-// the same individual test.
-void AutoLockTest::processData() {
-    ALOGV("Start Processing Auto Lock Test Data!");
-
-    int numTests = mCheckerColors.size() / 2;
-    mNumPatches = 0;
-
-    if (numTests > 0) {
-        mNumPatches = mCheckerColors[0].size();
-    }
-
-    for (int i = 0; i < numTests; ++i) {
-        mComparisonResults.push_back(
-                IsBrighterThan((&mCheckerColors[i * 2]),
-                               (&mCheckerColors[i * 2 + 1])));
-        mComparisonResults.push_back(
-                IsEquivalentTo((&mCheckerColors[i * 2]),
-                               (&mCheckerColors[i * 2 + 1])));
-    }
-}
-
-// Compares whether one array of gray color patches is brighter than
-// another one.
-bool AutoLockTest::IsBrighterThan(
-        const std::vector<Vec3f>* colorCheckers1,
-        const std::vector<Vec3f>* colorCheckers2) const {
-    float meanRatio = 0.f;
-    int meanNumCount = 0;
-
-    for (int i = 0; i < mNumPatches; ++i) {
-        float luminance1 = (*colorCheckers1)[i].convertToLuminance();
-        float luminance2 = (*colorCheckers2)[i].convertToLuminance();
-
-        // Consider a 5% raise as a considerably large increase.
-        if ((luminance1 < kOverExposure) && (luminance2 != 0.f)) {
-            meanRatio += luminance1 / luminance2;
-            ++meanNumCount;
-        }
-    }
-    meanRatio = meanRatio / meanNumCount;
-
-    return (meanRatio > 1 + kEqThreshold);
-}
-
-// Compares whether one array of gray color patches is within a small range
-// of the other one to be considered equivalent.
-bool AutoLockTest::IsEquivalentTo(
-        const std::vector<Vec3f>* colorCheckers1,
-        const std::vector<Vec3f>* colorCheckers2) const {
-    float meanRatio = 0.f;
-    int meanNumCount = 0;
-
-    for (int i = 0; i < mNumPatches; ++i) {
-        float luminance1 = (*colorCheckers1)[i].convertToLuminance();
-        float luminance2 = (*colorCheckers2)[i].convertToLuminance();
-        ALOGV("Luma_1 and Luma_2 is %f, %f", luminance1, luminance2);
-
-        if ((luminance1 < kOverExposure) && (luminance2 < kOverExposure)) {
-              meanRatio += luminance2 / luminance1;
-              ++meanNumCount;
-        }
-    }
-    meanRatio = meanRatio / meanNumCount;
-
-    return ((meanRatio >= 1 - kEqThreshold) && (meanRatio <= 1 + kEqThreshold));
-}
-
-void AutoLockTest::clearData() {
-    mCheckerColors.clear();
-    mComparisonResults.clear();
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp b/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
deleted file mode 100644
index ef7d2c6..0000000
--- a/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
+++ /dev/null
@@ -1,979 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "ColorCheckerTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "colorcheckertest.h"
-
-const float GAMMA_CORRECTION = 2.2f;
-const float COLOR_ERROR_THRESHOLD = 200.f;
-ColorCheckerTest::~ColorCheckerTest() {
-    ALOGV("Deleting color checker test handler");
-
-    if (mImage != NULL) {
-        delete mImage;
-    }
-    ALOGV("Image deleted");
-
-    int numHorizontalLines = mCandidateColors.size();
-    int numVerticalLines = mCandidateColors[0].size();
-
-    for (int i = 0; i < numHorizontalLines; ++i) {
-        for (int j = 0; j < numVerticalLines; ++j) {
-            if (mCandidateColors[i][j] != NULL) {
-                delete mCandidateColors[i][j];
-            }
-            if (mCandidatePositions[i][j] != NULL) {
-                delete mCandidatePositions[i][j];
-            }
-        }
-    }
-    ALOGV("Candidates deleted!");
-
-    for (int i = 0; i < 4; ++i) {
-        for (int j = 0; j < 6; ++j) {
-            if (mMatchPositions[i][j] != NULL) {
-                delete mMatchPositions[i][j];
-            }
-            if (mReferenceColors[i][j] != NULL) {
-                delete mReferenceColors[i][j];
-            }
-            if (mMatchColors[i][j] != NULL) {
-                delete mMatchColors[i][j];
-            }
-        }
-    }
-}
-
-// Adds a new image to the test handler.
-void ColorCheckerTest::addTestingImage(TestingImage* inputImage) {
-    if (mImage != NULL) {
-        delete mImage;
-    }
-    mImage = NULL;
-    ALOGV("Original image deleted");
-    mImage = inputImage;
-
-    if ((mImage->getHeight() == getDebugHeight()) &&
-        (mImage->getWidth() == getDebugWidth())) {
-        copyDebugImage(getDebugHeight(), getDebugWidth(), mImage->getImage());
-    }
-}
-
-void ColorCheckerTest::processData() {
-    mSuccess = false;
-    initializeRefColor();
-    edgeDetection();
-}
-
-void ColorCheckerTest::initializeRefColor() {
-    mReferenceColors.resize(4, std::vector<Vec3i*>(6, NULL));
-    mMatchPositions.resize(4, std::vector<Vec2f*>(6, NULL));
-    mMatchColors.resize(4, std::vector<Vec3f*>(6, NULL));
-    mMatchRadius.resize(4, std::vector<float>(6, 0.f));
-
-    mReferenceColors[0][0]= new Vec3i(115, 82, 68);
-    mReferenceColors[0][1]= new Vec3i(194, 150, 130);
-    mReferenceColors[0][2]= new Vec3i(98, 122, 157);
-    mReferenceColors[0][3]= new Vec3i(87, 108, 67);
-    mReferenceColors[0][4]= new Vec3i(133, 128, 177);
-    mReferenceColors[0][5]= new Vec3i(103, 189, 170);
-    mReferenceColors[1][0]= new Vec3i(214, 126, 44);
-    mReferenceColors[1][1]= new Vec3i(80, 91, 166);
-    mReferenceColors[1][2]= new Vec3i(193, 90, 99);
-    mReferenceColors[1][3]= new Vec3i(94,  60, 108);
-    mReferenceColors[1][4]= new Vec3i(157, 188, 64);
-    mReferenceColors[1][5]= new Vec3i(224, 163, 46);
-    mReferenceColors[2][0]= new Vec3i(56, 61, 150);
-    mReferenceColors[2][1]= new Vec3i(70, 148, 73);
-    mReferenceColors[2][2]= new Vec3i(175, 54, 60);
-    mReferenceColors[2][3]= new Vec3i(231, 199, 31);
-    mReferenceColors[2][4]= new Vec3i(187, 86, 149);
-    mReferenceColors[2][5]= new Vec3i(8, 133, 161);
-    mReferenceColors[3][0]= new Vec3i(243, 243, 242);
-    mReferenceColors[3][1]= new Vec3i(200, 200, 200);
-    mReferenceColors[3][2]= new Vec3i(160, 160, 160);
-    mReferenceColors[3][3]= new Vec3i(122, 122, 121);
-    mReferenceColors[3][4]= new Vec3i(85, 85, 85);
-    mReferenceColors[3][5]= new Vec3i(52, 52, 52);
-}
-
-void ColorCheckerTest::edgeDetection() {
-    int width = mImage->getWidth();
-    int height = mImage->getHeight();
-
-    bool* edgeMap = new bool[height * width];
-    unsigned char* grayImage = new unsigned char[height * width];
-
-    // If the image is a color image and can be converted to a luminance layer
-    if (mImage->rgbToGrayScale(grayImage)) {
-        float* gradientMap = new float[height * width * 2];
-
-        // Computes the gradient image on the luminance layer.
-        computeGradient(grayImage, gradientMap);
-
-        float* gradientMagnitude = new float[height * width];
-        int* gradientDirectionInt = new int[height * width];
-        float* gradientDirection = new float[height * width];
-
-        // Computes the absolute gradient of the image without padding.
-        for (int i = 1; i < height - 1; ++i) {
-            for (int j = 1; j < width - 1; ++j) {
-                gradientMagnitude[i * width + j] =
-                        sqrt(gradientMap[(i * width + j) * 2] *
-                             gradientMap[(i * width + j) * 2] +
-                             gradientMap[(i * width + j ) * 2 + 1] *
-                             gradientMap[(i * width + j ) * 2 + 1]);
-
-                // Computes the gradient direction of the image.
-                if (gradientMap[(i * width + j) * 2] == 0 ) {
-                    // If the vertical gradient is 0, the edge is horizontal
-                    // Mark the gradient direction as 90 degrees.
-                    gradientDirectionInt[i * width + j] = 2;
-                    gradientDirection[i * width + j] = 90.0f;
-                } else {
-                    // Otherwise the atan operation is valid and can decide
-                    // the gradient direction of the edge.
-                    float gradient = atan(gradientMap[(i * width + j) * 2 + 1]
-                            / gradientMap[(i * width + j) * 2])
-                            / (M_PI / 4);
-
-                    gradientDirection[i * width + j] = gradient * 45.0f;
-
-                    // Maps the gradient direction to 4 major directions with
-                    // 0 mapped to up and 2 mapped to right.
-                    if (gradient - floor(gradient) > 0.5) {
-                        gradientDirectionInt[i * width + j] =
-                                (static_cast<int>(ceil(gradient)) + 4) % 4;
-                    } else {
-                        gradientDirectionInt[i * width + j] =
-                                (static_cast<int>(floor(gradient)) + 4) % 4;
-                    }
-                }
-            }
-        }
-
-        // Compute a boolean map to show whether a pixel is on the edge.
-        for (int i = 1; i < height - 1; ++i) {
-            for (int j = 1; j < width - 1; ++j) {
-                edgeMap[i * width + j] = false;
-
-                switch (gradientDirectionInt[i * width + j]) {
-                    case 0:
-                        // If the gradient points rightwards, the pixel is
-                        // on an edge if it has a larger absolute gradient than
-                        // pixels on its left and right sides.
-                        if ((gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[i * width + j + 1]) &&
-                            (gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[i * width + j - 1])) {
-                            edgeMap[i * width + j] = true;
-                        }
-                        break;
-                    case 1:
-                        // If the gradient points right-downwards, the pixel is
-                        // on an edge if it has a larger absolute gradient than
-                        // pixels on its upper left and bottom right sides.
-                        if ((gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i + 1) * width + j + 1]) &&
-                            (gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i - 1) * width + j - 1])) {
-                            edgeMap[i * width + j] = true;
-                        }
-                        break;
-                    case 2:
-                        // If the gradient points upwards, the pixel is
-                        // on an edge if it has a larger absolute gradient than
-                        // pixels on its up and down sides.
-                        if ((gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i + 1) * width + j]) &&
-                            (gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i - 1) * width + j])) {
-                            edgeMap[i * width + j] = true;
-                        }
-                        break;
-                    case 3:
-                        // If the gradient points right-upwards, the pixel is
-                        // on an edge if it has a larger absolute gradient than
-                        // pixels on its bottom left and upper right sides.
-                        if ((gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i - 1) * width + j + 1]) &&
-                            (gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i + 1) * width + j - 1])) {
-                            edgeMap[i * width + j] = true;
-                        }
-                  }
-
-             }
-        }
-
-        houghLineDetection(edgeMap, gradientMagnitude, gradientDirection);
-
-        // Cleans up
-        delete[] gradientMap;
-        delete[] gradientDirectionInt;
-        delete[] gradientMagnitude;
-        delete[] gradientDirection;
-
-    } else {
-        ALOGE("Not a color image!");
-    }
-
-    delete[] edgeMap;
-    delete[] grayImage;
-}
-
-// Runs the hough voting algorithm to find the grid of the color checker
-// with the edge map, gradient direction and gradient magnitude as inputs.
-void ColorCheckerTest::houghLineDetection(bool* edgeMap,
-                                          float* gradientMagnitude,
-                                          float* gradientDirection) {
-    // Constructs a graph for Hough voting. The vertical axis counts the vote
-    // for a certain angle. The horizontal axis counts the vote for the distance
-    // of a line from the origin of the image.
-    int houghHeight = 180;
-    int houghWidth = 200;
-    int houghCounts[houghHeight][houghWidth];
-    int houghSum[houghHeight][houghWidth];
-
-    int** houghVote;
-    houghVote = new int*[180];
-    for (int i = 0; i < 180; ++i) {
-        houghVote[i] = new int[200];
-    }
-
-    for (int i = 0; i < houghHeight; ++i) {
-        for (int j = 0; j < houghWidth; ++j) {
-            houghCounts[i][j] = 0;
-            houghVote[i][j] = 0;
-            houghSum[i][j] = 0;
-        }
-    }
-
-    // Vectors to record lines in two orthogonal directions.
-    // Each line is represented by its direction and its distance to the origin.
-    std::vector<std::vector<int> > verticalLines;
-    std::vector<std::vector<int> > horizontalLines;
-    float radius;
-    int height = mImage->getHeight();
-    int width = mImage->getWidth();
-
-    // Processes the signicant edge pixels and cast vote for the corresponding
-    // edge passing this pixel.
-    for (int i = 1; i < height - 1; ++i) {
-        for (int j = 1; j < width - 1; ++j) {
-            // Sets threashold for the gradient magnitude to discount noises
-            if (edgeMap[i * width + j] &&
-                (gradientMagnitude[i * width + j] > 15)) {
-                int shiftedAngle;
-
-                // Shifts angles for 45 degrees so the vertical and horizontal
-                // direction is mapped to 45 and 135 degrees to avoid padding.
-                // This uses the assumption that the color checker is placed
-                // roughly parallel to the image boarders. So that the edges
-                // at the angle of 45 will be rare.
-                shiftedAngle = (static_cast<int>(
-                        -gradientDirection[i * width + j]) + 225 % 180);
-                float shiftedAngleRad = static_cast<float>(shiftedAngle)
-                        * M_PI / 180.0f;
-
-                // Computes the distance of the line from the origin.
-                float a, b;
-                a = static_cast<float>(i - j) / sqrt(2.0f);
-                b = static_cast<float>(i + j) / sqrt(2.0f);
-                radius = a * sin(shiftedAngleRad) - b * cos(shiftedAngleRad);
-
-                // Adds one vote for the line. The line's angle is shifted by
-                // 45 degrees to avoid avoid padding for the vertical lines,
-                // which is more common than diagonal lines. The line's
-                // distance is mapped to [0, 200] from [-200, 200].
-                ++houghCounts[shiftedAngle][static_cast<int>((radius / 2.0f) +
-                                                              100.0f)];
-
-                drawPoint(i, j, Vec3i(255, 255, 255));
-            }
-        }
-    }
-
-    int houghAngleSum[houghHeight];
-    int primaryVerticalAngle, primaryHorizontalAngle;
-    int max1 = 0;
-    int max2 = 0;
-
-    // Looking for the two primary angles of the lines.
-    for (int i = 5; i < houghHeight - 5; ++i) {
-        houghAngleSum[i] = 0;
-        for (int j = 0; j < houghWidth; ++j) {
-            for (int l = -5; l <= 5; ++l) {
-                houghSum[i][j] += houghCounts[i + l][j];
-            }
-            houghAngleSum[i] += houghSum[i][j];
-        }
-
-        if ((i < houghHeight / 2) && (houghAngleSum[i] > max1)) {
-            max1 = houghAngleSum[i];
-            primaryVerticalAngle = i;
-        } else if ((i > houghHeight / 2) && (houghAngleSum[i] > max2)) {
-            max2 = houghAngleSum[i];
-            primaryHorizontalAngle = i;
-        }
-    }
-
-    ALOGV("Primary angles are %d, %d",
-         primaryVerticalAngle, primaryHorizontalAngle);
-
-    int angle;
-
-    // For each primary angle, look for the highest voted lines.
-    for (int k = 0; k < 2; ++k) {
-        if (k == 0) {
-            angle = primaryVerticalAngle;
-        } else {
-            angle = primaryHorizontalAngle;
-        }
-
-        std::vector<int> line(2);
-        for (int j = 2; j < houghWidth - 2; ++j) {
-            houghVote[angle][j] = houghSum[angle][j];
-            houghSum[angle][j] = 0;
-        }
-
-        // For each radius, average the vote with nearby ones.
-        for (int j = 2; j < houghWidth - 2; ++j) {
-            for (int m = -2; m <= 2; ++m) {
-                houghSum[angle][j] += houghVote[angle][j + m];
-            }
-        }
-
-        bool isCandidate[houghWidth];
-
-        // Find whether a lines is a candidate by rejecting the ones that have
-        // lower vote than others in the neighborhood.
-        for (int j = 2; j < houghWidth - 2; ++j) {
-            isCandidate[j] = true;
-            for (int m = -2; ((isCandidate[j]) && (m <= 2)); ++m) {
-                if ((houghSum[angle][j] < 20) ||
-                    (houghSum[angle][j] < houghSum[angle][j + m])) {
-                    isCandidate[j] = false;
-                }
-            }
-        }
-
-        int iter1 = 0;
-        int iter2 = 0;
-        int count = 0;
-
-        // Finds the lines that are not too close to each other and add to the
-        // detected lines.
-        while (iter2 < houghWidth) {
-            while ((!isCandidate[iter2]) && (iter2 < houghWidth)) {
-                ++iter2;
-            }
-            if ((isCandidate[iter2]) && (iter2 - iter1 < 5)) {
-                iter1 = (iter2 + iter1) / 2;
-                ++iter2;
-            } else {
-                line[0] = angle;
-                line[1] = (iter1 - 100) * 2;
-                if (iter1 != 0) {
-                    if (k == 0) {
-                        verticalLines.push_back(line);
-                        Vec3i color(verticalLines.size() * 20, 0, 0);
-                        drawLine(line[0], line[1], color);
-                    } else {
-                        horizontalLines.push_back(line);
-                        Vec3i color(0, horizontalLines.size() * 20, 0);
-                        drawLine(line[0], line[1], color);
-                    }
-                }
-                iter1 = iter2;
-                ++iter2;
-                ALOGV("pushing back line %d %d", line[0], line[1]);
-            }
-        }
-    }
-
-    ALOGV("Numbers of lines in each direction is %d, %d",
-         verticalLines.size(), horizontalLines.size());
-
-    for (int i = 0; i < 180; ++i) {
-        delete[] houghVote[i];
-    }
-    delete[] houghVote;
-
-    findCheckerBoards(verticalLines, horizontalLines);
-}
-
-// Computes the gradient in both x and y direction of a layer
-void ColorCheckerTest::computeGradient(unsigned char* layer,
-                                       float* gradientMap) {
-    int width = mImage->getWidth();
-    int height = mImage->getHeight();
-
-    // Computes the gradient in the whole image except the image boarders.
-    for (int i = 1; i < height - 1; ++i) {
-        for (int j = 1; j < width - 1; ++j) {
-            gradientMap[(i * width + j) * 2] =
-                    0.5f * (layer[i * width + j + 1] -
-                            layer[i * width + j - 1]);
-            gradientMap[(i * width + j) * 2 + 1] =
-                    0.5f * (layer[(i + 1) * width + j] -
-                           layer[(i - 1) * width + j]);
-        }
-    }
-}
-
-// Tries to find the checker boards with the highest voted lines
-void ColorCheckerTest::findCheckerBoards(
-        std::vector<std::vector<int> > verticalLines,
-        std::vector<std::vector<int> > horizontalLines) {
-    ALOGV("Start looking for Color checker");
-
-    int numHorizontalLines = mCandidateColors.size();
-    int numVerticalLines;
-    if (numHorizontalLines > 0) {
-        numVerticalLines = mCandidateColors[0].size();
-        for (int i = 0; i < numHorizontalLines; ++i) {
-            for (int j = 0; j < numVerticalLines; ++j) {
-                if (mCandidateColors[i][j] != NULL) {
-                    delete mCandidateColors[i][j];
-                }
-                if (mCandidatePositions[i][j] != NULL) {
-                    delete mCandidatePositions[i][j];
-                }
-            }
-            mCandidateColors[i].clear();
-            mCandidatePositions[i].clear();
-        }
-    }
-    mCandidateColors.clear();
-    mCandidatePositions.clear();
-
-    ALOGV("Candidates deleted!");
-
-    numVerticalLines = verticalLines.size();
-    numHorizontalLines = horizontalLines.size();
-    Vec2f pointUpperLeft;
-    Vec2f pointBottomRight;
-
-    mCandidateColors.resize(numHorizontalLines - 1);
-    mCandidatePositions.resize(numHorizontalLines - 1);
-
-    for (int i = numVerticalLines - 1; i >= 1; --i) {
-        for (int j = 0; j < numHorizontalLines - 1; ++j) {
-            // Finds the upper left and bottom right corner of each rectangle
-            // formed by two neighboring highest voted lines.
-            pointUpperLeft = findCrossing(verticalLines[i], horizontalLines[j]);
-            pointBottomRight = findCrossing(verticalLines[i - 1],
-                                            horizontalLines[j + 1]);
-
-            Vec3i* color = new Vec3i();
-            Vec2f* pointCenter = new Vec2f();
-            // Verifies if they are separated by a reasonable distance.
-            if (verifyPointPair(pointUpperLeft, pointBottomRight,
-                                pointCenter, color)) {
-                mCandidatePositions[j].push_back(pointCenter);
-                mCandidateColors[j].push_back(color);
-                ALOGV("Color at (%d, %d) is (%d, %d, %d)", j, i,color->r(), color->g(), color->b());
-
-            } else {
-                mCandidatePositions[j].push_back(NULL);
-                mCandidateColors[j].push_back(NULL);
-                delete color;
-                delete pointCenter;
-            }
-        }
-    }
-
-    ALOGV("Candidates Number (%d, %d)", mCandidateColors.size(), mCandidateColors[0].size());
-    // Verifies whether the current line candidates form a valid color checker.
-    verifyColorGrid();
-}
-
-// Returns the corssing point of two lines given the lines.
-Vec2f ColorCheckerTest::findCrossing(std::vector<int> line1,
-                                     std::vector<int> line2) {
-    Vec2f crossingPoint;
-    float r1 = static_cast<float>(line1[1]);
-    float r2 = static_cast<float>(line2[1]);
-    float ang1, ang2;
-    float y1, y2;
-
-    ang1 = static_cast<float>(line1[0]) / 180.0f * M_PI;
-    ang2 = static_cast<float>(line2[0]) / 180.0f * M_PI;
-
-    float x, y;
-    x = (r1 * cos(ang2) - r2 * cos(ang1)) / sin(ang1 - ang2);
-    y = (r1 * sin(ang2) - r2 * sin(ang1)) / sin(ang1 - ang2);
-
-    crossingPoint.set((x + y) / sqrt(2.0), (y - x) / sqrt(2.0));
-
-    //ALOGV("Crosspoint at (%f, %f)", crossingPoint.x(), crossingPoint.y());
-    return crossingPoint;
-}
-
-// Verifies whether two opposite corners on a quadrilateral actually can be
-// the two corners of a color checker.
-bool ColorCheckerTest::verifyPointPair(Vec2f pointUpperLeft,
-                                       Vec2f pointBottomRight,
-                                       Vec2f* pointCenter,
-                                       Vec3i* color) {
-    bool success = true;
-
-    /** 5 and 30 are the threshold tuned for resolution 640*480*/
-    if ((pointUpperLeft.x() < 0) ||
-        (pointUpperLeft.x() >= mImage->getHeight()) ||
-        (pointUpperLeft.y() < 0) ||
-        (pointUpperLeft.y() >= mImage->getWidth()) ||
-        (pointBottomRight.x() < 0) ||
-        (pointBottomRight.x() >= mImage->getHeight()) ||
-        (pointBottomRight.y() < 0) ||
-        (pointBottomRight.y() >= mImage->getWidth()) ||
-        (std::abs(pointUpperLeft.x() - pointBottomRight.x()) <= 5) ||
-        (std::abs(pointUpperLeft.y() - pointBottomRight.y()) <= 5) ||
-        (std::abs(pointUpperLeft.x() - pointBottomRight.x()) >= 30) ||
-        (std::abs(pointUpperLeft.y() - pointBottomRight.y()) >= 30)) {
-
-        // If any of the quadrilateral corners are out of the image or if
-        // the distance between them are too large or too big, the quadrilateral
-        // could not be one of the checkers
-        success = false;
-    } else {
-        // Find the checker center if the corners of the rectangle meet criteria
-        pointCenter->set((pointUpperLeft.x() + pointBottomRight.x()) / 2.0f,
-                       (pointUpperLeft.y() + pointBottomRight.y()) / 2.0f);
-        color->set(mImage->getPixelValue(*pointCenter).r(),
-                   mImage->getPixelValue(*pointCenter).g(),
-                   mImage->getPixelValue(*pointCenter).b());
-        ALOGV("Color at (%f, %f) is (%d, %d, %d)", pointCenter->x(), pointCenter->y(),color->r(), color->g(), color->b());
-    }
-    return success;
-}
-
-// Verifies the color checker centers and finds the match between the detected
-// color checker and the reference MacBeth color checker
-void ColorCheckerTest::verifyColorGrid() {
-    ALOGV("Start looking for Color Grid");
-    int numHorizontalLines = mCandidateColors.size();
-    int numVerticalLines = mCandidateColors[0].size();
-    bool success = false;
-
-    // Computes the standard deviation of one row/column of the proposed color
-    // checker. Discards the row/column if the std is below a threshold.
-    for (int i = 0; i < numHorizontalLines; ++i) {
-        Vec3f meanColor(0.f, 0.f, 0.f);
-        int numNonZero = 0;
-
-        for (int j = 0; j < numVerticalLines; ++j) {
-            if (mCandidateColors[i][j] != NULL) {
-                ALOGV("candidate color (%d, %d) is (%d, %d, %d)", i, j, mCandidateColors[i][j]->r(), mCandidateColors[i][j]->g(), mCandidateColors[i][j]->b());
-
-                meanColor = meanColor + (*mCandidateColors[i][j]);
-                ++numNonZero;
-            }
-        }
-        if (numNonZero > 0) {
-            meanColor = meanColor / numNonZero;
-        }
-        ALOGV("Mean color for vertical direction computed!");
-
-        float std = 0;
-        for (int j = 0; j < numVerticalLines; ++j) {
-            if (mCandidateColors[i][j] != NULL) {
-                std += mCandidateColors[i][j]->squareDistance<float>(meanColor);
-            }
-        }
-        if (numNonZero > 0) {
-            std = sqrt(std / (3 * numNonZero));
-        }
-        ALOGV("st. deviation for the %d dir1 is %d", i, static_cast<int>(std));
-
-        if ((std <= 30) && (numNonZero > 1)) {
-            for (int j = 0; j < numVerticalLines; ++j) {
-                if (mCandidateColors[i][j] != NULL) {
-                    delete mCandidateColors[i][j];
-                    mCandidateColors[i][j] = NULL;
-                }
-            }
-        }
-    }
-
-    // Discards the column/row of the color checker if the std is below a
-    // threshold.
-    for (int j = 0; j < numVerticalLines; ++j) {
-        Vec3f meanColor(0.f, 0.f, 0.f);
-        int numNonZero = 0;
-
-        for (int i = 0; i < numHorizontalLines; ++i) {
-            if (mCandidateColors[i][j] != NULL) {
-                meanColor = meanColor + (*mCandidateColors[i][j]);
-                ++numNonZero;
-            }
-        }
-        if (numNonZero > 0) {
-            meanColor = meanColor / numNonZero;
-        }
-
-        float std = 0;
-        for (int i = 0; i < numHorizontalLines; ++i) {
-            if (mCandidateColors[i][j] != NULL) {
-                std += mCandidateColors[i][j]->squareDistance<float>(meanColor);
-            }
-        }
-        if (numNonZero > 0) {
-            std = sqrt(std / (3 * numNonZero));
-        }
-
-        ALOGV("st. deviation for the %d dir2 is %d", j, static_cast<int>(std));
-
-        if ((std <= 30) && (numNonZero > 1)) {
-            for (int i = 0; i < numHorizontalLines; ++i) {
-                if (mCandidateColors[i][j] != NULL) {
-                    delete mCandidateColors[i][j];
-                    mCandidateColors[i][j] = NULL;
-                }
-            }
-        }
-    }
-
-    for (int i = 0; i < numHorizontalLines; ++i) {
-        for (int j = 0; j < numVerticalLines; ++j) {
-            if (mCandidateColors[i][j] != NULL) {
-                ALOGV("position (%d, %d) is at (%f, %f) with color (%d, %d, %d)",
-                     i, j,
-                     mCandidatePositions[i][j]->x(),
-                     mCandidatePositions[i][j]->y(),
-                     mCandidateColors[i][j]->r(),
-                     mCandidateColors[i][j]->g(),
-                     mCandidateColors[i][j]->b());
-            } else {
-                ALOGV("position (%d, %d) is 0", i, j);
-            }
-        }
-    }
-
-    // Finds the match between the detected color checker and the reference
-    // MacBeth color checker.
-    int rowStart = 0;
-    int rowEnd = 0;
-
-    // Loops until all dectected color checker has been processed.
-    while (!success) {
-        int columnStart = 0;
-        int columnEnd = 0;
-        bool isRowStart = false;
-        bool isRowEnd = true;
-
-        // Finds the row start of the next block of detected color checkers.
-        while ((!isRowStart) && (rowStart <  numHorizontalLines)) {
-            for (int j = 0; j < numVerticalLines; ++j) {
-                if (mCandidateColors[rowStart][j] != NULL) {
-                    isRowStart = true;
-                }
-            }
-            ++rowStart;
-        }
-        rowStart--;
-        rowEnd = rowStart;
-        ALOGV("rowStart is %d", rowStart);
-
-        // Finds the row end of the next block of detected color checkers.
-        while ((isRowEnd) && (rowEnd < numHorizontalLines)) {
-            isRowEnd = false;
-            for (int j = 0; j < numVerticalLines; ++j) {
-                if (mCandidateColors[rowEnd][j] != NULL) {
-                    isRowEnd= true;
-                }
-            }
-            if (isRowEnd) {
-                ++rowEnd;
-            }
-        }
-        if ((!isRowEnd) && isRowStart) {
-            rowEnd--;
-        }
-        if ((isRowEnd) && (rowEnd == numHorizontalLines)) {
-            rowEnd--;
-            isRowEnd = false;
-        }
-        ALOGV("rowEnd is %d", rowEnd);
-
-        // Matches color checkers between the start row and the end row.
-        bool successVertical = false;
-
-        while (!successVertical) {
-            bool isColumnEnd = true;
-            bool isColumnStart = false;
-
-            // Finds the start column of the next block of color checker
-            while ((!isColumnStart) && (columnStart < numVerticalLines)) {
-                if (mCandidateColors[rowStart][columnStart] != NULL) {
-                    isColumnStart = true;
-                }
-                ++columnStart;
-            }
-            columnStart--;
-            columnEnd = columnStart;
-
-            // Finds the end column of the next block of color checker
-            while ((isColumnEnd) && (columnEnd < numVerticalLines)) {
-                isColumnEnd = false;
-                if (mCandidateColors[rowStart][columnEnd] != NULL)
-                    isColumnEnd = true;
-                if (isColumnEnd) {
-                    ++columnEnd;
-                }
-            }
-
-            if ((!isColumnEnd) && isColumnStart) {
-                columnEnd--;
-            }
-            if ((isColumnEnd) && (columnEnd == numVerticalLines)) {
-                columnEnd--;
-                isColumnEnd = false;
-            }
-
-            // Finds the best match on the MacBeth reference color checker for
-            // the continuous block of detected color checker
-            if (isRowStart && (!isRowEnd) &&
-                isColumnStart && (!isColumnEnd)) {
-                findBestMatch(rowStart, rowEnd, columnStart, columnEnd);
-            }
-            ALOGV("FindBestMatch for %d, %d, %d, %d", rowStart,
-                 rowEnd, columnStart, columnEnd);
-
-            // If the column search finishes, go out of the loop
-            if (columnEnd >= numVerticalLines - 1) {
-                successVertical = true;
-            } else {
-                columnStart = columnEnd + 1;
-            }
-        }
-        ALOGV("Continuing to search for direction 1");
-
-        // If the row search finishes, go out of the loop
-        if (rowEnd >= numHorizontalLines - 1) {
-            success = true;
-        } else {
-            rowStart = rowEnd + 1;
-        }
-    }
-
-    for (int i = 0; i < 4; ++i) {
-        for (int j = 0; j < 6; ++j) {
-            if (mMatchPositions[i][j] != NULL) {
-                ALOGV("Reference Match position for (%d, %d) is (%f, %f)", i, j,
-                     mMatchPositions[i][j]->x(), mMatchPositions[i][j]->y());
-            }
-        }
-    }
-
-    fillRefColorGrid();
-}
-
-// Finds the best match on the MacBeth color checker for the continuous block of
-// detected color checkers bounded by row i1, row i2 and column j1 and column j2
-// Assumes that the subsample is less than 4*6.
-void ColorCheckerTest::findBestMatch(int i1, int i2, int j1, int j2) {
-    int numHorizontalGrid = i2 - i1 + 1;
-    int numVerticalGrid = j2 - j1 + 1;
-
-    if (((numHorizontalGrid > 1) || (numVerticalGrid > 1)) &&
-        (numHorizontalGrid <= 4) && (numVerticalGrid <= 6)) {
-        ALOGV("i1, j2, j1, j2 is %d, %d, %d, %d", i1, i2, j1, j2);
-        float minError;
-        float error = 0.f;
-        int horizontalMatch, verticalMatch;
-
-        // Finds the match start point where the error is minimized.
-        for (int i = 0; i < numHorizontalGrid; ++i) {
-            for (int j = 0; j < numVerticalGrid; ++j) {
-                if (mCandidateColors[i1 + i][j1 + j] != NULL) {
-                    error += mCandidateColors[i1 + i][j1 + j]->squareDistance<int>(
-                            *mReferenceColors[i][j]);
-                }
-            }
-        }
-        ALOGV("Error is %f", error);
-        minError = error;
-        horizontalMatch = 0;
-        verticalMatch = 0;
-
-        for (int i = 0; i <= 4 - numHorizontalGrid; ++i) {
-            for (int j = 0; j <= 6 - numVerticalGrid; ++j) {
-                error = 0.f;
-
-                for (int id = 0; id < numHorizontalGrid; ++id) {
-                    for (int jd = 0; jd < numVerticalGrid; ++jd) {
-                        if (mCandidateColors[i1 + id][j1 + jd] != NULL) {
-                            error += mCandidateColors[i1 + id][j1 + jd]->
-                                    squareDistance<int>(
-                                            *mReferenceColors[i + id][j + jd]);
-                        }
-                    }
-                }
-
-                if (error < minError) {
-                    minError = error;
-                    horizontalMatch = i;
-                    verticalMatch = j;
-                }
-                ALOGV("Processed %d, %d and error is %f", i, j, error );
-            }
-        }
-
-        for (int id = 0; id < numHorizontalGrid; ++id) {
-            for (int jd = 0; jd < numVerticalGrid; ++jd) {
-                if (mCandidatePositions[i1 + id][j1 + jd] != NULL) {
-                    mMatchPositions[horizontalMatch + id][verticalMatch + jd] =
-                            new Vec2f(mCandidatePositions[i1 + id][j1 + jd]->x(),
-                                      mCandidatePositions[i1 + id][j1 + jd]->y());
-                }
-            }
-        }
-        ALOGV("Grid match starts at %d, %d", horizontalMatch, verticalMatch);
-    }
-}
-
-// Finds the boundary of a color checker by its color similarity to the center.
-// Also predicts the location of unmatched checkers.
-void ColorCheckerTest::fillRefColorGrid() {
-    int rowStart = 0;
-    int columnStart = 0;
-    bool foundStart = true;
-
-    for (int i = 0; (i < 4) && foundStart; ++i) {
-        for (int j = 0; (j < 6) && foundStart; ++j) {
-            if (mMatchPositions[i][j] != NULL) {
-                rowStart = i;
-                columnStart = j;
-                foundStart = false;
-            }
-        }
-    }
-    ALOGV("First match found at (%d, %d)", rowStart, columnStart);
-
-    float rowDistance, columnDistance;
-    rowDistance = 0;
-    columnDistance = 0;
-    int numRowGrids = 0;
-    int numColumnGrids = 0;
-
-    for (int i = rowStart; i < 4; ++i) {
-        for (int j = columnStart; j < 6; ++j) {
-            if (mMatchPositions[i][j] != NULL) {
-                if (i > rowStart) {
-                    ++numRowGrids;
-                    rowDistance += (mMatchPositions[i][j]->x() -
-                                mMatchPositions[rowStart][columnStart]->x()) /
-                                static_cast<float>(i - rowStart);
-                }
-                if (j > columnStart) {
-                    ++numColumnGrids;
-                    columnDistance += (mMatchPositions[i][j]->y() -
-                                mMatchPositions[rowStart][columnStart]->y()) /
-                                static_cast<float>(j - columnStart);
-                }
-            }
-        }
-    }
-
-    if ((numRowGrids > 0) && (numColumnGrids > 0)) {
-        rowDistance = rowDistance / numRowGrids;
-        columnDistance = columnDistance / numColumnGrids;
-        ALOGV("delta is %f, %f", rowDistance, columnDistance);
-
-        for (int i = 0; i < 4; ++i) {
-            for (int j = 0 ; j < 6; ++j) {
-                if (mMatchPositions[i][j] == NULL) {
-                    mMatchPositions[i][j] = new Vec2f(
-                            mMatchPositions[rowStart][columnStart]->x() +
-                                    (i - rowStart) * rowDistance,
-                            mMatchPositions[rowStart][columnStart]->y() +
-                                    (j - columnStart) * columnDistance);
-                }
-            }
-        }
-        for (int i = 0; i < 4; ++i) {
-            for (int j = 0; j < 6; ++j) {
-                float radius = 0;
-                Vec3i color = mImage->getPixelValue(*mMatchPositions[i][j]);
-                Vec3f meanColor(0.f , 0.f, 0.f);
-
-                int numPixels = 0;
-                for (int ii  = static_cast<int>(mMatchPositions[i][j]->x() -
-                                                rowDistance/2);
-                     ii <= static_cast<int>(mMatchPositions[i][j]->x() +
-                                            rowDistance/2);
-                     ++ii) {
-                    for (int jj = static_cast<int>(mMatchPositions[i][j]->y() -
-                                                   columnDistance/2);
-                         jj <= static_cast<int>(mMatchPositions[i][j]->y() +
-                                                columnDistance/2);
-                         ++jj) {
-                        if ((ii >= 0) && (ii < mImage->getHeight()) &&
-                            (jj >= 0) && (jj < mImage->getWidth())) {
-                            Vec3i pixelColor = mImage->getPixelValue(ii,jj);
-                            float error = color.squareDistance<int>(pixelColor);
-
-                            if (error < COLOR_ERROR_THRESHOLD) {
-                                drawPoint(ii, jj, *mReferenceColors[i][j]);
-                                meanColor = meanColor + pixelColor;
-                                numPixels++;
-                                Vec2i pixelPosition(ii, jj);
-
-                                if (pixelPosition.squareDistance<float>(
-                                        *mMatchPositions[i][j]) > radius) {
-                                    radius = pixelPosition.squareDistance<float>(
-                                            *mMatchPositions[i][j]);
-                                }
-                            }
-                        }
-                    }
-                }
-
-                /** Computes the radius of the checker.
-                 * The above computed radius is the squared distance to the
-                 * furthest point with a matching color. To be conservative, we
-                 * only consider an area with radius half of the above computed
-                 * value. Since radius is computed as a squared root, the one
-                 * that will be recorded is 1/4 of the above computed value.
-                 */
-                mMatchRadius[i][j] = radius / 4.f;
-                mMatchColors[i][j] = new Vec3f(meanColor / numPixels);
-
-                ALOGV("Reference color at (%d, %d) is (%d, %d, %d)", i, j,
-                     mReferenceColors[i][j]->r(),
-                     mReferenceColors[i][j]->g(),
-                     mReferenceColors[i][j]->b());
-                ALOGV("Average color at (%d, %d) is (%f, %f, %f)", i, j,
-                     mMatchColors[i][j]->r(),
-                     mMatchColors[i][j]->g(),
-                     mMatchColors[i][j]->b());
-                ALOGV("Radius is %f", mMatchRadius[i][j]);
-            }
-        }
-
-        mSuccess = true;
-    }
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp b/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp
deleted file mode 100644
index da9fc40..0000000
--- a/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "ExposureCompensationTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-#include <stdio.h>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "exposurecompensationtest.h"
-
-const float GAMMA_CORRECTION = 2.2f;
-void ExposureCompensationTest::processData() {
-    ALOGV("Start Processing Exposure Compensation Test Data!");
-    clearDebugImage();
-
-    if (mDebugText != NULL) {
-        delete mDebugText;
-        mDebugText = NULL;
-    }
-
-    int numTests = mExposureValues.size();
-    int numPatches = mCheckerColors[0].size();
-    ALOGV("Processing %d tests with %d patches", numTests, numPatches);
-
-    mDebugText = new char[320 * numTests];
-    mDebugText[0] = 0;
-    char* debugText = new char[50];
-
-    Vec3i red(255, 0, 0);
-    Vec3i green(0, 255, 0);
-    Vec3i blue(0, 0, 255);
-
-    float minExposure = -3.0f;
-    float scale = 9.0f;
-    for (int i = 0; i < numTests; ++i) {
-        snprintf(debugText, 50, "Exposure is %f \n", mExposureValues[i]);
-        strcat(mDebugText, debugText);
-        for (int j = 0; j < numPatches; ++j) {
-            int exposureRed = static_cast<int>((
-                log(static_cast<float>(mReferenceColors[j].r()))
-                / log(2.0f) * GAMMA_CORRECTION +
-                mExposureValues[i] - minExposure) * scale);
-            int exposureGreen = static_cast<int>((
-                log(static_cast<float>(mReferenceColors[j].g()))
-                / log(2.0f) * GAMMA_CORRECTION +
-                mExposureValues[i] - minExposure) * scale);
-            int exposureBlue = static_cast<int>((
-                log(static_cast<float>(mReferenceColors[j].b()))
-                / log(2.0f) * GAMMA_CORRECTION +
-                mExposureValues[i] - minExposure) * scale);
-
-            snprintf(debugText, 50, "%d %f %d %f %d %f \n",
-                    exposureRed, mCheckerColors[i][j].r(),
-                    exposureGreen, mCheckerColors[i][j].g(),
-                    exposureBlue, mCheckerColors[i][j].b());
-
-            ALOGV("%s", debugText);
-            strcat(mDebugText, debugText);
-
-            drawPoint(200 - exposureRed, mCheckerColors[i][j].r(), red);
-            drawPoint(200 - exposureGreen, mCheckerColors[i][j].g(), green);
-            drawPoint(200 - exposureBlue, mCheckerColors[i][j].b(), blue);
-        }
-    }
-    mExposureValues.clear();
-    mCheckerColors.clear();
-}
-
-void ExposureCompensationTest::initializeReferenceColors() {
-    mReferenceColors.resize(6);
-
-    mReferenceColors[0].set(243, 243, 242);
-    mReferenceColors[1].set(200, 200, 200);
-    mReferenceColors[2].set(160, 160, 160);
-    mReferenceColors[3].set(122, 122, 121);
-    mReferenceColors[4].set(85, 85, 85);
-    mReferenceColors[5].set(52, 52, 52);
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp b/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
deleted file mode 100644
index cc3bca9..0000000
--- a/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "ImageTestHandler"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <cstring>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "imagetesthandler.h"
-
-void ImageTestHandler::initDebugImage() {
-    mDebugOutput = NULL;
-}
-
-// Initializes the  debug image with a given height and width.
-void ImageTestHandler::initDebugImage(int debugHeight,
-                                      int debugWidth) {
-    mDebugOutput = NULL;
-    mDebugOutput = new unsigned char[debugHeight * debugWidth * 4];
-    memset(mDebugOutput, 0, debugHeight * debugWidth * 4);
-
-    mDebugHeight = debugHeight;
-    mDebugWidth = debugWidth;
-}
-
-// Copies an existing image to the debug image.
-void ImageTestHandler::copyDebugImage(int inputHeight, int inputWidth,
-                                      const unsigned char* inputImage) {
-    if ((inputHeight == mDebugHeight) && (inputWidth == mDebugWidth)) {
-        ALOGV("Copying debug images");
-        memcpy(mDebugOutput, inputImage, mDebugHeight * mDebugWidth * 4);
-    }
-}
-
-void ImageTestHandler::clearDebugImage() {
-    if (mDebugOutput != NULL) {
-        delete[] mDebugOutput;
-        mDebugOutput = new unsigned char[mDebugHeight * mDebugWidth * 4];
-        memset(mDebugOutput, 0, mDebugHeight * mDebugWidth * 4);
-    }
-}
-
-
-// Draws a point of a given color.
-void ImageTestHandler::drawPoint(int row, int column, const Vec3i &color) {
-    if ((row >= 0) && (column >= 0) &&
-        (column < mDebugWidth) && (row < mDebugHeight)) {
-        mDebugOutput[(row*mDebugWidth + column) * 4] = color.r();
-        mDebugOutput[(row*mDebugWidth + column) * 4+1] = color.g();
-        mDebugOutput[(row*mDebugWidth + column) * 4+2] = color.b();
-        mDebugOutput[(row*mDebugWidth + column) * 4+3] = 255;
-    }
-}
-
-// Draws a point in Vec2 format of a given color.
-void ImageTestHandler::drawPoint(const Vec2i &point, const Vec3i &color) {
-    drawPoint((int) point.y(), (int) point.x(), color);
-}
-
-// Draws a line of a given color.
-void ImageTestHandler::drawLine(int angle, int radius, const Vec3i &color) {
-    const int r = color.r();
-    const int g = color.g();
-    const int b = color.b();
-    const int a = 255;
-
-    int shiftedMin = -113;
-    int shiftedMax = 83;
-
-    float radiusDouble = static_cast<float>(radius);
-
-    float angleRad = static_cast<float>(angle) * M_PI / 180.0;
-
-    //ALOGV("draw line for (%d, %d)", angle, radius);
-    for (int i = shiftedMin; i <= shiftedMax; ++i) {
-        float j;
-
-        assert(angle != 0);
-        j = (i - radiusDouble / sin(angleRad)) * tan(angleRad);
-        float x = (static_cast<float>(i) + j) / sqrt(2.0);
-        float y = (j - static_cast<float>(i)) / sqrt(2.0);
-
-        drawPoint(x, y, color);
-    }
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp b/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp
deleted file mode 100644
index 47de5d8..0000000
--- a/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "MeteringTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "meteringtest.h"
-
-const float kOverExposure = 230.f;
-const float kEqThreshold = 0.05f;
-// Processes the checker colors stored by comparing the pixel values from the
-// two scenarios in a test.
-void MeteringTest::processData() {
-    ALOGV("Start Processing Metering Test Data!");
-
-    int numTests = mCheckerColors.size() / 2;
-    mNumPatches = 0;
-
-    if (numTests > 0) {
-        mNumPatches = mCheckerColors[0].size();
-    }
-
-    for (int i = 0; i < numTests; ++i) {
-        mComparisonResults.push_back(
-                isEquivalentTo((&mCheckerColors[i * 2]),
-                               (&mCheckerColors[i * 2 + 1])));
-        mComparisonResults.push_back(
-                isDarkerThan((&mCheckerColors[i * 2]),
-                             (&mCheckerColors[i * 2 + 1])));
-    }
-}
-
-void MeteringTest::clearData() {
-    mComparisonResults.clear();
-    mCheckerColors.clear();
-}
-
-// Compares two given arrays of pixel values and decide whether the first one is
-// significantly darker than the second one.
-bool MeteringTest::isDarkerThan(
-        const std::vector<Vec3f>* checkerColors1,
-        const std::vector<Vec3f>* checkerColors2) const {
-    float meanRatio = 0.f;
-    int meanNumCount = 0;
-
-    for (int i = 0; i < mNumPatches; ++i) {
-        float luminance1 = (*checkerColors1)[i].convertToLuminance();
-        float luminance2 = (*checkerColors2)[i].convertToLuminance();
-
-        // Out of the saturation rage, define 5% as a margin for being
-        // significantly brighter.
-        if ((luminance2 < kOverExposure) && (luminance1 != 0.f)) {
-            meanRatio += luminance2 / luminance1;
-            ++meanNumCount;
-        }
-    }
-    meanRatio = meanRatio / meanNumCount;
-
-    return (meanRatio > 1 + kEqThreshold);
-}
-
-// Compares the two givn arrays of pixel values and decide whether they are
-// equivalent within an acceptable range.
-bool MeteringTest::isEquivalentTo(
-        const std::vector<Vec3f>* checkerColors1,
-        const std::vector<Vec3f>* checkerColors2) const {
-    float meanRatio = 0.f;
-    int meanNumCount = 0;
-
-    for (int i = 0; i < mNumPatches; ++i) {
-        float luminance1 = (*checkerColors1)[i].convertToLuminance();
-        float luminance2 = (*checkerColors2)[i].convertToLuminance();
-        ALOGV("Luma_1 and Luma_2 is %f, %f", luminance1, luminance2);
-
-        if ((luminance1 < kOverExposure) && (luminance2 < kOverExposure)) {
-              meanRatio += luminance2 / luminance1;
-              ++meanNumCount;
-        }
-    }
-    meanRatio = meanRatio / meanNumCount;
-
-    return ((meanRatio >= 1 - kEqThreshold) && (meanRatio <= 1 + kEqThreshold));
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/testingimage.cpp b/apps/CtsVerifier/lib/colorchecker/testingimage.cpp
deleted file mode 100644
index 28f025f..0000000
--- a/apps/CtsVerifier/lib/colorchecker/testingimage.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "TestingImage"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <string.h>
-#include <cmath>
-#include <vector>
-#include <assert.h>
-#include "vec3.h"
-
-#include "testingimage.h"
-
-const float GAMMA_CORRECTION = 2.2f;
-
-// Constructs an instance with the given image byte array.
-TestingImage::TestingImage(const unsigned char* inputImage,
-                           int inputHeight, int inputWidth,
-                           int inputChannel, int inputRowSpan) {
-    mImage = new unsigned char[inputRowSpan * inputHeight];
-
-    ALOGV("mImage format created! with size as %d, %d, %d",
-         inputRowSpan, inputHeight, inputChannel);
-    mWidth = inputWidth;
-    mHeight = inputHeight;
-    mChannels = inputChannel;
-    mRowSpan = mWidth * mChannels;
-
-    for (int i = 0; i < mHeight; ++i) {
-        for (int j = 0; j < mWidth; ++j) {
-            for (int k = 0; k < mChannels; ++k) {
-                mImage[i * mRowSpan + j* mChannels + k] =
-                        inputImage[i * inputRowSpan + j * inputChannel + k];
-            }
-        }
-    }
-    ALOGV("mImage converted!");
-}
-
-// Constructs an instance with the given image and resize it to a new size.
-TestingImage::TestingImage(const unsigned char* inputImage,
-                           int inputHeight, int inputWidth,
-                           int inputChannel, int inputRowSpan,
-                           int newHeight, int newWidth) {
-    mImage = new unsigned char[newHeight * newWidth * inputChannel];
-
-    ALOGV("mImage format created! with size as %d, %d, %d",
-         newHeight, newWidth, inputChannel);
-    mHeight = newHeight;
-    mWidth = newWidth;
-    mChannels = inputChannel;
-    mRowSpan = mWidth * mChannels;
-
-    // Computes how many pixels in the original image corresponds to one pixel
-    // in the new image.
-    int heightScale = inputHeight / newHeight;
-    int widthScale = inputWidth / newWidth;
-
-    // Average the corresponding pixels in the original image to compute the
-    // pixel value of the new image.
-    for (int i = 0; i < mHeight; ++i) {
-        for (int j = 0; j < mWidth; ++j) {
-            for (int k = 0; k < mChannels; ++k) {
-                int pixelValue = 0;
-
-                for (int l = 0; l < heightScale; ++l) {
-                    for (int m = 0; m < widthScale; ++m) {
-                        pixelValue += inputImage[
-                                (i * heightScale + l) * inputRowSpan
-                                + (j * widthScale + m) * inputChannel + k];
-                    }
-                }
-                pixelValue = pixelValue / (heightScale * widthScale);
-                mImage[i * mRowSpan + j * mChannels + k] =
-                        (unsigned char) pixelValue;
-            }
-        }
-    }
-}
-
-TestingImage::~TestingImage() {
-    if (mImage!=NULL) {
-        delete[] mImage;
-    }
-}
-
-int TestingImage::getPixelValue(int row, int column, int channel) const {
-    assert ((row >= 0) && (row < mHeight));
-    assert ((column >= 0) && (column < mWidth));
-    assert ((channel >= 0) && (channel < mChannels));
-    return (int)mImage[row * mRowSpan + column * mChannels + channel];
-}
-
-Vec3i TestingImage::getPixelValue(int row, int column) const {
-    Vec3i current_color(getPixelValue(row, column, 0),
-                        getPixelValue(row, column, 1),
-                        getPixelValue(row, column, 2));
-    return current_color;
-}
-
-Vec3i TestingImage::getPixelValue(const Vec2i &pixelPosition) const {
-    return getPixelValue(pixelPosition.x(), pixelPosition.y());
-}
-
-Vec3i TestingImage::getPixelValue(const Vec2f &pixelPosition) const {
-    return getPixelValue(static_cast<int>(pixelPosition.x()),
-                         static_cast<int>(pixelPosition.y()));
-}
-
-// Returns a vector of the colors in the requested block of color checkers.
-// The vector is formatted by going through the block from left to right and
-// from top to bottom.
-const std::vector<Vec3f>* TestingImage::getColorChecker(
-      int rowStart, int rowEnd, int columnStart, int columnEnd,
-      const std::vector<std::vector< Vec2f > >* centerAddress,
-      const std::vector<std::vector< float > >* radiusAddress) const {
-    std::vector<Vec3f>* checkerColors = new std::vector<Vec3f>;
-
-    // Average the pixel values of the pixels within the given radius to the
-    // given center position.
-    for (int i = rowStart; i < rowEnd; ++i) {
-        for (int j = columnStart; j < columnEnd; ++j) {
-            float radius = sqrt((*radiusAddress)[i][j]);
-            Vec2f center((*centerAddress)[i][j].x(),
-                               (*centerAddress)[i][j].y());
-            Vec3f meanColor(0.f, 0.f, 0.f);
-            int numPixels = 0;
-
-            for (int ii = static_cast<int>(center.x() - radius);
-                 ii < static_cast<int>(center.x() + radius); ++ii) {
-                for (int jj = static_cast<int>(center.y() - radius);
-                     jj < static_cast<int>(center.y() + radius); ++jj) {
-
-                    Vec2i pixelPosition(ii,jj);
-                    if (pixelPosition.squareDistance<float>(center) <
-                        (*radiusAddress)[i][j]) {
-                        meanColor = meanColor + getPixelValue(pixelPosition);
-                        ++numPixels;
-                    }
-                }
-            }
-            meanColor = meanColor / numPixels;
-            checkerColors->push_back(meanColor);
-        }
-    }
-
-    return checkerColors;
-}
-
-bool TestingImage::rgbToGrayScale(unsigned char* grayLayer) const {
-    if (mChannels == 4) {
-        for (int i = 0; i < mWidth; i++) {
-            for (int j = 0; j < mHeight; j++) {
-                float redLinear = pow(getPixelValue(j, i, 0),
-                                       GAMMA_CORRECTION);
-                float greenLinear = pow(getPixelValue(j,i,1),
-                                         GAMMA_CORRECTION);
-                float blueLinear = pow(getPixelValue(j,i,2),
-                                        GAMMA_CORRECTION);
-
-                // Computes the luminance value
-                grayLayer[j * mWidth + i] =
-                        (unsigned char)((int)pow((0.299f * redLinear
-                                                  + 0.587f * greenLinear
-                                                  + 0.114f * blueLinear),
-                                                  1/GAMMA_CORRECTION));
-            }
-        }
-
-        return true;
-    } else {
-
-        return false;
-    }
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/vec2.cpp b/apps/CtsVerifier/lib/colorchecker/vec2.cpp
deleted file mode 100644
index 29736bb..0000000
--- a/apps/CtsVerifier/lib/colorchecker/vec2.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "Vec2"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-
-#include "vec2.h"
diff --git a/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp b/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp
deleted file mode 100644
index 6413a2b..0000000
--- a/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "WhiteBalanceTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "whitebalancetest.h"
-
-// White point in XYZ color space under 5200k illumination.
-const Vec3f kDaylightWhitePoint(0.9781f, 1.f, 0.9021f);
-
-// Process the data of checker colors collected under different white balance.
-// Assuming the Daylight CCT is set to 5200k, compute the CCT of other white
-// balance modes.
-void WhiteBalanceTest::processData() {
-    ALOGV("Start Processing White Balance Test Data!");
-
-    int numPatches = mCheckerColors.size();
-    ALOGV("Processing %d tests with %d patches", 2, numPatches);
-
-    std::vector<Vec3f> xyzColors(numPatches);
-    for (int j = 0; j < numPatches; ++j) {
-        Vec3f xyzCheckerColor = initializeFromRGB(mCheckerColors[j]);
-        xyzColors[j] = xyzCheckerColor;
-        ALOGV("XYZ coordinate is %f, %f, %f", xyzCheckerColor.r(),
-              xyzCheckerColor.g(), xyzCheckerColor.b());
-    }
-
-    Vec3f meanScale(0.f, 0.f, 0.f);
-
-    if (mMode == "daylight") {
-        mXyzColorsDaylight = xyzColors;
-        // For testing the auto white balance mode. Compute a CCT that would
-        // map the gray checkers to a white point.
-        for (int j = 1; j < numPatches; ++j) {
-            meanScale = meanScale +
-                    (mXyzColorsDaylight[j] / kDaylightWhitePoint);
-        }
-    } else {
-        for (int j = 1; j < numPatches; ++j) {
-            meanScale = meanScale + (mXyzColorsDaylight[j] / xyzColors[j]);
-        }
-    }
-
-    meanScale = meanScale / (numPatches - 1);
-    ALOGV("Scale: %f, %f, %f", meanScale.r(), meanScale.g(), meanScale.b());
-
-    Vec3f whitePoint;
-    whitePoint = meanScale * kDaylightWhitePoint;
-
-    ALOGV("White point is %f, %f, %f", whitePoint.r(),
-         whitePoint.g(), whitePoint.b());
-
-    mCorrelatedColorTemp = findCorrelatedColorTemp(whitePoint);
-    ALOGV("CCT is %d", mCorrelatedColorTemp);
-}
-
-// Given a white point, find the correlated color temperature.
-// Formula taken from the paper "Calculating Correlated Color Temperatures
-// Across the Entire Gamut of Daylight and Skylight Chromaticities" by Hernandez
-// Andres et al. in 1999. The numbers are fitting parameters.
-int WhiteBalanceTest::findCorrelatedColorTemp(const Vec3f &whitePoint) {
-    Vec2f chromaOfWhitePoint(
-        whitePoint.r() / (whitePoint.r() + whitePoint.g() + whitePoint.b()),
-        whitePoint.g() / (whitePoint.r() + whitePoint.g() + whitePoint.b()));
-
-    float n = (chromaOfWhitePoint.x() - 0.3366f)
-                / (chromaOfWhitePoint.y() - 0.1735f);
-    float y = -949.86315f + 6253.80338f * exp(-n / 0.92159f)
-               + 28.70599f * exp(-n / 0.20039f) + 0.00004f * exp(-n / 0.07125f);
-
-    return static_cast<int>(y);
-}
-
-// Converts a RGB pixel value to XYZ color space.
-Vec3f WhiteBalanceTest::initializeFromRGB(const Vec3f &rgb) {
-    float linearRed = convertToLinear(rgb.r());
-    float linearGreen = convertToLinear(rgb.g());
-    float linearBlue = convertToLinear(rgb.b());
-
-    float x = 0.4124f * linearRed + 0.3576f * linearGreen +
-            0.1805f * linearBlue;
-    float y = 0.2126f * linearRed + 0.7152f * linearGreen +
-            0.0722f * linearBlue;
-    float z = 0.0193f * linearRed + 0.1192f * linearGreen +
-            0.9505f * linearBlue;
-
-    return Vec3f(x, y, z);
-}
-
-float WhiteBalanceTest::convertToLinear(float color) {
-    float norm = color/ 255.0f;
-    float linearColor;
-
-    // Convert from sRGB space to linear RGB value
-    if (norm > 0.04045f) {
-        linearColor = pow(((norm + 0.055f) / 1.055f), 2.4f);
-    } else {
-        linearColor = norm / 12.92f;
-    }
-
-    return linearColor;
-}
diff --git a/apps/CtsVerifier/libs/opencv-android.jar b/apps/CtsVerifier/libs/opencv-android.jar
new file mode 100644
index 0000000..1c13eee
--- /dev/null
+++ b/apps/CtsVerifier/libs/opencv-android.jar
Binary files differ
diff --git a/apps/CtsVerifier/libs/opencv-android_LICENSE b/apps/CtsVerifier/libs/opencv-android_LICENSE
new file mode 100644
index 0000000..5e32d88
--- /dev/null
+++ b/apps/CtsVerifier/libs/opencv-android_LICENSE
@@ -0,0 +1,33 @@
+By downloading, copying, installing or using the software you agree to this license.
+If you do not agree to this license, do not download, install,
+copy or use the software.
+
+
+                          License Agreement
+               For Open Source Computer Vision Library
+                       (3-clause BSD License)
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright notice,
+    this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+
+  * Neither the names of the copyright holders nor the names of the contributors
+    may be used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as is" and
+any express or implied warranties, including, but not limited to, the implied
+warranties of merchantability and fitness for a particular purpose are disclaimed.
+In no event shall copyright holders or contributors be liable for any direct,
+indirect, incidental, special, exemplary, or consequential damages
+(including, but not limited to, procurement of substitute goods or services;
+loss of use, data, or profits; or business interruption) however caused
+and on any theory of liability, whether in contract, strict liability,
+or tort (including negligence or otherwise) arising in any way out of
+the use of this software, even if advised of the possibility of such damage.
diff --git a/apps/CtsVerifier/proguard.flags b/apps/CtsVerifier/proguard.flags
index ca4680f..fe7eed8 100644
--- a/apps/CtsVerifier/proguard.flags
+++ b/apps/CtsVerifier/proguard.flags
@@ -19,3 +19,5 @@
 -dontwarn android.hardware.Sensor
 -dontwarn android.test.AndroidTestRunner
 -dontwarn java.util.concurrent.ConcurrentLinkedDeque
+-dontwarn android.cts.util.**
+-dontwarn junit.**
diff --git a/apps/CtsVerifier/res/drawable/prompt_x.png b/apps/CtsVerifier/res/drawable/prompt_x.png
new file mode 100644
index 0000000..64302dc
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/prompt_x.png
Binary files differ
diff --git a/apps/CtsVerifier/res/drawable/prompt_y.png b/apps/CtsVerifier/res/drawable/prompt_y.png
new file mode 100644
index 0000000..01926b5
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/prompt_y.png
Binary files differ
diff --git a/apps/CtsVerifier/res/drawable/prompt_z.png b/apps/CtsVerifier/res/drawable/prompt_z.png
new file mode 100644
index 0000000..f4d86d6
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/prompt_z.png
Binary files differ
diff --git a/apps/CtsVerifier/res/drawable/stat_sys_managed_profile_status.xml b/apps/CtsVerifier/res/drawable/stat_sys_managed_profile_status.xml
new file mode 100644
index 0000000..b04059e
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/stat_sys_managed_profile_status.xml
@@ -0,0 +1,29 @@
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="23.0dp"
+        android:height="18.0dp"
+        android:viewportWidth="21.0"
+        android:viewportHeight="17.0">
+    <group android:translateX="2.0">
+        <path
+            android:fillColor="#FFFFFFFF"
+            android:pathData="M9.9,11.6H7v-1.1H2.1v2.8c0,0.8,0.6,1.4,1.4,1.4h9.9c0.8,0,1.4,-0.6,1.4,-1.4v-2.8H9.9V11.6z"/>
+        <path
+            android:fillColor="#FFFFFFFF"
+            android:pathData="M14.1,4.2h-2.5V3.2l-1.1,-1.1H6.3L5.3,3.2v1H2.8C2,4.2,1.4,4.9,1.4,5.6v2.8c0,0.8,0.6,1.4,1.4,1.4H7V8.8h2.8v1.1h4.2     c0.8,0,1.4,-0.6,1.4,-1.4V5.6C15.5,4.9,14.8,4.2,14.1,4.2z M10.6,4.2H6.3V3.2h4.2V4.2z"/>
+    </group>
+</vector>
diff --git a/apps/CtsVerifier/res/layout/ca_main.xml b/apps/CtsVerifier/res/layout/ca_main.xml
deleted file mode 100644
index 274430d..0000000
--- a/apps/CtsVerifier/res/layout/ca_main.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <LinearLayout app:layout_box="all"
-      android:orientation="vertical" android:layout_width="fill_parent"
-      android:layout_height="fill_parent">
-
-
-      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:orientation="horizontal" android:layout_width="fill_parent"
-        android:layout_height="wrap_content">
-        <!--Button android:id="@+id/focusmodesbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_focus_modes_label"
-          android:layout_weight="1" /-->
-        <Button android:id="@+id/findcheckerboardbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_find_checkerboard_label"
-          android:layout_weight="1" />
-
-        <Button android:id="@+id/meteringbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_metering_label"
-          android:layout_weight="1" />
-
-        <Button android:id="@+id/exposurecompensationbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_exposure_test_label"
-          android:layout_weight="1"/>
-
-        <Button android:id="@+id/whitebalancebutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_wb_test_label"
-          android:layout_weight="1" />
-
-        <Button android:id="@+id/lockbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_lock_test_label"
-          android:layout_weight="1" />
-      </LinearLayout>
-
-      <LinearLayout android:orientation="horizontal"
-        android:layout_width="fill_parent" android:layout_height="0px"
-        android:layout_weight="1">
-
-        <SurfaceView android:id="@+id/cameraview" android:layout_height="fill_parent"
-          android:layout_width="wrap_content"
-          android:layout_weight="0" />
-
-        <LinearLayout android:orientation="vertical"
-          android:layout_width="fill_parent" android:layout_height="match_parent"
-          android:layout_weight="1">
-
-           <ListView android:id="@+id/ca_tests"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:layout_marginLeft="10px"/>
-
-          <ImageView android:id="@+id/resultview" android:layout_height="wrap_content"
-            android:layout_width="fill_parent"
-            android:layout_weight="1" />
-        </LinearLayout>
-
-      </LinearLayout>
-
-      <include layout="@layout/pass_fail_buttons" />
-
-    </LinearLayout>
-</android.support.wearable.view.BoxInsetLayout>
diff --git a/apps/CtsVerifier/res/layout/cam_preview_overlay.xml b/apps/CtsVerifier/res/layout/cam_preview_overlay.xml
new file mode 100644
index 0000000..41bbeb1
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/cam_preview_overlay.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical" android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:keepScreenOn="true">
+    <view
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        class="com.android.cts.verifier.sensors.RVCVCameraPreview"
+        android:id="@+id/cam_preview"
+        android:layout_centerVertical="true"
+        android:layout_centerHorizontal="true" />
+
+    <!--
+    <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_centerVertical="true"
+        android:id="@+id/cam_overlay"
+        android:src="@drawable/icon"
+        android:scaleType="fitStart"
+        />
+    -->
+    <view
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        class="com.android.cts.verifier.sensors.MotionIndicatorView"
+        android:id="@+id/cam_indicator"
+        android:layout_centerVertical="true"
+        android:layout_centerHorizontal="true" />
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        android:id="@+id/cam_overlay"
+        android:scaleType="fitStart"
+        />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/hifi_ultrasound.xml b/apps/CtsVerifier/res/layout/hifi_ultrasound.xml
new file mode 100644
index 0000000..7d2de5a
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/hifi_ultrasound.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+  <TextView
+      android:layout_width="match_parent"
+      android:layout_height="0dp"
+      android:layout_weight="7"
+      android:scrollbars="vertical"
+      android:gravity="bottom"
+      android:id="@+id/info_text"/>
+
+  <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="0dp"
+      android:layout_weight="3"
+      android:orientation="horizontal">
+    <Button
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="5"
+        android:text="@string/hifi_ultrasound_test_record"
+        android:id="@+id/recorder_button"/>
+    <Button
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="5"
+        android:text="@string/hifi_ultrasound_test_play"
+        android:id="@+id/player_button"/>
+  </LinearLayout>
+
+  <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/hifi_ultrasound_popup.xml b/apps/CtsVerifier/res/layout/hifi_ultrasound_popup.xml
new file mode 100644
index 0000000..afff2c9
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/hifi_ultrasound_popup.xml
@@ -0,0 +1,33 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:background="@android:color/white"
+              android:gravity="center"
+              android:orientation="vertical" >
+
+    <com.androidplot.xy.XYPlot
+        android:id="@+id/responseChart"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="9"
+        androidPlot.domainLabel="kHz"
+        androidPlot.rangeLabel="dB"
+        androidPlot.domainLabelWidget.labelPaint.textSize="16dp"
+        androidPlot.rangeLabelWidget.labelPaint.textSize="16dp"
+        androidPlot.graphWidget.rangeLabelPaint.textSize="16dp"
+        androidPlot.graphWidget.rangeOriginLabelPaint.textSize="16dp"
+        androidPlot.graphWidget.domainLabelPaint.textSize="16dp"
+        androidPlot.graphWidget.domainOriginLabelPaint.textSize="16dp"
+        androidPlot.legendWidget.textPaint.textSize="16dp"
+        androidPlot.legendWidget.iconSizeMetrics.heightMetric.value="16dp"
+        androidPlot.legendWidget.iconSizeMetrics.widthMetric.value="16dp"
+        androidPlot.legendWidget.heightMetric.value="16dp"
+        androidPlot.graphWidget.gridLinePaint.color="#000000" />
+
+    <Button
+        android:id="@+id/dismiss"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:text="@string/hifi_ultrasound_test_dismiss" />
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/raw/next_axis.mp3 b/apps/CtsVerifier/res/raw/next_axis.mp3
new file mode 100644
index 0000000..0a3174d
--- /dev/null
+++ b/apps/CtsVerifier/res/raw/next_axis.mp3
Binary files differ
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 70656bf..675188a 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -286,6 +286,48 @@
 
     <string name="empty"></string>
 
+    <!-- Strings for HifiUltrasoundTestActivity -->
+    <string name="hifi_ultrasound_test">Hifi Ultrasound Test (microphone)</string>
+    <string name="hifi_ultrasound_test_info">
+        This is a test for microphone near-ultrasound (18500Hz - 20000Hz) response.\n
+        This test requires two devices.\n</string>
+    <string name="hifi_ultrasound_test_play">PLAY</string>
+    <string name="hifi_ultrasound_test_record">RECORD</string>
+    <string name="hifi_ultrasound_test_plot">PLOT</string>
+    <string name="hifi_ultrasound_test_dismiss">DISMISS</string>
+    <string name="hifi_ultrasound_test_instruction1">
+        Set the volume of the reference device at 70% and hold it with one hand.\n
+        Hold the testing device with the other hand\n
+        Press the RECORD button on the testing device, then the PLAY button on the reference device within one second.\n
+        After the test, report result on the testing device.\n</string>
+    <string name="hifi_ultrasound_test_pass">PASS</string>
+    <string name="hifi_ultrasound_test_fail">FAIL</string>
+    <string name="hifi_ultrasound_test_default_false_string">false</string>
+    <string name="hifi_ultrasound_test_mic_prop">persist.audio.mic.ultrasound</string>
+    <string name="hifi_ultrasound_test_spkr_prop">persist.audio.spkr.ultrasound</string>
+    <string name="hifi_ultrasound_test_mic_no_support">
+        Device does not support near-ultrasound recording.\n
+        Please click pass if this is the testing device.\n</string>
+    <string name="hifi_ultrasound_test_spkr_no_support">
+        Device does not support near-ultrasound playback.\n
+        If this is your reference device, please use a different reference device.\n</string>
+
+    <string name="hifi_ultrasound_speaker_test">Hifi Ultrasound Test (speaker)</string>
+    <string name="hifi_ultrasound_speaker_test_info">
+        This is a test for speaker near-ultrasound (18500Hz - 20000Hz) response.\n
+        This test requires two devices.\n</string>
+    <string name="hifi_ultrasound_speaker_test_instruction1">
+        Set the volume of the testing device at 70% and hold it with one hand.\n
+        Hold the reference device with the other hand\n
+        Press the RECORD button on the reference device, then the PLAY button on the testing device within one second.\n
+        After the test, report result on the testing device.\n</string>
+    <string name="hifi_ultrasound_speaker_test_mic_no_support">
+        Device does not support near-ultrasound recording.\n
+        If this is your reference device, please use a different reference device.\n</string>
+    <string name="hifi_ultrasound_speaker_test_spkr_no_support">
+        Device does not support near-ultrasound playback.\n
+        Please click pass if this is the testing device.\n</string>
+
     <!-- Strings for Location tests -->
     <string name="location_gps_test">GPS Test</string>
     <string name="location_gps_test_info">This test verifies basic GPS behavior
@@ -484,6 +526,8 @@
     <string name="snsr_test_skipped">SKIPPED</string>
     <string name="snsr_test_fail">FAIL</string>
     <string name="snsr_execution_time">Test execution time %1$s sec</string>
+    <string name="snsr_rvcvxchk_test">Rotation Vector CV XCheck</string>
+    <string name="snsr_rvcvxchk_test_rec">Rotation Vector CV XCheck Recording</string>
 
     <!-- Strings to interact with users in Sensor Tests -->
     <string name="snsr_test_play_sound">A sound will be played once the verification is complete...</string>
@@ -624,18 +668,6 @@
     <string name="congratulations">Congratulations!</string>
     <string name="no_suid_files">No unauthorized suid files detected!</string>
 
-    <!-- Strings for Camera Analyzer -->
-    <string name="camera_analyzer">Camera Analyzer</string>
-    <string name="ca_find_checkerboard_label">Find target</string>
-    <string name="ca_check_formats_label">Output formats</string>
-    <string name="ca_exposure_test_label">Exposure Comp.</string>
-    <string name="ca_result_label">Results will be here</string>
-    <string name="ca_wb_test_label">White Balance</string>
-    <string name="ca_lock_test_label">AE Lock</string>
-    <string name="ca_metering_label">Metering Area</string>
-    <string name="ca_focus_modes_label">Focus Modes</string>
-    <string name="ca_info">This test checks the image quality of the camera of this device. It requires a MacBeth 4x6 color checker. With an ADK board and a lamp connected to it on the Relay 1 port, all tests can be run automatically. Without the ADK board, all the tests except the Auto Exposure Lock Test can be run automatically and the Auto Exposure Lock Test will require users to turn on/off a lamp according to the instruction given. </string>
-
     <!-- Strings for Camera Orientation -->
     <string name="camera_orientation">Camera Orientation</string>
     <string name="co_info">This test verifies the orientation capabilities of
@@ -1329,6 +1361,32 @@
         Verify that the notification is badged (see sample badge below). Then mark this test accordingly.
     </string>
     <string name="provisioning_byod_work_notification_title">This is a work notification</string>
+    <string name="provisioning_byod_work_status_icon">Work status icon is displayed</string>
+    <string name="provisioning_byod_work_status_icon_instruction">
+        Verify that the current status bar does not have a work status icon (see sample icon below).
+        \n\n
+        Please press the Go button to launch a work activity.
+        \n\n
+        Verify that the status bar now has a work status icon. Then mark this test accordingly.
+    </string>
+    <string name="provisioning_byod_work_status_icon_activity">
+        Verify that the current status bar has a work status notification.
+        \n\n
+        Please press finish to return to the tests and then mark this test accordingly.
+    </string>
+    <string name="provisioning_byod_work_status_toast">Work status toast is displayed</string>
+    <string name="provisioning_byod_work_status_toast_instruction">
+        Please press the Go button to launch a work activity.
+        \n\n
+        Follow instructions and then return and mark this test accordingly.
+    </string>
+    <string name="provisioning_byod_work_status_toast_activity">
+        Turn off the screen and wait a few seconds then turn on the screen again.
+        \n\n
+        Verify that a toast was displayed saying you are in the work profile.
+        \n\n
+        Please press finish to return to the tests and then mark this test accordingly.
+    </string>
     <string name="provisioning_byod_profile_visible_instruction">
         Please press the Go button to open the Settings page.
         Navigate to Accounts and confirm that:\n
@@ -1397,6 +1455,7 @@
         Then use the Back button to return to this test and mark accordingly.
     </string>
 
+    <string name="provisioning_byod_cross_profile_intent_filters">Cross profile intent filters are set</string>
     <string name="provisioning_byod_no_activity">Cannot communicate with activity in the work profile.</string>
     <string name="provisioning_byod_delete_profile">Initiate deletion of work profile.</string>
     <string name="provisioning_byod_profile_deleted">Work profile deleted.</string>
diff --git a/apps/CtsVerifier/res/xml/ultrasound_line_formatter_median.xml b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_median.xml
new file mode 100644
index 0000000..9c6de77
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_median.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config
+        linePaint.strokeWidth="3dp"
+        linePaint.color="#AA0000"
+        vertexPaint.color="#770000"
+        fillPaint.color="#00000000" />
diff --git a/apps/CtsVerifier/res/xml/ultrasound_line_formatter_noise.xml b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_noise.xml
new file mode 100644
index 0000000..8fb236e
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_noise.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config
+        linePaint.strokeWidth="2dp"
+        linePaint.color="#777777"
+        vertexPaint.color="777777"
+        fillPaint.color="#00000000" />
diff --git a/apps/CtsVerifier/res/xml/ultrasound_line_formatter_pass.xml b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_pass.xml
new file mode 100644
index 0000000..9a6c29a
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_pass.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config
+        linePaint.strokeWidth="2dp"
+        linePaint.color="#007700"
+        vertexPaint.color="#007700"
+        fillPaint.color="#00000000" />
diff --git a/apps/CtsVerifier/res/xml/ultrasound_line_formatter_trials.xml b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_trials.xml
new file mode 100644
index 0000000..3f9ffc2
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_trials.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config
+        linePaint.strokeWidth="1dp"
+        linePaint.color="#AAAAAA"
+        vertexPaint.color="#777777"
+        fillPaint.color="#00000000" />
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
index dc2502c..05c5e77 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
@@ -96,6 +96,7 @@
         xml.startTag(null, VERIFIER_INFO_TAG);
         xml.attribute(null, "version-name", Version.getVersionName(mContext));
         xml.attribute(null, "version-code", Integer.toString(Version.getVersionCode(mContext)));
+        xml.attribute(null, "build", Version.getBuildNumber(mContext));
         xml.endTag(null, VERIFIER_INFO_TAG);
 
         xml.startTag(null, DEVICE_INFO_TAG);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/Version.java b/apps/CtsVerifier/src/com/android/cts/verifier/Version.java
index e7b6121..dfe9508 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/Version.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/Version.java
@@ -24,13 +24,21 @@
 class Version {
 
     static String getVersionName(Context context) {
-        return getPackageInfo(context).versionName;
+        return getVersionNameStrings(context)[0];
     }
 
     static int getVersionCode(Context context) {
         return getPackageInfo(context).versionCode;
     }
 
+    static String getBuildNumber(Context context) {
+        return getVersionNameStrings(context)[1];
+    }
+
+    static private String[] getVersionNameStrings(Context context) {
+        return getPackageInfo(context).versionName.split(" ");
+    }
+
     static PackageInfo getPackageInfo(Context context) {
         try {
             PackageManager packageManager = context.getPackageManager();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRecordHelper.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRecordHelper.java
new file mode 100644
index 0000000..80dd250
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRecordHelper.java
@@ -0,0 +1,144 @@
+package com.android.cts.verifier.audio;
+
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+import android.media.AudioTrack;
+import android.media.MediaRecorder;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * A wrapper on AudioRecord class.
+ */
+public class AudioRecordHelper {
+
+  private static final int[] SOURCE = {
+      MediaRecorder.AudioSource.MIC, MediaRecorder.AudioSource.VOICE_RECOGNITION};
+  private static final int[] SAMPLE_RATES_HZ = {
+    AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC), 48000, 44100};
+
+  private static final int CHANNEL = AudioFormat.CHANNEL_CONFIGURATION_MONO;
+  private static final int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
+  private static final String TAG = "AudioRecordHelper";
+  private static AudioRecordHelper instance;
+  private final int bufferSize;
+  private final int sampleRate;
+  private final int source;
+  private ByteArrayOutputStream os;
+  private AudioRecord audioRecord;
+  private volatile boolean isRecording = false;
+
+  private AudioRecordHelper() {
+    int tmpBufferSize = 0;
+    int tmpSampleRate = 0;
+    int tmpSource = 0;
+    initialization:
+    for (int source : SOURCE) {
+      for (int rate : SAMPLE_RATES_HZ) {
+        tmpBufferSize = AudioRecord.getMinBufferSize(rate, CHANNEL, ENCODING);
+        AudioRecord testAudioRecord = new AudioRecord(source, rate, CHANNEL, ENCODING,
+            tmpBufferSize);
+        if (testAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
+          testAudioRecord.release();
+          tmpSampleRate = rate;
+          tmpSource = source;
+          break initialization;
+        }
+      }
+    }
+    if (tmpBufferSize == 0 || tmpSampleRate == 0) {
+      Log.e(TAG, "Failed to initialize");
+    }
+    bufferSize = tmpBufferSize;
+    sampleRate = tmpSampleRate;
+    source = tmpSource;
+    Log.d(TAG, "Sample rate = " + sampleRate + "Hz, Source = "
+        + source + " (VOICE_RECOGNITION = 6 , MIC = 1)");
+  }
+
+  public static AudioRecordHelper getInstance() {
+    if (instance == null) {
+      instance = new AudioRecordHelper();
+    }
+    return instance;
+  }
+
+  /**
+   * Start recording.
+   */
+  public void start() {
+    if (!isRecording) {
+      isRecording = true;
+      os = new ByteArrayOutputStream();
+      audioRecord = new AudioRecord(source, sampleRate, CHANNEL, ENCODING, bufferSize);
+      audioRecord.startRecording();
+      startPullingData();
+    }
+  }
+
+  /**
+   * Stop recording
+   */
+  public void stop() {
+    if (isRecording) {
+      isRecording = false;
+      audioRecord.stop();
+      audioRecord.release();
+      audioRecord = null;
+      try {
+        os.close();
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  private void startPullingData() {
+    new Thread() {
+      @Override
+      public void run(){
+        byte data[] = new byte[bufferSize];
+        while (isRecording) {
+          int read = audioRecord.read(data, 0, bufferSize);
+          if (read > 0) {
+            os.write(data, 0, read);
+          }
+          if (read < 0) {
+            break;
+          }
+        }
+      }
+    }.start();
+  }
+
+  /**
+   * Returns the sample rate for this recorder.
+   */
+  public int getSampleRate() {
+    return sampleRate;
+  }
+
+  /**
+   * Returns the audio source currently being used.
+   */
+  public int getAudioSource() {
+    return source;
+  }
+
+  /**
+   * Returns true if recorder is recording; False if not.
+   */
+  public boolean isRecording() {
+    return isRecording;
+  }
+
+  /**
+   * Returns the raw data.
+   */
+  public byte[] getByte() {
+    return os.toByteArray();
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/Common.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Common.java
new file mode 100644
index 0000000..df7460a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Common.java
@@ -0,0 +1,142 @@
+package com.android.cts.verifier.audio;
+
+import android.media.AudioManager;
+import android.media.AudioTrack;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+/**
+ * This class stores common constants and methods.
+ */
+public class Common {
+
+  public static final int RECORDING_SAMPLE_RATE_HZ
+      = AudioRecordHelper.getInstance().getSampleRate();
+  public static final int PLAYING_SAMPLE_RATE_HZ
+      = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
+
+  // Default constants.
+  public static final double PASSING_THRESHOLD_DB = -40.0;
+  public static final double PIP_DURATION_S = 0.004;
+  public static final double PAUSE_DURATION_S = 0.016;
+  public static final int PREFIX_NUM_CHIPS = 1023;
+  public static final int PREFIX_SAMPLES_PER_CHIP = 4;
+  public static final double PREFIX_LENGTH_S = 0.1;
+  public static final double PAUSE_BEFORE_PREFIX_DURATION_S = 0.5;
+  public static final double PAUSE_AFTER_PREFIX_DURATION_S = 0.4;
+  public static final double MIN_FREQUENCY_HZ = 500;
+  public static final double MAX_FREQUENCY_HZ = 21000;
+  public static final double FREQUENCY_STEP_HZ = 100;
+  public static final int SIGNAL_MIN_STRENGTH_DB_ABOVE_NOISE = 10;
+  public static final int REPETITIONS = 5;
+  public static final int NOISE_SAMPLES = 3;
+
+  public static final double[] FREQUENCIES_ORIGINAL = originalFrequencies();
+  public static final int PIP_NUM = FREQUENCIES_ORIGINAL.length;
+  public static final int[] ORDER = order();
+  public static final double[] FREQUENCIES = frequencies();
+
+  public static final double[] WINDOW_FOR_RECORDER =
+      hann(Util.toLength(PIP_DURATION_S, RECORDING_SAMPLE_RATE_HZ));
+  public static final double[] WINDOW_FOR_PLAYER =
+      hann(Util.toLength(PIP_DURATION_S, PLAYING_SAMPLE_RATE_HZ));
+
+  public static final double[] PREFIX_FOR_RECORDER = prefix(RECORDING_SAMPLE_RATE_HZ);
+  public static final double[] PREFIX_FOR_PLAYER = prefix(PLAYING_SAMPLE_RATE_HZ);
+
+  /**
+   * Get a Hann window.
+   */
+  private static double[] hann(int windowWidth) {
+    double[] envelopeArray = new double[windowWidth];
+    for (int i = 0; i < windowWidth; i++) {
+      envelopeArray[i] = 0.5
+          * (1 - Math.cos(2 * Math.PI * i / windowWidth));
+    }
+    return envelopeArray;
+  }
+
+  /**
+   * Get a maximum length sequence, used as prefix to indicate start of signal.
+   */
+  private static double[] prefix(int rate) {
+    double[] codeSequence = new double[PREFIX_NUM_CHIPS];
+    for (int i = 0; i < PREFIX_NUM_CHIPS; i++) {
+      if (i < 10) {
+        codeSequence[i] = 1;
+      } else {
+        codeSequence[i] = -codeSequence[i - 6] * codeSequence[i - 7]
+            * codeSequence[i - 9] * codeSequence[i - 10];
+      }
+    }
+    double[] prefixArray = new double[PREFIX_NUM_CHIPS * PREFIX_SAMPLES_PER_CHIP];
+    int offset = 0;
+    for (int i = 0; i < PREFIX_NUM_CHIPS; i++) {
+      double value = codeSequence[i];
+      for (int j = 0; j < PREFIX_SAMPLES_PER_CHIP; j++) {
+        prefixArray[offset + j] = value;
+      }
+      offset += PREFIX_SAMPLES_PER_CHIP;
+    }
+    int prefixLength = (int) Math.round(PREFIX_LENGTH_S * rate);
+    double[] samplePrefixArray = new double[prefixLength];
+    for (int i = 0; i < prefixLength; i++) {
+      double index = (double) i / prefixLength * (prefixArray.length - 1);
+      samplePrefixArray[i] = (1 - index + Math.floor(index)) * prefixArray[(int) Math.floor(index)]
+          + (1 + index - Math.ceil(index)) * prefixArray[(int) Math.ceil(index)];
+    }
+    return samplePrefixArray;
+  }
+
+  /**
+   * Returns array consists the frequencies of the test pips in the order that will be used in test.
+   */
+  private static double[] frequencies() {
+    double[] originalFrequencies = originalFrequencies();
+
+    double[] randomFrequencies = new double[Common.REPETITIONS * originalFrequencies.length];
+    for (int i = 0; i < REPETITIONS * originalFrequencies.length; i++) {
+      randomFrequencies[i] = originalFrequencies[ORDER[i] % originalFrequencies.length];
+    }
+
+    return randomFrequencies;
+  }
+
+  /**
+   * Returns array consists the frequencies of the test pips.
+   */
+  private static double[] originalFrequencies() {
+    ArrayList<Double> frequencies = new ArrayList<Double>();
+    double frequency = Common.MIN_FREQUENCY_HZ;
+    while (frequency <= Common.MAX_FREQUENCY_HZ) {
+      frequencies.add(new Double(frequency));
+      if ((frequency >= 18500) && (frequency < 20000)) {
+        frequency += Common.FREQUENCY_STEP_HZ;
+      } else {
+        frequency += Common.FREQUENCY_STEP_HZ * 10;
+      }
+    }
+    Double[] frequenciesArray = frequencies.toArray(new Double[frequencies.size()]);
+    double[] frequenciesPrimitiveArray = new double[frequenciesArray.length];
+    for (int i = 0; i < frequenciesArray.length; i++) {
+      frequenciesPrimitiveArray[i] = frequenciesArray[i];
+    }
+    return frequenciesPrimitiveArray;
+  }
+
+  /**
+   * Fisher-Yates shuffle.
+   */
+  private static int[] order() {
+    int[] order = new int[REPETITIONS * PIP_NUM];
+    long seed = 0;
+    Random generator = new Random(seed);
+    for (int i = 0; i < REPETITIONS * PIP_NUM; i++) {
+      int j = generator.nextInt(i + 1);
+      order[i] = order[j];
+      order[j] = i;
+    }
+    return order;
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundSpeakerTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundSpeakerTestActivity.java
new file mode 100644
index 0000000..fa5ad81
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundSpeakerTestActivity.java
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+import java.util.Arrays;
+
+import com.androidplot.xy.SimpleXYSeries;
+import com.androidplot.xy.XYSeries;
+import com.androidplot.xy.*;
+
+public class HifiUltrasoundSpeakerTestActivity extends PassFailButtons.Activity {
+
+    public enum Status {
+        START, RECORDING, DONE, PLAYER
+    }
+
+    private static final String TAG = "HifiUltrasoundTestActivity";
+
+    private Status status = Status.START;
+    private boolean onPlotScreen = false;
+    private TextView info;
+    private Button playerButton;
+    private Button recorderButton;
+    private AudioTrack audioTrack;
+    private LayoutInflater layoutInflater;
+    private View popupView;
+    private PopupWindow popupWindow;
+    private boolean micSupport = true;
+    private boolean spkrSupport = true;
+
+    @Override
+    public void onBackPressed () {
+        if (onPlotScreen) {
+            popupWindow.dismiss();
+            onPlotScreen = false;
+            recorderButton.setEnabled(true);
+        } else {
+            super.onBackPressed();
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.hifi_ultrasound);
+        setInfoResources(R.string.hifi_ultrasound_speaker_test,
+            R.string.hifi_ultrasound_speaker_test_info, -1);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+
+        info = (TextView) findViewById(R.id.info_text);
+        info.setMovementMethod(new ScrollingMovementMethod());
+        info.setText(R.string.hifi_ultrasound_speaker_test_instruction1);
+
+        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        String micSupportString = audioManager.getProperty(
+            getResources().getString(R.string.hifi_ultrasound_test_mic_prop));
+        String spkrSupportString = audioManager.getProperty(
+            getResources().getString(R.string.hifi_ultrasound_test_spkr_prop));
+
+        if (micSupportString == null) {
+          micSupportString = "null";
+        }
+        if (spkrSupportString == null) {
+          spkrSupportString = "null";
+        }
+        if (micSupportString.equalsIgnoreCase(getResources().getString(
+            R.string.hifi_ultrasound_test_default_false_string))) {
+          micSupport = false;
+          getPassButton().setEnabled(true);
+          info.append(getResources().getString(R.string.hifi_ultrasound_speaker_test_mic_no_support));
+        }
+        if (spkrSupportString.equalsIgnoreCase(getResources().getString(
+            R.string.hifi_ultrasound_test_default_false_string))) {
+          spkrSupport = false;
+          info.append(getResources().getString(R.string.hifi_ultrasound_speaker_test_spkr_no_support));
+        }
+
+        layoutInflater = (LayoutInflater) getBaseContext().getSystemService(
+            LAYOUT_INFLATER_SERVICE);
+        popupView = layoutInflater.inflate(R.layout.hifi_ultrasound_popup, null);
+        popupWindow = new PopupWindow(
+            popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+
+        final AudioRecordHelper audioRecorder = AudioRecordHelper.getInstance();
+        final int recordRate = audioRecorder.getSampleRate();
+
+        recorderButton = (Button) findViewById(R.id.recorder_button);
+        recorderButton.setEnabled(micSupport);
+        recorderButton.setOnClickListener(new View.OnClickListener() {
+          private WavAnalyzerTask wavAnalyzerTask = null;
+          private void stopRecording() {
+            audioRecorder.stop();
+            wavAnalyzerTask = new WavAnalyzerTask(audioRecorder.getByte());
+            wavAnalyzerTask.execute();
+            status = Status.DONE;
+          }
+          @Override
+          public void onClick(View v) {
+            switch (status) {
+              case START:
+                info.append("Recording at " + recordRate + "Hz using ");
+                final int source = audioRecorder.getAudioSource();
+                switch (source) {
+                  case 1:
+                    info.append("MIC");
+                    break;
+                  case 6:
+                    info.append("VOICE_RECOGNITION");
+                    break;
+                  default:
+                    info.append("UNEXPECTED " + source);
+                    break;
+                }
+                info.append("\n");
+                status = Status.RECORDING;
+                playerButton.setEnabled(false);
+                recorderButton.setEnabled(false);
+                audioRecorder.start();
+
+                final View finalV = v;
+                new Thread() {
+                  @Override
+                  public void run() {
+                    Double recordingDuration_millis = new Double(1000 * (2.5
+                          + Common.PREFIX_LENGTH_S
+                          + Common.PAUSE_BEFORE_PREFIX_DURATION_S
+                          + Common.PAUSE_AFTER_PREFIX_DURATION_S
+                          + Common.PIP_NUM * (Common.PIP_DURATION_S + Common.PAUSE_DURATION_S)
+                          * Common.REPETITIONS));
+                    Log.d(TAG, "Recording for " + recordingDuration_millis + "ms");
+                    try {
+                      Thread.sleep(recordingDuration_millis.intValue());
+                    } catch (InterruptedException e) {
+                      throw new RuntimeException(e);
+                    }
+                    runOnUiThread(new Runnable() {
+                      @Override
+                      public void run() {
+                        stopRecording();
+                      }
+                    });
+                  }
+                }.start();
+
+                break;
+
+              case DONE:
+                plotResponse(wavAnalyzerTask);
+                break;
+
+              default: break;
+            }
+          }
+        });
+
+        playerButton = (Button) findViewById(R.id.player_button);
+        playerButton.setEnabled(spkrSupport);
+        playerButton.setOnClickListener(new View.OnClickListener() {
+          @Override
+          public void onClick(View v) {
+              recorderButton.setEnabled(false);
+              status = Status.PLAYER;
+              play();
+              getPassButton().setEnabled(true);
+          }
+        });
+    }
+
+
+    private void plotResponse(WavAnalyzerTask wavAnalyzerTask) {
+      Button dismissButton = (Button)popupView.findViewById(R.id.dismiss);
+      dismissButton.setOnClickListener(new Button.OnClickListener(){
+        @Override
+        public void onClick(View v) {
+          popupWindow.dismiss();
+          onPlotScreen = false;
+          recorderButton.setEnabled(true);
+        }});
+      popupWindow.showAtLocation(info, Gravity.CENTER, 0, 0);
+      onPlotScreen = true;
+
+      recorderButton.setEnabled(false);
+
+      XYPlot plot = (XYPlot) popupView.findViewById(R.id.responseChart);
+      plot.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 2000);
+
+      Double[] frequencies = new Double[Common.PIP_NUM];
+      for (int i = 0; i < Common.PIP_NUM; i++) {
+        frequencies[i] = new Double(Common.FREQUENCIES_ORIGINAL[i]);
+      }
+
+      if (wavAnalyzerTask != null) {
+
+        double[][] power = wavAnalyzerTask.getPower();
+        for(int i = 0; i < Common.REPETITIONS; i++) {
+          Double[] powerWrap = new Double[Common.PIP_NUM];
+          for (int j = 0; j < Common.PIP_NUM; j++) {
+            powerWrap[j] = new Double(10 * Math.log10(power[j][i]));
+          }
+          XYSeries series = new SimpleXYSeries(
+              Arrays.asList(frequencies),
+              Arrays.asList(powerWrap),
+              "");
+          LineAndPointFormatter seriesFormat = new LineAndPointFormatter();
+          seriesFormat.configure(getApplicationContext(),
+              R.xml.ultrasound_line_formatter_trials);
+          seriesFormat.setPointLabelFormatter(null);
+          plot.addSeries(series, seriesFormat);
+        }
+
+        double[] noiseDB = wavAnalyzerTask.getNoiseDB();
+        Double[] noiseDBWrap = new Double[Common.PIP_NUM];
+        for (int i = 0; i < Common.PIP_NUM; i++) {
+          noiseDBWrap[i] = new Double(noiseDB[i]);
+        }
+
+        XYSeries noiseSeries = new SimpleXYSeries(
+            Arrays.asList(frequencies),
+            Arrays.asList(noiseDBWrap),
+            "background noise");
+        LineAndPointFormatter noiseSeriesFormat = new LineAndPointFormatter();
+        noiseSeriesFormat.configure(getApplicationContext(),
+            R.xml.ultrasound_line_formatter_noise);
+        noiseSeriesFormat.setPointLabelFormatter(null);
+        plot.addSeries(noiseSeries, noiseSeriesFormat);
+
+        double[] dB = wavAnalyzerTask.getDB();
+        Double[] dBWrap = new Double[Common.PIP_NUM];
+        for (int i = 0; i < Common.PIP_NUM; i++) {
+          dBWrap[i] = new Double(dB[i]);
+        }
+
+        XYSeries series = new SimpleXYSeries(
+            Arrays.asList(frequencies),
+            Arrays.asList(dBWrap),
+            "median");
+        LineAndPointFormatter seriesFormat = new LineAndPointFormatter();
+        seriesFormat.configure(getApplicationContext(),
+            R.xml.ultrasound_line_formatter_median);
+        seriesFormat.setPointLabelFormatter(null);
+        plot.addSeries(series, seriesFormat);
+
+        Double[] passX = new Double[] {Common.MIN_FREQUENCY_HZ, Common.MAX_FREQUENCY_HZ};
+        Double[] passY = new Double[] {wavAnalyzerTask.getThreshold(), wavAnalyzerTask.getThreshold()};
+        XYSeries passSeries = new SimpleXYSeries(
+            Arrays.asList(passX), Arrays.asList(passY), "passing");
+        LineAndPointFormatter passSeriesFormat = new LineAndPointFormatter();
+        passSeriesFormat.configure(getApplicationContext(),
+            R.xml.ultrasound_line_formatter_pass);
+        passSeriesFormat.setPointLabelFormatter(null);
+        plot.addSeries(passSeries, passSeriesFormat);
+      }
+    }
+
+    /**
+     * Plays the generated pips.
+     */
+    private void play() {
+      play(SoundGenerator.getInstance().getByte(), Common.PLAYING_SAMPLE_RATE_HZ);
+    }
+
+    /**
+     * Plays the sound data.
+     */
+    private void play(byte[] data, int sampleRate) {
+      if (audioTrack != null) {
+        audioTrack.stop();
+        audioTrack.release();
+      }
+      audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
+          sampleRate, AudioFormat.CHANNEL_OUT_MONO,
+          AudioFormat.ENCODING_PCM_16BIT, Math.max(data.length, AudioTrack.getMinBufferSize(
+          sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT)),
+          AudioTrack.MODE_STATIC);
+      audioTrack.write(data, 0, data.length);
+      audioTrack.play();
+    }
+
+  /**
+   * AsyncTask class for the analyzing.
+   */
+  private class WavAnalyzerTask extends AsyncTask<Void, String, String>
+      implements WavAnalyzer.Listener {
+
+    private static final String TAG = "WavAnalyzerTask";
+    WavAnalyzer wavAnalyzer;
+
+    public WavAnalyzerTask(byte[] recording) {
+      wavAnalyzer = new WavAnalyzer(recording, Common.RECORDING_SAMPLE_RATE_HZ,
+          WavAnalyzerTask.this);
+    }
+
+    double[] getDB() {
+      return wavAnalyzer.getDB();
+    }
+
+    double[][] getPower() {
+      return wavAnalyzer.getPower();
+    }
+
+    double[] getNoiseDB() {
+      return wavAnalyzer.getNoiseDB();
+    }
+
+    double getThreshold() {
+      return wavAnalyzer.getThreshold();
+    }
+
+    @Override
+    protected String doInBackground(Void... params) {
+      boolean result = wavAnalyzer.doWork();
+      if (result) {
+        return getString(R.string.hifi_ultrasound_test_pass);
+      }
+      return getString(R.string.hifi_ultrasound_test_fail);
+    }
+
+    @Override
+    protected void onPostExecute(String result) {
+      info.append(result);
+      recorderButton.setEnabled(true);
+      recorderButton.setText(R.string.hifi_ultrasound_test_plot);
+    }
+
+    @Override
+    protected void onProgressUpdate(String... values) {
+      for (String message : values) {
+        info.append(message);
+        Log.d(TAG, message);
+      }
+    }
+
+    @Override
+    public void sendMessage(String message) {
+      publishProgress(message);
+    }
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundTestActivity.java
new file mode 100644
index 0000000..690e109
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundTestActivity.java
@@ -0,0 +1,373 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+import java.util.Arrays;
+
+import com.androidplot.xy.SimpleXYSeries;
+import com.androidplot.xy.XYSeries;
+import com.androidplot.xy.*;
+
+public class HifiUltrasoundTestActivity extends PassFailButtons.Activity {
+
+    public enum Status {
+        START, RECORDING, DONE, PLAYER
+    }
+
+    private static final String TAG = "HifiUltrasoundTestActivity";
+
+    private Status status = Status.START;
+    private boolean onPlotScreen = false;
+    private TextView info;
+    private Button playerButton;
+    private Button recorderButton;
+    private AudioTrack audioTrack;
+    private LayoutInflater layoutInflater;
+    private View popupView;
+    private PopupWindow popupWindow;
+    private boolean micSupport = true;
+    private boolean spkrSupport = true;
+
+    @Override
+    public void onBackPressed () {
+        if (onPlotScreen) {
+            popupWindow.dismiss();
+            onPlotScreen = false;
+            recorderButton.setEnabled(true);
+        } else {
+            super.onBackPressed();
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.hifi_ultrasound);
+        setInfoResources(R.string.hifi_ultrasound_test, R.string.hifi_ultrasound_test_info, -1);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+
+        info = (TextView) findViewById(R.id.info_text);
+        info.setMovementMethod(new ScrollingMovementMethod());
+        info.setText(R.string.hifi_ultrasound_test_instruction1);
+
+        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        String micSupportString = audioManager.getProperty(
+            getResources().getString(R.string.hifi_ultrasound_test_mic_prop));
+        String spkrSupportString = audioManager.getProperty(
+            getResources().getString(R.string.hifi_ultrasound_test_spkr_prop));
+
+        if (micSupportString == null) {
+          micSupportString = "null";
+        }
+        if (spkrSupportString == null) {
+          spkrSupportString = "null";
+        }
+        if (micSupportString.equalsIgnoreCase(getResources().getString(
+            R.string.hifi_ultrasound_test_default_false_string))) {
+          micSupport = false;
+          getPassButton().setEnabled(true);
+          info.append(getResources().getString(R.string.hifi_ultrasound_test_mic_no_support));
+        }
+        if (spkrSupportString.equalsIgnoreCase(getResources().getString(
+            R.string.hifi_ultrasound_test_default_false_string))) {
+          spkrSupport = false;
+          info.append(getResources().getString(R.string.hifi_ultrasound_test_spkr_no_support));
+        }
+
+        layoutInflater = (LayoutInflater) getBaseContext().getSystemService(
+            LAYOUT_INFLATER_SERVICE);
+        popupView = layoutInflater.inflate(R.layout.hifi_ultrasound_popup, null);
+        popupWindow = new PopupWindow(
+            popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+
+        final AudioRecordHelper audioRecorder = AudioRecordHelper.getInstance();
+        final int recordRate = audioRecorder.getSampleRate();
+
+        recorderButton = (Button) findViewById(R.id.recorder_button);
+        recorderButton.setEnabled(micSupport);
+        recorderButton.setOnClickListener(new View.OnClickListener() {
+          private WavAnalyzerTask wavAnalyzerTask = null;
+          private void stopRecording() {
+            audioRecorder.stop();
+            wavAnalyzerTask = new WavAnalyzerTask(audioRecorder.getByte());
+            wavAnalyzerTask.execute();
+            status = Status.DONE;
+          }
+          @Override
+          public void onClick(View v) {
+            switch (status) {
+              case START:
+                info.append("Recording at " + recordRate + "Hz using ");
+                final int source = audioRecorder.getAudioSource();
+                switch (source) {
+                  case 1:
+                    info.append("MIC");
+                    break;
+                  case 6:
+                    info.append("VOICE_RECOGNITION");
+                    break;
+                  default:
+                    info.append("UNEXPECTED " + source);
+                    break;
+                }
+                info.append("\n");
+                status = Status.RECORDING;
+                playerButton.setEnabled(false);
+                recorderButton.setEnabled(false);
+                audioRecorder.start();
+
+                final View finalV = v;
+                new Thread() {
+                  @Override
+                  public void run() {
+                    Double recordingDuration_millis = new Double(1000 * (2.5
+                          + Common.PREFIX_LENGTH_S
+                          + Common.PAUSE_BEFORE_PREFIX_DURATION_S
+                          + Common.PAUSE_AFTER_PREFIX_DURATION_S
+                          + Common.PIP_NUM * (Common.PIP_DURATION_S + Common.PAUSE_DURATION_S)
+                          * Common.REPETITIONS));
+                    Log.d(TAG, "Recording for " + recordingDuration_millis + "ms");
+                    try {
+                      Thread.sleep(recordingDuration_millis.intValue());
+                    } catch (InterruptedException e) {
+                      throw new RuntimeException(e);
+                    }
+                    runOnUiThread(new Runnable() {
+                      @Override
+                      public void run() {
+                        stopRecording();
+                      }
+                    });
+                  }
+                }.start();
+
+                break;
+
+              case DONE:
+                plotResponse(wavAnalyzerTask);
+                break;
+
+              default: break;
+            }
+          }
+        });
+
+        playerButton = (Button) findViewById(R.id.player_button);
+        playerButton.setEnabled(spkrSupport);
+        playerButton.setOnClickListener(new View.OnClickListener() {
+          @Override
+          public void onClick(View v) {
+              recorderButton.setEnabled(false);
+              status = Status.PLAYER;
+              play();
+          }
+        });
+    }
+
+
+    private void plotResponse(WavAnalyzerTask wavAnalyzerTask) {
+      Button dismissButton = (Button)popupView.findViewById(R.id.dismiss);
+      dismissButton.setOnClickListener(new Button.OnClickListener(){
+        @Override
+        public void onClick(View v) {
+          popupWindow.dismiss();
+          onPlotScreen = false;
+          recorderButton.setEnabled(true);
+        }});
+      popupWindow.showAtLocation(info, Gravity.CENTER, 0, 0);
+      onPlotScreen = true;
+
+      recorderButton.setEnabled(false);
+
+      XYPlot plot = (XYPlot) popupView.findViewById(R.id.responseChart);
+      plot.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 2000);
+
+      Double[] frequencies = new Double[Common.PIP_NUM];
+      for (int i = 0; i < Common.PIP_NUM; i++) {
+        frequencies[i] = new Double(Common.FREQUENCIES_ORIGINAL[i]);
+      }
+
+      if (wavAnalyzerTask != null) {
+
+        double[][] power = wavAnalyzerTask.getPower();
+        for(int i = 0; i < Common.REPETITIONS; i++) {
+          Double[] powerWrap = new Double[Common.PIP_NUM];
+          for (int j = 0; j < Common.PIP_NUM; j++) {
+            powerWrap[j] = new Double(10 * Math.log10(power[j][i]));
+          }
+          XYSeries series = new SimpleXYSeries(
+              Arrays.asList(frequencies),
+              Arrays.asList(powerWrap),
+              "");
+          LineAndPointFormatter seriesFormat = new LineAndPointFormatter();
+          seriesFormat.configure(getApplicationContext(),
+              R.xml.ultrasound_line_formatter_trials);
+          seriesFormat.setPointLabelFormatter(null);
+          plot.addSeries(series, seriesFormat);
+        }
+
+        double[] noiseDB = wavAnalyzerTask.getNoiseDB();
+        Double[] noiseDBWrap = new Double[Common.PIP_NUM];
+        for (int i = 0; i < Common.PIP_NUM; i++) {
+          noiseDBWrap[i] = new Double(noiseDB[i]);
+        }
+
+        XYSeries noiseSeries = new SimpleXYSeries(
+            Arrays.asList(frequencies),
+            Arrays.asList(noiseDBWrap),
+            "background noise");
+        LineAndPointFormatter noiseSeriesFormat = new LineAndPointFormatter();
+        noiseSeriesFormat.configure(getApplicationContext(),
+            R.xml.ultrasound_line_formatter_noise);
+        noiseSeriesFormat.setPointLabelFormatter(null);
+        plot.addSeries(noiseSeries, noiseSeriesFormat);
+
+        double[] dB = wavAnalyzerTask.getDB();
+        Double[] dBWrap = new Double[Common.PIP_NUM];
+        for (int i = 0; i < Common.PIP_NUM; i++) {
+          dBWrap[i] = new Double(dB[i]);
+        }
+
+        XYSeries series = new SimpleXYSeries(
+            Arrays.asList(frequencies),
+            Arrays.asList(dBWrap),
+            "median");
+        LineAndPointFormatter seriesFormat = new LineAndPointFormatter();
+        seriesFormat.configure(getApplicationContext(),
+            R.xml.ultrasound_line_formatter_median);
+        seriesFormat.setPointLabelFormatter(null);
+        plot.addSeries(series, seriesFormat);
+
+        Double[] passX = new Double[] {Common.MIN_FREQUENCY_HZ, Common.MAX_FREQUENCY_HZ};
+        Double[] passY = new Double[] {wavAnalyzerTask.getThreshold(), wavAnalyzerTask.getThreshold()};
+        XYSeries passSeries = new SimpleXYSeries(
+            Arrays.asList(passX), Arrays.asList(passY), "passing");
+        LineAndPointFormatter passSeriesFormat = new LineAndPointFormatter();
+        passSeriesFormat.configure(getApplicationContext(),
+            R.xml.ultrasound_line_formatter_pass);
+        passSeriesFormat.setPointLabelFormatter(null);
+        plot.addSeries(passSeries, passSeriesFormat);
+      }
+    }
+
+    /**
+     * Plays the generated pips.
+     */
+    private void play() {
+      play(SoundGenerator.getInstance().getByte(), Common.PLAYING_SAMPLE_RATE_HZ);
+    }
+
+    /**
+     * Plays the sound data.
+     */
+    private void play(byte[] data, int sampleRate) {
+      if (audioTrack != null) {
+        audioTrack.stop();
+        audioTrack.release();
+      }
+      audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
+          sampleRate, AudioFormat.CHANNEL_OUT_MONO,
+          AudioFormat.ENCODING_PCM_16BIT, Math.max(data.length, AudioTrack.getMinBufferSize(
+          sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT)),
+          AudioTrack.MODE_STATIC);
+      audioTrack.write(data, 0, data.length);
+      audioTrack.play();
+    }
+
+  /**
+   * AsyncTask class for the analyzing.
+   */
+  private class WavAnalyzerTask extends AsyncTask<Void, String, String>
+      implements WavAnalyzer.Listener {
+
+    private static final String TAG = "WavAnalyzerTask";
+    WavAnalyzer wavAnalyzer;
+
+    public WavAnalyzerTask(byte[] recording) {
+      wavAnalyzer = new WavAnalyzer(recording, Common.RECORDING_SAMPLE_RATE_HZ,
+          WavAnalyzerTask.this);
+    }
+
+    double[] getDB() {
+      return wavAnalyzer.getDB();
+    }
+
+    double[][] getPower() {
+      return wavAnalyzer.getPower();
+    }
+
+    double[] getNoiseDB() {
+      return wavAnalyzer.getNoiseDB();
+    }
+
+    double getThreshold() {
+      return wavAnalyzer.getThreshold();
+    }
+
+    @Override
+    protected String doInBackground(Void... params) {
+      boolean result = wavAnalyzer.doWork();
+      if (result) {
+        return getString(R.string.hifi_ultrasound_test_pass);
+      }
+      return getString(R.string.hifi_ultrasound_test_fail);
+    }
+
+    @Override
+    protected void onPostExecute(String result) {
+      info.append(result);
+      recorderButton.setEnabled(true);
+      if (wavAnalyzer.getResult()) {
+        getPassButton().setEnabled(true);
+      }
+      recorderButton.setText(R.string.hifi_ultrasound_test_plot);
+    }
+
+    @Override
+    protected void onProgressUpdate(String... values) {
+      for (String message : values) {
+        info.append(message);
+        Log.d(TAG, message);
+      }
+    }
+
+    @Override
+    public void sendMessage(String message) {
+      publishProgress(message);
+    }
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundGenerator.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundGenerator.java
new file mode 100644
index 0000000..0ad9371
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundGenerator.java
@@ -0,0 +1,81 @@
+package com.android.cts.verifier.audio;
+
+/**
+ * Sound generator.
+ */
+public class SoundGenerator {
+
+  private static SoundGenerator instance;
+
+  private final byte[] generatedSound;
+  private final double[] sample;
+
+  private SoundGenerator() {
+    // Initialize sample.
+    int pipNum = Common.PIP_NUM;
+    int prefixTotalLength = Util.toLength(Common.PREFIX_LENGTH_S, Common.PLAYING_SAMPLE_RATE_HZ)
+        + Util.toLength(Common.PAUSE_BEFORE_PREFIX_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ)
+        + Util.toLength(Common.PAUSE_AFTER_PREFIX_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ);
+    int repetitionLength = pipNum * Util.toLength(
+        Common.PIP_DURATION_S + Common.PAUSE_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ);
+    int sampleLength = prefixTotalLength + Common.REPETITIONS * repetitionLength;
+    sample = new double[sampleLength];
+
+    // Fill sample with prefix.
+    System.arraycopy(Common.PREFIX_FOR_PLAYER, 0, sample,
+        Util.toLength(Common.PAUSE_BEFORE_PREFIX_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ),
+        Common.PREFIX_FOR_PLAYER.length);
+
+    // Fill the sample.
+    for (int i = 0; i < pipNum * Common.REPETITIONS; i++) {
+      double[] pip = getPip(Common.WINDOW_FOR_PLAYER, Common.FREQUENCIES[i]);
+      System.arraycopy(pip, 0, sample,
+          prefixTotalLength + i * Util.toLength(
+              Common.PIP_DURATION_S + Common.PAUSE_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ),
+          pip.length);
+    }
+
+    // Convert sample to byte.
+    generatedSound = new byte[2 * sample.length];
+    int i = 0;
+    for (double dVal : sample) {
+      short val = (short) ((dVal * 32767));
+      generatedSound[i++] = (byte) (val & 0x00ff);
+      generatedSound[i++] = (byte) ((val & 0xff00) >>> 8);
+    }
+  }
+
+  public static SoundGenerator getInstance() {
+    if (instance == null) {
+      instance = new SoundGenerator();
+    }
+    return instance;
+  }
+
+  /**
+   * Gets a pip sample.
+   */
+  private static double[] getPip(double[] window, double frequency) {
+    int pipArrayLength = window.length;
+    double[] pipArray = new double[pipArrayLength];
+    double radPerSample = 2 * Math.PI / (Common.PLAYING_SAMPLE_RATE_HZ / frequency);
+    for (int i = 0; i < pipArrayLength; i++) {
+      pipArray[i] = window[i] * Math.sin(i * radPerSample);
+    }
+    return pipArray;
+  }
+
+  /**
+   * Get generated sound in byte[].
+   */
+  public byte[] getByte() {
+    return generatedSound;
+  }
+
+  /**
+   * Get sample in double[].
+   */
+  public double[] getSample() {
+    return sample;
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/Util.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Util.java
new file mode 100644
index 0000000..4ef62d9
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Util.java
@@ -0,0 +1,152 @@
+package com.android.cts.verifier.audio;
+
+import org.apache.commons.math.complex.Complex;
+import org.apache.commons.math.stat.descriptive.moment.Mean;
+import org.apache.commons.math.stat.descriptive.moment.StandardDeviation;
+import org.apache.commons.math.stat.descriptive.rank.Median;
+import org.apache.commons.math.transform.FastFourierTransformer;
+
+/**
+ * This class contains util functions used in the WavAnalyzer.
+ */
+public class Util {
+
+  /**
+   * Convert time in second to sample array length.
+   */
+  public static int toLength(double duration, int sampleRate) {
+    return (int) Math.round(duration * sampleRate);
+  }
+
+  /**
+   * Calculate mean of data.
+   */
+  public static double mean(double[] data) {
+    Mean mean = new Mean();
+    return mean.evaluate(data);
+  }
+
+  /**
+   * Calculate standard deviation of data.
+   */
+  public static double std(double[] data) {
+    StandardDeviation std = new StandardDeviation();
+    return std.evaluate(data);
+  }
+
+  /**
+   * Calculate median of data.
+   */
+  public static double median(double[] data) {
+    Median median = new Median();
+    median.setData(data);
+    return median.evaluate();
+  }
+
+  /**
+   * Pad zeros at the end, total length of array will be specified as length. If length is smaller
+   * than the length of the data, it returns the data truncated to the length.
+   */
+  public static Complex[] padZeros(Complex[] data, int length) {
+    Complex[] result = new Complex[length];
+    if (length < data.length) {
+      System.arraycopy(data, 0, result, 0, length);
+    } else {
+      System.arraycopy(data, 0, result, 0, data.length);
+      for (int i = data.length; i < result.length; i++) {
+        result[i] = new Complex(0, 0);
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Calculate cross correlation using FFT with periodic boundary handling.
+   */
+  public static double[] computeCrossCorrelation(Complex[] data1, Complex[] data2) {
+    FastFourierTransformer fft = new FastFourierTransformer();
+    int n = nextPowerOfTwo(Math.max(data1.length, data2.length));
+    Complex[] data1Fft = fft.transform(padZeros(data1, n));
+    Complex[] data2Fft = fft.transform(padZeros(data2, n));
+    Complex[] dottedData = new Complex[n];
+    for (int i = 0; i < n; i++) {
+      dottedData[i] = data1Fft[i].multiply(data2Fft[i].conjugate());
+    }
+    Complex[] resultComplex = fft.inversetransform(dottedData);
+    double[] resultDouble = new double[resultComplex.length];
+    for (int i = 0; i < resultComplex.length; i++) {
+      resultDouble[i] = resultComplex[i].abs();
+    }
+    return resultDouble;
+  }
+
+  /**
+   * Convert an short array to a double array.
+   */
+  public static double[] toDouble(short[] data) {
+    double[] result = new double[data.length];
+    for (int i = 0; i < data.length; i++) {
+      result[i] = data[i];
+    }
+    return result;
+  }
+
+  /**
+   * Convert a double array to a complex array.
+   */
+  public static Complex[] toComplex(double[] data) {
+    Complex[] result = new Complex[data.length];
+    for (int i = 0; i < data.length; i++) {
+      result[i] = new Complex(data[i], 0.0);
+    }
+    return result;
+  }
+
+  /**
+   * Calculates the next power of 2, greater than or equal to the input positive integer. If the
+   * input is not a positive integer, it returns 1.
+   */
+  public static int nextPowerOfTwo(int n) {
+    return 1 << (32 - Integer.numberOfLeadingZeros(n - 1));
+  }
+
+  /**
+   * Find the index with the max value in an array.
+   */
+  public static int findMaxIndex(double[] data) {
+    return findMaxIndex(data, 0, data.length - 1);
+  }
+
+  /**
+   * Find the index with the max value in a sub-array.
+   */
+  public static int findMaxIndex(double[] data, int startIndex, int endIndex) {
+    int maxIndex = startIndex;
+    for (int i = startIndex + 1; i <= endIndex; i++) {
+      if (data[i] > data[maxIndex]) {
+        maxIndex = i;
+      }
+    }
+    return maxIndex;
+  }
+
+  /**
+   * Returns the index of an array with the array value closest to the desired value.
+   */
+  public static int findClosest(double[] array, double value) {
+    double[] diffArray = new double[array.length];
+    for (int i = 0; i < array.length; i++) {
+      diffArray[i] = Math.abs(value - array[i]);
+    }
+    int index = 0;
+    for (int i = 1; i < array.length; i++) {
+      if (diffArray[i] < diffArray[index]) {
+        index = i;
+        if (diffArray[index] == 0) {
+          break;
+        }
+      }
+    }
+    return index;
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/WavAnalyzer.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/WavAnalyzer.java
new file mode 100644
index 0000000..b75c40b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/WavAnalyzer.java
@@ -0,0 +1,263 @@
+package com.android.cts.verifier.audio;
+
+import org.apache.commons.math.complex.Complex;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Class contains the analysis to calculate frequency response.
+ */
+public class WavAnalyzer {
+  private final Listener listener;
+  private final int sampleRate;  // Recording sampling rate.
+  private double[] data;  // Whole recording data.
+  private double[] dB;  // Average response
+  private double[][] power;  // power of each trial
+  private double[] noiseDB;  // background noise
+  private double[][] noisePower;
+  private double threshold;  // threshold of passing, drop off compared to 2000 kHz
+  private boolean result = false;  // result of the test
+
+  /**
+   * Constructor of WavAnalyzer.
+   */
+  public WavAnalyzer(byte[] byteData, int sampleRate, Listener listener) {
+    this.listener = listener;
+    this.sampleRate = sampleRate;
+
+    short[] shortData = new short[byteData.length >> 1];
+    ByteBuffer.wrap(byteData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shortData);
+    this.data = Util.toDouble(shortData);
+    for (int i = 0; i < data.length; i++) {
+      data[i] = data[i] / Short.MAX_VALUE;
+    }
+  }
+
+  /**
+   * Do the analysis. Returns true if passing, false if failing.
+   */
+  public boolean doWork() {
+    if (isClipped()) {
+      return false;
+    }
+    // Calculating the pip strength.
+    listener.sendMessage("Calculating... Please wait...\n");
+    try {
+      dB = measurePipStrength();
+    } catch (IndexOutOfBoundsException e) {
+      listener.sendMessage("WARNING: May have missed the prefix."
+          + " Turn up the volume of the playback device or move to a quieter location.\n");
+      return false;
+    }
+    if (!isConsistent()) {
+      return false;
+    }
+    result = responsePassesHifiTest(dB);
+    return result;
+  }
+
+  /**
+   * Check if the recording is clipped.
+   */
+  boolean isClipped() {
+    for (int i = 1; i < data.length; i++) {
+      if ((Math.abs(data[i]) >= Short.MAX_VALUE) && (Math.abs(data[i - 1]) >= Short.MAX_VALUE)) {
+        listener.sendMessage("WARNING: Data is clipped."
+            + " Turn down the volume of the playback device and redo the procedure.\n");
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Check if the result is consistant across trials.
+   */
+  boolean isConsistent() {
+    double[] coeffOfVar = new double[Common.PIP_NUM];
+    for (int i = 0; i < Common.PIP_NUM; i++) {
+      double[] powerAtFreq = new double[Common.REPETITIONS];
+      for (int j = 0; j < Common.REPETITIONS; j++) {
+        powerAtFreq[j] = power[i][j];
+      }
+      coeffOfVar[i] = Util.std(powerAtFreq) / Util.mean(powerAtFreq);
+    }
+    if (Util.mean(coeffOfVar) > 1.0) {
+      listener.sendMessage("WARNING: Inconsistent result across trials."
+          + " Turn up the volume of the playback device or move to a quieter location.\n");
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Determine test pass/fail using the frequency response. Package visible for unit testing.
+   */
+  boolean responsePassesHifiTest(double[] dB) {
+    for (int i = 0; i < dB.length; i++) {
+      // Precautionary; NaN should not happen.
+      if (Double.isNaN(dB[i])) {
+        listener.sendMessage(
+            "WARNING: Unexpected NaN in result. Redo the test.\n");
+        return false;
+      }
+    }
+
+    if (Util.mean(dB) - Util.mean(noiseDB) < Common.SIGNAL_MIN_STRENGTH_DB_ABOVE_NOISE) {
+      listener.sendMessage("WARNING: Signal is too weak or background noise is too strong."
+          + " Turn up the volume of the playback device or move to a quieter location.\n");
+      return false;
+    }
+
+    int indexOf2000Hz = Util.findClosest(Common.FREQUENCIES_ORIGINAL, 2000.0);
+    threshold = dB[indexOf2000Hz] + Common.PASSING_THRESHOLD_DB;
+    int indexOf18500Hz = Util.findClosest(Common.FREQUENCIES_ORIGINAL, 18500.0);
+    int indexOf20000Hz = Util.findClosest(Common.FREQUENCIES_ORIGINAL, 20000.0);
+    double[] responseInRange = new double[indexOf20000Hz - indexOf18500Hz];
+    System.arraycopy(dB, indexOf18500Hz, responseInRange, 0, responseInRange.length);
+    if (Util.mean(responseInRange) < threshold) {
+      listener.sendMessage(
+          "WARNING: Failed. Retry with different orientations or report failed.\n");
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Calculate the Fourier Coefficient at the pip frequency to calculate the frequency response.
+   * Package visible for unit testing.
+   */
+  double[] measurePipStrength() {
+    listener.sendMessage("Aligning data... Please wait...\n");
+    final int dataStartI = alignData();
+    final int prefixTotalLength = dataStartI
+        + Util.toLength(Common.PREFIX_LENGTH_S + Common.PAUSE_AFTER_PREFIX_DURATION_S, sampleRate);
+    listener.sendMessage("Done.\n");
+    listener.sendMessage("Prefix starts at " + (double) dataStartI / sampleRate + " s \n");
+    if (dataStartI > Math.round(sampleRate * (Common.PREFIX_LENGTH_S
+            + Common.PAUSE_BEFORE_PREFIX_DURATION_S + Common.PAUSE_AFTER_PREFIX_DURATION_S))) {
+      listener.sendMessage("WARNING: Unexpected prefix start time. May have missed the prefix.\n"
+          + "PLAY button should be pressed on the playback device within one second"
+          + " after RECORD is pressed on the recording device.\n"
+          + "If this happens repeatedly,"
+          + " turn up the volume of the playback device or move to a quieter location.\n");
+    }
+
+    listener.sendMessage("Analyzing noise strength... Please wait...\n");
+    noisePower = new double[Common.PIP_NUM][Common.NOISE_SAMPLES];
+    noiseDB = new double[Common.PIP_NUM];
+    for (int s = 0; s < Common.NOISE_SAMPLES; s++) {
+      double[] noisePoints = new double[Common.WINDOW_FOR_RECORDER.length];
+      System.arraycopy(data, dataStartI - (s + 1) * noisePoints.length - 1,
+          noisePoints, 0, noisePoints.length);
+      for (int j = 0; j < noisePoints.length; j++) {
+        noisePoints[j] = noisePoints[j] * Common.WINDOW_FOR_RECORDER[j];
+      }
+      for (int i = 0; i < Common.PIP_NUM; i++) {
+        double freq = Common.FREQUENCIES_ORIGINAL[i];
+        Complex fourierCoeff = new Complex(0, 0);
+        final Complex rotator = new Complex(0,
+            -2.0 * Math.PI * freq / sampleRate).exp();
+        Complex phasor = new Complex(1, 0);
+        for (int j = 0; j < noisePoints.length; j++) {
+          fourierCoeff = fourierCoeff.add(phasor.multiply(noisePoints[j]));
+          phasor = phasor.multiply(rotator);
+        }
+        fourierCoeff = fourierCoeff.multiply(1.0 / noisePoints.length);
+        noisePower[i][s] = fourierCoeff.multiply(fourierCoeff.conjugate()).abs();
+      }
+    }
+    for (int i = 0; i < Common.PIP_NUM; i++) {
+      double meanNoisePower = 0;
+      for (int j = 0; j < Common.NOISE_SAMPLES; j++) {
+        meanNoisePower += noisePower[i][j];
+      }
+      meanNoisePower /= Common.NOISE_SAMPLES;
+      noiseDB[i] = 10 * Math.log10(meanNoisePower);
+    }
+
+    listener.sendMessage("Analyzing pips... Please wait...\n");
+    power = new double[Common.PIP_NUM][Common.REPETITIONS];
+    for (int i = 0; i < Common.PIP_NUM * Common.REPETITIONS; i++) {
+      if (i % Common.PIP_NUM == 0) {
+        listener.sendMessage("#" + (i / Common.PIP_NUM + 1) + "\n");
+      }
+
+      int pipExpectedStartI;
+      pipExpectedStartI = prefixTotalLength
+          + Util.toLength(i * (Common.PIP_DURATION_S + Common.PAUSE_DURATION_S), sampleRate);
+      // Cut out the data points for the current pip.
+      double[] pipPoints = new double[Common.WINDOW_FOR_RECORDER.length];
+      System.arraycopy(data, pipExpectedStartI, pipPoints, 0, pipPoints.length);
+      for (int j = 0; j < Common.WINDOW_FOR_RECORDER.length; j++) {
+        pipPoints[j] = pipPoints[j] * Common.WINDOW_FOR_RECORDER[j];
+      }
+      Complex fourierCoeff = new Complex(0, 0);
+      final Complex rotator = new Complex(0,
+          -2.0 * Math.PI * Common.FREQUENCIES[i] / sampleRate).exp();
+      Complex phasor = new Complex(1, 0);
+      for (int j = 0; j < pipPoints.length; j++) {
+        fourierCoeff = fourierCoeff.add(phasor.multiply(pipPoints[j]));
+        phasor = phasor.multiply(rotator);
+      }
+      fourierCoeff = fourierCoeff.multiply(1.0 / pipPoints.length);
+      int j = Common.ORDER[i];
+      power[j % Common.PIP_NUM][j / Common.PIP_NUM] =
+          fourierCoeff.multiply(fourierCoeff.conjugate()).abs();
+    }
+
+    // Calculate median of trials.
+    double[] dB = new double[Common.PIP_NUM];
+    for (int i = 0; i < Common.PIP_NUM; i++) {
+      dB[i] = 10 * Math.log10(Util.median(power[i]));
+    }
+    return dB;
+  }
+
+  /**
+   * Align data using prefix. Package visible for unit testing.
+   */
+  int alignData() {
+    // Zeropadding samples to add in the correlation to avoid FFT wraparound.
+    final int zeroPad = Util.toLength(Common.PREFIX_LENGTH_S, Common.RECORDING_SAMPLE_RATE_HZ) - 1;
+    int fftSize = Util.nextPowerOfTwo((int) Math.round(sampleRate * (Common.PREFIX_LENGTH_S
+            + Common.PAUSE_BEFORE_PREFIX_DURATION_S + Common.PAUSE_AFTER_PREFIX_DURATION_S + 0.5))
+        + zeroPad);
+
+    double[] dataCut = new double[fftSize - zeroPad];
+    System.arraycopy(data, 0, dataCut, 0, fftSize - zeroPad);
+    double[] xCorrDataPrefix = Util.computeCrossCorrelation(
+        Util.padZeros(Util.toComplex(dataCut), fftSize),
+        Util.padZeros(Util.toComplex(Common.PREFIX_FOR_RECORDER), fftSize));
+    return Util.findMaxIndex(xCorrDataPrefix);
+  }
+
+  double[] getDB() {
+    return dB;
+  }
+
+  double[][] getPower() {
+    return power;
+  }
+
+  double[] getNoiseDB() {
+    return noiseDB;
+  }
+
+  double getThreshold() {
+    return threshold;
+  }
+
+  boolean getResult() {
+    return result;
+  }
+
+  /**
+   * An interface for listening a message publishing the progress of the analyzer.
+   */
+  public interface Listener {
+
+    void sendMessage(String message);
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java
deleted file mode 100644
index 9181b29..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java
+++ /dev/null
@@ -1,1078 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.verifier.camera.analyzer;
-
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.ImageFormat;
-import android.hardware.Camera;
-import android.hardware.usb.UsbAccessory;
-import android.hardware.usb.UsbManager;
-import android.os.ParcelFileDescriptor;
-import android.util.Log;
-import android.view.SurfaceView;
-import android.widget.ImageView;
-import android.widget.Toast;
-
-import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Implements a test to verify whether the Auto Exposure Lock functions as
- * described in the API.
- *
- * The test consists three sub-categories. The first set of tests focus on
- * testing whether the auto exposure lock works in various situations.
- * For all tests in this set, the lock is set during the period when the camera
- * preview is open. In this way the lock locks exposure according to the
- * lighting at the moment of setting the lock. The second set of tests focus on
- * testing whether the auto exposure lock works as expected after turning the
- * preview off and on. The lock is set during the period when the camera
- * preview is turned off. The lock is expected to lock an exposure level
- * identical to the one before the preview is turned off. One special case in
- * this category is to set lock before the preview is turned on for the first
- * time.
- */
-public class AutoLockTest extends CameraTests {
-
-    private static final String TAG = "AutoLockTest";
-    /** USB permission to connect to ADK. */
-    private static final String ACTION_USB_PERMISSION = "com.android.cts.verifier.USB_PERMISSION";
-    /** Defines a long sleep period.*/
-    private static final int SHORT_SLEEP = 2000;
-    /** Defines a short sleep period. */
-    private static final int LONG_SLEEP = 4000;
-
-    /** Test results in text format. */
-    private String mDebugText = new String();
-    /** Detailed report. */
-    private String mResultText = new String();
-    /** Thread lock of the camera callbacks. */
-    private final Object mProcessingImage = new Object();
-    /** Memory address of the native test handler. */
-    private long mTestHandler;
-    /** Array storing the reference test results. */
-    private ArrayList<Boolean> mReferenceCompareResults;
-    /** Array storing the reference test scenario logs. */
-    private ArrayList<String> mReferenceLogs;
-    /** Number of tests so far. */
-    private int mTestCount;
-
-    /** Usb Manager of the USB connections. */
-    private UsbManager mUsbManager;
-    /** Intent for getting the permission to access the ADK. */
-    private PendingIntent mPermissionIntent;
-    /** Boolean to represent whether a permission is gained. */
-    private boolean mPermissionRequestPending;
-    /** USB accessory pointing to the ADK. */
-    private UsbAccessory mAccessory;
-    /** File descriptor of the USB communication port. */
-    private ParcelFileDescriptor mFileDescriptor;
-    /** Output stream to write commands for ADK to. */
-    private FileOutputStream mOutputStream;
-
-    /** Pointer to the CameraAnalyzerActivity activity. */
-    private CameraAnalyzerActivity mActivity;
-    /** Boolean to tell whether the accessory is opened. */
-    private boolean mSetupReady;
-    /** Thread lock for setting up the usb. */
-    private final Object mUsbSetup = new Object();
-    /** Boolean to indicate whether there is an ADK attached. */
-    private boolean mUsingUsb = false;
-    /** Test results.*/
-    private int[] mTestResults;
-    /** Number of tests. */
-    private int mNumTests;
-    /** Singleton test instance.*/
-    private static AutoLockTest singletonTest = null;
-
-    /**
-     * Receives the notice of whether the connection to ADK is granted or
-     * denied.
-     */
-    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            Log.v(TAG, String.format("Received USB broadcast with action %s ", action));
-
-            if (ACTION_USB_PERMISSION.equals(action)) {
-                synchronized (this) {
-                    UsbAccessory accessory =
-                        (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
-
-                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
-                        // Grants the permission to connect to the ADK.
-                        Log.v(TAG, "Open accessory 3");
-                        openAccessory(accessory);
-                        // Overwrites the old camera instsance with the one currently opened
-                        // by the CameraAnalyzerActivity instance, since the permission
-                        // dialogue pauses the CameraAnalyzerActivity and forces the camera to
-                        // be released and reopened when the dialogue disappears.
-                        mTestCamera = mActivity.getCameraInstance();
-                    } else {
-                        // Denies the permission to connect to the ADK.
-                        Log.d(TAG, "permission denied for accessory " + accessory);
-                    }
-                    // Marks that the permission request has been processed.
-                    mPermissionRequestPending = false;
-                }
-            } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
-                // Invokes when the USB is detached.
-                // Closes the accessory if it has not been closed.
-                Log.v(TAG, "Usb device detached");
-                mUsingUsb = false;
-                UsbAccessory accessory =
-                    (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
-                if (accessory != null && accessory.equals(mAccessory)) {
-                    closeAccessory();
-                }
-            }
-        }
-    };
-
-    /**
-     * Opens the ADK from USB and attaches the output stream with it.
-     *
-     * Notifies the tread lock that the USB setup is ready.
-     */
-    private void openAccessory(UsbAccessory accessory) {
-        Log.d(TAG, "openAccessory: " + accessory);
-        mFileDescriptor = mUsbManager.openAccessory(accessory);
-
-        if (mFileDescriptor != null) {
-            mAccessory = accessory;
-            FileDescriptor fd = mFileDescriptor.getFileDescriptor();
-            mOutputStream = new FileOutputStream(fd);
-            Log.d(TAG, "accessory opened");
-        } else {
-            Log.d(TAG, "accessory open fail");
-        }
-
-        // Unlocks the thread lock of waiting for the USB to be ready.
-        synchronized (mUsbSetup) {
-            mSetupReady = true;
-            Log.v(TAG, "Setup ready");
-            mUsbSetup.notifyAll();
-        }
-    }
-
-    /**
-     * Closes the ADK and detaches the output stream from it.
-     */
-    private void closeAccessory() {
-        try {
-            if (mFileDescriptor != null) {
-                mFileDescriptor.close();
-            }
-        } catch (IOException e) {
-        } finally {
-            mFileDescriptor = null;
-            mAccessory = null;
-        }
-    }
-
-    /**
-     * Constructs the AutoLockTest class, which can execute a series of tests
-     * to verify whether the device's Auto Exposure Lock is working properly.
-     *
-     * The test uses the LED lights on an ADK device as light source to change
-     * the lighting condition of the environment. The usb connection to the
-     * ADK board is established in the constructor.
-     *
-     * @param hostActivity pointer to the <code>CameraAnalyzerActivity</code>
-     * that instructs the Auto Lock Test
-     * @param mCamera pointer to the current camera instance
-     */
-    private AutoLockTest(){
-        super();
-    }
-
-    public static synchronized AutoLockTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new AutoLockTest instance");
-            singletonTest = new AutoLockTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        // Creates a native test handler with a 120x160 pixel debug output
-        mTestHandler = createAutoLockTest();
-        mReferenceCompareResults = new ArrayList<Boolean>();
-        mReferenceLogs = new ArrayList<String>();
-        mNumTests = 4;
-        mTestResults = new int[mNumTests];
-        for (int i = 0; i < mNumTests; ++i) {
-            mTestResults[i] = CameraTests.CAMERA_TEST_NOT_RUN;
-        }
-    }
-
-    public void updateCamera() {}
-
-    public void setActivity(CameraAnalyzerActivity hostActivity){
-        if (mUsingUsb) {
-            closeConnection();
-        }
-
-        mActivity = hostActivity;
-
-        mSetupReady = false;
-
-        Log.v(TAG, "Start to test ADK connection");
-        // Starts to establish the connection to the ADK board.
-        mUsbManager = (UsbManager) mActivity.getSystemService(Context.USB_SERVICE);
-        mPermissionIntent = PendingIntent.getBroadcast(mActivity, 0,
-                                                       new Intent(ACTION_USB_PERMISSION), 0);
-        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
-        filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
-        filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
-        mActivity.registerReceiver(mUsbReceiver, filter);
-
-        if (mActivity.getLastNonConfigurationInstance() != null) {
-            mAccessory = (UsbAccessory) mActivity.getLastNonConfigurationInstance();
-            Log.v(TAG, "Open acceossory 1");
-            openAccessory(mAccessory);
-        }
-
-        // Skips the permission listener if the user already grants the ADK
-        // permission previously in the app.
-        UsbAccessory[] accessories = mUsbManager.getAccessoryList();
-        UsbAccessory accessory = (accessories == null ? null : accessories[0]);
-        if (accessory != null) {
-            if (mUsbManager.hasPermission(accessory)) {
-                Log.v(TAG, "Open accessory 2");
-                openAccessory(accessory);
-            } else {
-                synchronized (mUsbReceiver) {
-                    if (!mPermissionRequestPending) {
-                        mUsbManager.requestPermission(accessory, mPermissionIntent);
-                        mPermissionRequestPending = true;
-                    }
-                }
-            }
-            mUsingUsb = true;
-        } else {
-            Log.d(TAG, "accessory is null");
-            mUsingUsb = false;
-        }
-
-    }
-
-    /**
-     * Closes the accessories and unregister the USB listener at the end of
-     * tests.
-     */
-    public void closeConnection() {
-        closeAccessory();
-        mActivity.unregisterReceiver(mUsbReceiver);
-    }
-
-    protected void finalize ()  {
-        if (mUsingUsb) {
-            closeConnection();
-        }
-    }
-
-    /**
-     * Runs the Auto Lock tests. A total of 19 tests have been coded and
-     * included. Developers can freely comment out tests not interested. In
-     * the release version, all tests will be executed.
-     */
-    @Override
-    public synchronized void run(int index){
-        if (index == 0) {
-            for (int i = 1; i < mNumTests; ++i) {
-                run(i);
-            }
-            return;
-        }
-
-        Log.v(TAG, "AutoLockTest thread started!");
-
-        if (mUsingUsb && (!mSetupReady)) {
-            // USB connection is not set up. Locks thread and wait.
-            Log.v(TAG, "Setup not ready, waiting");
-            synchronized (mUsbSetup) {
-                try{
-                    Log.v(TAG, "Start waiting for Image");
-                    mUsbSetup.wait();
-                } catch (InterruptedException e) {
-                    Log.v(TAG, "Callback wait fails!");
-                }
-            }
-        }
-
-        // Restarts the camera intance and attach the preview to the corrent
-        // UI elements.
-        restartCamera();
-        startPreview();
-
-        mTestCount = 0;
-        switch (index) {
-            case 1:
-                Log.v(TAG, "SP -> TP1 -> SP -> +1 -> Lock -> -1 -> TP2");
-                test0();
-                Log.v(TAG, "SP -> TP1 -> SP -> Lock -> +1 -> TP2 -> -1");
-                test1();
-                Log.v(TAG, "SP -> Lock -> +1 -> TP1 -> SP -> -1 -> Lock -> TP2");
-                test2();
-                Log.v(TAG, "SP -> Lock -> +1 -> TP1 -> SP -> Lock -> -1 -> TP2");
-                test3();
-                break;
-            case 2:
-                Log.v(TAG, "SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2");
-                test4();
-                Log.v(TAG, "SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2");
-                test5();
-                Log.v(TAG, "SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
-                test6();
-                Log.v(TAG, "SP -> TP1 -> +1 -> Lock -> SP -> TP2");
-                test7();
-                Log.v(TAG, "SP -> TP1 -> Lock -> SP -> +1 -> TP2");
-                test8();
-                Log.v(TAG, "SP -> +1 -> Lock -> -1 -> TP1 -> Lock -> SP -> TP2");
-                test9();
-                Log.v(TAG, "SP -> +1 -> Lock -> TP1 -> -1 -> Lock -> SP -> TP2");
-                test10();
-                Log.v(TAG, "SP -> Lock -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
-                test11();
-                break;
-            case 3:
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Restart -> Lock -> SP -> +1 -> TP2");
-                test12();
-                Log.v(TAG, "Restart -> Lock -> SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2");
-                test13();
-                Log.v(TAG, "Restart -> Lock -> SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2");
-                test14();
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
-                test15();
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> TP2");
-                test16();
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Lock -> SP -> +1 -> TP2");
-                test17();
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Lock -> SP -> TP2");
-                test18();
-                break;
-            default:
-                break;
-        }
-
-        releaseLock();
-
-        Log.v(TAG, "Ready to process data");
-        boolean[] testCompareResults = new boolean[2 * mTestCount];
-
-        // Processes the data stored in the native test handler instance.
-        // Stores the test results into a boolean array.
-        processAutoLockTest(mTestHandler, testCompareResults);
-
-        // Prepares the test result text output with the booelan result array.
-        prepareDebugText(testCompareResults, index);
-        mReferenceCompareResults.clear();
-        mReferenceLogs.clear();
-    }
-
-    /**
-     * Compares two images taken under the same lighting, Image 1 without AE
-     * lock and Image 2 with AE locked under a bright light. Image 1 is
-     * expected to be brighter than Image 2.
-     * Tests whether AE lock works compared to no AE lock.
-     */
-    private void test0() {
-        releaseLock();
-        takePicture();
-        startPreview();
-        turnOnLight();
-        setLock();
-        turnOffLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Same lighting condition with one different lock");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different lighting, Image 1 without AE
-     * lock and Image 2 with with AE locked under the same light Image 1 is
-     * taken. Image 2 is taken under a bright light. Image 1 is expected to be
-     * darker than Image 2.
-     * Tests whether AE lock works compared to no AE lock.
-     */
-    private void test1() {
-        releaseLock();
-        takePicture();
-        startPreview();
-        setLock();
-        turnOnLight();
-        takePicture();
-        turnOffLight();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("One same lock with different lighting");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different light, both with AE locked
-     * under the same lighting. Image 1 is taken under a brighter light.
-     * Image 1 is expected to be brighter than Image 2.
-     * Tests whether AE locks the exposure to the same level in the same
-     * lighting condition after preview restarts.
-     */
-     private void test2() {
-        releaseLock();
-        setLock();
-        turnOnLight();
-        takePicture();
-        startPreview();
-        turnOffLight();
-        setLock();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Same locking locations with different lighting");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different light, Image 1 with AE locked
-     * under normal light and Image 2 with AE locked under a bright light.
-     * Image 1 is taken under a bright light and Image 2 is taken in the normal
-     * lighting. Image 1 is expected to be brighter than Image 2.
-     * Tests whether AE lock can adjust to change of lighting conditions.
-     */
-    private void test3() {
-        releaseLock();
-        setLock();
-        turnOnLight();
-        takePicture();
-        startPreview();
-        setLock();
-        turnOffLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Different locking locations with different lighting");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different lighting, Image 1 without
-     * AE lock and Image 2 with AE lock set before camera preview resumes.
-     * Image 1 is taken under a bright light and the light is turned off before
-     * camera preview starts again. Image 1 is expected to be brighter than
-     * Image 2.
-     * Tests whether setting AE lock between camera preview stops and restarts
-     * can retain the exposure level of the previous AE-unlocked photo.
-     */
-    private void test4() {
-        releaseLock();
-        turnOnLight();
-        takePicture();
-        turnOffLight();
-        setLock();
-        startPreview();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after takePicture and light change, before preview");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different lighting, Image 1 without
-     * AE lock and Image 2 with AE lock set before camera preview resumes.
-     * Image 1 is taken under a bright light and the light is turned off after
-     * preview restars but before Image 2 is taken. Image 1 is expected to be
-     * brighter than Image 2.
-     * Tests whether setting AE lock between camera preview stops and restarts
-     * can retain the exposure level of the previous AE-unlocked photo.
-     */
-    private void test5() {
-        releaseLock();
-        turnOnLight();
-        takePicture();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock between takePicture and light change, w/o light change");
-        ++mTestCount;
-    }
-
-    private void test6() {
-        releaseLock();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after takePicture and light change, before preview.");
-        ++mTestCount;
-    }
-
-    private void test7() {
-        releaseLock();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        takePicture();
-        startPreview();
-        releaseLock();
-        turnOffLight();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after takePicture and light change, before preview.");
-        ++mTestCount;
-    }
-
-    private void test8() {
-        releaseLock();
-        takePicture();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        turnOffLight();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after takePicture and before startPreview.");
-        ++mTestCount;
-    }
-
-    private void test9() {
-        releaseLock();
-        turnOnLight();
-        setLock();
-        turnOffLight();
-        takePicture();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test10() {
-        releaseLock();
-        turnOnLight();
-        setLock();
-        takePicture();
-        turnOffLight();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test11() {
-        releaseLock();
-        setLock();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test12() {
-        //"Restart -> Lock -> SP -> TP1 -> Restart -> Lock -> SP -> +1 -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        restartCamera();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        releaseLock();
-        turnOffLight();
-        startPreview();
-        //mTestCamera.release();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock before first preview");
-        ++mTestCount;
-    }
-
-    private void test13() {
-        //"Restart -> Lock -> SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        turnOffLight();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test14() {
-        //"Restart -> Lock -> SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test15() {
-        //"Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2"
-         restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test16() {
-        //"Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        takePicture();
-        turnOffLight();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test17() {
-        //"Restart -> Lock -> SP -> TP1 -> Lock -> SP -> +1 -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        turnOffLight();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test18() {
-        //"Restart -> Lock -> SP -> TP1 -> Lock -> SP -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    /**
-     * Restarts the camera by releasing the current instance and get a new
-     * instance. Also connects this new camera instance's preview to the proper
-     * UI surfaceview.
-     */
-    private void restartCamera() {
-        Log.v(TAG, "Restarting Camera");
-
-        mTestCamera.release();
-        Log.v(TAG, "Camera released");
-
-        try {
-            mTestCamera = Camera.open(mActivity.getCameraIdx());
-        } catch (RuntimeException e) {
-            throw new RuntimeException("Failed to open the camera", e);
-        }
-
-        Camera.Parameters params = mTestCamera.getParameters();
-        params.setPictureFormat(ImageFormat.JPEG);
-        params.setPictureSize(640, 480);
-        mTestCamera.setParameters(params);
-
-        try {
-            mTestCamera.setPreviewDisplay(super.getCameraView().getHolder());
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to connect camera to display: " + e);
-        }
-    }
-
-    /**
-     * Starts Camera preview with a delay of 2 seconds to let it adjust to
-     * the lighting condition.
-     */
-    private void startPreview() {
-        mTestCamera.startPreview();
-        try{
-            Log.v(TAG, "Waiting");
-            Thread.sleep(2000);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-    }
-
-    /**
-     * Sends command to ADK to turn on all the LED lights to white.
-     * Waits for 4 seconds for the camera to adjust to the new lighting.
-     */
-    private void turnOnLight() {
-        Log.v(TAG, "Turn on light");
-        if (mUsingUsb) {
-            byte[] buffer = new byte[3];
-
-            buffer[0] = (byte) 3;
-            buffer[1] = (byte) 0;
-            buffer[2] = (byte) 1;
-            if (mOutputStream != null && buffer[1] != -1) {
-                try {
-                    mOutputStream.write(buffer);
-                } catch (IOException e) {
-                    Log.e(TAG, "write failed", e);
-                }
-            }
-        } else {
-            mActivity.runOnUiThread(new Runnable() {
-                public void run() {
-                    Toast.makeText(mActivity.getApplicationContext(), "Turn on light!", 4).show();
-
-                }
-            });
-        }
-
-        try{
-            Log.v(TAG, "Waiting, Please Turn on light");
-            Thread.sleep(LONG_SLEEP);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-    }
-
-    /**
-     * Sends command to ADK to turn off all LED lights.
-     * Waits for 4 seconds for the camera to adjust to the new lighting.
-     */
-    private void turnOffLight() {
-        Log.v(TAG, "Turn off light");
-        if (mUsingUsb) {
-            byte[] buffer = new byte[3];
-
-            buffer[0] = (byte) 3;
-            buffer[1] = (byte) 0;
-            buffer[2] = (byte) 0;
-            if (mOutputStream != null && buffer[1] != -1) {
-                try {
-                    mOutputStream.write(buffer);
-                } catch (IOException e) {
-                    Log.e(TAG, "write failed", e);
-                }
-            }
-        } else {
-            mActivity.runOnUiThread(new Runnable() {
-                public void run() {
-                    Toast.makeText(mActivity.getApplicationContext(), "Turn off light!", 4).show();
-
-                }
-            });
-        }
-
-        try{
-            Log.v(TAG, "Waiting, Please Turn off light");
-            Thread.sleep(LONG_SLEEP);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-    }
-
-    /**
-     * Sets the Auto Exposure Lock.
-     * Waits for 2 seonds for the lock to function.
-     */
-    private void setLock() {
-        Camera.Parameters params = mTestCamera.getParameters();
-
-        params.setAutoExposureLock(true);
-        params.setAutoWhiteBalanceLock(true);
-        mTestCamera.setParameters(params);
-        try{
-            Log.v(TAG, "Waiting to set lock");
-            Thread.sleep(2000);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-    }
-
-    /**
-     * Releases the Auto Exposure Lock.
-     * Waits for 4 seconds afterwards for the Auto Exposure to be adjusted
-     * to the lighting condition.
-     */
-    private void releaseLock() {
-        Camera.Parameters params = mTestCamera.getParameters();
-
-        params.setAutoExposureLock(false);
-        params.setAutoWhiteBalanceLock(false);
-        mTestCamera.setParameters(params);
-        try{
-            Log.v(TAG, "Waiting to release lock");
-            Thread.sleep(LONG_SLEEP);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-
-    }
-
-    /**
-     * Takes a picture and locks thread until the picture callback finishes.
-     */
-    private void takePicture(){
-        mTestCamera.takePicture(null, null, null, mTestJpegListener);
-
-        synchronized (mProcessingImage) {
-            try{
-                Log.v(TAG, "Start waiting for Image");
-              //  System.gc();
-                mProcessingImage.wait();
-            } catch (InterruptedException e){
-                 Log.v(TAG, "Callback wait fails!");
-            }
-        }
-    }
-
-    /**
-     * Prepare for the result to be shown in the UI. The result for each single
-     * test is shown in green if it matches the reference result. It is shown
-     * in red otherwise.
-     */
-    private void prepareDebugText(boolean[] testCompareResults, int index) {
-        boolean groupTestPassed = true;
-         for (int i = 0; i < mTestCount; ++i) {
-              String testLog;
-              boolean testPassed = true;
-              testLog = mReferenceLogs.get(i);
-              mDebugText += (testLog + "<br/>");
-
-              if (testCompareResults[i * 2] == mReferenceCompareResults.get(i * 2)) {
-                  mDebugText += String.format(
-                      "Picture 1 brighter than Picture 2 is %b \n",
-                      testCompareResults[i * 2]);
-              } else {
-                  mDebugText += String.format(
-                      "Picture 1 brighter than Picture 2 is %b \n",
-                      testCompareResults[i * 2]);
-                  testPassed = false;
-              }
-
-              if (testCompareResults[i * 2 + 1] == mReferenceCompareResults.get(i * 2 + 1)) {
-                  mDebugText += String.format(
-                      "Picture 1 is equivalent to Picture 2 is %b \n",
-                      testCompareResults[i * 2 + 1]);
-              } else {
-                  mDebugText += String.format(
-                      "Picture 1 is equivalent to Picture 2 is %b \n",
-                      testCompareResults[i * 2 + 1]);
-                  testPassed = false;
-              }
-
-              if (testPassed) {
-                  mDebugText += "Test passed! \n";
-              } else {
-                  mDebugText += "Test failed! \n";
-                  groupTestPassed = false;
-              }
-         }
-        if (groupTestPassed) {
-            mTestResults[index] = CameraTests.CAMERA_TEST_SUCCESS;
-        } else {
-            mTestResults[index] = CameraTests.CAMERA_TEST_FAILURE;
-        }
-    }
-
-    /**
-     * Clears the debug text so that new test results can be added.
-     */
-    public void clearDebugText() {
-        mDebugText = "";
-    }
-
-    @Override
-    public String getDebugText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getResultText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getTestName() {
-        return "Auto Exposure Lock test: \n";
-    }
-
-    @Override
-    public String getTestName(int index) {
-        switch (index) {
-            case 0:
-                return "Run all tests";
-            case 1:
-                return "Compulsory tests";
-            case 2:
-                return "Recommended tests (preview behavior)";
-            case 3:
-                return "Optional tests (default lock)";
-            default:
-                return "";
-        }
-    }
-
-    @Override
-    public int getResult(int index) {
-        return mTestResults[index];
-    }
-
-    @Override
-    public int getNumTests() {
-        return mNumTests;
-    }
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-            Bitmap inputImage;
-
-            // Decodes the camera input data into Bitmap.
-            // Constructs a native image class with the image.
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            // Cleans up memory taken by the Bitmap.
-            data = null;
-            inputImage.recycle();
-            inputImage = null;
-            System.gc();
-
-            // Passes data from the native image class to the native
-            // test handler.
-            createAutoLockClass(bufferAddress, mTestHandler,
-                                getCheckerCenter(), getCheckerRadius());
-
-            // Unlocks the thread lock.
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    private native long createAutoLockTest();
-
-    private native void createAutoLockClass(long bufferAddress, long handlerAddress,
-                                            long checkerCenterAddress,
-                                            long checkerRadiusAddress);
-
-    private native void processAutoLockTest(long handlerAddress, boolean[] testCompareResults);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java
deleted file mode 100644
index 34e8d2d..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.verifier.camera.analyzer;
-
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-
-import android.app.Activity;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Color;
-import android.graphics.ImageFormat;
-import android.hardware.Camera;
-import android.hardware.Camera.CameraInfo;
-import android.hardware.Camera.Size;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.text.Html;
-import android.text.method.ScrollingMovementMethod;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Button;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.content.Context;
-
-import java.io.IOException;
-import java.lang.Thread;
-import java.util.List;
-
-/**
- * Controls the UI activities of the camera quality test app. It is created
- * as soon as the app started. Users can launch different quality tests with
- * the buttons in the UI. This class will manage the threading for different
- * tests. Also it will provide debug output or debug text results for tests.
- */
-public class CameraAnalyzerActivity extends PassFailButtons.Activity {
-
-    private static final String TAG = "CameraAnalyzer";
-    private SurfaceView mCameraView;
-    private ImageView mResultView;
-    private Button mFindCheckerButton;
-    private Button mExposureCompensationButton;
-    private Button mWhiteBalanceButton;
-    private Button mAutoLockButton;
-    private Button mMeteringButton;
-    private ListView mTestList;
-    private TwoColumnAdapter mAdapter;
-
-    private Camera mCamera;
-    private int mCameraIdx = 0;
-    private boolean mIsCameraOpen = false;
-
-    private PowerManager mPowerManager;
-    private PowerManager.WakeLock mWakeLock;
-
-    private boolean mProcessingPicture = false;
-    private boolean mTestInProgress = false;
-    private final Object mProcessingTest = new Object();
-    private CameraTests mCurrentTest = null;
-
-    private long mCheckerCenterAddress;
-    private long mCheckerRadiusAddress;
-
-    private String mResultReport = "";
-    static final String[] TESTS = new String[] {"Test1", "Test2"};
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.ca_main);
-        setPassFailButtonClickListeners();
-        setInfoResources(R.string.camera_analyzer, R.string.ca_info, -1);
-
-        mFindCheckerButton = (Button) findViewById(R.id.findcheckerboardbutton);
-        mExposureCompensationButton = (Button) findViewById(R.id.exposurecompensationbutton);
-        mWhiteBalanceButton = (Button) findViewById(R.id.whitebalancebutton);
-        mAutoLockButton = (Button) findViewById(R.id.lockbutton);
-        mMeteringButton = (Button) findViewById(R.id.meteringbutton);
-        mCameraView = (SurfaceView) findViewById(R.id.cameraview);
-        mResultView = (ImageView) findViewById(R.id.resultview);
-        mTestList = (ListView) findViewById(R.id.ca_tests);
-        mAdapter = new TwoColumnAdapter(this);
-
-        // Initialize the list view.
-        initializeAdapter();
-        mTestList.setAdapter(mAdapter);
-        mTestList.setOnItemClickListener(mListListener);
-
-        mFindCheckerButton.setOnClickListener(mFindCheckerListener);
-        mExposureCompensationButton.setOnClickListener(mExposureCompensationListener);
-        mWhiteBalanceButton.setOnClickListener(mWhiteBalanceListener);
-        mAutoLockButton.setOnClickListener(mAutoLockListener);
-        mMeteringButton.setOnClickListener(mMeteringListener);
-        mCameraView.getHolder().addCallback(mSurfaceChangeListener);
-
-        // Disables all test buttons except the color checker test one.
-        // They will be enabled after the color checker is located.
-        mExposureCompensationButton.setEnabled(false);
-        mWhiteBalanceButton.setEnabled(false);
-        mAutoLockButton.setEnabled(false);
-        mMeteringButton.setEnabled(false);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        openCamera(mCameraIdx);
-        Camera.Parameters params = mCamera.getParameters();
-        params.setPictureFormat(ImageFormat.JPEG);
-        params.setPictureSize(640, 480);
-        mCamera.setParameters(params);
-        Log.v(TAG, "Set resolution to 640*480");
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        CameraTests.getCamera().release();
-        mIsCameraOpen = false;
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        MenuInflater inflater = getMenuInflater();
-        inflater.inflate(R.menu.ca_menu, menu);
-
-        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
-        int cameraCount = Camera.getNumberOfCameras();
-        for (int camIdx = 0; camIdx < cameraCount; ++camIdx) {
-            MenuItem cameraMenuItem = menu.add(0, camIdx, Menu.NONE,
-                                               String.format("Open Camera %d", camIdx));
-        }
-      return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (item.getItemId() != mCameraIdx) {
-            mCameraIdx = item.getItemId();
-            new SwitchCameraTask().execute(mCameraIdx);
-        }
-        return false;
-    }
-
-    private class SwitchCameraTask extends AsyncTask<Integer, Void, Void> {
-        @Override
-        protected Void doInBackground(Integer... camIdx) {
-            if (mTestInProgress) {
-                synchronized (mProcessingTest) {
-                    try{
-                        Log.v(TAG, "Waiting for test to finish");
-                        mProcessingTest.wait();
-                    } catch (InterruptedException e){
-                         Log.v(TAG, "test wait fails!");
-                    }
-                }
-            }
-
-            openCamera((int)camIdx[0]);
-            return null;
-        }
-    }
-
-    private synchronized void openCamera(int camIdx) {
-        if (mIsCameraOpen) {
-            CameraTests.getCamera().release();
-            Log.v(TAG, "Releasing the cameratests camera");
-        }
-        try {
-            mCamera = Camera.open(camIdx);
-            mIsCameraOpen = true;
-        } catch (RuntimeException e) {
-            throw new RuntimeException("Failed to open the camera", e);
-        }
-
-        try {
-            mCamera.setPreviewDisplay(mCameraView.getHolder());
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to connect camera to display: " + e);
-        }
-        mCamera.startPreview();
-        CameraTests.setCamera(mCamera);
-
-        ColorCheckerTest.getSingletonTest().updateCamera();
-        WhiteBalanceTest.getSingletonTest().updateCamera();
-        ExposureCompensationTest.getSingletonTest().updateCamera();
-        MeteringTest.getSingletonTest().updateCamera();
-        AutoLockTest.getSingletonTest().updateCamera();
-    }
-
-    public Camera getCameraInstance() {
-        return mCamera;
-    }
-
-    public void disableAll() {
-        mExposureCompensationButton.setEnabled(false);
-        mWhiteBalanceButton.setEnabled(false);
-        mAutoLockButton.setEnabled(false);
-        mMeteringButton.setEnabled(false);
-        mFindCheckerButton.setEnabled(false);
-    }
-
-    public void enableAll() {
-        mExposureCompensationButton.setEnabled(true);
-        mWhiteBalanceButton.setEnabled(true);
-        mAutoLockButton.setEnabled(true);
-        mMeteringButton.setEnabled(true);
-        mFindCheckerButton.setEnabled(true);
-    }
-
-    /**
-     * Provides an abstraction for the Camera tests. The camera tests will
-     * run in the background and the results will be shown in the UI thread
-     * after the tests are processed.
-     */
-    private class DebugOutputProcessingTask extends AsyncTask<Integer,
-                                                              Integer,
-                                                              Integer> {
-        @Override
-        protected Integer doInBackground(Integer... cameraTestIndex) {
-            Log.v(TAG, "Do in Background started!");
-
-            mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
-            mWakeLock = mPowerManager.newWakeLock(
-                    PowerManager.SCREEN_DIM_WAKE_LOCK, "CameraQualityTest");
-            mWakeLock.acquire();
-
-            mTestInProgress = true;
-
-            // Processes the camera tests one by one and publishes their
-            // debug output or debug text results after each test is done.
-            mCurrentTest.run((int)cameraTestIndex[0]);
-            publishProgress(cameraTestIndex);
-
-            Log.v(TAG, "Do in Background thread returns!");
-            return cameraTestIndex[0];
-        }
-
-        @Override
-        protected void onProgressUpdate(Integer... cameraTestIndex) {
-            Log.v(TAG, "Prepare to get debug output!");
-
-            // Copies the debug output image or text results to the UI.
-            mResultView.setImageBitmap(mCurrentTest.getDebugOutput());
-            mResultReport += (mCurrentTest.getTestName() + mCurrentTest.getDebugText());
-            mAdapter.notifyDataSetChanged();
-        }
-
-        @Override
-        protected void onPostExecute(Integer cameraTestIndex) {
-
-            // If the test is to find the color checker, copy the memory
-            // address of the found color checker centers and radius to the
-            // CameraTests class' static fields.
-            if (mCurrentTest.copyCheckerAddress()) {
-                mCheckerCenterAddress = CameraTests.getCheckerCenter();
-                mCheckerRadiusAddress = CameraTests.getCheckerRadius();
-            }
-
-            if (mCurrentTest.copyCheckerAddress() ||
-                !mCurrentTest.getTestName().contains("Color Checker")) {
-                // Enables the button of all other tests after the color checker
-                // is found. Now the user can start all other available tests.
-                enableAll();
-            }
-
-            mWakeLock.release();
-            mTestInProgress = false;
-            synchronized (mProcessingTest) {
-                mProcessingTest.notifyAll();
-            }
-
-        }
-    }
-
-    // Creates and runs a new test to find color checker in the captured image.
-    // It is invoked when users press the Find color checker button in the UI.
-    private View.OnClickListener mFindCheckerListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running new color checker finding tests!");
-            ColorCheckerTest colorCheckerTest = ColorCheckerTest.getSingletonTest();
-
-            mCurrentTest = colorCheckerTest;
-            initializeAdapter();
-        }
-    };
-
-    // Creates and runs a new test to test the exposure compensation function.
-    // It is invoked when users press the Exposure Compensation Test button
-    // in the UI.
-    private View.OnClickListener mExposureCompensationListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running new exposure compensation tests!");
-
-            ExposureCompensationTest exposureCompensationTest =
-                    ExposureCompensationTest.getSingletonTest();
-
-            mCurrentTest = exposureCompensationTest;
-            initializeAdapter();
-
-            // Loads the memory address of the checker centers and radius
-            // from the this class and set the two values for the new test.
-            ExposureCompensationTest.setCheckerAddress(mCheckerCenterAddress,
-                                                   mCheckerRadiusAddress);
-        }
-    };
-
-    // Creates and runs a new test to test the white balance function.
-    // It is invoked when users press the White Balance Test button in the UI.
-    private View.OnClickListener mWhiteBalanceListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running new white balance tests!");
-
-            WhiteBalanceTest whiteBalanceTest = WhiteBalanceTest.getSingletonTest();
-
-            mCurrentTest = whiteBalanceTest;
-            initializeAdapter();
-
-            // Loads the memory address of the checker centers and radius
-            // from the this class and set the two values for the new test.
-            WhiteBalanceTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
-        }
-    };
-
-    // Creates and runs a new test to test the camera metering function.
-    // It is invoked when users press the Metering Test button in the UI.
-    private View.OnClickListener mMeteringListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running new metering tests!");
-
-            MeteringTest meteringTest = MeteringTest.getSingletonTest();
-
-            mCurrentTest = meteringTest;
-            initializeAdapter();
-
-            // Loads the memory address of the checker centers and radius
-            // from the this class and set the two values for the new test.
-            MeteringTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
-        }
-    };
-
-    // Creates and runs new tests to test the camera auto exposure lock.
-    // It is invoked when users press the AWB and AE Lock Test button
-    // in the UI.
-    private View.OnClickListener mAutoLockListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running New auto exposure/wb lock tests!");
-
-            // Loads the memory address of the checker centers and radius
-            // from the this class and set the two values for the new test.
-            AutoLockTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
-
-            // Construct all base case test scenearios for the Auto Lock test.
-            // Detailed documentation on each test can be found in native code.
-            AutoLockTest autoLockTest = AutoLockTest.getSingletonTest();
-            autoLockTest.setActivity(CameraAnalyzerActivity.this);
-
-            mCurrentTest = autoLockTest;
-            initializeAdapter();
-
-        }
-    };
-
-    // Creates a list listner that launches the experiment with the user's click
-    private AdapterView.OnItemClickListener mListListener = new AdapterView.OnItemClickListener() {
-        @Override
-        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            Log.v(TAG, String.format("Item %d selected!", position));
-            if (!mTestInProgress) {
-                DebugOutputProcessingTask captureTask = new DebugOutputProcessingTask();
-                disableAll();
-                captureTask.execute(position);
-            }
-        }
-    };
-
-    private SurfaceHolder.Callback mSurfaceChangeListener =
-            new SurfaceHolder.Callback() {
-
-        // Sets the aspect ratio of the camera preview to 4:3
-        @Override
-        public void surfaceChanged(SurfaceHolder holder,
-                                   int format,
-                                   int width,
-                                   int height) {
-            int x = mCameraView.getWidth();
-            int y = mCameraView.getHeight();
-            Log.v(TAG, String.format("Measures are %d, %d", x, y));
-
-            if ( x > 4.0 / 3.0 * y) {
-                android.view.ViewGroup.LayoutParams lp = mCameraView.getLayoutParams();
-                lp.height =  y;
-                lp.width = (int)(4.0 / 3.0 * lp.height);
-                Log.v(TAG, String.format("params are %d, %d", lp.width, lp.height));
-                mCameraView.setLayoutParams(lp);
-            }
-
-            try {
-                mCamera.setPreviewDisplay(mCameraView.getHolder());
-            } catch (IOException e) {
-                throw new RuntimeException("Unable to connect camera to display: " + e);
-            }
-            CameraTests.setCameraView(mCameraView);
-            mCamera.startPreview();
-        }
-
-        @Override
-        public void surfaceCreated(SurfaceHolder holder) {}
-
-        @Override
-        public void surfaceDestroyed(SurfaceHolder holder) {}
-    };
-
-    @Override
-    public String getTestDetails() {
-        return mResultReport;
-    }
-
-    class TwoColumnAdapter extends ArrayAdapter<String> {
-        TwoColumnAdapter(Context context) {
-            super(context, R.layout.ca_row);
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            LayoutInflater inflater = getLayoutInflater();
-            View row = inflater.inflate(R.layout.ca_row, parent, false);
-            ImageView iconField = (ImageView) row.findViewById(R.id.caTestIcon);
-            TextView nameField = (TextView) row.findViewById(R.id.caTestName);
-            TextView resultField = (TextView) row.findViewById(R.id.caTestResult);
-            if (mCurrentTest != null) {
-                nameField.setText(mCurrentTest.getTestName(position));
-                int result = mCurrentTest.getResult(position);
-                switch (result) {
-                    case CameraTests.CAMERA_TEST_SUCCESS:
-                        resultField.setText("Success");
-                        iconField.setBackgroundColor(Color.rgb(0x99,0xCC,00));
-                        resultField.setTextColor(Color.rgb(0x99,0xCC,00));
-                        break;
-                    case CameraTests.CAMERA_TEST_FAILURE:
-                        resultField.setText("Failed!");
-                        iconField.setBackgroundColor(Color.rgb(0xFF,0x44,0x44));
-                        resultField.setTextColor(Color.rgb(0xFF,0x44,0x44));
-                        break;
-                    case CameraTests.CAMERA_TEST_NOT_RUN:
-                        resultField.setText("Tap to run");
-                        iconField.setBackgroundColor(Color.rgb(0x00,0x99,0xCC));
-                        resultField.setTextColor(Color.rgb(0x33,0xB5,0xE5));
-                        break;
-                }
-            }
-            return row;
-        }
-    }
-
-    private void initializeAdapter() {
-        mAdapter.clear();
-        if (mCurrentTest != null) {
-            for (int i = 0; i < mCurrentTest.getNumTests(); ++i) {
-                mAdapter.add(mCurrentTest.getTestName(i));
-            }
-        }
-    }
-
-    public int getCameraIdx() {
-        return mCameraIdx;
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java
deleted file mode 100644
index ed99524..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.hardware.Camera;
-import android.os.Environment;
-import android.util.Log;
-import android.view.SurfaceView;
-
-import java.io.FileOutputStream;
-import java.io.File;
-import java.lang.Runnable;
-
-/**
- * Provides an abstraction for all camera tests and allows communication
- * between camera test classes with the UI thread. This base class provides
- * functions to contruct and access debug output images. It can access and
- * set the pointer address of checkerboard centers and radius. It also provides
- * native methods to convert an image shot by the camera into a native
- * character array. Another native method it provides is to create a native
- * test handler with desired debug height and width.
- */
-public abstract class CameraTests{
-
-    public static final int CAMERA_TEST_NOT_RUN = 0;
-    public static final int CAMERA_TEST_SUCCESS = 1;
-    public static final int CAMERA_TEST_FAILURE = 2;
-
-    private static final String TAG = "CameraTests";
-
-    /** Memory address of the color checker centers. */
-    private static long sCheckerCenterAddress = 0;
-    /** Memory address of the color checker radius. */
-    private static long sCheckerRadiusAddress = 0;
-    /** The surface view linked with the camera preview. */
-    private static SurfaceView sCameraView;
-    /** Image debug output. */
-    private Bitmap mDebugOutput;
-    /** Shared camera instance. */
-    protected static Camera mTestCamera = null;
-
-    /**
-     * Constructs the base CameraTests class.
-     */
-    public CameraTests() {}
-
-    /**
-     * Returns debug Bitmap image. In the test to find the color checker,
-     * the debug image will be the captured image with a matched color checker
-     * overlay on top. In the exposure compensation test, the debug image
-     * will be the response curve of the camera.
-     * @return A low-resolution Bitmap to be displayed in the UI.
-     */
-    public Bitmap getDebugOutput() {
-        return mDebugOutput;
-    }
-
-    public String getDebugText() {
-        return "";
-    }
-
-    public abstract String getTestName();
-
-    /**
-     * Gets the detailed report for CTS output.
-     */
-    public String getResultText(){
-        return "Details not available \n";
-    }
-
-    /**
-     * Provides a polymorphism to start the run() method for all child classes.
-     */
-    public abstract void run(int index);
-
-    public SurfaceView getCameraView() {
-        return sCameraView;
-    }
-
-    public static void setCameraView(SurfaceView cameraView) {
-        sCameraView = cameraView;
-    }
-
-    /**
-     * Refreshes the camera instance when the activity opens a new camera.
-     */
-    public static void setCamera(Camera newCamera) {
-        mTestCamera = newCamera;
-    }
-
-    public static Camera getCamera() {
-        return mTestCamera;
-    }
-
-    /**
-     * Sets the memory address of the checker centers and checker radius.
-     *
-     * @param inputCenterAddress the new memory address of
-     *                           the color checker centers
-     * @param inputRadiusAddress the new memory address of
-     *                           the color checker radius
-     */
-    public static void setCheckerAddress(long inputCenterAddress, long inputRadiusAddress) {
-        sCheckerCenterAddress = inputCenterAddress;
-        sCheckerRadiusAddress = inputRadiusAddress;
-    }
-
-    /**
-     * Provides polymorphism to indicate whether the checker memory addresses
-     * should be copied.
-     *
-     * @return <code>true</code> if the class invoking the method needs to
-     *                           update the memory address of the color checker
-     *                           centers and radius;
-     *         <code>false</code> if the class invoking the method does NOT
-     *                           update the memory address of the color checker
-     *                           centers and radius.
-     */
-    public boolean copyCheckerAddress() {
-        return false;
-    }
-
-    public void cleanUp() {
-    }
-
-    public static long getCheckerCenter() {
-        return sCheckerCenterAddress;
-    }
-
-    public static long getCheckerRadius() {
-        return sCheckerRadiusAddress;
-    }
-
-    public abstract String getTestName(int index);
-
-    public abstract int getResult(int index);
-
-    public abstract int getNumTests();
-
-    /**
-     * Provides a native method to convert the input Bitmap of the captured
-     * image into a native character array and constructs a native image class
-     * with this character array. This method currently supports conversion
-     * of Bitmaps in the formats of RGB_565 and RGB_8888.
-     *
-     * @param input the input Bitmap, which is decoded from the camrea data.
-     *
-     * @return the memory address of the native image class which contains
-     * the character array.
-     */
-    public native long findNative(Bitmap input);
-
-    /**
-     * Provides a native method to create a native image handler class. The
-     * native image handler class is the base class for all test classes and
-     * contains the debug output as a character array.
-     *
-     * @param outputHeight the desired height for the debug output
-     * @param outputWidth the desired width for the debug output
-     *
-     * @return the memory address of the native test handler class.
-     */
-    public native long createImageTestHandler(int outputHeight, int outputWidth);
-
-    /**
-     * Provides a native method to clean up the memory taken by the handler.
-     *
-     * @param handlerAddress the memory address of the native test handler,
-     * which contains the debug output.
-     */
-    public native void cleanUpHandler(long handlerAddress);
-
-    /**
-     * Provides a native method to convert the native debug output from
-     * character array back to Bitmap and copy it to the debug output of this
-     * class.
-     *
-     * @param handlerAddress the memory address of the native test handler,
-     * which contains the debug output.
-     */
-    public native void displayHandlerDebugOutput(long handlerAddress);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorCheckerTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorCheckerTest.java
deleted file mode 100644
index ad171b4..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorCheckerTest.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.hardware.Camera;
-import android.util.Log;
-import android.widget.ImageView;
-
-import java.util.List;
-
-/** Locates a Xrite Classic Color Checker grid pattern in an image, stores the
- * center positions and the color checker radius, and provides a function to
- * get the memory address of these two properties.
- *
- * The pattern is a 6x4 grid of square color patches. The detection routine
- * assumes the pattern is placed roughly facing the camera, with the long size
- * roughly horizontal. It also assumes that the grey squares are in the bottom
- * row.
- */
-public class ColorCheckerTest extends CameraTests {
-
-    private static final String TAG = "ColorCheckerTest";
-
-    /** Memory address of the image class instance that contains the image. */
-    private long mClassAddress;
-    /** Memory address of the image test class instance. */
-    private long mTestHandler;
-    /** Thread lock. */
-    private final Object mProcessingImage = new Object();
-    /** Boolean to tell whether auto focus has succeded.*/
-    private boolean mAutoFocusSuccess;
-    /** Boolean to tell whether auto focus is supported.*/
-    private boolean mAutoFocusEnabled = false;
-    /** Singleton instance of the class.*/
-    private static ColorCheckerTest singletonTest = null;
-
-    private boolean mFindCheckerSuccess = false;
-    private boolean mHasRunOnce = false;
-
-    /**
-     * Constructs a <code>ColorCheckerTest</code> instance with a given
-     * Camera pointer.
-     */
-    private ColorCheckerTest() {
-        super();
-    }
-
-    /**
-     * Updates the camera and parameter when the activity switches camera.
-     */
-    public void updateCamera() {
-        Camera.Parameters params = mTestCamera.getParameters();
-        List<String> supportedFocusModes = params.getSupportedFocusModes();
-
-        // Sets camera focus mode to Auto focus if it is supported.
-        if (supportedFocusModes.contains(params.FOCUS_MODE_AUTO)) {
-            Log.v(TAG, "Auto focus possible");
-            params.setFocusMode(params.FOCUS_MODE_AUTO);
-            mTestCamera.setParameters(params);
-            mAutoFocusEnabled = true;
-        } else {
-            mAutoFocusEnabled = false;
-        }
-    }
-
-    public static synchronized ColorCheckerTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new ColorCheckerTest instance");
-            singletonTest = new ColorCheckerTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        // Creates a native test handler with a 120x160 pixel debug output
-        mTestHandler = createColorCheckerTest(120, 160);
-    }
-
-    @Override
-    public synchronized void run(int index) {
-        Log.v(TAG, "ColorCheckerTest thread started!");
-        mAutoFocusSuccess = false;
-        mFindCheckerSuccess = false;
-        mHasRunOnce = true;
-        // Sets camera focus mode to Auto focus if it is supported.
-        if (mAutoFocusEnabled) {
-            while (!mAutoFocusSuccess) {
-                // Starts the auto focus process of the camera.
-                mTestCamera.autoFocus(mAutoFocusListener);
-
-                // Locks thread until the camera finishes taking picture.
-                synchronized (mProcessingImage) {
-                    try{
-                        Log.v(TAG, "Start waiting for Image");
-                        mProcessingImage.wait();
-                    } catch (InterruptedException e) {
-                        Log.v(TAG, "Callback wait fails!");
-                    }
-                }
-            }
-        } else {
-            mTestCamera.takePicture(null, null, null, mTestJpegListener);
-            synchronized (mProcessingImage) {
-                try{
-                    Log.v(TAG, "Start waiting for Image");
-                    mProcessingImage.wait();
-                } catch (InterruptedException e) {
-                    Log.v(TAG, "Callback wait fails!");
-                }
-            }
-        }
-
-        // Launches the native method to find the color checker in the image.
-        mFindCheckerSuccess = processColorCheckerTest(mTestHandler);
-        // Displays the debug output from the native test handler instance.
-        displayHandlerDebugOutput(mTestHandler);
-
-        Log.v(TAG, "Callback has returned!");
-    }
-
-    private Camera.AutoFocusCallback mAutoFocusListener = new Camera.AutoFocusCallback() {
-        public void onAutoFocus(boolean mSuccess, Camera mCamera) {
-            if (mSuccess) {
-                mAutoFocusSuccess = true;
-                Log.v(TAG, "Autofocus success!");
-                mCamera.takePicture(null, null, null, mTestJpegListener);
-            } else {
-                try{
-                    Log.v(TAG, "Autofocus failed. Please adjust!");
-                    Thread.sleep(4000);
-                    Log.v(TAG, "END Waiting");
-                } catch (InterruptedException e){}
-
-                synchronized (mProcessingImage) {
-                    mProcessingImage.notifyAll();
-                }
-            }
-        }
-    };
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-
-            // Changes the focus mode to fixed to avoid focus shift after
-            // auto focus is successful.
-            //Camera.Parameters params = mCamera.getParameters();
-            //params.setFocusMode(params.FOCUS_MODE_FIXED);
-            //mCamera.setParameters(params);
-
-            // Decodes the camera data to Bitmap and creates a native image
-            // class with the Bitmap.
-            Bitmap inputImage;
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            // Cleans up the Bitmap memory space.
-            inputImage.recycle();
-            data = null;
-            inputImage = null;
-            System.gc();
-
-            // Constructs a test handler class to handle the image.
-            createColorCheckerClass(bufferAddress, mTestHandler);
-
-            mCamera.startPreview();
-
-            // Notifies the thread lock the image capture is done.
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    /**
-     * Overrides the base class method and use the memory addresses of the
-     * checker centers and radius computed by the native test handler class
-     * to update the values stored in the base class.
-     *
-     * @return <code>true</code> indicating a memory address upload is needed.
-     */
-    @Override
-    public boolean copyCheckerAddress() {
-        if (mFindCheckerSuccess) {
-            setCheckerAddress(getColorCheckerCenterAdd(mTestHandler),
-                              getColorCheckerRadiusAdd(mTestHandler));
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public void cleanUp() {
-        cleanUpHandler(mTestHandler);
-    }
-
-    @Override
-    public String getTestName() {
-        return "Color Checker test: \n";
-    }
-
-    @Override
-    public String getTestName(int index) {
-        return "Find color checker";
-    }
-
-    @Override
-    public int getResult(int index) {
-        if (mFindCheckerSuccess) {
-            return CameraTests.CAMERA_TEST_SUCCESS;
-        } else {
-            if (mHasRunOnce) {
-                return CameraTests.CAMERA_TEST_FAILURE;
-            } else {
-                return CameraTests.CAMERA_TEST_NOT_RUN;
-            }
-        }
-    }
-
-    @Override
-    public int getNumTests() {
-        return 1;
-    }
-
-    /**
-     * Gets the memory address of the vector storing the color checker centers
-     * from the native test handler instance.
-     *
-     * @param handlerAddress the memory address of the native test handler
-     * instance
-     *
-     * @return memory address of the native vector storing the color checker
-     * centers' coordinates
-     */
-    private native long getColorCheckerRadiusAdd(long handlerAddress);
-
-    /**
-     * Gets the memory address of the vector storing the color checker radius
-     * from the native test handler instance.
-     *
-     * @param handlerAddress the memory address of the native test handler
-     * instance.
-     *
-     * @return memory address of the native vector storing the color checker
-     * centers' coordinates
-     */
-    private native long getColorCheckerCenterAdd(long handlerAddress);
-
-    /**
-     * Creates a native color checker test handler instance.
-     *
-     * @param outputWidth the desired width for the debug output
-     * @param outputHeight the desired height of the debug output
-     *
-     * @return memory address of the native test handler instance
-     */
-    private native long createColorCheckerTest(int outputWidth, int outputHeight);
-
-    /**
-     * Loads a native image class instances and extracts data from it to add
-     * to the test handler.
-     *
-     * @param bufferAddress the memory address of the image class instance
-     * @param handlerAddress the memory address of the test handler instance
-     */
-    private native void createColorCheckerClass(long bufferAddress, long handlerAddress);
-
-    /**
-     * Processes the data in the native test handler instance. Computes test
-     * results with all the data and construct a debug image or debug text
-     * outputs.
-     *
-     * @param handlerAddress the memory address of the test handler instance
-     */
-    private native boolean processColorCheckerTest(long handlerAddress);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java
deleted file mode 100644
index 9a8d9f0..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.ImageFormat;
-import android.hardware.Camera;
-import android.util.Log;
-import android.widget.ImageView;
-
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Random;
-
-public class ExposureCompensationTest extends CameraTests {
-
-    private static final String TAG = "ExposureCompensationTest";
-
-    /** Records the current exposure level. */
-    private float mExposureLevel;
-    /** Lock for the camera object.*/
-    private final Object mProcessingImage = new Object();
-    /** Lock for the camera's auto focusing task.*/
-    private final Object mAutoFocusing = new Object();
-    /** Memory address of the native test handler.*/
-    private long mTestHandler;
-    /** Test results. */
-    private int[] mTestResults;
-    /** Number of sub-tests. */
-    private int mNumTests;
-    /** Camera Parameters. */
-    private Camera.Parameters mParams;
-    /** Debug results in text. */
-    private String mDebugText;
-
-    private static ExposureCompensationTest singletonTest = null;
-
-    private ExposureCompensationTest(){
-        super();
-    }
-
-    /** Prepares the camera and the related parameters for the test.*/
-    public void updateCamera() {
-        mParams = mTestCamera.getParameters();
-        Log.v(TAG, String.format("Exposure level is from %d to %d",
-                                 mParams.getMinExposureCompensation(),
-                                 mParams.getMaxExposureCompensation()));
-        mNumTests = (int) ((float) (mParams.getMaxExposureCompensation() -
-                                    mParams.getMinExposureCompensation())
-                            * mParams.getExposureCompensationStep());
-        mTestResults = new int[mNumTests + 1];
-        for (int i = 0; i < mNumTests + 1; ++i) {
-            mTestResults[i] = CameraTests.CAMERA_TEST_NOT_RUN;
-        }
-    }
-
-    public static synchronized ExposureCompensationTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new ExposureCompensationTest instance");
-            singletonTest = new ExposureCompensationTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        mDebugText = new String();
-        // Creates a native test handler with a 120x160 pixel debug output
-        mTestHandler = createExposureCompensationTest(200, 280);
-    }
-
-    @Override
-    public synchronized void run(int index){
-        Log.v(TAG, "ExposureCompensationTest thread started!");
-
-        int testRangeMin, testRangeMax;
-        if (index == 0) {
-            testRangeMin = mParams.getMinExposureCompensation();
-            testRangeMax = mParams.getMaxExposureCompensation();
-        } else {
-            testRangeMin = (int) ((float)(index - 1) / mParams.getExposureCompensationStep())
-                    + mParams.getMinExposureCompensation();
-            testRangeMax = (int) ((float)(index) / mParams.getExposureCompensationStep())
-                    + mParams.getMinExposureCompensation();
-        }
-
-        /** Checks for each exposure compensation setting within the test range.*/
-        for (int i = testRangeMin;
-                i <= testRangeMax; i += 1){
-            mExposureLevel = i * mParams.getExposureCompensationStep();
-            Log.v(TAG, String.format("Current exposure level is %d", i));
-            int mCameraExposure;
-
-            do{
-                mParams.setExposureCompensation(i);
-                mTestCamera.setParameters(mParams);
-
-                try{
-                    Log.v(TAG, "Waiting");
-                    Thread.sleep(4000);
-                    Log.v(TAG, "END Waiting");
-                } catch (InterruptedException e){
-                    //TODO: error handling.
-                }
-
-                mParams = mTestCamera.getParameters();
-                mCameraExposure = mParams.getExposureCompensation();
-                Log.v(TAG, String.format("Camera exposure level is %d", mCameraExposure));
-            } while (mCameraExposure != i);
-
-            mTestCamera.takePicture(null, null, null, mTestJpegListener);
-
-            synchronized (mProcessingImage) {
-                try{
-                    Log.v(TAG, "Start waiting for Image");
-                    mProcessingImage.wait();
-                } catch (InterruptedException e){
-                    Log.v(TAG, "Callback wait fails!");
-                }
-            }
-        }
-
-        mDebugText = processExposureCompensationTest(mTestHandler);
-        displayHandlerDebugOutput(mTestHandler);
-
-        Log.v(TAG, "Callback has returned!");
-        mParams.setExposureCompensation(0);
-        mTestCamera.setParameters(mParams);
-    }
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-            Log.v(TAG, String.format("Current exposure is %f", mExposureLevel));
-
-            Bitmap inputImage;
-
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            inputImage.recycle();
-            data = null;
-            inputImage = null;
-            System.gc();
-
-            createExposureCompensationClass(bufferAddress, mTestHandler,
-                                            getCheckerCenter(), getCheckerRadius(),
-                                            mExposureLevel);
-            mCamera.startPreview();
-
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    @Override
-    public String getTestName(int index) {
-        switch (index) {
-            case 0:
-                return "EC All Range";
-            default:
-                return String.format("EC %d -> %d", (index - mNumTests / 2 - 1) * 10,
-                                     (index - mNumTests / 2) * 10);
-        }
-    }
-
-    @Override
-    public int getResult(int index) {
-        return mTestResults[index];
-    }
-
-    @Override
-    public int getNumTests() {
-        return mNumTests + 1;
-    }
-
-    @Override
-    public String getTestName() {
-        return "Exposure Compensation Test: \n";
-    }
-
-    @Override
-    public String getDebugText() {
-        return mDebugText;
-    }
-
-    private native long createExposureCompensationTest(int outputHeight, int outputWidth);
-
-    private native void createExposureCompensationClass(long bufferAddress, long handlerAddress,
-            long checkerCenterAddress, long checkerAadiusAddress, float mExposureLevel);
-
-    private native String processExposureCompensationTest(long handlerAddress);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java
deleted file mode 100644
index 9ff559f..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.ImageFormat;
-import android.graphics.Rect;
-import android.hardware.Camera;
-import android.hardware.Camera.Area;
-import android.util.Log;
-import android.widget.ImageView;
-
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Implements a test to verify whether the camera metering system works as
- * described in the API.
- *
- * The test consists two sub-categories. The first one has tests with only
- * one metering area defined. The second one has tests with two metering areas
- * defined. For each single sub-test, we use a random number generator to
- * decide where to put some of the metering areas to and how much weight should
- * be assigned to each area. For different tests, we use different ways to
- * define other metering areas and their weight, in order to cover all possible
- * fail cases. The metering areas are contrained to the grey squares in the
- * bottom of the color checker.
- */
-public class MeteringTest extends CameraTests {
-
-    private static final String TAG = "MeteringTest";
-
-    /** A long wait.*/
-    private static final int LONG_SLEEP = 4000;
-    /** Debug result in text. */
-    private String mDebugText;
-    /** Thread lock. */
-    private final Object mProcessingImage = new Object();
-    /** Memory address of the native test handler. */
-    private long mTestHandler;
-    /** The maximum number of metering area the device supports. */
-    private int mMaxNumMeteringArea;
-    /** The metering areas. */
-    private List<Camera.Area> mGreyAreas;
-    /** The coordinates of the grey squares on the color checker. */
-    private int[] mGreyCoordinates = new int[24];
-    /** Random number generator. */
-    private final Random mRandomGenerator = new Random();
-    /** Reference comparison result for tests. */
-    private ArrayList<Boolean>  mReferenceCompareResults;
-    /** Number of tests in the same instance. */
-    private int mTestCount;
-    /** Reference test logs. */
-    private ArrayList<String> mReferenceLogs;
-    /** Test result to show. */
-    private int[] mTestResults;
-    /** Number of tests. */
-    private int mNumTests;
-    /** Camera Parameters. */
-    private Camera.Parameters mParams;
-    /** Singleton test instance. */
-    private static MeteringTest singletonTest = null;
-
-    /** Constructs a <code>MeteringTest</code> instance with the given
-     * camera pointer.
-     */
-    private MeteringTest() {
-        super();
-    }
-
-    public void updateCamera() {
-        // Looks up how many metering area the device supports.
-        mParams = mTestCamera.getParameters();
-        mMaxNumMeteringArea = mParams.getMaxNumMeteringAreas();
-        Log.v(TAG, String.format("Maximum number if metering area is %d", mMaxNumMeteringArea));
-        if (mMaxNumMeteringArea == 0) {
-            mDebugText = "Custom Metering not supported!";
-            Log.v(TAG, "Custom Metering not supported");
-        }
-    }
-
-    public static synchronized MeteringTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new MeteringTest instance");
-            singletonTest = new MeteringTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        // Creates a native metering test handler.
-        mTestHandler = createMeteringTest();
-        mDebugText = new String();
-        mReferenceCompareResults = new ArrayList<Boolean>();
-        mReferenceLogs = new ArrayList<String>();
-        mNumTests = 3;
-        mTestResults = new int[mNumTests];
-        for (int i = 0; i < mNumTests; ++i) {
-            mTestResults[i] = CameraTests.CAMERA_TEST_NOT_RUN;
-        }
-    }
-
-    /**
-     * Runs the metering test instance.
-     */
-    @Override
-    public synchronized void run(int index) {
-        if (index == 0) {
-            run(1);
-            run(2);
-            return;
-        }
-        Log.v(TAG, "MeteringTest thread started!");
-
-        // Finds the coordinates of the grey squares on the color checker.
-        // The coordinate system has (-1000, -1000) on the upper left corner.
-        // And (1000, 1000) on the bottom right corner.
-        findGreyCoordinates(mGreyCoordinates, getCheckerCenter(), getCheckerRadius());
-
-        if (mMaxNumMeteringArea > 0) {
-            mTestCount = 0;
-            // Runs the metering tests category by category.
-            switch (index) {
-                case 1:
-                    runOneAreaTest();
-                    break;
-                case 2:
-                    if (mMaxNumMeteringArea > 1) {
-                        runTwoAreasTest();
-                    }
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        mParams = mTestCamera.getParameters();
-        mParams.setMeteringAreas(null);
-        mTestCamera.setParameters(mParams);
-
-        boolean[] testCompareResults = new boolean[2 * mTestCount];
-
-        // Processes the image data taken so far and stores the test results.
-        processMeteringTest(mTestHandler, testCompareResults);
-        // Prepares debug output based on the test results.
-        prepareDebugText(testCompareResults, index);
-
-        mReferenceCompareResults.clear();
-        mReferenceLogs.clear();
-    }
-
-    /**
-     * Prepares the test results in HTML text string to show in the UI.
-     *
-     * If the test result is the same as the reference result, the text will be
-     * shown in green. Otherwise it would be shown as red.
-     *
-     * @param testCompareResults the array storing the comparison results from
-     * the data taken by the camera so far.
-     */
-    private void prepareDebugText(boolean[] testCompareResults, int index) {
-        mDebugText = "";
-        boolean groupTestPassed = true;
-        for (int i = 0; i < mTestCount; ++i) {
-              String testLog;
-              boolean testPassed = true;
-              testLog = mReferenceLogs.get(i);
-              mDebugText += (testLog + "<br/>");
-
-              if (testCompareResults[i * 2] == mReferenceCompareResults.get(i * 2)) {
-                  mDebugText += String.format(
-                      "Picture 1 equivalent to Picture 2 is %b \n",
-                      testCompareResults[i * 2]);
-              } else {
-                  mDebugText += String.format(
-                      "Picture 1 equivalent to Picture 2 is %b \n",
-                      testCompareResults[i * 2]);
-                  testPassed = false;
-              }
-
-              if (testCompareResults[i * 2 + 1] == mReferenceCompareResults.get(i * 2 + 1)) {
-                  mDebugText += String.format(
-                      "Picture 1 darker than Picture 2 is %b \n",
-                      testCompareResults[i * 2 + 1]);
-              } else {
-                  mDebugText += String.format(
-                      "Picture 1 darker than Picture 2 is %b \n",
-                      testCompareResults[i * 2 + 1]);
-                  testPassed = false;
-              }
-
-              if (testPassed) {
-                  mDebugText += "Test passed! \n";
-              } else {
-                  mDebugText += "Test failed! \n";
-                  groupTestPassed = false;
-              }
-              Log.v(TAG, String.format("%s", mDebugText));
-         }
-
-        if (groupTestPassed) {
-            mTestResults[index] = CameraTests.CAMERA_TEST_SUCCESS;
-        } else {
-            mTestResults[index] = CameraTests.CAMERA_TEST_FAILURE;
-        }
-
-    }
-
-    /**
-     * Runs tests to check whether the metering functionalities work properly
-     * when one metering area is added.
-     */
-    private void runOneAreaTest() {
-        int weight1;
-        int weight2;
-        int square1;
-        int square2;
-
-        Log.v(TAG, "Running one area Test");
-
-        // Test case 1: Two images have the same metering area. Image 1 has
-        // a diffent weight than Image 2. The result images should be
-        // identical.
-        // Tests whether weight normalization works.
-        square1 = mRandomGenerator.nextInt(6);
-        weight1 = mRandomGenerator.nextInt(100) + 1;
-        runSingleTest(square1, square1, weight1);
-
-        square2 = square1;
-        weight2 = mRandomGenerator.nextInt(100) + 901;
-        runSingleTest(square2, square2, weight2);
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        Log.v(TAG, String.format("Running test for %d square with weights %d, %d",
-                                 square1, weight1, weight2));
-        mReferenceLogs.add(String.format(
-            "Running test for %d 1x1 square with weights %d, %d", square1, weight1, weight2));
-        ++mTestCount;
-
-        // Test case 2: Two images have different metering areas. Image 1 has
-        // one of the grey squares as its metering area. Image 2 has a darker
-        // grey square as its metering area. The weights for both images are
-        // the same. Image 1 is expected to be darker than Image 2.
-        // Tests whether metering on uni-brightness patches work.
-        square1 = mRandomGenerator.nextInt(5);
-        weight1 = mRandomGenerator.nextInt(1000) + 1;
-        runSingleTest(square1, square1, weight1);
-
-        square2 = mRandomGenerator.nextInt(6 - square1 - 1) + square1 + 1;
-        weight2 = weight1;
-        runSingleTest(square2, square2, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x1 square with weight %d", square1, square2, weight1));
-        ++mTestCount;
-
-        // Test case 3: Two images have different metering areas. Image one has
-        // one of the grey squares as its metering area. Image 2 has a
-        // rectangle which contains Image 1's metering area and the neighboring
-        // darker grey square. The weights for both tests are the same. Image 1
-        // is expected to be darker than Image 2.
-        // Tests whether metering on patches with different brightness works.
-        square1 = mRandomGenerator.nextInt(5);
-        weight1 = mRandomGenerator.nextInt(1000) + 1;
-        runSingleTest(square1, square1, weight1);
-
-        square2 = square1;
-        weight2 = weight1;
-        runSingleTest(square2, square2 + 1, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d 1x1, 1x2 square with weight %d", square1, weight1));
-        ++mTestCount;
-
-        // Test case 4: Two images have different metering areas. Image one has
-        // two neighboring grey squares as its metering area. Image 2 has two
-        // darker neighboring grey squares as its metering area. Weights are
-        // the same for both images. Image 1 is expected to be darker than
-        // Image 2.
-        // Tests whether metering on two mixed-brightness patches work.
-        square1 = mRandomGenerator.nextInt(4);
-        weight1 = mRandomGenerator.nextInt(1000) + 1;
-        runSingleTest(square1, square1 + 1, weight1);
-
-        square2 = mRandomGenerator.nextInt(5 - square1 - 1) + square1 + 1;
-        weight2 = weight1;
-        runSingleTest(square2, square2 + 1, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x2 square with weight %d", square1, square2, weight1));
-        ++mTestCount;
-
-        // Test case 5: Two images have different metering areas. Image one has
-        // three neighboring grey squares as its metering area. Image 2 has
-        // three darker neighboring grey squares as its metering area. Weights
-        // are the same. Image 1 is expected to be darker than Image 2.
-        // Tests whether metering on three mixed-brightness patches work.
-        square1 = mRandomGenerator.nextInt(3);
-        weight1 = mRandomGenerator.nextInt(1000) + 1;
-        runSingleTest(square1, square1 + 2, weight1);
-
-        square2 = mRandomGenerator.nextInt(4 - square1 - 1) + square1 + 1;
-        weight2 = weight1;
-        runSingleTest(square2, square2 + 2, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x3 square with weight %d", square1, square2, weight1));
-        ++mTestCount;
-    }
-
-    /**
-     * Runs metering tests to verify the functionalities when there are two
-     * areas set as the metering area.
-     */
-    private void runTwoAreasTest() {
-        int[] weight1 = new int[2];
-        int[] weight2 = new int[2];
-        int[] square1Start = new int[2];
-        int[] square2Start = new int[2];
-        int[] square1End = new int[2];
-        int[] square2End = new int[2];
-
-        Log.v(TAG, "Running two-area Test");
-
-        // Test case 1: Image 1 has two metering areas. They are two adjacent
-        // grey squares (each set as a metering area). The two areas have the
-        // same weight. Image 2 has one metering area, which is the combination
-        // of Image 1's two metering areas as a rectangle. The weight is the
-        // same as that of Image 1's individual area. Image 1 is expected to
-        // be equivalent to Image 2.
-        // Tests whether having seperating a metering area into two will yield
-        // the same result.
-        square1Start[0] = mRandomGenerator.nextInt(5);
-        square1End[0] = square1Start[0];
-        weight1[0] = mRandomGenerator.nextInt(1000) + 1;
-        square1Start[1] = square1Start[0] + 1;
-        square1End[1] = square1Start[1];
-        weight1[1] = weight1[0];
-        runMultipleAreaTest(square1Start, square1End, weight1);
-
-        square2Start[0] = square1Start[0];
-        weight2[0] = weight1[0];
-        runSingleTest(square2Start[0], square2Start[0] + 1, weight2[0]);
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x1 square with weight %d",
-            square1Start[0], square1Start[1], weight1[0]));
-        ++mTestCount;
-
-        // Test case 2: Image 1 has two metering areas. They are two random
-        // grey squareson the color checker. The brighter square has a larger
-        // weight than the darker square. Image 2 has the same two metering
-        // areas as Image 1. The weights for both are equal to the weight of
-        // the darker square in Image 1, which is smaller than the weight of
-        // the brighter square in Image 1. Image 1 is expected to be darker
-        // than Image 2.
-        // Tests whether giving one of the two metering areas a different
-        // weight would change the image in the correct way.
-        square1Start[0] = mRandomGenerator.nextInt(4);
-        square1End[0] = square1Start[0];
-        weight1[0] = mRandomGenerator.nextInt(100) + 901;
-        square1Start[1] = mRandomGenerator.nextInt(5 - square1Start[0] - 1) + square1Start[0] + 1;
-        square1End[1] = square1Start[1];
-        weight1[1] = mRandomGenerator.nextInt(100) + 1;
-        runMultipleAreaTest(square1Start, square1End, weight1);
-
-        square2Start[0] = square1Start[0];
-        square2End[0] = square2Start[0];
-        weight2[0] = weight1[1];
-        square2Start[1] = square1Start[1];
-        square2End[1] = square1End[1];
-        weight2[1] = weight2[0];
-        runMultipleAreaTest(square2Start, square2End, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x1 square with weight %d, %d",
-            square1Start[0], square1Start[1], weight1[0], weight2[1]));
-        ++mTestCount;
-
-        // Test case 3: Image 1 has two metering areas. Both are set to the
-        // same random grey square on the color checker. The weight for both
-        // are the same. Image 2 has one meterig area, which is the same as
-        // Image 1's chosen grey square. The weight for it is the same as
-        // Image 1's weight for one metering area. Image 1 is expected to be
-        // equivalent to Image 2.
-        // Tests whether defining overlapping metering area works.
-        square1Start[0] = mRandomGenerator.nextInt(6);
-        square1End[0] = square1Start[0];
-        weight1[0] = mRandomGenerator.nextInt(1000) + 1;
-        square1Start[1] = square1Start[0];
-        square1End[1] = square1Start[1];
-        weight1[1] = weight1[0];
-        runMultipleAreaTest(square1Start, square1End, weight1);
-
-        square2Start[0] = square1Start[0];
-        square2End[0] = square2Start[0];
-        weight2[0] = weight1[0];
-        runSingleTest(square2Start[0], square2End[0], weight2[0]);
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add(String.format(
-            "Running test for %d 1x1 square with weight %d,", square1Start[0], weight1[0]));
-        ++mTestCount;
-
-        // Test case 4: Image 1 has two metering areas. The first one is a
-        // grey square on the color checker. The second one is a rectangle
-        // containing the first metering area's grey square and its neighboring
-        // darker square. The weights for both metering area are the same.
-        // Image 2 has two metering areas. The first one is the same grey
-        // square as Image 1's first metering area. The second one is the
-        // neighboring darker grey square. The weight for the brighter square
-        // is double the weight of Image 1's weights for each metering area.
-        // The weight for the Image 2's darker grey square is the same as
-        // Image 1's weight for each of its metering areas. Image 1 is expected
-        // to be equivalent to Image 2.
-        // Tests whether the weights for overlapping metering area add up.
-        square1Start[0] = mRandomGenerator.nextInt(2);
-        square1End[0] = square1Start[0];
-        weight1[0] = mRandomGenerator.nextInt(500) + 1;
-        square1Start[1] = square1Start[0];
-        square1End[1] = square1Start[1] + 1;
-        weight1[1] = weight1[0];
-        runMultipleAreaTest(square1Start, square1End, weight1);
-
-        square2Start[0] = square1Start[0];
-        square2End[0] = square1End[0];
-        weight2[0] = weight1[0] * 2;
-        square2Start[1] = square2Start[0] + 1;
-        square2End[1] = square2Start[1];
-        weight2[1] = weight1[1];
-        runMultipleAreaTest(square2Start, square2End, weight2);
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add(String.format(
-            "Running test for %d 1x2 1x1 and 1x2 square with weight %d,",
-            square1Start[0], weight1[0]));
-        ++mTestCount;
-    }
-
-    /**
-     * Runs the metering test when multiple metering areas are defined.
-     *
-     * @param startIndex the array storing the index of the grey square where
-     * one metering area starts
-     * @param endIndex the array storing the index of the grey square where one
-     * metering area ends.
-     * @param weight the array storing the weight for each metering area.
-     */
-    private void runMultipleAreaTest(int[] startIndex, int[] endIndex, int[] weight) {
-        int numAreas = startIndex.length;
-        mParams = mTestCamera.getParameters();
-        List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
-
-        for (int i = 0; i < numAreas; ++i) {
-            meteringAreas.add(makeArea(startIndex[i], endIndex[i], weight[i]));
-            Log.v(TAG, String.format("Add metering area for %d, %d, %d",
-                                     startIndex[i], endIndex[i], weight[i]));
-        }
-        mParams.setMeteringAreas(meteringAreas);
-        mTestCamera.setParameters(mParams);
-        takePicture();
-    }
-
-    /**
-     * Runs the metering test when one metering area is defined.
-     *
-     * @param startIndex the index of the grey square where the metering area
-     * starts
-     * @param endIndex the index of the grey square where the metering area
-     * ends.
-     * @param weight the weight for the metering area.
-     */
-    private void runSingleTest(int startIndex, int endIndex, int weight) {
-        mParams = mTestCamera.getParameters();
-        List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
-
-        Log.v(TAG, String.format("Single test for %d, %d, %d", startIndex, endIndex, weight));
-        meteringAreas.add(makeArea(startIndex, endIndex, weight));
-        mParams.setMeteringAreas(meteringAreas);
-        mTestCamera.setParameters(mParams);
-        takePicture();
-    }
-
-    /**
-     * Takes picture with the camera instance linked to this test class.
-     */
-    private void takePicture() {
-        // Waits for the metering to be stable
-        try{
-            Log.v(TAG, "Waiting for metering");
-            Thread.sleep(LONG_SLEEP);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e) {}
-
-        mTestCamera.takePicture(null, null, null, mTestJpegListener);
-
-        // Locks thread until picture is taken and ready for processing.
-        synchronized (mProcessingImage) {
-            try{
-                Log.v(TAG, "Start waiting for Image");
-
-                mProcessingImage.wait();
-            } catch (InterruptedException e) {
-                Log.v(TAG, "Callback wait fails!");
-            }
-        }
-    }
-
-    /**
-     * Constructs a <code>Camera.Area</code> object of the metering area.
-     * Given the start and end index of one metering area, it takes the upper
-     * left corner of the starting square and the bottom right corner of the
-     * end square to construct an Area.
-     *
-     * @param startIndex the index of the grey square where the metering area
-     * starts
-     * @param endIndex the index of the grey square where the metering area
-     * ends
-     * @param weight the weight of this metering area.
-     *
-     * @return a <code>Camera.Area</code> object which represents this metering
-     * area
-     */
-    private Camera.Area makeArea(int startIndex, int endIndex, int weight) {
-        Rect areaRect = new Rect(mGreyCoordinates[startIndex * 4],
-                                 mGreyCoordinates[startIndex * 4 + 1],
-                                 mGreyCoordinates[endIndex * 4 + 2],
-                                 mGreyCoordinates[endIndex * 4 + 3]);
-        Camera.Area area = new Camera.Area(areaRect, weight);
-
-        return area;
-    }
-
-    @Override
-    public String getDebugText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getResultText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getTestName() {
-        return "Metering Test: \n";
-    }
-
-    @Override
-    public String getTestName(int index) {
-        switch (index) {
-            case 0:
-                return "Run all tests";
-            case 1:
-                return "One metering area tests";
-            case 2:
-                return "Multiple metering areas tests";
-            default:
-                return "";
-        }
-    }
-
-    @Override
-    public int getResult(int index) {
-        return mTestResults[index];
-    }
-
-    @Override
-    public int getNumTests() {
-        return mNumTests;
-    }
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-            Bitmap inputImage;
-            try {
-                FileOutputStream outStream = new FileOutputStream(
-                    String.format("/sdcard/metering%d.jpg", System.currentTimeMillis()));
-                outStream.write(data);
-                outStream.close();
-            } catch (FileNotFoundException e) {
-            } catch (IOException e) {}
-
-            // Decodes the input data of the camera.
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-
-            // Records the memory address of the native image class instance.
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            // Cleans up the memory taken by the bitmap.
-            inputImage.recycle();
-            data = null;
-            inputImage = null;
-            System.gc();
-
-            // Add the image data to the native test handler.
-            createMeteringClass(bufferAddress, mTestHandler,
-                                getCheckerCenter(), getCheckerRadius());
-            mCamera.startPreview();
-
-            // Releases thread lock after the image is processed.
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    /**
-     * Finds the coordinates of the grey squares on the color checker.
-     * The coordinates are computed by using the checker center and radius.
-     * The coordinates are converted to a system with (-1000, -1000) in the
-     * upper left corner and (1000, 1000) in the  bottom right corner.
-     *
-     * @param greyCoordinates the array to store the coordinates of the grey
-     * squares
-     * @param checkerCenterAddress the memory address pointing to the vector
-     * storing the color checker's centers.
-     * @param checkerRadiusAddress the memory address pointing to the vetor
-     * storing the color checker's radius.
-     */
-    private native void findGreyCoordinates(int[] greyCoordinates,
-                                            long checkerCenterAddress, long checkerRadiusAddress);
-
-    /**
-     * Creates the native metering test handler with no debug image.
-     *
-     * @return the memory address pointing to the native test handler instance
-     */
-    private native long createMeteringTest();
-
-    /**
-     * Adds the data from the native image class instance to the native test
-     * handler.
-     *
-     * @param bufferAddress the meory address of the native image class
-     * @param handlerAddress the memory address of the native test handler
-     * @param checkerCenterAddress the memory address of the checker cneters
-     * @param checkerRadiusAddress the meory address of the checker radius
-     */
-    private native void createMeteringClass(long bufferAddress, long handlerAddress,
-                                            long checkerCenterAddress,
-                                            long checkerRadiusAddress);
-
-    /**
-     * Process the data stored in the native test handler and stores the
-     * comparison results.
-     *
-     * @param handlerAddress the memory address of the native test handler
-     * @param testCompareResults the boolean array to store the test comparison
-     * results
-     */
-    private native void processMeteringTest(long handlerAddress, boolean[] testCompareResults);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java
deleted file mode 100644
index a4111eb..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.ImageFormat;
-import android.hardware.Camera;
-import android.util.Log;
-import android.widget.ImageView;
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import java.util.List;
-
-/**
- * Implements a test to verify whether the correlated color temperatures (CTT)
- * of the supported white balance modes are inside the range camera
- * manufacturers generally agree on.
- *
- * The test assumes that the Daylight white balance mode has a CCT of 5200K,
- * which is widely agreed in industry and academics. It then use this as a
- * benchmark and compare images taken with other white balance settings.
- * Using the pixel values of the grey squares on the color checker, the CCT
- * of other white balance modes can be computed. The reference ranges were
- * summarized with the help of online resources. For the Auto mode, the
- * reference CCT is computed as the CCT that will keep the grey squares appear
- * grey in the result image.
- */
-public class WhiteBalanceTest extends CameraTests {
-
-    private static final String TAG = "WhiteBalanceTest";
-
-    /** Current white balance mode. */
-    private String mWhiteBalance;
-    /** Array to store the reference CCT's of each mode. */
-    private int[][] mReferenceTemperature;
-    /** List of supported white balance mode on a device. */
-    private List<String> mWhiteBalanceList;
-    /** The index of the white balance mode "Auto". */
-    private int mAutoId;
-
-    /** Debug results in text. */
-    private String mDebugText;
-    /** Memory address of the native test handler instance. */
-    private long mTestHandler;
-    /** Thread lock. */
-    private final Object mProcessingImage = new Object();
-    /** Test result to show. */
-    private int[] mTestResults;
-    /** Number of test. */
-    private int mNumTests;
-    /** Camera Parameters. */
-    private Camera.Parameters mParams;
-    /** Singleton test instance. */
-    private static WhiteBalanceTest singletonTest = null;
-    /** Boolean to check whehter daylight wb has been recorded. */
-    private boolean mHasDaylight = false;
-
-    /**
-     * Constructs a <code>WhiteBalanceTest</code> instance with a given
-     * Camera pointer.
-     */
-    private WhiteBalanceTest() {
-        super();
-    }
-
-    public void updateCamera() {
-        mAutoId = 0;
-        mHasDaylight = false;
-        mParams = mTestCamera.getParameters();
-        mWhiteBalanceList = mParams.getSupportedWhiteBalance();
-        mNumTests = mWhiteBalanceList.size() + 1;
-        mTestResults = new int[mNumTests];
-        for (int i = 0; i < mNumTests; ++i) {
-            mTestResults[i] = CameraTests.CAMERA_TEST_NOT_RUN;
-        }
-
-        if (mWhiteBalanceList != null) {
-            mReferenceTemperature = new int[mWhiteBalanceList.size()][2];
-
-            // Sets the reference CCT of the supported white balance modes
-            for (int i = 0; i < mWhiteBalanceList.size(); i++) {
-                setReferenceTemperature(i, mWhiteBalanceList.get(i));
-                if (mWhiteBalanceList.get(i).equals("auto")) {
-                    mAutoId = i;
-                }
-            }
-        }
-    }
-
-    public static synchronized WhiteBalanceTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new WhiteBalanceTest instance");
-            singletonTest = new WhiteBalanceTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        mDebugText = new String();
-        // Creates a native white balance test handler.
-        // mTestHandler stores the memory address of this instance.
-        mTestHandler = createWhiteBalanceTest();
-    }
-
-    private void initializeWhiteBalanceTest() {
-        mWhiteBalance = "daylight";
-        takePicture(mWhiteBalance);
-        int colorTemperature = processWhiteBalanceTest(mTestHandler);
-
-        setReferenceTemperature(mAutoId, colorTemperature);
-        mHasDaylight = true;
-    }
-
-    private void takePicture(String whiteBalance) {
-        mParams.setWhiteBalance(whiteBalance);
-        mTestCamera.setParameters(mParams);
-
-        try{
-            Log.v(TAG, "Waiting for white balance to adjust");
-            Thread.sleep(4000);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e) {}
-
-        mTestCamera.takePicture(null, null, null, mTestJpegListener);
-
-        // Thread locks until image capture is done
-        synchronized (mProcessingImage) {
-            try{
-                Log.v(TAG, "Start waiting for Image");
-                mProcessingImage.wait();
-            } catch (InterruptedException e) {
-                Log.v(TAG, "Callback wait fails!");
-            }
-        }
-    }
-
-    /**
-     * Runs the white balance camera test instance.
-     */
-    @Override
-    public synchronized void run(int index) {
-        Log.v(TAG, "WhiteBalanceTest thread started!");
-
-        if (!mHasDaylight) {
-            initializeWhiteBalanceTest();
-        }
-
-        if (index != 0) {
-            // Retrieves the list of supported white balance mode.
-            mParams = mTestCamera.getParameters();
-
-            int i = index - 1;
-            mWhiteBalance = mWhiteBalanceList.get(i);
-
-            Log.v(TAG, "Current white balance is " + mWhiteBalance);
-
-            takePicture(mWhiteBalance);
-
-            // Processes the white balance test data in the native code.
-            // Returns an array of CCT of each white balance modes, given the CCT
-            // of the "Daylight" mode is 5200K.
-            int colorTemperature = 0;
-
-            Log.v(TAG, "Finished taking picture, ready to process");
-            colorTemperature = processWhiteBalanceTest(mTestHandler);
-
-            // Records the index of the "Auto" white balance mode
-            if (mWhiteBalance.equals("daylight")) {
-                setReferenceTemperature(mAutoId, colorTemperature);
-                prepareDebugText(5200, index);
-                // Computes the reference CCT range of the "Auto" mode. Assuming that
-                // all grey squares on the color checker should be imaged as grey under
-                // a CCT, this CCT is used as a middle point to provide a range.
-                //setReferenceTemperature(mAutoId, colorTemperature[mWhiteBalanceList.size()]);
-            } else {
-                // Prepares the debug output.
-                prepareDebugText(colorTemperature, index);
-            }
-        } else {
-            for (int i = 0; i < mWhiteBalanceList.size(); i++) {
-                run(i + 1);
-            }
-        }
-
-        mParams.setWhiteBalance("auto");
-        mTestCamera.setParameters(mParams);
-    }
-
-    /**
-     * Prepares the debug results in HTML text. For each white balance mode,
-     * the CCT will be printed in green if it is in the reference range and
-     * red otherwise. The reference CCT range is also printed below, with
-     * green meaning the CCT range is satisfied and red otherwise.
-     *
-     * @param colorTemperature the CCT of the supported white balance modes
-     */
-    private void prepareDebugText(int colorTemperature, int index) {
-        mDebugText += String.format("CCT Ref is %d, %d, and CCT is %d",
-                                  mReferenceTemperature[index - 1][0],
-                                  mReferenceTemperature[index - 1][1],
-                                  colorTemperature);
-        Log.v(TAG, String.format("CCT Ref is %d, %d, and CCT is %d",
-                                  mReferenceTemperature[index - 1][0],
-                                  mReferenceTemperature[index - 1][1],
-                                  colorTemperature));
-        if ((colorTemperature >= mReferenceTemperature[index - 1][0]) &&
-                (colorTemperature <= mReferenceTemperature[index - 1][1])) {
-            mTestResults[index] = CameraTests.CAMERA_TEST_SUCCESS;
-        } else {
-            mTestResults[index] = CameraTests.CAMERA_TEST_FAILURE;
-        }
-
-    }
-
-    @Override
-    public String getDebugText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getResultText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getTestName() {
-        return "White Balance Test: \n";
-    }
-
-    @Override
-    public String getTestName(int index) {
-        if (index != 0){
-            return String.format("%s mode test", mWhiteBalanceList.get(index - 1));
-        } else {
-            return "Run all tests";
-        }
-    }
-
-    @Override
-    public int getResult(int index) {
-        return mTestResults[index];
-    }
-
-    @Override
-    public int getNumTests() {
-        return mNumTests;
-    }
-
-    /**
-     * Sets the reference temperatures for the white balance modes of
-     * incandescent, fluorescent, warm-fluorescent, daylight, cloudy, shade
-     * and twilight. These are the currently supported White balance mode
-     * listed on the Android camera API.
-     *
-     * The reference range are summarized based on the published settings of
-     * Canon, Nikon and the references from Wikipedia on color temperature.
-     *
-     * @param i the index of the current white balance mode
-     * @param referenceWhiteBalance the name of the white balance mode.
-     */
-    private void setReferenceTemperature(int i, String referenceWhiteBalance) {
-        if (referenceWhiteBalance.equals("incandescent")) {
-            mReferenceTemperature[i][0] = 2500;
-            mReferenceTemperature[i][1] = 3500;
-        } else if (referenceWhiteBalance.equals("fluorescent")) {
-            mReferenceTemperature[i][0] = 3000;
-            mReferenceTemperature[i][1] = 6500;
-        } else if (referenceWhiteBalance.equals("warm-fluorescent")) {
-            mReferenceTemperature[i][0] = 2500;
-            mReferenceTemperature[i][1] = 3000;
-        } else if (referenceWhiteBalance.equals("daylight")) {
-            mReferenceTemperature[i][0] = 5000;
-            mReferenceTemperature[i][1] = 5400;
-        } else if (referenceWhiteBalance.equals("cloudy-daylight")) {
-            mReferenceTemperature[i][0] = 5500;
-            mReferenceTemperature[i][1] = 7500;
-        } else if (referenceWhiteBalance.equals("shade")) {
-            mReferenceTemperature[i][0] = 6800;
-            mReferenceTemperature[i][1] = 8000;
-        } else if (referenceWhiteBalance.equals("twilight")) {
-            mReferenceTemperature[i][0] = 10000;
-            mReferenceTemperature[i][1] = 14000;
-        }
-    }
-
-    /** Sets a reference range of CCT based on a given middle point CCT.
-     * The rerence range is from -10% of the CCT value to +10%.
-     *
-     * @param i the index of the current white balance mode
-     * @param t the middle point CCT.
-     */
-    private void setReferenceTemperature(int i, int t) {
-        mReferenceTemperature[i][0] = (int)((double)t * 0.9);
-        mReferenceTemperature[i][1] = (int)((double)t * 1.1);
-    }
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-            Bitmap inputImage;
-            try {
-                FileOutputStream outStream = new FileOutputStream(
-                        String.format("/sdcard/wb%d.jpg", System.currentTimeMillis()));
-                outStream.write(data);
-                outStream.close();
-            } catch (FileNotFoundException e) {
-            } catch (IOException e) {}
-            // Decodes the camera data to Bitmap and creates a native image
-            // class with the Bitmap.
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            // Cleans up the Bitmap memory space.
-            inputImage.recycle();
-            data = null;
-            inputImage = null;
-            System.gc();
-
-            // Adds the data from the current image base class to the native
-            // white balance test handler.
-            createWhiteBalanceClass(bufferAddress, mTestHandler,
-                                    getCheckerCenter(), getCheckerRadius(), mWhiteBalance);
-
-            mCamera.startPreview();
-
-            // Notifies the thread lock that the image capture is finished
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    /**
-     * Creates a native white balance test handler.
-     *
-     * @return the memory address of the test handler
-     */
-    private native long createWhiteBalanceTest();
-
-    /**
-     * Adds the data of interest from the image class pointed by
-     * <code>bufferAddress</code> to the handler class pointed by
-     * <code>handlerAddress</code> by using the color checker coordinates.
-     * Also sets the white balance of this test.
-     *
-     * @param bufferAddress the memory address of the native image class
-     * containing the current camera captured image
-     * @param handlerAddress the memory address of the native white balance
-     * test handler instance
-     * @param checkerCenterAddress the memory address of the color checker
-     * center coordinates
-     * @param checkerRadiusAddress the memory address of the color checker
-     * radius
-     * @param whiteBalance the white balance mode used for shooting the image
-     */
-    private native void createWhiteBalanceClass(long bufferAddress, long handlerAddress,
-                                                long checkerCenterAddress,
-                                                long checkerRadiusAddress,
-                                                String whiteBalance);
-
-    /**
-     * Processes the white balance test in the native code. This is executed
-     * after the images are taken with all possible white balance modes. It
-     * uses the "Daylight" white balance mode as reference and computes the
-     * CCT of other white balance modes.
-     *
-     * @param handlerAddress the memory address of the native white balance
-     * test handler instance.
-     * @param colorTemperature the array to store the computed CCT of all white
-     * balance modes.
-     */
-    private native int processWhiteBalanceTest(long handlerAddress);
-
-    private native int getAutoTemperature(long handlerAddress);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
index e3d0b6d..58b51a5 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
@@ -146,6 +146,7 @@
     private AtomicInteger mCountCallbacksRemaining = new AtomicInteger();
     private AtomicInteger mCountRawOrDng = new AtomicInteger();
     private AtomicInteger mCountRaw10 = new AtomicInteger();
+    private AtomicInteger mCountRaw12 = new AtomicInteger();
     private AtomicInteger mCountJpg = new AtomicInteger();
     private AtomicInteger mCountYuv = new AtomicInteger();
     private AtomicInteger mCountCapRes = new AtomicInteger();
@@ -658,6 +659,8 @@
                         jsonSurface.put("format", "raw");
                     } else if (format == ImageFormat.RAW10) {
                         jsonSurface.put("format", "raw10");
+                    } else if (format == ImageFormat.RAW12) {
+                        jsonSurface.put("format", "raw12");
                     } else if (format == ImageFormat.JPEG) {
                         jsonSurface.put("format", "jpeg");
                     } else if (format == ImageFormat.YUV_420_888) {
@@ -1004,6 +1007,7 @@
                 mCountJpg.set(0);
                 mCountYuv.set(0);
                 mCountRaw10.set(0);
+                mCountRaw12.set(0);
                 mCountCapRes.set(0);
                 mCaptureRawIsDng = false;
                 mCaptureResults = new CaptureResult[requests.size()];
@@ -1028,13 +1032,16 @@
                             sizes = ItsUtils.getJpegOutputSizes(mCameraCharacteristics);
                         } else if ("raw".equals(sformat)) {
                             formats[i] = ImageFormat.RAW_SENSOR;
-                            sizes = ItsUtils.getRawOutputSizes(mCameraCharacteristics);
+                            sizes = ItsUtils.getRaw16OutputSizes(mCameraCharacteristics);
                         } else if ("raw10".equals(sformat)) {
                             formats[i] = ImageFormat.RAW10;
-                            sizes = ItsUtils.getRawOutputSizes(mCameraCharacteristics);
+                            sizes = ItsUtils.getRaw10OutputSizes(mCameraCharacteristics);
+                        } else if ("raw12".equals(sformat)) {
+                            formats[i] = ImageFormat.RAW12;
+                            sizes = ItsUtils.getRaw12OutputSizes(mCameraCharacteristics);
                         } else if ("dng".equals(sformat)) {
                             formats[i] = ImageFormat.RAW_SENSOR;
-                            sizes = ItsUtils.getRawOutputSizes(mCameraCharacteristics);
+                            sizes = ItsUtils.getRaw16OutputSizes(mCameraCharacteristics);
                             mCaptureRawIsDng = true;
                         } else {
                             throw new ItsException("Unsupported format: " + sformat);
@@ -1170,6 +1177,12 @@
                     ByteBuffer buf = ByteBuffer.wrap(img);
                     int count = mCountRaw10.getAndIncrement();
                     mSocketRunnableObj.sendResponseCaptureBuffer("raw10Image", buf);
+                } else if (format == ImageFormat.RAW12) {
+                    Logt.i(TAG, "Received RAW12 capture");
+                    byte[] img = ItsUtils.getDataFromImage(capture);
+                    ByteBuffer buf = ByteBuffer.wrap(img);
+                    int count = mCountRaw12.getAndIncrement();
+                    mSocketRunnableObj.sendResponseCaptureBuffer("raw12Image", buf);
                 } else if (format == ImageFormat.RAW_SENSOR) {
                     Logt.i(TAG, "Received RAW16 capture");
                     int count = mCountRawOrDng.getAndIncrement();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
index 2011314..b09b90c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
@@ -91,11 +91,21 @@
         }
     }
 
-    public static Size[] getRawOutputSizes(CameraCharacteristics ccs)
+    public static Size[] getRaw16OutputSizes(CameraCharacteristics ccs)
             throws ItsException {
         return getOutputSizes(ccs, ImageFormat.RAW_SENSOR);
     }
 
+    public static Size[] getRaw10OutputSizes(CameraCharacteristics ccs)
+            throws ItsException {
+        return getOutputSizes(ccs, ImageFormat.RAW10);
+    }
+
+    public static Size[] getRaw12OutputSizes(CameraCharacteristics ccs)
+            throws ItsException {
+        return getOutputSizes(ccs, ImageFormat.RAW12);
+    }
+
     public static Size[] getJpegOutputSizes(CameraCharacteristics ccs)
             throws ItsException {
         return getOutputSizes(ccs, ImageFormat.JPEG);
@@ -139,7 +149,7 @@
             buffer.get(data);
             return data;
         } else if (format == ImageFormat.YUV_420_888 || format == ImageFormat.RAW_SENSOR
-                || format == ImageFormat.RAW10) {
+                || format == ImageFormat.RAW10 || format == ImageFormat.RAW12) {
             int offset = 0;
             data = new byte[width * height * ImageFormat.getBitsPerPixel(format) / 8];
             int maxRowSize = planes[0].getRowStride();
@@ -213,6 +223,7 @@
                 return 3 == planes.length;
             case ImageFormat.RAW_SENSOR:
             case ImageFormat.RAW10:
+            case ImageFormat.RAW12:
             case ImageFormat.JPEG:
                 return 1 == planes.length;
             default:
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
index fdf0089..112a6e3 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
@@ -58,7 +58,8 @@
 public class ByodFlowTestActivity extends PassFailButtons.ListActivity {
 
     private final String TAG = "ByodFlowTestActivity";
-    private static final int REQUEST_STATUS = 1;
+    private static final int REQUEST_PROFILE_OWNER_STATUS = 1;
+    private static final int REQUEST_INTENT_FILTERS_STATUS = 2;
 
     private ComponentName mAdminReceiverComponent;
 
@@ -76,10 +77,13 @@
     private TestItem mDisableNonMarketTest;
     private TestItem mEnableNonMarketTest;
     private TestItem mWorkNotificationBadgedTest;
+    private TestItem mWorkStatusBarIconTest;
+    private TestItem mWorkStatusBarToastTest;
     private TestItem mAppSettingsVisibleTest;
     private TestItem mLocationSettingsVisibleTest;
     private TestItem mCredSettingsVisibleTest;
     private TestItem mPrintSettingsVisibleTest;
+    private TestItem mIntentFiltersTest;
     private TestItem mCrossProfileImageCaptureSupportTest;
     private TestItem mCrossProfileVideoCaptureSupportTest;
     private TestItem mCrossProfileAudioCaptureSupportTest;
@@ -140,10 +144,13 @@
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        // Called after queryProfileOwner()
         super.onActivityResult(requestCode, resultCode, data);
-        if (requestCode == REQUEST_STATUS && resultCode == RESULT_OK) {
+        // Called after queryProfileOwner()
+        if (requestCode == REQUEST_PROFILE_OWNER_STATUS && resultCode == RESULT_OK) {
             handleStatusUpdate(data);
+            // Called after checkIntentFilters()
+        } else if (requestCode == REQUEST_INTENT_FILTERS_STATUS) {
+            handleIntentFiltersStatus(resultCode);
         }
     }
 
@@ -184,6 +191,21 @@
                 new Intent(WorkNotificationTestActivity.ACTION_WORK_NOTIFICATION),
                 R.drawable.ic_corp_icon);
 
+        Intent workStatusIcon = new Intent(WorkStatusTestActivity.ACTION_WORK_STATUS_ICON);
+        workStatusIcon.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mWorkStatusBarIconTest = new TestItemWithIcon(this,
+                R.string.provisioning_byod_work_status_icon,
+                R.string.provisioning_byod_work_status_icon_instruction,
+                workStatusIcon,
+                R.drawable.stat_sys_managed_profile_status);
+
+        Intent workStatusToast = new Intent(WorkStatusTestActivity.ACTION_WORK_STATUS_TOAST);
+        workStatusToast.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mWorkStatusBarToastTest = new TestItem(this,
+                R.string.provisioning_byod_work_status_toast,
+                R.string.provisioning_byod_work_status_toast_instruction,
+                workStatusToast);
+
         mDisableNonMarketTest = new TestItem(this, R.string.provisioning_byod_nonmarket_deny,
                 R.string.provisioning_byod_nonmarket_deny_info,
                 new Intent(ByodHelperActivity.ACTION_INSTALL_APK)
@@ -227,11 +249,22 @@
                 R.string.provisioning_byod_cross_profile_instruction,
                 chooser);
 
+        // Test for checking if the required intent filters are set during managed provisioning.
+        mIntentFiltersTest = new TestItem(this,
+                R.string.provisioning_byod_cross_profile_intent_filters) {
+            @Override
+            public void performTest(ByodFlowTestActivity activity) {
+                checkIntentFilters();
+            }
+        };
+
         mTests.add(mProfileOwnerInstalled);
 
         // Badge related tests
         mTests.add(mWorkAppVisibleTest);
         mTests.add(mWorkNotificationBadgedTest);
+        mTests.add(mWorkStatusBarIconTest);
+        mTests.add(mWorkStatusBarToastTest);
 
         // Settings related tests.
         mTests.add(mProfileAccountVisibleTest);
@@ -244,6 +277,7 @@
         mTests.add(mCrossProfileIntentFiltersTest);
         mTests.add(mDisableNonMarketTest);
         mTests.add(mEnableNonMarketTest);
+        mTests.add(mIntentFiltersTest);
 
         if (canResolveIntent(ByodHelperActivity.getCaptureImageIntent())) {
             // Capture image intent can be resolved in primary profile, so test.
@@ -373,9 +407,8 @@
 
     private void startByodProvisioning() {
         Intent sending = new Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE);
-        sending.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
-                mAdminReceiverComponent.getPackageName());
-        sending.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminReceiverComponent);
+        sending.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,
+                mAdminReceiverComponent);
 
         if (sending.resolveActivity(getPackageManager()) != null) {
             // ManagedProvisioning must be started with startActivityForResult, but we don't
@@ -389,7 +422,7 @@
     private void queryProfileOwner(boolean showToast) {
         try {
             Intent intent = new Intent(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER);
-            startActivityForResult(intent, REQUEST_STATUS);
+            startActivityForResult(intent, REQUEST_PROFILE_OWNER_STATUS);
         }
         catch (ActivityNotFoundException e) {
             Log.d(TAG, "queryProfileOwner: ActivityNotFoundException", e);
@@ -411,6 +444,35 @@
         }
     }
 
+    private void checkIntentFilters() {
+        try {
+            // We disable the ByodHelperActivity in the primary profile. So, this intent
+            // will be handled by the ByodHelperActivity in the managed profile.
+            Intent intent = new Intent(ByodHelperActivity.ACTION_CHECK_INTENT_FILTERS);
+            startActivityForResult(intent, REQUEST_INTENT_FILTERS_STATUS);
+        } catch (ActivityNotFoundException e) {
+            Log.d(TAG, "checkIntentFilters: ActivityNotFoundException", e);
+            setTestResult(mIntentFiltersTest, TestResult.Failed);
+            showToast(R.string.provisioning_byod_no_activity);
+        }
+    }
+
+    private void handleIntentFiltersStatus(int resultCode) {
+        // we use the resultCode from ByodHelperActivity in the managed profile to know if certain
+        // intents fired from the managed profile are forwarded.
+        final boolean intentFiltersSetForManagedIntents = (resultCode == RESULT_OK);
+        // Since the ByodFlowTestActivity is running in the primary profile, we directly use
+        // the IntentFiltersTestHelper to know if certain intents fired from the primary profile
+        // are forwarded.
+        final boolean intentFiltersSetForPrimaryIntents =
+                new IntentFiltersTestHelper(this).checkCrossProfileIntentFilters(
+                        IntentFiltersTestHelper.FLAG_INTENTS_FROM_PRIMARY);
+        final boolean intentFiltersSet =
+                intentFiltersSetForPrimaryIntents & intentFiltersSetForManagedIntents;
+        setTestResult(mIntentFiltersTest,
+                intentFiltersSet ? TestResult.Passed : TestResult.Failed);
+    }
+
     private void disableComponent() {
         // Disable app components in the current profile, so only the counterpart in the other profile
         // can respond (via cross-profile intent filter)
@@ -422,6 +484,10 @@
                 this, WorkNotificationTestActivity.class),
                 PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                 PackageManager.DONT_KILL_APP);
+        getPackageManager().setComponentEnabledSetting(new ComponentName(
+                this, WorkStatusTestActivity.class),
+                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                PackageManager.DONT_KILL_APP);
     }
 
     private void showToast(int messageId) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
index 52225c1..d8a3387 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
@@ -75,6 +75,12 @@
     public static final String ACTION_INSTALL_APK = "com.android.cts.verifier.managedprovisioning.BYOD_INSTALL_APK";
     public static final String EXTRA_ALLOW_NON_MARKET_APPS = INSTALL_NON_MARKET_APPS;
 
+    // Primary -> managed intent: check if the required cross profile intent filters are set.
+    public static final String ACTION_CHECK_INTENT_FILTERS =
+            "com.android.cts.verifier.managedprovisioning.action.CHECK_INTENT_FILTERS";
+
+    public static final int RESULT_FAILED = RESULT_FIRST_USER;
+
     private static final int REQUEST_INSTALL_PACKAGE = 1;
     private static final int REQUEST_IMAGE_CAPTURE = 2;
     private static final int REQUEST_VIDEO_CAPTURE = 3;
@@ -142,6 +148,12 @@
 
             // Not yet ready to finish- wait until the result comes back
             return;
+            // Queried by CtsVerifier in the primary side using startActivityForResult.
+        } else if (action.equals(ACTION_CHECK_INTENT_FILTERS)) {
+            final boolean intentFiltersSetForManagedIntents =
+                    new IntentFiltersTestHelper(this).checkCrossProfileIntentFilters(
+                            IntentFiltersTestHelper.FLAG_INTENTS_FROM_MANAGED);
+            setResult(intentFiltersSetForManagedIntents? RESULT_OK : RESULT_FAILED, null);
         } else if (action.equals(ACTION_CAPTURE_AND_CHECK_IMAGE)) {
             Intent captureImageIntent = getCaptureImageIntent();
             mImageUri = getTempUri("image.jpg");
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceAdminTestReceiver.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceAdminTestReceiver.java
index dd3e16d..9154307 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceAdminTestReceiver.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceAdminTestReceiver.java
@@ -49,12 +49,15 @@
             filter.addAction(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER);
             filter.addAction(ByodHelperActivity.ACTION_REMOVE_PROFILE_OWNER);
             filter.addAction(ByodHelperActivity.ACTION_INSTALL_APK);
+            filter.addAction(ByodHelperActivity.ACTION_CHECK_INTENT_FILTERS);
             filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_IMAGE);
             filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO);
             filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_AUDIO);
             filter.addAction(CrossProfileTestActivity.ACTION_CROSS_PROFILE);
             filter.addAction(WorkNotificationTestActivity.ACTION_WORK_NOTIFICATION);
             filter.addAction(WorkNotificationTestActivity.ACTION_CLEAR_WORK_NOTIFICATION);
+            filter.addAction(WorkStatusTestActivity.ACTION_WORK_STATUS_TOAST);
+            filter.addAction(WorkStatusTestActivity.ACTION_WORK_STATUS_ICON);
             dpm.addCrossProfileIntentFilter(getWho(context), filter,
                     DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT);
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
new file mode 100644
index 0000000..579cbcc
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.managedprovisioning;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.media.audiofx.AudioEffect;
+import android.net.Uri;
+import android.nfc.cardemulation.CardEmulation;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.provider.AlarmClock;
+import android.provider.CalendarContract.Events;
+import android.provider.MediaStore;
+import android.provider.Settings;
+import android.speech.RecognizerIntent;
+import android.util.Log;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper class for testing if the required cross profile intent filters are set during the
+ * managed provisioning.
+ */
+public class IntentFiltersTestHelper {
+
+    private static final String TAG = "IntentFiltersTestHelper";
+
+    // These are the intents which can be forwarded to the managed profile.
+    private static final Intent[] forwardedIntentsFromPrimary = new Intent[] {
+        new Intent(Intent.ACTION_SEND).setType("*/*"),
+        new Intent(Intent.ACTION_SEND_MULTIPLE).setType("*/*")
+    };
+
+    // These are the intents which can be forwarded to the primary profile.
+    private static final Intent[] forwardedIntentsFromManaged = new Intent[] {
+        new Intent(AlarmClock.ACTION_SET_ALARM),
+        new Intent(AlarmClock.ACTION_SET_TIMER),
+        new Intent(AlarmClock.ACTION_SHOW_ALARMS),
+        new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
+        new Intent(MediaStore.ACTION_VIDEO_CAPTURE),
+        new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA),
+        new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA),
+        new Intent(MediaStore.ACTION_IMAGE_CAPTURE_SECURE),
+        new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE),
+        new Intent(Intent.ACTION_SENDTO).setData(Uri.parse("sms:07700900100")),
+        new Intent(Intent.ACTION_SENDTO).setData(Uri.parse("smsto:07700900100")),
+        new Intent(Intent.ACTION_SENDTO).setData(Uri.parse("mms:07700900100")),
+        new Intent(Intent.ACTION_SENDTO).setData(Uri.parse("mmsto:07700900100")),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("sms:07700900100?body=Hello%20world")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("smsto:07700900100?body=Hello%20world")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("mms:07700900100?body=Hello%20world")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("mmsto:07700900100?body=Hello%20world")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS),
+        new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS),
+        new Intent(Settings.ACTION_APN_SETTINGS),
+        new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS),
+        new Intent(Settings.ACTION_CAPTIONING_SETTINGS),
+        new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS),
+        new Intent(Settings.ACTION_DATE_SETTINGS),
+        new Intent(Settings.ACTION_DEVICE_INFO_SETTINGS),
+        new Intent(Settings.ACTION_DISPLAY_SETTINGS),
+        new Intent(Settings.ACTION_DREAM_SETTINGS),
+        new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS),
+        new Intent(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS),
+        new Intent(Settings.ACTION_LOCALE_SETTINGS),
+        new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS),
+        new Intent(Settings.ACTION_NFC_SETTINGS),
+        new Intent(Settings.ACTION_NFCSHARING_SETTINGS),
+        new Intent(Settings.ACTION_PRIVACY_SETTINGS),
+        new Intent(Settings.ACTION_SETTINGS),
+        new Intent(Settings.ACTION_SOUND_SETTINGS),
+        new Intent(Settings.ACTION_WIRELESS_SETTINGS),
+        new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD),
+        new Intent("android.net.vpn.SETTINGS"),
+        new Intent(CardEmulation.ACTION_CHANGE_DEFAULT),
+        new Intent("android.settings.ACCOUNT_SYNC_SETTINGS"),
+        new Intent(Settings.ACTION_BATTERY_SAVER_SETTINGS),
+        new Intent(Settings.ACTION_HOME_SETTINGS),
+        new Intent("android.settings.LICENSE"),
+        new Intent("android.settings.NOTIFICATION_SETTINGS"),
+        new Intent(Settings.ACTION_SHOW_REGULATORY_INFO),
+        new Intent("android.settings.USER_SETTINGS"),
+        new Intent("android.settings.ZEN_MODE_SETTINGS"),
+        new Intent("com.android.settings.ACCESSIBILITY_COLOR_SPACE_SETTINGS"),
+        new Intent("com.android.settings.STORAGE_USB_SETTINGS"),
+        new Intent("com.android.settings.TTS_SETTINGS"),
+        new Intent("com.android.settings.USER_DICTIONARY_EDIT"),
+        new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:123")),
+        new Intent("android.intent.action.CALL_EMERGENCY").setData(Uri.parse("tel:123")),
+        new Intent("android.intent.action.CALL_PRIVILEGED").setData(Uri.parse("tel:123")),
+        new Intent(Intent.ACTION_DIAL).setData(Uri.parse("tel:123")),
+        new Intent(Intent.ACTION_VIEW).setData(Uri.parse("tel:123")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Settings.ACTION_MEMORY_CARD_SETTINGS),
+        new Intent(Settings.ACTION_NFC_PAYMENT_SETTINGS),
+        new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS),
+        new Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS),
+        new Intent(Settings.ACTION_SYNC_SETTINGS),
+        new Intent(Settings.ACTION_ADD_ACCOUNT),
+        new Intent(Intent.ACTION_GET_CONTENT).setType("*/*").addCategory(
+                Intent.CATEGORY_OPENABLE),
+        new Intent(Intent.ACTION_OPEN_DOCUMENT).setType("*/*").addCategory(
+                Intent.CATEGORY_OPENABLE),
+        new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
+    };
+
+    // These are the intents which cannot be forwarded to the primary profile.
+    private static final Intent[] notForwardedIntentsFromManaged = new Intent[] {
+        new Intent(Intent.ACTION_INSERT).setData(
+                Uri.parse("content://browser/bookmarks")),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("http://www.example.com")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_SENDTO).setData(
+                Uri.parse("mailto:user@example.com")),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("mailto:user@example.com")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("geo:0,0?q=BuckinghamPalace")),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("http://example.com/oceans.mp4")).setType("video/mp4"),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("http://www.example.com/horse.mp3")).setType("audio/*"),
+        new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH),
+        new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("market://details?id=com.android.chrome")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_WEB_SEARCH),
+        new Intent(Settings.ACTION_SEARCH_SETTINGS),
+        new Intent(Settings.ACTION_PRINT_SETTINGS),
+        new Intent(Intent.ACTION_MANAGE_NETWORK_USAGE),
+        new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS),
+        new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS),
+        new Intent(Settings.ACTION_APPLICATION_SETTINGS),
+        new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(
+                Uri.parse("package:com.android.chrome")),
+        new Intent("android.settings.ACTION_OTHER_SOUND_SETTINGS"),
+        new Intent(Settings.ACTION_WIFI_IP_SETTINGS),
+        new Intent(Settings.ACTION_WIFI_SETTINGS),
+        new Intent("android.settings.SHOW_INPUT_METHOD_PICKER"),
+        new Intent(Intent.ACTION_INSERT).setData(Events.CONTENT_URI),
+        new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL)
+    };
+
+    // This flag specifies we are dealing with intents fired from the primary profile.
+    public static final int FLAG_INTENTS_FROM_PRIMARY = 1;
+    // This flag specifies we are dealing with intents fired from the managed profile.
+    public static final int FLAG_INTENTS_FROM_MANAGED = 2;
+
+    private Context mContext;
+
+    IntentFiltersTestHelper(Context context) {
+        mContext = context;
+    }
+
+    public boolean checkCrossProfileIntentFilters(int flag) {
+        boolean crossProfileIntentFiltersSet;
+        if (flag == FLAG_INTENTS_FROM_PRIMARY) {
+            crossProfileIntentFiltersSet = checkForIntentsFromPrimary();
+        } else {
+            crossProfileIntentFiltersSet = checkForIntentsFromManaged();
+        }
+        return crossProfileIntentFiltersSet;
+    }
+
+    /**
+     * Checks if required cross profile intent filters are set for the intents fired from the
+     * primary profile.
+     */
+    private boolean checkForIntentsFromPrimary() {
+        // Get the class name of the intentForwarderActivity in the primary profile by firing an
+        // intent which we know will be forwarded from primary profile to managed profile.
+        ActivityInfo forwarderActivityInfo =
+                getForwarderActivityInfo(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER);
+        if (forwarderActivityInfo == null) {
+            return false;
+        }
+
+        // Check for intents which can be forwarded to the managed profile.
+        Intent intent = checkForIntentsNotHandled(forwardedIntentsFromPrimary,
+                forwarderActivityInfo, true);
+        if (intent != null) {
+            Log.d(TAG, intent + " from primary profile should be forwarded to the " +
+                    "managed profile but is not.");
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Checks if required cross profile intent filters are set for the intents fired from the
+     * managed profile.
+     */
+    private boolean checkForIntentsFromManaged() {
+        // Get the class name of the intentForwarderActivity in the managed profile by firing an
+        // intent which we know will be forwarded from managed profile to primary profile.
+        ActivityInfo forwarderActivityInfo =
+                getForwarderActivityInfo(ByodHelperActivity.ACTION_PROFILE_OWNER_STATUS);
+        if (forwarderActivityInfo == null) {
+            return false;
+        }
+
+        // Check for intents which can be forwarded to the primary profile.
+        Intent intent = checkForIntentsNotHandled(forwardedIntentsFromManaged,
+                forwarderActivityInfo, true);
+        if (intent != null) {
+            Log.d(TAG, intent + " from managed profile should be forwarded to the " +
+                    "primary profile but is not.");
+            return false;
+        }
+
+        // Check for intents which cannot be forwarded to the primary profile.
+        intent = checkForIntentsNotHandled(notForwardedIntentsFromManaged,
+                forwarderActivityInfo, false);
+        if (intent != null) {
+            Log.d(TAG, intent + " from managed profile should not be forwarded to the " +
+                    "primary profile but it is.");
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Checks if the intentForwarderActivity can handle the intent passed.
+     */
+    private boolean canForwarderActivityHandleIntent(Intent intent,
+            ActivityInfo forwarderActivityInfo) {
+        // Get all the activities which can handle the intent.
+        List<ResolveInfo> resolveInfoList =
+                mContext.getPackageManager().queryIntentActivities(intent,
+                        PackageManager.MATCH_DEFAULT_ONLY);
+        // Check if intentForwarderActivity is part of the list.
+        for (ResolveInfo resolveInfo : resolveInfoList) {
+            if (forwarderActivityInfo.packageName.equals(resolveInfo.activityInfo.packageName)
+                    && forwarderActivityInfo.name.equals(resolveInfo.activityInfo.name)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns the class name of the intentForwarderActivity.
+     */
+    private ActivityInfo getForwarderActivityInfo(String action) {
+        Intent intent = new Intent(action);
+        List<ResolveInfo> resolveInfoList =
+                mContext.getPackageManager().queryIntentActivities(intent,
+                        PackageManager.MATCH_DEFAULT_ONLY);
+        if (resolveInfoList.isEmpty() || resolveInfoList.size() > 1) {
+            Log.d(TAG, "There should be exactly one activity IntentForwarder which " +
+                    "handles the intent " + intent);
+            return null;
+        }
+        return resolveInfoList.get(0).activityInfo;
+    }
+
+    /**
+     * Checks if the intents passed are correctly handled.
+     * @return {@code null} if all the intents are correctly handled
+     *         otherwise, the first intent in the list which is not handled correctly.
+     */
+    private Intent checkForIntentsNotHandled(Intent[] intentList,
+            ActivityInfo expectedForwarderActivityInfo, boolean canResolve) {
+        for (Intent intent : intentList) {
+            if (canForwarderActivityHandleIntent(intent,
+                    expectedForwarderActivityInfo) != canResolve) {
+                return intent;
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkStatusTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkStatusTestActivity.java
new file mode 100644
index 0000000..ee9aa44
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkStatusTestActivity.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.managedprovisioning;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.TextView;
+
+import com.android.cts.verifier.R;
+
+/**
+ * Test activity for work status tests.
+ */
+public class WorkStatusTestActivity extends Activity {
+    public static final String ACTION_WORK_STATUS_ICON
+            = "com.android.cts.verifier.managedprovisioning.WORK_STATUS_ICON";
+    public static final String ACTION_WORK_STATUS_TOAST
+            = "com.android.cts.verifier.managedprovisioning.WORK_STATUS_TOAST";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.provisioning_cross_profile);
+
+        findViewById(R.id.button_finish).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                WorkStatusTestActivity.this.finish();
+            }
+        });
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        String action = getIntent().getAction();
+        TextView textView = (TextView) findViewById(R.id.text);
+        if (ACTION_WORK_STATUS_ICON.equals(action)) {
+            textView.setText(R.string.provisioning_byod_work_status_icon_activity);
+        } else if (ACTION_WORK_STATUS_TOAST.equals(action)) {
+            textView.setText(R.string.provisioning_byod_work_status_toast_activity);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaOutputSurface.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaOutputSurface.java
new file mode 100644
index 0000000..b28e06b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaOutputSurface.java
@@ -0,0 +1,322 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.sensors;
+
+import android.graphics.SurfaceTexture;
+import android.opengl.EGL14;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLSurface;
+import android.util.Log;
+import android.view.Surface;
+
+
+//
+// This file is copied from android.hardware.cts.media
+//
+
+/**
+ * Holds state associated with a Surface used for MediaCodec decoder output.
+ * <p>
+ * The (width,height) constructor for this class will prepare GL, create a SurfaceTexture,
+ * and then create a Surface for that SurfaceTexture.  The Surface can be passed to
+ * MediaCodec.configure() to receive decoder output.  When a frame arrives, we latch the
+ * texture with updateTexImage, then render the texture with GL to a pbuffer.
+ * <p>
+ * The no-arg constructor skips the GL preparation step and doesn't allocate a pbuffer.
+ * Instead, it just creates the Surface and SurfaceTexture, and when a frame arrives
+ * we just draw it on whatever surface is current.
+ * <p>
+ * By default, the Surface will be using a BufferQueue in asynchronous mode, so we
+ * can potentially drop frames.
+ */
+class CtsMediaOutputSurface implements SurfaceTexture.OnFrameAvailableListener {
+    private static final String TAG = "OutputSurface";
+    private static final boolean VERBOSE = false;
+
+    private EGLDisplay mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+    private EGLContext mEGLContext = EGL14.EGL_NO_CONTEXT;
+    private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;
+
+    private SurfaceTexture mSurfaceTexture;
+    private Surface mSurface;
+
+    private Object mFrameSyncObject = new Object();     // guards mFrameAvailable
+    private boolean mFrameAvailable;
+
+    private CtsMediaTextureRender mTextureRender;
+
+    /**
+     * Creates an OutputSurface backed by a pbuffer with the specifed dimensions.  The new
+     * EGL context and surface will be made current.  Creates a Surface that can be passed
+     * to MediaCodec.configure().
+     */
+    public CtsMediaOutputSurface(int width, int height) {
+        if (width <= 0 || height <= 0) {
+            throw new IllegalArgumentException();
+        }
+
+        eglSetup(width, height);
+        makeCurrent();
+
+        setup(this);
+    }
+
+    /**
+     * Creates an OutputSurface using the current EGL context (rather than establishing a
+     * new one).  Creates a Surface that can be passed to MediaCodec.configure().
+     */
+    public CtsMediaOutputSurface() {
+        setup(this);
+    }
+
+    public CtsMediaOutputSurface(final SurfaceTexture.OnFrameAvailableListener listener) {
+        setup(listener);
+    }
+
+    /**
+     * Creates instances of TextureRender and SurfaceTexture, and a Surface associated
+     * with the SurfaceTexture.
+     */
+    private void setup(SurfaceTexture.OnFrameAvailableListener listener) {
+        mTextureRender = new CtsMediaTextureRender();
+        mTextureRender.surfaceCreated();
+
+        // Even if we don't access the SurfaceTexture after the constructor returns, we
+        // still need to keep a reference to it.  The Surface doesn't retain a reference
+        // at the Java level, so if we don't either then the object can get GCed, which
+        // causes the native finalizer to run.
+        if (VERBOSE) Log.d(TAG, "textureID=" + mTextureRender.getTextureId());
+        mSurfaceTexture = new SurfaceTexture(mTextureRender.getTextureId());
+
+        // This doesn't work if OutputSurface is created on the thread that CTS started for
+        // these test cases.
+        //
+        // The CTS-created thread has a Looper, and the SurfaceTexture constructor will
+        // create a Handler that uses it.  The "frame available" message is delivered
+        // there, but since we're not a Looper-based thread we'll never see it.  For
+        // this to do anything useful, OutputSurface must be created on a thread without
+        // a Looper, so that SurfaceTexture uses the main application Looper instead.
+        //
+        // Java language note: passing "this" out of a constructor is generally unwise,
+        // but we should be able to get away with it here.
+        mSurfaceTexture.setOnFrameAvailableListener(listener);
+
+        mSurface = new Surface(mSurfaceTexture);
+    }
+
+    /**
+     * Prepares EGL.  We want a GLES 2.0 context and a surface that supports pbuffer.
+     */
+    private void eglSetup(int width, int height) {
+        mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+        if (mEGLDisplay == EGL14.EGL_NO_DISPLAY) {
+            throw new RuntimeException("unable to get EGL14 display");
+        }
+        int[] version = new int[2];
+        if (!EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1)) {
+            mEGLDisplay = null;
+            throw new RuntimeException("unable to initialize EGL14");
+        }
+
+        // Configure EGL for pbuffer and OpenGL ES 2.0.  We want enough RGB bits
+        // to be able to tell if the frame is reasonable.
+        int[] attribList = {
+                EGL14.EGL_RED_SIZE, 8,
+                EGL14.EGL_GREEN_SIZE, 8,
+                EGL14.EGL_BLUE_SIZE, 8,
+                EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
+                EGL14.EGL_SURFACE_TYPE, EGL14.EGL_PBUFFER_BIT,
+                EGL14.EGL_NONE
+        };
+        EGLConfig[] configs = new EGLConfig[1];
+        int[] numConfigs = new int[1];
+        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
+                numConfigs, 0)) {
+            throw new RuntimeException("unable to find RGB888+recordable ES2 EGL config");
+        }
+
+        // Configure context for OpenGL ES 2.0.
+        int[] attrib_list = {
+                EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
+                EGL14.EGL_NONE
+        };
+        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT,
+                attrib_list, 0);
+        checkEglError("eglCreateContext");
+        if (mEGLContext == null) {
+            throw new RuntimeException("null context");
+        }
+
+        // Create a pbuffer surface.  By using this for output, we can use glReadPixels
+        // to test values in the output.
+        int[] surfaceAttribs = {
+                EGL14.EGL_WIDTH, width,
+                EGL14.EGL_HEIGHT, height,
+                EGL14.EGL_NONE
+        };
+        mEGLSurface = EGL14.eglCreatePbufferSurface(mEGLDisplay, configs[0], surfaceAttribs, 0);
+        checkEglError("eglCreatePbufferSurface");
+        if (mEGLSurface == null) {
+            throw new RuntimeException("surface was null");
+        }
+    }
+
+    /**
+     * Discard all resources held by this class, notably the EGL context.
+     */
+    public void release() {
+        if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+            EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+            EGL14.eglDestroyContext(mEGLDisplay, mEGLContext);
+            EGL14.eglReleaseThread();
+            EGL14.eglTerminate(mEGLDisplay);
+        }
+
+        mSurface.release();
+
+        // this causes a bunch of warnings that appear harmless but might confuse someone:
+        //  W BufferQueue: [unnamed-3997-2] cancelBuffer: BufferQueue has been abandoned!
+        //mSurfaceTexture.release();
+
+        mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+        mEGLContext = EGL14.EGL_NO_CONTEXT;
+        mEGLSurface = EGL14.EGL_NO_SURFACE;
+
+        mTextureRender = null;
+        mSurface = null;
+        mSurfaceTexture = null;
+    }
+
+    /**
+     * Makes our EGL context and surface current.
+     */
+    public void makeCurrent() {
+        if (!EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
+            throw new RuntimeException("eglMakeCurrent failed");
+        }
+    }
+
+    /**
+     * Returns the Surface that we draw onto.
+     */
+    public Surface getSurface() {
+        return mSurface;
+    }
+
+    /**
+     * Replaces the fragment shader.
+     */
+    public void changeFragmentShader(String fragmentShader) {
+        mTextureRender.changeFragmentShader(fragmentShader);
+    }
+
+    /**
+     * Latches the next buffer into the texture.  Must be called from the thread that created
+     * the OutputSurface object, after the onFrameAvailable callback has signaled that new
+     * data is available.
+     */
+    public void awaitNewImage() {
+        final int TIMEOUT_MS = 500;
+
+        synchronized (mFrameSyncObject) {
+            while (!mFrameAvailable) {
+                try {
+                    // Wait for onFrameAvailable() to signal us.  Use a timeout to avoid
+                    // stalling the test if it doesn't arrive.
+                    mFrameSyncObject.wait(TIMEOUT_MS);
+                    if (!mFrameAvailable) {
+                        // TODO: if "spurious wakeup", continue while loop
+                        throw new RuntimeException("Surface frame wait timed out");
+                    }
+                } catch (InterruptedException ie) {
+                    // shouldn't happen
+                    throw new RuntimeException(ie);
+                }
+            }
+            mFrameAvailable = false;
+        }
+
+        // Latch the data.
+        mTextureRender.checkGlError("before updateTexImage");
+        mSurfaceTexture.updateTexImage();
+    }
+
+    /**
+     * Wait up to given timeout until new image become available.
+     * @param timeoutMs
+     * @return true if new image is available. false for no new image until timeout.
+     */
+    public boolean checkForNewImage(int timeoutMs) {
+        synchronized (mFrameSyncObject) {
+            while (!mFrameAvailable) {
+                try {
+                    // Wait for onFrameAvailable() to signal us.  Use a timeout to avoid
+                    // stalling the test if it doesn't arrive.
+                    mFrameSyncObject.wait(timeoutMs);
+                    if (!mFrameAvailable) {
+                        return false;
+                    }
+                } catch (InterruptedException ie) {
+                    // shouldn't happen
+                    throw new RuntimeException(ie);
+                }
+            }
+            mFrameAvailable = false;
+        }
+
+        // Latch the data.
+        mTextureRender.checkGlError("before updateTexImage");
+        mSurfaceTexture.updateTexImage();
+        return true;
+    }
+
+    /**
+     * Draws the data from SurfaceTexture onto the current EGL surface.
+     */
+    public void drawImage() {
+        mTextureRender.drawFrame(mSurfaceTexture);
+    }
+
+    public void latchImage() {
+        mTextureRender.checkGlError("before updateTexImage");
+        mSurfaceTexture.updateTexImage();
+    }
+
+    @Override
+    public void onFrameAvailable(SurfaceTexture st) {
+        if (VERBOSE) Log.d(TAG, "new frame available");
+        synchronized (mFrameSyncObject) {
+            if (mFrameAvailable) {
+                throw new RuntimeException("mFrameAvailable already set, frame could be dropped");
+            }
+            mFrameAvailable = true;
+            mFrameSyncObject.notifyAll();
+        }
+    }
+
+    /**
+     * Checks for EGL errors.
+     */
+    private void checkEglError(String msg) {
+        int error;
+        if ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException(msg + ": EGL error: 0x" + Integer.toHexString(error));
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaTextureRender.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaTextureRender.java
new file mode 100644
index 0000000..a96033d
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaTextureRender.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.sensors;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import android.graphics.Bitmap;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.util.Log;
+
+
+//
+// This file is copied from android.hardware.cts.media
+//
+
+/**
+ * Code for rendering a texture onto a surface using OpenGL ES 2.0.
+ */
+class CtsMediaTextureRender {
+    private static final String TAG = "TextureRender";
+
+    private static final int FLOAT_SIZE_BYTES = 4;
+    private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+    private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
+    private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
+    private final float[] mTriangleVerticesData = {
+        // X, Y, Z, U, V
+        -1.0f, -1.0f, 0, 0.f, 0.f,
+         1.0f, -1.0f, 0, 1.f, 0.f,
+        -1.0f,  1.0f, 0, 0.f, 1.f,
+         1.0f,  1.0f, 0, 1.f, 1.f,
+    };
+
+    private FloatBuffer mTriangleVertices;
+
+    private static final String VERTEX_SHADER =
+            "uniform mat4 uMVPMatrix;\n" +
+            "uniform mat4 uSTMatrix;\n" +
+            "attribute vec4 aPosition;\n" +
+            "attribute vec4 aTextureCoord;\n" +
+            "varying vec2 vTextureCoord;\n" +
+            "void main() {\n" +
+            "  gl_Position = uMVPMatrix * aPosition;\n" +
+            "  vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
+            "}\n";
+
+    private static final String FRAGMENT_SHADER =
+            "#extension GL_OES_EGL_image_external : require\n" +
+            "precision mediump float;\n" +      // highp here doesn't seem to matter
+            "varying vec2 vTextureCoord;\n" +
+            "uniform samplerExternalOES sTexture;\n" +
+            "void main() {\n" +
+            "  gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+            "}\n";
+
+    private float[] mMVPMatrix = new float[16];
+    private float[] mSTMatrix = new float[16];
+
+    private int mProgram;
+    private int mTextureID = -12345;
+    private int muMVPMatrixHandle;
+    private int muSTMatrixHandle;
+    private int maPositionHandle;
+    private int maTextureHandle;
+
+    public CtsMediaTextureRender() {
+        mTriangleVertices = ByteBuffer.allocateDirect(
+            mTriangleVerticesData.length * FLOAT_SIZE_BYTES)
+                .order(ByteOrder.nativeOrder()).asFloatBuffer();
+        mTriangleVertices.put(mTriangleVerticesData).position(0);
+
+        Matrix.setIdentityM(mSTMatrix, 0);
+    }
+
+    public int getTextureId() {
+        return mTextureID;
+    }
+
+    public void drawFrame(SurfaceTexture st) {
+        checkGlError("onDrawFrame start");
+        st.getTransformMatrix(mSTMatrix);
+
+        GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
+        GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+
+        GLES20.glUseProgram(mProgram);
+        checkGlError("glUseProgram");
+
+        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID);
+
+        mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
+        GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
+            TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
+        checkGlError("glVertexAttribPointer maPosition");
+        GLES20.glEnableVertexAttribArray(maPositionHandle);
+        checkGlError("glEnableVertexAttribArray maPositionHandle");
+
+        mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
+        GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false,
+            TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
+        checkGlError("glVertexAttribPointer maTextureHandle");
+        GLES20.glEnableVertexAttribArray(maTextureHandle);
+        checkGlError("glEnableVertexAttribArray maTextureHandle");
+
+        Matrix.setIdentityM(mMVPMatrix, 0);
+        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
+        GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);
+
+        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+        checkGlError("glDrawArrays");
+        GLES20.glFinish();
+    }
+
+    /**
+     * Initializes GL state.  Call this after the EGL surface has been created and made current.
+     */
+    public void surfaceCreated() {
+        mProgram = createProgram(VERTEX_SHADER, FRAGMENT_SHADER);
+        if (mProgram == 0) {
+            throw new RuntimeException("failed creating program");
+        }
+        maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
+        checkGlError("glGetAttribLocation aPosition");
+        if (maPositionHandle == -1) {
+            throw new RuntimeException("Could not get attrib location for aPosition");
+        }
+        maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord");
+        checkGlError("glGetAttribLocation aTextureCoord");
+        if (maTextureHandle == -1) {
+            throw new RuntimeException("Could not get attrib location for aTextureCoord");
+        }
+
+        muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
+        checkGlError("glGetUniformLocation uMVPMatrix");
+        if (muMVPMatrixHandle == -1) {
+            throw new RuntimeException("Could not get attrib location for uMVPMatrix");
+        }
+
+        muSTMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uSTMatrix");
+        checkGlError("glGetUniformLocation uSTMatrix");
+        if (muSTMatrixHandle == -1) {
+            throw new RuntimeException("Could not get attrib location for uSTMatrix");
+        }
+
+
+        int[] textures = new int[1];
+        GLES20.glGenTextures(1, textures, 0);
+
+        mTextureID = textures[0];
+        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID);
+        checkGlError("glBindTexture mTextureID");
+
+        GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
+                GLES20.GL_NEAREST);
+        GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
+                GLES20.GL_LINEAR);
+        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,
+                GLES20.GL_CLAMP_TO_EDGE);
+        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,
+                GLES20.GL_CLAMP_TO_EDGE);
+        checkGlError("glTexParameter");
+    }
+
+    /**
+     * Replaces the fragment shader.
+     */
+    public void changeFragmentShader(String fragmentShader) {
+        GLES20.glDeleteProgram(mProgram);
+        mProgram = createProgram(VERTEX_SHADER, fragmentShader);
+        if (mProgram == 0) {
+            throw new RuntimeException("failed creating program");
+        }
+    }
+
+    private int loadShader(int shaderType, String source) {
+        int shader = GLES20.glCreateShader(shaderType);
+        checkGlError("glCreateShader type=" + shaderType);
+        GLES20.glShaderSource(shader, source);
+        GLES20.glCompileShader(shader);
+        int[] compiled = new int[1];
+        GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+        if (compiled[0] == 0) {
+            Log.e(TAG, "Could not compile shader " + shaderType + ":");
+            Log.e(TAG, " " + GLES20.glGetShaderInfoLog(shader));
+            GLES20.glDeleteShader(shader);
+            shader = 0;
+        }
+        return shader;
+    }
+
+    private int createProgram(String vertexSource, String fragmentSource) {
+        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+        if (vertexShader == 0) {
+            return 0;
+        }
+        int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+        if (pixelShader == 0) {
+            return 0;
+        }
+
+        int program = GLES20.glCreateProgram();
+        checkGlError("glCreateProgram");
+        if (program == 0) {
+            Log.e(TAG, "Could not create program");
+        }
+        GLES20.glAttachShader(program, vertexShader);
+        checkGlError("glAttachShader");
+        GLES20.glAttachShader(program, pixelShader);
+        checkGlError("glAttachShader");
+        GLES20.glLinkProgram(program);
+        int[] linkStatus = new int[1];
+        GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+        if (linkStatus[0] != GLES20.GL_TRUE) {
+            Log.e(TAG, "Could not link program: ");
+            Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+            GLES20.glDeleteProgram(program);
+            program = 0;
+        }
+        return program;
+    }
+
+    public void checkGlError(String op) {
+        int error;
+        while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+            Log.e(TAG, op + ": glError " + error);
+            throw new RuntimeException(op + ": glError " + error);
+        }
+    }
+
+    /**
+     * Saves the current frame to disk as a PNG image.  Frame starts from (0,0).
+     * <p>
+     * Useful for debugging.
+     */
+    public static void saveFrame(String filename, int width, int height) {
+        // glReadPixels gives us a ByteBuffer filled with what is essentially big-endian RGBA
+        // data (i.e. a byte of red, followed by a byte of green...).  We need an int[] filled
+        // with native-order ARGB data to feed to Bitmap.
+        //
+        // If we implement this as a series of buf.get() calls, we can spend 2.5 seconds just
+        // copying data around for a 720p frame.  It's better to do a bulk get() and then
+        // rearrange the data in memory.  (For comparison, the PNG compress takes about 500ms
+        // for a trivial frame.)
+        //
+        // So... we set the ByteBuffer to little-endian, which should turn the bulk IntBuffer
+        // get() into a straight memcpy on most Android devices.  Our ints will hold ABGR data.
+        // Swapping B and R gives us ARGB.  We need about 30ms for the bulk get(), and another
+        // 270ms for the color swap.
+        //
+        // Making this even more interesting is the upside-down nature of GL, which means we
+        // may want to flip the image vertically here.
+
+        ByteBuffer buf = ByteBuffer.allocateDirect(width * height * 4);
+        buf.order(ByteOrder.LITTLE_ENDIAN);
+        GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
+        buf.rewind();
+
+        int pixelCount = width * height;
+        int[] colors = new int[pixelCount];
+        buf.asIntBuffer().get(colors);
+        for (int i = 0; i < pixelCount; i++) {
+            int c = colors[i];
+            colors[i] = (c & 0xff00ff00) | ((c & 0x00ff0000) >> 16) | ((c & 0x000000ff) << 16);
+        }
+
+        FileOutputStream fos = null;
+        try {
+            fos = new FileOutputStream(filename);
+            Bitmap bmp = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
+            bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
+            bmp.recycle();
+        } catch (IOException ioe) {
+            throw new RuntimeException("Failed to write file " + filename, ioe);
+        } finally {
+            try {
+                if (fos != null) fos.close();
+            } catch (IOException ioe2) {
+                throw new RuntimeException("Failed to close file " + filename, ioe2);
+            }
+        }
+        Log.d(TAG, "Saved " + width + "x" + height + " frame as '" + filename + "'");
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java
new file mode 100644
index 0000000..12d4582
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.sensors;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.RectF;
+import android.hardware.SensorManager;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+
+/**
+ * A view class that draws the user prompt
+ *
+ * The following piece of code should show how to use this view.
+ *
+ *  public void testUI()  {
+ *     final int MAX_TILT_ANGLE = 70; // +/- 70
+ *
+ *     final int TILT_ANGLE_STEP = 5; // 5 degree(s) per step
+ *     final int YAW_ANGLE_STEP = 10; // 10 degree(s) per step
+ *
+ *     RangeCoveredRegister xCovered, yCovered, zCovered;
+ *     xCovered = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+ *
+ *     yCovered = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+ *     zCovered = new RangeCoveredRegister(YAW_ANGLE_STEP);
+ *
+ *     xCovered.update(40);
+ *     xCovered.update(-40);
+ *     xCovered.update(12);
+ *
+ *     yCovered.update(50);
+ *     yCovered.update(-51);
+ *
+ *     zCovered.update(150);
+ *     zCovered.update(42);
+ *
+ *     setDataProvider(xCovered, yCovered, zCovered);
+ *     enableAxis(RVCVRecordActivity.AXIS_ALL); //debug mode, show all three axis
+ * }
+ */
+public class MotionIndicatorView extends View {
+    private final String TAG = "MotionIndicatorView";
+    private final boolean LOCAL_LOGV = false;
+
+    private Paint mCursorPaint;
+    private Paint mLimitPaint;
+    private Paint mCoveredPaint;
+    private Paint mRangePaint;
+    private Paint mEraserPaint;
+
+    // UI settings
+    private final int XBAR_WIDTH = 50;
+    private final int XBAR_MARGIN = 50;
+    private final int XBAR_CURSOR_ADD = 20;
+
+    private final int YBAR_WIDTH = 50;
+    private final int YBAR_MARGIN = 50;
+    private final int YBAR_CURSOR_ADD = 20;
+
+    private final int ZRING_WIDTH = 50;
+    private final int ZRING_CURSOR_ADD = 30;
+
+
+    private int mXSize, mYSize;
+    private RectF mZBoundOut, mZBoundOut2, mZBoundIn, mZBoundIn2;
+
+    private RangeCoveredRegister mXCovered, mYCovered, mZCovered;
+
+    private boolean mXEnabled, mYEnabled, mZEnabled;
+
+    /**
+     * Constructor
+     * @param context
+     */
+    public MotionIndicatorView(Context context) {
+        super(context);
+        init();
+    }
+
+    /**
+     * Constructor
+     * @param context Application context
+     * @param attrs
+     */
+    public MotionIndicatorView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    /**
+     * Initialize the Paint objects
+     */
+    private void init() {
+
+        mCursorPaint = new Paint();
+        mCursorPaint.setColor(Color.BLUE);
+
+        mLimitPaint = new Paint();
+        mLimitPaint.setColor(Color.YELLOW);
+
+        mCoveredPaint = new Paint();
+        mCoveredPaint.setColor(Color.CYAN);
+
+        mRangePaint = new Paint();
+        mRangePaint.setColor(Color.DKGRAY);
+
+        mEraserPaint = new Paint();
+        mEraserPaint.setColor(Color.TRANSPARENT);
+        // ensure the erasing effect
+        mEraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
+    }
+
+    /**
+     * Connect the view to certain data provider objects
+     * @param x Data provider for x direction tilt angle
+     * @param y Data provider for y direction tilt angle
+     * @param z Data provider for z rotation
+     */
+    public void setDataProvider(RangeCoveredRegister x,
+                                RangeCoveredRegister y,
+                                RangeCoveredRegister z)    {
+        mXCovered = x;
+        mYCovered = y;
+        mZCovered = z;
+    }
+
+    /**
+     * Set the active axis for display
+     *
+     * @param axis AXIS_X, AXIS_Y, AXIS_Z for x, y, z axis indicators, or AXIS_ALL for all three.
+     */
+    public void enableAxis(int axis)  {
+        mXEnabled = mYEnabled = mZEnabled = false;
+
+        switch(axis)
+        {
+            case SensorManager.AXIS_X:
+                mXEnabled = true;
+                break;
+            case SensorManager.AXIS_Y:
+                mYEnabled = true;
+                break;
+            case SensorManager.AXIS_Z:
+                mZEnabled = true;
+                break;
+            case RVCVRecordActivity.AXIS_ALL:
+                mXEnabled = mYEnabled = mZEnabled = true;
+        }
+    }
+
+    /**
+     * Doing some pre-calculation that only changes when view dimensions are changed.
+     * @param w
+     * @param h
+     * @param oldw
+     * @param oldh
+     */
+    @Override
+    protected void onSizeChanged (int w, int h, int oldw, int oldh) {
+        mXSize = w;
+        mYSize = h;
+
+        mZBoundOut = new RectF(w/2-w/2.5f, h/2-w/2.5f, w/2+w/2.5f, h/2+w/2.5f);
+        mZBoundOut2 = new RectF(
+                w/2-w/2.5f-ZRING_CURSOR_ADD, h/2-w/2.5f-ZRING_CURSOR_ADD,
+                w/2+w/2.5f+ZRING_CURSOR_ADD, h/2+w/2.5f+ZRING_CURSOR_ADD);
+        mZBoundIn = new RectF(
+                w/2-w/2.5f+ZRING_WIDTH, h/2-w/2.5f+ZRING_WIDTH,
+                w/2+w/2.5f-ZRING_WIDTH, h/2+w/2.5f-ZRING_WIDTH);
+        mZBoundIn2 = new RectF(
+                w/2-w/2.5f+ZRING_WIDTH+ZRING_CURSOR_ADD, h/2-w/2.5f+ZRING_WIDTH+ZRING_CURSOR_ADD,
+                w/2+w/2.5f-ZRING_WIDTH-ZRING_CURSOR_ADD, h/2+w/2.5f-ZRING_WIDTH-ZRING_CURSOR_ADD);
+
+        if (LOCAL_LOGV) Log.v(TAG, "New view size = ("+w+", "+h+")");
+    }
+
+    /**
+     * Draw UI depends on the selected axis and registered value
+     *
+     * @param canvas the canvas to draw on
+     */
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        int i,t;
+
+        Paint p = new Paint();
+        p.setColor(Color.YELLOW);
+        canvas.drawRect(10,10, 50, 50, p);
+
+        if (mXEnabled && mXCovered != null) {
+            int xNStep = mXCovered.getNSteps() + 4; // two on each side as a buffer
+            int xStepSize = mXSize * 3/4 / xNStep;
+            int xLeft = mXSize * 1/8 + (mXSize * 3/4 % xNStep)/2;
+
+            // base bar
+            canvas.drawRect(xLeft, XBAR_MARGIN,
+                    xLeft+xStepSize*xNStep-1, XBAR_WIDTH+XBAR_MARGIN, mRangePaint);
+
+            // covered range
+            for (i=0; i<mXCovered.getNSteps(); ++i) {
+                if (mXCovered.isCovered(i)) {
+                    canvas.drawRect(
+                            xLeft+xStepSize*(i+2), XBAR_MARGIN,
+                            xLeft+xStepSize*(i+3)-1, XBAR_WIDTH + XBAR_MARGIN,
+                            mCoveredPaint);
+                }
+            }
+
+            // limit
+            canvas.drawRect(xLeft+xStepSize*2-4, XBAR_MARGIN,
+                    xLeft+xStepSize*2+3, XBAR_WIDTH+XBAR_MARGIN, mLimitPaint);
+            canvas.drawRect(xLeft+xStepSize*(xNStep-2)-4, XBAR_MARGIN,
+                    xLeft+xStepSize*(xNStep-2)+3, XBAR_WIDTH+XBAR_MARGIN, mLimitPaint);
+
+            // cursor
+            t = (int)(xLeft+xStepSize*(mXCovered.getLastValue()+2));
+            canvas.drawRect(t-4, XBAR_MARGIN-XBAR_CURSOR_ADD, t+3,
+                    XBAR_WIDTH+XBAR_MARGIN+XBAR_CURSOR_ADD, mCursorPaint);
+        }
+        if (mYEnabled && mYCovered != null) {
+            int yNStep = mYCovered.getNSteps() + 4; // two on each side as a buffer
+            int yStepSize = mYSize * 3/4 / yNStep;
+            int yLeft = mYSize * 1/8 + (mYSize * 3/4 % yNStep)/2;
+
+            // base bar
+            canvas.drawRect(YBAR_MARGIN, yLeft,
+                    YBAR_WIDTH+YBAR_MARGIN, yLeft+yStepSize*yNStep-1, mRangePaint);
+
+            // covered range
+            for (i=0; i<mYCovered.getNSteps(); ++i) {
+                if (mYCovered.isCovered(i)) {
+                    canvas.drawRect(
+                            YBAR_MARGIN, yLeft+yStepSize*(i+2),
+                            YBAR_WIDTH + YBAR_MARGIN, yLeft+yStepSize*(i+3)-1,
+                            mCoveredPaint);
+                }
+            }
+
+            // limit
+            canvas.drawRect(YBAR_MARGIN, yLeft + yStepSize * 2 - 4,
+                    YBAR_WIDTH + YBAR_MARGIN, yLeft + yStepSize * 2 + 3, mLimitPaint);
+            canvas.drawRect(YBAR_MARGIN, yLeft + yStepSize * (yNStep - 2) - 4,
+                    YBAR_WIDTH + YBAR_MARGIN, yLeft + yStepSize * (yNStep - 2) + 3, mLimitPaint);
+
+            // cursor
+            t = (int)(yLeft+yStepSize*(mYCovered.getLastValue()+2));
+            canvas.drawRect( YBAR_MARGIN-YBAR_CURSOR_ADD, t-4,
+                    YBAR_WIDTH+YBAR_MARGIN+YBAR_CURSOR_ADD, t+3, mCursorPaint);
+        }
+
+        if (mZEnabled && mZCovered != null) {
+            float stepSize  = 360.0f/mZCovered.getNSteps();
+
+            // base bar
+            canvas.drawArc(mZBoundOut,0, 360, true, mRangePaint);
+
+            // covered range
+            for (i=0; i<mZCovered.getNSteps(); ++i) {
+                if (mZCovered.isCovered(i)) {
+                    canvas.drawArc(mZBoundOut,i*stepSize-0.2f, stepSize+0.4f,
+                            true, mCoveredPaint);
+                }
+            }
+            // clear center
+            canvas.drawArc(mZBoundIn, 0, 360, true, mEraserPaint);
+            // cursor
+            canvas.drawArc(mZBoundOut2, mZCovered.getLastValue()*stepSize- 1, 2,
+                    true, mCursorPaint);
+            canvas.drawArc(mZBoundIn2, mZCovered.getLastValue()*stepSize-1.5f, 3,
+                    true, mEraserPaint);
+        }
+    }
+}
+
+/**
+ *  A range register class for the RVCVRecord Activity
+ */
+class RangeCoveredRegister {
+    enum MODE {
+        LINEAR,
+        ROTATE2D
+    }
+
+    private boolean[] mCovered;
+    private MODE mMode;
+    private int mStep;
+    private int mLow, mHigh;
+    private int mLastData;
+
+    // high is not inclusive
+    RangeCoveredRegister(int low, int high, int step) {
+        mMode = MODE.LINEAR;
+        mStep = step;
+        mLow = low;
+        mHigh = high;
+        init();
+    }
+
+    RangeCoveredRegister(int step) {
+        mMode = MODE.ROTATE2D;
+        mStep = step;
+        mLow = 0;
+        mHigh = 360;
+        init();
+    }
+
+    private void init() {
+        if (mMode == MODE.LINEAR) {
+            mCovered = new boolean[(mHigh-mLow)/mStep];
+        }else {
+            mCovered = new boolean[360/mStep];
+        }
+    }
+
+    /**
+     * Test if the range defined is fully covered.
+     *
+     * @return if the range is fully covered, return true; otherwise false.
+     */
+    public boolean isFullyCovered() {
+        for (boolean i:mCovered) {
+            if (!i) return false;
+        }
+        return true;
+    }
+
+    /**
+     * Test if a specific step is covered.
+     *
+     * @param i the step number
+     * @return if the step specified is covered, return true; otherwise false.
+     */
+    public boolean isCovered(int i) {
+        return mCovered[i];
+    }
+
+    /**
+     *
+     *
+     * @param data
+     * @return if this update changes the status of
+     */
+    public boolean update(int data) {
+        mLastData = data;
+
+        if (mMode == MODE.ROTATE2D) {
+            data %= 360;
+        }
+
+        int iStep = (data - mLow)/mStep;
+
+        if (iStep>=0 && iStep<getNSteps()) {
+            // only record valid data
+            mLastData = data;
+
+            if (mCovered[iStep]) {
+                return false;
+            } else {
+                mCovered[iStep] = true;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Get the number of steps in this register
+     *
+     * @return The number of steps in this register
+     */
+    public int getNSteps() {
+        //if (mCovered == null) {
+        //return 0;
+        //}
+        return mCovered.length;
+    }
+
+    /**
+     * Get the last value updated
+     *
+     * @return The last value updated
+     */
+    public float getLastValue() {
+        // ensure float division
+        return ((float)(mLastData - mLow))/mStep;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVCameraPreview.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVCameraPreview.java
new file mode 100644
index 0000000..a5b58f6
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVCameraPreview.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.verifier.sensors;
+
+// ----------------------------------------------------------------------
+
+import android.content.Context;
+import android.hardware.Camera;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+
+import java.io.IOException;
+import java.util.List;
+
+/** Camera preview class */
+public class RVCVCameraPreview extends SurfaceView implements SurfaceHolder.Callback {
+    private static final String TAG = "RVCVCameraPreview";
+    private static final boolean LOCAL_LOGD = true;
+
+    private SurfaceHolder mHolder;
+    private Camera mCamera;
+
+    /**
+     * Constructor
+     * @param context Activity context
+     * @param camera Camera object to be previewed
+     */
+    public RVCVCameraPreview(Context context, Camera camera) {
+        super(context);
+        mCamera = camera;
+        initSurface();
+    }
+
+    /**
+     * Constructor
+     * @param context Activity context
+     * @param attrs
+     */
+    public RVCVCameraPreview(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public void init(Camera camera) {
+        this.mCamera = camera;
+        initSurface();
+    }
+
+    private void initSurface() {
+        // Install a SurfaceHolder.Callback so we get notified when the
+        // underlying surface is created and destroyed.
+        mHolder = getHolder();
+        mHolder.addCallback(this);
+
+        // deprecated
+        // TODO: update this code to match new API level.
+        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+    }
+
+    /**
+     *  SurfaceHolder.Callback
+     *  Surface is created, it is OK to start the camera preview now.
+     */
+    public void surfaceCreated(SurfaceHolder holder) {
+        // The Surface has been created, now tell the camera where to draw the preview.
+
+        if (mCamera == null) {
+            // preview camera does not exist
+            return;
+        }
+
+        try {
+            mCamera.setPreviewDisplay(holder);
+            mCamera.startPreview();
+        } catch (IOException e) {
+            if (LOCAL_LOGD) Log.d(TAG, "Error when starting camera preview: " + e.getMessage());
+        }
+    }
+    /**
+     *  SurfaceHolder.Callback
+     */
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        // empty. Take care of releasing the Camera preview in your activity.
+    }
+
+    /**
+     *  SurfaceHolder.Callback
+     *  Restart camera preview if surface changed
+     */
+    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+
+        if (mHolder.getSurface() == null || mCamera == null){
+            // preview surface or camera does not exist
+            return;
+        }
+
+        // stop preview before making changes
+        mCamera.stopPreview();
+
+        // the activity using this view is locked to this orientation, so hard code is fine
+        mCamera.setDisplayOrientation(90);
+
+        //do the same as if it is created again
+        surfaceCreated(holder);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java
new file mode 100644
index 0000000..9011619
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java
@@ -0,0 +1,903 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.sensors;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.Camera;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.media.AudioManager;
+import android.media.CamcorderProfile;
+import android.media.MediaRecorder;
+import android.media.SoundPool;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.JsonWriter;
+import android.util.Log;
+import android.view.Window;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.android.cts.verifier.R;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+// ----------------------------------------------------------------------
+
+/**
+ *  An activity that does recording of the camera video and rotation vector data at the same time.
+ */
+public class RVCVRecordActivity extends Activity {
+    private static final String TAG = "RVCVRecordActivity";
+    //private static final boolean LOCAL_LOGD = true;
+    private static final boolean LOCAL_LOGV = false;
+
+    private MotionIndicatorView mIndicatorView;
+
+    private SoundPool mSoundPool;
+    private int [] mSoundPoolLookup;
+
+    private File mRecordDir;
+    private RecordProcedureController mController;
+    private VideoRecorder           mVideoRecorder;
+    private RVSensorLogger          mRVSensorLogger;
+    private CoverageManager         mCoverManager;
+    private CameraPreviewer         mPreviewer;
+
+    public static final int AXIS_NONE = 0;
+    public static final int AXIS_ALL = SensorManager.AXIS_X +
+                                       SensorManager.AXIS_Y +
+                                       SensorManager.AXIS_Z;
+
+    // For Rotation Vector algorithm research use
+    private final static boolean     LOG_RAW_SENSORS = false;
+    private RawSensorLogger          mRawSensorLogger;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Hide the window title.
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+
+        // inflate xml
+        setContentView(R.layout.cam_preview_overlay);
+
+        // locate views
+        mIndicatorView = (MotionIndicatorView) findViewById(R.id.cam_indicator);
+
+        initStoragePath();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mController.quit();
+
+        mPreviewer.end();
+        endSoundPool();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        // delay the initialization as much as possible
+        init();
+    }
+
+    /** display toast message
+     *
+     * @param msg Message content
+     */
+    private void message(String msg) {
+
+        Context context = getApplicationContext();
+        int duration = Toast.LENGTH_SHORT;
+
+        Toast toast = Toast.makeText(context, msg, duration);
+        toast.show();
+    }
+
+    /**
+     *  Initialize components
+     *
+     */
+    private void init() {
+        mPreviewer = new CameraPreviewer();
+        mPreviewer.init();
+
+        mCoverManager = new CoverageManager();
+        mIndicatorView.setDataProvider(
+                mCoverManager.getAxis(SensorManager.AXIS_X),
+                mCoverManager.getAxis(SensorManager.AXIS_Y),
+                mCoverManager.getAxis(SensorManager.AXIS_Z)  );
+
+        initSoundPool();
+        mRVSensorLogger = new RVSensorLogger(this);
+
+        mVideoRecorder = new VideoRecorder(mPreviewer.getCamera());
+
+        if (LOG_RAW_SENSORS) {
+            mRawSensorLogger = new RawSensorLogger(mRecordDir);
+        }
+
+        mController = new RecordProcedureController(this);
+    }
+
+    /**
+     * Notify recording is completed. This is the successful exit.
+     */
+    public void notifyComplete() {
+        message("Capture completed!");
+
+        Uri resultUri = Uri.fromFile(mRecordDir);
+        Intent result = new Intent();
+        result.setData(resultUri);
+        setResult(Activity.RESULT_OK, result);
+
+        finish();
+    }
+
+    /**
+     * Notify the user what to do next in text
+     *
+     * @param axis SensorManager.AXIS_X or SensorManager.AXIS_Y or SensorManager.AXIS_Z
+     */
+    private void notifyPrompt(int axis) {
+        // It is not XYZ because of earlier design have different definition of
+        // X and Y
+        final String axisName = "YXZ";
+
+        message("Manipulate the device in " + axisName.charAt(axis-1) + " axis (as illustrated) about the pattern.");
+    }
+
+    /**
+     *  Ask indicator view to redraw
+     */
+    private void redrawIndicator() {
+        mIndicatorView.invalidate();
+    }
+
+    /**
+     * Switch to a different axis for display and logging
+     * @param axis
+     */
+    private void switchAxis(int axis) {
+        ImageView imageView = (ImageView) findViewById(R.id.cam_overlay);
+
+        final int [] prompts = {R.drawable.prompt_x, R.drawable.prompt_y, R.drawable.prompt_z};
+
+        if (axis >=SensorManager.AXIS_X && axis <=SensorManager.AXIS_Z) {
+            imageView.setImageResource(prompts[axis-1]);
+            mIndicatorView.enableAxis(axis);
+            mRVSensorLogger.updateRegister(mCoverManager.getAxis(axis), axis);
+            notifyPrompt(axis);
+        } else {
+            imageView.setImageDrawable(null);
+            mIndicatorView.enableAxis(AXIS_NONE);
+        }
+        redrawIndicator();
+    }
+
+    /**
+     * Asynchronized way to call switchAxis. Use this if caller is not on UI thread.
+     * @param axis @param axis SensorManager.AXIS_X or SensorManager.AXIS_Y or SensorManager.AXIS_Z
+     */
+    public void switchAxisAsync(int axis) {
+        // intended to be called from a non-UI thread
+        final int fAxis = axis;
+        runOnUiThread(new Runnable() {
+            public void run() {
+                // UI code goes here
+                switchAxis(fAxis);
+            }
+        });
+    }
+
+    /**
+     * Initialize sound pool for user notification
+     */
+    private void initSoundPool() {
+        final int MAX_STREAM = 10;
+        int i=0;
+        mSoundPool = new SoundPool(MAX_STREAM, AudioManager.STREAM_MUSIC, 0);
+        mSoundPoolLookup = new int[MAX_STREAM];
+
+        // TODO: add different sound into this
+        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
+        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
+        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
+
+    }
+    private void endSoundPool() {
+        mSoundPool.release();
+    }
+
+    /**
+     * Play notify sound to user
+     * @param id ID of the sound to be played
+     */
+    public void playNotifySound(int id) {
+        mSoundPool.play(mSoundPoolLookup[id], 1, 1, 0, 0, 1);
+    }
+
+    /**
+     * Start the sensor recording
+     */
+    public void startRecordSensor() {
+        mRVSensorLogger.init();
+        if (LOG_RAW_SENSORS) {
+            mRawSensorLogger.init();
+        }
+    }
+
+    /**
+     * Stop the sensor recording
+     */
+    public void stopRecordSensor() {
+        mRVSensorLogger.end();
+        if (LOG_RAW_SENSORS) {
+            mRawSensorLogger.end();
+        }
+    }
+
+    /**
+     * Start video recording
+     */
+    public void startRecordVideo() {
+        mVideoRecorder.init();
+    }
+
+    /**
+     * Stop video recording
+     */
+    public void stopRecordVideo() {
+        mVideoRecorder.end();
+    }
+
+    /**
+     * Wait until a sensor recording for a certain axis is fully covered
+     * @param axis
+     */
+    public void waitUntilCovered(int axis) {
+        mCoverManager.waitUntilCovered(axis);
+    }
+
+
+    /**
+     *
+     */
+    private void initStoragePath() {
+        File rxcvRecDataDir = new File(Environment.getExternalStorageDirectory(),"RVCVRecData");
+
+        // Create the storage directory if it does not exist
+        if (! rxcvRecDataDir.exists()) {
+            if (! rxcvRecDataDir.mkdirs()) {
+                Log.e(TAG, "failed to create main data directory");
+            }
+        }
+
+        mRecordDir = new File(rxcvRecDataDir, new SimpleDateFormat("yyMMdd-hhmmss").format(new Date()));
+
+        if (! mRecordDir.mkdirs()) {
+            Log.e(TAG, "failed to create rec data directory");
+        }
+    }
+
+    /**
+     * Get the sensor log file path
+     * @return Path of the sensor log file
+     */
+    public String getSensorLogFilePath() {
+        return new File(mRecordDir, "sensor.log").getPath();
+    }
+
+    /**
+     * Get the video recording file path
+     * @return Path of the video recording file
+     */
+    public String getVideoRecFilePath() {
+        return new File(mRecordDir, "video.mp4").getPath();
+    }
+
+    /**
+     * Write out important camera/video information to a JSON file
+     * @param width         width of frame
+     * @param height        height of frame
+     * @param frameRate     frame rate in fps
+     * @param fovW          field of view in width direction
+     * @param fovH          field of view in height direction
+     */
+    public void writeVideoMetaInfo(int width, int height, float frameRate, float fovW, float fovH) {
+        try {
+            JsonWriter writer =
+                    new JsonWriter(
+                        new OutputStreamWriter(
+                                new FileOutputStream(
+                                        new File(mRecordDir, "videometa.json").getPath()
+                                )
+                        )
+                    );
+            writer.beginObject();
+            writer.name("fovW").value(fovW);
+            writer.name("fovH").value(fovH);
+            writer.name("width").value(width);
+            writer.name("height").value(height);
+            writer.name("frameRate").value(frameRate);
+            writer.endObject();
+
+            writer.close();
+        }catch (FileNotFoundException e) {
+            // Not very likely to happen
+            e.printStackTrace();
+        }catch (IOException e) {
+            // do nothing
+            e.printStackTrace();
+            Log.e(TAG, "Writing video meta data failed.");
+        }
+    }
+
+    /**
+     * Camera preview control class
+     */
+    class CameraPreviewer {
+        private Camera mCamera;
+
+        CameraPreviewer() {
+            try {
+                mCamera = Camera.open(); // attempt to get a default Camera instance
+            }
+            catch (Exception e) {
+                // Camera is not available (in use or does not exist)
+                Log.e(TAG, "Cannot obtain Camera!");
+            }
+        }
+
+        /**
+         * Get the camera to be previewed
+         * @return Reference to Camera used
+         */
+        public Camera getCamera() {
+            return mCamera;
+        }
+
+        /**
+         * Setup the camera
+         */
+        public void init() {
+            if (mCamera != null) {
+                double alpha = mCamera.getParameters().getHorizontalViewAngle()*Math.PI/180.0;
+                int width = 1920;
+                double fx = width/2/Math.tan(alpha/2.0);
+
+                if (LOCAL_LOGV) Log.v(TAG, "View angle="
+                        + mCamera.getParameters().getHorizontalViewAngle() +"  Estimated fx = "+fx);
+
+                RVCVCameraPreview cameraPreview =
+                        (RVCVCameraPreview) findViewById(R.id.cam_preview);
+                cameraPreview.init(mCamera);
+            } else {
+                message("Cannot open camera!");
+                finish();
+            }
+        }
+
+        /**
+         * End the camera preview
+         */
+        public void end() {
+            if (mCamera != null) {
+                mCamera.release();        // release the camera for other applications
+                mCamera = null;
+            }
+        }
+    }
+
+    /**
+     * Manage a set of RangeCoveredRegister objects
+     */
+    class CoverageManager {
+        // settings
+        private final int MAX_TILT_ANGLE = 60; // +/- 60
+        //private final int REQUIRED_TILT_ANGLE = 50; // +/- 50
+        private final int TILT_ANGLE_STEP = 5; // 5 degree(s) per step
+        private final int YAW_ANGLE_STEP = 10; // 10 degree(s) per step
+
+        RangeCoveredRegister[] mAxisCovered;
+
+        CoverageManager() {
+            mAxisCovered = new RangeCoveredRegister[3];
+            // X AXIS
+            mAxisCovered[0] = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+            // Y AXIS
+            mAxisCovered[1] = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+            // Z AXIS
+            mAxisCovered[2] = new RangeCoveredRegister(YAW_ANGLE_STEP);
+        }
+
+        public RangeCoveredRegister getAxis(int axis) {
+            // SensorManager.AXIS_X = 1, need offset -1 for mAxisCovered array
+            return mAxisCovered[axis-1];
+        }
+
+        public void waitUntilCovered(int axis) {
+            // SensorManager.AXIS_X = 1, need offset -1 for mAxisCovered array
+            while(!mAxisCovered[axis-1].isFullyCovered()) {
+                try {
+                    Thread.sleep(500);
+                } catch (InterruptedException e) {
+                    if (LOCAL_LOGV) {
+                        Log.v(TAG, "waitUntilCovered axis = "+ axis + " is interrupted");
+                    }
+                }
+            }
+        }
+    }
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * A class controls the video recording
+     */
+    class VideoRecorder
+    {
+        private MediaRecorder mRecorder;
+        private Camera mCamera;
+        private boolean mRunning = false;
+
+        private int [] mPreferredProfiles = {   CamcorderProfile.QUALITY_480P,  // smaller -> faster
+                                        CamcorderProfile.QUALITY_720P,
+                                        CamcorderProfile.QUALITY_1080P,
+                                        CamcorderProfile.QUALITY_HIGH // existence guaranteed
+                                    };
+
+
+        VideoRecorder(Camera camera) {
+            mCamera = camera;
+        }
+
+        /**
+         * Initialize and start recording
+         */
+        public void init() {
+            float fovW =  mCamera.getParameters().getHorizontalViewAngle();
+            float fovH =  mCamera.getParameters().getVerticalViewAngle();
+
+            mRecorder = new MediaRecorder();
+
+            mCamera.unlock();
+
+            mRecorder.setCamera(mCamera);
+
+            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
+            mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
+
+            CamcorderProfile profile = null;
+            for (int i: mPreferredProfiles) {
+                if (CamcorderProfile.hasProfile(i)) {
+                    profile = CamcorderProfile.get(i);
+                    mRecorder.setProfile(profile);
+                    break;
+                }
+            }
+
+            writeVideoMetaInfo(profile.videoFrameWidth, profile.videoFrameHeight,
+                    profile.videoFrameRate, fovW, fovH);
+
+            try {
+                mRecorder.setOutputFile(getVideoRecFilePath());
+                mRecorder.prepare();
+            } catch (IOException e) {
+                Log.e(TAG, "Preparation for recording failed.");
+            }
+
+            try {
+                mRecorder.start();
+            } catch (RuntimeException e) {
+                Log.e(TAG, "Starting recording failed.");
+                mRecorder.reset();
+                mRecorder.release();
+                mCamera.lock();
+            }
+            mRunning = true;
+        }
+
+        /**
+         * Stop recording
+         */
+        public void end() {
+            if (mRunning) {
+                try {
+                    mRecorder.stop();
+                    mRecorder.reset();
+                    mRecorder.release();
+                    mCamera.lock();
+                } catch (RuntimeException e) {
+                    e.printStackTrace();
+                    Log.e(TAG, "Runtime error in stopping recording.");
+                }
+            }
+            mRecorder = null;
+        }
+
+    }
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     *  Log all raw sensor readings, for Rotation Vector sensor algorithms research
+     */
+    class RawSensorLogger implements SensorEventListener {
+        private final String TAG = "RawSensorLogger";
+
+        private final static int SENSOR_RATE = SensorManager.SENSOR_DELAY_FASTEST;
+        private File mRecPath;
+
+        SensorManager mSensorManager;
+        Sensor mAccSensor, mGyroSensor, mMagSensor;
+        OutputStreamWriter mAccLogWriter, mGyroLogWriter, mMagLogWriter;
+
+        private float[] mRTemp = new float[16];
+
+        RawSensorLogger(File recPath) {
+            mRecPath = recPath;
+        }
+
+        /**
+         * Initialize and start recording
+         */
+        public void init() {
+            mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
+
+            mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+            mGyroSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);
+            mMagSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
+
+            mSensorManager.registerListener(this, mAccSensor, SENSOR_RATE);
+            mSensorManager.registerListener(this, mGyroSensor, SENSOR_RATE);
+            mSensorManager.registerListener(this, mMagSensor, SENSOR_RATE);
+
+            try {
+                mAccLogWriter= new OutputStreamWriter(
+                        new FileOutputStream(new File(mRecPath, "raw_acc.log")));
+                mGyroLogWriter= new OutputStreamWriter(
+                        new FileOutputStream(new File(mRecPath, "raw_uncal_gyro.log")));
+                mMagLogWriter= new OutputStreamWriter(
+                        new FileOutputStream(new File(mRecPath, "raw_uncal_mag.log")));
+
+            } catch (FileNotFoundException e) {
+                Log.e(TAG, "Sensor log file open failed: " + e.toString());
+            }
+        }
+
+        /**
+         * Stop recording and clean up
+         */
+        public void end() {
+            mSensorManager.flush(this);
+            mSensorManager.unregisterListener(this);
+
+            try {
+                if (mAccLogWriter != null) {
+                    OutputStreamWriter writer = mAccLogWriter;
+                    mAccLogWriter = null;
+                    writer.close();
+                }
+                if (mGyroLogWriter != null) {
+                    OutputStreamWriter writer = mGyroLogWriter;
+                    mGyroLogWriter = null;
+                    writer.close();
+                }
+                if (mMagLogWriter != null) {
+                    OutputStreamWriter writer = mMagLogWriter;
+                    mMagLogWriter = null;
+                    writer.close();
+                }
+
+            } catch (IOException e) {
+                Log.e(TAG, "Sensor log file close failed: " + e.toString());
+            }
+        }
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int i) {
+            // do not care
+        }
+
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+            OutputStreamWriter writer=null;
+            switch(event.sensor.getType()) {
+                case Sensor.TYPE_ACCELEROMETER:
+                    writer = mAccLogWriter;
+                    break;
+                case Sensor.TYPE_GYROSCOPE_UNCALIBRATED:
+                    writer = mGyroLogWriter;
+                    break;
+                case Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED:
+                    writer = mMagLogWriter;
+                    break;
+
+            }
+            if (writer!=null)  {
+                float[] data = event.values;
+                try {
+                    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+                        writer.write(String.format("%d %f %f %f\r\n",
+                                event.timestamp, data[0], data[1], data[2]));
+                    }else // TYPE_GYROSCOPE_UNCALIBRATED and TYPE_MAGNETIC_FIELD_UNCALIBRATED
+                    {
+                        writer.write(String.format("%d %f %f %f %f %f %f\r\n", event.timestamp,
+                                data[0], data[1], data[2], data[3], data[4], data[5]));
+                    }
+                }catch (IOException e)
+                {
+                    Log.e(TAG, "Write to raw sensor log file failed.");
+                }
+
+            }
+        }
+    }
+    
+    /**
+     *  Rotation sensor logger class
+     */
+    class RVSensorLogger implements SensorEventListener {
+        private final String TAG = "RVSensorLogger";
+
+        private final static int SENSOR_RATE = 100;
+        RangeCoveredRegister mRegister;
+        int mAxis;
+        RVCVRecordActivity mActivity;
+
+        SensorManager mSensorManager;
+        Sensor mRVSensor;
+        OutputStreamWriter mLogWriter;
+
+        private float[] mRTemp = new float[16];
+
+        RVSensorLogger(RVCVRecordActivity activity) {
+            mActivity = activity;
+        }
+
+        /**
+         * Initialize and start recording
+         */
+        public void init() {
+            mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
+            mRVSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
+            mSensorManager.registerListener(this, mRVSensor, SENSOR_RATE);
+
+            try {
+                mLogWriter= new OutputStreamWriter(
+                        new FileOutputStream(mActivity.getSensorLogFilePath()));
+            } catch (FileNotFoundException e) {
+                Log.e(TAG, "Sensor log file open failed: " + e.toString());
+            }
+        }
+
+        /**
+         * Stop recording and clean up
+         */
+        public void end() {
+            mSensorManager.flush(this);
+            mSensorManager.unregisterListener(this);
+
+            try {
+                if (mLogWriter != null) {
+                    OutputStreamWriter writer = mLogWriter;
+                    mLogWriter = null;
+                    writer.close();
+                }
+            } catch (IOException e) {
+                Log.e(TAG, "Sensor log file close failed: " + e.toString());
+            }
+
+            updateRegister(null, AXIS_NONE);
+        }
+
+        private void onNewData(float[] data, long timestamp) {
+            // LOG
+            try {
+                if (mLogWriter != null) {
+                    mLogWriter.write(String.format("%d %f %f %f %f\r\n", timestamp,
+                            data[3], data[0], data[1], data[2]));
+                }
+            } catch (IOException e) {
+                Log.e(TAG, "Sensor log file write failed: " + e.toString());
+            }
+
+            // Update UI
+            if (mRegister != null) {
+                int d = 0;
+                int dx, dy, dz;
+                boolean valid = false;
+                SensorManager.getRotationMatrixFromVector(mRTemp, data);
+
+                dx = (int)(Math.asin(mRTemp[8])*(180.0/Math.PI));
+                dy = (int)(Math.asin(mRTemp[9])*(180.0/Math.PI));
+                dz = (int)((Math.atan2(mRTemp[4], mRTemp[0])+Math.PI)*(180.0/Math.PI));
+
+                switch(mAxis) {
+                    case SensorManager.AXIS_X:
+                        d = dx;
+                        valid = (Math.abs(dy) < 30);
+                        break;
+                    case SensorManager.AXIS_Y:
+                        d = dy;
+                        valid = (Math.abs(dx) < 30);
+                        break;
+                    case SensorManager.AXIS_Z:
+                        d = dz;
+                        valid = (Math.abs(dx) < 20 && Math.abs(dy) < 20);
+                        break;
+                }
+
+                if (valid) {
+                    mRegister.update(d);
+                    mActivity.redrawIndicator();
+                }
+            }
+
+        }
+
+        public void updateRegister(RangeCoveredRegister reg, int axis) {
+            mRegister = reg;
+            mAxis = axis;
+        }
+
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int i) {
+            // do not care
+        }
+
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+            if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
+                onNewData(event.values, event.timestamp);
+            }
+        }
+    }
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Controls the over all logic of record procedure: first x-direction, then y-direction and
+     * then z-direction.
+     */
+    class RecordProcedureController implements Runnable {
+        private static final boolean LOCAL_LOGV = false;
+
+        private final RVCVRecordActivity mActivity;
+        private Thread mThread = null;
+
+        RecordProcedureController(RVCVRecordActivity activity) {
+            mActivity = activity;
+            mThread = new Thread(this);
+            mThread.start();
+        }
+
+        /**
+         * Run the record procedure
+         */
+        public void run() {
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread Started.");
+            //start recording & logging
+            delay(2000);
+
+            init();
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread init() finished.");
+
+            // test 3 axis
+            // It is in YXZ order because UI element design use opposite definition
+            // of XY axis. To ensure the user see X Y Z, it is flipped here.
+            recordAxis(SensorManager.AXIS_Y);
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread axis 0 finished.");
+
+            recordAxis(SensorManager.AXIS_X);
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread axis 1 finished.");
+
+            recordAxis(SensorManager.AXIS_Z);
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread axis 2 finished.");
+
+            delay(1000);
+            end();
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread End.");
+        }
+
+        private void delay(int milli) {
+            try{
+                Thread.sleep(milli);
+            } catch(InterruptedException e) {
+                if (LOCAL_LOGV) Log.v(TAG, "Controller Thread Interrupted.");
+            }
+        }
+        private void init() {
+            // start video recording
+            mActivity.startRecordVideo();
+
+            // start sensor logging & listening
+            mActivity.startRecordSensor();
+        }
+
+        private void end() {
+            // stop video recording
+            mActivity.stopRecordVideo();
+
+            // stop sensor logging
+            mActivity.stopRecordSensor();
+
+            // notify ui complete
+            runOnUiThread(new Runnable(){
+                public void run() {
+                    mActivity.notifyComplete();
+                }
+            });
+        }
+
+        private void recordAxis(int axis) {
+            // delay 2 seconds?
+            delay(1000);
+
+            // change ui
+            mActivity.switchAxisAsync(axis);
+
+            // play start sound
+            mActivity.playNotifySound(0);
+
+            // wait until axis covered
+            mActivity.waitUntilCovered(axis);
+
+            // play stop sound
+            mActivity.playNotifySound(1);
+        }
+
+        /**
+         * Force quit
+         */
+        public void quit() {
+            mThread.interrupt();
+            try {
+                if (LOCAL_LOGV) Log.v(TAG, "Wait for controller to end");
+
+                // stop video recording
+                mActivity.stopRecordVideo();
+
+                // stop sensor logging
+                mActivity.stopRecordSensor();
+
+            } catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
new file mode 100644
index 0000000..128aaa3
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
@@ -0,0 +1,1290 @@
+package com.android.cts.verifier.sensors;
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import android.media.MediaCodec;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.os.Debug;
+import android.os.Environment;
+import android.util.JsonWriter;
+import android.util.Log;
+
+import org.opencv.core.Mat;
+import org.opencv.core.CvType;
+import org.opencv.core.MatOfDouble;
+import org.opencv.core.MatOfFloat;
+import org.opencv.core.MatOfPoint2f;
+import org.opencv.core.MatOfPoint3f;
+import org.opencv.core.Size;
+import org.opencv.highgui.Highgui;
+import org.opencv.imgproc.Imgproc;
+import org.opencv.calib3d.Calib3d;
+import org.opencv.core.Core;
+
+import org.json.JSONObject;
+import org.json.JSONException;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+
+import android.opengl.GLES20;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ *  This class does analysis on the recorded RVCVCXCheck data sets.
+ */
+public class RVCVXCheckAnalyzer {
+    private static final String TAG = "RVCXAnalysis";
+    private static final boolean LOCAL_LOGV = false;
+    private static final boolean LOCAL_LOGD = true;
+    private final String mPath;
+
+    private static final boolean OUTPUT_DEBUG_IMAGE = false;
+    private static final double VALID_FRAME_THRESHOLD = 0.8;
+    private static final double REPROJECTION_THREASHOLD = 4.0;
+    private static final boolean FORCE_CV_ANALYSIS  = false;
+    private static final boolean TRACE_VIDEO_ANALYSIS = false;
+    private static final double DECIMATION_FPS_TARGET = 15.0;
+
+    RVCVXCheckAnalyzer(String path)
+    {
+        mPath = path;
+    }
+
+    /**
+     * A class that contains  the analysis results
+     *
+     */
+    class AnalyzeReport {
+        public boolean error=true;
+        public String reason = "incomplete";
+
+        // roll pitch yaw RMS error ( \sqrt{\frac{1}{n} \sum e_i^2 })
+        // unit in rad
+        public double roll_rms_error;
+        public double pitch_rms_error;
+        public double yaw_rms_error;
+
+        // roll pitch yaw max error
+        // unit in rad
+        public double roll_max_error;
+        public double pitch_max_error;
+        public double yaw_max_error;
+
+        // optimal t delta between sensor and camera data set to make best match
+        public double optimal_delta_t;
+        // the associate yaw offset based on initial values
+        public double yaw_offset;
+
+        public int n_of_frame;
+        public int n_of_valid_frame;
+
+        // both data below are in [sec]
+        public double sensor_period_avg;
+        public double sensor_period_stdev;
+
+        /**
+         * write Json format serialization to a file in case future processing need the data
+         */
+        public void writeToFile(File file) {
+            try {
+                writeJSONToStream(new FileOutputStream(file));
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+                Log.e(TAG, "Cannot create analyze report file.");
+            }
+        }
+
+        /**
+         * Get the JSON format serialization
+         *@return Json format serialization as String
+         */
+        @Override
+        public String toString() {
+            ByteArrayOutputStream s = new ByteArrayOutputStream();
+            writeJSONToStream(s);
+            return new String(s.toByteArray(),  java.nio.charset.StandardCharsets.UTF_8);
+        }
+
+        private void writeJSONToStream(OutputStream s) {
+            try{
+                JsonWriter writer =
+                        new JsonWriter(
+                                new OutputStreamWriter( s )
+                        );
+                writer.beginObject();
+                writer.setLenient(true);
+
+                writer.name("roll_rms_error").value(roll_rms_error);
+                writer.name("pitch_rms_error").value(pitch_rms_error);
+                writer.name("yaw_rms_error").value(yaw_rms_error);
+                writer.name("roll_max_error").value(roll_max_error);
+                writer.name("pitch_max_error").value(pitch_max_error);
+                writer.name("yaw_max_error").value(yaw_max_error);
+                writer.name("optimal_delta_t").value(optimal_delta_t);
+                writer.name("yaw_offset").value(yaw_offset);
+                writer.name("n_of_frame").value(n_of_frame);
+                writer.name("n_of_valid_frame").value(n_of_valid_frame);
+                writer.name("sensor_period_avg").value(sensor_period_avg);
+                writer.name("sensor_period_stdev").value(sensor_period_stdev);
+
+                writer.endObject();
+
+                writer.close();
+            } catch (IOException e) {
+                // do nothing
+                Log.e(TAG, "Error in serialize analyze report to JSON");
+            } catch (IllegalArgumentException e) {
+                e.printStackTrace();
+                Log.e(TAG, "Invalid parameter to write into JSON format");
+            }
+        }
+    }
+
+    /**
+     *  Process data set stored in the path specified in constructor
+     *  and return an analyze report to caller
+     *
+     *  @return An AnalyzeReport that contains detailed information about analysis
+     */
+    public AnalyzeReport processDataSet() {
+        int nframe;// number of frames in video
+        int nslog; // number of sensor log
+        int nvlog; // number of video generated log
+
+
+        AnalyzeReport report = new AnalyzeReport();
+
+        ArrayList<AttitudeRec> srecs = new ArrayList<>();
+        ArrayList<AttitudeRec> vrecs = new ArrayList<>();
+        ArrayList<AttitudeRec> srecs2 = new ArrayList<>();
+
+
+        final boolean use_solved = new File(mPath, "vision_rpy.log").exists() && !FORCE_CV_ANALYSIS;
+
+        if (use_solved) {
+            nframe = nvlog = loadAttitudeRecs(new File(mPath, "vision_rpy.log"), vrecs);
+            nslog = loadAttitudeRecs(new File(mPath, "sensor_rpy.log"),srecs);
+        }else {
+            nframe = analyzeVideo(vrecs);
+            nvlog = vrecs.size();
+
+            if (LOCAL_LOGV) {
+                Log.v(TAG, "Post video analysis nvlog = " + nvlog + " nframe=" + nframe);
+            }
+            if (nvlog <= 0 || nframe <= 0) {
+                // invalid results
+                report.reason = "Unable to to load recorded video.";
+                return report;
+            }
+            if ((double) nvlog / nframe < VALID_FRAME_THRESHOLD) {
+                // to many invalid frames
+                report.reason = "Too many invalid frames.";
+                return null;
+            }
+
+            fixFlippedAxis(vrecs);
+
+            nslog = loadSensorLog(srecs);
+        }
+
+        // Gradient descent will have faster performance than this simple search,
+        // but the performance is dominated by the vision part, so it is not very necessary.
+        double delta_t;
+        double min_rms = Double.MAX_VALUE;
+        double min_delta_t =0.;
+        double min_yaw_offset =0.;
+
+        // pre-allocation
+        for (AttitudeRec i: vrecs) {
+            srecs2.add(new AttitudeRec(0,0,0,0));
+        }
+
+        // find optimal offset
+        for (delta_t = -2.0; delta_t<2.0; delta_t +=0.01) {
+            double rms;
+            resampleSensorLog(srecs, vrecs, delta_t, 0.0, srecs2);
+            rms = Math.sqrt(calcSqrErr(vrecs, srecs2, 0)+ calcSqrErr(vrecs, srecs2, 1));
+            if (rms < min_rms) {
+                min_rms = rms;
+                min_delta_t = delta_t;
+                min_yaw_offset = vrecs.get(0).yaw - srecs2.get(0).yaw;
+            }
+        }
+        // sample at optimal offset
+        resampleSensorLog(srecs, vrecs, min_delta_t, min_yaw_offset, srecs2);
+
+        if (!use_solved) {
+            dumpAttitudeRecs(new File(mPath, "vision_rpy.log"), vrecs);
+            dumpAttitudeRecs(new File(mPath, "sensor_rpy.log"), srecs);
+        }
+        dumpAttitudeRecs(new File(mPath, "sensor_rpy_resampled.log"), srecs2);
+        dumpAttitudeError(new File(mPath, "attitude_error.log"), vrecs, srecs2);
+
+        // fill report fields
+        report.roll_rms_error = Math.sqrt(calcSqrErr(vrecs, srecs2, 0));
+        report.pitch_rms_error = Math.sqrt(calcSqrErr(vrecs, srecs2, 1));
+        report.yaw_rms_error = Math.sqrt(calcSqrErr(vrecs, srecs2, 2));
+
+        report.roll_max_error = calcMaxErr(vrecs, srecs2, 0);
+        report.pitch_max_error = calcMaxErr(vrecs, srecs2, 1);
+        report.yaw_max_error = calcMaxErr(vrecs, srecs2, 2);
+
+        report.optimal_delta_t = min_delta_t;
+        report.yaw_offset = (min_yaw_offset);
+
+        report.n_of_frame = nframe;
+        report.n_of_valid_frame = nvlog;
+
+        double [] sensor_period_stat = calcSensorPeriodStat(srecs);
+        report.sensor_period_avg = sensor_period_stat[0];
+        report.sensor_period_stdev = sensor_period_stat[1];
+
+        // output report to file and log in JSON format as well
+        report.writeToFile(new File(mPath, "report.json"));
+        if (LOCAL_LOGV)    Log.v(TAG, "Report in JSON:" + report.toString());
+
+        report.reason = "Completed";
+        report.error = false;
+        return report;
+    }
+
+    /**
+     * Generate pattern geometry like this one
+     * http://docs.opencv.org/trunk/_downloads/acircles_pattern.png
+     *
+     * @return Array of 3D points
+     */
+    private MatOfPoint3f asymmetricalCircleGrid(Size size) {
+        final int cn = 3;
+
+        int n = (int)(size.width * size.height);
+        float positions[] = new float[n * cn];
+        float unit=0.02f;
+        MatOfPoint3f grid = new MatOfPoint3f();
+
+        for (int i = 0; i < size.height; i++) {
+            for (int j = 0; j < size.width * cn; j += cn) {
+                positions[(int) (i * size.width * cn + j + 0)] =
+                        (2 * (j / cn) + i % 2) * (float) unit;
+                positions[(int) (i * size.width * cn + j + 1)] =
+                        i * unit;
+                positions[(int) (i * size.width * cn + j + 2)] = 0;
+            }
+        }
+        grid.create(n, 1, CvType.CV_32FC3);
+        grid.put(0, 0, positions);
+        return grid;
+    }
+
+    /**
+     *  Create a camera intrinsic matrix using input parameters
+     *
+     *  The camera intrinsic matrix will be like:
+     *
+     *       +-                       -+
+     *       |  f   0    center.width  |
+     *   A = |  0   f    center.height |
+     *       |  0   0         1        |
+     *       +-                       -+
+     *
+     *  @return An approximated (not actually calibrated) camera matrix
+     */
+    private static Mat cameraMatrix(float f, Size center) {
+        final double [] data = {f, 0, center.width, 0, f, center.height, 0, 0, 1f};
+        Mat m = new Mat(3,3, CvType.CV_64F);
+        m.put(0, 0, data);
+        return m;
+    }
+
+    /**
+     *  Attitude record in time roll pitch yaw format.
+     *
+     */
+    private class AttitudeRec {
+        public double time;
+        public double roll;
+        public double pitch;
+        public double yaw;
+
+        // ctor
+        AttitudeRec(double atime, double aroll, double apitch, double ayaw) {
+            time = atime;
+            roll = aroll;
+            pitch = apitch;
+            yaw = ayaw;
+        }
+
+        // ctor
+        AttitudeRec(double atime, double [] rpy) {
+            time = atime;
+            roll = rpy[0];
+            pitch = rpy[1];
+            yaw = rpy[2];
+        }
+
+        // copy value of another to this
+        void assign(AttitudeRec rec) {
+            time = rec.time;
+            roll = rec.time;
+            pitch = rec.pitch;
+            yaw = rec.yaw;
+        }
+
+        // copy roll-pitch-yaw value but leave the time specified by atime
+        void assign(AttitudeRec rec, double atime) {
+            time = atime;
+            roll = rec.time;
+            pitch = rec.pitch;
+            yaw = rec.yaw;
+        }
+
+        // set each field separately
+        void set(double atime, double aroll, double apitch, double ayaw) {
+            time = atime;
+            roll = aroll;
+            pitch = apitch;
+            yaw = ayaw;
+        }
+    }
+
+
+    /**
+     *  Load the sensor log in (time Roll-pitch-yaw) format to a ArrayList<AttitudeRec>
+     *
+     *  @return the number of sensor log items
+     */
+    private int loadSensorLog(ArrayList<AttitudeRec> recs) {
+        //ArrayList<AttitudeRec> recs = new ArrayList<AttitudeRec>();
+        File csvFile = new File(mPath, "sensor.log");
+        BufferedReader br=null;
+        String line;
+
+        // preallocate and reuse
+        double [] quat = new double[4];
+        double [] rpy = new double[3];
+
+        double t0 = -1;
+
+        try {
+            br = new BufferedReader(new FileReader(csvFile));
+            while ((line = br.readLine()) != null) {
+                //space separator
+                String[] items = line.split(" ");
+
+                if (items.length != 5) {
+                    recs.clear();
+                    return -1;
+                }
+
+                quat[0] = Double.parseDouble(items[1]);
+                quat[1] = Double.parseDouble(items[2]);
+                quat[2] = Double.parseDouble(items[3]);
+                quat[3] = Double.parseDouble(items[4]);
+
+                //
+                quat2rpy(quat, rpy);
+
+                if (t0 < 0) {
+                    t0 = Long.parseLong(items[0])/1e9;
+                }
+                recs.add(new AttitudeRec(Long.parseLong(items[0])/1e9-t0, rpy));
+            }
+
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Cannot find sensor logging data");
+        } catch (IOException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Cannot read sensor logging data");
+        } finally {
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return recs.size();
+    }
+
+    /**
+     * Read video meta info
+     */
+    private class VideoMetaInfo {
+        public double fps;
+        public int frameWidth;
+        public int frameHeight;
+        public double fovWidth;
+        public double fovHeight;
+        public boolean valid = false;
+
+        VideoMetaInfo(File file) {
+
+            BufferedReader br=null;
+            String line;
+            String content="";
+            try {
+                br = new BufferedReader(new FileReader(file));
+                while ((line = br.readLine()) != null) {
+                    content = content +line;
+                }
+
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+                Log.e(TAG, "Cannot find video meta info file");
+            } catch (IOException e) {
+                e.printStackTrace();
+                Log.e(TAG, "Cannot read video meta info file");
+            } finally {
+                if (br != null) {
+                    try {
+                        br.close();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+
+            if (content.isEmpty()) {
+                return;
+            }
+
+            try {
+                JSONObject json = new JSONObject(content);
+                frameWidth = json.getInt("width");
+                frameHeight = json.getInt("height");
+                fps = json.getDouble("frameRate");
+                fovWidth = json.getDouble("fovW")*Math.PI/180.0;
+                fovHeight = json.getDouble("fovH")*Math.PI/180.0;
+            } catch (JSONException e) {
+                return;
+            }
+
+            valid = true;
+
+        }
+    }
+
+
+
+    /**
+     * Debugging helper function, load ArrayList<AttitudeRec> from a file dumped out by
+     * dumpAttitudeRecs
+     */
+    private int loadAttitudeRecs(File file, ArrayList<AttitudeRec> recs) {
+        BufferedReader br=null;
+        String line;
+        double time;
+        double [] rpy = new double[3];
+
+        try {
+            br = new BufferedReader(new FileReader(file));
+            while ((line = br.readLine()) != null) {
+                //space separator
+                String[] items = line.split(" ");
+
+                if (items.length != 4) {
+                    recs.clear();
+                    return -1;
+                }
+
+                time = Double.parseDouble(items[0]);
+                rpy[0] = Double.parseDouble(items[1]);
+                rpy[1] = Double.parseDouble(items[2]);
+                rpy[2] = Double.parseDouble(items[3]);
+
+                recs.add(new AttitudeRec(time, rpy));
+            }
+
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Cannot find AttitudeRecs file specified.");
+        } catch (IOException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Read AttitudeRecs file failure");
+        } finally {
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return recs.size();
+    }
+    /**
+     * Debugging helper function, Dump an ArrayList<AttitudeRec> to a file
+     */
+    private void dumpAttitudeRecs(File file, ArrayList<AttitudeRec> recs) {
+        OutputStreamWriter w=null;
+        try {
+            w = new OutputStreamWriter(new FileOutputStream(file));
+
+            for (AttitudeRec r : recs) {
+                w.write(String.format("%f %f %f %f\r\n", r.time, r.roll, r.pitch, r.yaw));
+            }
+            w.close();
+        } catch(FileNotFoundException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Cannot create AttitudeRecs file.");
+        } catch (IOException e) {
+            Log.e(TAG, "Write AttitudeRecs file failure");
+        } finally {
+            if (w!=null) {
+                try {
+                    w.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     *  Read the sensor log in ArrayList<AttitudeRec> format and find out the sensor sample time
+     *  statistics: mean and standard deviation.
+     *
+     *  @return The returned value will be a double array with exact 2 items, first [0] will be
+     *  mean and the second [1]  will be the standard deviation.
+     *
+     */
+    private double [] calcSensorPeriodStat(ArrayList<AttitudeRec> srec)   {
+        double tp = srec.get(0).time;
+        int i;
+        double sum = 0.0;
+        double sumsq = 0.0;
+        for(i=1; i<srec.size(); ++i) {
+            double dt;
+            dt = srec.get(i).time - tp;
+            sum += dt;
+            sumsq += dt*dt;
+            tp += dt;
+        }
+        double [] ret = new double[2];
+        ret[0] = sum/srec.size();
+        ret[1] = Math.sqrt(sumsq/srec.size() - ret[0]*ret[0]);
+        return ret;
+    }
+
+    /**
+     * Flipping the axis as the image are flipped upside down in OpenGL frames
+     */
+    private void fixFlippedAxis(ArrayList<AttitudeRec> vrecs)   {
+        for (AttitudeRec i: vrecs) {
+            i.yaw = -i.yaw;
+        }
+    }
+
+    /**
+     *  Calculate the maximum error on the specified axis between two time aligned (resampled)
+     *  ArrayList<AttitudeRec>. Yaw axis needs special treatment as 0 and 2pi error are same thing
+     *
+     * @param ra  one ArrayList of AttitudeRec
+     * @param rb  the other ArrayList of AttitudeRec
+     * @param axis axis id for the comparison (0 = roll, 1 = pitch, 2 = yaw)
+     * @return Maximum error
+     */
+    private double calcMaxErr(ArrayList<AttitudeRec> ra, ArrayList<AttitudeRec> rb, int axis)  {
+        // check if they are valid and comparable data
+        if (ra.size() != rb.size()) {
+            throw new ArrayIndexOutOfBoundsException("Two array has to be the same");
+        }
+        // check input parameter validity
+        if (axis<0 || axis > 2) {
+            throw new IllegalArgumentException("Invalid data axis.");
+        }
+
+        int i;
+        double max = 0.0;
+        double diff = 0.0;
+        for(i=0; i<ra.size(); ++i) {
+            // make sure they are aligned data
+            if (ra.get(i).time != rb.get(i).time) {
+                throw new IllegalArgumentException("Element "+i+
+                        " of two inputs has different time.");
+            }
+            switch(axis) {
+                case 0:
+                    diff = ra.get(i).roll - rb.get(i).roll; // they always opposite of each other..
+                    break;
+                case 1:
+                    diff = ra.get(i).pitch - rb.get(i).pitch;
+                    break;
+                case 2:
+                    diff = Math.abs(((4*Math.PI + ra.get(i).yaw - rb.get(i).yaw)%(2*Math.PI))
+                            -Math.PI)-Math.PI;
+                    break;
+            }
+            diff = Math.abs(diff);
+            if (diff>max) {
+                max = diff;
+            }
+        }
+        return max;
+    }
+
+    /**
+     *  Calculate the RMS error on the specified axis between two time aligned (resampled)
+     *  ArrayList<AttitudeRec>. Yaw axis needs special treatment as 0 and 2pi error are same thing
+     *
+     * @param ra  one ArrayList of AttitudeRec
+     * @param rb  the other ArrayList of AttitudeRec
+     * @param axis axis id for the comparison (0 = roll, 1 = pitch, 2 = yaw)
+     * @return Mean square error
+     */
+    private double calcSqrErr(ArrayList<AttitudeRec> ra, ArrayList<AttitudeRec> rb, int axis) {
+        // check if they are valid and comparable data
+        if (ra.size() != rb.size()) {
+            throw new ArrayIndexOutOfBoundsException("Two array has to be the same");
+        }
+        // check input parameter validity
+        if (axis<0 || axis > 2) {
+            throw new IllegalArgumentException("Invalid data axis.");
+        }
+
+        int i;
+        double sum = 0.0;
+        double diff = 0.0;
+        for(i=0; i<ra.size(); ++i) {
+            // check input data validity
+            if (ra.get(i).time != rb.get(i).time) {
+                throw new IllegalArgumentException("Element "+i+
+                        " of two inputs has different time.");
+            }
+
+            switch(axis) {
+                case 0:
+                    diff = ra.get(i).roll - rb.get(i).roll;
+                    break;
+                case 1:
+                    diff = ra.get(i).pitch - rb.get(i).pitch;
+                    break;
+                case 2:
+                    diff = Math.abs(((4*Math.PI + ra.get(i).yaw - rb.get(i).yaw)%(2*Math.PI))-
+                            Math.PI)-Math.PI;
+                    break;
+            }
+
+            sum += diff*diff;
+        }
+        return sum/ra.size();
+    }
+
+    /**
+     * Debugging helper function. Dump the error between two time aligned ArrayList<AttitudeRec>'s
+     *
+     * @param file File to write to
+     * @param ra  one ArrayList of AttitudeRec
+     * @param rb  the other ArrayList of AttitudeRec
+     */
+    private void dumpAttitudeError(File file, ArrayList<AttitudeRec> ra, ArrayList<AttitudeRec> rb){
+        if (ra.size() != rb.size()) {
+            throw new ArrayIndexOutOfBoundsException("Two array has to be the same");
+        }
+
+        int i;
+
+        ArrayList<AttitudeRec> rerr = new ArrayList<>();
+        for(i=0; i<ra.size(); ++i) {
+            if (ra.get(i).time != rb.get(i).time) {
+                throw new IllegalArgumentException("Element "+ i
+                        + " of two inputs has different time.");
+            }
+
+            rerr.add(new AttitudeRec(ra.get(i).time, ra.get(i).roll - rb.get(i).roll,
+                    ra.get(i).pitch - rb.get(i).pitch,
+                    (Math.abs(((4*Math.PI + ra.get(i).yaw - rb.get(i).yaw)%(2*Math.PI))
+                            -Math.PI)-Math.PI)));
+
+        }
+        dumpAttitudeRecs(file, rerr);
+    }
+
+    /**
+     * Resample one ArrayList<AttitudeRec> with respect to another ArrayList<AttitudeRec>
+     *
+     * @param rec           the ArrayList of AttitudeRec to be sampled
+     * @param timebase      the other ArrayList of AttitudeRec that serves as time base
+     * @param delta_t       offset in time before resample
+     * @param yaw_offset    offset in yaw axis
+     * @param resampled     output ArrayList of AttitudeRec
+     */
+
+    private void resampleSensorLog(ArrayList<AttitudeRec> rec, ArrayList<AttitudeRec> timebase,
+            double delta_t, double yaw_offset, ArrayList<AttitudeRec> resampled)    {
+        int i;
+        int j = -1;
+        for(i=0; i<timebase.size(); i++) {
+            double time = timebase.get(i).time + delta_t;
+
+            while(j<rec.size()-1 && rec.get(j+1).time < time) j++;
+
+            if (j == -1) {
+                //use first
+                resampled.get(i).assign(rec.get(0), timebase.get(i).time);
+            } else if (j == rec.size()-1) {
+                // use last
+                resampled.get(i).assign(rec.get(j), timebase.get(i).time);
+            } else {
+                // do linear resample
+                double alpha = (time - rec.get(j).time)/((rec.get(j+1).time - rec.get(j).time));
+                double roll = (1-alpha) * rec.get(j).roll + alpha * rec.get(j+1).roll;
+                double pitch = (1-alpha) * rec.get(j).pitch + alpha * rec.get(j+1).pitch;
+                double yaw = (1-alpha) * rec.get(j).yaw + alpha * rec.get(j+1).yaw + yaw_offset;
+                resampled.get(i).set(timebase.get(i).time, roll, pitch, yaw);
+            }
+        }
+    }
+
+    /**
+     * Analyze video frames using computer vision approach and generate a ArrayList<AttitudeRec>
+     *
+     * @param recs  output ArrayList of AttitudeRec
+     * @return total number of frame of the video
+     */
+    private int analyzeVideo(ArrayList<AttitudeRec> recs) {
+        VideoMetaInfo meta = new VideoMetaInfo(new File(mPath, "videometa.json"));
+
+        int decimation = 1;
+
+        if (meta.fps > DECIMATION_FPS_TARGET) {
+            decimation = (int)(meta.fps / DECIMATION_FPS_TARGET);
+            meta.fps /=decimation;
+        }
+
+        VideoDecoderForOpenCV videoDecoder = new VideoDecoderForOpenCV(
+                new File(mPath, "video.mp4"), decimation); // every 3 frame process 1 frame
+
+
+        Mat frame;
+        Mat gray = new Mat();
+        int i = -1;
+
+        Size frameSize = videoDecoder.getSize();
+
+        if (frameSize.width != meta.frameWidth || frameSize.height != meta.frameHeight) {
+            // this is very unlikely
+            return -1;
+        }
+
+        if (TRACE_VIDEO_ANALYSIS) {
+            Debug.startMethodTracing("cvprocess");
+        }
+
+        Size patternSize = new Size(4,11);
+
+        float fc = (float)(meta.frameWidth/2.0/Math.tan(meta.fovWidth/2.0));
+        Mat camMat = cameraMatrix(fc, new Size(frameSize.width/2, frameSize.height/2));
+        MatOfDouble coeff = new MatOfDouble(); // dummy
+
+        MatOfPoint2f centers = new MatOfPoint2f();
+        MatOfPoint3f grid = asymmetricalCircleGrid(patternSize);
+        Mat rvec = new MatOfFloat();
+        Mat tvec = new MatOfFloat();
+
+        MatOfPoint2f reprojCenters = new MatOfPoint2f();
+
+        if (LOCAL_LOGV) {
+            Log.v(TAG, "Camera Mat = \n" + camMat.dump());
+        }
+
+        long startTime = System.nanoTime();
+
+        while ((frame = videoDecoder.getFrame()) !=null) {
+            if (LOCAL_LOGV) {
+                Log.v(TAG, "got a frame " + i);
+            }
+
+            // has to be in front, as there are cases where execution
+            // will skip the later part of this while
+            i++;
+
+            // convert to gray manually as by default findCirclesGridDefault uses COLOR_BGR2GRAY
+            Imgproc.cvtColor(frame, gray, Imgproc.COLOR_RGB2GRAY);
+
+            boolean foundPattern = Calib3d.findCirclesGridDefault(
+                    gray,  patternSize, centers, Calib3d.CALIB_CB_ASYMMETRIC_GRID);
+
+            if (!foundPattern) {
+                // skip to next frame
+                continue;
+            }
+
+            if (OUTPUT_DEBUG_IMAGE) {
+                Calib3d.drawChessboardCorners(frame, patternSize, centers, true);
+            }
+
+            // figure out the extrinsic parameters using real ground truth 3D points and the pixel
+            // position of blobs found in findCircleGrid, an estimated camera matrix and
+            // no-distortion are assumed.
+            boolean foundSolution =
+                    Calib3d.solvePnP(grid, centers, camMat, coeff, rvec, tvec,
+                            false, Calib3d.CV_ITERATIVE);
+
+            if (!foundSolution) {
+                // skip to next frame
+                continue;
+            }
+
+            // reproject points to for evaluation of result accuracy of solvePnP
+            Calib3d.projectPoints(grid, rvec, tvec, camMat, coeff, reprojCenters);
+
+            // error is evaluated in norm2, which is real error in pixel distance / sqrt(2)
+            double error = Core.norm(centers, reprojCenters, Core.NORM_L2);
+
+            if (LOCAL_LOGV) {
+                Log.v(TAG, "Found attitude, re-projection error = " + error);
+            }
+
+            // if error is reasonable, add it into the results
+            if (error < REPROJECTION_THREASHOLD) {
+                double [] rv = new double[3];
+                rvec.get(0,0, rv);
+                recs.add(new AttitudeRec((double) i / meta.fps, rodr2rpy(rv)));
+            }
+
+            if (OUTPUT_DEBUG_IMAGE) {
+                Calib3d.drawChessboardCorners(frame, patternSize, reprojCenters, true);
+                Highgui.imwrite(Environment.getExternalStorageDirectory().getPath()
+                        + "/RVCVRecData/DebugCV/img" + i + ".png", frame);
+            }
+        }
+
+        if (LOCAL_LOGV) {
+            Log.v(TAG, "Finished decoding");
+        }
+
+        if (TRACE_VIDEO_ANALYSIS) {
+            Debug.stopMethodTracing();
+        }
+
+        if (LOCAL_LOGV) {
+            // time analysis
+            double totalTime = (System.nanoTime()-startTime)/1e9;
+            Log.i(TAG, "Total time: "+totalTime +"s, Per frame time: "+totalTime/i );
+        }
+        return i;
+    }
+
+    /**
+     * OpenCV for Android have not support the VideoCapture from file
+     * This is a make shift solution before it is supported.
+     * One issue right now is that the glReadPixels is quite slow .. around 6.5ms for a 720p frame
+     */
+    private class VideoDecoderForOpenCV implements Runnable {
+        private MediaExtractor extractor=null;
+        private MediaCodec decoder=null;
+        private CtsMediaOutputSurface surface=null;
+
+        private MatBuffer mMatBuffer;
+
+        private final File mVideoFile;
+
+        private boolean valid;
+        private Object setupSignal;
+
+        private Thread mThread;
+        private int mDecimation;
+
+        /**
+         * Constructor
+         * @param file video file
+         * @param decimation process every "decimation" number of frame
+         */
+        VideoDecoderForOpenCV(File file, int decimation) {
+            mVideoFile = file;
+            mDecimation = decimation;
+            valid = false;
+
+            start();
+        }
+
+        /**
+         * Constructor
+         * @param file video file
+         */
+        VideoDecoderForOpenCV(File file)   {
+            this(file, 1);
+        }
+
+        /**
+         * Test if video decoder is in valid states ready to output video.
+         * @return true of force.
+         */
+        public boolean isValid() {
+            return valid;
+        }
+
+        private void start() {
+            setupSignal = new Object();
+            mThread = new Thread(this);
+            mThread.start();
+
+            synchronized (setupSignal) {
+                try {
+                    setupSignal.wait();
+                } catch (InterruptedException e) {
+                    Log.e(TAG, "Interrupted when waiting for video decoder setup ready");
+                }
+            }
+        }
+        private void stop() {
+            if (mThread != null) {
+                mThread.interrupt();
+                try {
+                    mThread.join();
+                } catch (InterruptedException e) {
+                    Log.e(TAG, "Interrupted when waiting for video decoder thread to stop");
+                }
+                try {
+                    decoder.stop();
+                }catch (IllegalStateException e) {
+                    Log.e(TAG, "Video decoder is not in a state that can be stopped");
+                }
+            }
+            mThread = null;
+        }
+
+        void teardown() {
+            if (decoder!=null) {
+                decoder.release();
+                decoder = null;
+            }
+            if (surface!=null) {
+                surface.release();
+                surface = null;
+            }
+            if (extractor!=null) {
+                extractor.release();
+                extractor = null;
+            }
+        }
+
+        void setup() {
+            int width=0, height=0;
+
+            extractor = new MediaExtractor();
+
+            try {
+                extractor.setDataSource(mVideoFile.getPath());
+            } catch (IOException e) {
+                return;
+            }
+
+            for (int i = 0; i < extractor.getTrackCount(); i++) {
+                MediaFormat format = extractor.getTrackFormat(i);
+                String mime = format.getString(MediaFormat.KEY_MIME);
+                width = format.getInteger(MediaFormat.KEY_WIDTH);
+                height = format.getInteger(MediaFormat.KEY_HEIGHT);
+
+                if (mime.startsWith("video/")) {
+                    extractor.selectTrack(i);
+                    try {
+                        decoder = MediaCodec.createDecoderByType(mime);
+                    }catch (IOException e) {
+                        continue;
+                    }
+                    // Decode to surface
+                    //decoder.configure(format, surface, null, 0);
+
+                    // Decode to offscreen surface
+                    surface = new CtsMediaOutputSurface(width, height);
+                    mMatBuffer = new MatBuffer(width, height);
+
+                    decoder.configure(format, surface.getSurface(), null, 0);
+                    break;
+                }
+            }
+
+            if (decoder == null) {
+                Log.e("VideoDecoderForOpenCV", "Can't find video info!");
+                return;
+            }
+            valid = true;
+        }
+
+        @Override
+        public void run() {
+            setup();
+
+            synchronized (setupSignal) {
+                setupSignal.notify();
+            }
+
+            if (!valid) {
+                return;
+            }
+
+            decoder.start();
+
+            ByteBuffer[] inputBuffers = decoder.getInputBuffers();
+            ByteBuffer[] outputBuffers = decoder.getOutputBuffers();
+            MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+
+            boolean isEOS = false;
+            long startMs = System.currentTimeMillis();
+            long timeoutUs = 10000;
+
+            int iframe = 0;
+
+            while (!Thread.interrupted()) {
+                if (!isEOS) {
+                    int inIndex = decoder.dequeueInputBuffer(10000);
+                    if (inIndex >= 0) {
+                        ByteBuffer buffer = inputBuffers[inIndex];
+                        int sampleSize = extractor.readSampleData(buffer, 0);
+                        if (sampleSize < 0) {
+                            if (LOCAL_LOGD) {
+                                Log.d("VideoDecoderForOpenCV",
+                                        "InputBuffer BUFFER_FLAG_END_OF_STREAM");
+                            }
+                            decoder.queueInputBuffer(inIndex, 0, 0, 0,
+                                    MediaCodec.BUFFER_FLAG_END_OF_STREAM);
+                            isEOS = true;
+                        } else {
+                            decoder.queueInputBuffer(inIndex, 0, sampleSize,
+                                    extractor.getSampleTime(), 0);
+                            extractor.advance();
+                        }
+                    }
+                }
+
+                int outIndex = decoder.dequeueOutputBuffer(info, 10000);
+                MediaFormat outFormat;
+                switch (outIndex) {
+                    case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
+                        if (LOCAL_LOGD) {
+                            Log.d("VideoDecoderForOpenCV", "INFO_OUTPUT_BUFFERS_CHANGED");
+                        }
+                        outputBuffers = decoder.getOutputBuffers();
+                        break;
+                    case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
+                        outFormat = decoder.getOutputFormat();
+                        if (LOCAL_LOGD) {
+                            Log.d("VideoDecoderForOpenCV", "New format " + outFormat);
+                        }
+                        break;
+                    case MediaCodec.INFO_TRY_AGAIN_LATER:
+                        if (LOCAL_LOGD) {
+                            Log.d("VideoDecoderForOpenCV", "dequeueOutputBuffer timed out!");
+                        }
+                        break;
+                    default:
+
+                        ByteBuffer buffer = outputBuffers[outIndex];
+                        boolean doRender = (info.size != 0);
+
+                        // As soon as we call releaseOutputBuffer, the buffer will be forwarded
+                        // to SurfaceTexture to convert to a texture.  The API doesn't
+                        // guarantee that the texture will be available before the call
+                        // returns, so we need to wait for the onFrameAvailable callback to
+                        // fire.  If we don't wait, we risk rendering from the previous frame.
+                        decoder.releaseOutputBuffer(outIndex, doRender);
+
+                        if (doRender) {
+                            surface.awaitNewImage();
+                            surface.drawImage();
+                            if (LOCAL_LOGD) {
+                                Log.d("VideoDecoderForOpenCV", "Finish drawing a frame!");
+                            }
+                            if ((iframe++ % mDecimation) == 0) {
+                                //Send the frame for processing
+                                mMatBuffer.put();
+                            }
+                        }
+                        break;
+                }
+
+                if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                    if (LOCAL_LOGD) {
+                        Log.d("VideoDecoderForOpenCV", "OutputBuffer BUFFER_FLAG_END_OF_STREAM");
+                    }
+                    break;
+                }
+            }
+            mMatBuffer.invalidate();
+
+            decoder.stop();
+
+            teardown();
+            mThread = null;
+        }
+
+
+        /**
+         * Get next valid frame
+         * @return Frame in OpenCV mat
+         */
+        public Mat getFrame() {
+            return mMatBuffer.get();
+        }
+
+        /**
+         * Get the size of the frame
+         * @return size of the frame
+         */
+        Size getSize() {
+            return mMatBuffer.getSize();
+        }
+
+        /**
+         * A synchronized buffer
+         */
+        class MatBuffer {
+            private Mat mat;
+            private byte[] bytes;
+            private ByteBuffer buf;
+            private boolean full;
+
+            private int mWidth, mHeight;
+            private boolean mValid = false;
+
+            MatBuffer(int width, int height) {
+                mWidth = width;
+                mHeight = height;
+
+                mat = new Mat(height, width, CvType.CV_8UC4); //RGBA
+                buf = ByteBuffer.allocateDirect(width*height*4);
+                bytes = new byte[width*height*4];
+
+                mValid = true;
+                full = false;
+            }
+
+            public synchronized void invalidate() {
+                mValid = false;
+                notifyAll();
+            }
+
+            public synchronized Mat get() {
+
+                if (!mValid) return null;
+                while (full == false) {
+                    try {
+                        wait();
+                        if (!mValid) return null;
+                    } catch (InterruptedException e) {
+                        return null;
+                    }
+                }
+                mat.put(0,0, bytes);
+                full = false;
+                notifyAll();
+                return mat;
+            }
+            public synchronized void put() {
+                while (full) {
+                    try {
+                        wait();
+                    } catch (InterruptedException e) {
+                        Log.e(TAG, "Interrupted when waiting for space in buffer");
+                    }
+                }
+                GLES20.glReadPixels(0, 0, mWidth, mHeight, GL10.GL_RGBA,
+                        GL10.GL_UNSIGNED_BYTE, buf);
+                buf.get(bytes);
+                buf.rewind();
+
+                full = true;
+                notifyAll();
+            }
+
+            public Size getSize() {
+                if (valid) {
+                    return mat.size();
+                }
+                return new Size();
+            }
+        }
+    }
+
+
+    /* a small set of math functions */
+    private static double [] quat2rpy( double [] q) {
+        double [] rpy = {Math.atan2(2*(q[0]*q[1]+q[2]*q[3]), 1-2*(q[1]*q[1]+q[2]*q[2])),
+                Math.asin(2*(q[0]*q[2] - q[3]*q[1])),
+                Math.atan2(2*(q[0]*q[3]+q[1]*q[2]), 1-2*(q[2]*q[2]+q[3]*q[3]))};
+        return rpy;
+    }
+
+    private static void quat2rpy( double [] q, double[] rpy) {
+        rpy[0] = Math.atan2(2*(q[0]*q[1]+q[2]*q[3]), 1-2*(q[1]*q[1]+q[2]*q[2]));
+        rpy[1] = Math.asin(2*(q[0]*q[2] - q[3]*q[1]));
+        rpy[2] = Math.atan2(2*(q[0]*q[3]+q[1]*q[2]), 1-2*(q[2]*q[2]+q[3]*q[3]));
+    }
+
+    private static Mat quat2rpy(Mat quat) {
+        double [] q = new double[4];
+        quat.get(0,0,q);
+
+        double [] rpy = {Math.atan2(2*(q[0]*q[1]+q[2]*q[3]), 1-2*(q[1]*q[1]+q[2]*q[2])),
+                Math.asin(2*(q[0]*q[2] - q[3]*q[1])),
+                Math.atan2(2*(q[0]*q[3]+q[1]*q[2]), 1-2*(q[2]*q[2]+q[3]*q[3]))};
+
+        Mat rpym = new Mat(3,1, CvType.CV_64F);
+        rpym.put(0,0, rpy);
+        return rpym;
+    }
+
+    private static double [] rodr2quat( double [] r) {
+        double t = Math.sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]);
+        double [] quat = {Math.cos(t/2), Math.sin(t/2)*r[0]/t,Math.sin(t/2)*r[1]/t,
+                Math.sin(t/2)*r[2]/t};
+        return quat;
+    }
+
+    private static void rodr2quat( double [] r, double [] quat) {
+        double t = Math.sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]);
+        quat[0] = Math.cos(t/2);
+        quat[1] = Math.sin(t/2)*r[0]/t;
+        quat[2] = Math.sin(t/2)*r[1]/t;
+        quat[3] = Math.sin(t/2)*r[2]/t;
+    }
+
+    private static Mat rodr2quat(Mat rodr) {
+        double t = Core.norm(rodr);
+        double [] r = new double[3];
+        rodr.get(0,0,r);
+
+        double [] quat = {Math.cos(t/2), Math.sin(t/2)*r[0]/t,Math.sin(t/2)*r[1]/t,
+                Math.sin(t/2)*r[2]/t};
+        Mat quatm = new Mat(4,1, CvType.CV_64F);
+        quatm.put(0, 0, quat);
+        return quatm;
+    }
+
+    private static double [] rodr2rpy( double [] r) {
+        return quat2rpy(rodr2quat(r));
+    }
+    //////////////////
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
new file mode 100644
index 0000000..ffb0d85
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.sensors;
+
+
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
+import android.os.Bundle;
+
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
+import com.android.cts.verifier.sensors.helpers.OpenCVLibrary;
+
+import junit.framework.Assert;
+
+import android.content.Intent;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * This test (Rotation Vector - Computer Vision Cross Check, or RXCVXCheck for short) verifies that
+ * mobile device can detect the orientation of itself in a relatively accurate manner.
+ *
+ * Currently only ROTATION_VECTOR sensor is used.
+ *
+ */
+public class RVCVXCheckTestActivity
+        extends SensorCtsVerifierTestActivity {
+    public RVCVXCheckTestActivity() {
+        super(RVCVXCheckTestActivity.class);
+    }
+
+    CountDownLatch mRecordActivityFinishedSignal = null;
+
+    private static final int REQ_CODE_TXCVRECORD = 0x012345678;
+    private static final boolean TEST_USING_DEBUGGING_DATA = false;
+    private static final String PATH_DEBUGGING_DATA = "/sdcard/RXCVRecData/150313-014443/";
+
+    private String mRecPath;
+
+    RVCVXCheckAnalyzer.AnalyzeReport mReport = null;
+
+    private boolean mRecordSuccessful = false;
+    private boolean mOpenCVLoadSuccessful = false;
+
+
+    /**
+     * The activity setup collects all the required data for test cases.
+     * This approach allows to test all sensors at once.
+     */
+    @Override
+    protected void activitySetUp() throws InterruptedException {
+
+        mRecPath = "";
+
+        showUserMessage("Loading OpenCV Library...");
+        int retry = 10;
+
+        while(retry-->0) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+                //
+            }
+            if (OpenCVLibrary.isLoaded()) {
+                break;
+            }
+        }
+        if (!OpenCVLibrary.isLoaded()) {
+            // failed requirement test
+            clearText();
+            return;
+        }
+        showUserMessage("OpenCV Library Successfully Loaded");
+
+        mOpenCVLoadSuccessful = true;
+
+        if (TEST_USING_DEBUGGING_DATA) {
+            mRecPath = PATH_DEBUGGING_DATA;
+
+            // assume the data is there already
+            mRecordSuccessful = true;
+        } else {
+            showUserMessage("Take the test as instructed below:\n" +
+                "1. Print out the test pattern and place it on a "+
+                   "horizontal surface.\n" +
+                "2. Start the test and align the yellow square on the screen "+
+                   "roughly to the yellow sqaure.\n" +
+                "3. Follow the prompt to rotate the phone while keeping the "+
+                   "entire test pattern inside view of camera. This requires " +
+                   "orbiting the phone around and aiming the "+
+                   "camera at the test pattern at the same time.\n" +
+                "4. Wait patiently for the analysis to finish.\n");
+
+            waitForUserToContinue();
+
+            // prepare sync signal
+            mRecordActivityFinishedSignal = new CountDownLatch(1);
+
+            // record both sensor and camera
+            Intent intent = new Intent(this, RVCVRecordActivity.class);
+            startActivityForResult(intent, REQ_CODE_TXCVRECORD);
+
+            // wait for record finish
+            mRecordActivityFinishedSignal.await();
+
+            if ("".equals(mRecPath)) {
+                showUserMessage("Recording failed or exited prematurely.");
+                waitForUserToContinue();
+            } else {
+                showUserMessage("Recording is done!");
+                showUserMessage("Result are in path: " + mRecPath);
+                mRecordSuccessful = true;
+            }
+        }
+
+
+        if (mRecordSuccessful) {
+            showUserMessage("Please wait for the analysis ... \n"+
+                            "It may take a few minutes, you will be noted when "+
+                            "its finished by sound and vibration. ");
+
+            // Analysis of recorded video and sensor data using RVCXAnalyzer
+            RVCVXCheckAnalyzer analyzer = new RVCVXCheckAnalyzer(mRecPath);
+            mReport = analyzer.processDataSet();
+
+            playSound();
+            vibrate(500);
+
+            if (mReport == null) {
+                showUserMessage("Analysis failed due to unknown reason!");
+            } else {
+                if (mReport.error) {
+                    showUserMessage("Analysis failed: " + mReport.reason);
+                } else {
+                    showUserMessage(String.format("Analysis finished!\n" +
+                                    "Roll error (Rms, max) = %4.3f, %4.3f rad\n" +
+                                    "Pitch error (Rms, max) = %4.3f, %4.3f rad\n" +
+                                    "Yaw error (Rms, max) = %4.3f, %4.3f rad\n" +
+                                    "N of Frame (valid, total) = %d, %d\n" +
+                                    "Sensor period (mean, stdev) = %4.3f, %4.3f ms\n" +
+                                    "Time offset: %4.3f s \n" +
+                                    "Yaw offset: %4.3f rad \n\n",
+                            mReport.roll_rms_error, mReport.roll_max_error,
+                            mReport.pitch_rms_error, mReport.pitch_max_error,
+                            mReport.yaw_rms_error, mReport.yaw_max_error,
+                            mReport.n_of_valid_frame, mReport.n_of_frame,
+                            mReport.sensor_period_avg * 1000.0, mReport.sensor_period_stdev*1000.0,
+                            mReport.optimal_delta_t, mReport.yaw_offset));
+                    showUserMessage("Please click next after details reviewed.");
+                    waitForUserToContinue();
+                }
+            }
+        }
+        clearText();
+    }
+
+    /**
+    Receiving the results from the RVCVRecordActivity, which is a patch where the recorded
+    video and sensor data is stored.
+    */
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        // Check which request we're responding to
+        if (requestCode == REQ_CODE_TXCVRECORD) {
+            // Make sure the request was successful
+
+            if (resultCode == RESULT_OK) {
+                mRecPath = data.getData().getPath();
+            }
+
+            // notify it is finished
+            mRecordActivityFinishedSignal.countDown();
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
+    /**
+     * Test cases.
+     */
+
+    public String test00OpenCV() throws Throwable {
+
+        String message = "OpenCV is loaded";
+        Assert.assertTrue("OpenCV library cannot be loaded.", mOpenCVLoadSuccessful);
+        return message;
+    }
+
+
+    public String test01Recording() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+
+        String message = "Record is successful.";
+        Assert.assertTrue("Record is not successful.", mRecordSuccessful);
+        return message;
+    }
+
+    public String test02Analysis() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+
+        String message = "Analysis result: " + mReport.reason;
+        Assert.assertTrue(message, (mReport!=null && !mReport.error));
+        return message;
+    }
+
+    public String test1RollAxis() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+        analyzeSuccessfulOrSkip();
+
+        String message = "Test Roll Axis Accuracy";
+
+        Assert.assertEquals("Roll RMS error", 0.0, mReport.roll_rms_error, 0.15);
+        Assert.assertEquals("Roll max error", 0.0, mReport.roll_max_error, 0.35);
+        return message;
+    }
+
+    public String test2PitchAxis() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+        analyzeSuccessfulOrSkip();
+
+        String message = "Test Pitch Axis Accuracy";
+
+        Assert.assertEquals("Pitch RMS error", 0.0, mReport.pitch_rms_error, 0.15);
+        Assert.assertEquals("Pitch max error", 0.0, mReport.pitch_max_error, 0.35);
+        return message;
+    }
+
+    public String test3YawAxis() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+        analyzeSuccessfulOrSkip();
+
+        String message = "Test Yaw Axis Accuracy";
+
+        Assert.assertEquals("Yaw RMS error", 0.0, mReport.yaw_rms_error, 0.2);
+        Assert.assertEquals("Yaw max error", 0.0, mReport.yaw_max_error, 0.4);
+        return message;
+    }
+
+    public String test4SensorPeriod() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+        analyzeSuccessfulOrSkip();
+
+        String message = "Test Sensor Period";
+
+        Assert.assertEquals("Sensor Period Mean", 5e-3, mReport.sensor_period_avg, 0.2e-3);
+        Assert.assertEquals("Sensor Period Stdev", 0.0, mReport.sensor_period_stdev, 0.5e-3);
+        return message;
+    }
+
+    private void loadOpenCVSuccessfulOrSkip() throws SensorTestStateNotSupportedException {
+        if (!mOpenCVLoadSuccessful)
+            throw new SensorTestStateNotSupportedException("Skipped due to OpenCV cannot be loaded");
+    }
+
+    private void recordSuccessfulOrSkip() throws SensorTestStateNotSupportedException {
+        if (!mRecordSuccessful)
+            throw new SensorTestStateNotSupportedException("Skipped due to record failure.");
+    }
+
+    private void analyzeSuccessfulOrSkip() throws SensorTestStateNotSupportedException {
+        if (mReport == null || mReport.error)
+            throw new SensorTestStateNotSupportedException("Skipped due to CV Analysis failure.");
+    }
+
+    /*
+     *  This function serves as a proxy as showUserMessage is marked to be deprecated.
+     *  When appendText is removed, this function will have a different implementation.
+     *
+     */
+    void showUserMessage(String s) {
+        appendText(s);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+
+        super.onCreate(savedInstanceState);
+
+        // GlSurfaceView is not necessary for this test
+        closeGlSurfaceView();
+
+        OpenCVLibrary.loadAsync(this);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java
new file mode 100644
index 0000000..2f5c873
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.verifier.sensors.helpers;
+
+import android.content.Context;
+import android.os.Looper;
+import android.util.Log;
+
+import org.opencv.android.BaseLoaderCallback;
+import org.opencv.android.LoaderCallbackInterface;
+import org.opencv.android.OpenCVLoader;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * OpenCV library loader class
+ */
+public class OpenCVLibrary {
+
+    private static String TAG = "OpenCVLibraryProbe";
+    private static boolean mLoaded = false;
+
+    /**
+     * Load OpenCV Library in async mode
+     * @param context Activity context
+     */
+    public static void loadAsync(Context context) {
+        // only need to load once
+        if (isLoaded())  return;
+
+        // Load the library through loader
+        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, context,
+                new BaseLoaderCallback(context) {
+                    @Override
+                    public void onManagerConnected(int status) {
+                        Log.v(TAG, "New Loading status: "+status);
+                        switch (status) {
+                            case LoaderCallbackInterface.SUCCESS: {
+                                mLoaded = true;
+                            }
+                            break;
+                            default: {
+                                super.onManagerConnected(status);
+                            }
+                            break;
+                        }
+                    }
+                });
+    }
+
+    /**
+     * Test if the library is loaded
+     * @return a boolean indicates whether the OpenCV library is loaded.
+     */
+    public static boolean isLoaded() {
+        return mLoaded;
+    }
+}
diff --git a/build/config.mk b/build/config.mk
index a836f92..ffc71ba 100644
--- a/build/config.mk
+++ b/build/config.mk
@@ -14,7 +14,7 @@
 
 # Test XMLs, native executables, and packages will be placed in this
 # directory before creating the final CTS distribution.
-CTS_TESTCASES_OUT := $(HOST_OUT)/cts-testcases
+CTS_TESTCASES_OUT := $(HOST_OUT)/cts/android-cts/repository/testcases
 
 # Scanners of source files for tests which are then inputed into
 # the XML generator to produce test XMLs.
@@ -34,6 +34,9 @@
 # Holds the target architecture to build for.
 CTS_TARGET_ARCH := $(TARGET_ARCH)
 
+# default module config filename
+CTS_MODULE_TEST_CONFIG := AndroidTest.xml
+
 # CTS build rules
 BUILD_CTS_EXECUTABLE := cts/build/test_executable.mk
 BUILD_CTS_PACKAGE := cts/build/test_package.mk
@@ -42,3 +45,5 @@
 BUILD_CTS_TARGET_JAVA_LIBRARY := cts/build/test_target_java_library.mk
 BUILD_CTS_UI_JAVA_LIBRARY := cts/build/test_uiautomator.mk
 BUILD_CTS_DEQP_PACKAGE := cts/build/test_deqp_package.mk
+BUILD_CTS_SUPPORT_PACKAGE := cts/build/support_package.mk
+BUILD_CTS_MODULE_TEST_CONFIG := cts/build/module_test_config.mk
diff --git a/apps/CtsVerifier/lib/Android.mk b/build/module_test_config.mk
similarity index 61%
copy from apps/CtsVerifier/lib/Android.mk
copy to build/module_test_config.mk
index 56a3fa8..6584ef2 100644
--- a/apps/CtsVerifier/lib/Android.mk
+++ b/build/module_test_config.mk
@@ -1,5 +1,4 @@
-#
-# Copyright (C) 2011 The Android Open Source Project
+# Copyright (C) 2015 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -12,6 +11,11 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-#
 
-include $(call all-subdir-makefiles)
+cts_module_test_config := $(if $(wildcard \
+	$(LOCAL_PATH)/$(CTS_MODULE_TEST_CONFIG)), \
+	$(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).config)
+ifneq ($(cts_module_test_config),)
+$(cts_module_test_config): $(LOCAL_PATH)/$(CTS_MODULE_TEST_CONFIG) | $(ACP)
+	$(call copy-file-to-target)
+endif
diff --git a/build/support_package.mk b/build/support_package.mk
new file mode 100644
index 0000000..16a254e
--- /dev/null
+++ b/build/support_package.mk
@@ -0,0 +1,36 @@
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Builds a package which is needed by a test package and copies it to CTS
+#
+# Replace "include $(BUILD_PACKAGE)" with "include $(BUILD_CTS_SUPPORT_PACKAGE)"
+#
+
+# Disable by default so "m cts" will work in emulator builds
+LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
+
+cts_support_apks :=
+$(foreach fp, $(ALL_MODULES.$(LOCAL_PACKAGE_NAME).BUILT_INSTALLED),\
+  $(eval pair := $(subst :,$(space),$(fp)))\
+  $(eval built := $(word 1,$(pair)))\
+  $(eval installed := $(CTS_TESTCASES_OUT)/$(notdir $(word 2,$(pair))))\
+  $(eval $(call copy-one-file, $(built), $(installed)))\
+  $(eval cts_support_apks += $(installed)))
+
+# Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
+$(my_register_name) : $(cts_support_apks)
diff --git a/build/test_deqp_package.mk b/build/test_deqp_package.mk
index b07876d..8fbae26 100644
--- a/build/test_deqp_package.mk
+++ b/build/test_deqp_package.mk
@@ -19,15 +19,14 @@
 CTS_DEQP_CONFIG_PATH := $(call my-dir)
 
 cts_library_xml := $(CTS_TESTCASES_OUT)/com.drawelements.deqp.$(DEQP_API).xml
-
-$(cts_library_xml): MUSTPASS_XML_FILE := external/deqp/android/cts/com.drawelements.deqp.$(DEQP_API).xml
+$(cts_library_xml): MUSTPASS_XML_FILE := external/deqp/android/cts/master/com.drawelements.deqp.$(DEQP_API).xml
 $(cts_library_xml): PRIVATE_TEST_NAME := $(DEQP_TEST_NAME)
 $(cts_library_xml): PRIVATE_TEST_PACKAGE := com.drawelements.deqp.$(DEQP_API)
 $(cts_library_xml): PRIVATE_DUMMY_CASELIST := $(CTS_DEQP_CONFIG_PATH)/deqp_dummy_test_list
-$(cts_library_xml): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk external/deqp/android/cts/com.drawelements.deqp.$(DEQP_API).xml $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_XML_GENERATOR)
+$(cts_library_xml): external/deqp/android/cts/master/com.drawelements.deqp.$(DEQP_API).xml $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for $(PRIVATE_TEST_NAME)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	
+
 # Query build ABIs by routing a dummy test list through xml generator and parse result
 	$(hide) $(eval supported_abi_attr := $(shell $(CTS_XML_GENERATOR) -t dummyTest \
 										-n dummyName \
@@ -37,8 +36,8 @@
 										-a $(CTS_TARGET_ARCH) \
 										< $(PRIVATE_DUMMY_CASELIST) \
 										| grep --only-matching -e " abis=\"[^\"]*\""))
-	
+
 # Patch xml caselist with supported abi
-	$(hide) $(SED_EXTENDED) -e 's:^<Test (.*)/>$$:<Test \1 $(supported_abi_attr) />:' \
+	$(hide) $(SED_EXTENDED) -e 's:^(\s*)<Test ((.[^/]|[^/])*)(/?)>$$:\1<Test \2 $(supported_abi_attr)\4>:' \
 				< $(MUSTPASS_XML_FILE) \
 				> $@
diff --git a/build/test_executable.mk b/build/test_executable.mk
index 3cabdf3..979f59e 100644
--- a/build/test_executable.mk
+++ b/build/test_executable.mk
@@ -25,14 +25,22 @@
 
 LOCAL_CXX_STL := libc++
 include $(BUILD_EXECUTABLE)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
+
+cts_executable_bin :=
+$(foreach fp, $(ALL_MODULES.$(LOCAL_MODULE).BUILT) $(ALL_MODULES.$(LOCAL_MODULE)$(TARGET_2ND_ARCH_MODULE_SUFFIX).BUILT),\
+  $(eval installed := $(CTS_TESTCASES_OUT)/$(notdir $(fp)))\
+  $(eval $(call copy-one-file, $(fp), $(installed)))\
+  $(eval cts_executable_bin += $(installed)))
 
 cts_executable_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
-
 $(cts_executable_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
 $(cts_executable_xml): PRIVATE_EXECUTABLE := $(LOCAL_MODULE)
 $(cts_executable_xml): PRIVATE_LIST_EXECUTABLE := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)_list
 $(cts_executable_xml): $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)_list
-$(cts_executable_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES)) $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR) $(cts_list_executable)
+$(cts_executable_xml): $(cts_executable_bin)
+$(cts_executable_xml): $(cts_module_test_config)
+$(cts_executable_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES)) $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for native package $(PRIVATE_TEST_PACKAGE)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(PRIVATE_LIST_EXECUTABLE) --gtest_list_tests | \
@@ -46,4 +54,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_executable_xml)
+$(my_register_name) : $(cts_executable_bin) $(cts_executable_xml) $(cts_module_test_config)
diff --git a/build/test_gtest_package.mk b/build/test_gtest_package.mk
index dd1269b..6f71830 100644
--- a/build/test_gtest_package.mk
+++ b/build/test_gtest_package.mk
@@ -23,23 +23,19 @@
 LOCAL_DEX_PREOPT := false
 LOCAL_PROGUARD_ENABLED := disabled
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
 
-cts_package_apk := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).apk
 cts_package_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).xml
-cts_test_list := $(LOCAL_PATH)/$(LOCAL_MODULE)_list.txt
-
-$(cts_package_apk): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
-$(cts_package_apk): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk | $(ACP)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(hide) $(ACP) -fp $(call intermediates-dir-for,APPS,$(PRIVATE_PACKAGE))/package.apk $@
-
 $(cts_package_xml): PRIVATE_PATH := $(LOCAL_PATH)
 $(cts_package_xml): PRIVATE_TEST_PACKAGE := android.$(notdir $(LOCAL_PATH))
 $(cts_package_xml): PRIVATE_EXECUTABLE := $(LOCAL_MODULE)
 $(cts_package_xml): PRIVATE_MANIFEST := $(LOCAL_PATH)/AndroidManifest.xml
-$(cts_package_xml): PRIVATE_TEST_LIST := $(cts_test_list)
-$(cts_package_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES))  $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR) $(cts_test_list)
+$(cts_package_xml): PRIVATE_TEST_LIST := $(LOCAL_PATH)/$(LOCAL_MODULE)_list.txt
+$(cts_package_xml): $(LOCAL_PATH)/$(LOCAL_MODULE)_list.txt
+$(cts_package_xml): $(cts_support_apks)
+$(cts_package_xml): $(cts_module_test_config)
+$(cts_package_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES))  $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for wrapped native package $(PRIVATE_EXECUTABLE)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) cat $(PRIVATE_TEST_LIST) | \
@@ -54,4 +50,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_package_apk) $(cts_package_xml)
+$(my_register_name) : $(cts_package_xml) $(cts_module_test_config)
diff --git a/build/test_host_java_library.mk b/build/test_host_java_library.mk
index 8ed5670..7fdefb5 100644
--- a/build/test_host_java_library.mk
+++ b/build/test_host_java_library.mk
@@ -18,18 +18,24 @@
 #
 
 include $(BUILD_HOST_JAVA_LIBRARY)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
 
-cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
+cts_library_jar := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar
+$(cts_library_jar): $(LOCAL_BUILT_MODULE)
+	$(copy-file-to-target)
 
 cts_src_dirs := $(LOCAL_PATH)/src
 cts_src_dirs += $(sort $(dir $(LOCAL_GENERATED_SOURCES)))
 cts_src_dirs := $(addprefix -s , $(cts_src_dirs))
 
+cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
 $(cts_library_xml): PRIVATE_SRC_DIRS := $(cts_src_dirs)
 $(cts_library_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
 $(cts_library_xml): PRIVATE_LIBRARY := $(LOCAL_MODULE)
 $(cts_library_xml): PRIVATE_JAR_PATH := $(LOCAL_MODULE).jar
-$(cts_library_xml): $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE).jar $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_library_xml): $(cts_library_jar)
+$(cts_library_xml): $(cts_module_test_config)
+$(cts_library_xml): $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for host library $(PRIVATE_LIBRARY)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(CTS_JAVA_TEST_SCANNER) $(PRIVATE_SRC_DIRS) \
@@ -44,4 +50,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_library_xml)
+$(my_register_name) : $(cts_library_jar) $(cts_library_xml) $(cts_module_test_config)
diff --git a/build/test_package.mk b/build/test_package.mk
index 7589787..c6b0865 100644
--- a/build/test_package.mk
+++ b/build/test_package.mk
@@ -23,20 +23,14 @@
 LOCAL_DEX_PREOPT := false
 LOCAL_PROGUARD_ENABLED := disabled
 
-include $(BUILD_PACKAGE)
-
-cts_package_apk := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).apk
-cts_package_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).xml
+include $(BUILD_CTS_SUPPORT_PACKAGE)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
 
 cts_src_dirs := $(LOCAL_PATH)
 cts_src_dirs += $(sort $(dir $(LOCAL_GENERATED_SOURCES)))
 cts_src_dirs := $(addprefix -s , $(cts_src_dirs))
 
-$(cts_package_apk): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
-$(cts_package_apk): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk | $(ACP)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(hide) $(ACP) -fp $(call intermediates-dir-for,APPS,$(PRIVATE_PACKAGE))/package.apk $@
-
+cts_package_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).xml
 $(cts_package_xml): PRIVATE_SRC_DIRS := $(cts_src_dirs)
 $(cts_package_xml): PRIVATE_INSTRUMENTATION := $(LOCAL_INSTRUMENTATION_FOR)
 $(cts_package_xml): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
@@ -48,7 +42,9 @@
 $(cts_package_xml): PRIVATE_TEST_PACKAGE := $(PRIVATE_CTS_TEST_PACKAGE_NAME_)
 $(cts_package_xml): PRIVATE_MANIFEST := $(LOCAL_PATH)/AndroidManifest.xml
 $(cts_package_xml): PRIVATE_TEST_TYPE := $(if $(LOCAL_CTS_TEST_RUNNER),$(LOCAL_CTS_TEST_RUNNER),'')
-$(cts_package_xml): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_package_xml): $(cts_support_apks)
+$(cts_package_xml): $(cts_module_test_config)
+$(cts_package_xml): $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for java package $(PRIVATE_PACKAGE)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(CTS_JAVA_TEST_SCANNER) \
@@ -64,6 +60,5 @@
 						-b $(CTS_UNSUPPORTED_ABIS) \
 						-a $(CTS_TARGET_ARCH) \
 						-o $@
-
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_package_apk) $(cts_package_xml)
+$(my_register_name) : $(cts_package_xml) $(cts_module_test_config)
diff --git a/build/test_target_java_library.mk b/build/test_target_java_library.mk
index 04fffb9..fe1000a 100644
--- a/build/test_target_java_library.mk
+++ b/build/test_target_java_library.mk
@@ -19,8 +19,10 @@
 # Disable by default so "m cts" will work in emulator builds
 LOCAL_DEX_PREOPT := false
 include $(BUILD_JAVA_LIBRARY)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
+
 cts_library_jar := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar
-$(cts_library_jar): $(LOCAL_BUILT_MODULE) | $(ACP)
+$(cts_library_jar): $(LOCAL_BUILT_MODULE)
 	$(copy-file-to-target)
 
 cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
@@ -30,7 +32,9 @@
 $(cts_library_xml): PRIVATE_LIBRARY := $(LOCAL_MODULE)
 $(cts_library_xml): PRIVATE_JAR_PATH := $(LOCAL_MODULE).jar
 $(cts_library_xml): PRIVATE_RUNTIME_ARGS := $(LOCAL_CTS_TARGET_RUNTIME_ARGS)
-$(cts_library_xml): $(TARGET_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE).jar $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_library_xml): $(cts_library_jar)
+$(cts_library_xml): $(cts_module_test_config)
+$(cts_library_xml): $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for target library $(PRIVATE_LIBRARY)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(CTS_JAVA_TEST_SCANNER) -s $(PRIVATE_PATH) \
@@ -46,4 +50,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_library_jar) $(cts_library_xml)
+$(my_register_name) : $(cts_library_jar) $(cts_library_xml $(cts_module_test_config))
diff --git a/build/test_uiautomator.mk b/build/test_uiautomator.mk
index cad6e4f..a191d72 100644
--- a/build/test_uiautomator.mk
+++ b/build/test_uiautomator.mk
@@ -20,26 +20,26 @@
 LOCAL_DEX_PREOPT := false
 
 include $(BUILD_JAVA_LIBRARY)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
 
-cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml 
 cts_library_jar := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar
+$(cts_library_jar): $(LOCAL_BUILT_MODULE)
+	$(call copy-file-to-target)
 
 cts_src_dirs := $(LOCAL_PATH)/src
 cts_src_dirs += $(sort $(dir $(LOCAL_GENERATED_SOURCES)))
 cts_src_dirs := $(addprefix -s , $(cts_src_dirs))
 
-$(cts_library_jar): PRIVATE_MODULE := $(LOCAL_MODULE)
-$(cts_library_jar): $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE))/javalib.jar | $(ACP)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(hide) $(ACP) -fp $(call intermediates-dir-for,JAVA_LIBRARIES,$(PRIVATE_MODULE))/javalib.jar $@
-
+cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
 $(cts_library_xml): PRIVATE_SRC_DIRS := $(cts_src_dirs)
 $(cts_library_xml): PRIVATE_TEST_APP_PACKAGE := $(LOCAL_CTS_TEST_APP_PACKAGE)
 $(cts_library_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
 $(cts_library_xml): PRIVATE_TEST_APK := $(LOCAL_CTS_TEST_APK)
 $(cts_library_xml): PRIVATE_LIBRARY := $(LOCAL_MODULE)
 $(cts_library_xml): PRIVATE_JAR_PATH := $(LOCAL_MODULE).jar
-$(cts_library_xml): $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE))/javalib.jar $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_library_xml): $(cts_library_jar)
+$(cts_library_xml): $(cts_module_test_config)
+$(cts_library_xml): $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for uiautomator library $(PRIVATE_LIBRARY)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(CTS_JAVA_TEST_SCANNER) $(PRIVATE_SRC_DIRS) \
@@ -57,4 +57,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_library_jar) $(cts_library_xml)
+$(my_register_name) : $(cts_library_jar) $(cts_library_xml) $(cts_module_test_config)
diff --git a/common/util/src/com/android/compatibility/common/util/MetricsReportLog.java b/common/util/src/com/android/compatibility/common/util/MetricsReportLog.java
new file mode 100644
index 0000000..4675231
--- /dev/null
+++ b/common/util/src/com/android/compatibility/common/util/MetricsReportLog.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.compatibility.common.util;
+
+/**
+ * A {@link ReportLog} that can be used with the in memory metrics store used for host side metrics.
+ */
+public final class MetricsReportLog extends ReportLog {
+    private final String mDeviceSerial;
+    private final String mAbi;
+    private final String mClassMethodName;
+
+    /**
+     * @param deviceSerial serial number of the device
+     * @param abi abi the test was run on
+     * @param classMethodName class name and method name of the test in class#method format.
+     *        Note that ReportLog.getClassMethodNames() provide this.
+     */
+    public MetricsReportLog(String deviceSerial, String abi, String classMethodName) {
+        mDeviceSerial = deviceSerial;
+        mAbi = abi;
+        mClassMethodName = classMethodName;
+    }
+
+    public void submit() {
+        MetricsStore.storeResult(mDeviceSerial, mAbi, mClassMethodName, this);
+    }
+}
diff --git a/common/util/src/com/android/compatibility/common/util/MetricsStore.java b/common/util/src/com/android/compatibility/common/util/MetricsStore.java
new file mode 100644
index 0000000..9eeb94a
--- /dev/null
+++ b/common/util/src/com/android/compatibility/common/util/MetricsStore.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.compatibility.common.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * A simple in-memory store for metrics results. This should be used for hostside metrics reporting.
+ */
+public class MetricsStore {
+
+    // needs concurrent version as there can be multiple client accessing this.
+    // But there is no additional protection for the same key as that should not happen.
+    private static final ConcurrentHashMap<String, ReportLog> mMap =
+            new ConcurrentHashMap<String, ReportLog>();
+
+    /**
+     * Stores a result. Existing result with the same key will be replaced.
+     * Note that key is generated in the form of device_serial#class#method name.
+     * So there should be no concurrent test for the same (serial, class, method).
+     * @param deviceSerial
+     * @param abi
+     * @param classMethodName
+     * @param reportLog Contains the result to be stored
+     */
+    public static void storeResult(
+            String deviceSerial, String abi, String classMethodName, ReportLog reportLog) {
+        mMap.put(generateTestKey(deviceSerial, abi, classMethodName), reportLog);
+    }
+
+    /**
+     * retrieves a metric result for the given condition and remove it from the internal
+     * storage. If there is no result for the given condition, it will return null.
+     */
+    public static ReportLog removeResult(String deviceSerial, String abi, String classMethodName) {
+        return mMap.remove(generateTestKey(deviceSerial, abi, classMethodName));
+    }
+
+    /**
+     * @return test key in the form of device_serial#abi#class_name#method_name
+     */
+    private static String generateTestKey(String deviceSerial, String abi, String classMethodName) {
+        return String.format("%s#%s#%s", deviceSerial, abi, classMethodName);
+    }
+}
diff --git a/common/util/src/com/android/compatibility/common/util/ReportLog.java b/common/util/src/com/android/compatibility/common/util/ReportLog.java
index 8cfc086..7209ac8 100644
--- a/common/util/src/com/android/compatibility/common/util/ReportLog.java
+++ b/common/util/src/com/android/compatibility/common/util/ReportLog.java
@@ -16,28 +16,37 @@
 
 package com.android.compatibility.common.util;
 
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.IOException;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.StringTokenizer;
+import java.util.regex.Pattern;
 
 /**
  * Utility class to add results to the report.
  */
-public abstract class ReportLog implements Serializable {
+public class ReportLog implements Serializable {
 
+    private static final String LOG_SEPARATOR = "+++";
+    private static final String SUMMARY_SEPARATOR = "++++";
+    private static final String LOG_ELEM_SEPARATOR = "|";
+    private static final String EMPTY_CHAR = " ";
     private Result mSummary;
     private final List<Result> mDetails = new ArrayList<Result>();
 
-    class Result implements Serializable {
-        private static final int CALLER_STACKTRACE_DEPTH = 5;
+    static class Result implements Serializable {
         private String mLocation;
         private String mMessage;
         private double[] mValues;
         private ResultType mType;
         private ResultUnit mUnit;
+        private Double mTarget;
+
+
+        private Result(String location, String message, double[] values,
+                ResultType type, ResultUnit unit) {
+            this(location, message, values, null /*target*/, type, unit);
+        }
 
         /**
          * Creates a result object to be included in the report. Each object has a message
@@ -47,23 +56,22 @@
          *
          * @param message A string describing the values
          * @param values An array of the values
+         * @param target Nullable. The target value.
          * @param type Represents how to interpret the values (eg. A lower score is better)
          * @param unit Represents the unit in which the values are (eg. Milliseconds)
-         * @param depth A number used to increase the depth the stack is queried. This should only
-         * be given in the case that the report is populated by a helper function, in which case it
-         * would be 1, or else 0.
          */
-        private Result(String message, double[] values, ResultType type,
-                ResultUnit unit, int depth) {
-            final StackTraceElement[] trace = Thread.currentThread().getStackTrace();
-            final StackTraceElement e =
-                    trace[Math.min(CALLER_STACKTRACE_DEPTH + depth, trace.length - 1)];
-            mLocation = String.format(
-                    "%s#%s:%d", e.getClassName(), e.getMethodName(), e.getLineNumber());
+        private Result(String location, String message, double[] values,
+                Double target, ResultType type, ResultUnit unit) {
+            mLocation = location;
             mMessage = message;
             mValues = values;
             mType = type;
             mUnit = unit;
+            mTarget = target;
+        }
+
+        public double getTarget() {
+            return mTarget;
         }
 
         public String getLocation() {
@@ -85,51 +93,89 @@
         public ResultUnit getUnit() {
             return mUnit;
         }
+
+        /**
+         * Format:
+         * location|message|target|type|unit|value[s], target can be " " if there is no target set.
+         * log for array = classMethodName:line_number|message|unit|type|space separated values
+         */
+        String toEncodedString() {
+            StringBuilder builder = new StringBuilder()
+                    .append(mLocation)
+                    .append(LOG_ELEM_SEPARATOR)
+                    .append(mMessage)
+                    .append(LOG_ELEM_SEPARATOR)
+                    .append(mTarget != null ? mTarget : EMPTY_CHAR)
+                    .append(LOG_ELEM_SEPARATOR)
+                    .append(mType.name())
+                    .append(LOG_ELEM_SEPARATOR)
+                    .append(mUnit.name())
+                    .append(LOG_ELEM_SEPARATOR);
+            for (double value : mValues) {
+                builder.append(value).append(" ");
+            }
+            return builder.toString();
+        }
+
+        static Result fromEncodedString(String encodedString) {
+            String[] elems = encodedString.split(Pattern.quote(LOG_ELEM_SEPARATOR));
+            if (elems.length < 5) {
+                return null;
+            }
+
+            String[] valueStrArray = elems[5].split(" ");
+            double[] valueArray = new double[valueStrArray.length];
+            for (int i = 0; i < valueStrArray.length; i++) {
+                valueArray[i] = Double.parseDouble(valueStrArray[i]);
+            }
+            return new Result(
+                    elems[0], /*location*/
+                    elems[1], /*message*/
+                    valueArray, /*values*/
+                    elems[2].equals(EMPTY_CHAR) ? null : Double.parseDouble(elems[2]), /*target*/
+                    ResultType.valueOf(elems[3]), /*type*/
+                    ResultUnit.valueOf(elems[4])  /*unit*/);
+        }
     }
 
     /**
      * Adds an array of values to the report.
      */
     public void addValues(String message, double[] values, ResultType type, ResultUnit unit) {
-        mDetails.add(new Result(message, values, type, unit, 0));
+        mDetails.add(new Result(Stacktrace.getTestCallerClassMethodNameLineNumber(),
+                message, values, type, unit));
     }
 
     /**
      * Adds an array of values to the report.
      */
-    public void addValues(String message, double[] values, ResultType type,
-            ResultUnit unit, int depth) {
-        mDetails.add(new Result(message, values, type, unit, depth));
+    public void addValues(
+            String message, double[] values, ResultType type, ResultUnit unit, String location) {
+        mDetails.add(new Result(location, message, values, type, unit));
     }
 
     /**
      * Adds a value to the report.
      */
     public void addValue(String message, double value, ResultType type, ResultUnit unit) {
-        mDetails.add(new Result(message, new double[] {value}, type, unit, 0));
+        mDetails.add(new Result(Stacktrace.getTestCallerClassMethodNameLineNumber(), message,
+                new double[] {value}, type, unit));
     }
 
     /**
      * Adds a value to the report.
      */
     public void addValue(String message, double value, ResultType type,
-            ResultUnit unit, int depth) {
-        mDetails.add(new Result(message, new double[] {value}, type, unit, depth));
+            ResultUnit unit, String location) {
+        mDetails.add(new Result(location, message, new double[] {value}, type, unit));
     }
 
     /**
      * Sets the summary of the report.
      */
     public void setSummary(String message, double value, ResultType type, ResultUnit unit) {
-        mSummary = new Result(message, new double[] {value}, type, unit, 0);
-    }
-
-    /**
-     * Sets the summary of the report.
-     */
-    public void setSummary(String message, double value, ResultType type,
-            ResultUnit unit, int depth) {
-        mSummary = new Result(message, new double[] {value}, type, unit, depth);
+        mSummary = new Result(Stacktrace.getTestCallerClassMethodNameLineNumber(),
+                message, new double[] {value}, type, unit);
     }
 
     public Result getSummary() {
@@ -139,4 +185,46 @@
     public List<Result> getDetailedMetrics() {
         return new ArrayList<Result>(mDetails);
     }
+
+    /**
+     * Parse a String encoded {@link com.android.compatibility.common.util.ReportLog}
+     */
+    public static ReportLog fromEncodedString(String encodedString) {
+        ReportLog reportLog = new ReportLog();
+        StringTokenizer tok = new StringTokenizer(encodedString, SUMMARY_SEPARATOR);
+        if (tok.hasMoreTokens()) {
+            // Extract the summary
+            reportLog.mSummary = Result.fromEncodedString(tok.nextToken());
+        }
+        if (tok.hasMoreTokens()) {
+            // Extract the detailed results
+            StringTokenizer detailedTok = new StringTokenizer(tok.nextToken(), LOG_SEPARATOR);
+            while (detailedTok.hasMoreTokens()) {
+                reportLog.mDetails.add(Result.fromEncodedString(detailedTok.nextToken()));
+            }
+        }
+        return reportLog;
+    }
+
+    /**
+     * @return a String representation of this report or null if not collected
+     */
+    protected String toEncodedString() {
+        if ((mSummary == null) && mDetails.isEmpty()) {
+            // just return empty string
+            return null;
+        }
+        StringBuilder builder = new StringBuilder();
+        builder.append(mSummary.toEncodedString());
+        builder.append(SUMMARY_SEPARATOR);
+        for (Result result : mDetails) {
+            builder.append(result.toEncodedString());
+            builder.append(LOG_SEPARATOR);
+        }
+        // delete the last separator
+        if (builder.length() >= LOG_SEPARATOR.length()) {
+            builder.delete(builder.length() - LOG_SEPARATOR.length(), builder.length());
+        }
+        return builder.toString();
+    }
 }
diff --git a/common/util/src/com/android/compatibility/common/util/Stacktrace.java b/common/util/src/com/android/compatibility/common/util/Stacktrace.java
new file mode 100644
index 0000000..27bf9ca
--- /dev/null
+++ b/common/util/src/com/android/compatibility/common/util/Stacktrace.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.compatibility.common.util;
+
+/**
+ * Helper methods for dealing with stack traces
+ */
+public class Stacktrace {
+
+    private static final int SAFETY_DEPTH = 4;
+    private static final String TEST_POSTFIX = "Test";
+
+    private Stacktrace() {}
+
+    /**
+     * @return classname#methodname from call stack of the current thread
+     */
+    public static String getTestCallerClassMethodName() {
+        return getTestCallerClassMethodName(false /*includeLineNumber*/);
+    }
+
+    /**
+     * @return classname#methodname from call stack of the current thread
+     */
+    public static String getTestCallerClassMethodNameLineNumber() {
+        return getTestCallerClassMethodName(true /*includeLineNumber*/);
+    }
+
+    /**
+     * @return classname#methodname from call stack of the current thread
+     */
+    private static String getTestCallerClassMethodName(boolean includeLineNumber) {
+        StackTraceElement[] elements = Thread.currentThread().getStackTrace();
+        // Look for the first class name in the elements array that ends with Test
+        for (int i = 0; i < elements.length; i++) {
+            if (elements[i].getClassName().endsWith(TEST_POSTFIX)) {
+                return buildClassMethodName(elements, i, includeLineNumber);
+            }
+        }
+
+        // Use a reasonable default if the test name isn't found
+        return buildClassMethodName(elements, SAFETY_DEPTH, includeLineNumber);
+    }
+
+    private static String buildClassMethodName(
+            StackTraceElement[] elements, int depth, boolean includeLineNumber) {
+        depth = Math.min(depth, elements.length - 1);
+        StringBuilder builder = new StringBuilder();
+        builder.append(elements[depth].getClassName()).append("#")
+                .append(elements[depth].getMethodName());
+        if (includeLineNumber) {
+            builder.append(":").append(elements[depth].getLineNumber());
+        }
+        return builder.toString();
+    }
+}
diff --git a/common/util/tests/src/com/android/compatibility/common/util/MetricsStoreTest.java b/common/util/tests/src/com/android/compatibility/common/util/MetricsStoreTest.java
new file mode 100644
index 0000000..944cc43
--- /dev/null
+++ b/common/util/tests/src/com/android/compatibility/common/util/MetricsStoreTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.compatibility.common.util;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit tests for {@link MetricsStore}
+ */
+public class MetricsStoreTest extends TestCase {
+
+    private static final String DEVICE_SERIAL = "DEVICE_SERIAL";
+    private static final String ABI = "ABI";
+    private static final String CLASSMETHOD_NAME = "CLASSMETHOD_NAME";
+
+    private static final double[] VALUES = new double[] {1, 11, 21, 1211, 111221};
+
+    private ReportLog mReportLog;
+
+    @Override
+    protected void setUp() throws Exception {
+        this.mReportLog = new ReportLog();
+    }
+
+    public void testStoreAndRemove() {
+        mReportLog.setSummary("Sample Summary", 1.0, ResultType.HIGHER_BETTER, ResultUnit.BYTE);
+        mReportLog.addValues("Details", VALUES, ResultType.NEUTRAL, ResultUnit.FPS);
+        MetricsStore.storeResult(DEVICE_SERIAL, ABI, CLASSMETHOD_NAME, mReportLog);
+
+        ReportLog reportLog = MetricsStore.removeResult(DEVICE_SERIAL, ABI, CLASSMETHOD_NAME);
+        assertSame(mReportLog, reportLog);
+        assertNull(MetricsStore.removeResult("blah", ABI, CLASSMETHOD_NAME));
+    }
+
+}
diff --git a/common/util/tests/src/com/android/compatibility/common/util/MetricsXmlSerializerTest.java b/common/util/tests/src/com/android/compatibility/common/util/MetricsXmlSerializerTest.java
index 70da820..05e69d8 100644
--- a/common/util/tests/src/com/android/compatibility/common/util/MetricsXmlSerializerTest.java
+++ b/common/util/tests/src/com/android/compatibility/common/util/MetricsXmlSerializerTest.java
@@ -36,7 +36,8 @@
             HEADER
             + "<Summary message=\"Sample\" scoreType=\"higher_better\" unit=\"byte\">1.0</Summary>"
             + "<Details>"
-                    + "<ValueArray source=\"sun.reflect.NativeMethodAccessorImpl#invoke0:-2\""
+                    + "<ValueArray source=\"com.android.compatibility.common.util."
+                    + "MetricsXmlSerializerTest#testSerialize:84\""
                     + " message=\"Details\" scoreType=\"neutral\" unit=\"fps\">"
                         + "<Value>1.0</Value>"
                         + "<Value>11.0</Value>"
diff --git a/common/util/tests/src/com/android/compatibility/common/util/ReportLogTest.java b/common/util/tests/src/com/android/compatibility/common/util/ReportLogTest.java
new file mode 100644
index 0000000..a5f3306
--- /dev/null
+++ b/common/util/tests/src/com/android/compatibility/common/util/ReportLogTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.compatibility.common.util;
+
+import junit.framework.TestCase;
+
+import java.util.Arrays;
+
+/**
+ * Unit tests for {@link ReportLog}
+ */
+public class ReportLogTest extends TestCase {
+
+    private static final double[] VALUES = new double[] {1, 11, 21, 1211, 111221};
+
+    private static final String EXPECTED_ENCODED_REPORT_LOG =
+            "com.android.compatibility.common.util.ReportLogTest#testEncodeDecode:44|" +
+            "Sample Summary| |HIGHER_BETTER|BYTE|1.0 ++++" +
+            "com.android.compatibility.common.util.ReportLogTest#testEncodeDecode:45|" +
+            "Details| |NEUTRAL|FPS|1.0 11.0 21.0 1211.0 111221.0 ";
+    private ReportLog reportLog;
+
+    @Override
+    protected void setUp() throws Exception {
+        this.reportLog = new ReportLog();
+    }
+
+    public void testEncodeDecode() {
+
+        reportLog.setSummary("Sample Summary", 1.0, ResultType.HIGHER_BETTER, ResultUnit.BYTE);
+        reportLog.addValues("Details", VALUES, ResultType.NEUTRAL, ResultUnit.FPS);
+
+        String encodedReportLog = reportLog.toEncodedString();
+        assertEquals(EXPECTED_ENCODED_REPORT_LOG, encodedReportLog);
+
+        ReportLog decodedReportLog = ReportLog.fromEncodedString(encodedReportLog);
+        ReportLog.Result summary = reportLog.getSummary();
+        assertEquals("Sample Summary", summary.getMessage());
+        assertFalse(summary.getLocation().isEmpty());
+        assertEquals(ResultType.HIGHER_BETTER, summary.getType());
+        assertEquals(ResultUnit.BYTE, summary.getUnit());
+        assertTrue(Arrays.equals(new double[] {1.0}, summary.getValues()));
+
+        assertEquals(1, decodedReportLog.getDetailedMetrics().size());
+        ReportLog.Result detail = decodedReportLog.getDetailedMetrics().get(0);
+        assertEquals("Details", detail.getMessage());
+        assertFalse(detail.getLocation().isEmpty());
+        assertEquals(ResultType.NEUTRAL, detail.getType());
+        assertEquals(ResultUnit.FPS, detail.getUnit());
+        assertTrue(Arrays.equals(VALUES, detail.getValues()));
+
+        assertEquals(encodedReportLog, decodedReportLog.toEncodedString());
+    }
+}
diff --git a/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java b/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java
index b9a17e1..348c680 100644
--- a/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java
+++ b/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java
@@ -26,6 +26,8 @@
     public UnitTests() {
         super();
 
+        addTestSuite(MetricsStoreTest.class);
         addTestSuite(MetricsXmlSerializerTest.class);
+        addTestSuite(ReportLogTest.class);
     }
 }
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
index 4d9ef00..206bdbe 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
@@ -20,7 +20,6 @@
 import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.testrunner.InstrumentationResultParser;
-import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.ddmlib.testrunner.TestResult;
 import com.android.ddmlib.testrunner.TestResult.TestStatus;
@@ -107,6 +106,8 @@
 
     private static final String LOG_TAG = "AppSecurityTests";
 
+    private static final int USER_OWNER = 0;
+
     private IAbi mAbi;
     private CtsBuildHelper mCtsBuild;
 
@@ -224,6 +225,7 @@
      * Verify that app with no external storage permissions works correctly.
      */
     public void testExternalStorageNone() throws Exception {
+        final int[] users = createUsersForTest();
         try {
             wipePrimaryExternalStorage(getDevice());
 
@@ -231,10 +233,14 @@
             String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             assertNull(getDevice()
                     .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false, options));
-            assertTrue("Failed external storage with no permissions",
-                    runDeviceTests(EXTERNAL_STORAGE_APP_PKG));
+
+            for (int user : users) {
+                assertTrue("Failed external storage with no permissions",
+                        runDeviceTests(EXTERNAL_STORAGE_APP_PKG, user));
+            }
         } finally {
             getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
+            removeUsersForTest(users);
         }
     }
 
@@ -244,6 +250,7 @@
      * correctly.
      */
     public void testExternalStorageRead() throws Exception {
+        final int[] users = createUsersForTest();
         try {
             wipePrimaryExternalStorage(getDevice());
 
@@ -251,10 +258,14 @@
             String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             assertNull(getDevice()
                     .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false, options));
-            assertTrue("Failed external storage with read permissions",
-                    runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG));
+
+            for (int user : users) {
+                assertTrue("Failed external storage with read permissions",
+                        runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG, user));
+            }
         } finally {
             getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
+            removeUsersForTest(users);
         }
     }
 
@@ -264,6 +275,7 @@
      * correctly.
      */
     public void testExternalStorageWrite() throws Exception {
+        final int[] users = createUsersForTest();
         try {
             wipePrimaryExternalStorage(getDevice());
 
@@ -271,10 +283,14 @@
             String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             assertNull(getDevice()
                     .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false, options));
-            assertTrue("Failed external storage with write permissions",
-                    runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG));
+
+            for (int user : users) {
+                assertTrue("Failed external storage with write permissions",
+                        runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG, user));
+            }
         } finally {
             getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
+            removeUsersForTest(users);
         }
     }
 
@@ -283,6 +299,7 @@
      * directories belonging to other apps, and those apps can read.
      */
     public void testExternalStorageGifts() throws Exception {
+        final int[] users = createUsersForTest();
         try {
             wipePrimaryExternalStorage(getDevice());
 
@@ -297,18 +314,19 @@
             assertNull(getDevice()
                     .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false, options));
 
-            assertTrue("Failed to write gifts", runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG,
-                    WRITE_EXTERNAL_STORAGE_APP_CLASS, "doWriteGifts"));
-
-            assertTrue("Read failed to verify gifts", runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG,
-                    READ_EXTERNAL_STORAGE_APP_CLASS, "doVerifyGifts"));
-            assertTrue("None failed to verify gifts", runDeviceTests(EXTERNAL_STORAGE_APP_PKG,
-                    EXTERNAL_STORAGE_APP_CLASS, "doVerifyGifts"));
-
+            for (int user : users) {
+                assertTrue("Failed to write gifts", runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG,
+                        WRITE_EXTERNAL_STORAGE_APP_CLASS, "doWriteGifts", user));
+                assertTrue("Read failed to verify gifts", runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG,
+                        READ_EXTERNAL_STORAGE_APP_CLASS, "doVerifyGifts", user));
+                assertTrue("None failed to verify gifts", runDeviceTests(EXTERNAL_STORAGE_APP_PKG,
+                        EXTERNAL_STORAGE_APP_CLASS, "doVerifyGifts", user));
+            }
         } finally {
             getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
             getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
             getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
+            removeUsersForTest(users);
         }
     }
 
@@ -409,7 +427,7 @@
             assertNull(String.format("failed to install permission app with diff cert. Reason: %s",
                     installResult), installResult);
             // run PERMISSION_DIFF_CERT_PKG tests which try to access the permission
-            TestRunResult result = doRunTests(PERMISSION_DIFF_CERT_PKG, null, null);
+            TestRunResult result = doRunTests(PERMISSION_DIFF_CERT_PKG, null, null, USER_OWNER);
             assertDeviceTestsPass(result);
         }
         finally {
@@ -423,20 +441,19 @@
      * Test multi-user emulated storage environment, ensuring that each user has
      * isolated storage.
      */
-    public void testMultiUserStorage() throws Exception {
+    public void testMultiUserStorageIsolated() throws Exception {
         final String PACKAGE = MULTIUSER_STORAGE_PKG;
         final String CLAZZ = MULTIUSER_STORAGE_CLASS;
 
-        if (!isMultiUserSupportedOnDevice(getDevice())) {
-            Log.d(LOG_TAG, "Single user device; skipping isolated storage tests");
-            return;
-        }
-
-        int owner = 0;
-        int secondary = -1;
+        final int[] users = createUsersForTest();
         try {
-            // Create secondary user
-            secondary = createUserOnDevice(getDevice());
+            if (users.length == 1) {
+                Log.d(LOG_TAG, "Single user device; skipping isolated storage tests");
+                return;
+            }
+
+            final int owner = users[0];
+            final int secondary = users[1];
 
             // Install our test app
             getDevice().uninstallPackage(MULTIUSER_STORAGE_PKG);
@@ -447,26 +464,24 @@
 
             // Clear data from previous tests
             assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "cleanIsolatedStorage", owner));
+                    doRunTests(PACKAGE, CLAZZ, "cleanIsolatedStorage", owner));
             assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "cleanIsolatedStorage", secondary));
+                    doRunTests(PACKAGE, CLAZZ, "cleanIsolatedStorage", secondary));
 
             // Have both users try writing into isolated storage
             assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "writeIsolatedStorage", owner));
+                    doRunTests(PACKAGE, CLAZZ, "writeIsolatedStorage", owner));
             assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "writeIsolatedStorage", secondary));
+                    doRunTests(PACKAGE, CLAZZ, "writeIsolatedStorage", secondary));
 
             // Verify they both have isolated view of storage
             assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "readIsolatedStorage", owner));
+                    doRunTests(PACKAGE, CLAZZ, "readIsolatedStorage", owner));
             assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "readIsolatedStorage", secondary));
+                    doRunTests(PACKAGE, CLAZZ, "readIsolatedStorage", secondary));
         } finally {
             getDevice().uninstallPackage(MULTIUSER_STORAGE_PKG);
-            if (secondary != -1) {
-                removeUserOnDevice(getDevice(), secondary);
-            }
+            removeUsersForTest(users);
         }
     }
 
@@ -504,7 +519,11 @@
      * @throws DeviceNotAvailableException if connection to device was lost.
      */
     private boolean runDeviceTests(String pkgName) throws DeviceNotAvailableException {
-        return runDeviceTests(pkgName, null, null);
+        return runDeviceTests(pkgName, null, null, USER_OWNER);
+    }
+
+    private boolean runDeviceTests(String pkgName, int userId) throws DeviceNotAvailableException {
+        return runDeviceTests(pkgName, null, null, userId);
     }
 
     /**
@@ -516,28 +535,14 @@
      */
     private boolean runDeviceTests(String pkgName, String testClassName, String testMethodName)
             throws DeviceNotAvailableException {
-        TestRunResult runResult = doRunTests(pkgName, testClassName, testMethodName);
-        return !runResult.hasFailedTests();
+        return runDeviceTests(pkgName, testClassName, testMethodName, USER_OWNER);
     }
 
-    /**
-     * Helper method to run tests and return the listener that collected the results.
-     *
-     * @param pkgName Android application package for tests
-     * @return the {@link TestRunResult}
-     * @throws DeviceNotAvailableException if connection to device was lost.
-     */
-    private TestRunResult doRunTests(String pkgName, String testClassName,
-            String testMethodName) throws DeviceNotAvailableException {
-
-        RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(pkgName,
-                RUNNER, getDevice().getIDevice());
-        if (testClassName != null && testMethodName != null) {
-            testRunner.setMethodName(testClassName, testMethodName);
-        }
-        CollectingTestListener listener = new CollectingTestListener();
-        getDevice().runInstrumentationTests(testRunner, listener);
-        return listener.getCurrentRunResults();
+    private boolean runDeviceTests(String pkgName, String testClassName, String testMethodName,
+            int userId) throws DeviceNotAvailableException {
+        TestRunResult runResult = doRunTests(pkgName, testClassName, testMethodName,
+                userId);
+        return !runResult.hasFailedTests();
     }
 
     private static boolean isMultiUserSupportedOnDevice(ITestDevice device)
@@ -552,13 +557,38 @@
         return false;
     }
 
+    /**
+     * Return set of users that test should be run for, creating a secondary
+     * user if the device supports it. Always call
+     * {@link #removeUsersForTest(int[])} when finished.
+     */
+    private int[] createUsersForTest() throws DeviceNotAvailableException {
+        if (isMultiUserSupportedOnDevice(getDevice())) {
+            return new int[] { USER_OWNER, createUserOnDevice(getDevice()) };
+        } else {
+            Log.d(LOG_TAG, "Single user device; skipping isolated storage tests");
+            return new int[] { USER_OWNER };
+        }
+    }
+
+    private void removeUsersForTest(int[] users) throws DeviceNotAvailableException {
+        for (int user : users) {
+            if (user != USER_OWNER) {
+                removeUserOnDevice(getDevice(), user);
+            }
+        }
+   }
+
     private static int createUserOnDevice(ITestDevice device) throws DeviceNotAvailableException {
         // TODO: move this to ITestDevice once it supports users
         final String name = "CTS_" + System.currentTimeMillis();
         final String output = device.executeShellCommand("pm create-user " + name);
         if (output.startsWith("Success")) {
             try {
-                return Integer.parseInt(output.substring(output.lastIndexOf(" ")).trim());
+                final int userId = Integer.parseInt(
+                        output.substring(output.lastIndexOf(" ")).trim());
+                device.executeShellCommand("am start-user " + userId);
+                return userId;
             } catch (NumberFormatException e) {
                 fail("Failed to parse result: " + output);
             }
@@ -577,18 +607,24 @@
         }
     }
 
-    private TestRunResult doRunTestsAsUser(
-            String pkgName, String testClassName, String testMethodName, int userId)
-            throws DeviceNotAvailableException {
+    private TestRunResult doRunTests(String pkgName, String testClassName, String testMethodName,
+            int userId) throws DeviceNotAvailableException {
         // TODO: move this to RemoteAndroidTestRunner once it supports users
-        final String cmd = "am instrument --user " + userId + " -w -r -e class " + testClassName
-                + "#" + testMethodName + " " + pkgName + "/" + RUNNER;
+        final StringBuilder cmd = new StringBuilder("am instrument --user " + userId + " -w -r");
+        if (testClassName != null) {
+            cmd.append(" -e class " + testClassName);
+            if (testMethodName != null) {
+                cmd.append("#" + testMethodName);
+            }
+        }
+        cmd.append(" " + pkgName + "/" + RUNNER);
+
         Log.i(LOG_TAG, "Running " + cmd + " on " + getDevice().getSerialNumber());
 
         CollectingTestListener listener = new CollectingTestListener();
         InstrumentationResultParser parser = new InstrumentationResultParser(pkgName, listener);
 
-        getDevice().executeShellCommand(cmd, parser);
+        getDevice().executeShellCommand(cmd.toString(), parser);
         return listener.getCurrentRunResults();
     }
 
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/KeySetHostTest.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/KeySetHostTest.java
index dae5ee7..7f3737d 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/KeySetHostTest.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/KeySetHostTest.java
@@ -66,6 +66,16 @@
             "CtsKeySetSigningAAndBUpgradeB.apk";
     private static final String A_AND_C_SIGNED_B_UPGRADE =
             "CtsKeySetSigningAAndCUpgradeB.apk";
+    private static final String SHARED_USR_A_SIGNED_B_UPGRADE =
+            "CtsKeySetSharedUserSigningAUpgradeB.apk";
+    private static final String SHARED_USR_B_SIGNED_B_UPGRADE =
+            "CtsKeySetSharedUserSigningBUpgradeB.apk";
+    private static final String A_SIGNED_BAD_B_B_UPGRADE =
+            "CtsKeySetSigningABadUpgradeB.apk";
+    private static final String C_SIGNED_BAD_A_AB_UPGRADE =
+            "CtsKeySetSigningCBadAUpgradeAB.apk";
+    private static final String A_SIGNED_NO_B_B_UPGRADE =
+            "CtsKeySetSigningANoDefUpgradeB.apk";
 
     /* package which defines the KEYSET_PERM_NAME signature permission */
     private static final String KEYSET_PERM_DEF_PKG =
@@ -432,4 +442,48 @@
         testKeyRotationPerm(PERM_DEF_A_SIGNED, PERM_USE_A_SIGNED, PERM_DEF_B_SIGNED,
                 true, false);
     }
-}
\ No newline at end of file
+
+    /*
+     * Check if an apk which indicates it uses a sharedUserId and defines an
+     * upgrade keyset is allowed to rotate to that keyset.
+     */
+    public void testUpgradeSharedUser() throws Exception {
+        String installResult = testPackageUpgrade(KEYSET_PKG, SHARED_USR_A_SIGNED_B_UPGRADE,
+                SHARED_USR_B_SIGNED_B_UPGRADE);
+        assertNotNull("upgrade allowed for app with shareduserid!", installResult);
+    }
+
+    /*
+     * Check that an apk with an upgrade key represented by a bad public key
+     * fails to install.
+     */
+    public void testBadUpgradeBadPubKey() throws Exception {
+        mDevice.uninstallPackage(KEYSET_PKG);
+        String installResult = mDevice.installPackage(getTestAppFile(A_SIGNED_BAD_B_B_UPGRADE),
+                false);
+        assertNotNull("Installation of apk with upgrade key referring to a bad public key succeeded!",
+                installResult);
+    }
+
+    /*
+     * Check that an apk with an upgrade keyset that includes a bad public key fails to install.
+     */
+    public void testBadUpgradeMissingPubKey() throws Exception {
+        mDevice.uninstallPackage(KEYSET_PKG);
+        String installResult = mDevice.installPackage(getTestAppFile(C_SIGNED_BAD_A_AB_UPGRADE),
+                false);
+        assertNotNull("Installation of apk with upgrade key referring to a bad public key succeeded!",
+                installResult);
+    }
+
+    /*
+     * Check that an apk with an upgrade key that has no corresponding public key fails to install.
+     */
+    public void testBadUpgradeNoPubKey() throws Exception {
+        mDevice.uninstallPackage(KEYSET_PKG);
+        String installResult = mDevice.installPackage(getTestAppFile(A_SIGNED_NO_B_B_UPGRADE),
+                false);
+        assertNotNull("Installation of apk with upgrade key referring to a bad public key succeeded!",
+                installResult);
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk b/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk
index 2c9c624..4459e69 100644
--- a/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk b/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk
index 098ce9c..0916254 100644
--- a/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk
@@ -29,4 +29,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/DocumentClient/Android.mk b/hostsidetests/appsecurity/test-apps/DocumentClient/Android.mk
index 910e3cd..272ef28 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentClient/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/DocumentClient/Android.mk
@@ -31,4 +31,4 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.mk b/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.mk
index a886fb2..bbf7734 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.mk
@@ -31,4 +31,4 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
index afc8764..a7de92a 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
@@ -25,4 +25,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
index 5b4d9f7..aa09f75 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
@@ -21,13 +21,17 @@
 import android.test.AndroidTestCase;
 import android.util.Log;
 
+import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -43,6 +47,14 @@
     public static final String PACKAGE_WRITE = "com.android.cts.writeexternalstorageapp";
 
     /**
+     * Dump helpful debugging details.
+     */
+    public void testDumpDebug() throws Exception {
+        logCommand("/system/bin/id");
+        logCommand("/system/bin/cat", "/proc/self/mountinfo");
+    }
+
+    /**
      * Primary storage must always be mounted.
      */
     public void testExternalStorageMounted() {
@@ -315,7 +327,9 @@
             }
 
             File[] dirs = removeWhiteList(dir.listFiles());
-            assertEquals(0, dirs.length);
+            if (dirs.length != 0) {
+                fail("Expected wiped storage but found: " + Arrays.toString(dirs));
+            }
         }
     }
 
@@ -336,4 +350,27 @@
             is.close();
         }
     }
+
+    private static void logCommand(String... cmd) throws Exception {
+        final Process proc = new ProcessBuilder(cmd).redirectErrorStream(true).start();
+
+        final ByteArrayOutputStream buf = new ByteArrayOutputStream();
+        copy(proc.getInputStream(), buf);
+        final int res = proc.waitFor();
+
+        Log.d(TAG, Arrays.toString(cmd) + " result " + res + ":");
+        Log.d(TAG, buf.toString());
+    }
+
+    /** Shamelessly lifted from libcore.io.Streams */
+    public static int copy(InputStream in, OutputStream out) throws IOException {
+        int total = 0;
+        byte[] buffer = new byte[8192];
+        int c;
+        while ((c = in.read(buffer)) != -1) {
+            total += c;
+            out.write(buffer, 0, c);
+        }
+        return total;
+    }
 }
diff --git a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk
index e8ce3b8..4c64204 100644
--- a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
index 1dd109a..c37d052 100644
--- a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
@@ -27,4 +27,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk
index 60d6fad..43d3547 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.mk b/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.mk
index ba7285c..5109c99 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk
index 3e392e3..c662d39 100644
--- a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk
@@ -27,4 +27,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk b/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk
index 76187ab..05438ef 100644
--- a/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk
@@ -32,4 +32,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk
index c1422ec..eaed910 100644
--- a/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk
index fb925cd..01cffdb 100644
--- a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk
index 2224d72..032ef57 100644
--- a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
index bf89576..de46dea 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
@@ -35,7 +35,7 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 
 #################################################
@@ -59,7 +59,7 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 
 ################################################
@@ -82,7 +82,7 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 
 ################################################
@@ -105,7 +105,7 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 
 ifeq (,$(ONE_SHOT_MAKEFILE))
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
index 809a6b8..fbb7764 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
@@ -35,4 +35,4 @@
 
 LOCAL_AAPT_FLAGS += --feature-of $(featureOfApk)
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
index 543e4ac..9faaba1 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
index 7cdef62..87b32aa 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
index 26ec5bd..fe289e0 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
index fea0603..d66d674 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
index 3cc5609..7232324 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
index d45ca8f..f1cd994 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
index fa0e488..521f6f2 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk
index 38a0511..f5ac52f 100644
--- a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
index 8878c47..6e0d090 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
@@ -31,4 +31,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
index a98fcea..cdd77e8 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
@@ -27,4 +27,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
index 6857236..afee854 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
@@ -93,6 +93,17 @@
         assertEquals(readInt(TEST_FILE), 32);
     }
 
+    public void testWriteExternalStorageDirs() throws Exception {
+        final File probe = new File(
+                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),
+                "100CTS");
+
+        assertFalse(probe.exists());
+        assertTrue(probe.mkdirs());
+
+        assertDirReadWriteAccess(probe);
+    }
+
     /**
      * Verify that legacy filesystem paths continue working, and that they all
      * point to same location.
diff --git a/tests/webgl/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.mk
old mode 100755
new mode 100644
similarity index 62%
copy from tests/webgl/Android.mk
copy to hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.mk
index ce22dd8..207160f
--- a/tests/webgl/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.mk
@@ -14,21 +14,14 @@
 
 LOCAL_PATH:= $(call my-dir)
 
+#apks signed cts-keyset-test-a
 include $(CLEAR_VARS)
 
-# Don't include this package in any target.
-LOCAL_MODULE_TAGS := optional
-
-# When built, explicitly put it in the data partition.
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-# Must match the package name in CtsTestCaseList.mk
-LOCAL_PACKAGE_NAME := CtsWebGLTestCases
-
+LOCAL_MODULE_TAGS := tests
 LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSigningABadUpgradeB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
+LOCAL_DEX_PREOPT := false
 
-include $(BUILD_CTS_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malBadKey/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/AndroidManifest.xml
new file mode 100644
index 0000000..e18bde5
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <key-set android:name="B" >
+          <public-key android:name="keyB"
+                      android:value="makebadpubkeyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoeFZqMqTbZiozFTXMkXtSKJRzn2qODZgvVXAAwKTi50xYcbPcHTfKxtif8+q7OCp/50JYDH32bg6wkUunn5+dEaHkxZY8d7uw46tQtl5dNGi+6cc4MezVLCS6nkqNDusAgdvgLU6Fl6SGi02KTp1vkt6CwLO977YJP7kt9ouDRTG7ASJiq3OyRRoOqYHhD9gpsbUq4w+1bXGfuuZujA1dXyovXtvrHUGOdFIEBYOVYGfCcwh3lXPmjNJMlHtKQkurq8/LH7a1B5ocoXCGsyR8YHdlWfrqRAfzgOB1KCnNNmWqskU9LOci3uQn9IDeMEFmAd8FqF8SwV+4Ludk/xWGQIDAQAB" />
+        </key-set>
+        <upgrade-key-set android:name="B"/>
+    </key-sets>
+</manifest>
diff --git a/tests/webgl/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.mk
old mode 100755
new mode 100644
similarity index 62%
copy from tests/webgl/Android.mk
copy to hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.mk
index ce22dd8..84f3f75
--- a/tests/webgl/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.mk
@@ -14,21 +14,14 @@
 
 LOCAL_PATH:= $(call my-dir)
 
+#apks signed cts-keyset-test-a
 include $(CLEAR_VARS)
 
-# Don't include this package in any target.
-LOCAL_MODULE_TAGS := optional
-
-# When built, explicitly put it in the data partition.
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-# Must match the package name in CtsTestCaseList.mk
-LOCAL_PACKAGE_NAME := CtsWebGLTestCases
-
+LOCAL_MODULE_TAGS := tests
 LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSigningANoDefUpgradeB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
+LOCAL_DEX_PREOPT := false
 
-include $(BUILD_CTS_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malNoDef/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/AndroidManifest.xml
new file mode 100644
index 0000000..aac717b
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <upgrade-key-set android:name="B"/>
+    </key-sets>
+</manifest>
diff --git a/tests/webgl/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.mk
old mode 100755
new mode 100644
similarity index 62%
copy from tests/webgl/Android.mk
copy to hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.mk
index ce22dd8..7290f06
--- a/tests/webgl/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.mk
@@ -14,21 +14,14 @@
 
 LOCAL_PATH:= $(call my-dir)
 
+#apks signed cts-keyset-test-a
 include $(CLEAR_VARS)
 
-# Don't include this package in any target.
-LOCAL_MODULE_TAGS := optional
-
-# When built, explicitly put it in the data partition.
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-# Must match the package name in CtsTestCaseList.mk
-LOCAL_PACKAGE_NAME := CtsWebGLTestCases
-
+LOCAL_MODULE_TAGS := tests
 LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSigningCBadAUpgradeAB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-c
+LOCAL_DEX_PREOPT := false
 
-include $(BUILD_CTS_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malOneDef/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/AndroidManifest.xml
new file mode 100644
index 0000000..8242f6c
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <key-set android:name="AB" >
+          <public-key android:name="keyA"
+                      android:value="makebadpubkeyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwf5zJblvYSB7Ym7or/7GggAAu7mp7RrykPJsXhod8doFhVT5s7eF3A4MCE55vvANP7HvwMw2b+T6qx7Pq0VJtbbSDtlBHBtIc47Pjq0CsDg590BUcgKp7PdJ9J6UVgtzDnV6cGEpXmSag3sY+lqiW04ytPhCVwzYTWGdYe9+TIl47cBrveRfLOlGrcuFQe+zCTmDFqzBKCRHK9b7l5PDWvXXyg65Uu/MBUA/TZWO0fEqOlxZG/nn6DUKQLhPdmJRXWJ3WqMNMhJGD+nKtkmdX703xRqmg4h+6g0S7M9Y3IQ2NUGyw05AYzCguHB/Mv6uVIiW659wpbyb45TgKG3UhQIDAQAB" />
+          <public-key android:name="keyB"
+                      android:value="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoeFZqMqTbZiozFTXMkXtSKJRzn2qODZgvVXAAwKTi50xYcbPcHTfKxtif8+q7OCp/50JYDH32bg6wkUunn5+dEaHkxZY8d7uw46tQtl5dNGi+6cc4MezVLCS6nkqNDusAgdvgLU6Fl6SGi02KTp1vkt6CwLO977YJP7kt9ouDRTG7ASJiq3OyRRoOqYHhD9gpsbUq4w+1bXGfuuZujA1dXyovXtvrHUGOdFIEBYOVYGfCcwh3lXPmjNJMlHtKQkurq8/LH7a1B5ocoXCGsyR8YHdlWfrqRAfzgOB1KCnNNmWqskU9LOci3uQn9IDeMEFmAd8FqF8SwV+4Ludk/xWGQIDAQAB" />
+        </key-set>
+        <upgrade-key-set android:name="AB"/>
+    </key-sets>
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.mk
index 715905a..f5a7286 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -36,4 +36,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.mk
index eceea38..678d89d 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -36,4 +36,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.mk
index ed6db69..b8acc99 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.mk
@@ -23,4 +23,4 @@
 LOCAL_PACKAGE_NAME := CtsKeySetTestApp
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uA/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uA/Android.mk
index efba345..4d441de 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uA/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uA/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed by cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -35,7 +35,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed by cts-keyset-test-a and cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -47,4 +47,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_ADDITIONAL_CERTIFICATES := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.mk
index 219689e..406529c 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.mk
@@ -24,4 +24,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.mk
index 040c378..23d6b17 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.mk
@@ -24,4 +24,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uB/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uB/Android.mk
index 62b5461..f2cedf9 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uB/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uB/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -36,7 +36,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed by cts-keyset-test-a and cts-keyset-test-c
 include $(CLEAR_VARS)
@@ -49,4 +49,4 @@
 LOCAL_ADDITIONAL_CERTIFICATES := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-c
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.mk
new file mode 100644
index 0000000..1d6d5a5
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.mk
@@ -0,0 +1,39 @@
+# Copyright (C) 2014 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+#apks signed cts-keyset-test-a
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSharedUserSigningAUpgradeB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
+
+#apks signed cts-keyset-test-b
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSharedUserSigningBUpgradeB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/AndroidManifest.xml
new file mode 100644
index 0000000..55a1c24
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets"
+        android:sharedUserId="com.android.cts.keysets.shareduser">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <key-set android:name="B" >
+          <public-key android:name="keyB"
+                      android:value="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoeFZqMqTbZiozFTXMkXtSKJRzn2qODZgvVXAAwKTi50xYcbPcHTfKxtif8+q7OCp/50JYDH32bg6wkUunn5+dEaHkxZY8d7uw46tQtl5dNGi+6cc4MezVLCS6nkqNDusAgdvgLU6Fl6SGi02KTp1vkt6CwLO977YJP7kt9ouDRTG7ASJiq3OyRRoOqYHhD9gpsbUq4w+1bXGfuuZujA1dXyovXtvrHUGOdFIEBYOVYGfCcwh3lXPmjNJMlHtKQkurq8/LH7a1B5ocoXCGsyR8YHdlWfrqRAfzgOB1KCnNNmWqskU9LOci3uQn9IDeMEFmAd8FqF8SwV+4Ludk/xWGQIDAQAB" />
+        </key-set>
+        <upgrade-key-set android:name="B"/>
+    </key-sets>
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.mk
index 5fc4ab9..9b327fe 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.mk
@@ -24,4 +24,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/webgl/Android.mk b/hostsidetests/atrace/Android.mk
old mode 100755
new mode 100644
similarity index 69%
copy from tests/webgl/Android.mk
copy to hostsidetests/atrace/Android.mk
index ce22dd8..4bde535
--- a/tests/webgl/Android.mk
+++ b/hostsidetests/atrace/Android.mk
@@ -12,23 +12,21 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-LOCAL_PATH:= $(call my-dir)
+LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
 
-# Don't include this package in any target.
-LOCAL_MODULE_TAGS := optional
-
-# When built, explicitly put it in the data partition.
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
+LOCAL_MODULE_TAGS := optional
+
 # Must match the package name in CtsTestCaseList.mk
-LOCAL_PACKAGE_NAME := CtsWebGLTestCases
+LOCAL_MODULE := CtsAtraceHostTestCases
 
-LOCAL_SDK_VERSION := current
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
 
-include $(BUILD_CTS_PACKAGE)
+LOCAL_CTS_TEST_PACKAGE := android.host.atrace
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java b/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java
new file mode 100644
index 0000000..f7af31c
--- /dev/null
+++ b/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.atrace.cts;
+
+import com.android.ddmlib.Log;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Test to check that atrace is usable, to enable usage of systrace.
+ */
+public class AtraceHostTest extends DeviceTestCase {
+    private static final String TAG = "AtraceHostTest";
+
+    private ITestDevice mDevice;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevice = getDevice();
+    }
+
+    // Collection of all userspace tags, and 'sched'
+    private static final List<String> sRequiredCategoriesList = Arrays.asList(
+            "sched",
+            "gfx",
+            "input",
+            "view",
+            "webview",
+            "wm",
+            "am",
+            "sm",
+            "audio",
+            "video",
+            "camera",
+            "hal",
+            "app",
+            "res",
+            "dalvik",
+            "rs",
+            "bionic",
+            "power"
+    );
+
+    /**
+     * Tests that atrace exists and is runnable with no args
+     */
+    public void testSimpleRun() throws Exception {
+        String output = mDevice.executeShellCommand("atrace");
+        String[] lines = output.split("\\r?\\n");
+
+        // check for expected stdout
+        assertEquals("capturing trace... done", lines[0]);
+        assertEquals("TRACE:", lines[1]);
+
+        // commented trace marker starts here
+        assertEquals("# tracer: nop", lines[2]);
+    }
+
+    /**
+     * Tests the output of "atrace --list_categories" to ensure required categories exist.
+     */
+    public void testCategories() throws Exception {
+        String output = mDevice.executeShellCommand("atrace --list_categories");
+        String[] categories = output.split("\\r?\\n");
+
+        Set<String> requiredCategories = new HashSet<String>(sRequiredCategoriesList);
+
+        for (String category : categories) {
+            int dashIndex = category.indexOf("-");
+
+            assertTrue(dashIndex > 1); // must match category output format
+            category = category.substring(0, dashIndex).trim();
+
+            requiredCategories.remove(category);
+        }
+
+        if (!requiredCategories.isEmpty()) {
+            for (String missingCategory : requiredCategories) {
+                Log.d(TAG, "missing category: " + missingCategory);
+            }
+            fail("Expected categories missing from atrace");
+        }
+    }
+}
diff --git a/tests/webgl/Android.mk b/hostsidetests/devicepolicy/app/CertInstaller/Android.mk
old mode 100755
new mode 100644
similarity index 72%
rename from tests/webgl/Android.mk
rename to hostsidetests/devicepolicy/app/CertInstaller/Android.mk
index ce22dd8..22a78e2
--- a/tests/webgl/Android.mk
+++ b/hostsidetests/devicepolicy/app/CertInstaller/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 The Android Open Source Project
+# Copyright (C) 2015 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -16,18 +16,15 @@
 
 include $(CLEAR_VARS)
 
-# Don't include this package in any target.
+LOCAL_PACKAGE_NAME := CtsCertInstallerApp
+
 LOCAL_MODULE_TAGS := optional
 
-# When built, explicitly put it in the data partition.
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-# Must match the package name in CtsTestCaseList.mk
-LOCAL_PACKAGE_NAME := CtsWebGLTestCases
+LOCAL_JAVA_LIBRARIES := android.test.runner
 
 LOCAL_SDK_VERSION := current
 
diff --git a/hostsidetests/devicepolicy/app/CertInstaller/AndroidManifest.xml b/hostsidetests/devicepolicy/app/CertInstaller/AndroidManifest.xml
new file mode 100644
index 0000000..c50e5fd
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/CertInstaller/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.certinstaller">
+
+    <uses-sdk android:minSdkVersion="22"/>
+
+    <application>
+        <activity android:name="CertInstallerActivity">
+            <intent-filter>
+                <action android:name="com.android.cts.certinstaller.install_cert" />
+                <action android:name="com.android.cts.certinstaller.remove_cert" />
+                <action android:name="com.android.cts.certinstaller.verify_cert" />
+                <action android:name="com.android.cts.certinstaller.install_keypair" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/CertInstallerActivity.java b/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/CertInstallerActivity.java
new file mode 100644
index 0000000..b14822b
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/CertInstallerActivity.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.certinstaller;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Base64;
+import android.util.Base64InputStream;
+import android.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.util.List;
+
+/**
+ * Delegated certificate installer app that responds to specific intents and executes various DPM
+ * certificate manipulation APIs. The following APIs are exercised:
+ * {@link DevicePolicyManager#installCaCert},
+ * {@link DevicePolicyManager#uninstallCaCert},
+ * {@link DevicePolicyManager#hasCaCertInstalled},
+ * {@link DevicePolicyManager#getInstalledCaCerts},
+ * {@link DevicePolicyManager#installKeyPair}.
+ */
+public class CertInstallerActivity extends Activity {
+
+    private static final String TAG = "DelegatedCertInstaller";
+    // exercises {@link DevicePolicyManager#installCaCert} and
+    // {@link DevicePolicyManager#hasCaCertInstalled},
+    private static final String ACTION_INSTALL_CERT = "com.android.cts.certinstaller.install_cert";
+    // exercises {@link DevicePolicyManager#uninstallCaCert} and
+    // {@link DevicePolicyManager#hasCaCertInstalled},
+    private static final String ACTION_REMOVE_CERT = "com.android.cts.certinstaller.remove_cert";
+    // exercises {@link DevicePolicyManager#getInstalledCaCerts},
+    private static final String ACTION_VERIFY_CERT = "com.android.cts.certinstaller.verify_cert";
+    // exercises {@link DevicePolicyManager#installKeyPair},
+    private static final String ACTION_INSTALL_KEYPAIR =
+            "com.android.cts.certinstaller.install_keypair";
+
+    private static final String ACTION_CERT_OPERATION_DONE = "com.android.cts.certinstaller.done";
+
+    private static final String EXTRA_CERT_DATA = "extra_cert_data";
+    private static final String EXTRA_KEY_DATA = "extra_key_data";
+    private static final String EXTRA_KEY_ALIAS = "extra_key_alias";
+    private static final String EXTRA_RESULT_VALUE = "extra_result_value";
+    private static final String EXTRA_RESULT_EXCEPTION = "extra_result_exception";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = getIntent();
+        if (intent == null) {
+            finish();
+            return;
+        }
+
+        String action = intent.getAction();
+        DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(
+                Context.DEVICE_POLICY_SERVICE);
+
+        byte[] certBuffer;
+
+        if (ACTION_INSTALL_CERT.equals(action)) {
+            try {
+                certBuffer = intent.getByteArrayExtra(EXTRA_CERT_DATA);
+                // Verify cert is not currently installed.
+                if (dpm.hasCaCertInstalled(null, certBuffer)) {
+                    throw new RuntimeException("Cert already on device?");
+                }
+                if (!dpm.installCaCert(null, certBuffer)) {
+                    throw new RuntimeException("installCaCert returned false.");
+                }
+                if (!dpm.hasCaCertInstalled(null, certBuffer)) {
+                    throw new RuntimeException("Cannot find cert after installation.");
+                }
+                sendResult(true, null);
+            } catch (Exception e) {
+                Log.e(TAG, "Exception raised duing ACTION_INSTALL_CERT", e);
+                sendResult(false, e);
+            }
+        } else if (ACTION_REMOVE_CERT.equals(action)) {
+            try {
+                certBuffer = intent.getByteArrayExtra(EXTRA_CERT_DATA);
+                if (!dpm.hasCaCertInstalled(null, certBuffer)) {
+                    throw new RuntimeException("Trying to uninstall a non-existent cert.");
+                }
+                dpm.uninstallCaCert(null, certBuffer);
+                sendResult(!dpm.hasCaCertInstalled(null, certBuffer), null);
+            } catch (Exception e) {
+                Log.e(TAG, "Exception raised duing ACTION_REMOVE_CERT", e);
+                sendResult(false, e);
+            }
+        } else if (ACTION_VERIFY_CERT.equals(action)) {
+            try {
+                certBuffer = intent.getByteArrayExtra(EXTRA_CERT_DATA);
+                sendResult(containsCertificate(dpm.getInstalledCaCerts(null), certBuffer), null);
+            } catch (Exception e) {
+                Log.e(TAG, "Exception raised duing ACTION_VERIFY_CERT", e);
+                sendResult(false, e);
+            }
+        } else if (ACTION_INSTALL_KEYPAIR.equals(action)) {
+            String alias = intent.getStringExtra(EXTRA_KEY_ALIAS);
+            String key = intent.getStringExtra(EXTRA_KEY_DATA);
+            String cert = intent.getStringExtra(EXTRA_CERT_DATA);
+            try {
+                PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(
+                        Base64.decode(key, Base64.DEFAULT));
+                KeyFactory kf = KeyFactory.getInstance("RSA");
+                PrivateKey privatekey = kf.generatePrivate(keySpec);
+
+                Certificate certificate = CertificateFactory.getInstance("X.509")
+                        .generateCertificate(
+                                new Base64InputStream(new ByteArrayInputStream(cert.getBytes()),
+                                        Base64.DEFAULT));
+                // Unfortunately there is no programmatically way to check if the given private key
+                // is indeed in the key store as a unprivileged app. So we just rely on
+                // installKeyPair() returning true as the success criteria of this test. Separate
+                // CTS keychain tests will make sure the API's behaviour is correct.
+                // Note: installKeyPair() will silently return false if there is no lockscreen
+                // password, however the test setup should have set one already.
+                sendResult(dpm.installKeyPair(null, privatekey, certificate,  alias), null);
+            } catch (Exception e) {
+                Log.e(TAG, "Exception raised duing ACTION_INSTALL_KEYPAIR", e);
+                sendResult(false, e);
+            }
+        }
+        finish();
+    }
+
+    private void sendResult(boolean succeed, Exception e) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_CERT_OPERATION_DONE);
+        intent.putExtra(EXTRA_RESULT_VALUE, succeed);
+        if (e != null) {
+            intent.putExtra(EXTRA_RESULT_EXCEPTION, e);
+        }
+        sendBroadcast(intent);
+    }
+
+    private boolean containsCertificate(List<byte[]> certificates, byte[] toMatch)
+            throws CertificateException {
+        Certificate certificateToMatch = readCertificate(toMatch);
+        for (byte[] certBuffer : certificates) {
+            Certificate cert = readCertificate(certBuffer);
+            if (certificateToMatch.equals(cert)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private Certificate readCertificate(byte[] certBuffer) throws CertificateException {
+        final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+        return certFactory.generateCertificate(new ByteArrayInputStream(certBuffer));
+    }
+
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk b/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
index e621933..bd0089f 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
@@ -26,6 +26,8 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner cts-junit
 
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
index dfc7e9c..3b90ef9 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
@@ -49,6 +49,9 @@
 
         <activity
             android:name="com.android.cts.deviceowner.LockTaskUtilityActivity" />
+        <activity
+            android:name="com.android.cts.deviceowner.LockTaskUtilityActivityIfWhitelisted"
+            android:lockTaskMode="if_whitelisted" />
 
         <!-- we need to give a different taskAffinity so that when we use
              FLAG_ACTIVITY_NEW_TASK, the system tries to start it in a different task
@@ -61,7 +64,7 @@
             android:name="com.android.cts.deviceowner.ApplicationRestrictionActivity" />
     </application>
 
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.cts.deviceowner"
                      android:label="Device Owner CTS tests"/>
 </manifest>
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionsTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionsTest.java
index 5e03de9..13a2a6d 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionsTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionsTest.java
@@ -20,6 +20,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
+import android.os.Parcelable;
 
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
@@ -106,7 +107,7 @@
     // Should be consistent with assertBundle0
     private Bundle createBundle0() {
         Bundle result = new Bundle();
-        // Tests for four allowed types: Integer, Boolean, String and String[]
+        // Tests for 6 allowed types: Integer, Boolean, String, String[], Bundle and Parcelable[]
         // Also test for string escaping handling
         result.putBoolean("boolean_0", false);
         result.putBoolean("boolean_1", true);
@@ -115,12 +116,28 @@
         result.putString("empty", "");
         result.putString("string", "text");
         result.putStringArray("string[]", testStrings);
+
+        // Adding a bundle, which contain 2 nested restrictions - bundle_string and bundle_int
+        Bundle bundle = new Bundle();
+        bundle.putString("bundle_string", "bundle_string");
+        bundle.putInt("bundle_int", 1);
+        result.putBundle("bundle", bundle);
+
+        // Adding an array of 2 bundles
+        Bundle[] bundleArray = new Bundle[2];
+        bundleArray[0] = new Bundle();
+        bundleArray[0].putString("bundle_array_string", "bundle_array_string");
+        // Put bundle inside bundle
+        bundleArray[0].putBundle("bundle_array_bundle", bundle);
+        bundleArray[1] = new Bundle();
+        bundleArray[1].putString("bundle_array_string2", "bundle_array_string2");
+        result.putParcelableArray("bundle_array", bundleArray);
         return result;
     }
 
     // Should be consistent with createBundle0
     private void assertBundle0(Bundle bundle) {
-        assertEquals(6, bundle.size());
+        assertEquals(8, bundle.size());
         assertEquals(false, bundle.getBoolean("boolean_0"));
         assertEquals(true, bundle.getBoolean("boolean_1"));
         assertEquals(0x7fffffff, bundle.getInt("integer"));
@@ -132,6 +149,23 @@
         for (int i = 0; i < strings.length; i++) {
             assertEquals(strings[i], testStrings[i]);
         }
+
+        Bundle childBundle = bundle.getBundle("bundle");
+        assertEquals("bundle_string", childBundle.getString("bundle_string"));
+        assertEquals(1, childBundle.getInt("bundle_int"));
+
+        Parcelable[] bundleArray = bundle.getParcelableArray("bundle_array");
+        assertEquals(2, bundleArray.length);
+        // Verifying bundle_array[0]
+        Bundle bundle1 = (Bundle) bundleArray[0];
+        assertEquals("bundle_array_string", bundle1.getString("bundle_array_string"));
+        Bundle bundle1ChildBundle = bundle1.getBundle("bundle_array_bundle");
+        assertNotNull(bundle1ChildBundle);
+        assertEquals("bundle_string", bundle1ChildBundle.getString("bundle_string"));
+        assertEquals(1, bundle1ChildBundle.getInt("bundle_int"));
+        // Verifying bundle_array[1]
+        Bundle bundle2 = (Bundle) bundleArray[1];
+        assertEquals("bundle_array_string2", bundle2.getString("bundle_array_string2"));
     }
 
     // Should be consistent with assertBundle1
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementTest.java
index fe2bdda..23d108f 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementTest.java
@@ -34,11 +34,13 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        // Enable credential storage by setting a nonempty password.
         assertTrue(mDevicePolicyManager.resetPassword("test", 0));
     }
 
     @Override
     protected void tearDown() throws Exception {
+        // Delete all keys by resetting our password to null, which clears the keystore.
         mDevicePolicyManager.setPasswordQuality(getWho(),
                 DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
         mDevicePolicyManager.setPasswordMinimumLength(getWho(), 0);
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskTest.java
index 69c5bf7..88b7841 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskTest.java
@@ -18,6 +18,7 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -32,12 +33,24 @@
 
     private static final String TEST_PACKAGE = "com.google.android.example.somepackage";
 
+    private static final String UTILITY_ACTIVITY
+            = "com.android.cts.deviceowner.LockTaskUtilityActivity";
+    private static final String UTILITY_ACTIVITY_IF_WHITELISTED
+            = "com.android.cts.deviceowner.LockTaskUtilityActivityIfWhitelisted";
+
+    private static final String RECEIVING_ACTIVITY_PACKAGE_NAME
+            = "com.android.cts.intent.receiver";
+    private static final String RECEIVING_ACTIVITY_NAME
+            = "com.android.cts.intent.receiver.IntentReceiverActivity";
+    private static final String ACTION_JUST_CREATE =
+            "com.android.cts.action.JUST_CREATE";
+
     private static final int ACTIVITY_RESUMED_TIMEOUT_MILLIS = 20000;  // 20 seconds
     private static final int ACTIVITY_RUNNING_TIMEOUT_MILLIS = 10000;  // 10 seconds
     private static final int ACTIVITY_DESTROYED_TIMEOUT_MILLIS = 60000;  // 60 seconds
-
+    private static final int UPDATE_LOCK_TASK_TIMEOUT_MILLIS = 1000; // 1 second
     public static final String RECEIVING_ACTIVITY_CREATED_ACTION
-            = "com.android.cts.deviceowner.RECEIVER_ACTIVITY_STARTED_ACTION";
+            = "com.android.cts.deviceowner.RECEIVING_ACTIVITY_CREATED_ACTION";
     /**
      * The tests below need to keep detailed track of the state of the activity
      * that is started and stopped frequently.  To do this it sends a number of
@@ -102,9 +115,13 @@
     private final Object mReceivingActivityCreatedLock = new Object();
     private Boolean mIntentHandled;
 
+    private ActivityManager mActivityManager;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[0]);
+        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
         IntentFilter filter = new IntentFilter();
         filter.addAction(LockTaskUtilityActivity.CREATE_ACTION);
         filter.addAction(LockTaskUtilityActivity.DESTROY_ACTION);
@@ -117,10 +134,12 @@
 
     @Override
     protected void tearDown() throws Exception {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[0]);
         mContext.unregisterReceiver(mReceiver);
         super.tearDown();
     }
 
+    // Setting and unsetting the lock task packages.
     public void testSetLockTaskPackages() {
         mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { TEST_PACKAGE });
         assertTrue(mDevicePolicyManager.isLockTaskPermitted(TEST_PACKAGE));
@@ -132,45 +151,62 @@
     // Start lock task, verify that ActivityManager knows thats what is going on.
     public void testStartLockTask() {
         mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
-        startLockTask();
+        startLockTask(UTILITY_ACTIVITY);
         waitForResume();
 
         // Verify that activity open and activity manager is in lock task.
-        ActivityManager activityManager = (ActivityManager)
-                mContext.getSystemService(Context.ACTIVITY_SERVICE);
-        assertTrue(activityManager.isInLockTaskMode());
+        assertLockTaskModeActive();
         assertTrue(mIsActivityRunning);
         assertTrue(mIsActivityResumed);
 
-        stopAndFinish(activityManager);
+        stopAndFinish(UTILITY_ACTIVITY);
     }
 
     // Verifies that the act of finishing is blocked by ActivityManager in lock task.
     // This results in onDestroy not being called until stopLockTask is called before finish.
     public void testCannotFinish() {
         mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
-        startLockTask();
+        startLockTask(UTILITY_ACTIVITY);
 
         // If lock task has not exited then the activity shouldn't actually receive onDestroy.
-        finishAndWait();
-        ActivityManager activityManager = (ActivityManager)
-                mContext.getSystemService(Context.ACTIVITY_SERVICE);
-        assertTrue(activityManager.isInLockTaskMode());
+        finishAndWait(UTILITY_ACTIVITY);
+        assertLockTaskModeActive();
         assertTrue(mIsActivityRunning);
 
-        stopAndFinish(activityManager);
+        stopAndFinish(UTILITY_ACTIVITY);
+    }
+
+    // Verifies that updating the whitelisting during a lock task mode started with startLockTask
+    // does not kill the locked task.
+    public void testUpdateWhitelisting() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startLockTask(UTILITY_ACTIVITY);
+
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[0]);
+
+        synchronized (mActivityRunningLock) {
+            try {
+                mActivityRunningLock.wait(UPDATE_LOCK_TASK_TIMEOUT_MILLIS);
+            } catch (InterruptedException e) {
+            }
+        }
+
+        assertLockTaskModeActive();
+        assertTrue(mIsActivityRunning);
+
+        stopAndFinish(UTILITY_ACTIVITY);
     }
 
     // This launches an activity that is in the current task.
-    // this should be permitted as a part of lock task (since it isn't a new task).
-    public void testStartActivityWithinTask() {
+    // This should always be permitted as a part of lock task (since it isn't a new task).
+    public void testStartActivity_withinTask() {
         mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
-        startLockTask();
+        startLockTask(UTILITY_ACTIVITY);
         waitForResume();
 
         mReceivingActivityWasCreated = false;
-        Intent launchIntent = new Intent(mContext, IntentReceivingActivity.class);
-        Intent lockTaskUtility = getLockTaskUtility();
+        Intent launchIntent = getIntentReceivingActivityIntent(0);
+        Intent lockTaskUtility = getLockTaskUtility(UTILITY_ACTIVITY);
         lockTaskUtility.putExtra(LockTaskUtilityActivity.START_ACTIVITY, launchIntent);
         mContext.startActivity(lockTaskUtility);
 
@@ -181,18 +217,19 @@
             }
             assertTrue(mReceivingActivityWasCreated);
         }
-        stopAndFinish(null);
+        stopAndFinish(UTILITY_ACTIVITY);
     }
 
-    // This launches an activity that is not part of the current task and therefore
-    // should be blocked.
-    public void testCannotStartActivityOutsideTask() {
-        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
-        startLockTask();
+    // This launches a whitelisted activity that is not part of the current task.
+    // This should be permitted as a part of lock task.
+    public void testStartActivity_outsideTaskWhitelisted() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME,
+                RECEIVING_ACTIVITY_PACKAGE_NAME });
+        startLockTask(UTILITY_ACTIVITY);
         waitForResume();
 
         mReceivingActivityWasCreated = false;
-        Intent launchIntent = new Intent(mContext, IntentReceivingActivity.class);
+        Intent launchIntent = getIntentReceivingActivityIntent(0);
         launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         mContext.startActivity(launchIntent);
         synchronized (mReceivingActivityCreatedLock) {
@@ -200,9 +237,106 @@
                 mReceivingActivityCreatedLock.wait(ACTIVITY_RESUMED_TIMEOUT_MILLIS);
             } catch (InterruptedException e) {
             }
+            assertTrue(mReceivingActivityWasCreated);
+        }
+        stopAndFinish(UTILITY_ACTIVITY);
+    }
+
+    // This launches a non-whitelisted activity that is not part of the current task.
+    // This should be blocked.
+    public void testStartActivity_outsideTaskNonWhitelisted() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startLockTask(UTILITY_ACTIVITY);
+        waitForResume();
+
+        Intent launchIntent = getIntentReceivingActivityIntent(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(launchIntent);
+        synchronized (mActivityResumedLock) {
+            try {
+                mActivityResumedLock.wait(ACTIVITY_RESUMED_TIMEOUT_MILLIS);
+            } catch (InterruptedException e) {
+            }
             assertFalse(mReceivingActivityWasCreated);
         }
-        stopAndFinish(null);
+        stopAndFinish(UTILITY_ACTIVITY);
+    }
+
+    // Test the lockTaskMode flag for an activity declaring if_whitelisted.
+    // Whitelist the activity and verify that lock task mode is started.
+    public void testManifestArgument_whitelisted() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        waitForResume();
+
+        assertLockTaskModeActive();
+        assertTrue(mIsActivityRunning);
+        assertTrue(mIsActivityResumed);
+
+        stopAndFinish(UTILITY_ACTIVITY_IF_WHITELISTED);
+    }
+
+    // Test the lockTaskMode flag for an activity declaring if_whitelisted.
+    // Don't whitelist the activity and verify that lock task mode is not started.
+    public void testManifestArgument_nonWhitelisted() {
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        waitForResume();
+
+        assertLockTaskModeInactive();
+        assertTrue(mIsActivityRunning);
+        assertTrue(mIsActivityResumed);
+
+        stopAndFinish(UTILITY_ACTIVITY_IF_WHITELISTED);
+    }
+
+    // Test the lockTaskMode flag for an activity declaring if_whitelisted.
+    // An activity locked via manifest argument can finish without calling stopLockTask.
+    public void testManifestArgument_canFinish() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        waitForResume();
+        finishAndWait(UTILITY_ACTIVITY_IF_WHITELISTED);
+
+        assertFalse(mIsActivityRunning);
+        assertFalse(mIsActivityResumed);
+    }
+
+    // Test the lockTaskMode flag for an activity declaring if_whitelisted.
+    // When a whitelisting is revoked, an activity locked via manifest argument should be killed
+    // by the system.
+    public void testManifestArgument_updateWhitelisting() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        waitForResume();
+
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[0]);
+
+        synchronized (mActivityRunningLock) {
+            try {
+                mActivityRunningLock.wait(UPDATE_LOCK_TASK_TIMEOUT_MILLIS);
+            } catch (InterruptedException e) {
+            }
+        }
+
+        assertLockTaskModeInactive();
+        assertFalse(mIsActivityRunning);
+        assertFalse(mIsActivityResumed);
+    }
+
+    /**
+     * Checks that lock task mode is active and fails the test if it isn't.
+     */
+    private void assertLockTaskModeActive() {
+        assertTrue(mActivityManager.isInLockTaskMode());
+        assertEquals(ActivityManager.LOCK_TASK_MODE_LOCKED,
+                mActivityManager.getLockTaskModeState());
+    }
+
+    /**
+     * Checks that lock task mode is not active and fails the test if it is.
+     */
+    private void assertLockTaskModeInactive() {
+        assertFalse(mActivityManager.isInLockTaskMode());
+        assertEquals(ActivityManager.LOCK_TASK_MODE_NONE, mActivityManager.getLockTaskModeState());
     }
 
     /**
@@ -213,12 +347,10 @@
      * If activityManager is not null then verify that the ActivityManager
      * is no longer in lock task mode.
      */
-    private void stopAndFinish(ActivityManager activityManager) {
-        stopLockTask();
-        finishAndWait();
-        if (activityManager != null) {
-            assertFalse(activityManager.isInLockTaskMode());
-        }
+    private void stopAndFinish(String className) {
+        stopLockTask(className);
+        finishAndWait(className);
+        assertLockTaskModeInactive();
         assertFalse(mIsActivityRunning);
     }
 
@@ -226,9 +358,9 @@
      * Call finish on the LockTaskUtilityActivity and wait for
      * onDestroy to be called.
      */
-    private void finishAndWait() {
+    private void finishAndWait(String className) {
         synchronized (mActivityRunningLock) {
-            finish();
+            finish(className);
             if (mIsActivityRunning) {
                 try {
                     mActivityRunningLock.wait(ACTIVITY_DESTROYED_TIMEOUT_MILLIS);
@@ -256,8 +388,8 @@
     /**
      * Calls startLockTask on the LockTaskUtilityActivity
      */
-    private void startLockTask() {
-        Intent intent = getLockTaskUtility();
+    private void startLockTask(String className) {
+        Intent intent = getLockTaskUtility(className);
         intent.putExtra(LockTaskUtilityActivity.START_LOCK_TASK, true);
         startAndWait(intent);
     }
@@ -265,8 +397,8 @@
     /**
      * Calls stopLockTask on the LockTaskUtilityActivity
      */
-    private void stopLockTask() {
-        Intent intent = getLockTaskUtility();
+    private void stopLockTask(String className) {
+        Intent intent = getLockTaskUtility(className);
         intent.putExtra(LockTaskUtilityActivity.STOP_LOCK_TASK, true);
         startAndWait(intent);
     }
@@ -274,8 +406,8 @@
     /**
      * Calls finish on the LockTaskUtilityActivity
      */
-    private void finish() {
-        Intent intent = getLockTaskUtility();
+    private void finish(String className) {
+        Intent intent = getLockTaskUtility(className);
         intent.putExtra(LockTaskUtilityActivity.FINISH, true);
         startAndWait(intent);
     }
@@ -303,10 +435,19 @@
      *
      * This intent includes the flags to make it act as single top.
      */
-    private Intent getLockTaskUtility() {
+    private Intent getLockTaskUtility(String className) {
         Intent intent = new Intent();
-        intent.setClassName(PACKAGE_NAME, LockTaskUtilityActivity.class.getName());
+        intent.setClassName(PACKAGE_NAME, className);
         intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
         return intent;
     }
+
+    private Intent getIntentReceivingActivityIntent(int flags) {
+        Intent intent = new Intent();
+        intent.setComponent(
+                new ComponentName(RECEIVING_ACTIVITY_PACKAGE_NAME, RECEIVING_ACTIVITY_NAME));
+        intent.setAction(ACTION_JUST_CREATE);
+        intent.setFlags(flags);
+        return intent;
+    }
 }
diff --git a/apps/CtsVerifier/lib/colorchecker/vec3.cpp b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskUtilityActivityIfWhitelisted.java
similarity index 75%
copy from apps/CtsVerifier/lib/colorchecker/vec3.cpp
copy to hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskUtilityActivityIfWhitelisted.java
index ac16620..4cf6efa 100644
--- a/apps/CtsVerifier/lib/colorchecker/vec3.cpp
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskUtilityActivityIfWhitelisted.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,10 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#define LOG_NDEBUG 0
 
-#define LOG_TAG "Vec3"
-#include <utils/Log.h>
-#include <utils/Timers.h>
+package com.android.cts.deviceowner;
 
-#include "vec3.h"
+public class LockTaskUtilityActivityIfWhitelisted extends LockTaskUtilityActivity {
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/SilentPackageInstallerTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/SilentPackageInstallerTest.java
new file mode 100644
index 0000000..8e63543
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/SilentPackageInstallerTest.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.deviceowner;
+
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.IntentSender;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * This class tests silent package install and uninstall by a device owner.
+ */
+public class SilentPackageInstallerTest extends BaseDeviceOwnerTest {
+    private static final String TEST_APP_LOCATION = "/data/local/tmp/CtsSimpleApp.apk";
+    private static final String TEST_APP_PKG = "com.android.cts.launcherapps.simpleapp";
+    private static final int PACKAGE_INSTALLER_TIMEOUT_MS = 60000; // 60 seconds
+    private static final String ACTION_INSTALL_COMMIT =
+            "com.android.cts.deviceowner.INTENT_PACKAGE_INSTALL_COMMIT";
+
+    private PackageManager mPackageManager;
+    private PackageInstaller mPackageInstaller;
+    private PackageInstaller.Session mSession;
+    private boolean mCallbackReceived;
+
+    private final Object mPackageInstallerTimeoutLock = new Object();
+
+    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            assertEquals(PackageInstaller.STATUS_SUCCESS, intent.getIntExtra(
+                    PackageInstaller.EXTRA_STATUS,
+                    PackageInstaller.STATUS_FAILURE));
+            assertEquals(TEST_APP_PKG, intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME));
+            mContext.unregisterReceiver(this);
+            synchronized (mPackageInstallerTimeoutLock) {
+                mCallbackReceived = true;
+                mPackageInstallerTimeoutLock.notify();
+            }
+        }
+    };
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mPackageManager = mContext.getPackageManager();
+        mPackageInstaller = mPackageManager.getPackageInstaller();
+        assertNotNull(mPackageInstaller);
+        mCallbackReceived = false;
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        try {
+            mContext.unregisterReceiver(mBroadcastReceiver);
+        } catch (IllegalArgumentException e) {
+            // ignore
+        }
+        if (mSession != null) {
+            mSession.abandon();
+        }
+        super.tearDown();
+    }
+
+    public void testSilentInstallUninstall() throws Exception {
+        // check that app is not already installed
+        assertFalse(isPackageInstalled(TEST_APP_PKG));
+
+        // install the app
+        installPackage(TEST_APP_LOCATION);
+        synchronized (mPackageInstallerTimeoutLock) {
+            try {
+                mPackageInstallerTimeoutLock.wait(PACKAGE_INSTALLER_TIMEOUT_MS);
+            } catch (InterruptedException e) {
+            }
+            assertTrue(mCallbackReceived);
+        }
+        assertTrue(isPackageInstalled(TEST_APP_PKG));
+
+        // uninstall the app again
+        synchronized (mPackageInstallerTimeoutLock) {
+            mCallbackReceived = false;
+            mPackageInstaller.uninstall(TEST_APP_PKG, getCommitCallback(0));
+            try {
+                mPackageInstallerTimeoutLock.wait(PACKAGE_INSTALLER_TIMEOUT_MS);
+            } catch (InterruptedException e) {
+            }
+            assertTrue(mCallbackReceived);
+        }
+        assertFalse(isPackageInstalled(TEST_APP_PKG));
+    }
+
+    private void installPackage(String packageLocation) throws Exception {
+        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
+                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
+        int sessionId = mPackageInstaller.createSession(params);
+        mSession = mPackageInstaller.openSession(sessionId);
+
+        File file = new File(packageLocation);
+        InputStream in = new FileInputStream(file);
+        OutputStream out = mSession.openWrite("SilentPackageInstallerTest", 0, file.length());
+        byte[] buffer = new byte[65536];
+        int c;
+        while ((c = in.read(buffer)) != -1) {
+            out.write(buffer, 0, c);
+        }
+        mSession.fsync(out);
+        out.close();
+        mSession.commit(getCommitCallback(sessionId));
+        mSession.close();
+    }
+
+    private IntentSender getCommitCallback(int sessionId) {
+        // Create an intent-filter and register the receiver
+        String action = ACTION_INSTALL_COMMIT + "." + sessionId;
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(action);
+        mContext.registerReceiver(mBroadcastReceiver, intentFilter);
+
+        // Create a PendingIntent and use it to generate the IntentSender
+        Intent broadcastIntent = new Intent(action);
+        PendingIntent pendingIntent = PendingIntent.getBroadcast(
+                mContext,
+                sessionId,
+                broadcastIntent,
+                PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+        return pendingIntent.getIntentSender();
+    }
+
+    private boolean isPackageInstalled(String packageName) {
+        try {
+            PackageInfo pi = mPackageManager.getPackageInfo(packageName, 0);
+            return pi != null;
+        } catch (PackageManager.NameNotFoundException e) {
+            return false;
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/AndroidManifest.xml b/hostsidetests/devicepolicy/app/IntentReceiver/AndroidManifest.xml
index 5bbdf76..36ac7a7 100644
--- a/hostsidetests/devicepolicy/app/IntentReceiver/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/AndroidManifest.xml
@@ -28,6 +28,7 @@
                 <action android:name="com.android.cts.action.READ_FROM_URI" />
                 <action android:name="com.android.cts.action.TAKE_PERSISTABLE_URI_PERMISSION" />
                 <action android:name="com.android.cts.action.WRITE_TO_URI" />
+                <action android:name="com.android.cts.action.TEST_LOCK_TASK" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/IntentReceiverActivity.java b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/IntentReceiverActivity.java
index 294c678..9aa948e 100644
--- a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/IntentReceiverActivity.java
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/IntentReceiverActivity.java
@@ -49,6 +49,11 @@
     private static final String ACTION_WRITE_TO_URI =
             "com.android.cts.action.WRITE_TO_URI";
 
+    private static final String ACTION_JUST_CREATE =
+            "com.android.cts.action.JUST_CREATE";
+
+    public static final String RECEIVING_ACTIVITY_CREATED_ACTION
+            = "com.android.cts.deviceowner.RECEIVING_ACTIVITY_CREATED_ACTION";
 
     private static final String EXTRA_CAUGHT_SECURITY_EXCEPTION = "extra_caught_security_exception";
 
@@ -98,6 +103,8 @@
                 Log.i(TAG, "Caught a IOException while trying to write to " + uri, e);
             }
             setResult(Activity.RESULT_OK, result);
+        } else if (ACTION_JUST_CREATE.equals(action)) {
+            sendBroadcast(new Intent(RECEIVING_ACTIVITY_CREATED_ACTION));
         }
         finish();
     }
diff --git a/hostsidetests/devicepolicy/app/IntentSender/Android.mk b/hostsidetests/devicepolicy/app/IntentSender/Android.mk
index e45ec31..21d2866 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/Android.mk
+++ b/hostsidetests/devicepolicy/app/IntentSender/Android.mk
@@ -24,9 +24,7 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+LOCAL_JAVA_LIBRARIES := android.test.runner android-support-v4
 
 LOCAL_SDK_VERSION := current
 
diff --git a/hostsidetests/devicepolicy/app/IntentSender/AndroidManifest.xml b/hostsidetests/devicepolicy/app/IntentSender/AndroidManifest.xml
index 070ef40..cc27298 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/IntentSender/AndroidManifest.xml
@@ -52,7 +52,7 @@
     </application>
 
     <instrumentation
-        android:name="android.test.InstrumentationTestRunner"
+        android:name="android.support.test.runner.AndroidJUnitRunner"
         android:targetPackage="com.android.cts.intent.sender"
         android:label="Intent Sender CTS Tests" />
 
diff --git a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/CopyPasteTest.java b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/CopyPasteTest.java
index a5d83db..46fc0c4 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/CopyPasteTest.java
+++ b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/CopyPasteTest.java
@@ -44,7 +44,7 @@
         super.setUp();
         Context context = getInstrumentation().getTargetContext();
         mActivity = launchActivity(context.getPackageName(), IntentSenderActivity.class, null);
-        mClipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+        mClipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
     }
 
     @Override
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk b/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
index 46e3cf7..b74a7b6 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
@@ -24,9 +24,9 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-LOCAL_JAVA_LIBRARIES := android.test.runner cts-junit
+LOCAL_JAVA_LIBRARIES := android.test.runner cts-junit android-support-v4
 
-LOCAL_STATIC_JAVA_LIBRARIES = android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
 
 LOCAL_SDK_VERSION := current
 
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
index e430785..82f6d6d 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
@@ -34,6 +34,15 @@
                 <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
             </intent-filter>
         </receiver>
+        <receiver
+            android:name="com.android.cts.managedprofile.PrimaryUserDeviceAdmin"
+            android:permission="android.permission.BIND_DEVICE_ADMIN">
+            <meta-data android:name="android.app.device_admin"
+                       android:resource="@xml/primary_device_admin" />
+            <intent-filter>
+                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
+            </intent-filter>
+        </receiver>
         <activity android:name=".PrimaryUserFilterSetterActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -75,7 +84,7 @@
         <activity android:name=".TestActivity" />
     </application>
 
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.cts.managedprofile"
                      android:label="Managed Profile CTS Tests"/>
 </manifest>
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/primary_device_admin.xml b/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/primary_device_admin.xml
new file mode 100644
index 0000000..a6aff49
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/primary_device_admin.xml
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:visible="false">
+    <uses-policies>
+         <reset-password />
+         <limit-password />
+    </uses-policies>
+</device-admin>
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
index faee6dc..77ecfe1 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
@@ -28,13 +28,16 @@
 import android.os.Build;
 import android.os.RemoteException;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.PhoneLookup;
 import android.provider.ContactsContract.RawContacts;
 import android.test.AndroidTestCase;
 
 import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -44,15 +47,30 @@
 
     private static final String TEST_ACCOUNT_NAME = "CTS";
     private static final String TEST_ACCOUNT_TYPE = "com.android.cts.test";
+    // details of a sample primary contact
     private static final String PRIMARY_CONTACT_DISPLAY_NAME = "Primary";
     private static final String PRIMARY_CONTACT_PHONE = "00000001";
+    private static final String PRIMARY_CONTACT_EMAIL = "one@primary.com";
+    private static final String PRIMARY_CONTACT_SIP = "foo@sip";
+
+    // details of a sample managed contact
     private static final String MANAGED_CONTACT_DISPLAY_NAME = "Managed";
     private static final String MANAGED_CONTACT_PHONE = "6891999";
+    private static final String MANAGED_CONTACT_EMAIL = "one@managed.com";
+    private static final String MANAGED_CONTACT_SIP = "bar@sip";
+
+    // details of a sample primary and a sample managed contact, with the same phone & email
+    private static final String PRIMARY_CONTACT_DISPLAY_NAME_2 = "PrimaryShared";
+    private static final String MANAGED_CONTACT_DISPLAY_NAME_2 = "ManagedShared";
+    private static final String SHARED_CONTACT_PHONE = "00000002";
+    private static final String SHARED_CONTACT_EMAIL = "shared@shared.com";
+    private static final String SHARED_CONTACT_SIP = "baz@sip";
 
     private DevicePolicyManager mDevicePolicyManager;
     private ContentResolver mResolver;
 
-    private static class ContactInfo {
+    private class ContactInfo { // Not static to access outer world.
+
         String contactId;
         String displayName;
         String photoUri;
@@ -68,8 +86,14 @@
             this.photoId = photoId;
         }
 
-        private boolean hasPhotoUri() {
-            return photoUri != null && photoThumbnailUri != null;
+        private void assertNoPhotoUri() {
+            assertNull(photoUri);
+            assertNull(photoThumbnailUri);
+        }
+
+        private void assertPhotoUrisReadable() throws IOException {
+            assertPhotoUriReadable(photoUri);
+            assertPhotoUriReadable(photoThumbnailUri);
         }
 
         private boolean hasPhotoId() {
@@ -85,72 +109,254 @@
                 .getSystemService(Context.DEVICE_POLICY_SERVICE);
     }
 
-    public void testPrimaryProfilePhoneLookup_insertedAndfound() throws RemoteException,
+    public void testPrimaryProfilePhoneAndEmailLookup_insertedAndfound() throws RemoteException,
             OperationApplicationException, NotFoundException, IOException {
         assertFalse(isManagedProfile());
         // Do not insert to primary contact
-        insertContact(PRIMARY_CONTACT_DISPLAY_NAME, PRIMARY_CONTACT_PHONE, 0);
+        insertContact(PRIMARY_CONTACT_DISPLAY_NAME, PRIMARY_CONTACT_PHONE,
+                PRIMARY_CONTACT_EMAIL, PRIMARY_CONTACT_SIP, 0);
 
         ContactInfo contactInfo = getContactInfo(PRIMARY_CONTACT_PHONE);
         assertNotNull(contactInfo);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
+        contactInfo = getContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
+        assertNotNull(contactInfo);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
     }
 
-    public void testManagedProfilePhoneLookup_insertedAndfound() throws RemoteException,
+    public void testManagedProfilePhoneAndEmailLookup_insertedAndfound() throws RemoteException,
             OperationApplicationException, NotFoundException, IOException {
         assertTrue(isManagedProfile());
         // Insert ic_contact_picture as photo in managed contact
-        insertContact(MANAGED_CONTACT_DISPLAY_NAME, MANAGED_CONTACT_PHONE,
+        insertContact(MANAGED_CONTACT_DISPLAY_NAME,
+                MANAGED_CONTACT_PHONE,
+                MANAGED_CONTACT_EMAIL,
+                MANAGED_CONTACT_SIP,
                 com.android.cts.managedprofile.R.raw.ic_contact_picture);
 
         ContactInfo contactInfo = getContactInfo(MANAGED_CONTACT_PHONE);
         assertNotNull(contactInfo);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
+        contactInfo = getContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertNotNull(contactInfo);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testPrimaryProfileEnterprisePhoneLookup_canAccessEnterpriseContact() {
+    public void testPrimaryProfileDuplicatedPhoneEmailContact_insertedAndfound() throws
+            RemoteException, OperationApplicationException, NotFoundException, IOException {
+        assertFalse(isManagedProfile());
+        insertContact(PRIMARY_CONTACT_DISPLAY_NAME_2,
+                SHARED_CONTACT_PHONE,
+                SHARED_CONTACT_EMAIL,
+                SHARED_CONTACT_SIP,
+                com.android.cts.managedprofile.R.raw.ic_contact_picture);
+
+        ContactInfo contactInfo = getContactInfo(SHARED_CONTACT_PHONE);
+        assertNotNull(contactInfo);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
+        contactInfo = getContactInfoFromEmail(SHARED_CONTACT_EMAIL);
+        assertNotNull(contactInfo);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileDuplicatedPhoneEmailContact_insertedAndfound() throws
+            RemoteException, OperationApplicationException, NotFoundException, IOException {
+        assertTrue(isManagedProfile());
+        insertContact(MANAGED_CONTACT_DISPLAY_NAME_2, SHARED_CONTACT_PHONE,
+                SHARED_CONTACT_EMAIL, SHARED_CONTACT_SIP , 0);
+
+        ContactInfo contactInfo = getContactInfo(SHARED_CONTACT_PHONE);
+        assertNotNull(contactInfo);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
+        contactInfo = getContactInfoFromEmail(SHARED_CONTACT_EMAIL);
+        assertNotNull(contactInfo);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterprisePhoneLookup_canAccessEnterpriseContact()
+            throws IOException {
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         // Cannot get photo id in ENTERPRISE_CONTENT_FILTER_URI
         assertFalse(contactInfo.hasPhotoId());
         assertTrue(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testPrimaryProfilePhoneLookup_canAccessPrimaryContact() {
+    public void testPrimaryProfileEnterpriseSipLookup_canAccessEnterpriseContact()
+            throws IOException {
         assertFalse(isManagedProfile());
-        ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
-        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromSipAddress(MANAGED_CONTACT_SIP);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertFalse(contactInfo.hasPhotoId());
+
+        // Quirk: the _id column from the SIP lookup is actually of the data id, not the contact id.
+        // assertTrue(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookup_canAccessEnterpriseContact()
+            throws IOException {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        // Cannot get photo id in ENTERPRISE_CONTENT_FILTER_URI
+        assertFalse(contactInfo.hasPhotoId());
+        assertTrue(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact()
+            throws IOException {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(SHARED_CONTACT_PHONE);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookupDuplicated_canAccessPrimaryContact()
+            throws IOException {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(SHARED_CONTACT_EMAIL);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileEnterprisePhoneLookupDuplicated_canAccessEnterpriseContact() {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(SHARED_CONTACT_PHONE);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testManagedProfilePhoneLookup_canAccessEnterpriseContact() {
+    public void testManagedProfileEnterpriseEmailLookupDuplicated_canAccessEnterpriseContact() {
         assertTrue(isManagedProfile());
-        ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
-        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
-        assertTrue(contactInfo.hasPhotoId());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(SHARED_CONTACT_EMAIL);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
     public void testPrimaryProfilePhoneLookup_canNotAccessEnterpriseContact() {
         assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getContactInfo(MANAGED_CONTACT_PHONE);
+        assertNull(contactInfo);
+    }
+
+    public void testPrimaryProfileEmailLookup_canNotAccessEnterpriseContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertNull(contactInfo);
+    }
+
+    public void testPrimaryProfileEnterprisePhoneLookup_canAccessPrimaryContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookup_canAccessPrimaryContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileEnterprisePhoneLookup_canAccessEnterpriseContact()
+            throws IOException {
+        assertTrue(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileEnterpriseEmailLookup_canAccessEnterpriseContact()
+            throws IOException {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileEnterprisePhoneLookup_canNotAccessPrimaryContact() {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
+        assertNull(contactInfo);
+    }
+
+    public void testManagedProfileEnterpriseEmailLookup_canNotAccessPrimaryContact() {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
         assertNull(contactInfo);
     }
 
     public void testManagedProfilePhoneLookup_canNotAccessPrimaryContact() {
         assertTrue(isManagedProfile());
-        ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
+        ContactInfo contactInfo = getContactInfo(PRIMARY_CONTACT_PHONE);
+        assertNull(contactInfo);
+    }
+
+    public void testManagedProfileEmailLookup_canNotAccessPrimaryContact() {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
+        assertNull(contactInfo);
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookup_canNotAccessEnterpriseContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertNull(contactInfo);
+    }
+
+    public void testPrimaryProfileEnterprisePhoneLookup_canNotAccessEnterpriseContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
         assertNull(contactInfo);
     }
 
@@ -170,14 +376,25 @@
         removeAllTestContactsInProfile();
     }
 
+    public void testSetBluetoothContactSharingDisabled_setterAndGetter() {
+        mDevicePolicyManager.setBluetoothContactSharingDisabled(
+                BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, false);
+        assertFalse(mDevicePolicyManager.getBluetoothContactSharingDisabled(
+                BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT));
+        mDevicePolicyManager.setBluetoothContactSharingDisabled(
+                BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, true);
+        assertTrue(mDevicePolicyManager.getBluetoothContactSharingDisabled(
+                BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT));
+    }
+
     private boolean isManagedProfile() {
         String adminPackage = BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT.getPackageName();
         return mDevicePolicyManager.isProfileOwnerApp(adminPackage);
     }
 
-    private void insertContact(String displayName, String phoneNumber, int photoResId)
-            throws RemoteException,
-            OperationApplicationException, NotFoundException, IOException {
+    private void insertContact(String displayName, String phoneNumber, String email,
+            String sipAddress, int photoResId)
+            throws RemoteException, OperationApplicationException, NotFoundException, IOException {
         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
         ops.add(ContentProviderOperation
                 .newInsert(ContactsContract.RawContacts.CONTENT_URI)
@@ -205,25 +422,61 @@
                 .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
                         Phone.TYPE_MOBILE)
                 .build());
+        ops.add(ContentProviderOperation
+                .newInsert(ContactsContract.Data.CONTENT_URI)
+                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                .withValue(
+                        ContactsContract.Data.MIMETYPE,
+                        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
+                .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS,
+                        email)
+                .withValue(ContactsContract.CommonDataKinds.Email.TYPE,
+                        Email.TYPE_WORK)
+                .build());
+        ops.add(ContentProviderOperation
+                .newInsert(ContactsContract.Data.CONTENT_URI)
+                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                .withValue(
+                        ContactsContract.Data.MIMETYPE,
+                        ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE)
+                .withValue(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS,
+                        sipAddress)
+                .withValue(ContactsContract.CommonDataKinds.SipAddress.TYPE,
+                        ContactsContract.CommonDataKinds.SipAddress.TYPE_WORK)
+                .build());
+
         if (photoResId != 0) {
             InputStream phoneInputStream = mContext.getResources().openRawResource(photoResId);
-            byte[] rawPhoto = getByteFromStream(phoneInputStream);
-            ops.add(ContentProviderOperation
-                    .newInsert(ContactsContract.Data.CONTENT_URI)
-                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
-                    .withValue(
-                            ContactsContract.Data.MIMETYPE,
-                            ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
-                    .withValue(Photo.PHOTO, rawPhoto)
-                    .build());
+            try {
+                byte[] rawPhoto = getByteFromStream(phoneInputStream);
+                ops.add(ContentProviderOperation
+                        .newInsert(ContactsContract.Data.CONTENT_URI)
+                        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                        .withValue(
+                                ContactsContract.Data.MIMETYPE,
+                                ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
+                        .withValue(Photo.PHOTO, rawPhoto)
+                        .build());
+            } finally {
+                phoneInputStream.close();
+            }
         }
 
         mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
     }
 
     private ContactInfo getContactInfoFromUri(Uri phoneLookupUri, String phoneNumber) {
-        Uri uri = Uri.withAppendedPath(phoneLookupUri,
-                Uri.encode(phoneNumber));
+        return getContactInfoFromPhoneLookup(Uri.withAppendedPath(phoneLookupUri,
+                        Uri.encode(phoneNumber)), /* forSip =*/ false);
+    }
+
+    private ContactInfo getContactInfoFromSipUri(Uri phoneLookupUri, String sipAddress) {
+        return getContactInfoFromPhoneLookup(
+                phoneLookupUri.buildUpon().appendEncodedPath(sipAddress).appendQueryParameter(
+                        PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1").build(), /* forSip =*/ true);
+    }
+
+    private ContactInfo getContactInfoFromPhoneLookup(Uri uri, boolean isForSip) {
         Cursor cursor = mResolver.query(uri,
                 new String[] {
                         PhoneLookup._ID, PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_URI,
@@ -245,17 +498,61 @@
         return result;
     }
 
+    private ContactInfo getContactInfoFromEmailUri(Uri emailLookupUri, String email) {
+        Uri uri = Uri.withAppendedPath(emailLookupUri, Uri.encode(email));
+        Cursor cursor = mResolver.query(uri,
+                new String[] {
+                        Email.CONTACT_ID,
+                        Email.DISPLAY_NAME_PRIMARY,
+                        Email.PHOTO_URI,
+                        Email.PHOTO_ID,
+                        Email.PHOTO_THUMBNAIL_URI,
+                }, null, null, null);
+        if (cursor == null) {
+            return null;
+        }
+        ContactInfo result = null;
+        if (cursor.moveToFirst()) {
+            result = new ContactInfo(
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.CONTACT_ID)),
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.DISPLAY_NAME_PRIMARY)),
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.PHOTO_URI)),
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.PHOTO_THUMBNAIL_URI)),
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.PHOTO_ID)));
+        }
+        cursor.close();
+        return result;
+    }
+
     private ContactInfo getContactInfo(String phoneNumber) {
         return getContactInfoFromUri(PhoneLookup.CONTENT_FILTER_URI,
                 phoneNumber);
     }
 
+    private ContactInfo getContactInfoFromEmail(String email) {
+        return getContactInfoFromEmailUri(Email.CONTENT_LOOKUP_URI, email);
+    }
+
     private ContactInfo getEnterpriseContactInfo(String phoneNumber) {
         return getContactInfoFromUri(
                 PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
                 phoneNumber);
     }
 
+    private ContactInfo getEnterpriseContactInfoFromSipAddress(String phoneNumber) {
+        return getContactInfoFromSipUri(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
+                phoneNumber);
+    }
+
+    private ContactInfo getEnterpriseContactInfoFromEmail(String email) {
+        return getContactInfoFromEmailUri(Email.ENTERPRISE_CONTENT_LOOKUP_URI, email);
+    }
+
     private void removeAllTestContactsInProfile() {
         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
         ops.add(ContentProviderOperation.newDelete(RawContacts.CONTENT_URI)
@@ -282,4 +579,18 @@
     private boolean isEnterpriseContactId(String contactId) {
         return ContactsContract.Contacts.isEnterpriseContactId(Long.valueOf(contactId));
     }
+
+    private void assertPhotoUriReadable(String uri) throws IOException {
+        assertNotNull(uri);
+        final InputStream is = mResolver.openInputStream(Uri.parse(uri));
+        try {
+            // Make sure it's readabe.  Don't have to read all content.
+            is.read();
+        } finally {
+            try {
+                is.close();
+            } catch (IOException ignore) {
+            }
+        }
+    }
 }
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileUtils.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileUtils.java
index 49001e9..21b2d36 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileUtils.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileUtils.java
@@ -40,8 +40,8 @@
 
     private static String ACTION_COPY_TO_CLIPBOARD = "com.android.cts.action.COPY_TO_CLIPBOARD";
 
-    public void addParentCanAccessManagedFilters() {
-        removeAllFilters();
+    public void testAddParentCanAccessManagedFilters() {
+        testRemoveAllFilters();
 
         final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
@@ -49,8 +49,8 @@
                 DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED);
     }
 
-    public void addManagedCanAccessParentFilters() {
-        removeAllFilters();
+    public void testAddManagedCanAccessParentFilters() {
+        testRemoveAllFilters();
 
         final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
@@ -67,20 +67,20 @@
         return intentFilter;
     }
 
-    public void removeAllFilters() {
+    public void testRemoveAllFilters() {
         final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
         dpm.clearCrossProfileIntentFilters(ADMIN_RECEIVER_COMPONENT);
     }
 
-    public void disallowCrossProfileCopyPaste() {
+    public void testDisallowCrossProfileCopyPaste() {
         DevicePolicyManager dpm = (DevicePolicyManager)
                getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
         dpm.addUserRestriction(ADMIN_RECEIVER_COMPONENT,
                 UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE);
     }
 
-    public void allowCrossProfileCopyPaste() {
+    public void testAllowCrossProfileCopyPaste() {
         DevicePolicyManager dpm = (DevicePolicyManager)
                getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
         dpm.clearUserRestriction(ADMIN_RECEIVER_COMPONENT,
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DelegatedCertInstallerTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DelegatedCertInstallerTest.java
new file mode 100644
index 0000000..de859b4
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DelegatedCertInstallerTest.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.managedprofile;
+
+import android.app.KeyguardManager;
+import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.security.KeyChain;
+import android.security.KeyChainException;
+import android.test.AndroidTestCase;
+import android.util.Base64;
+import android.util.Base64InputStream;
+
+import java.io.ByteArrayInputStream;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import static com.android.cts.managedprofile.BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT;
+
+/**
+ * Exercise delegated cert installer APIs in {@link DevicePolicyManager} by setting the test app
+ * (CtsCertInstallerApp) as a delegated cert installer and then asking it to invoke various
+ * cert-related APIs. The expected certificate changes are validated both remotely and locally.
+ */
+public class DelegatedCertInstallerTest extends AndroidTestCase {
+
+    private static final String CERT_INSTALLER_PACKAGE = "com.android.cts.certinstaller";
+
+    private static final String ACTION_INSTALL_CERT = "com.android.cts.certinstaller.install_cert";
+    private static final String ACTION_REMOVE_CERT = "com.android.cts.certinstaller.remove_cert";
+    private static final String ACTION_VERIFY_CERT = "com.android.cts.certinstaller.verify_cert";
+    private static final String ACTION_INSTALL_KEYPAIR =
+            "com.android.cts.certinstaller.install_keypair";
+    private static final String ACTION_CERT_OPERATION_DONE = "com.android.cts.certinstaller.done";
+
+    private static final String EXTRA_CERT_DATA = "extra_cert_data";
+    private static final String EXTRA_KEY_DATA = "extra_key_data";
+    private static final String EXTRA_KEY_ALIAS = "extra_key_alias";
+    private static final String EXTRA_RESULT_VALUE = "extra_result_value";
+    private static final String EXTRA_RESULT_EXCEPTION = "extra_result_exception";
+
+    /*
+     * The CA and keypair below are generated with:
+     *
+     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
+     * openssl req -newkey rsa:1024 -keyout userkey.pem -nodes -days 3650 -out userkey.req
+     * mkdir -p demoCA/newcerts
+     * touch demoCA/index.txt
+     * echo "01" > demoCA/serial
+     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
+     */
+
+     // Content from cacert.pem
+    private static final String TEST_CA =
+            "-----BEGIN CERTIFICATE-----\n" +
+            "MIIDXTCCAkWgAwIBAgIJAK9Tl/F9V8kSMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV\n" +
+            "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n" +
+            "aWRnaXRzIFB0eSBMdGQwHhcNMTUwMzA2MTczMjExWhcNMjUwMzAzMTczMjExWjBF\n" +
+            "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\n" +
+            "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n" +
+            "CgKCAQEAvItOutsE75WBTgTyNAHt4JXQ3JoseaGqcC3WQij6vhrleWi5KJ0jh1/M\n" +
+            "Rpry7Fajtwwb4t8VZa0NuM2h2YALv52w1xivql88zce/HU1y7XzbXhxis9o6SCI+\n" +
+            "oVQSbPeXRgBPppFzBEh3ZqYTVhAqw451XhwdA4Aqs3wts7ddjwlUzyMdU44osCUg\n" +
+            "kVg7lfPf9sTm5IoHVcfLSCWH5n6Nr9sH3o2ksyTwxuOAvsN11F/a0mmUoPciYPp+\n" +
+            "q7DzQzdi7akRG601DZ4YVOwo6UITGvDyuAAdxl5isovUXqe6Jmz2/myTSpAKxGFs\n" +
+            "jk9oRoG6WXWB1kni490GIPjJ1OceyQIDAQABo1AwTjAdBgNVHQ4EFgQUH1QIlPKL\n" +
+            "p2OQ/AoLOjKvBW4zK3AwHwYDVR0jBBgwFoAUH1QIlPKLp2OQ/AoLOjKvBW4zK3Aw\n" +
+            "DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAcMi4voMMJHeQLjtq8Oky\n" +
+            "Azpyk8moDwgCd4llcGj7izOkIIFqq/lyqKdtykVKUWz2bSHO5cLrtaOCiBWVlaCV\n" +
+            "DYAnnVLM8aqaA6hJDIfaGs4zmwz0dY8hVMFCuCBiLWuPfiYtbEmjHGSmpQTG6Qxn\n" +
+            "ZJlaK5CZyt5pgh5EdNdvQmDEbKGmu0wpCq9qjZImwdyAul1t/B0DrsWApZMgZpeI\n" +
+            "d2od0VBrCICB1K4p+C51D93xyQiva7xQcCne+TAnGNy9+gjQ/MyR8MRpwRLv5ikD\n" +
+            "u0anJCN8pXo6IMglfMAsoton1J6o5/ae5uhC6caQU8bNUsCK570gpNfjkzo6rbP0\n" +
+            "wQ==\n" +
+            "-----END CERTIFICATE-----";
+    // Content from userkey.pem without the private key header and footer.
+    private static final String TEST_KEY =
+            "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALCYprGsTU+5L3KM\n" +
+            "fhkm0gXM2xjGUH+543YLiMPGVr3eVS7biue1/tQlL+fJsw3rqsPKJe71RbVWlpqU\n" +
+            "mhegxG4s3IvGYVB0KZoRIjDKmnnvlx6nngL2ZJ8O27U42pHsw4z4MKlcQlWkjL3T\n" +
+            "9sV6zW2Wzri+f5mvzKjhnArbLktHAgMBAAECgYBlfVVPhtZnmuXJzzQpAEZzTugb\n" +
+            "tN1OimZO0RIocTQoqj4KT+HkiJOLGFQPwbtFpMre+q4SRqNpM/oZnI1yRtKcCmIc\n" +
+            "mZgkwJ2k6pdSxqO0ofxFFTdT9czJ3rCnqBHy1g6BqUQFXT4olcygkxUpKYUwzlz1\n" +
+            "oAl487CoPxyr4sVEAQJBANwiUOHcdGd2RoRILDzw5WOXWBoWPOKzX/K9wt0yL+mO\n" +
+            "wlFNFSymqo9eLheHcEq/VD9qK9rT700dCewJfWj6+bECQQDNXmWNYIxGii5NJilT\n" +
+            "OBOHiMD/F0NE178j+/kmacbhDJwpkbLYXaP8rW4+Iswrm4ORJ59lvjNuXaZ28+sx\n" +
+            "fFp3AkA6Z7Bl/IO135+eATgbgx6ZadIqObQ1wbm3Qbmtzl7/7KyJvZXcnuup1icM\n" +
+            "fxa//jtwB89S4+Ad6ZJ0WaA4dj5BAkEAuG7V9KmIULE388EZy8rIfyepa22Q0/qN\n" +
+            "hdt8XasRGHsio5Jdc0JlSz7ViqflhCQde/aBh/XQaoVgQeO8jKyI8QJBAJHekZDj\n" +
+            "WA0w1RsBVVReN1dVXgjm1CykeAT8Qx8TUmBUfiDX6w6+eGQjKtS7f4KC2IdRTV6+\n" +
+            "bDzDoHBChHNC9ms=\n";
+
+    // Content from usercert.pem without the header and footer.
+    private static final String TEST_CERT =
+            "MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJBVTET\n" +
+            "MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ\n" +
+            "dHkgTHRkMB4XDTE1MDUwMTE2NTQwNVoXDTI1MDQyODE2NTQwNVowWzELMAkGA1UE\n" +
+            "BhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdp\n" +
+            "ZGdpdHMgUHR5IEx0ZDEUMBIGA1UEAwwLY2xpZW50IGNlcnQwgZ8wDQYJKoZIhvcN\n" +
+            "AQEBBQADgY0AMIGJAoGBALCYprGsTU+5L3KMfhkm0gXM2xjGUH+543YLiMPGVr3e\n" +
+            "VS7biue1/tQlL+fJsw3rqsPKJe71RbVWlpqUmhegxG4s3IvGYVB0KZoRIjDKmnnv\n" +
+            "lx6nngL2ZJ8O27U42pHsw4z4MKlcQlWkjL3T9sV6zW2Wzri+f5mvzKjhnArbLktH\n" +
+            "AgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2Vu\n" +
+            "ZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQ8GL+jKSarvTn9fVNA2AzjY7qq\n" +
+            "gjAfBgNVHSMEGDAWgBRzBBA5sNWyT/fK8GrhN3tOqO5tgjANBgkqhkiG9w0BAQsF\n" +
+            "AAOCAQEAgwQEd2bktIDZZi/UOwU1jJUgGq7NiuBDPHcqgzjxhGFLQ8SQAAP3v3PR\n" +
+            "mLzcfxsxnzGynqN5iHQT4rYXxxaqrp1iIdj9xl9Wl5FxjZgXITxhlRscOd/UOBvG\n" +
+            "oMrazVczjjdoRIFFnjtU3Jf0Mich68HD1Z0S3o7X6sDYh6FTVR5KbLcxbk6RcoG4\n" +
+            "VCI5boR5LUXgb5Ed5UxczxvN12S71fyxHYVpuuI0z0HTIbAxKeRw43I6HWOmR1/0\n" +
+            "G6byGCNL/1Fz7Y+264fGqABSNTKdZwIU2K4ANEH7F+9scnhoO6OBp+gjBe5O+7jb\n" +
+            "wZmUCAoTka4hmoaOCj7cqt/IkmxozQ==\n";
+
+    private DevicePolicyManager mDpm;
+    private volatile boolean mReceivedResult;
+    private volatile Exception mReceivedException;
+    private Semaphore mAvailableResultSemaphore;
+
+    private final BroadcastReceiver receiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (ACTION_CERT_OPERATION_DONE.equals(intent.getAction())) {
+                synchronized (DelegatedCertInstallerTest.this) {
+                    mReceivedResult = intent.getBooleanExtra(EXTRA_RESULT_VALUE, false);
+                    mReceivedException =
+                            (Exception) intent.getSerializableExtra(EXTRA_RESULT_EXCEPTION);
+                    mAvailableResultSemaphore.release();
+                }
+            }
+        }
+    };
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mDpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mAvailableResultSemaphore = new Semaphore(0);
+        mReceivedResult = false;
+        mReceivedException = null;
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ACTION_CERT_OPERATION_DONE);
+        getContext().registerReceiver(receiver, filter);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        getContext().unregisterReceiver(receiver);
+        mDpm.uninstallCaCert(ADMIN_RECEIVER_COMPONENT, TEST_CA.getBytes());
+        // Installed private key pair will be removed once the lockscreen password is cleared,
+        // which is done in the hostside test.
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, null);
+        super.tearDown();
+    }
+
+    public void testCaCertsOperations() throws InterruptedException {
+        byte[] cert = TEST_CA.getBytes();
+
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, CERT_INSTALLER_PACKAGE);
+        assertEquals(CERT_INSTALLER_PACKAGE,
+                mDpm.getCertInstallerPackage(ADMIN_RECEIVER_COMPONENT));
+
+        // Exercise installCaCert()
+        installCaCert(cert);
+        assertResult("installCaCert", true);
+        assertTrue("Certificate is not installed properly", mDpm.hasCaCertInstalled(
+                ADMIN_RECEIVER_COMPONENT, cert));
+
+        // Exercise getInstalledCaCerts()
+        verifyCaCert(cert);
+        assertResult("getInstalledCaCerts()", true);
+
+        // Exercise uninstallCaCert()
+        removeCaCert(cert);
+        assertResult("uninstallCaCert()", true);
+        assertFalse("Certificate is not removed properly", mDpm.hasCaCertInstalled(
+                ADMIN_RECEIVER_COMPONENT, cert));
+
+        // Clear delegated cert installer.
+        // Tests after this are expected to fail.
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, null);
+
+        installCaCert(cert);
+        assertResult("installCaCert", false);
+    }
+
+    public void testInstallKeyPair() throws InterruptedException, KeyChainException {
+        final String alias = "delegated-cert-installer-test-key";
+
+        // Clear delegated cert installer.
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, null);
+        // The app is not the cert installer , it shouldn't have have privilege to call
+        // installKeyPair().
+        installKeyPair(TEST_KEY, TEST_CERT, alias);
+        assertResult("installKeyPair", false);
+
+        // Set the app to be cert installer.
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, CERT_INSTALLER_PACKAGE);
+        assertEquals(CERT_INSTALLER_PACKAGE,
+                mDpm.getCertInstallerPackage(ADMIN_RECEIVER_COMPONENT));
+
+        // Exercise installKeyPair()
+        checkKeyguardPrecondition();
+        installKeyPair(TEST_KEY, TEST_CERT, alias);
+        assertResult("installKeyPair", true);
+    }
+
+    /**
+     * installKeyPair() requires the system to have a lockscreen password, which should have been
+     * set by the host side test.
+     */
+    private void checkKeyguardPrecondition() throws InterruptedException {
+        KeyguardManager km = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+        if (!km.isKeyguardSecure()) {
+            Thread.sleep(5000);
+          }
+          assertTrue("A lockscreen password is required before keypair can be installed",
+                          km.isKeyguardSecure());
+    }
+
+    private void installCaCert(byte[] cert) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_INSTALL_CERT);
+        intent.putExtra(EXTRA_CERT_DATA, cert);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+    }
+
+    private void removeCaCert(byte[] cert) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_REMOVE_CERT);
+        intent.putExtra(EXTRA_CERT_DATA, cert);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+    }
+
+    private void verifyCaCert(byte[] cert) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_VERIFY_CERT);
+        intent.putExtra(EXTRA_CERT_DATA, cert);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+    }
+
+    private void assertResult(String testName, Boolean expectSuccess) throws InterruptedException {
+        assertTrue("Cert installer did not respond in time.",
+                mAvailableResultSemaphore.tryAcquire(5, TimeUnit.SECONDS));
+        synchronized (this) {
+            if (expectSuccess) {
+                assertTrue(testName + " failed unexpectedly.", mReceivedResult);
+                assertNull(testName + " raised exception", mReceivedException);
+            } else {
+                assertFalse(testName + " succeeded unexpectedly.", mReceivedResult);
+                assertTrue(testName + " did not raise SecurityException",
+                        mReceivedException != null &&
+                        mReceivedException instanceof SecurityException);
+            }
+        }
+    }
+
+    private void installKeyPair(String key, String cert, String alias) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_INSTALL_KEYPAIR);
+        intent.putExtra(EXTRA_CERT_DATA, cert);
+        intent.putExtra(EXTRA_KEY_DATA, key);
+        intent.putExtra(EXTRA_KEY_ALIAS, alias);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ManagedProfileTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ManagedProfileTest.java
index 47ecfcb..e655d7b 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ManagedProfileTest.java
@@ -21,6 +21,7 @@
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.test.ActivityInstrumentationTestCase2;
+import android.support.test.InstrumentationRegistry;
 
 import static com.android.cts.managedprofile.BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT;
 
@@ -43,6 +44,10 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        // As the way to access Instrumentation is changed in the new runner, we need to inject it
+        // manually into ActivityInstrumentationTestCase2. ActivityInstrumentationTestCase2 will
+        // be marked as deprecated and replaced with ActivityTestRule.
+        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
         mPackageManager = getActivity().getPackageManager();
         mDevicePolicyManager = (DevicePolicyManager)
                 getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserAdminHelper.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserAdminHelper.java
new file mode 100644
index 0000000..5b8af1f
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserAdminHelper.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.managedprofile;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.test.AndroidTestCase;
+
+/**
+ * This test executes helper tasks as active device admin in the primary user. Current tasks are
+ * setting and clearing lockscreen password used by the host side delegated cert installer test.
+ */
+public class PrimaryUserAdminHelper extends AndroidTestCase {
+
+    private DevicePolicyManager mDpm;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+    }
+
+    /**
+     * Device admin can only be deactivated by itself and this test should be executed before the
+     * device admin package can be uninstalled.
+     */
+    public void testClearDeviceAdmin() {
+        try {
+            removeActiveAdmin(mDpm, PrimaryUserDeviceAdmin.ADMIN_RECEIVER_COMPONENT);
+        } catch (InterruptedException e) {
+            fail("Removal of device admin interrupted.");
+        }
+        assertFalse(mDpm.isAdminActive(PrimaryUserDeviceAdmin.ADMIN_RECEIVER_COMPONENT));
+    }
+
+    /**
+     * Set lockscreen password.
+     */
+    public void testSetPassword() {
+        // Enable credential storage by setting a nonempty password.
+        assertTrue(mDpm.resetPassword("test", 0));
+    }
+
+    /**
+     * Clear lockscreen password.
+     */
+    public void testClearPassword() {
+        mDpm.setPasswordQuality(PrimaryUserDeviceAdmin.ADMIN_RECEIVER_COMPONENT,
+                DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
+        mDpm.setPasswordMinimumLength(
+                PrimaryUserDeviceAdmin.ADMIN_RECEIVER_COMPONENT, 0);
+        assertTrue(mDpm.resetPassword("", 0));
+    }
+
+    private void removeActiveAdmin(DevicePolicyManager dpm, ComponentName cn)
+            throws InterruptedException {
+        if (mDpm.isAdminActive(cn)) {
+            mDpm.removeActiveAdmin(cn);
+            // Wait until device admin is not active.
+            for (int i = 0; i < 1000 && dpm.isAdminActive(cn); i++) {
+                Thread.sleep(100);
+            }
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserDeviceAdmin.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserDeviceAdmin.java
new file mode 100644
index 0000000..8662daf
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserDeviceAdmin.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.managedprofile;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.ComponentName;
+
+/**
+ * A device admin class running in the primary user. Currently used by delegated cert installer
+ * test to set a lockscreen password which is prerequisite of installKeyPair().
+ */
+public class PrimaryUserDeviceAdmin extends DeviceAdminReceiver {
+    public static final ComponentName ADMIN_RECEIVER_COMPONENT = new ComponentName(
+            PrimaryUserDeviceAdmin.class.getPackage().getName(),
+            PrimaryUserDeviceAdmin.class.getName());
+}
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserTest.java
index 40ff6c5..4163ba8 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserTest.java
@@ -20,6 +20,7 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.test.ActivityInstrumentationTestCase2;
+import android.support.test.InstrumentationRegistry;
 
 /**
  * Test for {@link DevicePolicyManager#addCrossProfileIntentFilter} API, for
@@ -43,6 +44,10 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        // As the way to access Instrumentation is changed in the new runner, we need to inject it
+        // manually into ActivityInstrumentationTestCase2. ActivityInstrumentationTestCase2 will
+        // be marked as deprecated and replaced with ActivityTestRule.
+        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
         mPackageManager = getActivity().getPackageManager();
     }
 
diff --git a/hostsidetests/devicepolicy/app/SimpleApp/AndroidManifest.xml b/hostsidetests/devicepolicy/app/SimpleApp/AndroidManifest.xml
index 848317c..af74f57 100644
--- a/hostsidetests/devicepolicy/app/SimpleApp/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/SimpleApp/AndroidManifest.xml
@@ -31,6 +31,18 @@
         <activity android:name=".NonLauncherActivity">
             android:exported="true">
         </activity>
+        <activity android:name=".SimpleActivityImmediateExit" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".SimpleActivityChainExit" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
     </application>
 
 </manifest>
diff --git a/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityChainExit.java b/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityChainExit.java
new file mode 100644
index 0000000..49f14da
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityChainExit.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.launcherapps.simpleapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * This activity starts another activity. Once the other activity gets terminated, this one will
+ * terminate as well.
+ */
+public class SimpleActivityChainExit extends Activity {
+    private static final String TAG = "SimpleActivityChainExit";
+    // This action.
+    private final static String ACTIVITY_CHAIN_EXIT_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.CHAIN_EXIT_ACTION";
+    // The action which will be called from here and then immediately exit again.
+    private static final String SIMPLE_ACTIVITY_IMMEDIATE_EXIT = ".SimpleActivityImmediateExit";
+    // Our package name.
+    private static final String SIMPLE_PACKAGE_NAME = "com.android.cts.launcherapps.simpleapp";
+    // Set to true once the activity was paused. Upon next resume the activity gets finished.
+    private boolean mPaused = false;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Log.i(TAG, "Created SimpleActivityChainExit.");
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        // Start our second activity which will quit itself immediately giving back control.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME,
+                SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY_IMMEDIATE_EXIT);
+        startActivityForResult(intent, 0);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        mPaused = true;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        // We ignore any resumes coming in before we got at least paused once.
+        if (mPaused) {
+            // Since we were paused once we can finish ourselves now.
+            finish();
+        }
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        // Notify a listener that this activity will end now.
+        Intent reply = new Intent();
+        reply.setAction(ACTIVITY_CHAIN_EXIT_ACTION);
+        sendBroadcast(reply);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityImmediateExit.java b/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityImmediateExit.java
new file mode 100644
index 0000000..15cc3f6
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityImmediateExit.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.launcherapps.simpleapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * A simple activity which quits itself immediately after starting.
+ */
+public class SimpleActivityImmediateExit extends Activity {
+    private final static String ACTIVITY_EXIT_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.EXIT_ACTION";
+    private static final String TAG = "SimpleActivityImmediateExit";
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Log.i(TAG, "Created SimpleActivityImmediateExit.");
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        finish();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        // Notify any listener that this activity is about to end now.
+        Intent reply = new Intent();
+        reply.setAction(ACTIVITY_EXIT_ACTION);
+        sendBroadcast(reply);
+    }
+}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
index 5149a74..5904a6f 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
@@ -47,14 +47,14 @@
  */
 public class BaseDevicePolicyTest extends DeviceTestCase implements IBuildReceiver {
 
+    private static final String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
+
     protected static final String MANAGED_PROFILE_PKG = "com.android.cts.managedprofile";
     protected static final String MANAGED_PROFILE_APK = "CtsManagedProfileApp.apk";
     protected static final String ADMIN_RECEIVER_TEST_CLASS =
             MANAGED_PROFILE_PKG + ".BaseManagedProfileTest$BasicAdminReceiver";
 
-    private static final String RUNNER = "android.test.InstrumentationTestRunner";
-
-    private CtsBuildHelper mCtsBuild;
+    protected CtsBuildHelper mCtsBuild;
 
     private HashSet<String> mAvailableFeatures;
     protected boolean mHasFeature;
@@ -152,6 +152,14 @@
         Thread.sleep(60 * 1000);
     }
 
+    protected void removeTestUsers() throws Exception {
+        for (int userId : listUsers()) {
+            if (userId != 0) {
+                removeUser(userId);
+            }
+        }
+    }
+
     /** Returns true if the specified tests passed. Tests are run as user owner. */
     protected boolean runDeviceTests(String pkgName, @Nullable String testClassName)
             throws DeviceNotAvailableException {
@@ -300,7 +308,6 @@
         return Integer.parseInt(tokens[tokens.length-1]);
     }
 
-
     protected int getUserSerialNumber(int userId) throws DeviceNotAvailableException{
         // dumpsys user return lines like "UserInfo{0:Owner:13} serialNo=0"
         String commandOutput = getDevice().executeShellCommand("dumpsys user");
@@ -322,7 +329,15 @@
 
     protected void setProfileOwner(String componentName, int userId)
             throws DeviceNotAvailableException {
-        String command = "dpm set-profile-owner '" + componentName + "' " + userId;
+        String command = "dpm set-profile-owner --user " + userId + " '" + componentName + "'";
+        String commandOutput = getDevice().executeShellCommand(command);
+        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
+        assertTrue(commandOutput + " expected to start with \"Success:\"",
+                commandOutput.startsWith("Success:"));
+    }
+
+    protected void setDeviceAdmin(String componentName) throws DeviceNotAvailableException {
+        String command = "dpm set-active-admin '" + componentName + "'";
         String commandOutput = getDevice().executeShellCommand(command);
         CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
         assertTrue(commandOutput + " expected to start with \"Success:\"",
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseLauncherAppsTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseLauncherAppsTest.java
index dec8bd2..b106ffd 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseLauncherAppsTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseLauncherAppsTest.java
@@ -45,14 +45,6 @@
         getDevice().uninstallPackage(SIMPLE_APP_PKG);
     }
 
-    protected void removeTestUsers() throws Exception {
-        for (int userId : listUsers()) {
-            if (userId != 0) {
-                removeUser(userId);
-            }
-        }
-    }
-
     protected void startCallbackService() throws Exception {
         String command = "am startservice --user 0 "
                 + "-a " + LAUNCHER_TESTS_SUPPORT_PKG + ".REGISTER_CALLBACK "
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
index b84e9fe..2c59ed4 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
@@ -20,6 +20,8 @@
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.log.LogUtil.CLog;
 
+import java.io.File;
+
 /**
  * Set of tests for Device Owner use cases.
  */
@@ -28,6 +30,13 @@
     private static final String DEVICE_OWNER_PKG = "com.android.cts.deviceowner";
     private static final String DEVICE_OWNER_APK = "CtsDeviceOwnerApp.apk";
 
+    private static final String TEST_APP_APK = "CtsSimpleApp.apk";
+    private static final String TEST_APP_PKG = "com.android.cts.launcherapps.simpleapp";
+    private static final String TEST_APP_LOCATION = "/data/local/tmp/";
+
+    private static final String INTENT_RECEIVER_PKG = "com.android.cts.intent.receiver";
+    private static final String INTENT_RECEIVER_APK = "CtsIntentReceiverApp.apk";
+
     private static final String ADMIN_RECEIVER_TEST_CLASS =
             DEVICE_OWNER_PKG + ".BaseDeviceOwnerTest$BasicAdminReceiver";
     private static final String CLEAR_DEVICE_OWNER_TEST_CLASS =
@@ -70,7 +79,12 @@
     }
 
     public void testLockTask() throws Exception {
-        executeDeviceOwnerTest("LockTaskTest");
+        try {
+            installApp(INTENT_RECEIVER_APK);
+            executeDeviceOwnerTest("LockTaskTest");
+        } finally {
+            getDevice().uninstallPackage(INTENT_RECEIVER_PKG);
+        }
     }
 
     public void testPersistentIntentResolving() throws Exception {
@@ -81,6 +95,19 @@
         executeDeviceOwnerTest("ScreenCaptureDisabledTest");
     }
 
+    public void testSilentPackageInstaller() throws Exception {
+        final File apk = mCtsBuild.getTestApp(TEST_APP_APK);
+        try {
+            getDevice().uninstallPackage(TEST_APP_PKG);
+            assertTrue(getDevice().pushFile(apk, TEST_APP_LOCATION + apk.getName()));
+            executeDeviceOwnerTest("SilentPackageInstallerTest");
+        } finally {
+            String command = "rm " + TEST_APP_LOCATION + apk.getName();
+            String commandOutput = getDevice().executeShellCommand(command);
+            getDevice().uninstallPackage(TEST_APP_PKG);
+        }
+    }
+
     private void executeDeviceOwnerTest(String testClassName) throws Exception {
         if (!mHasFeature) {
             return;
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
index 70cd9be..5c2048e 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
@@ -20,6 +20,8 @@
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.log.LogUtil.CLog;
 
+import junit.framework.AssertionFailedError;
+
 /**
  * Set of tests for Managed Profile use cases.
  */
@@ -34,6 +36,9 @@
     private static final String INTENT_RECEIVER_PKG = "com.android.cts.intent.receiver";
     private static final String INTENT_RECEIVER_APK = "CtsIntentReceiverApp.apk";
 
+    private static final String CERT_INSTALLER_PKG = "com.android.cts.certinstaller";
+    private static final String CERT_INSTALLER_APK = "CtsCertInstallerApp.apk";
+
     private static final String ADMIN_RECEIVER_TEST_CLASS =
             MANAGED_PROFILE_PKG + ".BaseManagedProfileTest$BasicAdminReceiver";
 
@@ -49,10 +54,9 @@
                 "android.software.managed_users");
 
         if (mHasFeature) {
+            removeTestUsers();
             mUserId = createManagedProfile();
             installApp(MANAGED_PROFILE_APK);
-            installApp(INTENT_RECEIVER_APK);
-            installApp(INTENT_SENDER_APK);
             setProfileOwner(MANAGED_PROFILE_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS, mUserId);
             startUser(mUserId);
         }
@@ -65,6 +69,7 @@
             getDevice().uninstallPackage(MANAGED_PROFILE_PKG);
             getDevice().uninstallPackage(INTENT_SENDER_PKG);
             getDevice().uninstallPackage(INTENT_RECEIVER_PKG);
+            getDevice().uninstallPackage(CERT_INSTALLER_PKG);
         }
         super.tearDown();
     }
@@ -92,6 +97,19 @@
         assertFalse(listUsers().contains(mUserId));
     }
 
+    public void testMaxOneManagedProfile() throws Exception {
+        int newUserId = -1;
+        try {
+            newUserId = createManagedProfile();
+        } catch (AssertionFailedError expected) {
+        }
+        if (newUserId > 0) {
+            removeUser(newUserId);
+            fail(mHasFeature ? "Device must allow creating only one managed profile"
+                    : "Device must not allow creating a managed profile");
+        }
+    }
+
     public void testCrossProfileIntentFilters() throws Exception {
         if (!mHasFeature) {
             return;
@@ -125,19 +143,21 @@
         if (!mHasFeature) {
             return;
         }
+        installApp(INTENT_RECEIVER_APK);
+        installApp(INTENT_SENDER_APK);
 
         // Test from parent to managed
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "removeAllFilters", mUserId));
+                "testRemoveAllFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "addManagedCanAccessParentFilters", mUserId));
+                "testAddManagedCanAccessParentFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(INTENT_SENDER_PKG, ".ContentTest", 0));
 
         // Test from managed to parent
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "removeAllFilters", mUserId));
+                "testRemoveAllFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "addParentCanAccessManagedFilters", mUserId));
+                "testAddParentCanAccessManagedFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(INTENT_SENDER_PKG, ".ContentTest", mUserId));
 
     }
@@ -146,16 +166,18 @@
         if (!mHasFeature) {
             return;
         }
+        installApp(INTENT_RECEIVER_APK);
+        installApp(INTENT_SENDER_APK);
 
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "allowCrossProfileCopyPaste", mUserId));
+                "testAllowCrossProfileCopyPaste", mUserId));
         // Test that managed can see what is copied in the parent.
         testCrossProfileCopyPasteInternal(mUserId, true);
         // Test that the parent can see what is copied in managed.
         testCrossProfileCopyPasteInternal(0, true);
 
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "disallowCrossProfileCopyPaste", mUserId));
+                "testDisallowCrossProfileCopyPaste", mUserId));
         // Test that managed can still see what is copied in the parent.
         testCrossProfileCopyPasteInternal(mUserId, true);
         // Test that the parent cannot see what is copied in managed.
@@ -164,10 +186,11 @@
 
     private void testCrossProfileCopyPasteInternal(int userId, boolean shouldSucceed)
             throws DeviceNotAvailableException {
-        final String direction = (userId == 0) ? "addManagedCanAccessParentFilters"
-                : "addParentCanAccessManagedFilters";
+        final String direction = (userId == 0)
+                ? "testAddManagedCanAccessParentFilters"
+                : "testAddParentCanAccessManagedFilters";
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "removeAllFilters", mUserId));
+                "testRemoveAllFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
                 direction, mUserId));
         if (shouldSucceed) {
@@ -189,6 +212,9 @@
         if (!mHasFeature) {
             return;
         }
+        // If adb is running as root, then the adb uid is 0 instead of SHELL_UID,
+        // so the DISALLOW_DEBUGGING_FEATURES restriction does not work and this test
+        // fails.
         String restriction = "no_debugging_features";  // UserManager.DISALLOW_DEBUGGING_FEATURES
         String command = "add-restriction";
 
@@ -232,39 +258,115 @@
         try {
             // Insert Primary profile Contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testPrimaryProfilePhoneLookup_insertedAndfound", 0));
+                    "testPrimaryProfilePhoneAndEmailLookup_insertedAndfound", 0));
             // Insert Managed profile Contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testManagedProfilePhoneLookup_insertedAndfound", mUserId));
+                    "testManagedProfilePhoneAndEmailLookup_insertedAndfound", mUserId));
+            // Insert a primary contact with same phone & email as other enterprise contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileDuplicatedPhoneEmailContact_insertedAndfound", 0));
+            // Insert a enterprise contact with same phone & email as other primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileDuplicatedPhoneEmailContact_insertedAndfound", mUserId));
+
 
             // Set cross profile caller id to enabled
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testSetCrossProfileCallerIdDisabled_false", mUserId));
 
-            // Managed user can use ENTERPRISE_CONTENT_FILTER_URI
-            // To access managed contacts but not primary contacts
+            // Primary user cannot use ordinary phone/email lookup api to access managed contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testManagedProfilePhoneLookup_canAccessEnterpriseContact", mUserId));
+                    "testPrimaryProfilePhoneLookup_canNotAccessEnterpriseContact", 0));
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testManagedProfilePhoneLookup_canNotAccessPrimaryContact", mUserId));
-
-            // Primary user can use ENTERPRISE_CONTENT_FILTER_URI
-            // To access both primary and managed contacts
+                    "testPrimaryProfileEmailLookup_canNotAccessEnterpriseContact", 0));
+            // Primary user can use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterprisePhoneLookup_canAccessPrimaryContact", 0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseEmailLookup_canAccessPrimaryContact", 0));
+            // Primary user can use ENTERPRISE_CONTENT_FILTER_URI to access managed profile contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testPrimaryProfileEnterprisePhoneLookup_canAccessEnterpriseContact", 0));
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testPrimaryProfilePhoneLookup_canAccessPrimaryContact", 0));
+                    "testPrimaryProfileEnterpriseEmailLookup_canAccessEnterpriseContact", 0));
+            // When there exist contacts with the same phone/email in primary & enterprise,
+            // primary user can use ENTERPRISE_CONTENT_FILTER_URI to access the primary contact.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseEmailLookupDuplicated_canAccessPrimaryContact",
+                    0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact",
+                    0));
+
+            // Make sure SIP enterprise lookup works too.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseSipLookup_canAccessEnterpriseContact", 0));
+
+            // Managed user cannot use ordinary phone/email lookup api to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfilePhoneLookup_canNotAccessPrimaryContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEmailLookup_canNotAccessPrimaryContact", mUserId));
+            // Managed user can use ENTERPRISE_CONTENT_FILTER_URI to access enterprise contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookup_canAccessEnterpriseContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookup_canAccessEnterpriseContact", mUserId));
+            // Managed user cannot use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookup_canNotAccessPrimaryContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookup_canNotAccessPrimaryContact", mUserId));
+            // When there exist contacts with the same phone/email in primary & enterprise,
+            // managed user can use ENTERPRISE_CONTENT_FILTER_URI to access the enterprise contact.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookupDuplicated_canAccessEnterpriseContact",
+                    mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookupDuplicated_canAccessEnterpriseContact",
+                    mUserId));
 
             // Set cross profile caller id to disabled
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testSetCrossProfileCallerIdDisabled_true", mUserId));
 
-            // Primary user cannot use ENTERPRISE_CONTENT_FILTER_URI to access managed contacts
+            // Primary user cannot use ordinary phone/email lookup api to access managed contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testPrimaryProfilePhoneLookup_canNotAccessEnterpriseContact", 0));
-            // Managed user cannot use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEmailLookup_canNotAccessEnterpriseContact", 0));
+            // Primary user cannot use ENTERPRISE_CONTENT_FILTER_URI to access managed contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterprisePhoneLookup_canNotAccessEnterpriseContact", 0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseEmailLookup_canNotAccessEnterpriseContact", 0));
+            // When there exist contacts with the same phone/email in primary & enterprise,
+            // primary user can use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseEmailLookupDuplicated_canAccessPrimaryContact",
+                    0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact",
+                    0));
+
+            // Managed user cannot use ordinary phone/email lookup api to access primary contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testManagedProfilePhoneLookup_canNotAccessPrimaryContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEmailLookup_canNotAccessPrimaryContact", mUserId));
+            // Managed user cannot use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookup_canNotAccessPrimaryContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookup_canNotAccessPrimaryContact", mUserId));
+            // When there exist contacts with the same phone/email in primary & enterprise,
+            // managed user can use ENTERPRISE_CONTENT_FILTER_URI to access enterprise contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookupDuplicated_canAccessEnterpriseContact",
+                    mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookupDuplicated_canAccessEnterpriseContact",
+                    mUserId));
         } finally {
             // Clean up in managed profile and primary profile
             runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
@@ -274,6 +376,36 @@
         }
     }
 
+    public void testBluetoothContactSharingDisabled() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                "testSetBluetoothContactSharingDisabled_setterAndGetter", mUserId));
+    }
+
+    public void testDelegatedCertInstaller() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installApp(CERT_INSTALLER_APK);
+        setDeviceAdmin(MANAGED_PROFILE_PKG + "/.PrimaryUserDeviceAdmin");
+
+        final String adminHelperClass = ".PrimaryUserAdminHelper";
+        try {
+            assertTrue("Set lockscreen password failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    adminHelperClass, "testSetPassword", 0 /* user 0 */));
+            assertTrue("DelegatedCertInstaller failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    ".DelegatedCertInstallerTest", mUserId));
+        } finally {
+            // Reset lockscreen password and remove device admin.
+            assertTrue("Clear lockscreen password failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    adminHelperClass, "testClearPassword", 0 /* user 0 */));
+            assertTrue("Clear device admin failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    adminHelperClass, "testClearDeviceAdmin", 0 /* user 0 */));
+        }
+    }
+
     private void disableActivityForUser(String activityName, int userId)
             throws DeviceNotAvailableException {
         String command = "am start -W --user " + userId
diff --git a/hostsidetests/dumpsys/src/android/dumpsys/cts/DumpsysHostTest.java b/hostsidetests/dumpsys/src/android/dumpsys/cts/DumpsysHostTest.java
index 94862e7..fec4b40 100644
--- a/hostsidetests/dumpsys/src/android/dumpsys/cts/DumpsysHostTest.java
+++ b/hostsidetests/dumpsys/src/android/dumpsys/cts/DumpsysHostTest.java
@@ -813,11 +813,76 @@
         assertInteger(parts[4]); // chargeTimeRemaining
     }
 
-    private static void assertInteger(String input) {
+    /**
+     * Tests the output of "dumpsys gfxinfo framestats".
+     *
+     * @throws Exception
+     */
+    public void testGfxinfoFramestats() throws Exception {
+        final String MARKER = "---PROFILEDATA---";
+
+        String frameinfo = mDevice.executeShellCommand("dumpsys gfxinfo com.android.systemui framestats");
+        assertNotNull(frameinfo);
+        assertTrue(frameinfo.length() > 0);
+        int profileStart = frameinfo.indexOf(MARKER);
+        int profileEnd = frameinfo.indexOf(MARKER, profileStart + 1);
+        assertTrue(profileStart >= 0);
+        assertTrue(profileEnd > profileStart);
+        String profileData = frameinfo.substring(profileStart + MARKER.length(), profileEnd);
+        assertTrue(profileData.length() > 0);
+        boolean foundAtLeastOneRow = false;
+        try (BufferedReader reader = new BufferedReader(
+                new StringReader(profileData))) {
+            String line;
+            // First line needs to be the headers
+            while ((line = reader.readLine()) != null && line.isEmpty()) {}
+
+            assertNotNull(line);
+            assertTrue("First line was not the expected header",
+                    line.startsWith("Flags,IntendedVsync,Vsync,OldestInputEvent" +
+                            ",NewestInputEvent,HandleInputStart,AnimationStart" +
+                            ",PerformTraversalsStart,DrawStart,SyncStart" +
+                            ",IssueDrawCommandsStart,SwapBuffers,FrameCompleted"));
+
+            long[] numparts = new long[13];
+            while ((line = reader.readLine()) != null && !line.isEmpty()) {
+
+                String[] parts = line.split(",");
+                assertTrue(parts.length >= 13);
+                for (int i = 0; i < 13; i++) {
+                    numparts[i] = assertInteger(parts[i]);
+                }
+                if (numparts[0] != 0) {
+                    continue;
+                }
+                // assert VSYNC >= INTENDED_VSYNC
+                assertTrue(numparts[2] >= numparts[1]);
+                // assert time is flowing forwards, skipping index 3 & 4
+                // as those are input timestamps that may or may not be present
+                assertTrue(numparts[5] >= numparts[2]);
+                for (int i = 6; i < 13; i++) {
+                    assertTrue("Index " + i + " did not flow forward, " +
+                            numparts[i] + " not larger than " + numparts[i - 1],
+                            numparts[i] >= numparts[i-1]);
+                }
+                long totalDuration = numparts[12] - numparts[1];
+                assertTrue("Frame did not take a positive amount of time to process",
+                        totalDuration > 0);
+                assertTrue("Bogus frame duration, exceeds 100 seconds",
+                        totalDuration < 100000000000L);
+                foundAtLeastOneRow = true;
+            }
+        }
+        assertTrue(foundAtLeastOneRow);
+    }
+
+    private static long assertInteger(String input) {
         try {
-            Long.parseLong(input);
+            return Long.parseLong(input);
         } catch (NumberFormatException e) {
             fail("Expected an integer but found \"" + input + "\"");
+            // Won't be hit, above throws AssertException
+            return -1;
         }
     }
 
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk b/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk
index f6543fb..c04d4b2 100644
--- a/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk
index 29bf9d6..b3cb181 100644
--- a/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/net/app/Android.mk b/hostsidetests/net/app/Android.mk
index 29b620d..055287a 100644
--- a/hostsidetests/net/app/Android.mk
+++ b/hostsidetests/net/app/Android.mk
@@ -29,4 +29,4 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/libs/commonutil/src/com/android/cts/util/ReportLog.java b/libs/commonutil/src/com/android/cts/util/ReportLog.java
index 56b431a..dd4b414 100644
--- a/libs/commonutil/src/com/android/cts/util/ReportLog.java
+++ b/libs/commonutil/src/com/android/cts/util/ReportLog.java
@@ -42,26 +42,55 @@
 
     /**
      * print array of values to output log
+     * <p>Note: test identifier is inferred from call stack trace based on class and method name
      */
     public void printArray(String message, double[] values, ResultType type, ResultUnit unit) {
         doPrintArray(message, values, type, unit);
     }
 
     /**
+     * print array of values to output log
+     */
+    public void printArray(String testId, String message,
+            double[] values, ResultType type, ResultUnit unit) {
+        doPrintArray(testId, message, values, type, unit);
+    }
+
+    /**
      * Print a value to output log
+     * <p>Note: test identifier is inferred from call stack trace based on class and method name
      */
     public void printValue(String message, double value, ResultType type, ResultUnit unit) {
         double[] vals = { value };
         doPrintArray(message, vals, type, unit);
     }
 
+    /**
+     * Print a value to output log
+     */
+    public void printValue(String testId, String message,
+            double value, ResultType type, ResultUnit unit) {
+        double[] vals = { value };
+        doPrintArray(testId, message, vals, type, unit);
+    }
+
     private void doPrintArray(String message, double[] values, ResultType type, ResultUnit unit) {
+        doPrintArray(getClassMethodNames(mDepth + 1, true), message, values, type, unit);
+    }
+
+    private void doPrintArray(String testId, String message,
+            double[] values, ResultType type, ResultUnit unit) {
         StringBuilder builder = new StringBuilder();
         // note mDepth + 1 as this function will be called by printVaue or printArray
         // and we need caller of printValue / printArray
-        builder.append(getClassMethodNames(mDepth + 1, true) + LOG_ELEM_SEPARATOR + message +
-                LOG_ELEM_SEPARATOR + type.getXmlString() + LOG_ELEM_SEPARATOR +
-                unit.getXmlString() + LOG_ELEM_SEPARATOR);
+        builder.append(testId);
+        builder.append(LOG_ELEM_SEPARATOR);
+        builder.append(message);
+        builder.append(LOG_ELEM_SEPARATOR);
+        builder.append(type.getXmlString());
+        builder.append(LOG_ELEM_SEPARATOR);
+        builder.append(unit.getXmlString());
+        builder.append(LOG_ELEM_SEPARATOR);
         for (double v : values) {
             builder.append(v);
             builder.append(" ");
diff --git a/libs/deviceutil/src/android/cts/util/MediaUtils.java b/libs/deviceutil/src/android/cts/util/MediaUtils.java
index 20153c5..7edde48 100644
--- a/libs/deviceutil/src/android/cts/util/MediaUtils.java
+++ b/libs/deviceutil/src/android/cts/util/MediaUtils.java
@@ -334,4 +334,31 @@
     public static boolean checkDecoderForFormat(MediaFormat format) {
         return check(canDecode(format), "no decoder for " + format);
     }
+
+    public static MediaExtractor createMediaExtractorForMimeType(
+            Context context, int resourceId, String mimeTypePrefix)
+            throws IOException {
+        MediaExtractor extractor = new MediaExtractor();
+        AssetFileDescriptor afd = context.getResources().openRawResourceFd(resourceId);
+        try {
+            extractor.setDataSource(
+                    afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
+        } finally {
+            afd.close();
+        }
+        int trackIndex;
+        for (trackIndex = 0; trackIndex < extractor.getTrackCount(); trackIndex++) {
+            MediaFormat trackMediaFormat = extractor.getTrackFormat(trackIndex);
+            if (trackMediaFormat.getString(MediaFormat.KEY_MIME).startsWith(mimeTypePrefix)) {
+                extractor.selectTrack(trackIndex);
+                break;
+            }
+        }
+        if (trackIndex == extractor.getTrackCount()) {
+            extractor.release();
+            throw new IllegalStateException("couldn't get a track for " + mimeTypePrefix);
+        }
+
+        return extractor;
+    }
 }
diff --git a/libs/deviceutil/src/android/cts/util/SystemUtil.java b/libs/deviceutil/src/android/cts/util/SystemUtil.java
index e6222cb..6e7fd38 100644
--- a/libs/deviceutil/src/android/cts/util/SystemUtil.java
+++ b/libs/deviceutil/src/android/cts/util/SystemUtil.java
@@ -18,9 +18,14 @@
 
 import android.app.ActivityManager;
 import android.app.ActivityManager.MemoryInfo;
+import android.app.Instrumentation;
 import android.content.Context;
+import android.os.ParcelFileDescriptor;
 import android.os.StatFs;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+
 public class SystemUtil {
     public static long getFreeDiskSize(Context context) {
         StatFs statFs = new StatFs(context.getFilesDir().getAbsolutePath());
@@ -40,4 +45,28 @@
         activityManager.getMemoryInfo(info);
         return info.totalMem; // TODO totalMem N/A in ICS.
     }
+
+    /**
+     * Executes a shell command using shell user identity, and return the standard output in string
+     * <p>Note: calling this function requires API level 21 or above
+     * @param instrumentation {@link Instrumentation} instance, obtained from a test running in
+     * instrumentation framework
+     * @param cmd the command to run
+     * @return the standard output of the command
+     * @throws Exception
+     */
+    public static String runShellCommand(Instrumentation instrumentation, String cmd)
+            throws IOException {
+        ParcelFileDescriptor pfd = instrumentation.getUiAutomation().executeShellCommand(cmd);
+        byte[] buf = new byte[512];
+        int bytesRead;
+        FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
+        StringBuffer stdout = new StringBuffer();
+        while ((bytesRead = fis.read(buf)) != -1) {
+            stdout.append(new String(buf, 0, bytesRead));
+        }
+        fis.close();
+        return stdout.toString();
+    }
+
 }
diff --git a/libs/deviceutillegacy/src/android/webkit/cts/WebViewOnUiThread.java b/libs/deviceutillegacy/src/android/webkit/cts/WebViewOnUiThread.java
index b9d3af1..2933b0b 100644
--- a/libs/deviceutillegacy/src/android/webkit/cts/WebViewOnUiThread.java
+++ b/libs/deviceutillegacy/src/android/webkit/cts/WebViewOnUiThread.java
@@ -21,6 +21,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Picture;
 import android.graphics.Rect;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.Looper;
 import android.os.Message;
@@ -36,9 +37,12 @@
 import android.webkit.ValueCallback;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebChromeClient;
+import android.webkit.WebMessage;
+import android.webkit.WebMessagePort;
 import android.webkit.WebSettings;
 import android.webkit.WebView.HitTestResult;
 import android.webkit.WebView.PictureListener;
+import android.webkit.WebView.VisualStateCallback;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
@@ -306,6 +310,24 @@
         });
     }
 
+    public WebMessagePort[] createWebMessageChannel() {
+        return getValue(new ValueGetter<WebMessagePort[]>() {
+            @Override
+            public WebMessagePort[] capture() {
+                return mWebView.createWebMessageChannel();
+            }
+        });
+    }
+
+    public void postWebMessage(final WebMessage message, final Uri targetOrigin) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.postWebMessage(message, targetOrigin);
+            }
+        });
+    }
+
     public void addJavascriptInterface(final Object object, final String name) {
         runOnUiThread(new Runnable() {
             @Override
@@ -628,6 +650,15 @@
         });
     }
 
+    public void postVisualStateCallback(final long requestId, final VisualStateCallback callback) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.postVisualStateCallback(requestId, callback);
+            }
+        });
+    }
+
     public int[] getLocationOnScreen() {
         final int[] location = new int[2];
         return getValue(new ValueGetter<int[]>() {
diff --git a/libs/testserver/Android.mk b/libs/testserver/Android.mk
index dfe357b..488af53 100644
--- a/libs/testserver/Android.mk
+++ b/libs/testserver/Android.mk
@@ -22,4 +22,6 @@
 
 LOCAL_MODULE := ctstestserver
 
+LOCAL_SDK_VERSION := 16
+
 include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/libs/testserver/src/android/webkit/cts/CtsTestServer.java b/libs/testserver/src/android/webkit/cts/CtsTestServer.java
index 22cbb7b..e39e435 100644
--- a/libs/testserver/src/android/webkit/cts/CtsTestServer.java
+++ b/libs/testserver/src/android/webkit/cts/CtsTestServer.java
@@ -15,7 +15,6 @@
  */
 package android.webkit.cts;
 
-import libcore.io.Base64;
 import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpEntityEnclosingRequest;
@@ -44,6 +43,7 @@
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Environment;
+import android.util.Base64;
 import android.util.Log;
 import android.webkit.MimeTypeMap;
 
@@ -947,7 +947,7 @@
          * for the result.
          */
         private static KeyManager[] getKeyManagers() throws Exception {
-            byte[] bytes = Base64.decode(SERVER_KEYS_BKS.getBytes());
+            byte[] bytes = Base64.decode(SERVER_KEYS_BKS.getBytes(), Base64.DEFAULT);
             InputStream inputStream = new ByteArrayInputStream(bytes);
 
             KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
diff --git a/tests/webgl/Android.mk b/suite/cts/deviceTests/jank2/Android.mk
old mode 100755
new mode 100644
similarity index 69%
copy from tests/webgl/Android.mk
copy to suite/cts/deviceTests/jank2/Android.mk
index ce22dd8..346297e
--- a/tests/webgl/Android.mk
+++ b/suite/cts/deviceTests/jank2/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 The Android Open Source Project
+# Copyright (C) 2015 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -16,19 +16,14 @@
 
 include $(CLEAR_VARS)
 
-# Don't include this package in any target.
 LOCAL_MODULE_TAGS := optional
 
-# When built, explicitly put it in the data partition.
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-# Must match the package name in CtsTestCaseList.mk
-LOCAL_PACKAGE_NAME := CtsWebGLTestCases
+LOCAL_PACKAGE_NAME := CtsJankTestCases
 
-LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ub-uiautomator ub-janktesthelper
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/suite/cts/deviceTests/jank2/AndroidManifest.xml b/suite/cts/deviceTests/jank2/AndroidManifest.xml
new file mode 100644
index 0000000..a4c8337
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="android.cts.jank">
+
+  <application>
+      <uses-library android:name="android.test.runner"/>
+  </application>
+
+  <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                   android:targetPackage="android.cts.jank"
+                   android:label="Jank tests">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
diff --git a/suite/cts/deviceTests/jank2/AndroidTest.xml b/suite/cts/deviceTests/jank2/AndroidTest.xml
new file mode 100644
index 0000000..2fbbac7
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/AndroidTest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="CTS Jank test config">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsDeviceUi.apk" />
+</configuration>
diff --git a/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java b/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java
new file mode 100644
index 0000000..cb5c122
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.jank;
+
+import android.cts.util.DeviceReportLog;
+import android.os.Bundle;
+import android.support.test.jank.JankTestBase;
+import android.support.test.jank.WindowContentFrameStatsMonitor;
+import android.support.test.uiautomator.UiDevice;
+
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+
+public abstract class CtsJankTestBase extends JankTestBase {
+
+    private UiDevice mDevice;
+    private DeviceReportLog mLog;
+
+    @Override
+    public void afterTest(Bundle metrics) {
+        String source = String.format("%s#%s", getClass().getCanonicalName(), getName());
+        mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_AVG_FPS,
+                metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_FPS),
+                ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_AVG_LONGEST_FRAME,
+                metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_LONGEST_FRAME),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_MAX_NUM_JANKY,
+                metrics.getInt(WindowContentFrameStatsMonitor.KEY_MAX_NUM_JANKY),
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        mLog.printSummary(WindowContentFrameStatsMonitor.KEY_AVG_NUM_JANKY,
+                metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_NUM_JANKY),
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mLog = new DeviceReportLog();
+        // fix device orientation
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mDevice.setOrientationNatural();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mLog.deliverReportToHost(getInstrumentation());
+        // restore device orientation
+        mDevice.unfreezeRotation();
+        super.tearDown();
+    }
+
+    protected UiDevice getUiDevice() {
+        return mDevice;
+    }
+}
diff --git a/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java b/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java
new file mode 100644
index 0000000..884f83c
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package android.cts.jank.ui;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.cts.jank.CtsJankTestBase;
+import android.os.SystemClock;
+import android.support.test.jank.JankTest;
+import android.support.test.jank.WindowContentFrameStatsMonitor;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Direction;
+import android.support.test.uiautomator.Until;
+import android.widget.ListView;
+
+import java.io.IOException;
+
+public class CtsDeviceJankUi extends CtsJankTestBase {
+    private final static int NUM_ELEMENTS = 1000;
+    private static final long DEFAULT_ANIMATION_TIME = 2 * 1000;
+    private static final long POST_SCROLL_IDLE_TIME = 2 *1000;
+    private final static String PACKAGE = "com.android.cts.ui";
+    private final static String CLASS = PACKAGE + ".ScrollingActivity";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // launch the activity as part of the set up
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setComponent(new ComponentName(PACKAGE, CLASS));
+        intent.putExtra("num_elements", NUM_ELEMENTS);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getInstrumentation().getTargetContext().startActivity(intent);
+        getUiDevice().wait(Until.hasObject(By.pkg(PACKAGE)), DEFAULT_ANIMATION_TIME);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        getUiDevice().pressHome();
+        super.tearDown();
+    }
+
+    @JankTest(expectedFrames=50, defaultIterationCount=5)
+    @WindowContentFrameStatsMonitor
+    public void testScrolling() throws IOException {
+        getUiDevice().findObject(By.clazz(ListView.class)).fling(Direction.DOWN);
+        SystemClock.sleep(POST_SCROLL_IDLE_TIME);
+    }
+}
diff --git a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java
index 6459c86..88b005a 100644
--- a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java
@@ -16,6 +16,7 @@
 
 package com.android.cts.videoperf;
 
+import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaCodecInfo.CodecProfileLevel;
@@ -23,7 +24,9 @@
 import android.media.MediaCodecList;
 import android.media.MediaFormat;
 import android.util.Log;
+import android.util.Range;
 
+import java.io.IOException;
 
 /**
  * Utility class for getting codec information like bit rate, fps, and etc.
@@ -43,32 +46,25 @@
     private static final String VIDEO_AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
     /**
      * Check if given codec with given (w,h) is supported.
+     * @param codecName codec name
      * @param mimeType codec type in mime format like MediaFormat.MIMETYPE_VIDEO_AVC
      * @param w video width
      * @param h video height
-     * @param isEncoder whether the codec is encoder or decoder
      * @return null if the configuration is not supported.
      */
     public static CodecInfo getSupportedFormatInfo(
-            String mimeType, int w, int h, boolean isEncoder) {
-        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-        MediaFormat format = MediaFormat.createVideoFormat(mimeType, w, h);
-        String codec = isEncoder
-                ? mcl.findEncoderForFormat(format)
-                : mcl.findDecoderForFormat(format);
-        if (codec == null) { // not supported
+            String codecName, String mimeType, int w, int h) {
+        MediaCodec codec;
+        try {
+            codec = MediaCodec.createByCodecName(codecName);
+        } catch (IOException e) {
             return null;
         }
-        CodecCapabilities cap = null;
-        for (MediaCodecInfo info : mcl.getCodecInfos()) {
-            if (info.getName().equals(codec)) {
-                cap = info.getCapabilitiesForType(mimeType);
-                break;
-            }
-        }
 
+        CodecCapabilities cap = codec.getCodecInfo().getCapabilitiesForType(mimeType);
         if (cap.colorFormats.length == 0) {
             Log.w(TAG, "no supported color format");
+            codec.release();
             return null;
         }
 
@@ -84,14 +80,35 @@
         printIntArray("supported colors", cap.colorFormats);
 
         VideoCapabilities vidCap = cap.getVideoCapabilities();
-        if (mimeType.equals(VIDEO_AVC)) {
+        try {
             info.mFps = vidCap.getSupportedFrameRatesFor(w, h).getUpper().intValue();
-            info.mBitRate = vidCap.getBitrateRange().getUpper();
-            Log.i(TAG, "AVC bit rate " + info.mBitRate + " fps " + info.mFps);
+        } catch (IllegalArgumentException e) {
+            Log.w(TAG, "unsupported size");
+            codec.release();
+            return null;
         }
+        info.mBitRate = vidCap.getBitrateRange().getUpper();
+        Log.i(TAG, "test bit rate " + info.mBitRate + " fps " + info.mFps);
+        codec.release();
         return info;
     }
 
+    public static Range<Double> getAchievableFrameRatesFor(
+            String codecName, String mimeType, int width, int height) {
+        MediaCodec codec;
+        try {
+            codec = MediaCodec.createByCodecName(codecName);
+        } catch (IOException e) {
+            return null;
+        }
+
+        VideoCapabilities cap =
+            codec.getCodecInfo().getCapabilitiesForType(mimeType).getVideoCapabilities();
+        Range<Double> results = cap.getAchievableFrameRatesFor(width, height);
+        codec.release();
+        return results;
+    }
+
     // for debugging
     private static void printIntArray(String msg, int[] data) {
         StringBuilder builder = new StringBuilder();
diff --git a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
index bf02d9c..d8c3afb 100644
--- a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
@@ -23,10 +23,15 @@
 import android.media.Image;
 import android.media.Image.Plane;
 import android.media.MediaCodec;
-import android.media.MediaCodecList;
+import android.media.MediaCodec.BufferInfo;
+import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecList;
 import android.media.MediaFormat;
 import android.util.Log;
+import android.util.Pair;
+import android.util.Range;
+import android.util.Size;
 
 import android.cts.util.CtsAndroidTestCase;
 import com.android.cts.util.ResultType;
@@ -36,6 +41,8 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.lang.System;
+import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.Random;
 import java.util.Vector;
 
@@ -57,6 +64,9 @@
     private static final long VIDEO_CODEC_WAIT_TIME_US = 5000;
     private static final boolean VERBOSE = false;
     private static final String VIDEO_AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
+    private static final String VIDEO_VP8 = MediaFormat.MIMETYPE_VIDEO_VP8;
+    private static final String VIDEO_H263 = MediaFormat.MIMETYPE_VIDEO_H263;
+    private static final String VIDEO_MPEG4 = MediaFormat.MIMETYPE_VIDEO_MPEG4;
     private static final int TOTAL_FRAMES = 300;
     private static final int NUMBER_OF_REPEAT = 10;
     // i frame interval for encoder
@@ -75,20 +85,29 @@
     private int mVideoHeight;
     private int mFrameRate;
 
-    private Vector<ByteBuffer> mEncodedOutputBuffer;
+    private LinkedList<Pair<ByteBuffer, BufferInfo>> mEncodedOutputBuffer;
     // check this many pixels per each decoded frame
     // checking too many points decreases decoder frame rates a lot.
     private static final int PIXEL_CHECK_PER_FRAME = 1000;
     // RMS error in pixel values above this will be treated as error.
     private static final double PIXEL_RMS_ERROR_MARGAIN = 20.0;
+    private double mRmsErrorMargain = PIXEL_RMS_ERROR_MARGAIN;
     private Random mRandom;
 
+    private class TestConfig {
+        public boolean mTestPixels = true;
+        public boolean mTestResult = true;
+    }
+
+    private TestConfig mTestConfig;
+
     @Override
     protected void setUp() throws Exception {
-        mEncodedOutputBuffer = new Vector<ByteBuffer>(TOTAL_FRAMES * 2);
+        mEncodedOutputBuffer = new LinkedList<Pair<ByteBuffer, BufferInfo>>();
         // Use time as a seed, hoping to prevent checking pixels in the same pattern
         long now = System.currentTimeMillis();
         mRandom = new Random(now);
+        mTestConfig = new TestConfig();
         super.setUp();
     }
 
@@ -101,23 +120,76 @@
         mYDirectBuffer = null;
         mUVDirectBuffer = null;
         mRandom = null;
+        mTestConfig = null;
         super.tearDown();
     }
 
+    private String getEncoderName(String mime) {
+        return getCodecName(mime, true /* isEncoder */);
+    }
+
+    private String getDecoderName(String mime) {
+        return getCodecName(mime, false /* isEncoder */);
+    }
+
+    private String getCodecName(String mime, boolean isEncoder) {
+        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        for (MediaCodecInfo info : mcl.getCodecInfos()) {
+            if (info.isEncoder() != isEncoder) {
+                continue;
+            }
+            CodecCapabilities caps = null;
+            try {
+                caps = info.getCapabilitiesForType(mime);
+            } catch (IllegalArgumentException e) {  // mime is not supported
+                continue;
+            }
+            return info.getName();
+        }
+        return null;
+    }
+
+    private String[] getEncoderName(String mime, boolean isGoog) {
+        return getCodecName(mime, isGoog, true /* isEncoder */);
+    }
+
+    private String[] getDecoderName(String mime, boolean isGoog) {
+        return getCodecName(mime, isGoog, false /* isEncoder */);
+    }
+
+    private String[] getCodecName(String mime, boolean isGoog, boolean isEncoder) {
+        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        ArrayList<String> result = new ArrayList<String>();
+        for (MediaCodecInfo info : mcl.getCodecInfos()) {
+            if (info.isEncoder() != isEncoder
+                    || info.getName().toLowerCase().startsWith("omx.google.") != isGoog) {
+                continue;
+            }
+            CodecCapabilities caps = null;
+            try {
+                caps = info.getCapabilitiesForType(mime);
+            } catch (IllegalArgumentException e) {  // mime is not supported
+                continue;
+            }
+            result.add(info.getName());
+        }
+        return result.toArray(new String[result.size()]);
+    }
+
     public void testAvc0176x0144() throws Exception {
-        doTest(VIDEO_AVC, 176, 144, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 176, 144);
     }
 
     public void testAvc0352x0288() throws Exception {
-        doTest(VIDEO_AVC, 352, 288, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 352, 288);
     }
 
     public void testAvc0720x0480() throws Exception {
-        doTest(VIDEO_AVC, 720, 480, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 720, 480);
     }
 
     public void testAvc1280x0720() throws Exception {
-        doTest(VIDEO_AVC, 1280, 720, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 1280, 720);
     }
 
     /**
@@ -126,7 +198,123 @@
      * which is not specified in API documentation.
      */
     public void testAvc1920x1072() throws Exception {
-        doTest(VIDEO_AVC, 1920, 1072, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 1920, 1072);
+    }
+
+    // Avc tests
+    public void testAvc0320x0240Other() throws Exception {
+        doTestOther(VIDEO_AVC, 320, 240);
+    }
+
+    public void testAvc0320x0240Goog() throws Exception {
+        doTestGoog(VIDEO_AVC, 320, 240);
+    }
+
+    public void testAvc0720x0480Other() throws Exception {
+        doTestOther(VIDEO_AVC, 720, 480);
+    }
+
+    public void testAvc0720x0480Goog() throws Exception {
+        doTestGoog(VIDEO_AVC, 720, 480);
+    }
+
+    public void testAvc1280x0720Other() throws Exception {
+        doTestOther(VIDEO_AVC, 1280, 720);
+    }
+
+    public void testAvc1280x0720Goog() throws Exception {
+        doTestGoog(VIDEO_AVC, 1280, 720);
+    }
+
+    public void testAvc1920x1080Other() throws Exception {
+        doTestOther(VIDEO_AVC, 1920, 1080);
+    }
+
+    public void testAvc1920x1080Goog() throws Exception {
+        doTestGoog(VIDEO_AVC, 1920, 1080);
+    }
+
+    // Vp8 tests
+    public void testVp80320x0180Other() throws Exception {
+        doTestOther(VIDEO_VP8, 320, 180);
+    }
+
+    public void testVp80320x0180Goog() throws Exception {
+        doTestGoog(VIDEO_VP8, 320, 180);
+    }
+
+    public void testVp80640x0360Other() throws Exception {
+        doTestOther(VIDEO_VP8, 640, 360);
+    }
+
+    public void testVp80640x0360Goog() throws Exception {
+        doTestGoog(VIDEO_VP8, 640, 360);
+    }
+
+    public void testVp81280x0720Other() throws Exception {
+        doTestOther(VIDEO_VP8, 1280, 720);
+    }
+
+    public void testVp81280x0720Goog() throws Exception {
+        doTestGoog(VIDEO_VP8, 1280, 720);
+    }
+
+    public void testVp81920x1080Other() throws Exception {
+        doTestOther(VIDEO_VP8, 1920, 1080);
+    }
+
+    public void testVp81920x1080Goog() throws Exception {
+        doTestGoog(VIDEO_VP8, 1920, 1080);
+    }
+
+    // H263 tests
+    public void testH2630176x0144Other() throws Exception {
+        doTestOther(VIDEO_H263, 176, 144);
+    }
+
+    public void testH2630176x0144Goog() throws Exception {
+        doTestGoog(VIDEO_H263, 176, 144);
+    }
+
+    public void testH2630352x0288Other() throws Exception {
+        doTestOther(VIDEO_H263, 352, 288);
+    }
+
+    public void testH2630352x0288Goog() throws Exception {
+        doTestGoog(VIDEO_H263, 352, 288);
+    }
+
+    // Mpeg4 tests
+    public void testMpeg40176x0144Other() throws Exception {
+        doTestOther(VIDEO_MPEG4, 176, 144);
+    }
+
+    public void testMpeg40176x0144Goog() throws Exception {
+        doTestGoog(VIDEO_MPEG4, 176, 144);
+    }
+
+    public void testMpeg40352x0288Other() throws Exception {
+        doTestOther(VIDEO_MPEG4, 352, 288);
+    }
+
+    public void testMpeg40352x0288Goog() throws Exception {
+        doTestGoog(VIDEO_MPEG4, 352, 288);
+    }
+
+    public void testMpeg40640x0480Other() throws Exception {
+        doTestOther(VIDEO_MPEG4, 640, 480);
+    }
+
+    public void testMpeg40640x0480Goog() throws Exception {
+        doTestGoog(VIDEO_MPEG4, 640, 480);
+    }
+
+    public void testMpeg41280x0720Other() throws Exception {
+        doTestOther(VIDEO_MPEG4, 1280, 720);
+    }
+
+    public void testMpeg41280x0720Goog() throws Exception {
+        doTestGoog(VIDEO_MPEG4, 1280, 720);
     }
 
     private boolean isSrcSemiPlanar() {
@@ -156,20 +344,75 @@
         }
     }
 
+    private void doTestGoog(String mimeType, int w, int h) throws Exception {
+        mTestConfig.mTestPixels = false;
+        mTestConfig.mTestResult = false;
+        doTest(true /* isGoog */, mimeType, w, h, NUMBER_OF_REPEAT);
+    }
+
+    private void doTestOther(String mimeType, int w, int h) throws Exception {
+        mTestConfig.mTestPixels = false;
+        doTest(false /* isGoog */, mimeType, w, h, NUMBER_OF_REPEAT);
+    }
+
+    private void doTestDefault(String mimeType, int w, int h) throws Exception {
+        mTestConfig.mTestResult = false;
+
+        String encoderName = getEncoderName(mimeType);
+        if (encoderName == null) {
+            Log.i(TAG, "Encoder for " + mimeType + " not found");
+            return;
+        }
+
+        String decoderName = getDecoderName(mimeType);
+        if (decoderName == null) {
+            Log.i(TAG, "Encoder for " + mimeType + " not found");
+            return;
+        }
+
+        doTestByName(encoderName, decoderName, mimeType, w, h, NUMBER_OF_REPEAT);
+    }
+
     /**
      * Run encoding / decoding test for given mimeType of codec
+     * @param isGoog test google or non-google codec.
      * @param mimeType like video/avc
      * @param w video width
      * @param h video height
      * @param numberRepeat how many times to repeat the encoding / decoding process
      */
-    private void doTest(String mimeType, int w, int h, int numberRepeat) throws Exception {
-        CodecInfo infoEnc = CodecInfo.getSupportedFormatInfo(mimeType, w, h, true /* encoder */);
+    private void doTest(boolean isGoog, String mimeType, int w, int h, int numberRepeat)
+            throws Exception {
+        String[] encoderNames = getEncoderName(mimeType, isGoog);
+        if (encoderNames.length == 0) {
+            Log.i(TAG, isGoog ? "Google " : "Non-google "
+                    + "encoder for " + mimeType + " not found");
+            return;
+        }
+
+        String[] decoderNames = getDecoderName(mimeType, isGoog);
+        if (decoderNames.length == 0) {
+            Log.i(TAG, isGoog ? "Google " : "Non-google "
+                    + "decoder for " + mimeType + " not found");
+            return;
+        }
+
+        for (String encoderName: encoderNames) {
+            for (String decoderName: decoderNames) {
+                doTestByName(encoderName, decoderName, mimeType, w, h, numberRepeat);
+            }
+        }
+    }
+
+    private void doTestByName(
+            String encoderName, String decoderName, String mimeType, int w, int h, int numberRepeat)
+            throws Exception {
+        CodecInfo infoEnc = CodecInfo.getSupportedFormatInfo(encoderName, mimeType, w, h);
         if (infoEnc == null) {
             Log.i(TAG, "Encoder " + mimeType + " with " + w + "," + h + " not supported");
             return;
         }
-        CodecInfo infoDec = CodecInfo.getSupportedFormatInfo(mimeType, w, h, false /* encoder */);
+        CodecInfo infoDec = CodecInfo.getSupportedFormatInfo(decoderName, mimeType, w, h);
         assertNotNull(infoDec);
         mVideoWidth = w;
         mVideoHeight = h;
@@ -196,14 +439,15 @@
             format.setInteger(MediaFormat.KEY_FRAME_RATE, infoEnc.mFps);
             mFrameRate = infoEnc.mFps;
             format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, KEY_I_FRAME_INTERVAL);
-            double encodingTime = runEncoder(VIDEO_AVC, format, TOTAL_FRAMES);
+
+            double encodingTime = runEncoder(encoderName, format, TOTAL_FRAMES);
             // re-initialize format for decoder
             format = new MediaFormat();
             format.setString(MediaFormat.KEY_MIME, mimeType);
             format.setInteger(MediaFormat.KEY_WIDTH, w);
             format.setInteger(MediaFormat.KEY_HEIGHT, h);
             format.setInteger(MediaFormat.KEY_COLOR_FORMAT, mDstColorFormat);
-            double[] decoderResult = runDecoder(VIDEO_AVC, format);
+            double[] decoderResult = runDecoder(decoderName, format);
             if (decoderResult == null) {
                 success = false;
             } else {
@@ -227,26 +471,52 @@
                 ResultUnit.FPS);
         getReportLog().printArray("encoder decoder", totalFpsResults, ResultType.HIGHER_BETTER,
                 ResultUnit.FPS);
+        getReportLog().printValue(mimeType + " encoder average fps for " + w + "x" + h,
+                Stat.getAverage(encoderFpsResults), ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        getReportLog().printValue(mimeType + " decoder average fps for " + w + "x" + h,
+                Stat.getAverage(decoderFpsResults), ResultType.HIGHER_BETTER, ResultUnit.FPS);
         getReportLog().printSummary("encoder decoder", Stat.getAverage(totalFpsResults),
                 ResultType.HIGHER_BETTER, ResultUnit.FPS);
         // make sure that rms error is not too big.
         for (int i = 0; i < numberRepeat; i++) {
-            assertTrue(decoderRmsErrorResults[i] < PIXEL_RMS_ERROR_MARGAIN);
+            if (decoderRmsErrorResults[i] >= mRmsErrorMargain) {
+                fail("rms error is bigger than the limit "
+                        + decoderRmsErrorResults[i] + " vs " + mRmsErrorMargain);
+            }
+        }
+
+        if (mTestConfig.mTestResult) {
+            Range<Double> reportedEncoderResults =
+                    CodecInfo.getAchievableFrameRatesFor(encoderName, mimeType, w, h);
+            Range<Double> reportedDecoderResults =
+                    CodecInfo.getAchievableFrameRatesFor(decoderName, mimeType, w, h);
+            if (reportedEncoderResults == null) {
+                fail("Failed to getAchievableFrameRatesFor "
+                        + encoderName + " " + mimeType + " " + w + "x" + h);
+            }
+            if (reportedDecoderResults == null) {
+                fail("Failed to getAchievableFrameRatesFor "
+                        + decoderName + " " + mimeType + " " + w + "x" + h);
+            }
+            if (!reportedEncoderResults.contains(Stat.getAverage(encoderFpsResults))) {
+                fail("Expecting achievable frame rate in the rang of " + reportedEncoderResults);
+            }
+            if (!reportedDecoderResults.contains(Stat.getAverage(decoderFpsResults))) {
+                fail("Expecting achievable frame rate in the rang of " + reportedDecoderResults);
+            }
         }
     }
 
     /**
      * run encoder benchmarking
-     * @param mimeType encoder type like video/avc
+     * @param encoderName encoder name
      * @param format format of media to encode
      * @param totalFrames total number of frames to encode
      * @return time taken in ms to encode the frames. This does not include initialization time.
      */
-    private double runEncoder(String mimeType, MediaFormat format, int totalFrames) {
+    private double runEncoder(String encoderName, MediaFormat format, int totalFrames) {
         MediaCodec codec = null;
         try {
-            MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-            String encoderName = mcl.findEncoderForFormat(format);
             codec = MediaCodec.createByCodecName(encoderName);
             codec.configure(
                     format,
@@ -254,9 +524,9 @@
                     null /* crypto */,
                     MediaCodec.CONFIGURE_FLAG_ENCODE);
         } catch (IllegalStateException e) {
-            Log.e(TAG, "codec '" + mimeType + "' failed configuration.");
+            Log.e(TAG, "codec '" + encoderName + "' failed configuration.");
             codec.release();
-            assertTrue("codec '" + mimeType + "' failed configuration.", false);
+            assertTrue("codec '" + encoderName + "' failed configuration.", false);
         } catch (IOException | NullPointerException e) {
             Log.i(TAG, "could not find codec for " + format);
             return Double.NaN;
@@ -536,24 +806,24 @@
         int l = info.size;
         ByteBuffer copied = ByteBuffer.allocate(l);
         output.get(copied.array(), 0, l);
-        mEncodedOutputBuffer.add(copied);
+        BufferInfo savedInfo = new BufferInfo();
+        savedInfo.set(0, l, info.presentationTimeUs, info.flags);
+        mEncodedOutputBuffer.addLast(Pair.create(copied, savedInfo));
         codec.releaseOutputBuffer(index, false /* render */);
     }
 
     /**
      * run encoder benchmarking with encoded stream stored from encoding phase
-     * @param mimeType encoder type like video/avc
+     * @param decoderName decoder name
      * @param format format of media to decode
      * @return returns length-2 array with 0: time for decoding, 1 : rms error of pixels
      */
-    private double[] runDecoder(String mimeType, MediaFormat format) {
-        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-        String decoderName = mcl.findDecoderForFormat(format);
+    private double[] runDecoder(String decoderName, MediaFormat format) {
         MediaCodec codec = null;
         try {
             codec = MediaCodec.createByCodecName(decoderName);
         } catch (IOException | NullPointerException e) {
-            Log.i(TAG, "could not find codec for " + format);
+            Log.i(TAG, "could not find decoder for " + format);
             return null;
         }
         codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);
@@ -577,15 +847,17 @@
                 if (inputBufIndex >= 0) {
                     ByteBuffer dstBuf = codecInputBuffers[inputBufIndex];
                     dstBuf.clear();
-                    ByteBuffer src = mEncodedOutputBuffer.get(inputBufferCount);
+                    ByteBuffer src = mEncodedOutputBuffer.get(inputBufferCount).first;
+                    BufferInfo srcInfo = mEncodedOutputBuffer.get(inputBufferCount).second;
                     int writeSize = src.capacity();
                     dstBuf.put(src.array(), 0, writeSize);
+
                     codec.queueInputBuffer(
                             inputBufIndex,
                             0 /* offset */,
                             writeSize,
-                            0,
-                            (inputLeft == 1) ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                            srcInfo.presentationTimeUs,
+                            srcInfo.flags);
                     inputLeft --;
                     inputBufferCount ++;
                 }
@@ -597,29 +869,48 @@
 
                 // only do YUV compare on EOS frame if the buffer size is none-zero
                 if (info.size > 0) {
-                    Point origin = getOrigin(outFrameCount);
-                    int i;
+                    if (mTestConfig.mTestPixels) {
+                        Point origin = getOrigin(outFrameCount);
+                        int i;
 
-                    // if decoder supports planar or semiplanar, check output with
-                    // ByteBuffer & Image each on half of the points
-                    int pixelCheckPerFrame = PIXEL_CHECK_PER_FRAME;
-                    if (!isDstFlexYUV()) {
-                        pixelCheckPerFrame /= 2;
-                        ByteBuffer buf = codec.getOutputBuffer(outputBufIndex);
-                        if (VERBOSE && (outFrameCount == 0)) {
-                            printByteBuffer("Y ", buf, 0, 20);
-                            printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight, 20);
-                            printByteBuffer("UV ", buf,
-                                    mVideoWidth * mVideoHeight + mVideoWidth * 60, 20);
+                        // if decoder supports planar or semiplanar, check output with
+                        // ByteBuffer & Image each on half of the points
+                        int pixelCheckPerFrame = PIXEL_CHECK_PER_FRAME;
+                        if (!isDstFlexYUV()) {
+                            pixelCheckPerFrame /= 2;
+                            ByteBuffer buf = codec.getOutputBuffer(outputBufIndex);
+                            if (VERBOSE && (outFrameCount == 0)) {
+                                printByteBuffer("Y ", buf, 0, 20);
+                                printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight, 20);
+                                printByteBuffer("UV ", buf,
+                                        mVideoWidth * mVideoHeight + mVideoWidth * 60, 20);
+                            }
+                            for (i = 0; i < pixelCheckPerFrame; i++) {
+                                int w = mRandom.nextInt(mVideoWidth);
+                                int h = mRandom.nextInt(mVideoHeight);
+                                getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
+                                getPixelValuesFromOutputBuffer(buf, w, h, decoded);
+                                if (VERBOSE) {
+                                    Log.i(TAG, outFrameCount + "-" + i + "- th round: ByteBuffer:"
+                                            + " expected "
+                                            + expected.mY + "," + expected.mU + "," + expected.mV
+                                            + " decoded "
+                                            + decoded.mY + "," + decoded.mU + "," + decoded.mV);
+                                }
+                                totalErrorSquared += expected.calcErrorSquared(decoded);
+                            }
                         }
+
+                        Image image = codec.getOutputImage(outputBufIndex);
+                        assertTrue(image != null);
                         for (i = 0; i < pixelCheckPerFrame; i++) {
                             int w = mRandom.nextInt(mVideoWidth);
                             int h = mRandom.nextInt(mVideoHeight);
                             getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
-                            getPixelValuesFromOutputBuffer(buf, w, h, decoded);
+                            getPixelValuesFromImage(image, w, h, decoded);
                             if (VERBOSE) {
-                                Log.i(TAG, outFrameCount + "-" + i + "- th round: ByteBuffer:"
-                                        + " expected "
+                                Log.i(TAG, outFrameCount + "-" + i + "- th round: FlexYUV:"
+                                        + " expcted "
                                         + expected.mY + "," + expected.mU + "," + expected.mV
                                         + " decoded "
                                         + decoded.mY + "," + decoded.mU + "," + decoded.mV);
@@ -627,23 +918,6 @@
                             totalErrorSquared += expected.calcErrorSquared(decoded);
                         }
                     }
-
-                    Image image = codec.getOutputImage(outputBufIndex);
-                    assertTrue(image != null);
-                    for (i = 0; i < pixelCheckPerFrame; i++) {
-                        int w = mRandom.nextInt(mVideoWidth);
-                        int h = mRandom.nextInt(mVideoHeight);
-                        getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
-                        getPixelValuesFromImage(image, w, h, decoded);
-                        if (VERBOSE) {
-                            Log.i(TAG, outFrameCount + "-" + i + "- th round: FlexYUV:"
-                                    + " expcted "
-                                    + expected.mY + "," + expected.mU + "," + expected.mV
-                                    + " decoded "
-                                    + decoded.mY + "," + decoded.mU + "," + decoded.mV);
-                        }
-                        totalErrorSquared += expected.calcErrorSquared(decoded);
-                    }
                     outFrameCount++;
                 }
                 codec.releaseOutputBuffer(outputBufIndex, false /* render */);
@@ -669,7 +943,9 @@
         codec.stop();
         codec.release();
         codec = null;
-        assertTrue(outFrameCount >= TOTAL_FRAMES);
+        if (outFrameCount < TOTAL_FRAMES) {
+            fail("Expecting " + TOTAL_FRAMES + " frames but get " + outFrameCount + " instead.");
+        }
         // divide by 3 as sum is done for Y, U, V.
         double errorRms = Math.sqrt(totalErrorSquared / PIXEL_CHECK_PER_FRAME / outFrameCount / 3);
         double[] result = { (double) finish - start, errorRms };
diff --git a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java
deleted file mode 100644
index ea1f685..0000000
--- a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.cts.jank.ui;
-
-import android.util.Log;
-import android.widget.ListView;
-
-import com.android.cts.jank.CtsJankTestBase;
-import com.android.uiautomator.core.UiScrollable;
-import com.android.uiautomator.core.UiSelector;
-import com.android.uiautomator.platform.SurfaceFlingerHelper;
-
-public class CtsDeviceJankUi extends CtsJankTestBase {
-    private final static String TAG = CtsDeviceJankUi.class.getName();
-    private final static String PACKAGE = "com.android.cts.ui";
-    private final static String COMPONENT =
-            PACKAGE + "/" + PACKAGE + ".ScrollingActivity";
-    private final static int NUM_ELEMENTS = 1000;
-    private static String APP_WINDOW_NAME = COMPONENT;
-
-    // TODO(stuartscott): expand deviceTests/ui app to have a more complex UI
-    /**
-     * Runs the ScrollingActivity and measures jank during a scroll.
-     */
-    public void testScrolling() throws Exception {
-        // Start activity command
-        final StringBuilder sb = new StringBuilder();
-        sb.append(String.format(START_CMD, COMPONENT));
-        sb.append(String.format(INTENT_INTEGER_EXTRA, "num_elements", NUM_ELEMENTS));
-        final String startCommand = sb.toString();
-        final String stopCommand = String.format(STOP_CMD, PACKAGE);
-
-        Log.i(TAG, "Start command: " + startCommand);
-        Log.i(TAG, "Stop command: " + stopCommand);
-
-        setIteration(NUM_ITERATIONS);
-        for (int i = 0; i < NUM_ITERATIONS; i++) {
-            // Stop any existing instances
-            runShellCommand(stopCommand);
-            // Start activity
-            runShellCommand(startCommand);
-
-            // Wait for the activity to start
-            sleep(SLEEP_TIME / 2);
-
-            UiScrollable list = new UiScrollable(
-                    new UiSelector().className(ListView.class.getName()));
-
-            // Start systrace
-            startTrace(mTestCaseName, i);
-
-            // Clear SurfaceFlinger buffer
-            Log.i(TAG, "Clearing SurfaceFlinger buffer");
-            SurfaceFlingerHelper.clearBuffer(APP_WINDOW_NAME);
-
-            list.flingToEnd(2);
-
-            // Dump SurfaceFlinger buffer
-            Log.i(TAG, "Dumping SurfaceFlinger buffer");
-            boolean result = SurfaceFlingerHelper.dumpFrameLatency(APP_WINDOW_NAME, true);
-            assertTrue("SurfaceFlingerHelper could not get timestamps", result);
-
-            // Stop systrace
-            endTrace();
-
-            // Record results
-            recordResults(mTestCaseName, i);
-        }
-        // Save aggregated results
-        saveResults(mTestCaseName);
-        // Stop any remaining instances
-        runShellCommand(stopCommand);
-    }
-}
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
deleted file mode 100644
index a07171e..0000000
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.android.cts.jank.ui;
-
-import com.android.cts.jank.CtsHostJankTest;
-import com.android.cts.util.AbiUtils;
-import java.io.File;
-
-public class CtsHostJankUi extends CtsHostJankTest {
-
-    private static final String APK_PACKAGE = "com.android.cts";
-    private static final String APK = "CtsDeviceUi.apk";
-    private static final String PACKAGE = "com.android.cts.jank.ui";
-    private static final String HOST_CLASS = CtsHostJankUi.class.getName();
-    private static final String DEVICE_CLASS = PACKAGE + ".CtsDeviceJankUi";
-    private static final String JAR_NAME = "CtsDeviceJank.jar";
-
-    public CtsHostJankUi() {
-        super(JAR_NAME, DEVICE_CLASS, HOST_CLASS);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        // Install the app.
-        mDevice.uninstallPackage(APK_PACKAGE);
-        File app = mBuild.getTestApp(APK);
-        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-        mDevice.installPackage(app, false, options);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        // Uninstall the app.
-        mDevice.uninstallPackage(APK_PACKAGE);
-        super.tearDown();
-    }
-
-    public void testScrolling() throws Exception {
-        runUiAutomatorTest("testScrolling");
-    }
-}
diff --git a/suite/cts/hostTests/uihost/appA/Android.mk b/suite/cts/hostTests/uihost/appA/Android.mk
index 3e76fdb..17f076f 100644
--- a/suite/cts/hostTests/uihost/appA/Android.mk
+++ b/suite/cts/hostTests/uihost/appA/Android.mk
@@ -26,8 +26,6 @@
 
 LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingAppA
 
-LOCAL_SDK_VERSION := 16
+LOCAL_SDK_VERSION := current
 
-include $(BUILD_CTS_PACKAGE)
-
-
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/suite/cts/hostTests/uihost/appB/Android.mk b/suite/cts/hostTests/uihost/appB/Android.mk
index 13af40f..ebb36d2 100644
--- a/suite/cts/hostTests/uihost/appB/Android.mk
+++ b/suite/cts/hostTests/uihost/appB/Android.mk
@@ -26,8 +26,6 @@
 
 LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingAppB
 
-LOCAL_SDK_VERSION := 16
+LOCAL_SDK_VERSION := current
 
-include $(BUILD_CTS_PACKAGE)
-
-
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/suite/cts/hostTests/uihost/control/Android.mk b/suite/cts/hostTests/uihost/control/Android.mk
index 3770918..4de9ae8 100644
--- a/suite/cts/hostTests/uihost/control/Android.mk
+++ b/suite/cts/hostTests/uihost/control/Android.mk
@@ -26,6 +26,6 @@
 
 LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingControl
 
-LOCAL_SDK_VERSION := 16
+LOCAL_SDK_VERSION := current
 
-include $(BUILD_CTS_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
index 894b824..2d33436 100644
--- a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
@@ -115,7 +115,9 @@
         @Override
         public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
             // necessary as testMetrics passed from CollectingTestListerner is empty
-            mCtsReport = testMetrics.get("CTS_TEST_RESULT");
+            if (testMetrics.containsKey("CTS_TEST_RESULT")) {
+                mCtsReport = testMetrics.get("CTS_TEST_RESULT");
+            }
             super.testEnded(test, testMetrics);
         }
     }
diff --git a/tests/JobScheduler/src/android/jobscheduler/MockJobService.java b/tests/JobScheduler/src/android/jobscheduler/MockJobService.java
index 38a753d..4f549f8 100644
--- a/tests/JobScheduler/src/android/jobscheduler/MockJobService.java
+++ b/tests/JobScheduler/src/android/jobscheduler/MockJobService.java
@@ -46,7 +46,7 @@
     public boolean onStartJob(JobParameters params) {
         Log.i(TAG, "Test job executing: " + params.getJobId());
 
-        TestEnvironment.getTestEnvironment().notifyExecution(params.getJobId());
+        TestEnvironment.getTestEnvironment().notifyExecution(params);
         return false;  // No work to do.
     }
 
@@ -63,10 +63,10 @@
     public static final class TestEnvironment {
 
         private static TestEnvironment kTestEnvironment;
-        public static final int INVALID_JOB_ID = -1;
+        //public static final int INVALID_JOB_ID = -1;
 
         private CountDownLatch mLatch;
-        private int mExecutedJobId;
+        private JobParameters mExecutedJobParameters;
 
         public static TestEnvironment getTestEnvironment() {
             if (kTestEnvironment == null) {
@@ -75,6 +75,10 @@
             return kTestEnvironment;
         }
 
+        public JobParameters getLastJobParameters() {
+            return mExecutedJobParameters;
+        }
+
         /**
          * Block the test thread, waiting on the JobScheduler to execute some previously scheduled
          * job on this service.
@@ -93,9 +97,9 @@
             return !mLatch.await(DEFAULT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
         }
 
-        private void notifyExecution(int jobId) {
-            Log.d(TAG, "Job executed:" + jobId);
-            mExecutedJobId = jobId;
+        private void notifyExecution(JobParameters params) {
+            Log.d(TAG, "Job executed:" + params.getJobId());
+            mExecutedJobParameters = params;
             mLatch.countDown();
         }
 
@@ -111,7 +115,7 @@
         /** Called in each testCase#setup */
         public void setUp() {
             mLatch = null;
-            mExecutedJobId = INVALID_JOB_ID;
+            mExecutedJobParameters = null;
         }
 
     }
diff --git a/tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java b/tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java
index a83f7a9..547b205 100644
--- a/tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java
+++ b/tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java
@@ -51,6 +51,8 @@
     private boolean mHasWifi;
     /** Whether the device running these tests supports telephony. */
     private boolean mHasTelephony;
+    /** Track whether WiFi was enabled in case we turn it off. */
+    private boolean mInitialWiFiState;
 
     private JobInfo.Builder mBuilder;
 
@@ -67,6 +69,14 @@
         mHasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
         mBuilder =
                 new JobInfo.Builder(CONNECTIVITY_JOB_ID, kJobServiceComponent);
+
+        mInitialWiFiState = mWifiManager.isWifiEnabled();
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        // Ensure that we leave WiFi in its previous state.
+        mWifiManager.setWifiEnabled(mInitialWiFiState);
     }
 
     // --------------------------------------------------------------------------------------------
@@ -202,6 +212,14 @@
         }
     }
 
+    /**
+     * Disconnect from WiFi in an attempt to connect to cellular data. Worth noting that this is
+     * best effort - there are no public APIs to force connecting to cell data. We disable WiFi
+     * and wait for a broadcast that we're connected to cell.
+     * We will not call into this function if the device doesn't support telephony.
+     * @see #mHasTelephony
+     * @see #checkDeviceSupportsMobileData()
+     */
     private void disconnectWifiToConnectToMobile() throws InterruptedException {
         if (mHasWifi && mWifiManager.isWifiEnabled()) {
             ConnectivityActionReceiver connectMobileReceiver =
diff --git a/tests/JobScheduler/src/android/jobscheduler/cts/TimingConstraintsTest.java b/tests/JobScheduler/src/android/jobscheduler/cts/TimingConstraintsTest.java
index ed9cadd..40b67c8 100644
--- a/tests/JobScheduler/src/android/jobscheduler/cts/TimingConstraintsTest.java
+++ b/tests/JobScheduler/src/android/jobscheduler/cts/TimingConstraintsTest.java
@@ -17,6 +17,7 @@
 
 import android.annotation.TargetApi;
 import android.app.job.JobInfo;
+import android.app.job.JobParameters;
 
 /**
  * Schedules jobs with various timing constraints and ensures that they are executed when
@@ -26,6 +27,8 @@
 public class TimingConstraintsTest extends ConstraintTest {
     private static final int TIMING_JOB_ID = TimingConstraintsTest.class.hashCode() + 0;
     private static final int CANCEL_JOB_ID = TimingConstraintsTest.class.hashCode() + 1;
+    private static final int EXPIRED_JOB_ID = TimingConstraintsTest.class.hashCode() + 2;
+    private static final int UNEXPIRED_JOB_ID = TimingConstraintsTest.class.hashCode() + 3;
 
     public void testScheduleOnce() throws Exception {
         JobInfo oneTimeJob = new JobInfo.Builder(TIMING_JOB_ID, kJobServiceComponent)
@@ -63,4 +66,44 @@
         assertTrue("Cancel failed: job executed when it shouldn't have.",
                 kTestEnvironment.awaitTimeout());
     }
+
+    /**
+     * Ensure that when a job is executed because its deadline has expired, that
+     * {@link JobParameters#isOverrideDeadlineExpired()} returns the correct value.
+     */
+    public void testJobParameters_expiredDeadline() throws Exception {
+
+        JobInfo deadlineJob =
+                new JobInfo.Builder(EXPIRED_JOB_ID, kJobServiceComponent)
+                        .setOverrideDeadline(2000L)
+                        .build();
+        kTestEnvironment.setExpectedExecutions(1);
+        mJobScheduler.schedule(deadlineJob);
+        assertTrue("Failed to execute deadline job", kTestEnvironment.awaitExecution());
+        assertTrue("Job that had its deadline expire didn't have" +
+                        " JobParameters#isOverrideDeadlineExpired=true",
+                kTestEnvironment.getLastJobParameters().isOverrideDeadlineExpired());
+    }
+
+
+    /**
+     * Ensure that when a job is executed and its deadline hasn't expired, that
+     * {@link JobParameters#isOverrideDeadlineExpired()} returns the correct value.
+     */
+    public void testJobParameters_unexpiredDeadline() throws Exception {
+
+        JobInfo deadlineJob =
+                new JobInfo.Builder(UNEXPIRED_JOB_ID, kJobServiceComponent)
+                        .setMinimumLatency(500L)
+                        .setRequiresCharging(true)
+                        .build();
+        kTestEnvironment.setExpectedExecutions(1);
+        mJobScheduler.schedule(deadlineJob);
+        // Run everything by pretending the device was just plugged in.
+        sendExpediteStableChargingBroadcast();
+        assertTrue("Failed to execute non-deadline job", kTestEnvironment.awaitExecution());
+        assertFalse("Job that ran early (unexpired) didn't have" +
+                        " JobParameters#isOverrideDeadlineExpired=false",
+                kTestEnvironment.getLastJobParameters().isOverrideDeadlineExpired());
+    }
 }
\ No newline at end of file
diff --git a/tests/acceleration/Android.mk b/tests/acceleration/Android.mk
index a6d6022..f36b64b 100644
--- a/tests/acceleration/Android.mk
+++ b/tests/acceleration/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/accessibility/Android.mk b/tests/accessibility/Android.mk
index 43fa291..bddbb58 100644
--- a/tests/accessibility/Android.mk
+++ b/tests/accessibility/Android.mk
@@ -28,4 +28,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/app/Android.mk b/tests/app/Android.mk
index 69bf590..f4f0a13 100644
--- a/tests/app/Android.mk
+++ b/tests/app/Android.mk
@@ -23,7 +23,7 @@
 
 LOCAL_PROGUARD_ENABLED := disabled
 
-LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common
+LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common org.apache.http.legacy
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ctstestserver
 
@@ -32,4 +32,4 @@
 
 LOCAL_PACKAGE_NAME := CtsAppTestStubs
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/app/AndroidManifest.xml b/tests/app/AndroidManifest.xml
index 0d61e20..8d7729e 100644
--- a/tests/app/AndroidManifest.xml
+++ b/tests/app/AndroidManifest.xml
@@ -49,6 +49,7 @@
                 android:name="android.app.cts.MockApplication"
                 android:supportsRtl="true">
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
 
         <activity android:name="android.app.cts.ActionBarActivity" />
 
diff --git a/tests/core/runner/src/com/android/cts/runner/CtsTestRunListener.java b/tests/core/runner/src/com/android/cts/runner/CtsTestRunListener.java
index 080c08e..d7bda32 100644
--- a/tests/core/runner/src/com/android/cts/runner/CtsTestRunListener.java
+++ b/tests/core/runner/src/com/android/cts/runner/CtsTestRunListener.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.support.test.internal.runner.listener.InstrumentationRunListener;
+import android.text.TextUtils;
 import android.util.Log;
 
 import junit.framework.TestCase;
@@ -28,7 +29,10 @@
 import org.junit.runner.Description;
 import org.junit.runner.notification.RunListener;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.net.Authenticator;
@@ -114,6 +118,31 @@
         Log.d(TAG, "Total memory  : " + total);
         Log.d(TAG, "Used memory   : " + used);
         Log.d(TAG, "Free memory   : " + free);
+
+        String tempdir = System.getProperty("java.io.tmpdir", "");
+        if (!TextUtils.isEmpty(tempdir)) {
+            String[] commands = {"df", tempdir};
+            BufferedReader in = null;
+            try {
+                Process proc = runtime.exec(commands);
+                in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+                String line;
+                while ((line = in.readLine()) != null) {
+                    Log.d(TAG, line);
+                }
+            } catch (IOException e) {
+                // Well, we tried
+            } finally {
+                if (in != null) {
+                    try {
+                        in.close();
+                    } catch (IOException e) {
+                        // Meh
+                    }
+                }
+            }
+        }
+
         Log.d(TAG, "Now executing : " + testClass.getName());
     }
 
@@ -161,8 +190,8 @@
             mSslSocketFactory = HttpsURLConnection.getDefaultSSLSocketFactory();
 
             mProperties.setProperty("user.home", "");
-            mProperties.setProperty("java.io.tmpdir", System.getProperty("java.io.tmpdir"));
-            // The CDD mandates that devices that support WiFi are the only ones that will have 
+            mProperties.setProperty("java.io.tmpdir", context.getCacheDir().getAbsolutePath());
+            // The CDD mandates that devices that support WiFi are the only ones that will have
             // multicast.
             PackageManager pm = context.getPackageManager();
             mProperties.setProperty("android.cts.device.multicast",
diff --git a/tests/deviceadmin/Android.mk b/tests/deviceadmin/Android.mk
index 9ab9cb8..2e89d34 100644
--- a/tests/deviceadmin/Android.mk
+++ b/tests/deviceadmin/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index a51c1d9..ecb7050 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -1,12 +1,5 @@
 [
 {
-  description: "testWindowContentFrameStats is flaky without 75b55d0846159543aafc1b7420915497fce9b3f1",
-  names: [
-    "android.app.uiautomation.cts.UiAutomationTest#testWindowContentFrameStats"
-  ],
-  bug: 18039218
-},
-{
   description: "the UsageStats is not yet stable enough",
   names: [
     "android.app.usage.cts.UsageStatsTest"
@@ -14,13 +7,6 @@
   bug: 17536113
 },
 {
-  description: "the ConnectivityConstraintTest are not yet stable",
-  names: [
-    "android.jobscheduler.cts.ConnectivityConstraintTest"
-  ],
-  bug: 18117279
-},
-{
   description: "tests a fragile by nature as they rely on hardcoded behavior",
   names: [
     "android.accessibilityservice.cts.AccessibilityTextTraversalTest#testActionNextAndPreviousAtGranularityPageOverText",
@@ -83,18 +69,24 @@
   bug: 16720689
 },
 {
-  description: "Disable WebGL conformance tests in CTS",
+  description: "test can only run properly on a user build device when the bug is resolved",
   names: [
-    "android.webgl.cts.WebGLTest"
+    "android.appwidget.cts.AppWidgetTest#testAppWidgetProviderCallbacks",
+    "android.appwidget.cts.AppWidgetTest#testBindAppWidget",
+    "android.appwidget.cts.AppWidgetTest#testCollectionWidgets",
+    "android.appwidget.cts.AppWidgetTest#testDeleteHost",
+    "android.appwidget.cts.AppWidgetTest#testDeleteHosts",
+    "android.appwidget.cts.AppWidgetTest#testGetAppWidgetIds",
+    "android.appwidget.cts.AppWidgetTest#testGetAppWidgetInfo",
+    "android.appwidget.cts.AppWidgetTest#testGetAppWidgetOptions",
+    "android.appwidget.cts.AppWidgetTest#testPartiallyUpdateAppWidgetViaWidgetId",
+    "android.appwidget.cts.AppWidgetTest#testPartiallyUpdateAppWidgetViaWidgetIds",
+    "android.appwidget.cts.AppWidgetTest#testTwoAppWidgetProviderCallbacks",
+    "android.appwidget.cts.AppWidgetTest#testUpdateAppWidgetViaComponentName",
+    "android.appwidget.cts.AppWidgetTest#testUpdateAppWidgetViaWidgetId",
+    "android.appwidget.cts.AppWidgetTest#testUpdateAppWidgetViaWidgetIds"
   ],
-  bug: 20937460
-},
-{
-  description: "WebGL test uniformMatrixBadArgs is too strict. Disabled until it's fixed upstream.",
-  names: [
-    "android.webgl.cts.WebGLTest#test_conformance_more_functions_uniformMatrixBadArgs_html"
-  ],
-  bug: 18638404
+  bug: 17993121
 },
 {
   description: "permissions for the API previously used in the test has changed, making it impossible to pass",
@@ -152,179 +144,6 @@
   bug: 17605875
 },
 {
-  description: "Failures on these tests are known on several devices.",
-  names: [
-    "android.hardware.cts.SensorBatchingTests#testAccelerometer_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testAccelerometer_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testAccelerometer_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testAccelerometer_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testMagneticField_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testMagneticField_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testMagneticField_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testMagneticField_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testOrientation_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testOrientation_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testOrientation_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testOrientation_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGyroscope_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGyroscope_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGyroscope_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGyroscope_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testPressure_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testPressure_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testPressure_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testPressure_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGravity_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGravity_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGravity_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGravity_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testRotationVector_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testRotationVector_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testRotationVector_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testRotationVector_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGameRotationVector_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGameRotationVector_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGameRotationVector_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGameRotationVector_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGyroscopeUncalibrated_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGyroscopeUncalibrated_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGyroscopeUncalibrated_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGyroscopeUncalibrated_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGeomagneticRotationVector_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGeomagneticRotationVector_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGeomagneticRotationVector_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGeomagneticRotationVector_50hz_flush",
-    "android.hardware.cts.SensorIntegrationTests#testSensorsWithSeveralClients",
-    "android.hardware.cts.SensorIntegrationTests#testSensorsMovingRates",
-    "android.hardware.cts.SensorIntegrationTests#testAccelerometerAccelerometerStopping",
-    "android.hardware.cts.SensorIntegrationTests#testAccelerometerGyroscopeStopping",
-    "android.hardware.cts.SensorIntegrationTests#testAccelerometerMagneticFieldStopping",
-    "android.hardware.cts.SensorIntegrationTests#testGyroscopeAccelerometerStopping",
-    "android.hardware.cts.SensorIntegrationTests#testGyroscopeGyroscopeStopping",
-    "android.hardware.cts.SensorIntegrationTests#testGyroscopeMagneticFieldStopping",
-    "android.hardware.cts.SensorIntegrationTests#testMagneticFieldAccelerometerStopping",
-    "android.hardware.cts.SensorIntegrationTests#testMagneticFieldGyroscopeStopping",
-    "android.hardware.cts.SensorIntegrationTests#testMagneticFieldMagneticFieldStopping",
-    "android.hardware.cts.SingleSensorTests#testSensorProperties",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_fastest",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_100hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_200hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_50hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_25hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_15hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_10hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_5hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_1hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_fastest",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_200hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_100hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_50hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_25hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_15hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_10hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_5hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_1hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_fastest",
-    "android.hardware.cts.SingleSensorTests#testOrientation_200hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_100hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_50hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_25hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_15hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_10hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_5hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_1hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_fastest",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_200hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_100hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_50hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_25hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_15hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_10hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_5hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_1hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_fastest",
-    "android.hardware.cts.SingleSensorTests#testPressure_200hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_100hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_50hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_25hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_15hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_10hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_5hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_1hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_fastest",
-    "android.hardware.cts.SingleSensorTests#testGravity_200hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_100hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_50hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_25hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_15hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_10hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_5hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_1hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_fastest",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_200hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_100hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_50hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_25hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_15hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_10hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_5hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_1hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_fastest",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_200hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_100hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_50hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_25hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_15hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_10hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_5hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_1hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_fastest",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_200hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_100hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_50hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_25hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_15hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_10hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_5hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_1hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_fastest",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_200hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_100hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_50hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_25hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_15hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_10hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_5hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_1hz",
-    "android.hardware.cts.SingleSensorTests#testGeomagneticRotationVector_fastest",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_200hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_100hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_50hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_25hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_15hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_10hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_5hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_1hz",
-    "android.hardware.cts.SensorTest#testSensorTimeStamps"
-  ],
-  bug: 17675466
-},
-{
-  description: "tests will soon become mandatory",
-  names: [
-    "android.hardware.cts.SensorTest#testBatchAndFlush"
-  ],
-  bug: 18958411
-},
-{
   description: "This test failed on hw decoder that doesn't output frame with the configured format.",
   names: [
     "android.media.cts.ImageReaderDecoderTest#testHwAVCDecode360pForFlexibleYuv"
diff --git a/tests/print/Android.mk b/tests/print/Android.mk
deleted file mode 100644
index fea7dc0..0000000
--- a/tests/print/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2014 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-##################################################
-# Build the print instrument library
-##################################################
-include $(CLEAR_VARS)
-LOCAL_MODULE := CtsPrintInstrument
-LOCAL_SRC_FILES := $(call all-subdir-java-files) \
-    src/android/print/cts/IPrivilegedOperations.aidl
-LOCAL_MODULE_TAGS := optional
-LOCAL_DEX_PREOPT := false
-
-include $(BUILD_JAVA_LIBRARY)
-
-# Copy the shell script to run the print instrument Jar to the CTS out folder.
-$(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar : $(LOCAL_BUILT_MODULE) | $(ACP) 
-	$(copy-file-to-target)
-
-# Copy the built print instrument library Jar to the CTS out folder.
-$(CTS_TESTCASES_OUT)/print-instrument : $(LOCAL_PATH)/print-instrument | $(ACP)
-	$(copy-file-to-target)
-
diff --git a/tests/print/print-instrument b/tests/print/print-instrument
deleted file mode 100755
index a79cb8a..0000000
--- a/tests/print/print-instrument
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2014 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Script to start "print-instrument" on the device
-#
-# The script sets up an alternative dalvik cache when running as
-# non-root. Jar files needs to be dexopt'd to run in Dalvik. For
-# plain jar files, this is done at first use. shell user does not
-# have write permission to default system Dalvik cache so we
-# redirect to an alternative cache.
-
-RUN_BASE=/data/local/tmp
-
-# If not running as root, use an alternative dex cache.
-if [ ${USER_ID} -ne 0 ]; then
-  tmp_cache=${RUN_BASE}/dalvik-cache
-  if [ ! -d ${tmp_cache} ]; then
-    mkdir -p ${tmp_cache}
-  fi
-  export ANDROID_DATA=${RUN_BASE}
-fi
-
-# Run print-instrument.
-export CLASSPATH=${RUN_BASE}/CtsPrintInstrument.jar
-
-exec app_process ${RUN_BASE} android.print.cts.PrintInstrument ${@}
diff --git a/tests/print/src/android/print/cts/PrintInstrument.java b/tests/print/src/android/print/cts/PrintInstrument.java
deleted file mode 100644
index 1c568a1..0000000
--- a/tests/print/src/android/print/cts/PrintInstrument.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.print.cts;
-
-import android.app.ActivityManagerNative;
-import android.app.IActivityManager;
-import android.app.IInstrumentationWatcher;
-import android.app.Instrumentation;
-import android.app.UiAutomationConnection;
-import android.content.ComponentName;
-import android.content.pm.IPackageDataObserver;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.util.AndroidException;
-import android.view.IWindowManager;
-
-import com.android.internal.os.BaseCommand;
-
-import java.io.PrintStream;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-public final class PrintInstrument extends BaseCommand {
-
-    private static final String ARG_PRIVILEGED_OPS = "ARG_PRIVILEGED_OPS";
-
-    private IActivityManager mAm;
-
-    public static void main(String[] args) {
-        PrintInstrument instrumenter = new PrintInstrument();
-        instrumenter.run(args);
-    }
-
-    @Override
-    public void onRun() throws Exception {
-        mAm = ActivityManagerNative.getDefault();
-        if (mAm == null) {
-            System.err.println(NO_SYSTEM_ERROR_CODE);
-            throw new AndroidException("Can't connect to activity manager;"
-                    + " is the system running?");
-        }
-
-        String op = nextArgRequired();
-
-        if (op.equals("instrument")) {
-            runInstrument();
-        } else {
-            showError("Error: unknown command '" + op + "'");
-        }
-    }
-
-    @Override
-    public void onShowUsage(PrintStream out) {
-        /* do nothing */
-    }
-
-    @SuppressWarnings("deprecation")
-    private void runInstrument() throws Exception {
-        String profileFile = null;
-        boolean wait = false;
-        boolean rawMode = false;
-        boolean no_window_animation = false;
-        int userId = UserHandle.USER_CURRENT;
-        Bundle args = new Bundle();
-        String argKey = null, argValue = null;
-        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
-
-        String opt;
-        while ((opt=nextOption()) != null) {
-            if (opt.equals("-p")) {
-                profileFile = nextArgRequired();
-            } else if (opt.equals("-w")) {
-                wait = true;
-            } else if (opt.equals("-r")) {
-                rawMode = true;
-            } else if (opt.equals("-e")) {
-                argKey = nextArgRequired();
-                argValue = nextArgRequired();
-                args.putString(argKey, argValue);
-            } else if (opt.equals("--no_window_animation")
-                    || opt.equals("--no-window-animation")) {
-                no_window_animation = true;
-            } else if (opt.equals("--user")) {
-                userId = parseUserArg(nextArgRequired());
-            } else {
-                System.err.println("Error: Unknown option: " + opt);
-                return;
-            }
-        }
-
-        if (userId == UserHandle.USER_ALL) {
-            System.err.println("Error: Can't start instrumentation with user 'all'");
-            return;
-        }
-
-        String cnArg = nextArgRequired();
-        ComponentName cn = ComponentName.unflattenFromString(cnArg);
-        if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg);
-
-        InstrumentationWatcher watcher = null;
-        UiAutomationConnection connection = null;
-        if (wait) {
-            watcher = new InstrumentationWatcher();
-            watcher.setRawOutput(rawMode);
-            connection = new UiAutomationConnection();
-        }
-
-        float[] oldAnims = null;
-        if (no_window_animation) {
-            oldAnims = wm.getAnimationScales();
-            wm.setAnimationScale(0, 0.0f);
-            wm.setAnimationScale(1, 0.0f);
-        }
-
-        args.putIBinder(ARG_PRIVILEGED_OPS, new PrivilegedOperations(mAm));
-
-        if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId, null)) {
-            throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
-        }
-
-        if (watcher != null) {
-            if (!watcher.waitForFinish()) {
-                System.out.println("INSTRUMENTATION_ABORTED: System has crashed.");
-            }
-        }
-
-        if (oldAnims != null) {
-            wm.setAnimationScales(oldAnims);
-        }
-    }
-
-    private int parseUserArg(String arg) {
-        int userId;
-        if ("all".equals(arg)) {
-            userId = UserHandle.USER_ALL;
-        } else if ("current".equals(arg) || "cur".equals(arg)) {
-            userId = UserHandle.USER_CURRENT;
-        } else {
-            userId = Integer.parseInt(arg);
-        }
-        return userId;
-    }
-
-    private class InstrumentationWatcher extends IInstrumentationWatcher.Stub {
-        private boolean mFinished = false;
-        private boolean mRawMode = false;
-
-        /**
-         * Set or reset "raw mode".  In "raw mode", all bundles are dumped.  In "pretty mode",
-         * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that.
-         * @param rawMode true for raw mode, false for pretty mode.
-         */
-        public void setRawOutput(boolean rawMode) {
-            mRawMode = rawMode;
-        }
-
-        @Override
-        public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) {
-            synchronized (this) {
-                // pretty printer mode?
-                String pretty = null;
-                if (!mRawMode && results != null) {
-                    pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT);
-                }
-                if (pretty != null) {
-                    System.out.print(pretty);
-                } else {
-                    if (results != null) {
-                        for (String key : results.keySet()) {
-                            System.out.println(
-                                    "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key));
-                        }
-                    }
-                    System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode);
-                }
-                notifyAll();
-            }
-        }
-
-        @Override
-        public void instrumentationFinished(ComponentName name, int resultCode,
-                Bundle results) {
-            synchronized (this) {
-                // pretty printer mode?
-                String pretty = null;
-                if (!mRawMode && results != null) {
-                    pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT);
-                }
-                if (pretty != null) {
-                    System.out.println(pretty);
-                } else {
-                    if (results != null) {
-                        for (String key : results.keySet()) {
-                            System.out.println(
-                                    "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key));
-                        }
-                    }
-                    System.out.println("INSTRUMENTATION_CODE: " + resultCode);
-                }
-                mFinished = true;
-                notifyAll();
-            }
-        }
-
-        public boolean waitForFinish() {
-            synchronized (this) {
-                while (!mFinished) {
-                    try {
-                        if (!mAm.asBinder().pingBinder()) {
-                            return false;
-                        }
-                        wait(1000);
-                    } catch (InterruptedException e) {
-                        throw new IllegalStateException(e);
-                    }
-                }
-            }
-            return true;
-        }
-    }
-
-    private static final class PrivilegedOperations extends IPrivilegedOperations.Stub {
-        private final IActivityManager mAm;
-
-        public PrivilegedOperations(IActivityManager am) {
-            mAm = am;
-        }
-
-        @Override
-        public boolean clearApplicationUserData(final String clearedPackageName)
-                throws RemoteException {
-            final long identity = Binder.clearCallingIdentity();
-            try {
-                final AtomicBoolean success = new AtomicBoolean();
-                final CountDownLatch completionLatch = new CountDownLatch(1);
-
-                mAm.clearApplicationUserData(clearedPackageName,
-                        new IPackageDataObserver.Stub() {
-                            @Override
-                            public void onRemoveCompleted(String packageName, boolean succeeded) {
-                                if (clearedPackageName.equals(packageName) && succeeded) {
-                                    success.set(true);
-                                } else {
-                                    success.set(false);
-                                }
-                                completionLatch.countDown();
-                            }
-                }, UserHandle.USER_CURRENT);
-
-                try {
-                    completionLatch.await();
-                } catch (InterruptedException ie) {
-                    /* ignore */
-                }
-
-                return success.get();
-            } finally {
-                Binder.restoreCallingIdentity(identity);
-            }
-        }
-    }
-}
diff --git a/tests/tests/accessibility/Android.mk b/tests/tests/accessibility/Android.mk
index 9f98b16..bb943ee 100644
--- a/tests/tests/accessibility/Android.mk
+++ b/tests/tests/accessibility/Android.mk
@@ -26,7 +26,4 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
 
-# This test runner sets up/cleans up the device before/after running the tests.
-LOCAL_CTS_TEST_RUNNER := com.android.cts.tradefed.testtype.AccessibilityTestRunner
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/accessibility/AndroidTest.xml b/tests/tests/accessibility/AndroidTest.xml
new file mode 100644
index 0000000..7832508
--- /dev/null
+++ b/tests/tests/accessibility/AndroidTest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Base config for CTS package preparer">
+    <include name="common-config" />
+    <option name="run-command:run-command" value="settings put secure enabled_accessibility_services android.view.accessibility.services/.SpeakingAccessibilityService:android.view.accessibility.services/.VibratingAccessibilityService" />
+    <option name="run-command:run-command" value="settings put secure touch_exploration_granted_accessibility_services android.view.accessibility.services/.SpeakingAccessibilityService:android.view.accessibility.services/.VibratingAccessibilityService" />
+    <option name="run-command:run-command" value="settings put secure accessibility_enabled 1" />
+    <option name="run-command:teardown-command" value="settings put secure enabled_accessibility_services &quot;&quot;" />
+    <option name="run-command:teardown-command" value="settings put secure touch_exploration_granted_accessibility_services &quot;&quot;" />
+    <option name="run-command:teardown-command" value="settings put secure accessibility_enabled 0" />
+    <option name="cts-apk-installer:test-file-name" value="CtsSomeAccessibilityServices.apk" />
+</configuration>
diff --git a/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java b/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
index b2a48e6..c582c79 100644
--- a/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
+++ b/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
@@ -1063,6 +1063,95 @@
     }
 
     /**
+     * Tests the setting of lastAuthenticatedTime on adding account
+     */
+    public void testLastAuthenticatedTimeAfterAddAccount() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+        assertTrue(addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD) > 0);
+    }
+
+    /**
+     * Test confirmCredentials() for account not on device. Just that no error
+     * should be thrown.
+     */
+    public void testConfirmCredentialsAccountNotOnDevice() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+
+        Account account = new Account("AccountNotOnThisDevice", ACCOUNT_TYPE);
+        AccountManagerFuture<Bundle> futureBundle = am.confirmCredentials(account,
+                OPTIONS_BUNDLE,
+                mActivity,
+                null /* callback */,
+                null /* handler */);
+
+        futureBundle.getResult();
+    }
+
+    /**
+     * Tests the setting of lastAuthenticatedTime on confirmCredentials being
+     * successful.
+     */
+    public void testLastAuthenticatedTimeAfterConfirmCredentialsSuccess() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+
+        long accountAddTime = addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD);
+
+        // Now this confirm credentials call returns true, which in turn
+        // should update the last authenticated timestamp.
+        Bundle result = am.confirmCredentials(ACCOUNT,
+                OPTIONS_BUNDLE, /* options */
+                null, /* activity */
+                null /* callback */,
+                null /* handler */).getResult();
+        long confirmedCredTime = result.getLong(
+                AccountManager.KEY_LAST_AUTHENTICATED_TIME, -1);
+        assertTrue(confirmedCredTime > accountAddTime);
+    }
+
+    /**
+     * Tests the setting of lastAuthenticatedTime on updateCredentials being
+     * successful.
+     */
+    public void testLastAuthenticatedTimeAfterUpdateCredentialsSuccess() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+
+        long accountAddTime = addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD);
+
+        am.updateCredentials(ACCOUNT,
+                AUTH_TOKEN_TYPE,
+                OPTIONS_BUNDLE,
+                mActivity,
+                null /* callback */,
+                null /* handler */).getResult();
+        long updateCredTime = getLastAuthenticatedTime(ACCOUNT);
+        assertTrue(updateCredTime > accountAddTime);
+    }
+
+    /**
+     * Tests the setting of lastAuthenticatedTime on accountAuthenticated being
+     * successful.
+     */
+    public void testLastAuthenticatedTimeAfterAccountAuthenticated() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+        long accountAddTime = addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD);
+        mockAuthenticator.callAccountAuthenticated();
+        long accountAuthenticatedTime = getLastAuthenticatedTime(ACCOUNT);
+        assertTrue(accountAuthenticatedTime > accountAddTime);
+    }
+
+    /**
+     * Tests the setting of lastAuthenticatedTime on setPassword being
+     * successful.
+     */
+    public void testLastAuthenticatedTimeAfterSetPassword() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+        long accountAddTime = addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD);
+        mockAuthenticator.callSetPassword();
+        long setPasswordTime = getLastAuthenticatedTime(ACCOUNT);
+        assertTrue(setPasswordTime > accountAddTime);
+    }
+
+    /**
      * Test confirmCredentials() with callback
      */
     public void testConfirmCredentialsWithCallbackAndHandler() throws IOException,
@@ -1109,11 +1198,11 @@
                 callback,
                 handler);
 
-        futureBundle.getResult();
+        // futureBundle.getResult();
 
         // Wait with timeout for the callback to do its work
         try {
-            latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+            latch.await(3 * LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
         } catch (InterruptedException e) {
             fail("should not throw an InterruptedException");
         }
@@ -1519,6 +1608,26 @@
         waitForLatch(latch);
     }
 
+    private long getLastAuthenticatedTime(Account account) throws OperationCanceledException,
+            AuthenticatorException, IOException {
+        Bundle options = new Bundle();
+        options.putBoolean(MockAccountAuthenticator.KEY_RETURN_INTENT, true);
+        // Not really confirming, but a way to get last authenticated timestamp
+        Bundle result = am.confirmCredentials(ACCOUNT,
+                options,// OPTIONS_BUNDLE,
+                null, /* activity */
+                null /* callback */,
+                null /* handler */).getResult();
+        return result.getLong(
+                AccountManager.KEY_LAST_AUTHENTICATED_TIME, -1);
+    }
+
+    private long addAccountAndReturnAccountAddedTime(Account account, String password)
+            throws OperationCanceledException, AuthenticatorException, IOException {
+        addAccountExplicitly(account, password, null /* userData */);
+        return getLastAuthenticatedTime(account);
+    }
+
     /**
      * Tests that AccountManagerService is properly caching data.
      */
diff --git a/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java b/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
index b5804d9..eec4eff 100644
--- a/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
+++ b/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
@@ -35,6 +35,9 @@
     public static String KEY_ACCOUNT_INFO = "key_account_info";
     public static String KEY_ACCOUNT_AUTHENTICATOR_RESPONSE = "key_account_authenticator_response";
     public static String ACCOUNT_NAME_FOR_NEW_REMOVE_API = "call new removeAccount api";
+    // Key for triggering return intent flow
+    public static String KEY_RETURN_INTENT = "return an intent";
+    public static String ACCOUNT_NAME_FOR_NEW_REMOVE_API1 = "call new removeAccount api";
 
     private final Context mContext;
     AccountAuthenticatorResponse mResponse;
@@ -96,6 +99,16 @@
         mFeatures = null;
     }
 
+    public void callAccountAuthenticated() {
+        AccountManager am = AccountManager.get(mContext);
+        am.notifyAccountAuthenticated(mAccount);
+    }
+
+    public void callSetPassword() {
+        AccountManager am = AccountManager.get(mContext);
+        am.setPassword(mAccount, "password");
+    }
+
     private Bundle createResultBundle() {
         Bundle result = new Bundle();
         result.putString(AccountManager.KEY_ACCOUNT_NAME, AccountManagerTest.ACCOUNT_NAME);
@@ -163,7 +176,13 @@
         this.mOptionsConfirmCredentials = options;
 
         Bundle result = new Bundle();
-        result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+        if (options.containsKey(KEY_RETURN_INTENT)) {
+            Intent intent = new Intent();
+            intent.setClassName("android.accounts.cts", "android.accounts.cts.AccountDummyActivity");
+            result.putParcelable(AccountManager.KEY_INTENT, intent);
+        } else {
+            result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+        }
 
         return result;
     }
diff --git a/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java b/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
index 513b67e..41332c7 100644
--- a/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
+++ b/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
@@ -679,6 +679,19 @@
         }
     }
 
+    public void testInstallCaCert_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testInstallCaCert_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.installCaCert(null, TEST_CA_STRING1.getBytes());
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testUninstallCaCert_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testUninstallCaCert_failIfNotProfileOwner");
@@ -693,6 +706,19 @@
         }
     }
 
+    public void testUninstallCaCert_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testUninstallCaCert_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.uninstallCaCert(null, TEST_CA_STRING1.getBytes());
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testGetInstalledCaCerts_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testGetInstalledCaCerts_failIfNotProfileOwner");
@@ -706,6 +732,19 @@
         }
     }
 
+    public void testGetInstalledCaCerts_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testGetInstalledCaCerts_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.getInstalledCaCerts(null);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testHasCaCertInstalled_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testHasCaCertInstalled_failIfNotProfileOwner");
@@ -720,6 +759,19 @@
         }
     }
 
+    public void testHasCaCertInstalled_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testHasCaCertInstalled_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.hasCaCertInstalled(null, TEST_CA_STRING1.getBytes());
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testUninstallAllUserCaCerts_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testUninstallAllUserCaCerts_failIfNotProfileOwner");
@@ -733,6 +785,19 @@
         }
     }
 
+    public void testUninstallAllUserCaCerts_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testUninstallAllUserCaCerts_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.uninstallAllUserCaCerts(null);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testSetScreenCaptureDisabled_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testSetScreenCaptureDisabled_failIfNotProfileOwner");
@@ -871,6 +936,19 @@
         }
     }
 
+    public void testSetBluetoothContactSharingDisabled_failIfNotProfileOwner() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testSetBluetoothContactSharingDisabled_failIfNotProfileOwner");
+            return;
+        }
+        try {
+            mDevicePolicyManager.setBluetoothContactSharingDisabled(mComponent, true);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException e) {
+            assertProfileOwnerMessage(e.getMessage());
+        }
+    }
+
     public void testSetPermittedInputMethods_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testSetPermittedInputMethods_failIfNotProfileOwner");
@@ -948,4 +1026,30 @@
         assertTrue("Password '" + password + "' failed on " + restriction, passwordResetResult);
         assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
     }
+
+    public void testSetDelegatedCertInstaller_failIfNotProfileOwner() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testSetDelegatedCertInstaller_failIfNotProfileOwner");
+            return;
+        }
+        try {
+            mDevicePolicyManager.setCertInstallerPackage(mComponent, "com.test.package");
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException e) {
+            assertProfileOwnerMessage(e.getMessage());
+        }
+    }
+
+    public void testGetDelegatedCertInstaller_failIfNotProfileOwner() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testGetDelegatedCertInstaller_failIfNotProfileOwner");
+            return;
+        }
+        try {
+            mDevicePolicyManager.getCertInstallerPackage(mComponent);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException e) {
+            assertProfileOwnerMessage(e.getMessage());
+        }
+    }
 }
diff --git a/tests/tests/app/Android.mk b/tests/tests/app/Android.mk
index 39be0dc..4a3d31f 100644
--- a/tests/tests/app/Android.mk
+++ b/tests/tests/app/Android.mk
@@ -21,7 +21,7 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common
+LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common org.apache.http.legacy
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ctstestserver
 
diff --git a/tests/tests/app/AndroidManifest.xml b/tests/tests/app/AndroidManifest.xml
index 08b0dda..231727f 100644
--- a/tests/tests/app/AndroidManifest.xml
+++ b/tests/tests/app/AndroidManifest.xml
@@ -22,6 +22,7 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/app/AndroidTest.xml b/tests/tests/app/AndroidTest.xml
new file mode 100644
index 0000000..01ebbcb
--- /dev/null
+++ b/tests/tests/app/AndroidTest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Base config for CTS package preparer">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsSimpleApp.apk" />
+</configuration>
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
index e633f1f..e531ac6 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
@@ -21,17 +21,22 @@
 
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.Instrumentation;
 import android.app.ActivityManager.ProcessErrorStateInfo;
 import android.app.ActivityManager.RecentTaskInfo;
 import android.app.ActivityManager.RunningAppProcessInfo;
 import android.app.ActivityManager.RunningServiceInfo;
 import android.app.ActivityManager.RunningTaskInfo;
+import android.app.ActivityOptions;
+import android.app.Instrumentation;
 import android.app.Instrumentation.ActivityMonitor;
 import android.app.Instrumentation.ActivityResult;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.ConfigurationInfo;
+import android.os.Bundle;
 import android.test.InstrumentationTestCase;
 
 public class ActivityManagerTest extends InstrumentationTestCase {
@@ -39,6 +44,27 @@
     private static final int WAITFOR_MSEC = 5000;
     private static final String SERVICE_NAME = "android.app.cts.MockService";
     private static final int WAIT_TIME = 2000;
+    // A secondary test activity from another APK.
+    private static final String SIMPLE_PACKAGE_NAME = "com.android.cts.launcherapps.simpleapp";
+    private static final String SIMPLE_ACTIVITY = ".SimpleActivity";
+    private static final String SIMPLE_ACTIVITY_IMMEDIATE_EXIT = ".SimpleActivityImmediateExit";
+    private static final String SIMPLE_ACTIVITY_CHAIN_EXIT = ".SimpleActivityChainExit";
+    // The action sent back by the SIMPLE_APP after a restart.
+    private static final String ACTIVITY_LAUNCHED_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.LAUNCHED_ACTION";
+    // The action sent back by the SIMPLE_APP_IMMEDIATE_EXIT when it terminates.
+    private static final String ACTIVITY_EXIT_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.EXIT_ACTION";
+    // The action sent back by the SIMPLE_APP_CHAIN_EXIT when the task chain ends. 
+    private static final String ACTIVITY_CHAIN_EXIT_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.CHAIN_EXIT_ACTION";
+    // The action sent to identify the time track info.
+    private static final String ACTIVITY_TIME_TRACK_INFO = "com.android.cts.TIME_TRACK_INFO";
+    // Return states of the ActivityReceiverFilter.
+    public static final int RESULT_PASS = 1;
+    public static final int RESULT_FAIL = 2;
+    public static final int RESULT_TIMEOUT = 3;
+
     private Context mContext;
     private ActivityManager mActivityManager;
     private Intent mIntent;
@@ -119,6 +145,79 @@
         }
     }
 
+    public void testGetRecentTasksLimitedToCurrentAPK() throws Exception {
+        int maxNum = 0;
+        int flags = 0;
+
+        // Check the number of tasks at this time.
+        List<RecentTaskInfo>  recentTaskList;
+        recentTaskList = mActivityManager.getRecentTasks(maxNum, flags);
+        int numberOfEntriesFirstRun = recentTaskList.size();
+
+        // Start another activity from another APK.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME, SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        ActivityReceiverFilter receiver = new ActivityReceiverFilter(ACTIVITY_LAUNCHED_ACTION);
+        mContext.startActivity(intent);
+
+        // Make sure the activity has really started.
+        assertEquals(RESULT_PASS, receiver.waitForActivity());
+        receiver.close();
+
+        // There shouldn't be any more tasks in this list at this time.
+        recentTaskList = mActivityManager.getRecentTasks(maxNum, flags);
+        int numberOfEntriesSecondRun = recentTaskList.size();
+        assertTrue(numberOfEntriesSecondRun == numberOfEntriesFirstRun);
+    }
+
+    // The receiver filter needs to be instantiated with the command to filter for before calling
+    // startActivity.
+    private class ActivityReceiverFilter extends BroadcastReceiver {
+        // The activity we want to filter for.
+        private String mActivityToFilter;
+        private int result = RESULT_TIMEOUT;
+        public long mTimeUsed = 0;
+        private static final int TIMEOUT_IN_MS = 1000;
+
+        // Create the filter with the intent to look for.
+        public ActivityReceiverFilter(String activityToFilter) {
+            mActivityToFilter = activityToFilter;
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(mActivityToFilter);
+            mInstrumentation.getTargetContext().registerReceiver(this, filter);
+        }
+
+        // Turn off the filter.
+        public void close() {
+            mInstrumentation.getTargetContext().unregisterReceiver(this);
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(mActivityToFilter)) {
+                synchronized(this) {
+                   result = RESULT_PASS;
+                   if (mActivityToFilter.equals(ACTIVITY_TIME_TRACK_INFO)) {
+                       mTimeUsed = intent.getExtras().getLong(
+                               ActivityOptions.EXTRA_USAGE_REPORT_TIME);
+                   }
+                   notifyAll();
+                }
+            }
+        }
+
+        public int waitForActivity() {
+            synchronized(this) {
+                try {
+                    wait(TIMEOUT_IN_MS);
+                } catch (InterruptedException e) {
+                }
+            }
+            return result;
+        }
+    }
+
     private final <T extends Activity> void startSubActivity(Class<T> activityClass) {
         final Instrumentation.ActivityResult result = new ActivityResult(0, new Intent());
         final ActivityMonitor monitor = new ActivityMonitor(activityClass.getName(), result, false);
@@ -219,7 +318,8 @@
                 hasTestProcess = true;
             }
         }
-        assertTrue(hasSystemProcess && hasTestProcess);
+        // For security reasons the system process is not exposed.
+        assertTrue(!hasSystemProcess && hasTestProcess);
 
         for (RunningAppProcessInfo ra : list) {
             if (ra.processName.equals("com.android.cts.app.stub:remote")) {
@@ -272,4 +372,158 @@
         assertFalse("isRunningInTestHarness must be false in production builds",
                 ActivityManager.isRunningInTestHarness());
     }
+
+    /**
+     * Go back to the home screen since running applications can interfere with application
+     * lifetime tests.
+     */
+    private void launchHome() throws Exception {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addCategory(Intent.CATEGORY_HOME);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(intent);
+        Thread.sleep(WAIT_TIME);
+    }
+
+    /**
+     * Verify that the TimeTrackingAPI works properly when starting and ending an activity.
+     */
+    public void testTimeTrackingAPI_SimpleStartExit() throws Exception {
+        launchHome();
+        // Prepare to start an activity from another APK.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME,
+                SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY_IMMEDIATE_EXIT);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        // Prepare the time receiver action.
+        Context context = mInstrumentation.getTargetContext();
+        ActivityOptions options = ActivityOptions.makeBasic();
+        Intent receiveIntent = new Intent(ACTIVITY_TIME_TRACK_INFO);
+        options.requestUsageTimeReport(PendingIntent.getBroadcast(context,
+                0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
+
+        // The application finished tracker.
+        ActivityReceiverFilter appEndReceiver = new ActivityReceiverFilter(ACTIVITY_EXIT_ACTION);
+
+        // The filter for the time event.
+        ActivityReceiverFilter timeReceiver = new ActivityReceiverFilter(ACTIVITY_TIME_TRACK_INFO);
+
+        // Run the activity.
+        mContext.startActivity(intent, options.toBundle());
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, appEndReceiver.waitForActivity());
+        appEndReceiver.close();
+
+        // At this time the timerReceiver should not fire, even though the activity has shut down,
+        // because we are back to the home screen.
+        assertEquals(RESULT_TIMEOUT, timeReceiver.waitForActivity());
+        assertTrue(timeReceiver.mTimeUsed == 0);
+
+        // Issuing now another activity will trigger the timing information release.
+        final Intent dummyIntent = new Intent(context, MockApplicationActivity.class);
+        dummyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        final Activity activity = mInstrumentation.startActivitySync(dummyIntent);
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, timeReceiver.waitForActivity());
+        timeReceiver.close();
+        assertTrue(timeReceiver.mTimeUsed != 0);
+    }
+
+    /**
+     * Verify that the TimeTrackingAPI works properly when switching away from the monitored task.
+     */
+    public void testTimeTrackingAPI_SwitchAwayTriggers() throws Exception {
+        launchHome();
+
+        // Prepare to start an activity from another APK.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME, SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        // Prepare the time receiver action.
+        Context context = mInstrumentation.getTargetContext();
+        ActivityOptions options = ActivityOptions.makeBasic();
+        Intent receiveIntent = new Intent(ACTIVITY_TIME_TRACK_INFO);
+        options.requestUsageTimeReport(PendingIntent.getBroadcast(context,
+                0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
+
+        // The application started tracker.
+        ActivityReceiverFilter appStartedReceiver = new ActivityReceiverFilter(
+                ACTIVITY_LAUNCHED_ACTION);
+
+        // The filter for the time event.
+        ActivityReceiverFilter timeReceiver = new ActivityReceiverFilter(ACTIVITY_TIME_TRACK_INFO);
+
+        // Run the activity.
+        mContext.startActivity(intent, options.toBundle());
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, appStartedReceiver.waitForActivity());
+        appStartedReceiver.close();
+
+        // At this time the timerReceiver should not fire since our app is running.
+        assertEquals(RESULT_TIMEOUT, timeReceiver.waitForActivity());
+        assertTrue(timeReceiver.mTimeUsed == 0);
+
+        // Starting now another activity will put ours into the back hence releasing the timing.
+        final Intent dummyIntent = new Intent(context, MockApplicationActivity.class);
+        dummyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        final Activity activity = mInstrumentation.startActivitySync(dummyIntent);
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, timeReceiver.waitForActivity());
+        timeReceiver.close();
+        assertTrue(timeReceiver.mTimeUsed != 0);
+    }
+
+    /**
+     * Verify that the TimeTrackingAPI works properly when handling an activity chain gets started
+     * and ended.
+     */
+    public void testTimeTrackingAPI_ChainedActivityExit() throws Exception {
+        launchHome();
+        // Prepare to start an activity from another APK.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME,
+                SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY_CHAIN_EXIT);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        // Prepare the time receiver action.
+        Context context = mInstrumentation.getTargetContext();
+        ActivityOptions options = ActivityOptions.makeBasic();
+        Intent receiveIntent = new Intent(ACTIVITY_TIME_TRACK_INFO);
+        options.requestUsageTimeReport(PendingIntent.getBroadcast(context,
+                0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
+
+        // The application finished tracker.
+        ActivityReceiverFilter appEndReceiver = new ActivityReceiverFilter(
+                ACTIVITY_CHAIN_EXIT_ACTION);
+
+        // The filter for the time event.
+        ActivityReceiverFilter timeReceiver = new ActivityReceiverFilter(ACTIVITY_TIME_TRACK_INFO);
+
+        // Run the activity.
+        mContext.startActivity(intent, options.toBundle());
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, appEndReceiver.waitForActivity());
+        appEndReceiver.close();
+
+        // At this time the timerReceiver should not fire, even though the activity has shut down.
+        assertEquals(RESULT_TIMEOUT, timeReceiver.waitForActivity());
+        assertTrue(timeReceiver.mTimeUsed == 0);
+
+        // Issue another activity so that the timing information gets released.
+        final Intent dummyIntent = new Intent(context, MockApplicationActivity.class);
+        dummyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        final Activity activity = mInstrumentation.startActivitySync(dummyIntent);
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, timeReceiver.waitForActivity());
+        timeReceiver.close();
+        assertTrue(timeReceiver.mTimeUsed != 0);
+    }
 }
diff --git a/tests/tests/app/src/android/app/cts/NotificationManagerTest.java b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
index 9a895ea..23dac25 100644
--- a/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
@@ -22,12 +22,16 @@
 import android.content.Context;
 import android.content.Intent;
 import android.provider.Telephony.Threads;
+import android.service.notification.StatusBarNotification;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
 import com.android.cts.app.stub.R;
 
 
 public class NotificationManagerTest extends AndroidTestCase {
+    final String TAG = NotificationManagerTest.class.getSimpleName();
+    final boolean DEBUG = false;
 
     private NotificationManager mNotificationManager;
 
@@ -36,6 +40,8 @@
         super.setUp();
         mNotificationManager = (NotificationManager) mContext.getSystemService(
                 Context.NOTIFICATION_SERVICE);
+        // clear the deck so that our getActiveNotifications results are predictable
+        mNotificationManager.cancelAll();
     }
 
     @Override
@@ -45,21 +51,52 @@
     }
 
     public void testNotify() {
+        mNotificationManager.cancelAll();
+
         final int id = 1;
         sendNotification(id, R.drawable.black);
+        // test updating the same notification
+        sendNotification(id, R.drawable.blue);
+        sendNotification(id, R.drawable.yellow);
+
+        // assume that sendNotification tested to make sure individual notifications were present
+        StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+        for (StatusBarNotification sbn : sbns) {
+            if (sbn.getId() != id) {
+                fail("we got back other notifications besides the one we posted: "
+                        + sbn.getKey());
+            }
+        }
     }
 
     public void testCancel() {
         final int id = 9;
         sendNotification(id, R.drawable.black);
         mNotificationManager.cancel(id);
+
+        StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+        for (StatusBarNotification sbn : sbns) {
+            assertFalse("canceled notification was still alive, id=" + id, sbn.getId() == id);
+        }
     }
 
     public void testCancelAll() {
         sendNotification(1, R.drawable.black);
         sendNotification(2, R.drawable.blue);
         sendNotification(3, R.drawable.yellow);
+
+        if (DEBUG) {
+            Log.d(TAG, "posted 3 notifications, here they are: ");
+            StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+            for (StatusBarNotification sbn : sbns) {
+                Log.d(TAG, "  " + sbn);
+            }
+            Log.d(TAG, "about to cancel...");
+        }
         mNotificationManager.cancelAll();
+
+        StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+        assertTrue("notification list was not empty after cancelAll", sbns.length == 0);
     }
 
     private void sendNotification(final int id, final int icon) {
@@ -76,6 +113,11 @@
         notification.setLatestEventInfo(mContext, "notify#" + id, "This is #" + id
                 + "notification  ", pendingIntent);
         mNotificationManager.notify(id, notification);
-    }
 
+        StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+        for (StatusBarNotification sbn : sbns) {
+            if (sbn.getId() == id) return;
+        }
+        fail("couldn't find posted notification id=" + id);
+    }
 }
diff --git a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
index 038b57b..b2037b6 100644
--- a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
@@ -97,8 +97,7 @@
 
     @UiThreadTest
     public void testShow2() {
-        ProgressDialog dialog = buildDialog();
-        dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, false);
+        ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, false);
 
         /*
          * note: the progress bar's style only supports indeterminate mode,
@@ -120,11 +119,11 @@
         // cancelable is false
         runTestOnUiThread(new Runnable() {
             public void run() {
-                ProgressDialog dialog = buildDialog();
-                dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false);
+                ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false);
 
                 dialog.setOnCancelListener(cL);
                 dialog.onBackPressed();
+                dialog.dismiss();
             }
         });
         mInstrumentation.waitForIdleSync();
@@ -134,8 +133,7 @@
         // cancelable is true
         runTestOnUiThread(new Runnable() {
             public void run() {
-                ProgressDialog dialog = buildDialog();
-                dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true);
+                ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true);
                 assertFalse(mCanceled);
                 dialog.setOnCancelListener(cL);
                 dialog.onBackPressed();
@@ -156,10 +154,11 @@
         // cancelable is false
         runTestOnUiThread(new Runnable() {
             public void run() {
-                ProgressDialog dialog = buildDialog();
-                dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false, cL);
+                ProgressDialog dialog = ProgressDialog.show(
+                        mContext, TITLE, MESSAGE, true, false, cL);
 
                 dialog.onBackPressed();
+                dialog.dismiss();;
             }
         });
         mInstrumentation.waitForIdleSync();
@@ -169,8 +168,8 @@
         // cancelable is true
         runTestOnUiThread(new Runnable() {
             public void run() {
-                ProgressDialog dialog = buildDialog();
-                dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true, cL);
+                ProgressDialog dialog = ProgressDialog.show(
+                        mContext, TITLE, MESSAGE, true, true, cL);
 
                 assertFalse(mCanceled);
                 dialog.onBackPressed();
diff --git a/tests/tests/app/src/android/app/cts/SearchDialogTest.java b/tests/tests/app/src/android/app/cts/SearchDialogTest.java
new file mode 100644
index 0000000..1cf1ebd
--- /dev/null
+++ b/tests/tests/app/src/android/app/cts/SearchDialogTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.cts;
+
+import android.app.SearchDialog;
+import android.content.Context;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.InstrumentationTestCase;
+import android.view.ActionMode;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Test {@link SearchDialog}.
+ */
+public class SearchDialogTest extends InstrumentationTestCase {
+
+    private Context mContext;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getTargetContext();
+    }
+
+    public void testPrimaryActionModesAreStopped() {
+        SearchDialog.SearchBar searchBar = new SearchDialog.SearchBar(mContext);
+        MockViewGroup viewGroup = new MockViewGroup(mContext);
+        viewGroup.addView(searchBar);
+
+        ActionMode mode = searchBar.startActionModeForChild(null, null, ActionMode.TYPE_PRIMARY);
+
+        assertNull(mode);
+        // Should not bubble up.
+        assertFalse(viewGroup.isStartActionModeForChildTypedCalled);
+        assertFalse(viewGroup.isStartActionModeForChildTypelessCalled);
+
+        mode = searchBar.startActionModeForChild(null, null);
+
+        assertNull(mode);
+        // Should not bubble up.
+        assertFalse(viewGroup.isStartActionModeForChildTypedCalled);
+        assertFalse(viewGroup.isStartActionModeForChildTypelessCalled);
+    }
+
+    public void testFloatingActionModesAreBubbledUp() {
+        SearchDialog.SearchBar searchBar = new SearchDialog.SearchBar(mContext);
+        MockViewGroup viewGroup = new MockViewGroup(mContext);
+        viewGroup.addView(searchBar);
+
+        searchBar.startActionModeForChild(null, null, ActionMode.TYPE_FLOATING);
+
+        // Should bubble up.
+        assertTrue(viewGroup.isStartActionModeForChildTypedCalled);
+    }
+
+    private static class MockViewGroup extends ViewGroup {
+        boolean isStartActionModeForChildTypedCalled = false;
+        boolean isStartActionModeForChildTypelessCalled = false;
+
+        public MockViewGroup(Context context) {
+            super(context);
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
+            isStartActionModeForChildTypelessCalled = true;
+            return super.startActionModeForChild(originalView, callback);
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(
+                View originalView, ActionMode.Callback callback, int type) {
+            isStartActionModeForChildTypedCalled = true;
+            return super.startActionModeForChild(originalView, callback, type);
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {}
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseCallbackTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseCallbackTest.java
new file mode 100644
index 0000000..1c68022
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseCallbackTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.le.AdvertiseCallback;
+import android.bluetooth.le.AdvertiseSettings;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Test of {@link AdvertiseCallback}.
+ */
+public class AdvertiseCallbackTest extends AndroidTestCase {
+
+    private final static int ADVERTISE_TYPE_SUCCESS = 0;
+    private final static int ADVERTISE_TYPE_FAIL = 1;
+
+    private final MockAdvertiser mMockAdvertiser = new MockAdvertiser();
+    private final BleAdvertiseCallback mAdvertiseCallback = new BleAdvertiseCallback();
+
+    @SmallTest
+    public void testAdvertiseSuccess() {
+        mAdvertiseCallback.mAdvertiseType = ADVERTISE_TYPE_SUCCESS;
+        mMockAdvertiser.startAdvertise(mAdvertiseCallback);
+    }
+
+    @SmallTest
+    public void testAdvertiseFailure() {
+        mAdvertiseCallback.mAdvertiseType = ADVERTISE_TYPE_SUCCESS;
+        mMockAdvertiser.startAdvertise(mAdvertiseCallback);
+
+        // Second advertise with the same callback should fail.
+        mAdvertiseCallback.mAdvertiseType = ADVERTISE_TYPE_FAIL;
+        mMockAdvertiser.startAdvertise(mAdvertiseCallback);
+    }
+
+    // A mock advertiser which emulate BluetoothLeAdvertiser behavior.
+    private static class MockAdvertiser {
+        private Set<AdvertiseCallback> mCallbacks = new HashSet<>();
+
+        void startAdvertise(AdvertiseCallback callback) {
+            synchronized (mCallbacks) {
+                if (mCallbacks.contains(callback)) {
+                    callback.onStartFailure(AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED);
+                } else {
+                    callback.onStartSuccess(null);
+                    mCallbacks.add(callback);
+                }
+            }
+        }
+    }
+
+    private static class BleAdvertiseCallback extends AdvertiseCallback {
+        int mAdvertiseType = ADVERTISE_TYPE_SUCCESS;
+
+        @Override
+        public void onStartSuccess(AdvertiseSettings settings) {
+            if (mAdvertiseType == ADVERTISE_TYPE_FAIL) {
+                fail("advertise should fail");
+            }
+        }
+
+        @Override
+        public void onStartFailure(int error) {
+            if (mAdvertiseType == ADVERTISE_TYPE_SUCCESS) {
+                assertEquals(AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED, error);
+            }
+        }
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseDataTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseDataTest.java
new file mode 100644
index 0000000..3f2bf52
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseDataTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.le.AdvertiseData;
+import android.os.Parcel;
+import android.os.ParcelUuid;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test cases for {@link AdvertiseData}.
+ * <p>
+ * To run the test, use adb shell am instrument -e class 'android.bluetooth.le.AdvertiseDataTest' -w
+ * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
+ */
+public class AdvertiseDataTest extends AndroidTestCase {
+
+    private AdvertiseData.Builder mAdvertiseDataBuilder;
+
+    @Override
+    protected void setUp() {
+        mAdvertiseDataBuilder = new AdvertiseData.Builder();
+    }
+
+    @SmallTest
+    public void testEmptyData() {
+        Parcel parcel = Parcel.obtain();
+        AdvertiseData data = mAdvertiseDataBuilder.build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        assertFalse(dataFromParcel.getIncludeDeviceName());
+        assertFalse(dataFromParcel.getIncludeTxPowerLevel());
+        assertEquals(0, dataFromParcel.getManufacturerSpecificData().size());
+        assertTrue(dataFromParcel.getServiceData().isEmpty());
+        assertTrue(dataFromParcel.getServiceUuids().isEmpty());
+    }
+
+    @SmallTest
+    public void testEmptyServiceUuid() {
+        Parcel parcel = Parcel.obtain();
+        AdvertiseData data = mAdvertiseDataBuilder.setIncludeDeviceName(true).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        assertTrue(dataFromParcel.getIncludeDeviceName());
+        assertTrue(dataFromParcel.getServiceUuids().isEmpty());
+    }
+
+    @SmallTest
+    public void testEmptyManufacturerData() {
+        Parcel parcel = Parcel.obtain();
+        int manufacturerId = 50;
+        byte[] manufacturerData = new byte[0];
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addManufacturerData(manufacturerId, manufacturerData).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        TestUtils.assertArrayEquals(new byte[0], dataFromParcel.getManufacturerSpecificData().get(manufacturerId));
+    }
+
+    @SmallTest
+    public void testEmptyServiceData() {
+        Parcel parcel = Parcel.obtain();
+        ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        byte[] serviceData = new byte[0];
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addServiceData(uuid, serviceData).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        TestUtils.assertArrayEquals(new byte[0], dataFromParcel.getServiceData().get(uuid));
+    }
+
+    @SmallTest
+    public void testServiceUuid() {
+        Parcel parcel = Parcel.obtain();
+        ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        ParcelUuid uuid2 = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
+
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addServiceUuid(uuid).addServiceUuid(uuid2).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        assertTrue(dataFromParcel.getServiceUuids().contains(uuid));
+        assertTrue(dataFromParcel.getServiceUuids().contains(uuid2));
+    }
+
+    @SmallTest
+    public void testManufacturerData() {
+        Parcel parcel = Parcel.obtain();
+        ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        ParcelUuid uuid2 = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
+
+        int manufacturerId = 50;
+        byte[] manufacturerData = new byte[] {
+                (byte) 0xF0, 0x00, 0x02, 0x15 };
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addServiceUuid(uuid).addServiceUuid(uuid2)
+                        .addManufacturerData(manufacturerId, manufacturerData).build();
+
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        TestUtils.assertArrayEquals(manufacturerData,
+                dataFromParcel.getManufacturerSpecificData().get(manufacturerId));
+    }
+
+    @SmallTest
+    public void testServiceData() {
+        Parcel parcel = Parcel.obtain();
+        ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        byte[] serviceData = new byte[] {
+                (byte) 0xF0, 0x00, 0x02, 0x15 };
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addServiceData(uuid, serviceData).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        TestUtils.assertArrayEquals(serviceData, dataFromParcel.getServiceData().get(uuid));
+    }
+
+    @SmallTest
+    public void testIncludeTxPower() {
+        Parcel parcel = Parcel.obtain();
+        AdvertiseData data = mAdvertiseDataBuilder.setIncludeTxPowerLevel(true).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(dataFromParcel.getIncludeTxPowerLevel(), true);
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        AdvertiseData data = new AdvertiseData.Builder().build();
+        assertEquals(0, data.describeContents());
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseSettingsTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseSettingsTest.java
new file mode 100644
index 0000000..19b7c29
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseSettingsTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.le.AdvertiseSettings;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test for {@link AdvertiseSettings}.
+ */
+public class AdvertiseSettingsTest extends AndroidTestCase {
+
+    @SmallTest
+    public void testDefaultSettings() {
+        AdvertiseSettings settings = new AdvertiseSettings.Builder().build();
+        assertEquals(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER, settings.getMode());
+        assertEquals(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM, settings.getTxPowerLevel());
+        assertEquals(0, settings.getTimeout());
+        assertTrue(settings.isConnectable());
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        AdvertiseSettings settings = new AdvertiseSettings.Builder().build();
+        assertEquals(0, settings.describeContents());
+    }
+
+    @SmallTest
+    public void testReadWriteParcel() {
+        final int timeoutMillis = 60 * 1000;
+        Parcel parcel = Parcel.obtain();
+        AdvertiseSettings settings = new AdvertiseSettings.Builder()
+                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
+                .setConnectable(false)
+                .setTimeout(timeoutMillis)
+                .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
+                .build();
+        settings.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseSettings settingsFromParcel = AdvertiseSettings.CREATOR.createFromParcel(parcel);
+        assertEquals(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY, settingsFromParcel.getMode());
+        assertEquals(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM,
+                settingsFromParcel.getTxPowerLevel());
+        assertEquals(timeoutMillis, settingsFromParcel.getTimeout());
+        assertFalse(settings.isConnectable());
+    }
+
+    @SmallTest
+    public void testIllegalTimeout() {
+        AdvertiseSettings.Builder builder = new AdvertiseSettings.Builder();
+        builder.setTimeout(0).build();
+        builder.setTimeout(180 * 1000).build();
+        // Maximum timeout is 3 minutes.
+        try {
+            builder.setTimeout(180 * 1000 + 1).build();
+            fail("should not allow setting timeout to more than 3 minutes");
+        } catch (IllegalArgumentException e) {
+            // nothing to do.
+        }
+        // Negative time out is not allowed.
+        try {
+            builder.setTimeout(-1).build();
+            fail("should not allow setting timeout to more than 3 minutes");
+        } catch (IllegalArgumentException e) {
+            // nothing to do.
+        }
+
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothLeScanTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothLeScanTest.java
new file mode 100644
index 0000000..08bbacd
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothLeScanTest.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothManager;
+import android.bluetooth.le.BluetoothLeScanner;
+import android.bluetooth.le.ScanCallback;
+import android.bluetooth.le.ScanFilter;
+import android.bluetooth.le.ScanResult;
+import android.bluetooth.le.ScanSettings;
+import android.content.Context;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test cases for Bluetooth LE scans.
+ * <p>
+ * To run the test, the device must be placed in an environment that has at least 5 BLE beacons
+ * broadcasting no slower than 1 HZ. The BLE beacons should be a combination of iBeacon devices and
+ * non-iBeacon devices.
+ * <p>
+ * Run 'run cts --class android.bluetooth.cts.BluetoothLeScanTest' in cts-tradefed to run the test
+ * cases.
+ */
+public class BluetoothLeScanTest extends AndroidTestCase {
+
+    private static final String TAG = "BluetoothLeScanTest";
+
+    private static final ScanFilter MANUFACTURER_DATA_FILTER =
+            new ScanFilter.Builder().setManufacturerData(0x004C, new byte[0], new byte[0]).build();
+    private static final int SCAN_DURATION_MILLIS = 5000;
+    private static final int BATCH_SCAN_REPORT_DELAY_MILLIS = 10000;
+
+    private BluetoothLeScanner mScanner;
+
+    @Override
+    public void setUp() {
+        BluetoothManager manager = (BluetoothManager) mContext.getSystemService(
+                Context.BLUETOOTH_SERVICE);
+        BluetoothAdapter adapter = manager.getAdapter();
+        if (!adapter.isEnabled()) {
+            adapter.enable();
+            // Note it's not reliable to listen for Adapter.ACTION_STATE_CHANGED broadcast and check
+            // bluetooth state.
+            sleep(2000);
+        }
+        mScanner = adapter.getBluetoothLeScanner();
+    }
+
+    /**
+     * Basic test case for BLE scans. Checks BLE scan timestamp is within correct range.
+     */
+    @MediumTest
+    public void testBasicBleScan() {
+        BleScanCallback regularLeScanCallback = new BleScanCallback();
+        long scanStartMillis = SystemClock.elapsedRealtime();
+        mScanner.startScan(regularLeScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        mScanner.stopScan(regularLeScanCallback);
+        long scanEndMillis = SystemClock.elapsedRealtime();
+        Collection<ScanResult> scanResults = regularLeScanCallback.getScanResults();
+        assertTrue("Scan results shouldn't be empty", !scanResults.isEmpty());
+        verifyTimestamp(scanResults, scanStartMillis, scanEndMillis);
+    }
+
+    /**
+     * Test of scan filters. Ensures only beacons matching certain type of scan filters were
+     * reported.
+     */
+    @MediumTest
+    public void testScanFilter() {
+        List<ScanFilter> filters = new ArrayList<ScanFilter>();
+        filters.add(MANUFACTURER_DATA_FILTER);
+
+        BleScanCallback filterLeScanCallback = new BleScanCallback();
+        ScanSettings settings = new ScanSettings.Builder().setScanMode(
+                ScanSettings.SCAN_MODE_LOW_LATENCY).build();
+        mScanner.startScan(filters, settings, filterLeScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        mScanner.stopScan(filterLeScanCallback);
+        Collection<ScanResult> scanResults = filterLeScanCallback.getScanResults();
+        assertTrue("No scan results", !scanResults.isEmpty());
+        for (ScanResult result : scanResults) {
+            assertTrue(MANUFACTURER_DATA_FILTER.matches(result));
+        }
+    }
+
+    /**
+     * Test of opportunistic BLE scans.
+     */
+    @MediumTest
+    public void testOpportunisticScan() {
+        ScanSettings opportunisticScanSettings =
+                new ScanSettings.Builder()
+                        .setScanMode(-1) // TODO: use constants in ScanSettings once it's unhiden.
+                        .build();
+        BleScanCallback emptyScanCallback = new BleScanCallback();
+
+        // No scans are really started with opportunistic scans only.
+        mScanner.startScan(Collections.<ScanFilter> emptyList(), opportunisticScanSettings,
+                emptyScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        assertTrue(emptyScanCallback.getScanResults().isEmpty());
+
+        BleScanCallback regularScanCallback = new BleScanCallback();
+        ScanSettings regularScanSettings =
+                new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
+        List<ScanFilter> filters = new ArrayList<>();
+        filters.add(MANUFACTURER_DATA_FILTER);
+        mScanner.startScan(filters, regularScanSettings, regularScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        // With normal BLE scan client, opportunistic scan client will get scan results.
+        assertTrue("opportunistic scan results shouldn't be empty",
+                !emptyScanCallback.getScanResults().isEmpty());
+        assertTrue("opportunistic scan should see more results",
+                emptyScanCallback.getScanResults().size() >
+                regularScanCallback.getScanResults().size());
+
+        // No more scan results for opportunistic scan clients once the normal BLE scan clients
+        // stops.
+        mScanner.stopScan(regularScanCallback);
+        // In case we got scan results before scan was completely stopped.
+        sleep(1000);
+        emptyScanCallback.clear();
+        sleep(SCAN_DURATION_MILLIS);
+        assertTrue("opportunistic scan shouldn't have scan results",
+                emptyScanCallback.getScanResults().isEmpty());
+    }
+
+    /**
+     * Test case for BLE Batch scan.
+     */
+    @MediumTest
+    public void testBatchScan() {
+        ScanSettings batchScanSettings = new ScanSettings.Builder()
+                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
+                .setReportDelay(BATCH_SCAN_REPORT_DELAY_MILLIS).build();
+        BleScanCallback batchScanCallback = new BleScanCallback();
+        long scanStartMillis = SystemClock.elapsedRealtime();
+        mScanner.startScan(Collections.<ScanFilter> emptyList(), batchScanSettings,
+                batchScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        mScanner.flushPendingScanResults(batchScanCallback);
+        sleep(1000);
+        long scanEndMillis = SystemClock.elapsedRealtime();
+        List<ScanResult> results = batchScanCallback.getBatchScanResults();
+        assertTrue(!results.isEmpty());
+        verifyTimestamp(results, scanStartMillis, scanEndMillis);
+    }
+
+    // Verify timestamp of all scan results are within [scanStartMillis, scanEndMillis].
+    private void verifyTimestamp(Collection<ScanResult> results, long scanStartMillis,
+            long scanEndMillis) {
+        for (ScanResult result : results) {
+            long timestampMillis = TimeUnit.NANOSECONDS.toMillis(result.getTimestampNanos());
+            assertTrue("Invalid timestamp", timestampMillis >= scanStartMillis);
+            assertTrue("Invalid timestamp", timestampMillis <= scanEndMillis);
+        }
+    }
+
+    // Helper class for BLE scan callback.
+    private class BleScanCallback extends ScanCallback {
+        private Set<ScanResult> mResults = new HashSet<ScanResult>();
+        private List<ScanResult> mBatchScanResults = new ArrayList<ScanResult>();
+
+        @Override
+        public void onScanResult(int callbackType, ScanResult result) {
+            if (callbackType == ScanSettings.CALLBACK_TYPE_ALL_MATCHES) {
+                mResults.add(result);
+            }
+        }
+
+        @Override
+        public void onBatchScanResults(List<ScanResult> results) {
+            mBatchScanResults = results;
+        }
+
+        // Clear regular and batch scan results.
+        synchronized public void clear() {
+            mResults.clear();
+            mBatchScanResults.clear();
+        }
+
+        // Return regular BLE scan results accumulated so far.
+        synchronized Collection<ScanResult> getScanResults() {
+            return Collections.unmodifiableCollection(mResults);
+        }
+
+        // Return batch scan results.
+        synchronized List<ScanResult> getBatchScanResults() {
+            return Collections.unmodifiableList(mBatchScanResults);
+        }
+    }
+
+    // Put the current thread to sleep.
+    private void sleep(int sleepMillis) {
+        try {
+            Thread.sleep(sleepMillis);
+        } catch (InterruptedException e) {
+            Log.e(TAG, "interrupted", e);
+        }
+    }
+
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanCallbackTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanCallbackTest.java
new file mode 100644
index 0000000..f447f10
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanCallbackTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.le.ScanCallback;
+import android.bluetooth.le.ScanResult;
+import android.bluetooth.le.ScanSettings;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Test cases for {@link ScanCallback}.
+ */
+public class ScanCallbackTest extends AndroidTestCase {
+
+    // Scan types are used to determine which callback method is expected.
+    private final static int SCAN_TYPE_SUCCESS = 0;
+    private final static int SCAN_TYPE_FAIL = 1;
+    private final static int SCAN_TYPE_BATCH = 2;
+
+    private MockScanner mMockScanner = new MockScanner();
+    private BleScanCallback mMockScanCallback = new BleScanCallback();
+
+    @SmallTest
+    public void testScanSuccess() {
+        mMockScanCallback.mScanType = SCAN_TYPE_SUCCESS;
+        mMockScanner.startScan(new ScanSettings.Builder().build(), mMockScanCallback);
+    }
+
+    @SmallTest
+    public void testBatchScans() {
+        ScanSettings settings = new ScanSettings.Builder().setReportDelay(1000).build();
+        mMockScanCallback.mScanType = SCAN_TYPE_BATCH;
+        mMockScanner.startScan(settings, mMockScanCallback);
+    }
+
+    @SmallTest
+    public void testScanFail() {
+        ScanSettings settings = new ScanSettings.Builder().build();
+        // The first scan is success.
+        mMockScanCallback.mScanType = SCAN_TYPE_SUCCESS;
+        mMockScanner.startScan(settings, mMockScanCallback);
+        // A second scan with the same callback should fail.
+        mMockScanCallback.mScanType = SCAN_TYPE_FAIL;
+        mMockScanner.startScan(settings, mMockScanCallback);
+    }
+
+    // A mock scanner for mocking BLE scanner functionalities.
+    private static class MockScanner {
+        private Set<ScanCallback> mCallbacks = new HashSet<>();
+
+        void startScan(ScanSettings settings, ScanCallback callback) {
+            synchronized (mCallbacks) {
+                if (mCallbacks.contains(callback)) {
+                    callback.onScanFailed(ScanCallback.SCAN_FAILED_ALREADY_STARTED);
+                    return;
+                }
+                mCallbacks.add(callback);
+                if (settings.getReportDelayMillis() == 0) {
+                    callback.onScanResult(0, null);
+                } else {
+                    callback.onBatchScanResults(null);
+                }
+            }
+        }
+    }
+
+    private static class BleScanCallback extends ScanCallback {
+        int mScanType = SCAN_TYPE_SUCCESS;
+
+        @Override
+        public void onScanResult(int callbackType, ScanResult result) {
+            if (mScanType != SCAN_TYPE_SUCCESS) {
+                fail("scan should fail");
+            }
+        }
+
+        @Override
+        public void onBatchScanResults(List<ScanResult> results) {
+            if (mScanType != SCAN_TYPE_BATCH) {
+                fail("not a batch scan");
+            }
+        }
+
+        @Override
+        public void onScanFailed(int errorCode) {
+            if (mScanType != SCAN_TYPE_FAIL) {
+                fail("scan should not fail");
+            }
+        }
+
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanFilterTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanFilterTest.java
new file mode 100644
index 0000000..16e1413
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanFilterTest.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.le.ScanFilter;
+import android.bluetooth.le.ScanResult;
+import android.os.Parcel;
+import android.os.ParcelUuid;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test cases for Bluetooth LE scan filters.
+ * <p>
+ * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanFilterTest' -w
+ * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
+ */
+public class ScanFilterTest extends AndroidTestCase {
+
+    private static final String LOCAL_NAME = "Ped";
+    private static final String DEVICE_MAC = "01:02:03:04:05:AB";
+    private static final String UUID1 = "0000110a-0000-1000-8000-00805f9b34fb";
+    private static final String UUID2 = "0000110b-0000-1000-8000-00805f9b34fb";
+    private static final String UUID3 = "0000110c-0000-1000-8000-00805f9b34fb";
+
+    private ScanResult mScanResult;
+    private ScanFilter.Builder mFilterBuilder;
+
+    @Override
+    protected void setUp() {
+        byte[] scanRecord = new byte[] {
+                0x02, 0x01, 0x1a, // advertising flags
+                0x05, 0x02, 0x0b, 0x11, 0x0a, 0x11, // 16 bit service uuids
+                0x04, 0x09, 0x50, 0x65, 0x64, // setName
+                0x02, 0x0A, (byte) 0xec, // tx power level
+                0x05, 0x16, 0x0b, 0x11, 0x50, 0x64, // service data
+                0x05, (byte) 0xff, (byte) 0xe0, 0x00, 0x02, 0x15, // manufacturer specific data
+                0x03, 0x50, 0x01, 0x02, // an unknown data type won't cause trouble
+        };
+
+        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+        BluetoothDevice device = adapter.getRemoteDevice(DEVICE_MAC);
+        mScanResult = new ScanResult(device, TestUtils.parseScanRecord(scanRecord),
+                -10, 1397545200000000L);
+        mFilterBuilder = new ScanFilter.Builder();
+    }
+
+    @SmallTest
+    public void testsetNameFilter() {
+        ScanFilter filter = mFilterBuilder.setDeviceName(LOCAL_NAME).build();
+        assertEquals(LOCAL_NAME, filter.getDeviceName());
+        assertTrue("setName filter fails", filter.matches(mScanResult));
+
+        filter = mFilterBuilder.setDeviceName("Pem").build();
+        assertFalse("setName filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testDeviceAddressFilter() {
+        ScanFilter filter = mFilterBuilder.setDeviceAddress(DEVICE_MAC).build();
+        assertEquals(DEVICE_MAC, filter.getDeviceAddress());
+        assertTrue("device filter fails", filter.matches(mScanResult));
+
+        filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build();
+        assertFalse("device filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testsetServiceUuidFilter() {
+        ScanFilter filter = mFilterBuilder.setServiceUuid(
+                ParcelUuid.fromString(UUID1)).build();
+        assertEquals(UUID1, filter.getServiceUuid().toString());
+        assertTrue("uuid filter fails", filter.matches(mScanResult));
+
+        filter = mFilterBuilder.setServiceUuid(
+                ParcelUuid.fromString(UUID3)).build();
+        assertEquals(UUID3, filter.getServiceUuid().toString());
+        assertFalse("uuid filter fails", filter.matches(mScanResult));
+
+        ParcelUuid mask = ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF");
+        filter = mFilterBuilder
+                .setServiceUuid(ParcelUuid.fromString(UUID3),
+                        mask)
+                .build();
+        assertEquals(mask.toString(), filter.getServiceUuidMask().toString());
+        assertTrue("uuid filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testsetServiceDataFilter() {
+        byte[] setServiceData = new byte[] {
+                0x50, 0x64 };
+        ParcelUuid serviceDataUuid = ParcelUuid.fromString(UUID2);
+        ScanFilter filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData).build();
+        assertEquals(serviceDataUuid, filter.getServiceDataUuid());
+        assertTrue("service data filter fails", filter.matches(mScanResult));
+
+        byte[] emptyData = new byte[0];
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, emptyData).build();
+        assertTrue("service data filter fails", filter.matches(mScanResult));
+
+        byte[] prefixData = new byte[] {
+                0x50 };
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, prefixData).build();
+        assertTrue("service data filter fails", filter.matches(mScanResult));
+
+        byte[] nonMatchData = new byte[] {
+                0x51, 0x64 };
+        byte[] mask = new byte[] {
+                (byte) 0x00, (byte) 0xFF };
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData, mask).build();
+        assertEquals(nonMatchData, filter.getServiceData());
+        assertEquals(mask, filter.getServiceDataMask());
+        assertTrue("partial service data filter fails", filter.matches(mScanResult));
+
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData).build();
+        assertFalse("service data filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testManufacturerSpecificData() {
+        byte[] manufacturerData = new byte[] {
+                0x02, 0x15 };
+        int manufacturerId = 0xE0;
+        ScanFilter filter =
+                mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData).build();
+        assertEquals(manufacturerId, filter.getManufacturerId());
+        assertEquals(manufacturerData, filter.getManufacturerData());
+        assertTrue("manufacturer data filter fails", filter.matches(mScanResult));
+
+        byte[] emptyData = new byte[0];
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, emptyData).build();
+        assertTrue("manufacturer data filter fails", filter.matches(mScanResult));
+
+        byte[] prefixData = new byte[] {
+                0x02 };
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, prefixData).build();
+        assertTrue("manufacturer data filter fails", filter.matches(mScanResult));
+
+        // Test data mask
+        byte[] nonMatchData = new byte[] {
+                0x02, 0x14 };
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData).build();
+        assertFalse("manufacturer data filter fails", filter.matches(mScanResult));
+        byte[] mask = new byte[] {
+                (byte) 0xFF, (byte) 0x00
+        };
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData, mask).build();
+        assertEquals(manufacturerId, filter.getManufacturerId());
+        assertEquals(nonMatchData, filter.getManufacturerData());
+        assertEquals(mask, filter.getManufacturerDataMask());
+        assertTrue("partial setManufacturerData filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testReadWriteParcel() {
+        ScanFilter filter = mFilterBuilder.build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setDeviceName(LOCAL_NAME).build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setServiceUuid(
+                ParcelUuid.fromString(UUID3)).build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setServiceUuid(
+                ParcelUuid.fromString(UUID3),
+                ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")).build();
+        testReadWriteParcelForFilter(filter);
+
+        byte[] serviceData = new byte[] {
+                0x50, 0x64 };
+
+        ParcelUuid serviceDataUuid = ParcelUuid.fromString(UUID2);
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData).build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build();
+        testReadWriteParcelForFilter(filter);
+
+        byte[] serviceDataMask = new byte[] {
+                (byte) 0xFF, (byte) 0xFF };
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData, serviceDataMask)
+                .build();
+        testReadWriteParcelForFilter(filter);
+
+        byte[] manufacturerData = new byte[] {
+                0x02, 0x15 };
+        int manufacturerId = 0xE0;
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData).build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build();
+        testReadWriteParcelForFilter(filter);
+
+        byte[] manufacturerDataMask = new byte[] {
+                (byte) 0xFF, (byte) 0xFF
+        };
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData,
+                manufacturerDataMask).build();
+        testReadWriteParcelForFilter(filter);
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        final int expected = 0;
+        assertEquals(expected, new ScanFilter.Builder().build().describeContents());
+    }
+
+    private void testReadWriteParcelForFilter(ScanFilter filter) {
+        Parcel parcel = Parcel.obtain();
+        filter.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        ScanFilter filterFromParcel =
+                ScanFilter.CREATOR.createFromParcel(parcel);
+        assertEquals(filter, filterFromParcel);
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanRecordTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanRecordTest.java
new file mode 100644
index 0000000..30ad06f
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanRecordTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.le.ScanRecord;
+import android.os.ParcelUuid;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test cases for {@link ScanRecord}.
+ * <p>
+ * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanRecordTest' -w
+ * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
+ */
+public class ScanRecordTest extends AndroidTestCase {
+
+    @SmallTest
+    public void testParser() {
+        byte[] scanRecord = new byte[] {
+                0x02, 0x01, 0x1a, // advertising flags
+                0x05, 0x02, 0x0b, 0x11, 0x0a, 0x11, // 16 bit service uuids
+                0x04, 0x09, 0x50, 0x65, 0x64, // name
+                0x02, 0x0A, (byte) 0xec, // tx power level
+                0x05, 0x16, 0x0b, 0x11, 0x50, 0x64, // service data
+                0x05, (byte) 0xff, (byte) 0xe0, 0x00, 0x02, 0x15, // manufacturer specific data
+                0x03, 0x50, 0x01, 0x02, // an unknown data type won't cause trouble
+        };
+        ScanRecord data = TestUtils.parseScanRecord(scanRecord);
+        assertEquals(0x1a, data.getAdvertiseFlags());
+        ParcelUuid uuid1 = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        ParcelUuid uuid2 = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
+        assertTrue(data.getServiceUuids().contains(uuid1));
+        assertTrue(data.getServiceUuids().contains(uuid2));
+
+        assertEquals("Ped", data.getDeviceName());
+        assertEquals(-20, data.getTxPowerLevel());
+
+        assertTrue(data.getManufacturerSpecificData().get(0x00E0) != null);
+
+        final byte[] manufacturerData = new byte[] {
+                0x02, 0x15 };
+        TestUtils.assertArrayEquals(manufacturerData,
+                data.getManufacturerSpecificData().get(0x00E0));
+        TestUtils.assertArrayEquals(manufacturerData, data.getManufacturerSpecificData(0x00E0));
+
+        assertTrue(data.getServiceData().containsKey(uuid2));
+        final byte[] serviceData = new byte[] {
+                0x50, 0x64 };
+        TestUtils.assertArrayEquals(serviceData, data.getServiceData().get(uuid2));
+        TestUtils.assertArrayEquals(serviceData, data.getServiceData(uuid2));
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanResultTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanResultTest.java
new file mode 100644
index 0000000..91da8c3
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanResultTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.le.ScanResult;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test cases for Bluetooth LE scans.
+ * <p>
+ * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanResultTest' -w
+ * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
+ */
+public class ScanResultTest extends AndroidTestCase {
+    private static final String DEVICE_ADDRESS = "01:02:03:04:05:06";
+    private static final byte[] SCAN_RECORD = new byte[] {
+            1, 2, 3 };
+    private static final int RSSI = -10;
+    private static final long TIMESTAMP_NANOS = 10000L;
+
+    /**
+     * Test read and write parcel of ScanResult
+     */
+    @SmallTest
+    public void testScanResultParceling() {
+        BluetoothDevice device =
+                BluetoothAdapter.getDefaultAdapter().getRemoteDevice(DEVICE_ADDRESS);
+        ScanResult result = new ScanResult(device, TestUtils.parseScanRecord(SCAN_RECORD), RSSI,
+                TIMESTAMP_NANOS);
+        Parcel parcel = Parcel.obtain();
+        result.writeToParcel(parcel, 0);
+        // Need to reset parcel data position to the beginning.
+        parcel.setDataPosition(0);
+        ScanResult resultFromParcel = ScanResult.CREATOR.createFromParcel(parcel);
+
+        assertEquals(RSSI, resultFromParcel.getRssi());
+        assertEquals(TIMESTAMP_NANOS, resultFromParcel.getTimestampNanos());
+        assertEquals(device, resultFromParcel.getDevice());
+        TestUtils.assertArrayEquals(SCAN_RECORD, resultFromParcel.getScanRecord().getBytes());
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        BluetoothDevice device =
+                BluetoothAdapter.getDefaultAdapter().getRemoteDevice(DEVICE_ADDRESS);
+        ScanResult result = new ScanResult(device, TestUtils.parseScanRecord(SCAN_RECORD), RSSI,
+                TIMESTAMP_NANOS);
+        assertEquals(0, result.describeContents());
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanSettingsTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanSettingsTest.java
new file mode 100644
index 0000000..7033c3c
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanSettingsTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.le.ScanSettings;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test for Bluetooth LE {@link ScanSettings}.
+ */
+public class ScanSettingsTest extends AndroidTestCase {
+
+    @SmallTest
+    public void testDefaultSettings() {
+        ScanSettings settings = new ScanSettings.Builder().build();
+        assertEquals(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, settings.getCallbackType());
+        assertEquals(ScanSettings.SCAN_MODE_LOW_POWER, settings.getScanMode());
+        assertEquals(0, settings.getScanResultType());
+        assertEquals(0, settings.getReportDelayMillis());
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        ScanSettings settings = new ScanSettings.Builder().build();
+        assertEquals(0, settings.describeContents());
+    }
+
+    @SmallTest
+    public void testReadWriteParcel() {
+        final long reportDelayMillis = 60 * 1000;
+        Parcel parcel = Parcel.obtain();
+        ScanSettings settings = new ScanSettings.Builder()
+                .setReportDelay(reportDelayMillis)
+                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
+                .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
+                .setNumOfMatches(ScanSettings.MATCH_NUM_MAX_ADVERTISEMENT)
+                .build();
+        settings.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        ScanSettings settingsFromParcel = ScanSettings.CREATOR.createFromParcel(parcel);
+        assertEquals(reportDelayMillis, settingsFromParcel.getReportDelayMillis());
+        assertEquals(ScanSettings.SCAN_MODE_LOW_LATENCY, settings.getScanMode());
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/TestUtils.java b/tests/tests/bluetooth/src/android/bluetooth/cts/TestUtils.java
new file mode 100644
index 0000000..7c5db9e
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/TestUtils.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.cts;
+
+import android.bluetooth.le.ScanRecord;
+
+import junit.framework.Assert;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+/**
+ * Utility class for Bluetooth CTS test.
+ */
+class TestUtils {
+
+    /**
+     * Utility method to call hidden ScanRecord.parseFromBytes method.
+     */
+    static ScanRecord parseScanRecord(byte[] bytes) {
+        Class<?> scanRecordClass = ScanRecord.class;
+        try {
+            Method method = scanRecordClass.getDeclaredMethod("parseFromBytes", byte[].class);
+            return (ScanRecord)method.invoke(null, bytes);
+        } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException
+                | InvocationTargetException e) {
+            return null;
+        }
+    }
+
+    // Assert two byte arrays are equal.
+    static void assertArrayEquals(byte[] expected, byte[] actual) {
+        if (!Arrays.equals(expected, actual)) {
+            Assert.fail("expected:<" + Arrays.toString(expected) +
+                    "> but was:<" + Arrays.toString(actual) + ">");
+        }
+    }
+}
diff --git a/tests/tests/content/AndroidManifest.xml b/tests/tests/content/AndroidManifest.xml
index d54bc02..6cddfd1 100644
--- a/tests/tests/content/AndroidManifest.xml
+++ b/tests/tests/content/AndroidManifest.xml
@@ -39,7 +39,10 @@
                     android:label="Test Tree"/>
 
     <!-- Used for PackageManager test, don't delete this permission-group -->
-    <permission-group android:name="android.permission-group.COST_MONEY"/>
+    <permission-group android:name="android.permission-group.COST_MONEY"
+            android:label="@string/permlab_costMoney"
+            android:description="@string/permdesc_costMoney"/>
+
     <!-- Used for PackageManager test, don't delete! -->
     <uses-configuration/>
     <uses-feature android:name="android.hardware.camera" />
diff --git a/tests/tests/content/res/values-land/styles.xml b/tests/tests/content/res/values-land/styles.xml
new file mode 100644
index 0000000..7717f10
--- /dev/null
+++ b/tests/tests/content/res/values-land/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="Theme_OrientationDependent">
+        <item name="themeDimension">111px</item>
+    </style>
+</resources>
diff --git a/tests/tests/content/res/values-ldltr/styles.xml b/tests/tests/content/res/values-ldltr/styles.xml
new file mode 100644
index 0000000..063fc4f
--- /dev/null
+++ b/tests/tests/content/res/values-ldltr/styles.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="Theme_LayoutDirectionDependent">
+        <item name="themeInteger">111</item>
+    </style>
+    <style name="Theme_LayoutIsRTL">
+        <item name="themeBoolean">false</item>
+    </style>
+</resources>
diff --git a/tests/tests/content/res/values-ldrtl/styles.xml b/tests/tests/content/res/values-ldrtl/styles.xml
new file mode 100644
index 0000000..c586192
--- /dev/null
+++ b/tests/tests/content/res/values-ldrtl/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="Theme_LayoutIsRTL">
+        <item name="themeBoolean">true</item>
+    </style>
+</resources>
diff --git a/tests/tests/content/res/values/strings.xml b/tests/tests/content/res/values/strings.xml
index c167278..c546d8a 100644
--- a/tests/tests/content/res/values/strings.xml
+++ b/tests/tests/content/res/values/strings.xml
@@ -176,4 +176,8 @@
 text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
 I think so, so how about double this string, like copy and paste! </string>
     <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+
+    <string name="permlab_costMoney">Cost money</string>
+    <string name="permdesc_costMoney">Do things that can cost you money.</string>
+
 </resources>
diff --git a/tests/tests/content/res/values/styles.xml b/tests/tests/content/res/values/styles.xml
index 20c80f8..72d4047 100644
--- a/tests/tests/content/res/values/styles.xml
+++ b/tests/tests/content/res/values/styles.xml
@@ -169,4 +169,11 @@
         <item name="android:windowSwipeToDismiss">false</item>
     </style>
 
+    <style name="Theme_LayoutDirectionDependent">
+        <item name="themeInteger">999</item>
+    </style>
+
+    <style name="Theme_OrientationDependent">
+        <item name="themeDimension">999px</item>
+    </style>
 </resources>
diff --git a/tests/tests/content/src/android/content/cts/ContentProviderTest.java b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
index 0b4d9aa..5fee379 100644
--- a/tests/tests/content/src/android/content/cts/ContentProviderTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
@@ -71,7 +71,7 @@
 
         ProviderInfo info1 = new ProviderInfo();
         info1.readPermission = "android.permission.READ_SMS";
-        info1.writePermission = "android.permission.WRITE_SMS";
+        info1.writePermission = null; // Guarded by an app op not a permission.
         mockContentProvider.attachInfo(getContext(), info1);
         assertSame(getContext(), mockContentProvider.getContext());
         assertEquals(info1.readPermission, mockContentProvider.getReadPermission());
@@ -156,10 +156,6 @@
         mockContentProvider.setWritePermissionWrapper(expected);
         assertEquals(expected, mockContentProvider.getWritePermission());
 
-        expected = "android.permission.WRITE_SMS";
-        mockContentProvider.setWritePermissionWrapper(expected);
-        assertEquals(expected, mockContentProvider.getWritePermission());
-
         mockContentProvider.setWritePermissionWrapper(null);
         assertNull(mockContentProvider.getWritePermission());
     }
diff --git a/tests/tests/content/src/android/content/cts/ContentResolverTest.java b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
index 4176da3..628f956 100644
--- a/tests/tests/content/src/android/content/cts/ContentResolverTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
@@ -58,6 +58,11 @@
     private static final Uri SELF_URI = Uri.parse("content://" + AUTHORITY + "/self/");
     private static final Uri CRASH_URI = Uri.parse("content://" + AUTHORITY + "/crash/");
 
+    private static final Uri LEVEL1_URI = Uri.parse("content://" + AUTHORITY + "/level/");
+    private static final Uri LEVEL2_URI = Uri.parse("content://" + AUTHORITY + "/level/child");
+    private static final Uri LEVEL3_URI = Uri.parse("content://" + AUTHORITY
+            + "/level/child/grandchild/");
+
     private static final String REMOTE_AUTHORITY = "remotectstest";
     private static final Uri REMOTE_TABLE1_URI = Uri.parse("content://"
                 + REMOTE_AUTHORITY + "/testtable1/");
@@ -88,7 +93,7 @@
         mContext = getContext();
         mContentResolver = mContext.getContentResolver();
 
-        android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+        MockContentProvider.setCrashOnLaunch(mContext, false);
 
         // add three rows to database when every test case start.
         ContentValues values = new ContentValues();
@@ -151,13 +156,12 @@
             fail("Content provider process is not gone!");
         }
         try {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 1);
+            MockContentProvider.setCrashOnLaunch(mContext, true);
             String type1 = mContentResolver.getType(REMOTE_TABLE1_URI);
-            assertEquals(android.provider.Settings.System.getInt(mContentResolver,
-                "__cts_crash_on_launch", 0), 0);
+            assertFalse(MockContentProvider.getCrashOnLaunch(mContext));
             assertTrue(type1.startsWith(ContentResolver.CURSOR_DIR_BASE_TYPE, 0));
         } finally {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+            MockContentProvider.setCrashOnLaunch(mContext, false);
         }
     }
 
@@ -352,12 +356,11 @@
 
     public void testCrashingQuery() {
         try {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 1);
+            MockContentProvider.setCrashOnLaunch(mContext, true);
             mCursor = mContentResolver.query(REMOTE_CRASH_URI, null, null, null, null);
-            assertEquals(android.provider.Settings.System.getInt(mContentResolver,
-                "__cts_crash_on_launch", 0), 0);
+            assertFalse(MockContentProvider.getCrashOnLaunch(mContext));
         } finally {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+            MockContentProvider.setCrashOnLaunch(mContext, false);
         }
 
         assertNotNull(mCursor);
@@ -570,16 +573,15 @@
     public void testCrashingOpenAssetFileDescriptor() throws IOException {
         AssetFileDescriptor afd = null;
         try {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 1);
+            MockContentProvider.setCrashOnLaunch(mContext, true);
             afd = mContentResolver.openAssetFileDescriptor(REMOTE_CRASH_URI, "rw");
-            assertEquals(android.provider.Settings.System.getInt(mContentResolver,
-                    "__cts_crash_on_launch", 0), 0);
+            assertFalse(MockContentProvider.getCrashOnLaunch(mContext));
             assertNotNull(afd);
             String str = consumeAssetFileDescriptor(afd);
             afd = null;
             assertEquals(str, "This is the openAssetFile test data!");
         } finally {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+            MockContentProvider.setCrashOnLaunch(mContext, false);
             if (afd != null) {
                 afd.close();
             }
@@ -602,17 +604,16 @@
     public void testCrashingOpenTypedAssetFileDescriptor() throws IOException {
         AssetFileDescriptor afd = null;
         try {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 1);
+            MockContentProvider.setCrashOnLaunch(mContext, true);
             afd = mContentResolver.openTypedAssetFileDescriptor(
                     REMOTE_CRASH_URI, "text/plain", null);
-            assertEquals(android.provider.Settings.System.getInt(mContentResolver,
-                    "__cts_crash_on_launch", 0), 0);
+            assertFalse(MockContentProvider.getCrashOnLaunch(mContext));
             assertNotNull(afd);
             String str = consumeAssetFileDescriptor(afd);
             afd = null;
             assertEquals(str, "This is the openTypedAssetFile test data!");
         } finally {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+            MockContentProvider.setCrashOnLaunch(mContext, false);
             if (afd != null) {
                 afd.close();
             }
@@ -957,6 +958,53 @@
         }
     }
 
+    public void testRegisterContentObserverDescendantBehavior() throws Exception {
+        final MockContentObserver mco1 = new MockContentObserver();
+        final MockContentObserver mco2 = new MockContentObserver();
+
+        // Register one content observer with notifyDescendants set to false, and
+        // another with true.
+        mContentResolver.registerContentObserver(LEVEL2_URI, false, mco1);
+        mContentResolver.registerContentObserver(LEVEL2_URI, true, mco2);
+
+        // Initially nothing has happened.
+        assertFalse(mco1.hadOnChanged());
+        assertFalse(mco2.hadOnChanged());
+
+        // Fire a change with the exact URI.
+        // Should signal both observers due to exact match, notifyDescendants doesn't matter.
+        mContentResolver.notifyChange(LEVEL2_URI, null);
+        Thread.sleep(200);
+        assertTrue(mco1.hadOnChanged());
+        assertTrue(mco2.hadOnChanged());
+        mco1.reset();
+        mco2.reset();
+
+        // Fire a change with a descendant URI.
+        // Should only signal observer with notifyDescendants set to true.
+        mContentResolver.notifyChange(LEVEL3_URI, null);
+        Thread.sleep(200);
+        assertFalse(mco1.hadOnChanged());
+        assertTrue(mco2.hadOnChanged());
+        mco2.reset();
+
+        // Fire a change with an ancestor URI.
+        // Should signal both observers due to ancestry, notifyDescendants doesn't matter.
+        mContentResolver.notifyChange(LEVEL1_URI, null);
+        Thread.sleep(200);
+        assertTrue(mco1.hadOnChanged());
+        assertTrue(mco2.hadOnChanged());
+        mco1.reset();
+        mco2.reset();
+
+        // Fire a change with an unrelated URI.
+        // Should signal neither observer.
+        mContentResolver.notifyChange(TABLE1_URI, null);
+        Thread.sleep(200);
+        assertFalse(mco1.hadOnChanged());
+        assertFalse(mco2.hadOnChanged());
+    }
+
     public void testNotifyChange1() {
         final MockContentObserver mco = new MockContentObserver();
 
diff --git a/tests/tests/content/src/android/content/cts/ContextTest.java b/tests/tests/content/src/android/content/cts/ContextTest.java
index 7c5dc50..c87a3e7 100644
--- a/tests/tests/content/src/android/content/cts/ContextTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextTest.java
@@ -19,7 +19,6 @@
 import com.android.cts.content.R;
 import com.android.internal.util.XmlUtils;
 
-
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.content.Context;
@@ -30,6 +29,7 @@
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
 import android.util.Xml;
+import android.view.WindowManager;
 
 import java.io.IOException;
 
@@ -155,6 +155,24 @@
         testTypedArray.recycle();
     }
 
+    public void testGetSystemService() {
+        // Test invalid service name
+        assertNull(mContext.getSystemService("invalid"));
+
+        // Test valid service name
+        assertNotNull(mContext.getSystemService(Context.WINDOW_SERVICE));
+    }
+
+    public void testGetSystemServiceByClass() {
+        // Test invalid service class
+        assertNull(mContext.getSystemService(Object.class));
+
+        // Test valid service name
+        assertNotNull(mContext.getSystemService(WindowManager.class));
+        assertEquals(mContext.getSystemService(Context.WINDOW_SERVICE),
+                mContext.getSystemService(WindowManager.class));
+    }
+
     private AttributeSet getAttributeSet(int resourceId) {
         final XmlResourceParser parser = getContext().getResources().getXml(
                 resourceId);
diff --git a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
index 62fc83a..672d3ed 100644
--- a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
@@ -18,7 +18,6 @@
 
 import com.android.cts.content.R;
 
-
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -44,6 +43,7 @@
 import android.os.IBinder;
 import android.preference.PreferenceManager;
 import android.test.AndroidTestCase;
+import android.view.WindowManager;
 
 import java.io.File;
 import java.io.IOException;
@@ -718,6 +718,16 @@
         assertNotNull(mContextWrapper.getSystemService(Context.WINDOW_SERVICE));
     }
 
+    public void testGetSystemServiceByClass() {
+        // Test invalid service class
+        assertNull(mContextWrapper.getSystemService(Object.class));
+
+        // Test valid service name
+        assertNotNull(mContextWrapper.getSystemService(WindowManager.class));
+        assertEquals(mContextWrapper.getSystemService(Context.WINDOW_SERVICE),
+                mContextWrapper.getSystemService(WindowManager.class));
+    }
+
     public void testGetAssets() {
         assertSame(mContext.getAssets(), mContextWrapper.getAssets());
     }
diff --git a/tests/tests/content/src/android/content/cts/MockContentProvider.java b/tests/tests/content/src/android/content/cts/MockContentProvider.java
index de82c0d..bddc82d 100644
--- a/tests/tests/content/src/android/content/cts/MockContentProvider.java
+++ b/tests/tests/content/src/android/content/cts/MockContentProvider.java
@@ -16,6 +16,7 @@
 
 package android.content.cts;
 
+import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -28,6 +29,7 @@
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.content.UriMatcher;
 import android.content.ContentProvider.PipeDataWriter;
 import android.content.res.AssetFileDescriptor;
@@ -122,15 +124,7 @@
     @Override
     public boolean onCreate() {
         mOpenHelper = new DatabaseHelper(getContext(), mDbName);
-        if (android.provider.Settings.System.getInt(getContext().getContentResolver(),
-                "__cts_crash_on_launch", 0) != 0) {
-            // The test case wants us to crash our process on first launch.
-            // Well, okay then!
-            Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
-            android.provider.Settings.System.putInt(getContext().getContentResolver(),
-                    "__cts_crash_on_launch", 0);
-            android.os.Process.killProcess(android.os.Process.myPid());
-        }
+        crashOnLaunchIfNeeded();
         return true;
     }
 
@@ -277,15 +271,7 @@
             break;
 
         case CRASH_ID:
-            if (android.provider.Settings.System.getInt(getContext().getContentResolver(),
-                    "__cts_crash_on_launch", 0) != 0) {
-                // The test case wants us to crash while querying.
-                // Well, okay then!
-                Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
-                android.provider.Settings.System.putInt(getContext().getContentResolver(),
-                        "__cts_crash_on_launch", 0);
-                android.os.Process.killProcess(android.os.Process.myPid());
-            }
+            crashOnLaunchIfNeeded();
             qb.setTables("TestTable1");
             qb.setProjectionMap(CTSDBTABLE1_LIST_PROJECTION_MAP);
             break;
@@ -351,15 +337,7 @@
     public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
         switch (URL_MATCHER.match(uri)) {
             case CRASH_ID:
-                if (android.provider.Settings.System.getInt(getContext().getContentResolver(),
-                        "__cts_crash_on_launch", 0) != 0) {
-                    // The test case wants us to crash while querying.
-                    // Well, okay then!
-                    Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
-                    android.provider.Settings.System.putInt(getContext().getContentResolver(),
-                            "__cts_crash_on_launch", 0);
-                    android.os.Process.killProcess(android.os.Process.myPid());
-                }
+                crashOnLaunchIfNeeded();
                 return new AssetFileDescriptor(
                         openPipeHelper(uri, null, null,
                                 "This is the openAssetFile test data!", this), 0,
@@ -375,15 +353,7 @@
             throws FileNotFoundException {
         switch (URL_MATCHER.match(uri)) {
             case CRASH_ID:
-                if (android.provider.Settings.System.getInt(getContext().getContentResolver(),
-                        "__cts_crash_on_launch", 0) != 0) {
-                    // The test case wants us to crash while querying.
-                    // Well, okay then!
-                    Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
-                    android.provider.Settings.System.putInt(getContext().getContentResolver(),
-                            "__cts_crash_on_launch", 0);
-                    android.os.Process.killProcess(android.os.Process.myPid());
-                }
+                crashOnLaunchIfNeeded();
                 return new AssetFileDescriptor(
                         openPipeHelper(uri, null, null,
                                 "This is the openTypedAssetFile test data!", this), 0,
@@ -414,4 +384,36 @@
             }
         }
     }
+
+    private void crashOnLaunchIfNeeded() {
+        if (getCrashOnLaunch(getContext())) {
+            // The test case wants us to crash our process on first launch.
+            // Well, okay then!
+            Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
+            setCrashOnLaunch(getContext(), false);
+            android.os.Process.killProcess(android.os.Process.myPid());
+        }
+    }
+
+    public static boolean getCrashOnLaunch(Context context) {
+        File file = getCrashOnLaunchFile(context);
+        return file.exists();
+    }
+
+    public static void setCrashOnLaunch(Context context, boolean value) {
+        File file = getCrashOnLaunchFile(context);
+        if (value) {
+            try {
+                file.createNewFile();
+            } catch (IOException ex) {
+                throw new RuntimeException("Could not create crash on launch file.", ex);
+            }
+        } else {
+            file.delete();
+        }
+    }
+
+    private static File getCrashOnLaunchFile(Context context) {
+        return context.getFileStreamPath("MockContentProvider.crashonlaunch");
+    }
 }
diff --git a/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
index fc8d9b8..8b00624 100644
--- a/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
@@ -24,8 +24,9 @@
 import android.test.AndroidTestCase;
 
 public class PermissionGroupInfoTest extends AndroidTestCase {
-    private static final String PERMISSIONGROUP_NAME = "android.permission-group.COST_MONEY";
-    private static final String DEFAULT_DISCRIPTION = "Do things that can cost you money.";
+    private static final String GROUP = "android.permission-group.COST_MONEY";
+    private static final String GROUP_NAME = "Cost money";
+    private static final String GROUP_DESCRIPTION = "Do things that can cost you money.";
 
     public void testPermissionGroupInfo() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
@@ -33,14 +34,15 @@
         // Test constructors
         new PermissionGroupInfo();
         PermissionGroupInfo permissionGroupInfo = pm
-                .getPermissionGroupInfo(PERMISSIONGROUP_NAME, 0);
+                .getPermissionGroupInfo(GROUP, 0);
         PermissionGroupInfo infoFromExisted = new PermissionGroupInfo(permissionGroupInfo);
         checkInfoSame(permissionGroupInfo, infoFromExisted);
 
         // Test toString, describeContents, loadDescription
         assertNotNull(permissionGroupInfo.toString());
         assertEquals(0, permissionGroupInfo.describeContents());
-        assertEquals(DEFAULT_DISCRIPTION, permissionGroupInfo.loadDescription(pm));
+        assertEquals(GROUP_NAME, permissionGroupInfo.loadLabel(pm));
+        assertEquals(GROUP_DESCRIPTION, permissionGroupInfo.loadDescription(pm));
 
         // Test writeToParcel
         permissionGroupInfo.writeToParcel(p, 0);
diff --git a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
index 349cb47..6d1c2e4 100644
--- a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
+++ b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
@@ -18,6 +18,8 @@
 
 import org.xmlpull.v1.XmlPullParser;
 
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.content.res.Resources.Theme;
@@ -25,9 +27,12 @@
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.util.Xml;
+import android.view.View;
 
 import com.android.cts.content.R;
 
+import java.util.Locale;
+
 
 public class Resources_ThemeTest extends AndroidTestCase {
 
@@ -78,4 +83,51 @@
         assertFalse(mResTheme.resolveAttribute(R.raw.testmp3, value, false));
     }
 
+    public void testGetChangingConfigurations() {
+        Resources.Theme theme = getContext().getResources().newTheme();
+        assertEquals("Initial changing configuration mask is empty",
+                0, theme.getChangingConfigurations());
+
+        theme.applyStyle(R.style.Theme_OrientationDependent, true);
+        assertEquals("First call to Theme.applyStyle() sets changing configuration",
+                ActivityInfo.CONFIG_ORIENTATION, theme.getChangingConfigurations());
+
+        theme.applyStyle(R.style.Theme_LayoutDirectionDependent, true);
+        assertEquals("Multiple calls to Theme.applyStyle() update changing configuration",
+                ActivityInfo.CONFIG_ORIENTATION | ActivityInfo.CONFIG_LAYOUT_DIRECTION,
+                theme.getChangingConfigurations());
+
+        Resources.Theme other = getContext().getResources().newTheme();
+        other.setTo(theme);
+        assertEquals("Theme.setTheme() copies changing confguration",
+                ActivityInfo.CONFIG_ORIENTATION | ActivityInfo.CONFIG_LAYOUT_DIRECTION,
+                theme.getChangingConfigurations());
+    }
+
+    public void testRebase() {
+        Resources res = getContext().getResources();
+        Configuration config = res.getConfiguration();
+        config.setLocale(Locale.ENGLISH);
+        assertEquals("Theme will be created in LTR config",
+                View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
+
+        Resources.Theme theme = res.newTheme();
+        theme.applyStyle(R.style.Theme_LayoutIsRTL, true);
+
+        TypedArray t = theme.obtainStyledAttributes(new int[] { R.attr.themeBoolean });
+        assertEquals("Theme was created in LTR config", false, t.getBoolean(0, true));
+        t.recycle();
+
+        config.setLocale(new Locale("iw"));
+        res.updateConfiguration(config, null);
+
+        assertEquals("Theme will be rebased in RTL config",
+                View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
+
+        theme.rebase();
+
+        t = theme.obtainStyledAttributes(new int[] { R.attr.themeBoolean });
+        assertEquals("Theme was rebased in RTL config", true, t.getBoolean(0, false));
+        t.recycle();
+    }
 }
diff --git a/tests/tests/database/src/android/database/cts/AbstractCursorTest.java b/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
index 078c2dd..c4371af 100644
--- a/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
+++ b/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
@@ -431,7 +431,6 @@
         public TestAbstractCursor(String[] columnNames, ArrayList<ArrayList> rows) {
             int colCount = columnNames.length;
             boolean foundID = false;
-            mRowIdColumnIndex = 0;
 
             // Add an _id column if not in columnNames
             for (int i = 0; i < colCount; ++i) {
diff --git a/tests/tests/deqp/Android.mk b/tests/tests/deqp/Android.mk
index d8a4dda..ce8678b 100644
--- a/tests/tests/deqp/Android.mk
+++ b/tests/tests/deqp/Android.mk
@@ -21,6 +21,13 @@
 # All APIs share the same package
 LOCAL_PACKAGE_NAME := com.drawelements.deqp
 
+include $(LOCAL_PATH)/deqp_egl.mk
 include $(LOCAL_PATH)/deqp_gles2.mk
 include $(LOCAL_PATH)/deqp_gles3.mk
 include $(LOCAL_PATH)/deqp_gles31.mk
+
+# Make the deqp app and copy it to CTS out dir.
+cts_deqp_name := com.drawelements.deqp
+cts_deqp_apk := $(CTS_TESTCASES_OUT)/$(cts_deqp_name).apk
+$(cts_deqp_apk): $(call intermediates-dir-for,APPS,$(cts_deqp_name))/package.apk
+	$(call copy-file-to-target)
diff --git a/apps/CtsVerifier/lib/Android.mk b/tests/tests/deqp/deqp_egl.mk
similarity index 71%
rename from apps/CtsVerifier/lib/Android.mk
rename to tests/tests/deqp/deqp_egl.mk
index 56a3fa8..6b4eed6 100644
--- a/apps/CtsVerifier/lib/Android.mk
+++ b/tests/tests/deqp/deqp_egl.mk
@@ -1,5 +1,4 @@
-#
-# Copyright (C) 2011 The Android Open Source Project
+# Copyright (C) 2015 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -12,6 +11,11 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-#
 
-include $(call all-subdir-makefiles)
+# Dummy target to make dEQP EGL test list generation consistent with other
+# tests.
+
+DEQP_API := egl
+DEQP_TEST_NAME := dEQP-EGL
+
+include $(BUILD_CTS_DEQP_PACKAGE)
diff --git a/tests/tests/deqp/egl-temporary-failures.txt b/tests/tests/deqp/egl-temporary-failures.txt
new file mode 100644
index 0000000..1a3bb94
--- /dev/null
+++ b/tests/tests/deqp/egl-temporary-failures.txt
@@ -0,0 +1,780 @@
+dEQP-EGL.functional.sharing.gles2.multithread.simple.textures#gen_delete
+dEQP-EGL.functional.sharing.gles2.multithread.simple.textures#teximage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple.textures#teximage2d_texsubimage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple.textures#teximage2d_render
+dEQP-EGL.functional.sharing.gles2.multithread.simple.textures#teximage2d_texsubimage2d_render
+dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source#create_destroy
+dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source#create_texture
+dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source#texsubimage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source#teximage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source#create_texture_render
+dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source#texsubimage2d_render
+dEQP-EGL.functional.sharing.gles2.multithread.simple.images.texture_source#teximage2d_render
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.gen_delete#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.teximage2d#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.textures.texsubimage2d#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.gen_delete#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.bufferdata#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.buffers.buffersubdata#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.create_destroy#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.source#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.shaders.compile#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.create_destroy#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.attach_detach#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#15
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#17
+dEQP-EGL.functional.sharing.gles2.multithread.random.programs.link#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#8
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.create_destroy#19
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#1
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#4
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#6
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#9
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#16
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.teximage2d#18
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.texsubimage2d#2
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.texsubimage2d#3
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.texsubimage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.texsubimage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.texsubimage2d#12
+dEQP-EGL.functional.sharing.gles2.multithread.random.images.texsubimage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.buffers#gen_delete
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.buffers#bufferdata
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.buffers#buffersubdata
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.buffers#bufferdata_render
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.textures#gen_delete
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.textures#teximage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.textures#teximage2d_texsubimage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.textures#teximage2d_texsubimage2d_render
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.images.texture_source#texsubimage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.images.texture_source#teximage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.images.texture_source#create_texture_render
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_sync.images.texture_source#teximage2d_render
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.gen_delete#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.teximage2d#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.textures.texsubimage2d#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.gen_delete#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.bufferdata#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.buffers.buffersubdata#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.create_destroy#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.source#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.shaders.compile#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.create_destroy#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.attach_detach#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.programs.link#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.create_destroy#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.create_destroy#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.teximage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.teximage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.teximage2d#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.teximage2d#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.texsubimage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.buffers#gen_delete
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.buffers#bufferdata
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.buffers#buffersubdata
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.textures#gen_delete
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.textures#teximage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.textures#teximage2d_texsubimage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.shaders#vtx_create_destroy
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.shaders#vtx_shadersource
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.shaders#vtx_compile
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.shaders#frag_create_destroy
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.shaders#frag_shadersource
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.shaders#frag_compile
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.images.texture_source#create_destroy
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.images.texture_source#create_texture
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.images.texture_source#texsubimage2d
+dEQP-EGL.functional.sharing.gles2.multithread.simple_egl_server_sync.images.texture_source#teximage2d
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.gen_delete#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.teximage2d#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.textures.texsubimage2d#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.gen_delete#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.bufferdata#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.buffers.buffersubdata#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.create_destroy#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.source#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.shaders.compile#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.create_destroy#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.attach_detach#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.programs.link#18
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#11
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.create_destroy#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#1
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#4
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#6
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#9
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#15
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#17
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d#19
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#0
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#2
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#3
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#5
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#7
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#8
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#10
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#12
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#13
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#14
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#16
+dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d#19
+dEQP-EGL.functional.multithread#config
+dEQP-EGL.functional.multithread#pbuffer
+dEQP-EGL.functional.multithread#pixmap
+dEQP-EGL.functional.multithread#single_window
+dEQP-EGL.functional.multithread#context
+dEQP-EGL.functional.multithread#pbuffer_pixmap
+dEQP-EGL.functional.multithread#pixmap_window
+dEQP-EGL.functional.multithread#pixmap_single_window
+dEQP-EGL.functional.multithread#pixmap_context
+dEQP-EGL.functional.multithread#pbuffer_pixmap_context
+dEQP-EGL.functional.multithread#pixmap_single_window_context
diff --git a/tests/tests/deqp/gles3-temporary-failures.txt b/tests/tests/deqp/gles3-temporary-failures.txt
new file mode 100644
index 0000000..c2127a6
--- /dev/null
+++ b/tests/tests/deqp/gles3-temporary-failures.txt
@@ -0,0 +1,2627 @@
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_float
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_mat2
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_mat2_offset_1
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_mat3
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_mat3_offset_1
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_mat4
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_mat4_offset_1
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_vec2
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_vec3
+dEQP-GLES3.functional.attribute_location.bind_aliasing#cond_vec4
+dEQP-GLES3.functional.attribute_location.bind_aliasing#max_cond_float
+dEQP-GLES3.functional.attribute_location.bind_aliasing#max_cond_mat2
+dEQP-GLES3.functional.attribute_location.bind_aliasing#max_cond_mat3
+dEQP-GLES3.functional.attribute_location.bind_aliasing#max_cond_mat4
+dEQP-GLES3.functional.attribute_location.bind_aliasing#max_cond_vec2
+dEQP-GLES3.functional.attribute_location.bind_aliasing#max_cond_vec3
+dEQP-GLES3.functional.attribute_location.bind_aliasing#max_cond_vec4
+dEQP-GLES3.functional.attribute_location.bind_hole#vec4
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#float
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#int
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#ivec2
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#ivec3
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#ivec4
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat2
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat2x2
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat2x3
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat2x4
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat3
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat3x2
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat3x3
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat3x4
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat4
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat4x2
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat4x3
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#mat4x4
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#uint
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#uvec2
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#uvec3
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#uvec4
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#vec2
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#vec3
+dEQP-GLES3.functional.attribute_location.bind_relink_hole#vec4
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#float
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#int
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#ivec2
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#ivec3
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#ivec4
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat2
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat2x2
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat2x3
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat2x4
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat3
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat3x2
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat3x3
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat3x4
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat4
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat4x2
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat4x3
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#mat4x4
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#uint
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#uvec2
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#uvec3
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#uvec4
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#vec2
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#vec3
+dEQP-GLES3.functional.attribute_location.mixed_relink_hole#vec4
+dEQP-GLES3.functional.clipping.line#wide_line_z_clip_viewport_center
+dEQP-GLES3.functional.clipping.line#wide_line_z_clip_viewport_corner
+dEQP-GLES3.functional.clipping.polygon_edge#poly_fan
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_one#clip_neg_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_one#clip_pos_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_and_neg_x_neg_y_and_pos_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_and_pos_x_neg_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_neg_x_neg_z_and_pos_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_neg_y_neg_z_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_neg_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_neg_y_and_pos_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_neg_z_and_neg_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_neg_z_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_neg_x_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_neg_x_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_neg_x_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_neg_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_pos_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_pos_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_pos_x_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_pos_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_y_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_x_pos_z_and_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_y_and_pos_y_neg_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_z_and_neg_x_neg_y_pos_z_and_pos_x_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_z_and_pos_x_pos_z_and_neg_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_z_and_pos_x_pos_z_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_z_and_pos_x_pos_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_z_and_pos_x_pos_z_and_pos_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_neg_z_and_pos_y_neg_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_pos_y_and_pos_x_neg_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_pos_y_and_pos_x_pos_z_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_pos_z_and_neg_y_neg_z_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_x_pos_z_and_pos_x_pos_y_pos_z_and_neg_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_y_and_neg_x_neg_y_and_pos_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_y_and_pos_x_neg_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_y_neg_z_and_neg_x_neg_y_pos_z_and_pos_x_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_y_neg_z_and_pos_x_neg_y_pos_z_and_neg_x_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_y_neg_z_and_pos_y_pos_z_and_neg_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_y_neg_z_and_pos_y_pos_z_and_pos_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_y_pos_z_and_neg_x_pos_y_pos_z_and_pos_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_neg_y_pos_z_and_pos_x_pos_y_pos_z_and_neg_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_and_neg_x_neg_y_and_pos_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_and_pos_x_neg_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_neg_z_and_pos_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_neg_z_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_neg_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_neg_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_neg_x_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_neg_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_pos_x_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_pos_x_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_pos_x_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_pos_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_y_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_x_pos_z_and_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_neg_y_neg_z_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_pos_x_neg_z_and_neg_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_pos_x_pos_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_y_and_pos_y_neg_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_z_and_neg_x_pos_z_and_neg_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_z_and_neg_x_pos_z_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_z_and_neg_x_pos_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_z_and_neg_x_pos_z_and_pos_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_z_and_pos_x_neg_y_pos_z_and_neg_x_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_neg_z_and_pos_y_neg_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_pos_y_and_neg_x_neg_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_pos_y_and_neg_x_pos_z_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_pos_z_and_neg_x_pos_y_pos_z_and_pos_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_x_pos_z_and_neg_y_neg_z_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_y_and_neg_x_neg_y_and_pos_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_y_and_pos_x_neg_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_y_neg_z_and_neg_y_pos_z_and_neg_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_three#clip_pos_y_neg_z_and_neg_y_pos_z_and_pos_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_and_neg_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_and_pos_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_neg_x_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_neg_x_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_neg_x_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_neg_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_pos_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_pos_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_pos_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_pos_x_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_pos_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_pos_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_y_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_neg_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_x_pos_z_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_y_and_neg_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_y_and_pos_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_y_neg_z_and_neg_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_y_neg_z_and_pos_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_y_pos_z_and_neg_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_neg_y_pos_z_and_pos_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_and_neg_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_and_pos_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_neg_x_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_neg_x_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_neg_x_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_neg_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_neg_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_pos_x_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_pos_x_pos_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_pos_x_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_pos_x_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_pos_x_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_pos_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_y_and_pos_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_neg_z_and_neg_y_pos_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_x_pos_z_and_neg_y_neg_z
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_y_and_neg_x_neg_y
+dEQP-GLES3.functional.clipping.triangle_vertex.clip_two#clip_pos_y_and_pos_x_neg_y
+dEQP-GLES3.functional.depth_stencil_clear#depth_stencil_masked
+dEQP-GLES3.functional.depth_stencil_clear#depth_stencil_scissored_masked
+dEQP-GLES3.functional.depth_stencil_clear#stencil_masked
+dEQP-GLES3.functional.depth_stencil_clear#stencil_scissored_masked
+dEQP-GLES3.functional.fbo.api#attachment_query_default_fbo
+dEQP-GLES3.functional.fbo.api#attachment_query_texcube
+dEQP-GLES3.functional.fbo.api#texture_levels
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r11f_g11f_b10f_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r11f_g11f_b10f_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r11f_g11f_b10f_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r11f_g11f_b10f_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r11f_g11f_b10f_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r11f_g11f_b10f_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r16f
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r16f_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r16f_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r16f_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r16f_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r16f_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r16f_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r32f
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r32f_nearest_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r32f_nearest_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r32f_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r32f_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r8_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r8_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r8_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r8_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r8_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#r8_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg16f
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg16f_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg16f_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg16f_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg16f_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg16f_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg16f_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg32f
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg32f_nearest_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg32f_nearest_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg32f_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg32f_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg8
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg8_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg8_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg8_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg8_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg8_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rg8_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb10_a2
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb10_a2_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb10_a2_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb10_a2_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb10_a2_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb10_a2_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb10_a2_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb565
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb565_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb565_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb565_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb565_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb565_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb565_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb5_a1_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb5_a1_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb5_a1_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb5_a1_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb5_a1_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb5_a1_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb8_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb8_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb8_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb8_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb8_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgb8_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba16f
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba16f_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba16f_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba16f_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba16f_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba16f_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba16f_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba32f
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba32f_nearest_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba32f_nearest_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba32f_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba32f_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba4_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba4_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba4_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba4_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba4_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba4_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba8
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba8_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba8_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba8_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba8_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba8_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#rgba8_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#srgb8_alpha8
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#srgb8_alpha8_linear_out_of_bounds_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#srgb8_alpha8_linear_out_of_bounds_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#srgb8_alpha8_linear_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#srgb8_alpha8_linear_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#srgb8_alpha8_nearest_scale_blit_from_default
+dEQP-GLES3.functional.fbo.blit.default_framebuffer#srgb8_alpha8_nearest_scale_blit_to_default
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_linear
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_nearest
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_dst_x_linear
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_dst_x_nearest
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_dst_y_linear
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_dst_y_nearest
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_src_dst_x_linear
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_src_dst_x_nearest
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_src_dst_y_linear
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_src_dst_y_nearest
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_src_x_linear
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_src_x_nearest
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_src_y_linear
+dEQP-GLES3.functional.fbo.blit.rect#out_of_bounds_reverse_src_y_nearest
+dEQP-GLES3.functional.fbo.color.blend#r16f_src_over
+dEQP-GLES3.functional.fbo.color.blend#rg16f_src_over
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0#red_float
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0#red_half_float_oes
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0#red_unsigned_byte
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0#rg_float
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0#rg_half_float_oes
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0#rg_unsigned_byte
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.depth#depth_component_unsigned_int
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.depth#depth_component_unsigned_short
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.depth#depth_stencil_unsigned_int_24_8
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.depth#stencil_index8
+dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.stencil#depth_stencil_unsigned_int_24_8
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#red_float
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#red_unsigned_byte
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rgb16i
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rgb16ui
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rgb32i
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rgb32ui
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rgb8i
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rgb8_snorm
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rgb8ui
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rgb9_e5
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rg_float
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0#rg_unsigned_byte
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth#stencil_index8
+dEQP-GLES3.functional.fbo.completeness.size#zero
+dEQP-GLES3.functional.fbo.invalidate.sub#unbind_blit_color
+dEQP-GLES3.functional.fbo.invalidate.sub#unbind_blit_msaa_color
+dEQP-GLES3.functional.fbo.invalidate.sub#unbind_blit_msaa_stencil
+dEQP-GLES3.functional.fbo.invalidate.sub#unbind_blit_stencil
+dEQP-GLES3.functional.fbo.invalidate.whole#unbind_blit_color
+dEQP-GLES3.functional.fbo.invalidate.whole#unbind_blit_msaa_color
+dEQP-GLES3.functional.fbo.invalidate.whole#unbind_blit_msaa_stencil
+dEQP-GLES3.functional.fbo.invalidate.whole#unbind_blit_stencil
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#rbo_r16f
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#rbo_r16f_depth_rbo_depth24_stencil8
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#rbo_r16f_depth_stencil_rbo_depth24_stencil8
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#rbo_rg16f
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#rbo_rg16f_depth_rbo_depth24_stencil8
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#rbo_rg16f_depth_stencil_rbo_depth24_stencil8
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#tex2d_r16f
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#tex2d_r16f_depth_rbo_depth24_stencil8
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#tex2d_r16f_depth_stencil_rbo_depth24_stencil8
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#tex2d_rg16f
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#tex2d_rg16f_depth_rbo_depth24_stencil8
+dEQP-GLES3.functional.fbo.render.shared_colorbuffer#tex2d_rg16f_depth_stencil_rbo_depth24_stencil8
+dEQP-GLES3.functional.fence_sync#client_wait_sync_finish
+dEQP-GLES3.functional.fence_sync#client_wait_sync_flush_auto
+dEQP-GLES3.functional.fence_sync#client_wait_sync_flush_manual
+dEQP-GLES3.functional.fence_sync#client_wait_sync_largedraw
+dEQP-GLES3.functional.fence_sync#client_wait_sync_noflush
+dEQP-GLES3.functional.fence_sync#client_wait_sync_timeout_largedraw
+dEQP-GLES3.functional.fence_sync#wait_sync_largedraw
+dEQP-GLES3.functional.flush_finish#flush_wait
+dEQP-GLES3.functional.fragment_ops.depth_stencil.random#11
+dEQP-GLES3.functional.fragment_ops.depth_stencil.random#20
+dEQP-GLES3.functional.fragment_ops.depth_stencil.random#24
+dEQP-GLES3.functional.fragment_ops.depth_stencil.random#5
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#25
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#27
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#40
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#44
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#54
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#7
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#73
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#78
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#80
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#82
+dEQP-GLES3.functional.fragment_ops.interaction.basic_shader#84
+dEQP-GLES3.functional.fragment_ops.random#19
+dEQP-GLES3.functional.fragment_ops.random#22
+dEQP-GLES3.functional.fragment_ops.random#27
+dEQP-GLES3.functional.fragment_ops.random#48
+dEQP-GLES3.functional.fragment_ops.random#59
+dEQP-GLES3.functional.fragment_ops.random#61
+dEQP-GLES3.functional.fragment_ops.random#74
+dEQP-GLES3.functional.fragment_ops.scissor#framebuffer_blit_center
+dEQP-GLES3.functional.fragment_ops.scissor#framebuffer_blit_corner
+dEQP-GLES3.functional.fragment_ops.scissor#framebuffer_blit_none
+dEQP-GLES3.functional.fragment_ops.stencil#cmp_not_equal
+dEQP-GLES3.functional.fragment_ops.stencil#decr_wrap_stencil_fail
+dEQP-GLES3.functional.fragment_ops.stencil#depth_fail_replace
+dEQP-GLES3.functional.fragment_ops.stencil#depth_pass_replace
+dEQP-GLES3.functional.fragment_ops.stencil#incr_wrap_stencil_fail
+dEQP-GLES3.functional.fragment_ops.stencil#invert_stencil_fail
+dEQP-GLES3.functional.fragment_ops.stencil#stencil_fail_replace
+dEQP-GLES3.functional.fragment_ops.stencil#zero_stencil_fail
+dEQP-GLES3.functional.fragment_out.random#12
+dEQP-GLES3.functional.fragment_out.random#2
+dEQP-GLES3.functional.fragment_out.random#28
+dEQP-GLES3.functional.fragment_out.random#33
+dEQP-GLES3.functional.fragment_out.random#36
+dEQP-GLES3.functional.fragment_out.random#50
+dEQP-GLES3.functional.fragment_out.random#51
+dEQP-GLES3.functional.fragment_out.random#59
+dEQP-GLES3.functional.fragment_out.random#76
+dEQP-GLES3.functional.fragment_out.random#78
+dEQP-GLES3.functional.fragment_out.random#79
+dEQP-GLES3.functional.fragment_out.random#93
+dEQP-GLES3.functional.fragment_out.random#94
+dEQP-GLES3.functional.fragment_out.random#96
+dEQP-GLES3.functional.implementation_limits#extensions
+dEQP-GLES3.functional.lifetime.attach.deleted_input#buffer_vertex_array
+dEQP-GLES3.functional.lifetime.attach.deleted_name#buffer_transform_feedback
+dEQP-GLES3.functional.lifetime.attach.deleted_name#buffer_vertex_array
+dEQP-GLES3.functional.lifetime.attach.deleted_name#renderbuffer_framebuffer
+dEQP-GLES3.functional.lifetime.attach.deleted_name#texture_framebuffer
+dEQP-GLES3.functional.lifetime.attach.deleted_output#buffer_transform_feedback
+dEQP-GLES3.functional.multisample.default_framebuffer#stencil
+dEQP-GLES3.functional.multisample.fbo_4_samples#stencil
+dEQP-GLES3.functional.multisample.fbo_max_samples#stencil
+dEQP-GLES3.functional.negative_api.buffer#clear
+dEQP-GLES3.functional.negative_api.buffer#draw_buffers
+dEQP-GLES3.functional.negative_api.buffer#framebuffer_texture2d
+dEQP-GLES3.functional.negative_api.buffer#framebuffer_texture_layer
+dEQP-GLES3.functional.negative_api.buffer#invalidate_framebuffer
+dEQP-GLES3.functional.negative_api.buffer#invalidate_sub_framebuffer
+dEQP-GLES3.functional.negative_api.buffer#read_buffer
+dEQP-GLES3.functional.negative_api.shader#program_binary
+dEQP-GLES3.functional.negative_api.shader#program_parameteri
+dEQP-GLES3.functional.negative_api.state#get_framebuffer_attachment_parameteriv
+dEQP-GLES3.functional.negative_api.state#get_internalformativ
+dEQP-GLES3.functional.negative_api.texture#compressedteximage3d_max_level
+dEQP-GLES3.functional.negative_api.texture#compressedtexsubimage2d_max_level
+dEQP-GLES3.functional.negative_api.texture#compressedtexsubimage3d_max_level
+dEQP-GLES3.functional.negative_api.texture#generatemipmap
+dEQP-GLES3.functional.negative_api.texture#teximage3d
+dEQP-GLES3.functional.pbo.native#clears
+dEQP-GLES3.functional.pbo.native#triangles
+dEQP-GLES3.functional.pbo.renderbuffer#rgb10_a2_clears
+dEQP-GLES3.functional.pbo.renderbuffer#rgb10_a2_triangles
+dEQP-GLES3.functional.pbo.renderbuffer#rgb565_triangles
+dEQP-GLES3.functional.pbo.renderbuffer#rgb5_a1_clears
+dEQP-GLES3.functional.pbo.renderbuffer#rgb5_a1_triangles
+dEQP-GLES3.functional.polygon_offset#default_factor_1_slope
+dEQP-GLES3.functional.polygon_offset#default_result_depth_clamp
+dEQP-GLES3.functional.polygon_offset#fixed24_factor_1_slope
+dEQP-GLES3.functional.polygon_offset#fixed24_result_depth_clamp
+dEQP-GLES3.functional.polygon_offset#float32_displacement_with_units
+dEQP-GLES3.functional.polygon_offset#float32_result_depth_clamp
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_byte#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_byte#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_byte#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_int#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_int#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_int#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_short#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_short#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_duplicate_restarts.points.unsigned_short#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_byte#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_byte#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_byte#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_int#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_int#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_int#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_short#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_short#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart_duplicate_restarts.points.unsigned_short#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_byte#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_byte#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_byte#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_int#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_int#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_int#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_short#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_short#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart_end_restart.points.unsigned_short#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_byte#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_byte#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_byte#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_int#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_int#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_int#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_short#draw_elements
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_short#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.begin_restart.points.unsigned_short#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_byte#draw_elements
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_byte#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_byte#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_int#draw_elements
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_int#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_int#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_short#draw_elements
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_short#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.duplicate_restarts.points.unsigned_short#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_byte#draw_elements
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_byte#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_byte#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_int#draw_elements
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_int#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_int#draw_range_elements
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_short#draw_elements
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_short#draw_elements_instanced
+dEQP-GLES3.functional.primitive_restart.end_restart_duplicate_restarts.points.unsigned_short#draw_range_elements
+dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.interpolation#lines_wide
+dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives#lines
+dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives#lines_wide
+dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.interpolation#lines_wide
+dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives#lines
+dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives#lines_wide
+dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives#points
+dEQP-GLES3.functional.rasterization.interpolation.basic#line_loop_wide
+dEQP-GLES3.functional.rasterization.interpolation.basic#line_strip_wide
+dEQP-GLES3.functional.rasterization.interpolation.basic#lines_wide
+dEQP-GLES3.functional.rasterization.interpolation.projected#line_loop_wide
+dEQP-GLES3.functional.rasterization.interpolation.projected#line_strip_wide
+dEQP-GLES3.functional.rasterization.interpolation.projected#lines_wide
+dEQP-GLES3.functional.rasterization.primitives#line_loop_wide
+dEQP-GLES3.functional.rasterization.primitives#lines
+dEQP-GLES3.functional.rasterization.primitives#line_strip_wide
+dEQP-GLES3.functional.rasterization.primitives#lines_wide
+dEQP-GLES3.functional.shaders.arrays.declaration#multiple_declarations_single_statement_explicit_fragment
+dEQP-GLES3.functional.shaders.arrays.declaration#multiple_declarations_single_statement_explicit_vertex
+dEQP-GLES3.functional.shaders.arrays.declaration#multiple_declarations_single_statement_implicit_fragment
+dEQP-GLES3.functional.shaders.arrays.declaration#multiple_declarations_single_statement_implicit_vertex
+dEQP-GLES3.functional.shaders.arrays.invalid#empty_declaration_without_var_name_fragment
+dEQP-GLES3.functional.shaders.arrays.invalid#empty_declaration_without_var_name_vertex
+dEQP-GLES3.functional.shaders.arrays.invalid#empty_declaration_with_var_name_fragment
+dEQP-GLES3.functional.shaders.arrays.invalid#empty_declaration_with_var_name_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#float_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#float_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#float_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#float_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#float_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#float_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec2_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec2_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec2_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec2_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec2_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec2_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec3_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec3_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec3_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec3_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec3_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec3_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec4_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec4_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec4_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec4_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec4_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isinf#vec4_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#float_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#float_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#float_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#float_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#float_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#float_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec2_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec2_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec2_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec2_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec2_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec2_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec3_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec3_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec3_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec3_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec3_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec3_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec4_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec4_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec4_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec4_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec4_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.isnan#vec4_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#float_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#float_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#float_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#float_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#float_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#float_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec2_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec2_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec2_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec2_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec2_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec2_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec3_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec3_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec3_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec3_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec3_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec3_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec4_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec4_highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec4_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec4_lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec4_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.common.modf#vec4_mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#packsnorm2x16_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#packsnorm2x16_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#packsnorm2x16_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#packunorm2x16_highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#packunorm2x16_lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#packunorm2x16_mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#unpackhalf2x16_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#unpackhalf2x16_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#unpacksnorm2x16_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#unpacksnorm2x16_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#unpackunorm2x16_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack#unpackunorm2x16_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.precision.acosh.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.acosh.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.acosh.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.acosh.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.acosh.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.acosh.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.acosh.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.acosh.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atanh.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atanh.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atanh.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atanh.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atanh.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atanh.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atanh.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atanh.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.mediump_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.mediump_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.mediump_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.asin.mediump_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.lowp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.lowp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.lowp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.lowp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.lowp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.lowp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.lowp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.lowp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.mediump_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.mediump_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.mediump_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan2.mediump_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.atan.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.lowp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.lowp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.lowp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.lowp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.lowp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.lowp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.lowp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.lowp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.mediump_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.mediump_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.mediump_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil.mediump_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.mediump_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.mediump_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.mediump_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.cos.mediump_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.lowp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.lowp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.lowp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.lowp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.lowp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.lowp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.lowp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.lowp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.log.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.log.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.log.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.log.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.log.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.log.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.log.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.log.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.highp_fragment#mat3x2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.highp_fragment#mat4x2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.highp_fragment#mat4x3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_fragment#mat3x2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_fragment#mat4x2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_fragment#mat4x3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_fragment#mat3x2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_fragment#mat4x2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_fragment#mat4x3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.lowp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.lowp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.lowp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.lowp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.lowp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.lowp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.lowp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.lowp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.mediump_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.mediump_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.mediump_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.mix.mediump_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.modf#highp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.precision.modf#highp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.precision.modf#lowp_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.precision.modf#lowp_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.precision.modf#mediump_fragment
+dEQP-GLES3.functional.shaders.builtin_functions.precision.modf#mediump_vertex
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.mediump_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.mediump_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.mediump_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.mediump_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.mediump_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.mediump_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.mediump_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.sin.mediump_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tan.mediump_fragment#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tan.mediump_fragment#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tan.mediump_fragment#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tan.mediump_fragment#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tan.mediump_vertex#scalar
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tan.mediump_vertex#vec2
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tan.mediump_vertex#vec3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.tan.mediump_vertex#vec4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.transpose.lowp_fragment#mat2x3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.transpose.lowp_fragment#mat2x4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.transpose.lowp_fragment#mat3x4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.transpose.mediump_fragment#mat2x3
+dEQP-GLES3.functional.shaders.builtin_functions.precision.transpose.mediump_fragment#mat2x4
+dEQP-GLES3.functional.shaders.builtin_functions.precision.transpose.mediump_fragment#mat3x4
+dEQP-GLES3.functional.shaders.builtin_variable#fragcoord_w
+dEQP-GLES3.functional.shaders.builtin_variable#max_fragment_input_vectors_fragment
+dEQP-GLES3.functional.shaders.builtin_variable#max_fragment_input_vectors_vertex
+dEQP-GLES3.functional.shaders.builtin_variable#max_vertex_output_vectors_fragment
+dEQP-GLES3.functional.shaders.builtin_variable#max_vertex_output_vectors_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#acosh_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#acosh_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#acosh_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#acosh_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#acosh_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#acosh_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#acosh_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#acosh_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#asinh_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#asinh_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#asinh_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#asinh_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#asinh_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#asinh_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#asinh_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#asinh_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_combined_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_combined_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_combined_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_combined_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_combined_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_combined_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_combined_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_combined_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atanh_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atanh_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atanh_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atanh_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atanh_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atanh_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atanh_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atanh_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_separate_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_separate_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_separate_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_separate_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_separate_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_separate_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_separate_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#atan_separate_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#cosh_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#cosh_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#cosh_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#cosh_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#cosh_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#cosh_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#cosh_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#cosh_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#degrees_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#degrees_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#degrees_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#degrees_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#degrees_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#degrees_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#degrees_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#degrees_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#radians_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#radians_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#radians_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#radians_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#radians_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#radians_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#radians_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#radians_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#sinh_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#sinh_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#sinh_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#sinh_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#sinh_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#sinh_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#sinh_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#sinh_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tan_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tan_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tanh_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tanh_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tanh_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tanh_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tanh_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tanh_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tanh_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tanh_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tan_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tan_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tan_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tan_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tan_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.angle_and_trigonometry#tan_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#abs_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#abs_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#abs_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#abs_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#abs_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#abs_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#abs_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#abs_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec2_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec2_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec3_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec3_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec4_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec4_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec2_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec2_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec3_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec3_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec4_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec4_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#clamp_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#floatbits_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#floatbits_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#floatbits_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#floatbits_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#fract_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#fract_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#fract_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#fract_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#fract_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#fract_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#fract_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#fract_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isinf_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isinf_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isinf_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isinf_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isinf_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isinf_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isinf_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isinf_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isnan_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isnan_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isnan_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isnan_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isnan_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isnan_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isnan_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#isnan_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec2_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec2_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec3_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec3_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec4_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec4_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec2_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec2_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec3_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec3_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec4_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec4_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#max_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec2_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec2_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec3_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec3_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec4_int_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec4_int_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec2_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec2_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec3_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec3_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec4_uint_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec4_uint_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#min_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_float_bool_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_float_bool_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec2_bvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec2_bvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec2_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec2_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec3_bvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec3_bvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec3_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec3_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec4_bvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec4_bvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec4_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec4_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mix_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec2_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec2_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec3_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec3_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec4_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec4_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#mod_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#roundEven_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#roundEven_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#roundEven_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#roundEven_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#roundEven_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#roundEven_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#roundEven_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#roundEven_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#round_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#round_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#round_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#round_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#round_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#round_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#round_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#round_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec2_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec2_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec3_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec3_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec4_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec4_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#smoothstep_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec2_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec2_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec3_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec3_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec4_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec4_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#step_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#trunc_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#trunc_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#trunc_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#trunc_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#trunc_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#trunc_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#trunc_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common#trunc_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#packHalf2x16_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#packHalf2x16_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#packSnorm2x16_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#packSnorm2x16_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#packUnorm2x16_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#packUnorm2x16_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#unpackSnorm2x16_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#unpackSnorm2x16_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#unpackUnorm2x16_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.float_pack_unpack#unpackUnorm2x16_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#dFdx_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#dFdx_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#dFdx_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#dFdx_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#dFdy_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#dFdy_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#dFdy_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#dFdy_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#fwidth_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#fwidth_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#fwidth_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.fragment_processing#fwidth_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#distance_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#distance_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#distance_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#distance_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#distance_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#distance_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#distance_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#distance_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#faceforward_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#faceforward_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#faceforward_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#faceforward_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#faceforward_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#faceforward_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#faceforward_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#faceforward_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#reflect_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#reflect_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#reflect_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#reflect_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#reflect_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#reflect_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#reflect_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#reflect_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#refract_float_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#refract_float_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#refract_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#refract_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#refract_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#refract_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#refract_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.geometric#refract_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#compMult_mat2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#compMult_mat2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#compMult_mat3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#compMult_mat3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#compMult_mat4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#compMult_mat4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#determinant_mat2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#determinant_mat2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#determinant_mat3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#determinant_mat3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#determinant_mat4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#determinant_mat4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#inverse_mat2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#inverse_mat2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#inverse_mat3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#inverse_mat3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#inverse_mat4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#inverse_mat4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat2x3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat2x3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat2x4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat2x4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat3x2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat3x2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat3x4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat3x4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat4x2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat4x2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat4x3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#outerProd_mat4x3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat2x3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat2x3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat2x4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat2x4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat3x2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat3x2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat3x4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat3x4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat4x2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat4x2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat4x3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.matrix#transpose_mat4x3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#all_bvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#all_bvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#all_bvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#all_bvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#all_bvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#all_bvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#any_bvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#any_bvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#any_bvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#any_bvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#any_bvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#any_bvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_bvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_bvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_bvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_bvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_bvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_bvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#equal_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThanEqual_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#greaterThan_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThanEqual_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#lessThan_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#not_bvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#not_bvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#not_bvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#not_bvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#not_bvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#not_bvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_bvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_bvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_bvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_bvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_bvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_bvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_ivec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_ivec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_ivec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_ivec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_ivec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_ivec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_uvec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_uvec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_uvec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_uvec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_uvec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_uvec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_vec2_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_vec2_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_vec3_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_vec3_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_vec4_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.vector_relational#notEqual_vec4_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.complex_types#array_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.complex_types#array_length_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.complex_types#array_length_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.complex_types#array_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.other#complex_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.other#complex_vertex
+dEQP-GLES3.functional.shaders.constant_expressions.other#nested_builtin_funcs_fragment
+dEQP-GLES3.functional.shaders.constant_expressions.other#nested_builtin_funcs_vertex
+dEQP-GLES3.functional.shaders.constants#const_float_function_gotcha_fragment
+dEQP-GLES3.functional.shaders.constants#const_float_function_gotcha_vertex
+dEQP-GLES3.functional.shaders.constants#float_int_f_suffix_0_fragment
+dEQP-GLES3.functional.shaders.constants#float_int_f_suffix_0_vertex
+dEQP-GLES3.functional.shaders.constants#float_int_f_suffix_1_fragment
+dEQP-GLES3.functional.shaders.constants#float_int_f_suffix_1_vertex
+dEQP-GLES3.functional.shaders.constants#int_l_suffix_fragment
+dEQP-GLES3.functional.shaders.constants#int_l_suffix_vertex
+dEQP-GLES3.functional.shaders.constants#invalid_octal_1_fragment
+dEQP-GLES3.functional.shaders.constants#invalid_octal_1_vertex
+dEQP-GLES3.functional.shaders.constants#uint_ul_suffix_fragment
+dEQP-GLES3.functional.shaders.constants#uint_ul_suffix_vertex
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#invariant_attribute
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#invariant_uniform
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#invariant_uniform_block_2_fragment
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#invariant_uniform_block_2_vertex
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_const_fragment
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_const_vertex
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_duplicate_block_name_fragment
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_duplicate_block_name_vertex
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_in_fragment
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_in_vertex
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_out_fragment
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_out_vertex
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_sampler_2d_fragment
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_sampler_2d_vertex
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_sampler_cube_fragment
+dEQP-GLES3.functional.shaders.declarations.invalid_declarations#uniform_block_sampler_cube_vertex
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.default#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.default#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.default#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.default#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.default#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_float#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_float#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_float#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_msaa4#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_msaa4#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_float#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_float#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_float#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa2#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa2#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa2#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa2#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa2#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa4#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo_msaa4#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.fbo#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.in_function#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.in_function#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.in_function#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.in_function#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.in_function#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.linear#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.linear#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.linear#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.linear#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.linear#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.default#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.default#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.default#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.default#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.default#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_float#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_float#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_float#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_msaa4#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.nicest.fbo_msaa4#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_if#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_if#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_if#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_if#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_if#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_loop#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_loop#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_loop#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_loop#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_loop#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_switch#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_switch#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_switch#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_switch#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.static_switch#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.basic#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.basic#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.basic#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_fastest#float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_fastest#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_fastest#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_fastest#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_fastest#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_fastest#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_nicest#float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_nicest#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_nicest#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_nicest#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_nicest#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.float_nicest#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.texture.msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_if#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_if#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_if#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_if#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_if#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_loop#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_loop#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_loop#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_loop#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_loop#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_switch#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_switch#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_switch#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_switch#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_switch#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.default#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.default#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.default#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.default#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_float#float_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_float#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_float#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_msaa4#float_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_msaa4#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fastest.fbo_msaa4#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_float#float_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_float#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_float#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa2#float_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa2#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa2#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa2#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa2#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa2#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa4#float_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa4#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo_msaa4#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.fbo#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.in_function#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.in_function#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.in_function#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.in_function#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.linear#float_lowp
+dEQP-GLES3.functional.shaders.derivate.dfdy.linear#vec2_lowp
+dEQP-GLES3.functional.shaders.derivate.dfdy.linear#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.linear#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.linear#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.dfdy.linear#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.linear#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.default#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.default#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.default#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.default#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_float#float_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_float#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_float#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_msaa4#float_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_msaa4#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.nicest.fbo_msaa4#vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_if#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_if#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_if#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_if#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_loop#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_loop#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_loop#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_loop#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_switch#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_switch#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_switch#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.static_switch#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.basic#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.basic#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.basic#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.float_fastest#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.float_fastest#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.float_fastest#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.float_fastest#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.float_nicest#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.float_nicest#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.float_nicest#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.float_nicest#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.texture.msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_if#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_if#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_if#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_if#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_loop#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_loop#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_loop#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_loop#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_switch#vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_switch#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_switch#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_switch#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.default#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.default#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.default#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_float#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.fastest.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_float#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_msaa2#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_msaa2#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_msaa2#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.fbo#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.in_function#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.in_function#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.in_function#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.linear#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.linear#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.fwidth.linear#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.linear#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.default#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.default#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.default#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_float#float_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_float#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_float#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_float#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_float#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_float#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.nicest.fbo_msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_if#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_if#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_if#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_loop#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_loop#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_loop#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_switch#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_switch#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_switch#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.basic#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.basic#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.basic#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_fastest#float_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_fastest#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_fastest#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_fastest#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_fastest#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_fastest#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_nicest#float_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_nicest#vec2_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_nicest#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_nicest#vec3_lowp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_nicest#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.float_nicest#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.msaa4#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.msaa4#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.texture.msaa4#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_if#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_if#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_if#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_loop#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_loop#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_loop#vec4_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_switch#vec3_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_switch#vec3_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_switch#vec4_highp
+dEQP-GLES3.functional.shaders.fragdata#draw_buffers
+dEQP-GLES3.functional.shaders.fragdata#invalid_assign_to_1
+dEQP-GLES3.functional.shaders.fragdata#write_fragcolor_and_fragdata_static_if
+dEQP-GLES3.functional.shaders.fragdata#write_fragcolor_and_fragdata_unused_func
+dEQP-GLES3.functional.shaders.functions.array_arguments#copy_global_inout_on_call_fragment
+dEQP-GLES3.functional.shaders.functions.array_arguments#copy_global_inout_on_call_vertex
+dEQP-GLES3.functional.shaders.functions.datatypes#bool_bvec2_fragment
+dEQP-GLES3.functional.shaders.functions.datatypes#bool_bvec2_vertex
+dEQP-GLES3.functional.shaders.functions.invalid#array_size_from_const_arg_fragment
+dEQP-GLES3.functional.shaders.functions.invalid#array_size_from_const_arg_vertex
+dEQP-GLES3.functional.shaders.functions.invalid#init_const_local_from_const_arg_fragment
+dEQP-GLES3.functional.shaders.functions.invalid#init_const_local_from_const_arg_vertex
+dEQP-GLES3.functional.shaders.functions.invalid#local_function_prototype_fragment
+dEQP-GLES3.functional.shaders.functions.invalid#local_function_prototype_vertex
+dEQP-GLES3.functional.shaders.functions.invalid#overload_builtin_function_fragment
+dEQP-GLES3.functional.shaders.functions.invalid#overload_builtin_function_vertex
+dEQP-GLES3.functional.shaders.functions.invalid#redefine_builtin_function_fragment
+dEQP-GLES3.functional.shaders.functions.invalid#redefine_builtin_function_vertex
+dEQP-GLES3.functional.shaders.functions.invalid#uniform_return_type_fragment
+dEQP-GLES3.functional.shaders.functions.invalid#uniform_return_type_vertex
+dEQP-GLES3.functional.shaders.functions.invalid#use_const_arg_as_array_size_fragment
+dEQP-GLES3.functional.shaders.functions.invalid#use_const_arg_as_array_size_vertex
+dEQP-GLES3.functional.shaders.functions.invalid#use_const_arg_in_const_expr_fragment
+dEQP-GLES3.functional.shaders.functions.invalid#use_const_arg_in_const_expr_vertex
+dEQP-GLES3.functional.shaders.invariance.highp#common_subexpression_1
+dEQP-GLES3.functional.shaders.invariance.highp#common_subexpression_3
+dEQP-GLES3.functional.shaders.invariance.highp#loop_0
+dEQP-GLES3.functional.shaders.invariance.highp#loop_1
+dEQP-GLES3.functional.shaders.invariance.lowp#common_subexpression_1
+dEQP-GLES3.functional.shaders.invariance.lowp#common_subexpression_3
+dEQP-GLES3.functional.shaders.invariance.lowp#loop_0
+dEQP-GLES3.functional.shaders.invariance.lowp#loop_1
+dEQP-GLES3.functional.shaders.invariance.mediump#common_subexpression_1
+dEQP-GLES3.functional.shaders.invariance.mediump#common_subexpression_3
+dEQP-GLES3.functional.shaders.invariance.mediump#loop_0
+dEQP-GLES3.functional.shaders.invariance.mediump#loop_1
+dEQP-GLES3.functional.shaders.keywords.invalid_identifiers#max_length_fragment
+dEQP-GLES3.functional.shaders.keywords.invalid_identifiers#max_length_vertex
+dEQP-GLES3.functional.shaders.keywords.keywords#vec4_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#active_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#active_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#atomic_uint_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#atomic_uint_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#coherent_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#coherent_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#common_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#common_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#double_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#double_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#filter_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#filter_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage1DArray_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage1DArray_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage1D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage1D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage2DArray_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage2DArray_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage2D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage2D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage3D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimage3D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimageBuffer_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimageBuffer_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimageCube_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#iimageCube_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image1DArray_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image1DArrayShadow_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image1DArrayShadow_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image1DArray_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image1D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image1DShadow_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image1DShadow_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image1D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image2DArray_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image2DArrayShadow_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image2DArrayShadow_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image2DArray_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image2D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image2DShadow_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image2DShadow_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image2D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image3D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#image3D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#imageBuffer_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#imageBuffer_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#imageCube_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#imageCube_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#isamplerBuffer_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#isamplerBuffer_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#partition_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#partition_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#patch_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#patch_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#readonly_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#readonly_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#resource_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#resource_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#restrict_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#restrict_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#sample_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#samplerBuffer_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#samplerBuffer_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#sample_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#subroutine_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#subroutine_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage1DArray_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage1DArray_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage1D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage1D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage2DArray_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage2DArray_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage2D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage2D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage3D_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimage3D_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimageBuffer_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimageBuffer_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimageCube_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#uimageCube_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#usamplerBuffer_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#usamplerBuffer_vertex
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#writeonly_fragment
+dEQP-GLES3.functional.shaders.keywords.reserved_keywords#writeonly_vertex
+dEQP-GLES3.functional.shaders.linkage.uniform.block#layout_qualifier_mismatch_1
+dEQP-GLES3.functional.shaders.linkage.uniform.block#layout_qualifier_mismatch_2
+dEQP-GLES3.functional.shaders.linkage.uniform.block#layout_qualifier_mismatch_3
+dEQP-GLES3.functional.shaders.linkage.uniform.block#precision_mismatch
+dEQP-GLES3.functional.shaders.linkage.uniform.struct#precision_conflict_1
+dEQP-GLES3.functional.shaders.linkage.uniform.struct#precision_conflict_2
+dEQP-GLES3.functional.shaders.linkage.uniform.struct#precision_conflict_3
+dEQP-GLES3.functional.shaders.linkage.uniform.struct#precision_conflict_4
+dEQP-GLES3.functional.shaders.linkage.uniform.struct#type_conflict_1
+dEQP-GLES3.functional.shaders.linkage.uniform.struct#type_conflict_2
+dEQP-GLES3.functional.shaders.linkage.uniform.struct#type_conflict_3
+dEQP-GLES3.functional.shaders.linkage.varying.rules#differing_interpolation_2
+dEQP-GLES3.functional.shaders.linkage.varying.rules#illegal_usage_1
+dEQP-GLES3.functional.shaders.linkage.varying.rules#interpolation_mismatch_1
+dEQP-GLES3.functional.shaders.linkage.varying.rules#invalid_type_array_struct
+dEQP-GLES3.functional.shaders.linkage.varying.rules#invalid_type_int
+dEQP-GLES3.functional.shaders.linkage.varying.rules#invalid_type_struct_array
+dEQP-GLES3.functional.shaders.linkage.varying.rules#invalid_type_struct_struct
+dEQP-GLES3.functional.shaders.linkage.varying.rules#invalid_type_uint
+dEQP-GLES3.functional.shaders.linkage.varying.rules#struct_type_mismatch_1
+dEQP-GLES3.functional.shaders.linkage.varying.rules#struct_type_mismatch_2
+dEQP-GLES3.functional.shaders.linkage.varying.rules#struct_type_mismatch_3
+dEQP-GLES3.functional.shaders.linkage.varying.rules#type_mismatch_1
+dEQP-GLES3.functional.shaders.linkage.varying.struct#float_uvec2_vec3
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#highp_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#highp_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#highp_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#highp_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#highp_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#highp_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#highp_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#highp_uvec4_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#lowp_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#lowp_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#lowp_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#lowp_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#lowp_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#lowp_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#lowp_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#lowp_uvec4_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#mediump_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#mediump_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#mediump_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#mediump_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#mediump_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#mediump_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#mediump_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.post_decrement_effect#mediump_uvec4_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#highp_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#highp_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#highp_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#highp_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#highp_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#highp_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#highp_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#highp_uvec4_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#lowp_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#lowp_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#lowp_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#lowp_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#lowp_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#lowp_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#lowp_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#lowp_uvec4_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#mediump_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#mediump_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#mediump_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#mediump_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#mediump_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#mediump_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#mediump_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_effect#mediump_uvec4_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#highp_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#highp_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#highp_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#highp_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#highp_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#highp_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#highp_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#highp_uvec4_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#lowp_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#lowp_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#lowp_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#lowp_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#lowp_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#lowp_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#lowp_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#lowp_uvec4_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#mediump_uint_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#mediump_uint_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#mediump_uvec2_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#mediump_uvec2_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#mediump_uvec3_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#mediump_uvec3_vertex
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#mediump_uvec4_fragment
+dEQP-GLES3.functional.shaders.operator.unary_operator.pre_decrement_result#mediump_uvec4_vertex
+dEQP-GLES3.functional.shaders.preprocessor.basic#identifier_with_double_underscore_fragment
+dEQP-GLES3.functional.shaders.preprocessor.basic#identifier_with_double_underscore_vertex
+dEQP-GLES3.functional.shaders.preprocessor.builtin#invalid_line_file_1_fragment
+dEQP-GLES3.functional.shaders.preprocessor.builtin#invalid_line_file_1_vertex
+dEQP-GLES3.functional.shaders.preprocessor.builtin#invalid_line_file_3_fragment
+dEQP-GLES3.functional.shaders.preprocessor.builtin#invalid_line_file_3_vertex
+dEQP-GLES3.functional.shaders.preprocessor.builtin#line_and_file_expression_fragment
+dEQP-GLES3.functional.shaders.preprocessor.builtin#line_and_file_expression_vertex
+dEQP-GLES3.functional.shaders.preprocessor.builtin#line_defined_2_fragment
+dEQP-GLES3.functional.shaders.preprocessor.builtin#line_defined_2_vertex
+dEQP-GLES3.functional.shaders.preprocessor.builtin#line_expression_fragment
+dEQP-GLES3.functional.shaders.preprocessor.builtin#line_expression_vertex
+dEQP-GLES3.functional.shaders.preprocessor.comments#backslash_in_a_comment_1_fragment
+dEQP-GLES3.functional.shaders.preprocessor.comments#backslash_in_a_comment_1_vertex
+dEQP-GLES3.functional.shaders.preprocessor.pragmas#invalid_pragma_invalid_debug_fragment
+dEQP-GLES3.functional.shaders.preprocessor.pragmas#invalid_pragma_invalid_debug_vertex
+dEQP-GLES3.functional.shaders.preprocessor.pragmas#invalid_pragma_invalid_token_fragment
+dEQP-GLES3.functional.shaders.preprocessor.pragmas#invalid_pragma_invalid_token_vertex
+dEQP-GLES3.functional.shaders.preprocessor.predefined_macros#line_2_fragment
+dEQP-GLES3.functional.shaders.preprocessor.predefined_macros#line_2_vertex
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#interp_invariant_storage
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#interp_invariant_storage_precision
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#interp_storage_invariant_input
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#interp_storage_precision_invariant_input
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#invariant_interp_storage_invariant_input
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#invariant_interp_storage_precision_invariant_input
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#invariant_storage_invariant_input
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#invariant_storage_precision_invariant_input
+dEQP-GLES3.functional.shaders.qualification_order.variables.invalid#storage_precision_invariant_input
+dEQP-GLES3.functional.shaders.qualification_order.variables.valid#invariant_interp_storage
+dEQP-GLES3.functional.shaders.qualification_order.variables.valid#invariant_interp_storage_precision
+dEQP-GLES3.functional.shaders.qualification_order.variables.valid#invariant_storage
+dEQP-GLES3.functional.shaders.qualification_order.variables.valid#invariant_storage_precision
+dEQP-GLES3.functional.shaders.random.all_features.fragment#1
+dEQP-GLES3.functional.shaders.random.all_features.fragment#13
+dEQP-GLES3.functional.shaders.random.all_features.fragment#14
+dEQP-GLES3.functional.shaders.random.all_features.fragment#18
+dEQP-GLES3.functional.shaders.random.all_features.fragment#20
+dEQP-GLES3.functional.shaders.random.all_features.fragment#21
+dEQP-GLES3.functional.shaders.random.all_features.fragment#22
+dEQP-GLES3.functional.shaders.random.all_features.fragment#25
+dEQP-GLES3.functional.shaders.random.all_features.fragment#30
+dEQP-GLES3.functional.shaders.random.all_features.fragment#32
+dEQP-GLES3.functional.shaders.random.all_features.fragment#34
+dEQP-GLES3.functional.shaders.random.all_features.fragment#37
+dEQP-GLES3.functional.shaders.random.all_features.fragment#38
+dEQP-GLES3.functional.shaders.random.all_features.fragment#39
+dEQP-GLES3.functional.shaders.random.all_features.fragment#40
+dEQP-GLES3.functional.shaders.random.all_features.fragment#46
+dEQP-GLES3.functional.shaders.random.all_features.fragment#47
+dEQP-GLES3.functional.shaders.random.all_features.fragment#48
+dEQP-GLES3.functional.shaders.random.all_features.fragment#5
+dEQP-GLES3.functional.shaders.random.all_features.fragment#53
+dEQP-GLES3.functional.shaders.random.all_features.fragment#55
+dEQP-GLES3.functional.shaders.random.all_features.fragment#56
+dEQP-GLES3.functional.shaders.random.all_features.fragment#6
+dEQP-GLES3.functional.shaders.random.all_features.fragment#61
+dEQP-GLES3.functional.shaders.random.all_features.fragment#62
+dEQP-GLES3.functional.shaders.random.all_features.fragment#64
+dEQP-GLES3.functional.shaders.random.all_features.fragment#65
+dEQP-GLES3.functional.shaders.random.all_features.fragment#66
+dEQP-GLES3.functional.shaders.random.all_features.fragment#69
+dEQP-GLES3.functional.shaders.random.all_features.fragment#7
+dEQP-GLES3.functional.shaders.random.all_features.fragment#70
+dEQP-GLES3.functional.shaders.random.all_features.fragment#71
+dEQP-GLES3.functional.shaders.random.all_features.fragment#72
+dEQP-GLES3.functional.shaders.random.all_features.fragment#76
+dEQP-GLES3.functional.shaders.random.all_features.fragment#80
+dEQP-GLES3.functional.shaders.random.all_features.fragment#81
+dEQP-GLES3.functional.shaders.random.all_features.fragment#87
+dEQP-GLES3.functional.shaders.random.all_features.fragment#88
+dEQP-GLES3.functional.shaders.random.all_features.fragment#89
+dEQP-GLES3.functional.shaders.random.all_features.fragment#9
+dEQP-GLES3.functional.shaders.random.all_features.fragment#92
+dEQP-GLES3.functional.shaders.random.all_features.fragment#94
+dEQP-GLES3.functional.shaders.random.all_features.fragment#96
+dEQP-GLES3.functional.shaders.random.all_features.vertex#13
+dEQP-GLES3.functional.shaders.random.all_features.vertex#17
+dEQP-GLES3.functional.shaders.random.all_features.vertex#18
+dEQP-GLES3.functional.shaders.random.all_features.vertex#2
+dEQP-GLES3.functional.shaders.random.all_features.vertex#23
+dEQP-GLES3.functional.shaders.random.all_features.vertex#26
+dEQP-GLES3.functional.shaders.random.all_features.vertex#29
+dEQP-GLES3.functional.shaders.random.all_features.vertex#34
+dEQP-GLES3.functional.shaders.random.all_features.vertex#37
+dEQP-GLES3.functional.shaders.random.all_features.vertex#4
+dEQP-GLES3.functional.shaders.random.all_features.vertex#40
+dEQP-GLES3.functional.shaders.random.all_features.vertex#41
+dEQP-GLES3.functional.shaders.random.all_features.vertex#42
+dEQP-GLES3.functional.shaders.random.all_features.vertex#44
+dEQP-GLES3.functional.shaders.random.all_features.vertex#46
+dEQP-GLES3.functional.shaders.random.all_features.vertex#47
+dEQP-GLES3.functional.shaders.random.all_features.vertex#49
+dEQP-GLES3.functional.shaders.random.all_features.vertex#50
+dEQP-GLES3.functional.shaders.random.all_features.vertex#53
+dEQP-GLES3.functional.shaders.random.all_features.vertex#54
+dEQP-GLES3.functional.shaders.random.all_features.vertex#58
+dEQP-GLES3.functional.shaders.random.all_features.vertex#6
+dEQP-GLES3.functional.shaders.random.all_features.vertex#62
+dEQP-GLES3.functional.shaders.random.all_features.vertex#65
+dEQP-GLES3.functional.shaders.random.all_features.vertex#66
+dEQP-GLES3.functional.shaders.random.all_features.vertex#70
+dEQP-GLES3.functional.shaders.random.all_features.vertex#72
+dEQP-GLES3.functional.shaders.random.all_features.vertex#74
+dEQP-GLES3.functional.shaders.random.all_features.vertex#76
+dEQP-GLES3.functional.shaders.random.all_features.vertex#77
+dEQP-GLES3.functional.shaders.random.all_features.vertex#79
+dEQP-GLES3.functional.shaders.random.all_features.vertex#81
+dEQP-GLES3.functional.shaders.random.all_features.vertex#87
+dEQP-GLES3.functional.shaders.random.all_features.vertex#88
+dEQP-GLES3.functional.shaders.random.all_features.vertex#90
+dEQP-GLES3.functional.shaders.random.all_features.vertex#92
+dEQP-GLES3.functional.shaders.random.all_features.vertex#93
+dEQP-GLES3.functional.shaders.random.all_features.vertex#94
+dEQP-GLES3.functional.shaders.random.all_features.vertex#96
+dEQP-GLES3.functional.shaders.random.all_features.vertex#98
+dEQP-GLES3.functional.shaders.random.scalar_conversion.combined#72
+dEQP-GLES3.functional.shaders.random.scalar_conversion.fragment#72
+dEQP-GLES3.functional.shaders.random.texture.fragment#72
+dEQP-GLES3.functional.shaders.random.trigonometric.fragment#10
+dEQP-GLES3.functional.shaders.random.trigonometric.fragment#37
+dEQP-GLES3.functional.shaders.random.trigonometric.fragment#40
+dEQP-GLES3.functional.shaders.random.trigonometric.fragment#49
+dEQP-GLES3.functional.shaders.random.trigonometric.fragment#83
+dEQP-GLES3.functional.shaders.random.trigonometric.fragment#89
+dEQP-GLES3.functional.shaders.random.trigonometric.fragment#94
+dEQP-GLES3.functional.shaders.random.trigonometric.vertex#10
+dEQP-GLES3.functional.shaders.random.trigonometric.vertex#11
+dEQP-GLES3.functional.shaders.random.trigonometric.vertex#15
+dEQP-GLES3.functional.shaders.random.trigonometric.vertex#37
+dEQP-GLES3.functional.shaders.random.trigonometric.vertex#49
+dEQP-GLES3.functional.shaders.random.trigonometric.vertex#83
+dEQP-GLES3.functional.shaders.random.trigonometric.vertex#89
+dEQP-GLES3.functional.shaders.random.trigonometric.vertex#94
+dEQP-GLES3.functional.shaders.scoping.invalid#redeclare_for_init_statement_variable_fragment
+dEQP-GLES3.functional.shaders.scoping.invalid#redeclare_for_init_statement_variable_vertex
+dEQP-GLES3.functional.shaders.scoping.invalid#redefine_builtin_fragment
+dEQP-GLES3.functional.shaders.scoping.invalid#redefine_builtin_vertex
+dEQP-GLES3.functional.shaders.scoping.invalid#use_variable_from_else_in_outer_scope_fragment
+dEQP-GLES3.functional.shaders.scoping.invalid#use_variable_from_else_in_outer_scope_vertex
+dEQP-GLES3.functional.shaders.scoping.invalid#use_variable_from_if_in_outer_scope_fragment
+dEQP-GLES3.functional.shaders.scoping.invalid#use_variable_from_if_in_outer_scope_vertex
+dEQP-GLES3.functional.shaders.scoping.valid#for_init_statement_variable_hides_global_variable_vertex
+dEQP-GLES3.functional.shaders.scoping.valid#variable_in_if_hides_global_variable_fragment
+dEQP-GLES3.functional.shaders.scoping.valid#variable_in_if_hides_global_variable_vertex
+dEQP-GLES3.functional.shaders.struct.local#basic_equal_fragment
+dEQP-GLES3.functional.shaders.struct.local#basic_equal_vertex
+dEQP-GLES3.functional.shaders.struct.local#basic_not_equal_fragment
+dEQP-GLES3.functional.shaders.struct.local#basic_not_equal_vertex
+dEQP-GLES3.functional.shaders.struct.local#nested_equal_fragment
+dEQP-GLES3.functional.shaders.struct.local#nested_equal_vertex
+dEQP-GLES3.functional.shaders.struct.local#nested_not_equal_fragment
+dEQP-GLES3.functional.shaders.struct.local#nested_not_equal_vertex
+dEQP-GLES3.functional.shaders.texture_functions.invalid#textureoffset_sampler2darrayshadow_vec4_ivec2_fragment
+dEQP-GLES3.functional.shaders.texture_functions.invalid#textureoffset_sampler2darrayshadow_vec4_ivec2_vertex
+dEQP-GLES3.functional.shaders.texture_functions.invalid#texture_sampler2darrayshadow_vec4_float_fragment
+dEQP-GLES3.functional.shaders.texture_functions.invalid#texture_sampler2darrayshadow_vec4_float_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#isampler2darray_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#isampler2darray_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#isampler2d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#isampler2d_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#isampler3d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#isampler3d_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler2darray_fixed_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler2darray_fixed_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler2darray_float_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler2darray_float_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler2d_fixed_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler2d_fixed_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler2d_float_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler2d_float_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler3d_fixed_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler3d_fixed_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler3d_float_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#sampler3d_float_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#usampler2darray_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#usampler2darray_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#usampler3d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texelfetchoffset#usampler3d_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturegrad#isamplercube_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturegrad#samplercubeshadow_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturegrad#samplercubeshadow_vertex
+dEQP-GLES3.functional.shaders.texture_functions.textureoffset#isampler3d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.textureoffset#isampler3d_vertex
+dEQP-GLES3.functional.shaders.texture_functions.textureoffset#sampler3d_fixed_fragment
+dEQP-GLES3.functional.shaders.texture_functions.textureoffset#sampler3d_float_fragment
+dEQP-GLES3.functional.shaders.texture_functions.textureoffset#usampler3d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset#isampler3d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset#sampler3d_fixed_fragment
+dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset#sampler3d_float_fragment
+dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset#usampler3d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texture#sampler2darrayshadow_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#isampler2darray_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#isampler2darray_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#isampler3d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#isampler3d_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler2darray_fixed_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler2darray_fixed_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler2darray_float_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler2darray_float_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler2darrayshadow_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler2darrayshadow_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler3d_fixed_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler3d_fixed_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler3d_float_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#sampler3d_float_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#usampler2darray_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#usampler2darray_vertex
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#usampler3d_fragment
+dEQP-GLES3.functional.shaders.texture_functions.texturesize#usampler3d_vertex
+dEQP-GLES3.functional.shaders.uniform_block.invalid#double_underscore_block_name_fragment
+dEQP-GLES3.functional.shaders.uniform_block.invalid#double_underscore_block_name_vertex
+dEQP-GLES3.functional.shaders.uniform_block.invalid#double_underscore_instance_name_fragment
+dEQP-GLES3.functional.shaders.uniform_block.invalid#double_underscore_instance_name_vertex
+dEQP-GLES3.functional.shaders.uniform_block.invalid#invalid_identifier_block_name_fragment
+dEQP-GLES3.functional.shaders.uniform_block.invalid#invalid_identifier_block_name_vertex
+dEQP-GLES3.functional.shaders.uniform_block.invalid#invalid_identifier_instance_name_fragment
+dEQP-GLES3.functional.shaders.uniform_block.invalid#invalid_identifier_instance_name_vertex
+dEQP-GLES3.functional.shaders.uniform_block.invalid#member_in_interface_qualifier_fragment
+dEQP-GLES3.functional.shaders.uniform_block.invalid#member_in_interface_qualifier_vertex
+dEQP-GLES3.functional.shaders.uniform_block.invalid#member_out_interface_qualifier_fragment
+dEQP-GLES3.functional.shaders.uniform_block.invalid#member_out_interface_qualifier_vertex
+dEQP-GLES3.functional.shaders.uniform_block.invalid#structure_definition_fragment
+dEQP-GLES3.functional.shaders.uniform_block.invalid#structure_definition_vertex
+dEQP-GLES3.functional.shaders.uniform_block.invalid#too_long_block_name_fragment
+dEQP-GLES3.functional.shaders.uniform_block.invalid#too_long_block_name_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#member_layout_all_8_times_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#member_layout_all_8_times_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#member_layout_all_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#member_layout_all_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#member_layout_column_major_vec4_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#member_layout_column_major_vec4_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#member_layout_row_major_vec4_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#member_layout_row_major_vec4_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#repeated_block_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#repeated_block_no_instance_name_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#repeated_block_no_instance_name_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#repeated_block_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#struct_member_layout_all_8_times_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#struct_member_layout_all_8_times_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#struct_member_layout_all_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#struct_member_layout_all_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#struct_member_layout_column_major_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#struct_member_layout_column_major_vertex
+dEQP-GLES3.functional.shaders.uniform_block.valid#struct_member_layout_row_major_fragment
+dEQP-GLES3.functional.shaders.uniform_block.valid#struct_member_layout_row_major_vertex
+dEQP-GLES3.functional.state_query.fbo#draw_framebuffer_default_framebuffer
+dEQP-GLES3.functional.state_query.fbo#framebuffer_attachment_texture_cube_map_face
+dEQP-GLES3.functional.state_query.fbo#framebuffer_attachment_x_size_initial
+dEQP-GLES3.functional.state_query.fbo#framebuffer_unspecified_attachment_component_type
+dEQP-GLES3.functional.state_query.fbo#framebuffer_unspecified_attachment_x_size_rbo
+dEQP-GLES3.functional.state_query.fbo#read_framebuffer_default_framebuffer
+dEQP-GLES3.functional.state_query.floats#blend_color_getinteger
+dEQP-GLES3.functional.state_query.floats#blend_color_getinteger64
+dEQP-GLES3.functional.state_query.floats#color_clear_value_getinteger
+dEQP-GLES3.functional.state_query.floats#color_clear_value_getinteger64
+dEQP-GLES3.functional.state_query.floats#depth_clear_value_getinteger
+dEQP-GLES3.functional.state_query.floats#depth_clear_value_getinteger64
+dEQP-GLES3.functional.state_query.floats#depth_range_getinteger
+dEQP-GLES3.functional.state_query.floats#depth_range_getinteger64
+dEQP-GLES3.functional.state_query.floats#line_width_getinteger
+dEQP-GLES3.functional.state_query.floats#line_width_getinteger64
+dEQP-GLES3.functional.state_query.floats#polygon_offset_factor_getinteger
+dEQP-GLES3.functional.state_query.floats#polygon_offset_factor_getinteger64
+dEQP-GLES3.functional.state_query.floats#polygon_offset_units_getinteger
+dEQP-GLES3.functional.state_query.floats#polygon_offset_units_getinteger64
+dEQP-GLES3.functional.state_query.floats#sample_coverage_value_getinteger
+dEQP-GLES3.functional.state_query.floats#sample_coverage_value_getinteger64
+dEQP-GLES3.functional.state_query.integers64#max_server_wait_timeout_getfloat
+dEQP-GLES3.functional.state_query.integers#draw_buffer_getboolean
+dEQP-GLES3.functional.state_query.integers#draw_buffer_getfloat
+dEQP-GLES3.functional.state_query.integers#draw_buffer_getinteger
+dEQP-GLES3.functional.state_query.integers#draw_buffer_getinteger64
+dEQP-GLES3.functional.state_query.integers#stencil_back_value_mask_getfloat
+dEQP-GLES3.functional.state_query.integers#stencil_back_value_mask_separate_both_getfloat
+dEQP-GLES3.functional.state_query.integers#stencil_back_value_mask_separate_getfloat
+dEQP-GLES3.functional.state_query.integers#stencil_value_mask_getfloat
+dEQP-GLES3.functional.state_query.integers#stencil_value_mask_separate_both_getfloat
+dEQP-GLES3.functional.state_query.integers#stencil_value_mask_separate_getfloat
+dEQP-GLES3.functional.state_query.integers#transform_feedback_buffer_binding_getboolean
+dEQP-GLES3.functional.state_query.integers#transform_feedback_buffer_binding_getfloat
+dEQP-GLES3.functional.state_query.integers#transform_feedback_buffer_binding_getinteger
+dEQP-GLES3.functional.state_query.integers#transform_feedback_buffer_binding_getinteger64
+dEQP-GLES3.functional.state_query.internal_format#rgba_samples
+dEQP-GLES3.functional.state_query.internal_format#rgb_samples
+dEQP-GLES3.functional.state_query.rbo#renderbuffer_internal_format
+dEQP-GLES3.functional.state_query.rbo#renderbuffer_size
+dEQP-GLES3.functional.state_query.sampler#sampler_texture_max_lod_getsamplerparameterf
+dEQP-GLES3.functional.state_query.sampler#sampler_texture_max_lod_getsamplerparameteri
+dEQP-GLES3.functional.state_query.sampler#sampler_texture_min_lod_getsamplerparameterf
+dEQP-GLES3.functional.state_query.sampler#sampler_texture_min_lod_getsamplerparameteri
+dEQP-GLES3.functional.state_query.shader#program_active_uniform_types
+dEQP-GLES3.functional.state_query.shader#shader_info_log_length
+dEQP-GLES3.functional.state_query.shader#shader_source_length
+dEQP-GLES3.functional.state_query.shader#uniform_value_boolean
+dEQP-GLES3.functional.state_query.shader#vertex_attrib_integer
+dEQP-GLES3.functional.state_query.shader#vertex_attrib_type
+dEQP-GLES3.functional.state_query.string#extensions
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#linear_mipmap_linear_linear_mirror_clamp
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#linear_mipmap_linear_nearest_mirror_clamp
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#linear_mipmap_nearest_linear_clamp_mirror
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#linear_mipmap_nearest_linear_mirror_clamp
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#linear_mipmap_nearest_linear_mirror_mirror
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#linear_mipmap_nearest_nearest_clamp_mirror
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#linear_mipmap_nearest_nearest_mirror_clamp
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#linear_mipmap_nearest_nearest_mirror_mirror
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#nearest_mipmap_linear_linear_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#nearest_mipmap_linear_nearest_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#nearest_mipmap_nearest_linear_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.2d_array.combinations#nearest_mipmap_nearest_nearest_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.2d.combinations#linear_mipmap_linear_linear_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.2d.combinations#linear_mipmap_linear_linear_clamp_mirror
+dEQP-GLES3.functional.texture.filtering.2d.combinations#linear_mipmap_linear_nearest_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.2d.combinations#linear_mipmap_nearest_linear_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.2d.combinations#linear_mipmap_nearest_nearest_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_linear_clamp_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_linear_clamp_clamp_mirror
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_linear_clamp_mirror_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_linear_clamp_repeat_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_linear_clamp_repeat_mirror
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_nearest_clamp_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_nearest_clamp_clamp_mirror
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_nearest_clamp_mirror_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_nearest_clamp_repeat_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_linear_nearest_clamp_repeat_mirror
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_linear_clamp_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_linear_clamp_clamp_mirror
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_linear_clamp_mirror_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_linear_clamp_mirror_mirror
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_linear_clamp_repeat_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_nearest_clamp_clamp_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_nearest_clamp_clamp_mirror
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_nearest_clamp_mirror_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_nearest_clamp_mirror_mirror
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_nearest_clamp_repeat_clamp
+dEQP-GLES3.functional.texture.filtering.3d.combinations#linear_mipmap_nearest_nearest_clamp_repeat_mirror
+dEQP-GLES3.functional.texture.mipmap.2d.projected#linear_linear_clamp
+dEQP-GLES3.functional.texture.mipmap.2d.projected#linear_linear_mirror
+dEQP-GLES3.functional.texture.mipmap.2d.projected#linear_linear_repeat
+dEQP-GLES3.functional.texture.mipmap.2d.projected#linear_nearest_clamp
+dEQP-GLES3.functional.texture.mipmap.2d.projected#linear_nearest_mirror
+dEQP-GLES3.functional.texture.mipmap.2d.projected#linear_nearest_repeat
+dEQP-GLES3.functional.texture.mipmap.2d.projected#nearest_linear_clamp
+dEQP-GLES3.functional.texture.mipmap.2d.projected#nearest_linear_mirror
+dEQP-GLES3.functional.texture.mipmap.2d.projected#nearest_linear_repeat
+dEQP-GLES3.functional.texture.mipmap.2d.projected#nearest_nearest_clamp
+dEQP-GLES3.functional.texture.mipmap.2d.projected#nearest_nearest_mirror
+dEQP-GLES3.functional.texture.mipmap.2d.projected#nearest_nearest_repeat
+dEQP-GLES3.functional.texture.size.cube#256x256_rgba4444
+dEQP-GLES3.functional.texture.size.cube#512x512_rgba4444
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#r16f_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#r16ui_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#r32f_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#r32i_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#r32ui_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#r8_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#r8i_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#r8_snorm_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rg16ui_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rg8i_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rgb10_a2_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rgb10_a2ui_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rgb8_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rgb8i_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rgb8ui_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rgba16i_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#rgba32f_3d
+dEQP-GLES3.functional.texture.specification.basic_teximage3d#srgb8_alpha8_3d
+dEQP-GLES3.functional.texture.specification.teximage3d_depth_pbo#depth_component16_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#depth24_stencil8_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#depth32f_stencil8_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#depth_component16_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#depth_component24_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#depth_component32f_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#r11f_g11f_b10f_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#r16f_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#r16i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#r32i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#r8i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#r8_snorm_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#r8ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rg16f_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rg16i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rg16ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rg32ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rg8_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rg8i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rg8_snorm_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb10_a2_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb10_a2ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb16f_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb16i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb16ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb32f_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb32i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb32ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb8_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb8i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgb8ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgba16f_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgba16ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgba32f_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgba32i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgba8_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgba8i_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgba8_snorm_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#rgba8ui_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.format#srgb8_alpha8_2d
+dEQP-GLES3.functional.texture.specification.texstorage2d.size#2d_57x63_6_levels
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#depth32f_stencil8_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r11f_g11f_b10f_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r16f_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r16i_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r16i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r16ui_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r32f_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r32i_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r32i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r32ui_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r8_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r8i_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r8i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r8_snorm_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r8_snorm_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#r8ui_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg16i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg32f_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg32i_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg32i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg32ui_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg8_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg8i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg8_snorm_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg8_snorm_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rg8ui_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb10_a2_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb10_a2_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb16f_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb16i_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb16i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb16ui_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb32i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb8_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb8i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgb8ui_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba16f_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba16i_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba16i_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba16ui_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba32f_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba32ui_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba8_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba8i_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba8_snorm_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba8ui_2d_array
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#rgba8ui_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#srgb8_3d
+dEQP-GLES3.functional.texture.specification.texstorage3d.format#srgb8_alpha8_3d
+dEQP-GLES3.functional.transform_feedback.array_element.separate.lines#highp_mat2
+dEQP-GLES3.functional.transform_feedback.array_element.separate.lines#lowp_mat2
+dEQP-GLES3.functional.transform_feedback.array_element.separate.lines#mediump_mat2
+dEQP-GLES3.functional.transform_feedback.array_element.separate.points#highp_mat2
+dEQP-GLES3.functional.transform_feedback.array_element.separate.points#lowp_mat2
+dEQP-GLES3.functional.transform_feedback.array_element.separate.points#mediump_mat2
+dEQP-GLES3.functional.transform_feedback.array_element.separate.triangles#highp_mat2
+dEQP-GLES3.functional.transform_feedback.array_element.separate.triangles#lowp_mat2
+dEQP-GLES3.functional.transform_feedback.array_element.separate.triangles#mediump_mat2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#highp_vec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#lowp_vec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.lines#mediump_vec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#highp_vec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#lowp_vec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.points#mediump_vec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#highp_vec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#lowp_vec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_float
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_int
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_ivec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_ivec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_ivec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_uint
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_uvec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_uvec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_uvec4
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_vec2
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_vec3
+dEQP-GLES3.functional.transform_feedback.array.interleaved.triangles#mediump_vec4
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#highp_float
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#highp_int
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#highp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#highp_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#highp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#highp_vec2
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#lowp_float
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#lowp_int
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#lowp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#lowp_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#lowp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#lowp_vec2
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#mediump_float
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#mediump_int
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#mediump_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#mediump_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#mediump_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.lines#mediump_vec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#highp_float
+dEQP-GLES3.functional.transform_feedback.array.separate.points#highp_int
+dEQP-GLES3.functional.transform_feedback.array.separate.points#highp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#highp_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.points#highp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#highp_vec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#lowp_float
+dEQP-GLES3.functional.transform_feedback.array.separate.points#lowp_int
+dEQP-GLES3.functional.transform_feedback.array.separate.points#lowp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#lowp_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.points#lowp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#lowp_vec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#mediump_float
+dEQP-GLES3.functional.transform_feedback.array.separate.points#mediump_int
+dEQP-GLES3.functional.transform_feedback.array.separate.points#mediump_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#mediump_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.points#mediump_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.points#mediump_vec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#highp_float
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#highp_int
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#highp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#highp_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#highp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#highp_vec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#lowp_float
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#lowp_int
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#lowp_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#lowp_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#lowp_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#lowp_vec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#mediump_float
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#mediump_int
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#mediump_ivec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#mediump_uint
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#mediump_uvec2
+dEQP-GLES3.functional.transform_feedback.array.separate.triangles#mediump_vec2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.lines#highp_mat2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.lines#lowp_mat2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.lines#mediump_mat2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.points#highp_mat2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.points#lowp_mat2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.points#mediump_mat2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.triangles#highp_mat2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.triangles#lowp_mat2
+dEQP-GLES3.functional.transform_feedback.basic_types.separate.triangles#mediump_mat2
+dEQP-GLES3.functional.transform_feedback.random.interleaved.lines#1
+dEQP-GLES3.functional.transform_feedback.random.interleaved.lines#3
+dEQP-GLES3.functional.transform_feedback.random.interleaved.lines#7
+dEQP-GLES3.functional.transform_feedback.random.interleaved.points#2
+dEQP-GLES3.functional.transform_feedback.random.interleaved.triangles#10
+dEQP-GLES3.functional.transform_feedback.random.interleaved.triangles#8
+dEQP-GLES3.functional.transform_feedback.random.separate.lines#1
+dEQP-GLES3.functional.transform_feedback.random.separate.lines#8
+dEQP-GLES3.functional.transform_feedback.random.separate.lines#9
+dEQP-GLES3.functional.transform_feedback.random.separate.points#2
+dEQP-GLES3.functional.transform_feedback.random.separate.points#4
+dEQP-GLES3.functional.transform_feedback.random.separate.points#7
+dEQP-GLES3.functional.transform_feedback.random.separate.triangles#1
+dEQP-GLES3.functional.transform_feedback.random.separate.triangles#10
+dEQP-GLES3.functional.transform_feedback.random.separate.triangles#6
+dEQP-GLES3.functional.transform_feedback.random.separate.triangles#9
+dEQP-GLES3.functional.ubo.random.all_per_block_buffers#28
+dEQP-GLES3.functional.ubo.random.all_per_block_buffers#35
+dEQP-GLES3.functional.ubo.random.nested_structs_arrays#9
+dEQP-GLES3.functional.ubo.random.nested_structs_arrays_instance_arrays#24
+dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer#std140_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer#std140_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_array.single_buffer#std140_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_array.single_buffer#std140_instance_array_fragment
+dEQP-GLES3.functional.uniform_api.random#22
+dEQP-GLES3.functional.uniform_api.random#23
+dEQP-GLES3.functional.uniform_api.random#4
+dEQP-GLES3.functional.uniform_api.random#8
+dEQP-GLES3.functional.uniform_api.random#81
+dEQP-GLES3.functional.uniform_api.random#93
+dEQP-GLES3.functional.uniform_api.value.assigned.basic_array_assign_full.array_in_struct#sampler2D_samplerCube_both
+dEQP-GLES3.functional.uniform_api.value.assigned.basic_array_assign_full.basic_array#sampler2D_both
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.array_in_struct#mat4_mat2_both
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.array_in_struct#mat4_mat2_fragment
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.array_in_struct#mat4_mat2_vertex
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.basic_struct#mat4_mat2_both
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.basic_struct#mat4_mat2_fragment
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.basic_struct#mat4_mat2_vertex
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays#mat4_mat2_both
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays#mat4_mat2_fragment
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays#mat4_mat2_vertex
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.struct_in_array#mat4_mat2_both
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.struct_in_array#mat4_mat2_fragment
+dEQP-GLES3.functional.uniform_api.value.assigned.by_pointer.render.struct_in_array#mat4_mat2_vertex
diff --git a/tests/tests/deqp/gles31-temporary-failures.txt b/tests/tests/deqp/gles31-temporary-failures.txt
new file mode 100644
index 0000000..c3986eb
--- /dev/null
+++ b/tests/tests/deqp/gles31-temporary-failures.txt
@@ -0,0 +1,8941 @@
+dEQP-GLES31.functional.android_extension_pack.shaders.extension_directive#ext_geometry_shader
+dEQP-GLES31.functional.android_extension_pack.shaders.extension_directive#ext_gpu_shader5
+dEQP-GLES31.functional.android_extension_pack.shaders.extension_directive#ext_primitive_bounding_box
+dEQP-GLES31.functional.android_extension_pack.shaders.extension_directive#ext_shader_io_blocks
+dEQP-GLES31.functional.android_extension_pack.shaders.extension_directive#ext_tessellation_shader
+dEQP-GLES31.functional.android_extension_pack.shaders.extension_directive#oes_sample_variables
+dEQP-GLES31.functional.android_extension_pack.shaders.extension_directive#oes_shader_multisample_interpolation
+dEQP-GLES31.functional.android_extension_pack.shaders.extension_macros#android_extension_pack_es31a
+dEQP-GLES31.functional.blend_equation_advanced.state_query#blend_equation_getfloat
+dEQP-GLES31.functional.blend_equation_advanced.state_query#blend_equation_getinteger
+dEQP-GLES31.functional.blend_equation_advanced.state_query#blend_equation_getinteger64
+dEQP-GLES31.functional.blend_equation_advanced.state_query#blend_equation_getinteger64i_v
+dEQP-GLES31.functional.blend_equation_advanced.state_query#blend_equation_getintegeri_v
+dEQP-GLES31.functional.compute.basic#copy_image_to_ssbo_large
+dEQP-GLES31.functional.compute.basic#copy_ssbo_to_image_large
+dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute#large_offset
+dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute#large_offset_multiple_invocations
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_rgba_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_rgba_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_rgba_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_rgba_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.rgba_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_rgba_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_rgba_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_rgba_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_rgba_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x10_rgba.srgb8_alpha8_astc_10x10_khr_srgb8_alpha8_astc_10x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_rgba_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_rgba_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_rgba_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_rgba_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.rgba_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_rgba_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_rgba_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_rgba_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_rgba_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x5_rgba.srgb8_alpha8_astc_10x5_khr_srgb8_alpha8_astc_10x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_rgba_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_rgba_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_rgba_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_rgba_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.rgba_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_rgba_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_rgba_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_rgba_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_rgba_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x6_rgba.srgb8_alpha8_astc_10x6_khr_srgb8_alpha8_astc_10x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_rgba_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_rgba_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_rgba_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_rgba_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.rgba_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_rgba_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_rgba_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_rgba_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_rgba_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_10x8_rgba.srgb8_alpha8_astc_10x8_khr_srgb8_alpha8_astc_10x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_rgba_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_rgba_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_rgba_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_rgba_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.rgba_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_rgba_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_rgba_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_rgba_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_rgba_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x10_rgba.srgb8_alpha8_astc_12x10_khr_srgb8_alpha8_astc_12x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_rgba_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_rgba_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_rgba_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_rgba_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.rgba_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_rgba_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_rgba_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_rgba_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_rgba_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_12x12_rgba.srgb8_alpha8_astc_12x12_khr_srgb8_alpha8_astc_12x12_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_rgba_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_rgba_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_rgba_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_rgba_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.rgba_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_rgba_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_rgba_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_rgba_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_rgba_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_4x4_rgba.srgb8_alpha8_astc_4x4_khr_srgb8_alpha8_astc_4x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_rgba_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_rgba_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_rgba_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_rgba_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.rgba_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_rgba_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_rgba_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_rgba_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_rgba_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x4_rgba.srgb8_alpha8_astc_5x4_khr_srgb8_alpha8_astc_5x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_rgba_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_rgba_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_rgba_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_rgba_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_rgba_astc_5x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.rgba_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_rgba_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_rgba_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_rgba_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_rgba_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_5x5_rgba.srgb8_alpha8_astc_5x5_khr_srgb8_alpha8_astc_5x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_rgba_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_rgba_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_rgba_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_rgba_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_rgba_astc_6x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.rgba_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_rgba_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_rgba_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_rgba_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_rgba_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_rgba_astc_6x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x5_rgba.srgb8_alpha8_astc_6x5_khr_srgb8_alpha8_astc_6x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_rgba_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_rgba_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_rgba_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_rgba_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.rgba_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_rgba_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_rgba_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_rgba_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_rgba_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_6x6_rgba.srgb8_alpha8_astc_6x6_khr_srgb8_alpha8_astc_6x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_rgba_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_rgba_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_rgba_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_rgba_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_rgba_astc_8x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.rgba_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_rgba_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_rgba_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_rgba_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_rgba_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x5_rgba.srgb8_alpha8_astc_8x5_khr_srgb8_alpha8_astc_8x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_rgba_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_rgba_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_rgba_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_rgba_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.rgba_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_rgba_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_rgba_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_rgba_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_rgba_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x6_rgba.srgb8_alpha8_astc_8x6_khr_srgb8_alpha8_astc_8x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_rgba_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_rgba_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_rgba_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_rgba_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.rgba_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_rgba_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_rgba_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_rgba_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_rgba_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_astc_8x8_rgba.srgb8_alpha8_astc_8x8_khr_srgb8_alpha8_astc_8x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.r11_eac_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.r11_eac_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.r11_eac_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.r11_eac_signed_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.r11_eac_signed_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.r11_eac_signed_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.signed_r11_eac_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.signed_r11_eac_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.signed_r11_eac_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.signed_r11_eac_signed_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.signed_r11_eac_signed_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_r11.signed_r11_eac_signed_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.rg11_eac_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.rg11_eac_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.rg11_eac_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.rg11_eac_signed_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.rg11_eac_signed_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.rg11_eac_signed_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.signed_rg11_eac_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.signed_rg11_eac_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.signed_rg11_eac_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.signed_rg11_eac_signed_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.signed_rg11_eac_signed_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_eac_rg11.signed_rg11_eac_signed_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.rgba8_etc2_eac_rgba8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.rgba8_etc2_eac_rgba8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.rgba8_etc2_eac_rgba8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.rgba8_etc2_eac_srgb8_alpha8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.rgba8_etc2_eac_srgb8_alpha8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.rgba8_etc2_eac_srgb8_alpha8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.srgb8_alpha8_etc2_eac_rgba8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.srgb8_alpha8_etc2_eac_rgba8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.srgb8_alpha8_etc2_eac_rgba8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.srgb8_alpha8_etc2_eac_srgb8_alpha8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.srgb8_alpha8_etc2_eac_srgb8_alpha8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_eac_rgba.srgb8_alpha8_etc2_eac_srgb8_alpha8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.rgb8_punchthrough_alpha1_etc2_rgb8_punchthrough_alpha1_etc2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.rgb8_punchthrough_alpha1_etc2_rgb8_punchthrough_alpha1_etc2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.rgb8_punchthrough_alpha1_etc2_rgb8_punchthrough_alpha1_etc2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.rgb8_punchthrough_alpha1_etc2_srgb8_punchthrough_alpha1_etc2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.rgb8_punchthrough_alpha1_etc2_srgb8_punchthrough_alpha1_etc2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.rgb8_punchthrough_alpha1_etc2_srgb8_punchthrough_alpha1_etc2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.srgb8_punchthrough_alpha1_etc2_rgb8_punchthrough_alpha1_etc2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.srgb8_punchthrough_alpha1_etc2_rgb8_punchthrough_alpha1_etc2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.srgb8_punchthrough_alpha1_etc2_rgb8_punchthrough_alpha1_etc2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.srgb8_punchthrough_alpha1_etc2_srgb8_punchthrough_alpha1_etc2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.srgb8_punchthrough_alpha1_etc2_srgb8_punchthrough_alpha1_etc2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgba.srgb8_punchthrough_alpha1_etc2_srgb8_punchthrough_alpha1_etc2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.rgb8_etc2_rgb8_etc2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.rgb8_etc2_rgb8_etc2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.rgb8_etc2_rgb8_etc2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.rgb8_etc2_srgb8_etc2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.rgb8_etc2_srgb8_etc2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.rgb8_etc2_srgb8_etc2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.srgb8_etc2_rgb8_etc2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.srgb8_etc2_rgb8_etc2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.srgb8_etc2_rgb8_etc2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.srgb8_etc2_srgb8_etc2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.srgb8_etc2_srgb8_etc2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.compressed.viewclass_etc2_rgb.srgb8_etc2_srgb8_etc2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rg11_eac_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba8_etc2_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba8_etc2_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba8_etc2_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba8_etc2_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba8_etc2_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rgba_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_signed_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_signed_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_signed_rg11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_signed_rg11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_signed_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_signed_rg11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_signed_rg11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_signed_rg11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_etc2_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_etc2_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_etc2_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_etc2_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_srgb8_alpha8_etc2_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rg11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba8_etc2_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_4x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_rgba_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_signed_rg11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32i_srgb8_alpha8_etc2_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rg11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba8_etc2_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_rgba_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_signed_rg11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x10_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_10x8_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x10_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_12x12_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_4x4_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x4_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_5x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_6x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x5_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x6_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_astc_8x8_khr#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32ui_srgb8_alpha8_etc2_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba8_etc2_eac_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x10_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x5_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x6_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_10x8_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x10_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_12x12_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_4x4_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x4_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_5x5_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x5_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_6x6_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x5_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x6_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba_astc_8x8_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.signed_rg11_eac_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x10_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x5_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x6_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_10x8_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x10_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_12x12_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_4x4_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x4_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_5x5_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x5_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_6x6_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x5_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x6_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_astc_8x8_khr_rgba32ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.srgb8_alpha8_etc2_eac_rgba32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rg32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.r11_eac_rgba16ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_signed_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_signed_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_signed_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_signed_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_signed_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_signed_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_signed_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32f_signed_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32i_signed_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rg32ui_signed_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_signed_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_signed_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_signed_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_signed_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_signed_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_signed_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_signed_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16f_signed_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16i_signed_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.rgba16ui_signed_r11_eac#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rg32ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.mixed.viewclass_64_bits_mixed.signed_r11_eac_rgba16ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32i_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32ui_rgba32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_r16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16f_rg8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_r16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16i_rg8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_r16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.r16ui_rg8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_r16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8i_rg8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_r16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_rg8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_r16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8_snorm_rg8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_r16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_16_bits.rg8ui_rg8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_rgb8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8i_srgb8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_rgb8ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_rgb8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_srgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_srgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_srgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_srgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_srgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_srgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_snorm_srgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_srgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_srgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_srgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_srgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_srgb8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_srgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_srgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8_srgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_rgb8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.rgb8ui_srgb8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_rgb8ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_srgb8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_srgb8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_srgb8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_srgb8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_srgb8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_srgb8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_24_bits.srgb8_srgb8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r11f_g11f_b10f_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32f_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32i_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.r32ui_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16f_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16i_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rg16ui_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb10_a2ui_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgb9_e5_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8ui_srgb8_alpha8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r11f_g11f_b10f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_r32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16f#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rg16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb10_a2ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgb9_e5#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_rgba8ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.srgb8_alpha8_srgb8_alpha8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16f_rgb16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16i_rgb16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_48_bits.rgb16ui_rgb16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rg32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32f_rgba16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rg32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32i_rgba16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rg32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rg32ui_rgba16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rg32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16f_rgba16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rg32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16i_rgba16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rg32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16f#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_64_bits.rgba16ui_rgba16ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#renderbuffer_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8i_r8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#renderbuffer_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8i#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8_snorm#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#renderbuffer_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_r8ui#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8_snorm_r8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#renderbuffer_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#renderbuffer_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#renderbuffer_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#renderbuffer_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8_snorm#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8_snorm#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8_snorm#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8_snorm#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8_snorm#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8_snorm#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8_snorm#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8_snorm#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_array_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_array_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_array_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_array_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture2d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture3d_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture3d_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture3d_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8#texture3d_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#cubemap_to_renderbuffer
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#renderbuffer_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_8_bits.r8ui_r8ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32f_rgb32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32i_rgb32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32f#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32f#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32f#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32f#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32f#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32f#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32f#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32i#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32i#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32i#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32i#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32i#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32i#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32i#texture3d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32ui#cubemap_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32ui#cubemap_to_texture2d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32ui#cubemap_to_texture2d_array
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32ui#cubemap_to_texture3d
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32ui#texture2d_array_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32ui#texture2d_to_cubemap
+dEQP-GLES31.functional.copy_image.non_compressed.viewclass_96_bits.rgb32ui_rgb32ui#texture3d_to_cubemap
+dEQP-GLES31.functional.debug.error_filters#case_0
+dEQP-GLES31.functional.debug.error_filters#case_16
+dEQP-GLES31.functional.debug.error_filters#case_18
+dEQP-GLES31.functional.debug.error_filters#case_19
+dEQP-GLES31.functional.debug.error_filters#case_20
+dEQP-GLES31.functional.debug.error_filters#case_26
+dEQP-GLES31.functional.debug.error_filters#case_3
+dEQP-GLES31.functional.debug.error_filters#case_8
+dEQP-GLES31.functional.debug.error_groups#case_0
+dEQP-GLES31.functional.debug.error_groups#case_10
+dEQP-GLES31.functional.debug.error_groups#case_11
+dEQP-GLES31.functional.debug.error_groups#case_13
+dEQP-GLES31.functional.debug.error_groups#case_15
+dEQP-GLES31.functional.debug.error_groups#case_3
+dEQP-GLES31.functional.debug.error_groups#case_8
+dEQP-GLES31.functional.debug.error_groups#case_9
+dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer#invalidate_framebuffer
+dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer#invalidate_sub_framebuffer
+dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer#clear
+dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer#draw_buffers
+dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer#framebuffer_texture2d
+dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer#framebuffer_texture_layer
+dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer#invalidate_framebuffer
+dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer#invalidate_sub_framebuffer
+dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer#read_buffer
+dEQP-GLES31.functional.debug.negative_coverage.get_error.shader#program_binary
+dEQP-GLES31.functional.debug.negative_coverage.get_error.shader#program_parameteri
+dEQP-GLES31.functional.debug.negative_coverage.get_error.state#get_internalformativ
+dEQP-GLES31.functional.debug.negative_coverage.get_error.texture#compressedteximage3d_max_level
+dEQP-GLES31.functional.debug.negative_coverage.get_error.texture#compressedtexsubimage2d_max_level
+dEQP-GLES31.functional.debug.negative_coverage.get_error.texture#compressedtexsubimage3d_max_level
+dEQP-GLES31.functional.debug.negative_coverage.get_error.texture#generatemipmap
+dEQP-GLES31.functional.debug.negative_coverage.get_error.texture#teximage3d
+dEQP-GLES31.functional.debug.negative_coverage.log.buffer#invalidate_framebuffer
+dEQP-GLES31.functional.debug.negative_coverage.log.buffer#invalidate_sub_framebuffer
+dEQP-GLES31.functional.debug.object_labels#buffer_limited_query
+dEQP-GLES31.functional.debug.object_labels#clearing
+dEQP-GLES31.functional.debug.object_labels#program_pipeline
+dEQP-GLES31.functional.debug.object_labels#query_length_only
+dEQP-GLES31.functional.debug.object_labels#specify_with_length
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_common#common_advanced_blend_eq_buffer_advanced_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_common#common_advanced_blend_eq_buffer_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_common#common_advanced_blend_eq_buffer_separate_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_common#common_blend_func_buffer_blend_func
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_common#common_blend_func_buffer_separate_blend_func
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_common#common_color_mask_buffer_color_mask
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_common#common_separate_blend_func_buffer_blend_func
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_common#common_separate_blend_func_buffer_separate_blend_func
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_enable_buffer_enable
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_disable_buffer_disable
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_disable_buffer_enable
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_enable_buffer_disable
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_blend_eq_buffer_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_blend_eq_buffer_separate_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_blend_eq_buffer_advanced_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_separate_blend_eq_buffer_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_separate_blend_eq_buffer_separate_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_separate_blend_eq_buffer_advanced_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_advanced_blend_eq_buffer_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_advanced_blend_eq_buffer_separate_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_advanced_blend_eq_buffer_advanced_blend_eq
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_blend_func_buffer_blend_func
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_blend_func_buffer_separate_blend_func
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_separate_blend_func_buffer_blend_func
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_separate_blend_func_buffer_separate_blend_func
+dEQP-GLES31.functional.draw_buffers_indexed.overwrite_indexed#common_color_mask_buffer_color_mask
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#0
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#1
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#14
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#15
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#16
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#17
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#2
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#5
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#6
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#7
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers#9
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers#12
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers#13
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers#15
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers#16
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers#2
+dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers#7
+dEQP-GLES31.functional.draw_indirect.negative#command_offset_not_in_buffer_unsigned32_wrap
+dEQP-GLES31.functional.fbo.no_attachments.maximums#all
+dEQP-GLES31.functional.geometry_shading.emit#line_strip_emit_0_end_0
+dEQP-GLES31.functional.geometry_shading.emit#line_strip_emit_0_end_1
+dEQP-GLES31.functional.geometry_shading.emit#line_strip_emit_0_end_2
+dEQP-GLES31.functional.geometry_shading.emit#points_emit_0_end_0
+dEQP-GLES31.functional.geometry_shading.emit#points_emit_0_end_1
+dEQP-GLES31.functional.geometry_shading.emit#points_emit_0_end_2
+dEQP-GLES31.functional.geometry_shading.emit#triangle_strip_emit_0_end_0
+dEQP-GLES31.functional.geometry_shading.emit#triangle_strip_emit_0_end_1
+dEQP-GLES31.functional.geometry_shading.emit#triangle_strip_emit_0_end_2
+dEQP-GLES31.functional.geometry_shading.query#max_geometry_atomic_counter_buffers
+dEQP-GLES31.functional.geometry_shading.query#max_geometry_atomic_counters
+dEQP-GLES31.functional.multisample.default_framebuffer#sample_mask_sum_of_inverses
+dEQP-GLES31.functional.multisample.default_framebuffer#sample_position
+dEQP-GLES31.functional.primitive_bounding_box.call_order#bbox_first_viewport_second
+dEQP-GLES31.functional.primitive_bounding_box.call_order#viewport_first_bbox_second
+dEQP-GLES31.functional.primitive_bounding_box.clear#full_clear_with_triangles
+dEQP-GLES31.functional.primitive_bounding_box.clear#full_clear_with_triangles_per_primitive_bbox
+dEQP-GLES31.functional.primitive_bounding_box.clear#scissored_clear_with_triangles
+dEQP-GLES31.functional.primitive_bounding_box.clear#scissored_clear_with_triangles_per_primitive_bbox
+dEQP-GLES31.functional.primitive_bounding_box.clear#scissored_full_clear_with_triangles
+dEQP-GLES31.functional.primitive_bounding_box.clear#scissored_full_clear_with_triangles_per_primitive_bbox
+dEQP-GLES31.functional.primitive_bounding_box.depth.builtin_depth#per_primitive_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.depth.builtin_depth#per_primitive_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.depth.user_defined_depth#per_primitive_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.depth.user_defined_depth#per_primitive_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_primitive.vertex_tessellation_fragment#default_framebuffer
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_primitive.vertex_tessellation_fragment#fbo
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_primitive.vertex_tessellation_geometry_fragment#default_framebuffer
+dEQP-GLES31.functional.primitive_bounding_box.lines.tessellation_set_per_primitive.vertex_tessellation_geometry_fragment#fbo
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_geometry_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_geometry_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_geometry_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_geometry_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_geometry_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_geometry_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_tessellation_geometry_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_tessellation_geometry_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.points.global_state.vertex_tessellation_geometry_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_primitive.vertex_tessellation_fragment#default_framebuffer
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_primitive.vertex_tessellation_fragment#fbo
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_primitive.vertex_tessellation_geometry_fragment#default_framebuffer
+dEQP-GLES31.functional.primitive_bounding_box.points.tessellation_set_per_primitive.vertex_tessellation_geometry_fragment#fbo
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_geometry_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_geometry_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.triangles.global_state.vertex_tessellation_geometry_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_primitive.vertex_tessellation_fragment#default_framebuffer
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_primitive.vertex_tessellation_fragment#fbo
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_primitive.vertex_tessellation_geometry_fragment#default_framebuffer
+dEQP-GLES31.functional.primitive_bounding_box.triangles.tessellation_set_per_primitive.vertex_tessellation_geometry_fragment#fbo
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#default_framebuffer_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_equal
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_larger
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_draw.vertex_tessellation_geometry_fragment#fbo_bbox_smaller
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_primitive.vertex_tessellation_fragment#default_framebuffer
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_primitive.vertex_tessellation_fragment#fbo
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_primitive.vertex_tessellation_geometry_fragment#default_framebuffer
+dEQP-GLES31.functional.primitive_bounding_box.wide_lines.tessellation_set_per_primitive.vertex_tessellation_geometry_fragment#fbo
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_separable_geometry
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_geo_fragment
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_geo_fragment_only_fragment
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_geo_fragment_only_geo
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_geo_fragment_only_vertex
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_tess_geo_fragment
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_tess_geo_fragment_only_fragment
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_tess_geo_fragment_only_geo
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_tess_geo_fragment_only_tess_ctrl
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_tess_geo_fragment_only_tess_eval
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer#referenced_by_vertex_tess_geo_fragment_only_vertex
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#22
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#30
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#36
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#40
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#41
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#42
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#44
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#45
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#47
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#48
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#49
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#51
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#52
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#54
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#55
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#56
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#58
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#59
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#61
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#62
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#63
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#65
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#66
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#67
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#68
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#70
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#72
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#73
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#75
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#76
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#77
+dEQP-GLES31.functional.program_interface_query.buffer_variable.random#79
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block#float_unsized_struct_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block#float_unsized_struct_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float_array_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float_array_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float_struct_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float_struct_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float_unsized_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.named_block#float_unsized_struct_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_geometry.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_tess_ctrl.named_block#float_unsized_struct_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_tess_eval.named_block#float_unsized_struct_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block#float_unsized_struct_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_fragment.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_geo.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment_only_vertex.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_geo_fragment.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_fragment.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_geo.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_tess_eval.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.block_array#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.named_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.named_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.named_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment_only_vertex.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_tess_geo_fragment.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.interface_blocks.patch_in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_tess_eval#patch_var
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_tess_eval#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_tess_eval#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.interface_blocks.patch_in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_fragment#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_fragment#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_fragment#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_tess_eval#patch_var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_tess_eval#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_tess_eval#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.separable_vertex#var
+dEQP-GLES31.functional.program_interface_query.program_input.is_per_patch.vertex_fragment#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.block_array#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.block_array#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.block_array#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.unnamed_block#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.unnamed_block#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.in.unnamed_block#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.block_array#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.block_array#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.block_array#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block_explicit_location#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block_explicit_location#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block_explicit_location#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.named_block#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.unnamed_block#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.unnamed_block#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.interface_blocks.patch_in.unnamed_block#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_geometry#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_ctrl#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_eval#patch_var
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_eval#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_eval#patch_var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_eval#patch_var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_eval#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_eval#patch_var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_tess_eval#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.interface_blocks.patch_in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_tess_eval#patch_var
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_tess_eval#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_tess_eval#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_input.referenced_by#referenced_by_separable_geometry
+dEQP-GLES31.functional.program_interface_query.program_input.referenced_by#referenced_by_separable_tess_eval_patch_in
+dEQP-GLES31.functional.program_interface_query.program_input.referenced_by#referenced_by_vertex_geo_fragment
+dEQP-GLES31.functional.program_interface_query.program_input.referenced_by#referenced_by_vertex_tess_geo_fragment
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.compute#empty
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.interface_blocks.patch_in.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_geometry#empty
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_tess_ctrl#empty
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_tess_eval#empty
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_tess_eval#patch_var
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_tess_eval#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_tess_eval#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.array#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.array#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.array#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.struct#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.struct#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.block_array.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.array#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.array#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.array#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.struct#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.struct#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.in.unnamed_block.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.array#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.array#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.array#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.struct#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.struct#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.block_array.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.array#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.array#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.array#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.array#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.array#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.array#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.struct#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.struct#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block_explicit_location.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.struct#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.struct#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.named_block.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.array#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.array#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.array#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.struct#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.struct#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.interface_blocks.patch_in.unnamed_block.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#ivec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#ivec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat2x3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat2x4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat3x4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat4x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#mat4x3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#uvec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#uvec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#vec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_geometry#vec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#ivec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#ivec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat2x3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat2x4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat3x4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat4x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#mat4x3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#uvec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#uvec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#vec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_ctrl#vec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#ivec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#ivec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat2x3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat2x4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat3x4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat4x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#mat4x3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#uvec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#uvec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#vec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.basic_type#vec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_array#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_array#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_array#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_array#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_struct#float
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_struct#int
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_struct#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var_struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var#uint
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var#uvec4
+dEQP-GLES31.functional.program_interface_query.program_input.type.separable_tess_eval.patch_var#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.interface_blocks.patch_out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_geometry#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_geometry#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_tess_ctrl#patch_var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_tess_ctrl#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_tess_ctrl#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_tess_eval#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_tess_eval#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.interface_blocks.patch_out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_fragment#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_fragment#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_geometry#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_geometry#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_tess_ctrl#patch_var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_tess_ctrl#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_tess_ctrl#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_tess_eval#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_tess_eval#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_vertex#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_vertex#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.separable_vertex#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.vertex_fragment#var
+dEQP-GLES31.functional.program_interface_query.program_output.is_per_patch.vertex_fragment#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.block_array#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.block_array#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.block_array#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block_explicit_location#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block_explicit_location#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block_explicit_location#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.named_block#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.unnamed_block#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.unnamed_block#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.out.unnamed_block#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.block_array#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.block_array#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.block_array#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block_explicit_location#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block_explicit_location#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block_explicit_location#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.named_block#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.unnamed_block#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.unnamed_block#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.interface_blocks.patch_out.unnamed_block#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_geometry#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_geometry#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_geometry#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_geometry#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_geometry#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_ctrl#patch_var
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_ctrl#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_ctrl#patch_var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_ctrl#patch_var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_ctrl#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_ctrl#patch_var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_ctrl#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_eval#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_eval#var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_eval#var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_eval#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_tess_eval#var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex#var
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.interface_blocks.patch_out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_geometry#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_geometry#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_tess_ctrl#patch_var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_tess_ctrl#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_tess_ctrl#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_tess_eval#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_tess_eval#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.referenced_by#referenced_by_separable_geometry
+dEQP-GLES31.functional.program_interface_query.program_output.referenced_by#referenced_by_separable_tess_ctrl_patch_out
+dEQP-GLES31.functional.program_interface_query.program_output.referenced_by#referenced_by_vertex_geo_fragment
+dEQP-GLES31.functional.program_interface_query.program_output.referenced_by#referenced_by_vertex_tess_geo_fragment
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.block_array#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.block_array#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.block_array#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.named_block_explicit_location#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.named_block_explicit_location#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.named_block_explicit_location#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.named_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.named_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.named_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.unnamed_block#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.unnamed_block#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.interface_blocks.patch_out.unnamed_block#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_geometry#empty
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_geometry#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_geometry#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_geometry#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_ctrl#empty
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_ctrl#patch_var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_ctrl#patch_var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_ctrl#patch_var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_ctrl#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_eval#empty
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_eval#var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_eval#var_array
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_tess_eval#var_struct
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.array#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.array#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.struct#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.block_array.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.array#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.array#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.array#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.array#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.struct#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block_explicit_location.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.struct#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.named_block.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.array#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.array#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.struct#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.out.unnamed_block.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.block_array.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block_explicit_location.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.named_block.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.interface_blocks.patch_out.unnamed_block.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.array#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.array#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#ivec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#ivec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat2x3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat2x4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat3x4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat4x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#mat4x3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#uvec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#uvec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#vec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.basic_type#vec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.struct#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_geometry.struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#ivec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#ivec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat2x3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat2x4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat3x4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat4x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#mat4x3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#uvec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#uvec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#vec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.basic_type#vec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_array#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_array#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_array#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_struct#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_struct#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var_struct#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_ctrl.patch_var#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.array#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.array#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.array#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.array#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.array#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.array#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.array#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#ivec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#ivec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat2x3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat2x4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat3x4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat4x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#mat4x3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#uvec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#uvec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#vec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.basic_type#vec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.struct#float
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.struct#int
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.struct#uint
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.program_output.type.separable_tess_eval.struct#vec3
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_geometry#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_geometry#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_geometry#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_fragment#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_fragment#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_fragment#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_geo#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_geo#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_geo#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_vertex#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_vertex#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment_only_vertex#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_geo_fragment#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_fragment#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_fragment#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_fragment#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_geo#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_geo#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_geo#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_tess_eval#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_tess_eval#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_tess_eval#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_vertex#block_array
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_vertex#named_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment_only_vertex#unnamed_block
+dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_tess_geo_fragment#unnamed_block
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_geometry#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_geometry#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_geometry#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_geometry#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_geometry#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_tess_eval#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_tess_eval#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_vertex#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_vertex#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_geo_fragment#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_geo_fragment#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_geo_fragment#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_geo_fragment#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_geo_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_tess_fragment#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_tess_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_tess_geo_fragment#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_tess_geo_fragment#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_tess_geo_fragment#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_tess_geo_fragment#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_tess_geo_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_geometry#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_geometry#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_geometry#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_geometry#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_geometry#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_tess_eval#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_vertex#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_geo_fragment#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_geo_fragment#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_geo_fragment#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_geo_fragment#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_geo_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_tess_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_tess_geo_fragment#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_tess_geo_fragment#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_tess_geo_fragment#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_tess_geo_fragment#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_tess_geo_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_geometry#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_geometry#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_geometry#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_geometry#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_geometry#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_tess_eval#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_geo_fragment#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_geo_fragment#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_geo_fragment#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_geo_fragment#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_geo_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_tess_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_tess_geo_fragment#builtin_gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_tess_geo_fragment#default_block_array
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_tess_geo_fragment#default_block_array_element
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_tess_geo_fragment#default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_tess_geo_fragment#default_block_struct_member
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.array#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.array#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.array#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.array#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.array#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.array#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.array#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.basic_type#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.basic_type#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.basic_type#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.basic_type#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.basic_type#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.builtin#gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.struct#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.struct#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.struct#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.struct#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.struct#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.struct#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.struct#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.whole_array#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.whole_array#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.whole_array#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.whole_array#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.whole_array#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.whole_array#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_geometry.whole_array#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_tess_eval.struct#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_tess_eval.struct#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_tess_eval.struct#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_tess_eval.struct#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_tess_eval.struct#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_tess_eval.struct#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_tess_eval.struct#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#ivec4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat2x3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat2x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat4x2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#mat4x3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#uvec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#vec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct#vec4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#ivec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#ivec4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat2x3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat2x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat3x2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat4x2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#mat4x3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#uvec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#uvec4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#vec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct#vec4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.array#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.array#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.array#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.array#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.array#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.array#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.array#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.basic_type#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.basic_type#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.basic_type#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.basic_type#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.basic_type#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.builtin#gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.struct#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.struct#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.struct#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.struct#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.struct#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.struct#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.struct#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.whole_array#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.whole_array#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.whole_array#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.whole_array#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.whole_array#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.whole_array#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_geo_fragment.whole_array#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_fragment.struct#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_fragment.struct#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_fragment.struct#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_fragment.struct#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_fragment.struct#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_fragment.struct#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_fragment.struct#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.array#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.array#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.array#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.array#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.array#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.array#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.array#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.basic_type#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.basic_type#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.basic_type#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.basic_type#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.basic_type#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.basic_type#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.basic_type#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.builtin#gl_position
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.struct#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.struct#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.struct#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.struct#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.struct#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.struct#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.struct#vec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.whole_array#float
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.whole_array#int
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.whole_array#ivec3
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.whole_array#mat3x4
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.whole_array#uint
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.whole_array#uvec2
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_tess_geo_fragment.whole_array#vec3
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_geometry#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_geometry#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_geometry#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_fragment#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_fragment#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_fragment#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_geo#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_geo#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_geo#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_vertex#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_vertex#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment_only_vertex#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_geo_fragment#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_fragment#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_fragment#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_fragment#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_geo#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_geo#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_geo#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_tess_ctrl#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_tess_eval#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_tess_eval#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_tess_eval#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_vertex#block_array
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_vertex#named_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment_only_vertex#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_tess_geo_fragment#unnamed_block
+dEQP-GLES31.functional.program_interface_query.uniform.random#40
+dEQP-GLES31.functional.program_interface_query.uniform.random#41
+dEQP-GLES31.functional.program_interface_query.uniform.random#42
+dEQP-GLES31.functional.program_interface_query.uniform.random#44
+dEQP-GLES31.functional.program_interface_query.uniform.random#45
+dEQP-GLES31.functional.program_interface_query.uniform.random#47
+dEQP-GLES31.functional.program_interface_query.uniform.random#48
+dEQP-GLES31.functional.program_interface_query.uniform.random#49
+dEQP-GLES31.functional.program_interface_query.uniform.random#51
+dEQP-GLES31.functional.program_interface_query.uniform.random#52
+dEQP-GLES31.functional.program_interface_query.uniform.random#54
+dEQP-GLES31.functional.program_interface_query.uniform.random#55
+dEQP-GLES31.functional.program_interface_query.uniform.random#56
+dEQP-GLES31.functional.program_interface_query.uniform.random#58
+dEQP-GLES31.functional.program_interface_query.uniform.random#59
+dEQP-GLES31.functional.program_interface_query.uniform.random#61
+dEQP-GLES31.functional.program_interface_query.uniform.random#63
+dEQP-GLES31.functional.program_interface_query.uniform.random#65
+dEQP-GLES31.functional.program_interface_query.uniform.random#66
+dEQP-GLES31.functional.program_interface_query.uniform.random#68
+dEQP-GLES31.functional.program_interface_query.uniform.random#70
+dEQP-GLES31.functional.program_interface_query.uniform.random#72
+dEQP-GLES31.functional.program_interface_query.uniform.random#73
+dEQP-GLES31.functional.program_interface_query.uniform.random#75
+dEQP-GLES31.functional.program_interface_query.uniform.random#77
+dEQP-GLES31.functional.program_interface_query.uniform.random#79
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#float_array_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#float_array_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#float_struct_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#float_struct_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.uniform_block#float_array_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.uniform_block#float_array_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.uniform_block#float_struct_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.uniform_block#float_struct_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_geometry.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_fragment.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_geo.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment_only_vertex.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_geo_fragment.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_fragment.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_geo.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_ctrl.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_tess_eval.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.block_array#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.block_array#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.block_array#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.default_block#atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.default_block#atomic_uint_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.default_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.default_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.default_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.default_block#sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.default_block#sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.default_block#sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment_only_vertex.unnamed_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.uniform_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.uniform_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.uniform_block#float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.unnamed_block#float
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.unnamed_block#float_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_tess_geo_fragment.unnamed_block#float_struct
+dEQP-GLES31.functional.sample_shading.min_sample_shading#multisample_renderbuffer_samples_16_color
+dEQP-GLES31.functional.sample_shading.min_sample_shading#multisample_renderbuffer_samples_16_discard
+dEQP-GLES31.functional.sample_shading.min_sample_shading#multisample_texture_samples_16_color
+dEQP-GLES31.functional.sample_shading.min_sample_shading#multisample_texture_samples_16_discard
+dEQP-GLES31.functional.separate_shader.validation.io_blocks#mismatch_different_member_interpolation
+dEQP-GLES31.functional.separate_shader.validation.varying#mismatch_qualifier_vertex_centroid_fragment_flat
+dEQP-GLES31.functional.separate_shader.validation.varying#mismatch_qualifier_vertex_flat_fragment_centroid
+dEQP-GLES31.functional.separate_shader.validation.varying#mismatch_qualifier_vertex_flat_fragment_none
+dEQP-GLES31.functional.separate_shader.validation.varying#mismatch_qualifier_vertex_flat_fragment_smooth
+dEQP-GLES31.functional.separate_shader.validation.varying#mismatch_qualifier_vertex_smooth_fragment_flat
+dEQP-GLES31.functional.shaders.arrays.invalid#constructor_c_style2_fragment
+dEQP-GLES31.functional.shaders.arrays.invalid#constructor_c_style2_vertex
+dEQP-GLES31.functional.shaders.arrays.invalid#constructor_c_style4_fragment
+dEQP-GLES31.functional.shaders.arrays.invalid#constructor_c_style4_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#bool_3x3x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#bool_3x3x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#bvec3_3x1_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#bvec3_3x1_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#float_3x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#float_3x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#int_2x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#int_2x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#ivec3_3x1x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#ivec3_3x1x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#mat3_3x2_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#mat3_3x2_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#mat3_3x3x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#mat3_3x3x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#mat3_3x4_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#mat3_3x4_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#struct_5x5x4_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#struct_5x5x4_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#vec3_1x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit#vec3_1x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#bool_3x3x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#bool_3x3x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#bvec3_3x1_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#bvec3_3x1_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#float_3x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#float_3x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#int_2x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#int_2x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#ivec3_3x1x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#ivec3_3x1x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#mat3_3x2_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#mat3_3x2_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#mat3_3x3x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#mat3_3x3x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#mat3_3x4_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#mat3_3x4_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#struct_5x5x4_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#struct_5x5x4_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#vec3_1x3_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit#vec3_1x3_vertex
+dEQP-GLES31.functional.shaders.arrays_of_arrays.invalid#empty_declaration_without_var_name_fragment
+dEQP-GLES31.functional.shaders.arrays_of_arrays.invalid#empty_declaration_without_var_name_vertex
+dEQP-GLES31.functional.shaders.builtin_constants.core#max_atomic_counter_buffer_size
+dEQP-GLES31.functional.shaders.builtin_constants.core#max_combined_atomic_counter_buffers
+dEQP-GLES31.functional.shaders.builtin_constants.core#max_vertex_atomic_counter_buffers
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_patch_vertices
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_control_input_components
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_control_output_components
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_control_texture_image_units
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_control_total_output_components
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_control_uniform_components
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_evaluation_input_components
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_evaluation_output_components
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_evaluation_texture_image_units
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_evaluation_uniform_components
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_gen_level
+dEQP-GLES31.functional.shaders.builtin_constants.tessellation_shader#max_tess_patch_components
+dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.highp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.highp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.highp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.highp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.highp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.highp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.highp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.highp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.highp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.highp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.highp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.highp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.mediump_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.mediump_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.mediump_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.mediump_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.highp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.highp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.highp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.highp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.lowp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.lowp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.lowp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.lowp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.mediump_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.mediump_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.mediump_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.mediump_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.highp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.highp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.highp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.highp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.mediump_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.mediump_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.mediump_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.mediump_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.highp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.highp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.highp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.highp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.mediump_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.mediump_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.mediump_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.mediump_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.modf#highp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.precision.modf#lowp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.precision.modf#mediump_compute
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.highp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.highp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.highp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.highp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.lowp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.lowp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.lowp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.lowp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.mediump_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.mediump_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.mediump_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.mediump_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.mediump_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.mediump_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.mediump_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.mediump_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.highp_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.highp_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.highp_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.highp_compute#vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.mediump_compute#scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.mediump_compute#vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.mediump_compute#vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.mediump_compute#vec4
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.input_before_literal.add#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.input_before_literal.add#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.input_before_literal.div#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.input_before_literal.div#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.input_before_literal.mul#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.input_before_literal.mul#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.input_before_literal.sub#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.input_before_literal.sub#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.literal_before_input.add#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.literal_before_input.add#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.literal_before_input.div#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.literal_before_input.div#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.literal_before_input.mul#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.literal_before_input.mul#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.literal_before_input.sub#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.arithmetic.literal_before_input.sub#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec2_to_uvec2_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec2_to_uvec2_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec2_to_vec2_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec2_to_vec2_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec3_to_uvec3_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec3_to_uvec3_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec3_to_vec3_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec3_to_vec3_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec4_to_uvec4_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec4_to_uvec4_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec4_to_vec4_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#ivec4_to_vec4_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.equal#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.greater_or_equal#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.greater_or_equal#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.greater#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.greater#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.less_or_equal#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.less_or_equal#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.less#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.less#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec2_to_uvec2_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec2_to_uvec2_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec2_to_vec2_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec2_to_vec2_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec3_to_uvec3_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec3_to_uvec3_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec3_to_vec3_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec3_to_vec3_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec4_to_uvec4_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec4_to_uvec4_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec4_to_vec4_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#ivec4_to_vec4_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.input_before_literal.not_equal#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec2_to_uvec2_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec2_to_uvec2_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec2_to_vec2_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec2_to_vec2_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec3_to_uvec3_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec3_to_uvec3_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec3_to_vec3_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec3_to_vec3_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec4_to_uvec4_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec4_to_uvec4_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec4_to_vec4_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#ivec4_to_vec4_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.equal#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.greater_or_equal#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.greater_or_equal#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.greater#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.greater#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.less_or_equal#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.less_or_equal#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.less#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.less#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec2_to_uvec2_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec2_to_uvec2_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec2_to_vec2_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec2_to_vec2_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec3_to_uvec3_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec3_to_uvec3_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec3_to_vec3_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec3_to_vec3_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec4_to_uvec4_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec4_to_uvec4_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec4_to_vec4_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#ivec4_to_vec4_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.comparisons.literal_before_input.not_equal#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.invalid.variables#ivec2_to_uint_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.invalid.variables#ivec2_to_uint_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.invalid.variables#ivec3_to_uint_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.invalid.variables#ivec3_to_uint_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.invalid.variables#ivec4_to_uint_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.invalid.variables#ivec4_to_uint_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.parenthesized_expressions.literal_before_paren_expr.input_in_parens#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.parenthesized_expressions.literal_before_paren_expr.input_in_parens#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.parenthesized_expressions.literal_before_paren_expr.input_outside_parens#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.parenthesized_expressions.literal_before_paren_expr.input_outside_parens#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.parenthesized_expressions.paren_expr_before_literal.input_in_parens#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.parenthesized_expressions.paren_expr_before_literal.input_in_parens#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.implicit_conversions.parenthesized_expressions.paren_expr_before_literal.input_outside_parens#uint_to_float_fragment
+dEQP-GLES31.functional.shaders.implicit_conversions.parenthesized_expressions.paren_expr_before_literal.input_outside_parens#uint_to_float_vertex
+dEQP-GLES31.functional.shaders.linkage.geometry.varying.rules#input_array_size_mismatch
+dEQP-GLES31.functional.shaders.linkage.geometry.varying.rules#input_block_array_size_mismatch
+dEQP-GLES31.functional.shaders.linkage.geometry.varying.rules#input_no_declaration
+dEQP-GLES31.functional.shaders.linkage.geometry.varying.rules#output_no_declaration
+dEQP-GLES31.functional.shaders.linkage.geometry.varying.rules#unspecified_output_primitive_num_vertices
+dEQP-GLES31.functional.shaders.linkage.io_block#mismatch_block_array_size
+dEQP-GLES31.functional.shaders.linkage.io_block#mismatch_member_name
+dEQP-GLES31.functional.shaders.linkage.io_block#missing_output_block
+dEQP-GLES31.functional.shaders.linkage.io_block#with_and_without_instance_name
+dEQP-GLES31.functional.shaders.linkage.shader_storage_block#ambiguous_variable_name_3
+dEQP-GLES31.functional.shaders.linkage.tessellation_geometry.varying.rules#no_output_declaration
+dEQP-GLES31.functional.shaders.linkage.tessellation.varying.rules#input_no_declaration
+dEQP-GLES31.functional.shaders.linkage.tessellation.varying.rules#internal_no_declaration
+dEQP-GLES31.functional.shaders.linkage.tessellation.varying.rules#output_no_declaration
+dEQP-GLES31.functional.shaders.linkage.tessellation.varying.rules#per_patch_qualifier_mismatch_2
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative#interpolate_constant
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative#interpolate_global
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative#interpolate_local
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative#interpolate_struct_member
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative#vec4_crop_swizzle
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative#vec4_identity_swizzle
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative#vec4_mixed_swizzle
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.array_element#multisample_rbo_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.array_element#multisample_texture_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.at_sample_position#default_framebuffer
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.at_sample_position#multisample_rbo_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.at_sample_position#multisample_texture_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.centroid_qualifier#multisample_rbo_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.centroid_qualifier#multisample_texture_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative#interpolate_constant
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative#interpolate_global
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative#interpolate_local
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative#interpolate_struct_member
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative#vec4_crop_swizzle
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative#vec4_identity_swizzle
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative#vec4_mixed_swizzle
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.no_qualifiers#multisample_rbo_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.no_qualifiers#multisample_texture_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.sample_qualifier#multisample_rbo_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.sample_qualifier#multisample_texture_16
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative#interpolate_constant
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative#interpolate_global
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative#interpolate_local
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative#interpolate_struct_member
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative#vec4_crop_swizzle
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative#vec4_identity_swizzle
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative#vec4_mixed_swizzle
+dEQP-GLES31.functional.shaders.sample_variables.num_samples#default_framebuffer
+dEQP-GLES31.functional.shaders.sample_variables.num_samples#singlesample_rbo
+dEQP-GLES31.functional.shaders.sample_variables.num_samples#singlesample_texture
+dEQP-GLES31.functional.shaders.sample_variables.sample_id#multisample_rbo_16
+dEQP-GLES31.functional.shaders.sample_variables.sample_id#multisample_texture_16
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#default_framebuffer
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_rbo_1
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_rbo_16
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_rbo_2
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_rbo_4
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_rbo_8
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_texture_1
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_texture_16
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_texture_2
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_texture_4
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_sample#multisample_texture_8
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#default_framebuffer
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#multisample_rbo_1
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#multisample_rbo_2
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#multisample_rbo_4
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#multisample_rbo_8
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#multisample_texture_1
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#multisample_texture_2
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#multisample_texture_4
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples#multisample_texture_8
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_sample#multisample_texture_1
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_sample#multisample_texture_16
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_sample#multisample_texture_2
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_sample#multisample_texture_4
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_sample#multisample_texture_8
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_two_samples#multisample_texture_16
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_two_samples#multisample_texture_4
+dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_two_samples#multisample_texture_8
+dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness#default_framebuffer
+dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness#multisample_rbo_16
+dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness#multisample_texture_16
+dEQP-GLES31.functional.shaders.sample_variables.sample_pos.distribution#multisample_texture_16
+dEQP-GLES31.functional.shaders.uniform_block.invalid#double_underscore_block_name_fragment
+dEQP-GLES31.functional.shaders.uniform_block.invalid#double_underscore_block_name_vertex
+dEQP-GLES31.functional.shaders.uniform_block.invalid#double_underscore_instance_name_fragment
+dEQP-GLES31.functional.shaders.uniform_block.invalid#double_underscore_instance_name_vertex
+dEQP-GLES31.functional.shaders.uniform_block.invalid#invalid_identifier_block_name_fragment
+dEQP-GLES31.functional.shaders.uniform_block.invalid#invalid_identifier_block_name_vertex
+dEQP-GLES31.functional.shaders.uniform_block.invalid#invalid_identifier_instance_name_fragment
+dEQP-GLES31.functional.shaders.uniform_block.invalid#invalid_identifier_instance_name_vertex
+dEQP-GLES31.functional.shaders.uniform_block.invalid#repeated_block_fragment
+dEQP-GLES31.functional.shaders.uniform_block.invalid#repeated_block_vertex
+dEQP-GLES31.functional.shaders.uniform_block.invalid#too_long_block_name_fragment
+dEQP-GLES31.functional.shaders.uniform_block.invalid#too_long_block_name_vertex
+dEQP-GLES31.functional.shaders.uniform_block.invalid#global_layout_std430_fragment
+dEQP-GLES31.functional.shaders.uniform_block.invalid#global_layout_std430_vertex
+dEQP-GLES31.functional.shaders.uniform_block.invalid#structure_definition_fragment
+dEQP-GLES31.functional.shaders.uniform_block.invalid#structure_definition_vertex
+dEQP-GLES31.functional.shaders.uniform_block.valid#member_layout_all_8_times_fragment
+dEQP-GLES31.functional.shaders.uniform_block.valid#member_layout_all_8_times_vertex
+dEQP-GLES31.functional.shaders.uniform_block.valid#member_layout_all_fragment
+dEQP-GLES31.functional.shaders.uniform_block.valid#member_layout_all_vertex
+dEQP-GLES31.functional.shaders.uniform_block.valid#struct_member_layout_all_8_times_fragment
+dEQP-GLES31.functional.shaders.uniform_block.valid#struct_member_layout_all_8_times_vertex
+dEQP-GLES31.functional.shaders.uniform_block.valid#struct_member_layout_all_fragment
+dEQP-GLES31.functional.shaders.uniform_block.valid#struct_member_layout_all_vertex
+dEQP-GLES31.functional.state_query.indexed#blend_equation_advanced_getinteger64i_v
+dEQP-GLES31.functional.state_query.indexed#blend_equation_advanced_getintegeri_v
+dEQP-GLES31.functional.state_query.indexed#blend_equation_getinteger64i_v
+dEQP-GLES31.functional.state_query.indexed#blend_equation_getintegeri_v
+dEQP-GLES31.functional.state_query.integer#max_fragment_uniform_components_getfloat
+dEQP-GLES31.functional.state_query.integer#max_fragment_uniform_components_getinteger
+dEQP-GLES31.functional.state_query.integer#max_fragment_uniform_components_getinteger64
+dEQP-GLES31.functional.state_query.program_pipeline#info_log
+dEQP-GLES31.functional.state_query.texture_level.texture_2d_array#internal_format_float
+dEQP-GLES31.functional.state_query.texture_level.texture_2d_array#internal_format_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_2d#internal_format_float
+dEQP-GLES31.functional.state_query.texture_level.texture_2d#internal_format_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample_array#internal_format_float
+dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample_array#internal_format_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample#internal_format_float
+dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample#internal_format_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_3d#internal_format_float
+dEQP-GLES31.functional.state_query.texture_level.texture_3d#internal_format_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#alpha_size_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#alpha_type_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#blue_size_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#blue_type_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#compressed_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#depth_float
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#depth_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#depth_size_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#depth_type_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#green_size_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#green_type_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#height_float
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#height_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#internal_format_float
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#internal_format_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#red_size_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#red_type_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#samples_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#shared_size_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#stencil_size_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#width_float
+dEQP-GLES31.functional.state_query.texture_level.texture_buffer#width_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_cube_array#internal_format_float
+dEQP-GLES31.functional.state_query.texture_level.texture_cube_array#internal_format_integer
+dEQP-GLES31.functional.state_query.texture_level.texture_cube_map#internal_format_float
+dEQP-GLES31.functional.state_query.texture_level.texture_cube_map#internal_format_integer
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_buffer_getboolean
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_buffer_getintegeri
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_buffer_getintegeri64
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_offset_getboolean
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_offset_getintegeri
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_offset_getintegeri64
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_stride_getboolean
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_stride_getintegeri
+dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed#vertex_binding_stride_getintegeri64
+dEQP-GLES31.functional.synchronization.in_invocation#ssbo_alias_overwrite
+dEQP-GLES31.functional.tessellation.common_edge#quads_equal_spacing_precise
+dEQP-GLES31.functional.tessellation.common_edge#quads_fractional_even_spacing_precise
+dEQP-GLES31.functional.tessellation.common_edge#quads_fractional_odd_spacing_precise
+dEQP-GLES31.functional.tessellation.common_edge#triangles_equal_spacing_precise
+dEQP-GLES31.functional.tessellation.common_edge#triangles_fractional_even_spacing_precise
+dEQP-GLES31.functional.tessellation.common_edge#triangles_fractional_odd_spacing_precise
+dEQP-GLES31.functional.tessellation.misc_draw#fill_cover_quads_equal_spacing
+dEQP-GLES31.functional.tessellation.misc_draw#fill_cover_quads_fractional_even_spacing
+dEQP-GLES31.functional.tessellation.misc_draw#fill_cover_quads_fractional_odd_spacing
+dEQP-GLES31.functional.tessellation.misc_draw#fill_cover_triangles_equal_spacing
+dEQP-GLES31.functional.tessellation.misc_draw#fill_cover_triangles_fractional_even_spacing
+dEQP-GLES31.functional.tessellation.misc_draw#fill_cover_triangles_fractional_odd_spacing
+dEQP-GLES31.functional.tessellation.shader_input_output#barrier
+dEQP-GLES31.functional.tessellation.state_query#is_per_patch
+dEQP-GLES31.functional.tessellation.state_query#max_tess_control_uniform_components
+dEQP-GLES31.functional.tessellation.state_query#max_tess_evaluation_uniform_components
+dEQP-GLES31.functional.tessellation.user_defined_io.negative#per_patch_array_of_structs
+dEQP-GLES31.functional.tessellation.user_defined_io.negative#per_patch_structs_containing_arrays
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_implicit#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_implicit#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_implicit#triangles
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_query#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_query#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_query#triangles
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_shader_builtin#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_shader_builtin#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block_array.vertex_io_array_size_shader_builtin#triangles
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_implicit#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_implicit#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_implicit#triangles
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_query#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_query#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_query#triangles
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_shader_builtin#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_shader_builtin#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_patch_block.vertex_io_array_size_shader_builtin#triangles
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit#triangles
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query#triangles
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin#isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin#quads
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin#triangles
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.incomplete#mipmap_incomplete
+dEQP-GLES31.functional.texture.texture_buffer.state_query#texture_buffer_data_store_binding_float
+dEQP-GLES31.functional.texture.texture_buffer.state_query#texture_buffer_data_store_binding_integer
+dEQP-GLES31.functional.texture.texture_buffer.state_query#texture_buffer_offset_float
+dEQP-GLES31.functional.texture.texture_buffer.state_query#texture_buffer_offset_integer
+dEQP-GLES31.functional.texture.texture_buffer.state_query#texture_buffer_size_float
+dEQP-GLES31.functional.texture.texture_buffer.state_query#texture_buffer_size_integer
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8#linear_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8#linear_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8#gather_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8#gather_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8_alpha8#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8_alpha8#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8_alpha8#linear_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8_alpha8#linear_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8_alpha8#gather_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.srgb8_alpha8#gather_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.r16ui#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.r16ui#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.r32ui#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.r32ui#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.rg16ui#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.rg16ui#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.rg32ui#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.rg32ui#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.rgb16ui#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.rgb16ui#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.rgb32ui#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.rgb32ui#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.rgba16ui#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.rgba16ui#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.rgba32ui#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.rgba32ui#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.stencil_index8#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.stencil_index8#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.depth24_stencil8_sample_stencil#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.depth24_stencil8_sample_stencil#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.depth32f_stencil8_sample_stencil#nearest_size_pot
+dEQP-GLES31.functional.texture.border_clamp.formats.depth32f_stencil8_sample_stencil#nearest_size_npot
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_etc2#nearest_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_etc2#nearest_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_etc2#linear_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_etc2#linear_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_etc2#gather_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_etc2#gather_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_punchthrough_alpha1_etc2#nearest_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_punchthrough_alpha1_etc2#nearest_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_punchthrough_alpha1_etc2#linear_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_punchthrough_alpha1_etc2#linear_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_punchthrough_alpha1_etc2#gather_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_punchthrough_alpha1_etc2#gather_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_alpha8_etc2_eac#nearest_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_alpha8_etc2_eac#nearest_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_alpha8_etc2_eac#linear_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_alpha8_etc2_eac#linear_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_alpha8_etc2_eac#gather_size_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.formats.compressed_srgb8_alpha8_etc2_eac#gather_size_not_tile_multiple
+dEQP-GLES31.functional.texture.border_clamp.range_clamp#nearest_int_color
+dEQP-GLES31.functional.texture.border_clamp.range_clamp#nearest_uint_color
+dEQP-GLES31.functional.texture.border_clamp.range_clamp#nearest_uint_stencil
+dEQP-GLES31.functional.texture.border_clamp.range_clamp#nearest_float_depth_uint_stencil_sample_stencil
+dEQP-GLES31.functional.texture.border_clamp.range_clamp#nearest_unorm_depth_uint_stencil_sample_stencil
+dEQP-GLES31.functional.texture.border_clamp.sampler#uint_color
+dEQP-GLES31.functional.texture.border_clamp.sampler#uint_stencil
+dEQP-GLES31.functional.texture.border_clamp.per_axis_wrap_mode.texture_2d.uint_stencil.nearest#s_clamp_to_edge_t_clamp_to_border_pot
+dEQP-GLES31.functional.texture.border_clamp.per_axis_wrap_mode.texture_2d.uint_stencil.nearest#s_clamp_to_edge_t_clamp_to_border_npot
+dEQP-GLES31.functional.texture.border_clamp.per_axis_wrap_mode.texture_2d.uint_stencil.nearest#s_repeat_t_clamp_to_border_pot
+dEQP-GLES31.functional.texture.border_clamp.per_axis_wrap_mode.texture_2d.uint_stencil.nearest#s_repeat_t_clamp_to_border_npot
+dEQP-GLES31.functional.texture.border_clamp.per_axis_wrap_mode.texture_2d.uint_stencil.nearest#s_mirrored_repeat_t_clamp_to_border_pot
+dEQP-GLES31.functional.texture.border_clamp.per_axis_wrap_mode.texture_2d.uint_stencil.nearest#s_mirrored_repeat_t_clamp_to_border_npot
+dEQP-GLES31.functional.texture.border_clamp.unused_channels#stencil_index8
+dEQP-GLES31.functional.texture.border_clamp.unused_channels#depth32f_stencil8_sample_stencil
+dEQP-GLES31.functional.texture.border_clamp.unused_channels#depth24_stencil8_sample_stencil
+dEQP-GLES31.functional.ubo.random.all_per_block_buffers#41
+dEQP-GLES31.functional.uniform_location.negative#atomic_fragment
+dEQP-GLES31.functional.uniform_location.negative#atomic_vertex
+dEQP-GLES31.functional.vertex_attribute_binding.negative#bind_vertex_buffer_large_stride
+dEQP-GLES31.functional.vertex_attribute_binding.negative#bind_vertex_buffer_negative_offset
+dEQP-GLES31.functional.vertex_attribute_binding.negative#bind_vertex_buffer_negative_stride
diff --git a/tests/tests/display/Android.mk b/tests/tests/display/Android.mk
index a48a8e3..f17f580 100644
--- a/tests/tests/display/Android.mk
+++ b/tests/tests/display/Android.mk
@@ -29,7 +29,4 @@
 
 LOCAL_SDK_VERSION := current
 
-# This test runner sets up/cleans up the device before/after running the tests.
-LOCAL_CTS_TEST_RUNNER := com.android.cts.tradefed.testtype.DisplayTestRunner
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/display/AndroidManifest.xml b/tests/tests/display/AndroidManifest.xml
index 0b24754..bf84219 100644
--- a/tests/tests/display/AndroidManifest.xml
+++ b/tests/tests/display/AndroidManifest.xml
@@ -19,6 +19,8 @@
     package="com.android.cts.display">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <!-- For special presentation windows when testing mode switches. -->
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
 
     <application>
         <uses-library android:name="android.test.runner" />
diff --git a/tests/tests/display/AndroidTest.xml b/tests/tests/display/AndroidTest.xml
new file mode 100644
index 0000000..dd42984
--- /dev/null
+++ b/tests/tests/display/AndroidTest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Base config for CTS package preparer">
+    <include name="common-config" />
+    <!-- Use a non-standard pattern, must match values in tests/tests/display/.../DisplayTest.java -->
+    <option name="run-command:run-command" value="settings put global overlay_display_devices '181x161/214|181x161/214'" />
+    <option name="run-command:teardown-command" value="settings put global overlay_display_devices &quot;&quot;" />
+</configuration>
diff --git a/tests/tests/display/src/android/display/cts/DisplayTest.java b/tests/tests/display/src/android/display/cts/DisplayTest.java
index bea99ed..112710e 100644
--- a/tests/tests/display/src/android/display/cts/DisplayTest.java
+++ b/tests/tests/display/src/android/display/cts/DisplayTest.java
@@ -16,18 +16,29 @@
 
 package android.display.cts;
 
+import android.app.Presentation;
 import android.content.Context;
+import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManager.DisplayListener;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.DisplayMetrics;
 import android.view.Display;
+import android.view.View;
+import android.view.ViewGroup;
 import android.view.WindowManager;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 public class DisplayTest extends AndroidTestCase {
-    // This test is called from DisplayTestRunner which brings up an overlay display on the target
-    // device. The overlay display parameters must match the ones defined there which are
+    // The CTS package brings up an overlay display on the target device (see AndroidTest.xml).
+    // The overlay display parameters must match the ones defined there which are
     // 181x161/214 (wxh/dpi).  It only matters that these values are different from any real
     // display.
 
@@ -44,6 +55,9 @@
     private DisplayManager mDisplayManager;
     private WindowManager mWindowManager;
 
+    // To test display mode switches.
+    private TestPresentation mPresentation;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -177,4 +191,105 @@
 
         assertEquals(Display.FLAG_PRESENTATION, display.getFlags());
     }
+
+    /**
+     * Tests that the mode-related attributes and methods work as expected.
+     */
+    public void testMode() {
+        Display display = getSecondaryDisplay(mDisplayManager.getDisplays());
+        assertEquals(2, display.getSupportedModes().length);
+        Display.Mode mode = display.getMode();
+        assertEquals(display.getSupportedModes()[0], mode);
+        assertEquals(SECONDARY_DISPLAY_WIDTH, mode.getPhysicalWidth());
+        assertEquals(SECONDARY_DISPLAY_HEIGHT, mode.getPhysicalHeight());
+        assertEquals(display.getRefreshRate(), mode.getRefreshRate());
+    }
+
+    /**
+     * Tests that mode switch requests are correctly executed.
+     */
+    public void testModeSwitch() throws Exception {
+        final Display display = getSecondaryDisplay(mDisplayManager.getDisplays());
+        Display.Mode[] modes = display.getSupportedModes();
+        assertEquals(2, modes.length);
+        Display.Mode mode = display.getMode();
+        assertEquals(modes[0], mode);
+        final Display.Mode newMode = modes[1];
+
+        Handler handler = new Handler(Looper.getMainLooper());
+
+        // Register for display events.
+        final CountDownLatch changeSignal = new CountDownLatch(1);
+        mDisplayManager.registerDisplayListener(new DisplayListener() {
+            @Override
+            public void onDisplayAdded(int displayId) {}
+
+            @Override
+            public void onDisplayChanged(int displayId) {
+                if (displayId == display.getDisplayId()) {
+                    changeSignal.countDown();
+                }
+            }
+
+            @Override
+            public void onDisplayRemoved(int displayId) {}
+        }, handler);
+
+        // Show the presentation.
+        final CountDownLatch presentationSignal = new CountDownLatch(1);
+        handler.post(new Runnable() {
+            @Override
+            public void run() {
+                mPresentation = new TestPresentation(
+                        getContext(), display, newMode.getModeId());
+                mPresentation.show();
+                presentationSignal.countDown();
+            }
+        });
+        assertTrue(presentationSignal.await(5, TimeUnit.SECONDS));
+
+        // Wait until the display change is effective.
+        assertTrue(changeSignal.await(5, TimeUnit.SECONDS));
+
+        assertEquals(newMode, display.getMode());
+        handler.post(new Runnable() {
+            @Override
+            public void run() {
+                mPresentation.dismiss();
+            }
+        });
+    }
+
+    /**
+     * Used to force mode changes on a display.
+     * <p>
+     * Note that due to limitations of the Presentation class, the modes must have the same size
+     * otherwise the presentation will be automatically dismissed.
+     */
+    private static final class TestPresentation extends Presentation {
+
+        private final int mModeId;
+
+        public TestPresentation(Context context, Display display, int modeId) {
+            super(context, display);
+            mModeId = modeId;
+        }
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            View content = new View(getContext());
+            content.setLayoutParams(new ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+            content.setBackgroundColor(Color.RED);
+            setContentView(content);
+
+            WindowManager.LayoutParams params = getWindow().getAttributes();
+            params.preferredDisplayModeId = mModeId;
+            params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
+            params.setTitle("CtsTestPresentation");
+            getWindow().setAttributes(params);
+        }
+    }
 }
diff --git a/tests/tests/dreams/Android.mk b/tests/tests/dreams/Android.mk
index eca3d83..87bd357 100644
--- a/tests/tests/dreams/Android.mk
+++ b/tests/tests/dreams/Android.mk
@@ -26,6 +26,8 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
 
+LOCAL_JAVA_LIBRARIES :=  android.test.runner
+
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 # Need access to ServiceManager - see b/13307221
diff --git a/tests/tests/dreams/src/android/service/dreams/cts/DreamServiceTest.java b/tests/tests/dreams/src/android/service/dreams/cts/DreamServiceTest.java
new file mode 100644
index 0000000..fcf6558
--- /dev/null
+++ b/tests/tests/dreams/src/android/service/dreams/cts/DreamServiceTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.dreams.cts;
+
+import android.service.dreams.DreamService;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
+import android.view.ActionMode;
+
+public class DreamServiceTest extends InstrumentationTestCase {
+    @UiThreadTest
+    public void testOnWindowStartingActionMode() {
+        DreamService dreamService = new DreamService();
+
+        ActionMode actionMode = dreamService.onWindowStartingActionMode(null);
+
+        assertNull(actionMode);
+    }
+
+    @UiThreadTest
+    public void testOnWindowStartingActionModeTyped() {
+        DreamService dreamService = new DreamService();
+
+        ActionMode actionMode = dreamService.onWindowStartingActionMode(
+                null, ActionMode.TYPE_FLOATING);
+
+        assertNull(actionMode);
+    }
+}
diff --git a/tests/tests/graphics/AndroidManifest.xml b/tests/tests/graphics/AndroidManifest.xml
index 0006634..4249bb3 100644
--- a/tests/tests/graphics/AndroidManifest.xml
+++ b/tests/tests/graphics/AndroidManifest.xml
@@ -50,6 +50,7 @@
 
         <activity android:name="android.opengl.cts.OpenGlEsVersionCtsActivity"/>
 
+        <activity android:name="android.graphics.drawable.cts.DrawableStubActivity"/>
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/graphics/res/anim/animation_grouping_1_01.xml b/tests/tests/graphics/res/anim/animation_grouping_1_01.xml
index 8cc9f92..c1f2904 100644
--- a/tests/tests/graphics/res/anim/animation_grouping_1_01.xml
+++ b/tests/tests/graphics/res/anim/animation_grouping_1_01.xml
@@ -18,9 +18,9 @@
 <set xmlns:android="http://schemas.android.com/apk/res/android" >
 
     <objectAnimator
-        android:duration="3300"
+        android:duration="50"
         android:propertyName="rotation"
         android:valueFrom="0"
         android:valueTo="180"
-        android:repeatCount="-1" />
+        android:repeatCount="2" />
 </set>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png
index 91776a9..67f5746 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png
index 9af40a3..c60dfba 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
index b3acfe7..e7cc4d1 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
index bbc84b9..c7c049b 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
index 8d73cfd..5880467 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png
index 6094a9a..93fb1d0 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_1_golden.png
new file mode 100644
index 0000000..899a235
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_2_golden.png
new file mode 100644
index 0000000..ba6d8c7
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png
index aee8ff5..4141d6f 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png
index baf418d..1703878 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png
index e0e14f3..5308c7b 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png
index b6798c2..e507b53 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png
Binary files differ
diff --git a/apps/CtsVerifier/lib/colorchecker/vec3.cpp b/tests/tests/graphics/res/drawable/inset_mutate.xml
similarity index 70%
copy from apps/CtsVerifier/lib/colorchecker/vec3.cpp
copy to tests/tests/graphics/res/drawable/inset_mutate.xml
index ac16620..ba613e9 100644
--- a/apps/CtsVerifier/lib/colorchecker/vec3.cpp
+++ b/tests/tests/graphics/res/drawable/inset_mutate.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -12,11 +13,7 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- */
-#define LOG_NDEBUG 0
+ -->
 
-#define LOG_TAG "Vec3"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-
-#include "vec3.h"
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+       android:drawable="@drawable/inset_mutate_testimage" />
diff --git a/tests/tests/graphics/res/drawable/inset_mutate_testimage.jpg b/tests/tests/graphics/res/drawable/inset_mutate_testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/inset_mutate_testimage.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml b/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml
index c2ab429..53a9660 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="12.25"
-        android:viewportWidth="7.30625" >
+    android:height="64dp"
+    android:viewportHeight="12.25"
+    android:viewportWidth="7.30625"
+    android:width="64dp" >
 
     <group
         android:pivotX="3.65"
@@ -31,14 +31,18 @@
                 l 0, 12.25
                 l -7.3, 0
                 z" />
-    </group>
-    <group>
-        <path
-            android:name="one"
-            android:fillColor="#ff88ff"
-            android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875 -2.109375,0.421875 0.0-1.078125
+
+        <group
+            android:pivotX="3.65"
+            android:pivotY="6.125"
+            android:rotation="30" >
+            <path
+                android:name="one"
+                android:fillColor="#ff88ff"
+                android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875 -2.109375,0.421875 0.0-1.078125
                 l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
                 l -5.046875,0.0 0.0-1.0Z" />
+        </group>
     </group>
     <group
         android:pivotX="3.65"
@@ -52,12 +56,15 @@
                 l 0, 6.125
                 l -7.3, 0
                 z" />
-    </group>
-    <group>
-        <path
-            android:name="two"
-            android:fillColor="#ff88ff"
-            android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0 -5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+
+        <group
+            android:pivotX="3.65"
+            android:pivotY="6.125"
+            android:rotation="30" >
+            <path
+                android:name="two"
+                android:fillColor="#ff88ff"
+                android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0 -5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
                         q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
                         q 0.234375-0.453125 0.234375-0.875 0.0-0.703125 -0.5-1.140625
                         q -0.484375-0.4375 -1.2656252-0.4375 -0.5625,0.0 -1.1875,0.1875
@@ -66,6 +73,7 @@
                         q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125 -0.203125,1.015625
                         q -0.203125,0.484375 -0.734375,1.140625 -0.15625,0.171875 -0.9375,0.984375
                         q -0.78125024,0.8125 -2.2187502,2.265625Z" />
+        </group>
     </group>
 
 </vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_delete.xml b/tests/tests/graphics/res/drawable/vector_icon_delete.xml
index 8d9c21c..7b8f2aa 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_delete.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_delete.xml
@@ -24,6 +24,6 @@
 
     <path
         android:fillColor="#FF000000"
-        android:pathData="M6.0,19.0c0.0,1.104 0.896,2.0 2.0,2.0l8.0,0.0c1.104,0.0 2.0-0.896 2.0-2.0l0.0-12.0L6.0,7.0L6.0,19.0zM18.0,4.0l-2.5,0.0l-1.0-1.0l-5.0,0.0l-1.0,1.0L6.0,4.0C5.4469986,4.0 5.0,4.4469986 5.0,5.0l0.0,1.0l14.0,0.0l0.0-1.0C19.0,4.4469986 18.552002,4.0 18.0,4.0z" />
+        android:pathData="M6.0,19.0c0.0,1.104 896e-3,2.0 2.0,2.0l8.0,0.0c1.104,0.0 2.0-896e-3 2.0-2.0l0.0-12.0L6.0,7.0L6.0,19.0zM18.0,4.0l-2.5,0.0l-1.0-1.0l-5.0,0.0l-1.0,1.0L6.0,4.0C5.4469986,4.0 5.0,4.4469986 5.0,5.0l0.0,1.0l14.0,0.0l0.0-1.0C19.0,4.4469986 18.552002,4.0 18.0,4.0z" />
 
 </vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_heart.xml b/tests/tests/graphics/res/drawable/vector_icon_heart.xml
index ff55fe5..ad991c9 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_heart.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_heart.xml
@@ -24,6 +24,6 @@
 
     <path
         android:fillColor="#FF000000"
-        android:pathData="M16.0,5.0c-1.955,0.0 -3.83,1.268 -4.5,3.0c-0.67-1.732 -2.547-3.0 -4.5-3.0C4.4570007,5.0 2.5,6.931999 2.5,9.5c0.0,3.529 3.793,6.258 9.0,11.5c5.207-5.242 9.0-7.971 9.0-11.5C20.5,6.931999 18.543,5.0 16.0,5.0z" />
+        android:pathData="M16.0,5.0c-1.955.0 -3.83,1.268 -4.5,3.0c-0.67-1.732 -2.547-3.0 -4.5-3.0C4.4570007,5.0 2.5,6.931999 2.5,9.5c0.0,3.529 3.793,6.258 9.0,11.5c5.207-5.242 9.0-7.971 9.0-11.5C20.5,6.931999 18.543,5.0 16.0,5.0z" />
 
 </vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_scale_1.xml b/tests/tests/graphics/res/drawable/vector_icon_scale_1.xml
new file mode 100644
index 0000000..530c73b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_scale_1.xml
@@ -0,0 +1,52 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:scaleX="-1"
+        android:scaleY="-1" >
+        <group
+            android:scaleX="-1"
+            android:scaleY="-1" >
+            <group
+                android:pivotX="100"
+                android:pivotY="100"
+                android:rotation="45" >
+                <path
+                    android:name="twoLines"
+                    android:fillColor="#FFFF0000"
+                    android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+                    android:strokeColor="#FF00FF00"
+                    android:strokeWidth="10" />
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_scale_2.xml b/tests/tests/graphics/res/drawable/vector_icon_scale_2.xml
new file mode 100644
index 0000000..200eb61
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_scale_2.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:scaleX="2"
+        android:scaleY="0.5" >
+        <group
+            android:pivotX="100"
+            android:pivotY="100"
+            android:rotation="45" >
+            <path
+                android:name="twoLines"
+                android:fillColor="#FFFF0000"
+                android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="10" />
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/values/styles.xml b/tests/tests/graphics/res/values/styles.xml
index 20c80f8..31ed175 100644
--- a/tests/tests/graphics/res/values/styles.xml
+++ b/tests/tests/graphics/res/values/styles.xml
@@ -163,6 +163,7 @@
         <item name="themeNinePatch">@drawable/ninepatch_0</item>
         <item name="themeGravity">48</item>
         <item name="themeTileMode">2</item>
+        <item name="themeType">0</item>
     </style>
 
     <style name="Theme_NoSwipeDismiss">
diff --git a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
index fdef54c..2657d15 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
@@ -70,7 +70,10 @@
         paint.setColor(Color.RED);
         bitmap.eraseColor(Color.TRANSPARENT);
         canvas.drawPoint(0, 0, paint);
-        assertColor(Color.argb(128, 255, 0, 64), bitmap.getPixel(0, 0));
+        // the bitmap stores the result in premul colors and we read out an
+        // unpremultiplied result, which causes us to need a bigger tolerance in
+        // this case (due to the fact that scaling by 1/255 is not exact).
+        assertColor(Color.argb(128, 255, 0, 64), bitmap.getPixel(0, 0), 2);
         paint.setColor(Color.CYAN);
         canvas.drawPoint(0, 0, paint);
         // blue gets clipped
@@ -89,9 +92,13 @@
     }
 
     private void assertColor(int expected, int actual) {
-        assertEquals(Color.red(expected), Color.red(actual), TOLERANCE);
-        assertEquals(Color.green(expected), Color.green(actual), TOLERANCE);
-        assertEquals(Color.blue(expected), Color.blue(actual), TOLERANCE);
-        assertEquals(Color.alpha(expected), Color.alpha(actual), TOLERANCE);
+        assertColor(expected, actual, TOLERANCE);
+    }
+    
+    private void assertColor(int expected, int actual, int tolerance) {
+        assertEquals(Color.red(expected), Color.red(actual), tolerance);
+        assertEquals(Color.green(expected), Color.green(actual), tolerance);
+        assertEquals(Color.blue(expected), Color.blue(actual), tolerance);
+        assertEquals(Color.alpha(expected), Color.alpha(actual), tolerance);
     }
 }
diff --git a/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
index 125a6b0..553d05d 100644
--- a/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
@@ -93,7 +93,6 @@
         // rounded corner must have less pixels than a sharp corner
         assertTrue(cornerPixels < 2 * RADIUS);
         // ... but not as few as a diagonal
-        // ToBeFixed: The following should be assertTrue (see bug 2037365)
-        assertFalse(cornerPixels > RADIUS);
+        assertTrue(cornerPixels > Math.sqrt(2 * Math.pow(RADIUS, 2)));
     }
 }
diff --git a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
index 1f709d3..a4a7bfd 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
@@ -19,6 +19,7 @@
 
 import android.graphics.ColorFilter;
 import android.graphics.MaskFilter;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Paint.Align;
 import android.graphics.Paint.Cap;
@@ -28,6 +29,8 @@
 import android.graphics.PathEffect;
 import android.graphics.Rasterizer;
 import android.graphics.Shader;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
 import android.graphics.Typeface;
 import android.graphics.Xfermode;
 import android.os.Build;
@@ -190,7 +193,7 @@
         assertEquals(m, p2.getMaskFilter());
         assertEquals(e, p2.getPathEffect());
         assertEquals(r, p2.getRasterizer());
-        assertNotSame(s, p2.getShader());
+        assertEquals(s, p2.getShader());
         assertEquals(t, p2.getTypeface());
         assertEquals(x, p2.getXfermode());
 
@@ -199,7 +202,7 @@
         assertEquals(m, p2.getMaskFilter());
         assertEquals(e, p2.getPathEffect());
         assertEquals(r, p2.getRasterizer());
-        assertNotSame(s, p2.getShader());
+        assertEquals(s, p2.getShader());
         assertEquals(t, p2.getTypeface());
         assertEquals(x, p2.getXfermode());
 
@@ -271,6 +274,35 @@
         assertNull(p.getShader());
     }
 
+    public void testShaderLocalMatrix() {
+        int width = 80;
+        int height = 120;
+        int[] color = new int[width * height];
+        Bitmap bitmap = Bitmap.createBitmap(color, width, height, Bitmap.Config.RGB_565);
+
+        Paint p = new Paint();
+        Matrix m = new Matrix();
+        Shader s = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
+
+        // set the shaders matrix to a non identity value and attach to paint
+        m.setScale(10, 0);
+        s.setLocalMatrix(m);
+        p.setShader(s);
+
+        Matrix m2 = new Matrix();
+        assertTrue(p.getShader().getLocalMatrix(m2));
+        assertEquals(m, m2);
+
+        // updated the matrix again and set it on the shader but NOT the paint
+        m.setScale(0, 10);
+        s.setLocalMatrix(m);
+
+        // assert that the matrix on the paint's shader also changed
+        Matrix m3 = new Matrix();
+        assertTrue(p.getShader().getLocalMatrix(m3));
+        assertEquals(m, m3);
+    }
+
     public void testSetAntiAlias() {
         Paint p = new Paint();
 
@@ -1001,4 +1033,35 @@
         }
     }
 
+    public void testHasGlyph() {
+        Paint p = new Paint();
+
+        // This method tests both the logic of hasGlyph and the sanity of fonts present
+        // on the device.
+        assertTrue(p.hasGlyph("A"));
+        assertFalse(p.hasGlyph("\uFFFE"));  // U+FFFE is guaranteed to be a noncharacter
+
+        // Roboto 2 (the default typeface) does have an "fi" glyph and is mandated by CDD
+        assertTrue(p.hasGlyph("fi"));
+        assertFalse(p.hasGlyph("ab"));  // but it does not contain an "ab" glyph
+        assertTrue(p.hasGlyph("\u02E5\u02E9"));  // IPA tone mark ligature
+
+        // variation selectors
+        assertFalse(p.hasGlyph("a\uFE0F"));
+        assertFalse(p.hasGlyph("a\uDB40\uDDEF"));  // UTF-16 encoding of U+E01EF
+        assertFalse(p.hasGlyph("\u2229\uFE0F"));  // base character is in mathematical symbol font
+        // Note: U+FE0F is variation selection, unofficially reserved for emoji
+
+        // regional indicator symbols
+        assertTrue(p.hasGlyph("\uD83C\uDDEF\uD83C\uDDF5"));   // "JP" U+1F1EF U+1F1F5
+        assertFalse(p.hasGlyph("\uD83C\uDDFF\uD83C\uDDFF"));  // "ZZ" U+1F1FF U+1F1FF
+
+        // Mongolian, which is an optional font, but if present, should support FVS
+        if (p.hasGlyph("\u182D")) {
+            assertTrue(p.hasGlyph("\u182D\u180B"));
+        }
+
+        // TODO: when we support variation selectors, add positive tests
+    }
+
 }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java
index b4c64e2..b572dcf 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java
@@ -16,12 +16,14 @@
 
 package android.graphics.drawable.cts;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.Drawable.ConstantState;
-import android.test.AndroidTestCase;
+import android.test.ActivityInstrumentationTestCase2;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
@@ -35,12 +37,13 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 
-public class AnimatedVectorDrawableTest extends AndroidTestCase {
+public class AnimatedVectorDrawableTest extends ActivityInstrumentationTestCase2<DrawableStubActivity> {
     private static final String LOGTAG = AnimatedVectorDrawableTest.class.getSimpleName();
 
     private static final int IMAGE_WIDTH = 64;
     private static final int IMAGE_HEIGHT = 64;
 
+    private DrawableStubActivity mActivity;
     private Resources mResources;
     private AnimatedVectorDrawable mAnimatedVectorDrawable;
     private Bitmap mBitmap;
@@ -48,6 +51,10 @@
     private static final boolean DBG_DUMP_PNG = false;
     private int mResId = R.drawable.animation_vector_drawable_grouping_1;
 
+    public AnimatedVectorDrawableTest() {
+        super(DrawableStubActivity.class);
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -56,7 +63,8 @@
         mCanvas = new Canvas(mBitmap);
         mAnimatedVectorDrawable = new AnimatedVectorDrawable();
 
-        mResources = mContext.getResources();
+        mActivity = getActivity();
+        mResources = mActivity.getResources();
     }
 
     // This is only for debugging or golden image (re)generation purpose.
@@ -156,11 +164,9 @@
     }
 
     public void testMutate() {
-        Resources resources = mContext.getResources();
-
-        AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
-        AnimatedVectorDrawable d2 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
-        AnimatedVectorDrawable d3 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
+        AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+        AnimatedVectorDrawable d2 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+        AnimatedVectorDrawable d3 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
         int originalAlpha = d2.getAlpha();
         int newAlpha = (originalAlpha + 1) % 255;
 
@@ -183,4 +189,64 @@
         assertEquals(0x20, d2.getAlpha());
         assertEquals(originalAlpha, d3.getAlpha());
     }
+
+    public void testAddRemoveListener() {
+        AnimatorListenerAdapter listener1 = new AnimatorListenerAdapter() {};
+        AnimatorListenerAdapter listener2 = new AnimatorListenerAdapter() {};
+        AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+
+        d1.addListener(listener1);
+        d1.addListener(listener2);
+
+        assertTrue(d1.getListeners().contains(listener1));
+        assertTrue(d1.getListeners().contains(listener2));
+
+        d1.removeListener(listener1);
+        assertFalse(d1.getListeners().contains(listener1));
+
+        d1.removeListener(listener2);
+        assertTrue(d1.getListeners() == null);
+    }
+
+    public void testListener() throws InterruptedException {
+        MyListener listener = new MyListener();
+        final AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+
+        d1.addListener(listener);
+        // The AVD has a duration as 100ms.
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                d1.start();
+            }
+        });
+
+        Thread.sleep(200);
+
+        assertTrue(listener.mStart);
+        assertTrue(listener.mEnd);
+        assertFalse(listener.mCancel);
+    }
+
+    class MyListener implements Animator.AnimatorListener{
+        boolean mStart = false;
+        boolean mEnd = false;
+        boolean mCancel = false;
+        int mRepeat = 0;
+
+        public void onAnimationCancel(Animator animation) {
+            mCancel = true;
+        }
+
+        public void onAnimationEnd(Animator animation) {
+            mEnd = true;
+        }
+
+        public void onAnimationRepeat(Animator animation) {
+            mRepeat++;
+        }
+
+        public void onAnimationStart(Animator animation) {
+            mStart = true;
+        }
+    }
 }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
index 7e3294d..e727350 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
@@ -22,6 +22,7 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
@@ -67,19 +68,21 @@
     }
 
     public void testGetChangingConfigurations() {
+        final int SUPER_CONFIG = 1;
+        final int CONTAINED_DRAWABLE_CONFIG = 2;
+
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
                 Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
+
         assertEquals(0, clipDrawable.getChangingConfigurations());
 
-        clipDrawable.setChangingConfigurations(1);
-        assertEquals(1, clipDrawable.getChangingConfigurations());
+        mockDrawable.setChangingConfigurations(CONTAINED_DRAWABLE_CONFIG);
+        assertEquals(CONTAINED_DRAWABLE_CONFIG, clipDrawable.getChangingConfigurations());
 
-        mockDrawable.setChangingConfigurations(2);
-        clipDrawable = new ClipDrawable(mockDrawable,
-                Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
-        clipDrawable.setChangingConfigurations(1);
-        assertEquals(3, clipDrawable.getChangingConfigurations());
+        clipDrawable.setChangingConfigurations(SUPER_CONFIG);
+        assertEquals(SUPER_CONFIG | CONTAINED_DRAWABLE_CONFIG,
+                clipDrawable.getChangingConfigurations());
     }
 
     public void testGetConstantState() {
@@ -125,16 +128,28 @@
 
     @SuppressWarnings("deprecation")
     public void testGetOpacity() {
-        BitmapDrawable bmpDrawable =
-            new BitmapDrawable(Bitmap.createBitmap(100, 50, Config.RGB_565));
-        ClipDrawable clipDrawable = new ClipDrawable(bmpDrawable,
-                Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
-        assertEquals(PixelFormat.OPAQUE, clipDrawable.getOpacity());
+        MockDrawable dr;
+        ClipDrawable clipDrawable;
 
-        bmpDrawable = new BitmapDrawable(Bitmap.createBitmap(100, 50, Config.RGB_565));
-        bmpDrawable.setGravity(Gravity.CENTER);
-        clipDrawable = new ClipDrawable(bmpDrawable, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
-        assertEquals(PixelFormat.TRANSLUCENT, clipDrawable.getOpacity());
+        dr = new MockDrawable();
+        dr.setOpacity(PixelFormat.OPAQUE);
+        clipDrawable = new ClipDrawable(dr, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
+        clipDrawable.setLevel(0);
+        assertEquals("Fully-clipped opaque drawable is transparent",
+                PixelFormat.TRANSPARENT, clipDrawable.getOpacity());
+        clipDrawable.setLevel(5000);
+        assertEquals("Partially-clipped opaque drawable is translucent",
+                PixelFormat.TRANSLUCENT, clipDrawable.getOpacity());
+        clipDrawable.setLevel(10000);
+        assertEquals("Unclipped opaque drawable is opaque",
+                PixelFormat.OPAQUE, clipDrawable.getOpacity());
+
+        dr = new MockDrawable();
+        dr.setOpacity(PixelFormat.TRANSLUCENT);
+        clipDrawable = new ClipDrawable(dr, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
+        clipDrawable.setLevel(10000);
+        assertEquals("Unclipped translucent drawable is translucent",
+                PixelFormat.TRANSLUCENT, clipDrawable.getOpacity());
     }
 
     public void testGetPadding() {
@@ -219,7 +234,7 @@
         MockCallback callback = new MockCallback();
         mockClipDrawable.setCallback(callback);
 
-        assertEquals(0, mockDrawable.getLevel());
+        assertEquals("Default level is 0", 0, mockDrawable.getLevel());
         mockClipDrawable.onLevelChange(1000);
         assertEquals(1000, mockDrawable.getLevel());
         assertSame(mockClipDrawable, callback.getInvalidateDrawable());
@@ -232,16 +247,24 @@
     }
 
     public void testOnStateChange() {
-        MockDrawable mockDrawable = new MockDrawable();
-        MockClipDrawable mockClipDrawable = new MockClipDrawable(mockDrawable,
+        Drawable d = mContext.getDrawable(R.drawable.pass);
+        MockClipDrawable clipDrawable = new MockClipDrawable(d,
                 Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
-        assertEquals(StateSet.WILD_CARD, mockDrawable.getState());
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
 
-        int[] states = new int[] {1, 2, 3};
-        assertFalse(mockClipDrawable.onStateChange(states));
-        assertEquals(states, mockDrawable.getState());
+        int[] state = new int[] {1, 2, 3};
+        assertFalse("child did not change", clipDrawable.onStateChange(state));
+        assertEquals("child state did not change", d.getState(), StateSet.WILD_CARD);
 
-        mockClipDrawable.onStateChange(null);
+        d = mContext.getDrawable(R.drawable.statelistdrawable);
+        clipDrawable = new MockClipDrawable(d, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
+        clipDrawable.onStateChange(state);
+        assertTrue("child state changed", Arrays.equals(state, d.getState()));
+
+        // input null as param
+        clipDrawable.onStateChange(null);
+        // expected, no Exception thrown out, test success
     }
 
     public void testScheduleDrawable() {
@@ -335,6 +358,7 @@
     private class MockDrawable extends Drawable {
         private ColorFilter mColorFilter;
         private ConstantState mConstantState;
+        private int mOpacity;
         private boolean mCalledDraw = false;
         private int mAlpha;
 
@@ -363,7 +387,11 @@
         }
 
         public int getOpacity() {
-            return 0;
+            return mOpacity;
+        }
+
+        public void setOpacity(int opacity) {
+            mOpacity = opacity;
         }
 
         protected void onBoundsChange(Rect bounds) {
diff --git a/apps/CtsVerifier/lib/colorchecker/vec3.cpp b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableStubActivity.java
similarity index 75%
rename from apps/CtsVerifier/lib/colorchecker/vec3.cpp
rename to tests/tests/graphics/src/android/graphics/drawable/cts/DrawableStubActivity.java
index ac16620..a7b27b3 100644
--- a/apps/CtsVerifier/lib/colorchecker/vec3.cpp
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableStubActivity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,10 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#define LOG_NDEBUG 0
+package android.graphics.drawable.cts;
 
-#define LOG_TAG "Vec3"
-#include <utils/Log.h>
-#include <utils/Timers.h>
+import android.app.Activity;
 
-#include "vec3.h"
+public class DrawableStubActivity extends Activity {
+}
+
+
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
index e7a38c5..eeda22c 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
@@ -22,10 +22,8 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.content.res.Resources;
-import android.content.res.Resources.Theme;
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
-import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.drawable.GradientDrawable;
 import android.graphics.drawable.Drawable.ConstantState;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
index 1edd36e..9c5f063 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
@@ -18,7 +18,6 @@
 
 import com.android.cts.graphics.R;
 
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -32,13 +31,16 @@
 import android.graphics.drawable.Drawable.ConstantState;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
+import android.util.StateSet;
 import android.util.Xml;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 public class InsetDrawableTest extends AndroidTestCase {
+
     public void testConstructor() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         new InsetDrawable(d, 1);
         new InsetDrawable(d, 1, 1, 1, 1);
 
@@ -47,8 +49,7 @@
     }
 
     public void testInflate() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
-        InsetDrawable insetDrawable = new InsetDrawable(d, 0);
+        InsetDrawable insetDrawable = new InsetDrawable(null, 0);
 
         Resources r = mContext.getResources();
         XmlPullParser parser = r.getXml(R.layout.framelayout_layout);
@@ -77,14 +78,14 @@
     }
 
     public void testInvalidateDrawable() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         insetDrawable.invalidateDrawable(d);
     }
 
     public void testScheduleDrawable() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         Runnable runnable = new Runnable() {
@@ -99,7 +100,7 @@
     }
 
     public void testUnscheduleDrawable() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         Runnable runnable = new Runnable() {
@@ -114,7 +115,7 @@
     }
 
     public void testDraw() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         Canvas c = new Canvas();
@@ -130,7 +131,7 @@
     }
 
     public void testGetChangingConfigurations() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         insetDrawable.setChangingConfigurations(11);
@@ -141,7 +142,7 @@
     }
 
     public void testGetPadding() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 1, 2, 3, 4);
 
         Rect r = new Rect();
@@ -183,7 +184,7 @@
     }
 
     public void testSetVisible() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         assertFalse(insetDrawable.setVisible(true, true)); /* unchanged */
@@ -192,7 +193,7 @@
     }
 
     public void testSetAlpha() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         insetDrawable.setAlpha(1);
@@ -204,7 +205,7 @@
     }
 
     public void testSetColorFilter() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         ColorFilter cf = new ColorFilter();
@@ -216,7 +217,7 @@
     }
 
     public void testGetOpacity() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.testimage);
+        Drawable d = mContext.getDrawable(R.drawable.testimage);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
         insetDrawable.setAlpha(255);
         assertEquals(PixelFormat.OPAQUE, insetDrawable.getOpacity());
@@ -226,28 +227,25 @@
     }
 
     public void testIsStateful() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
         assertFalse(insetDrawable.isStateful());
     }
 
     public void testOnStateChange() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         MockInsetDrawable insetDrawable = new MockInsetDrawable(d, 10);
-
-        Rect bounds = d.getBounds();
-        assertEquals(0, bounds.left);
-        assertEquals(0, bounds.top);
-        assertEquals(0, bounds.right);
-        assertEquals(0, bounds.bottom);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
 
         int[] state = new int[] {1, 2, 3};
-        assertFalse(insetDrawable.onStateChange(state));
+        assertFalse("child did not change", insetDrawable.onStateChange(state));
+        assertEquals("child state did not change", d.getState(), StateSet.WILD_CARD);
 
-        assertEquals(10, bounds.left);
-        assertEquals(10, bounds.top);
-        assertEquals(-10, bounds.right);
-        assertEquals(-10, bounds.bottom);
+        d = mContext.getDrawable(R.drawable.statelistdrawable);
+        insetDrawable = new MockInsetDrawable(d, 10);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
+        insetDrawable.onStateChange(state);
+        assertTrue("child state changed", Arrays.equals(state, d.getState()));
 
         // input null as param
         insetDrawable.onStateChange(null);
@@ -255,7 +253,7 @@
     }
 
     public void testOnBoundsChange() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         MockInsetDrawable insetDrawable = new MockInsetDrawable(d, 5);
 
         Rect bounds = d.getBounds();
@@ -282,13 +280,13 @@
     }
 
     public void testGetIntrinsicWidth() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         int expected = d.getIntrinsicWidth(); /* 31 */
         assertEquals(expected, insetDrawable.getIntrinsicWidth());
 
-        d = mContext.getResources().getDrawable(R.drawable.scenery);
+        d = mContext.getDrawable(R.drawable.scenery);
         insetDrawable = new InsetDrawable(d, 0);
 
         expected = d.getIntrinsicWidth(); /* 170 */
@@ -296,13 +294,13 @@
     }
 
     public void testGetIntrinsicHeight() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         int expected = d.getIntrinsicHeight(); /* 31 */
         assertEquals(expected, insetDrawable.getIntrinsicHeight());
 
-        d = mContext.getResources().getDrawable(R.drawable.scenery);
+        d = mContext.getDrawable(R.drawable.scenery);
         insetDrawable = new InsetDrawable(d, 0);
 
         expected = d.getIntrinsicHeight(); /* 107 */
@@ -310,13 +308,31 @@
     }
 
     public void testGetConstantState() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         ConstantState constantState = insetDrawable.getConstantState();
         assertNotNull(constantState);
     }
 
+    public void testMutate() {
+        // Obtain the first instance, then mutate and modify a property held by
+        // constant state. If mutate() works correctly, the property should not
+        // be modified on the second or third instances.
+        Resources res = mContext.getResources();
+        InsetDrawable first = (InsetDrawable) res.getDrawable(R.drawable.inset_mutate, null);
+        InsetDrawable pre = (InsetDrawable) res.getDrawable(R.drawable.inset_mutate, null);
+
+        first.mutate().setAlpha(128);
+
+        assertEquals("Modified first loaded instance", 128, first.getDrawable().getAlpha());
+        assertEquals("Did not modify pre-mutate() instance", 255, pre.getDrawable().getAlpha());
+
+        InsetDrawable post = (InsetDrawable) res.getDrawable(R.drawable.inset_mutate, null);
+
+        assertEquals("Did not modify post-mutate() instance", 255, post.getDrawable().getAlpha());
+    }
+
     private class MockInsetDrawable extends InsetDrawable {
         public MockInsetDrawable(Drawable drawable, int inset) {
             super(drawable, inset);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
index 5aa3083..e930671 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
@@ -22,8 +22,6 @@
 
 import java.io.IOException;
 
-import android.R.attr;
-import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -45,6 +43,7 @@
 import android.view.View;
 
 public class LayerDrawableTest extends AndroidTestCase {
+
     @SuppressWarnings("deprecation")
     public void testConstructor() {
         Drawable bitmapDrawable = new BitmapDrawable();
@@ -60,9 +59,9 @@
         assertEquals(0, layerDrawable.getNumberOfLayers());
 
         try {
-            new LayerDrawable((Drawable[]) null);
-            fail("Should throw NullPointerException");
-        } catch (NullPointerException e) {
+            new LayerDrawable(null);
+            fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
         }
     }
 
@@ -77,7 +76,7 @@
 
         assertEquals(4, layerDrawable.getNumberOfLayers());
         assertEquals(ColorDrawable.class, layerDrawable.getDrawable(0).getClass());
-        assertEquals(0x88, (((ColorDrawable) layerDrawable.getDrawable(0)).getAlpha()));
+        assertEquals(0x88, layerDrawable.getDrawable(0).getAlpha());
         assertEquals(View.NO_ID, layerDrawable.getId(0));
         assertEquals(BitmapDrawable.class, layerDrawable.getDrawable(1).getClass());
         assertEquals(View.NO_ID, layerDrawable.getId(1));
@@ -236,6 +235,27 @@
     }
 
     @SuppressWarnings("deprecation")
+    public void testSetDrawableByLayerId() {
+        Drawable layer1A  = new ColorDrawable(Color.RED);
+        Drawable layer2A  = new ColorDrawable(Color.BLUE);
+        LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] { layer1A, layer2A });
+        layerDrawable.setId(0, 10);
+        layerDrawable.setId(1, 20);
+
+        Drawable layer1B = new ColorDrawable(Color.GREEN);
+        layer1B.setLevel(10000);
+        Drawable layer2B = new ColorDrawable(Color.YELLOW);
+        layer2B.setLevel(5000);
+        layerDrawable.setDrawableByLayerId(10, layer1B);
+        layerDrawable.setDrawableByLayerId(20, layer2B);
+
+        assertEquals("Level is unchanged after setDrawableByLayerId()",
+                10000, layerDrawable.findDrawableByLayerId(10).getLevel());
+        assertEquals("Level is unchanged after setDrawableByLayerId()",
+                5000, layerDrawable.findDrawableByLayerId(20).getLevel());
+    }
+
+    @SuppressWarnings("deprecation")
     public void testSetLayerInset() {
         Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
         LayerDrawable layerDrawable = new LayerDrawable(array);
@@ -556,70 +576,85 @@
         assertTrue(layerDrawable.isStateful());
     }
 
-    public void testOnStateChange() {
+    public void testSetState() {
         MockDrawable mockDrawable1 = new MockDrawable(true);
         MockDrawable mockDrawable2 = new MockDrawable(true);
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
 
-        // this method will call each child's setState().
-        assertFalse(layerDrawable.onStateChange(StateSet.WILD_CARD));
-        assertTrue(mockDrawable1.hasCalledSetState());
-        assertTrue(mockDrawable2.hasCalledSetState());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        // Call onStateChange() without actually changing the state.
+        assertFalse(layerDrawable.setState(StateSet.WILD_CARD));
+        assertFalse(mockDrawable1.hasCalledSetState());
+        assertFalse(mockDrawable2.hasCalledSetState());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable2.hasCalledOnBoundsChange());
 
+        // Call onStateChange() to change the state from WILD_CARD to null.
+        // This alters the padding of both layers, which forces a bounds change
+        // for the second layer due to the default "nest" padding mode.
         mockDrawable1.reset();
         mockDrawable2.reset();
-        layerDrawable.reset();
-        assertTrue(layerDrawable.onStateChange(null));
+        assertTrue(layerDrawable.setState(null));
         assertTrue(mockDrawable1.hasCalledSetState());
         assertTrue(mockDrawable2.hasCalledSetState());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertTrue(mockDrawable2.hasCalledOnBoundsChange());
 
+        // Call onStateChange() to change the state from null to valid state
+        // set. This alters the padding of both layers, which forces a bounds
+        // change for the second layer due to the default "nest" padding mode.
         mockDrawable1.reset();
         mockDrawable2.reset();
-        layerDrawable.reset();
-        assertTrue(layerDrawable.onStateChange(new int[] { attr.state_checked, attr.state_empty }));
+        assertTrue(layerDrawable.setState(new int[]{
+                android.R.attr.state_checked, android.R.attr.state_empty}));
         assertTrue(mockDrawable1.hasCalledSetState());
         assertTrue(mockDrawable2.hasCalledSetState());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertTrue(mockDrawable2.hasCalledOnBoundsChange());
     }
 
-    public void testOnLevelChange() {
+    public void testSetLevel() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
 
-        // this method will call each child's setLevel(),
-        // but just when set a different level the child's onLevelChange will be called.
-        assertFalse(layerDrawable.onLevelChange(0));
+        // Call onLevelChange() without actually changing the level.
+        assertFalse(layerDrawable.setLevel(0));
         assertFalse(mockDrawable1.hasCalledOnLevelChange());
         assertFalse(mockDrawable2.hasCalledOnLevelChange());
-        assertFalse(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable2.hasCalledOnBoundsChange());
 
+        // Call onLevelChange() to change the level from 0 to MAX_VALUE. This
+        // alters the padding of both layers, which forces a bounds change for
+        // the second layer due to the default "nest" padding mode.
         mockDrawable1.reset();
         mockDrawable2.reset();
-        layerDrawable.reset();
-        assertTrue(layerDrawable.onLevelChange(Integer.MAX_VALUE));
+        assertTrue(layerDrawable.setLevel(Integer.MAX_VALUE));
         assertTrue(mockDrawable1.hasCalledOnLevelChange());
         assertTrue(mockDrawable2.hasCalledOnLevelChange());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertTrue(mockDrawable2.hasCalledOnBoundsChange());
 
+        // Call onLevelChange() to change the level from MAX_VALUE to
+        // MIN_VALUE. This alters the padding of both layers, which forces a
+        // bounds change for the second layer due to the default "nest" padding
+        // mode.
         mockDrawable1.reset();
         mockDrawable2.reset();
-        layerDrawable.reset();
-        assertTrue(layerDrawable.onLevelChange(Integer.MIN_VALUE));
+        assertTrue(layerDrawable.setLevel(Integer.MIN_VALUE));
         assertTrue(mockDrawable1.hasCalledOnLevelChange());
         assertTrue(mockDrawable2.hasCalledOnLevelChange());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertTrue(mockDrawable2.hasCalledOnBoundsChange());
     }
 
-    public void testOnBoundsChange() {
+    public void testSetBounds() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
 
         Rect inset1 = new Rect(1, 2, 3, 4);
         Rect inset2 = new Rect(2, 4, 6, 7);
@@ -642,7 +677,7 @@
         assertEquals(0, mockDrawable2.getBounds().bottom);
 
         Rect bounds = new Rect(10, 20, 30, 40);
-        layerDrawable.onBoundsChange(bounds);
+        layerDrawable.setBounds(bounds);
 
         // all children's bounds will be changed after call onBoundsChange
         assertEquals(bounds.left + inset1.left, mockDrawable1.getBounds().left);
@@ -661,7 +696,7 @@
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
         assertEquals(mockDrawable1.getIntrinsicWidth(), layerDrawable.getIntrinsicWidth());
 
         Rect inset1 = new Rect(1, 2, 3, 4);
@@ -688,7 +723,7 @@
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
         assertEquals(mockDrawable1.getIntrinsicHeight(), layerDrawable.getIntrinsicHeight());
 
         Rect inset1 = new Rect(1, 2, 3, 4);
@@ -732,6 +767,8 @@
 
         private boolean mCalledSetState = false;
         private boolean mCalledOnLevelChange = false;
+        private boolean mCalledOnBoundsChange = false;
+
 
         private boolean mCalledDraw = false;
 
@@ -801,13 +838,15 @@
 
             mCalledSetState = false;
             mCalledOnLevelChange = false;
+            mCalledOnBoundsChange = false;
 
             mCalledDraw = false;
         }
 
         @Override
         protected boolean onStateChange(int[] state) {
-            return true;
+            increasePadding();
+            return mIsStateful;
         }
 
         private void increasePadding() {
@@ -829,6 +868,16 @@
         }
 
         @Override
+        protected void onBoundsChange(Rect bounds) {
+            mCalledOnBoundsChange = true;
+            super.onBoundsChange(bounds);
+        }
+
+        public boolean hasCalledOnBoundsChange() {
+            return mCalledOnBoundsChange;
+        }
+
+        @Override
         public boolean isStateful() {
             return mIsStateful;
         }
@@ -839,7 +888,6 @@
 
         @Override
         public boolean setState(final int[] stateSet) {
-            increasePadding();
             mCalledSetState = true;
             return super.setState(stateSet);
         }
@@ -870,44 +918,10 @@
         }
     }
 
-    private static class MockLayerDrawable extends LayerDrawable {
-        private boolean mCalledOnBoundsChange = false;
-
-        public MockLayerDrawable(Drawable[] array) {
-            super(array);
-        }
-
-        // override protected methods
-        @Override
-        protected boolean onStateChange(int[] state) {
-            return super.onStateChange(state);
-        }
-
-        @Override
-        protected boolean onLevelChange(int level) {
-            return super.onLevelChange(level);
-        }
-
-        @Override
-        protected void onBoundsChange(Rect bounds) {
-            mCalledOnBoundsChange = true;
-            super.onBoundsChange(bounds);
-        }
-
-        public boolean hasCalledOnBoundsChange() {
-            return mCalledOnBoundsChange;
-        }
-
-        public void reset() {
-            mCalledOnBoundsChange = false;
-        }
-    }
-
     public void testMutate() {
-        Resources resources = mContext.getResources();
-        LayerDrawable d1 = (LayerDrawable) resources.getDrawable(R.drawable.layerdrawable);
-        LayerDrawable d2 = (LayerDrawable) resources.getDrawable(R.drawable.layerdrawable);
-        LayerDrawable d3 = (LayerDrawable) resources.getDrawable(R.drawable.layerdrawable);
+        LayerDrawable d1 = (LayerDrawable) mContext.getDrawable(R.drawable.layerdrawable);
+        LayerDrawable d2 = (LayerDrawable) mContext.getDrawable(R.drawable.layerdrawable);
+        LayerDrawable d3 = (LayerDrawable) mContext.getDrawable(R.drawable.layerdrawable);
 
         d1.setAlpha(100);
         assertEquals(100, ((BitmapDrawable) d1.getDrawable(0)).getPaint().getAlpha());
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
index 6281582..b58e40f 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
@@ -21,6 +21,7 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
@@ -28,6 +29,7 @@
 import android.graphics.ColorFilter;
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ClipDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Drawable.ConstantState;
 import android.graphics.drawable.ScaleDrawable;
@@ -259,7 +261,8 @@
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
 
-        // this method will call contained drawable's getOpacity method.
+        // This method will call contained drawable's getOpacity method.
+        scaleDrawable.setLevel(1);
         scaleDrawable.getOpacity();
         assertTrue(mockDrawable.hasCalledGetOpacity());
     }
@@ -274,19 +277,23 @@
     }
 
     public void testOnStateChange() {
-        MockDrawable mockDrawable = new MockDrawable();
-        MockScaleDrawable mockScaleDrawable = new MockScaleDrawable(
-                mockDrawable, Gravity.CENTER, 100, 200);
+        Drawable d = new MockDrawable();
+        MockScaleDrawable scaleDrawable = new MockScaleDrawable(d, Gravity.CENTER, 100, 200);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
 
-        assertFalse(mockScaleDrawable.onStateChange(StateSet.WILD_CARD));
-        assertTrue(mockDrawable.hasCalledSetState());
-        assertTrue(mockScaleDrawable.hasCalledOnBoundsChange());
+        int[] state = new int[] {1, 2, 3};
+        assertFalse("child did not change", scaleDrawable.onStateChange(state));
+        assertEquals("child state did not change", d.getState(), StateSet.WILD_CARD);
 
-        mockDrawable.reset();
-        mockScaleDrawable.reset();
-        assertFalse(mockScaleDrawable.onStateChange(null));
-        assertTrue(mockDrawable.hasCalledSetState());
-        assertTrue(mockScaleDrawable.hasCalledOnBoundsChange());
+        d = mContext.getDrawable(R.drawable.statelistdrawable);
+        scaleDrawable = new MockScaleDrawable(d, Gravity.CENTER, 100, 200);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
+        scaleDrawable.onStateChange(state);
+        assertTrue("child state changed", Arrays.equals(state, d.getState()));
+
+        // input null as param
+        scaleDrawable.onStateChange(null);
+        // expected, no Exception thrown out, test success
     }
 
     public void testOnLevelChange() {
@@ -412,35 +419,34 @@
         parser = res.getXml(R.xml.scaledrawable);
         attrs = DrawableTestUtils.getAttributeSet(parser, "scale_nodrawable");
         try {
-            scaleDrawable.inflate(res, parser, attrs);
-            fail("Should throw XmlPullParserException");
+            Drawable.createFromXmlInner(res, parser, attrs);
+            fail("Should throw XmlPullParserException if missing drawable");
         } catch (XmlPullParserException e) {
         }
 
         try {
-            scaleDrawable.inflate(null, parser, attrs);
+            Drawable.createFromXmlInner(null, parser, attrs);
             fail("Should throw NullPointerException if resource is null");
         } catch (NullPointerException e) {
         }
 
         try {
-            scaleDrawable.inflate(res, null, attrs);
+            Drawable.createFromXmlInner(res, null, attrs);
             fail("Should throw NullPointerException if parser is null");
         } catch (NullPointerException e) {
         }
 
         try {
-            scaleDrawable.inflate(res, parser, null);
+            Drawable.createFromXmlInner(res, parser, null);
             fail("Should throw NullPointerException if attribute set is null");
         } catch (NullPointerException e) {
         }
     }
 
     public void testMutate() {
-        Resources resources = mContext.getResources();
-        ScaleDrawable d1 = (ScaleDrawable) resources.getDrawable(R.drawable.scaledrawable);
-        ScaleDrawable d2 = (ScaleDrawable) resources.getDrawable(R.drawable.scaledrawable);
-        ScaleDrawable d3 = (ScaleDrawable) resources.getDrawable(R.drawable.scaledrawable);
+        ScaleDrawable d1 = (ScaleDrawable) mContext.getDrawable(R.drawable.scaledrawable);
+        ScaleDrawable d2 = (ScaleDrawable) mContext.getDrawable(R.drawable.scaledrawable);
+        ScaleDrawable d3 = (ScaleDrawable) mContext.getDrawable(R.drawable.scaledrawable);
 
         d1.setAlpha(100);
         assertEquals(100, ((BitmapDrawable) d1.getDrawable()).getPaint().getAlpha());
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
index 8cee91e..d7becc6 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
@@ -17,7 +17,7 @@
 package android.graphics.drawable.cts;
 
 import android.annotation.TargetApi;
-import android.content.res.Resources;
+import android.content.res.Resources.Theme;
 import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.Rect;
@@ -28,21 +28,30 @@
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.NinePatchDrawable;
 import android.graphics.drawable.RippleDrawable;
+import android.os.Debug;
 import android.test.AndroidTestCase;
-import android.util.SparseIntArray;
-import android.view.ContextThemeWrapper;
 import android.view.Gravity;
 
 import com.android.cts.graphics.R;
 
-@TargetApi(19)
+@TargetApi(21)
 public class ThemedDrawableTest extends AndroidTestCase {
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        mContext.setTheme(R.style.Theme_ThemedDrawableTest);
+        // Workaround for ContextImpl.setTheme() being broken.
+        final Theme theme = mContext.getResources().newTheme();
+        theme.applyStyle(R.style.Theme_ThemedDrawableTest, true);
+        final Theme ctxTheme = mContext.getTheme();
+        ctxTheme.setTo(theme);
+    }
+
+    @Override
+    public void testAndroidTestCaseSetupProperly() {
+        final TypedArray t = mContext.obtainStyledAttributes(new int[]{R.attr.themeType});
+        assertTrue("Theme was applied correctly", t.getInt(0, -1) == 0);
     }
 
     public void testBitmapDrawable() {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
index 3578d3c..fdb8dae 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
@@ -63,6 +63,8 @@
             R.drawable.vector_icon_stroke_1,
             R.drawable.vector_icon_stroke_2,
             R.drawable.vector_icon_stroke_3,
+            R.drawable.vector_icon_scale_1,
+            R.drawable.vector_icon_scale_2,
     };
 
     private int[] mGoldenImages = new int[] {
@@ -89,6 +91,8 @@
             R.drawable.vector_icon_stroke_1_golden,
             R.drawable.vector_icon_stroke_2_golden,
             R.drawable.vector_icon_stroke_3_golden,
+            R.drawable.vector_icon_scale_1_golden,
+            R.drawable.vector_icon_scale_2_golden,
     };
 
     private static final int IMAGE_WIDTH = 64;
@@ -97,7 +101,8 @@
     // exactly with the golden image.
     // We can increase the threshold if the Skia is drawing with some variance
     // on different devices. So far, the tests show they are matching correctly.
-    private static final float PIXEL_ERROR_THRESHOLD = 0.00001f;
+    private static final float PIXEL_ERROR_THRESHOLD = 0.02f;
+    private static final float PIXEL_ERROR_COUNT_THRESHOLD = 0.005f;
 
     private static final boolean DBG_DUMP_PNG = false;
 
@@ -216,7 +221,7 @@
                 totalDiffPixelCount++;
             }
         }
-        if ((totalDiffPixelCount / totalPixelCount) >= PIXEL_ERROR_THRESHOLD) {
+        if ((totalDiffPixelCount / totalPixelCount) >= PIXEL_ERROR_COUNT_THRESHOLD) {
             fail((filename +": totalDiffPixelCount is " + totalDiffPixelCount));
         }
 
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index 153445d..9523d87 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -34,6 +34,7 @@
     src/android/hardware/cts/SensorIntegrationTests.java \
     src/android/hardware/cts/SensorBatchingTests.java \
     src/android/hardware/cts/SensorTest.java \
+    src/android/hardware/cts/SensorManagerStaticTest.java \
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil
 
@@ -56,4 +57,4 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-include $(BUILD_CTS_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
\ No newline at end of file
diff --git a/tests/tests/hardware/AndroidManifest.xml b/tests/tests/hardware/AndroidManifest.xml
index ab81162..7b15b61 100644
--- a/tests/tests/hardware/AndroidManifest.xml
+++ b/tests/tests/hardware/AndroidManifest.xml
@@ -25,6 +25,7 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.BODY_SENSORS" />
     <uses-permission android:name="android.permission.TRANSMIT_IR" />
+    <uses-permission android:name="android.permission.REORDER_TASKS" />
 
     <application>
         <uses-library android:name="android.test.runner" />
@@ -50,6 +51,26 @@
         <activity android:name="android.hardware.cts.GLSurfaceViewCtsActivity"
             android:label="GLSurfaceViewCtsActivity"/>
 
+        <service android:name="android.hardware.multiprocess.ErrorLoggingService"
+            android:label="ErrorLoggingService"
+            android:process=":errorLoggingServiceProcess"
+            android:exported="false">
+        </service>
+
+        <activity android:name="android.hardware.multiprocess.camera.cts.Camera1Activity"
+            android:label="RemoteCamera1Activity"
+            android:screenOrientation="landscape"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:process=":camera1ActivityProcess">
+        </activity>
+
+        <activity android:name="android.hardware.multiprocess.camera.cts.Camera2Activity"
+            android:label="RemoteCamera2Activity"
+            android:screenOrientation="landscape"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:process=":camera2ActivityProcess">
+        </activity>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/hardware/AndroidTest.xml b/tests/tests/hardware/AndroidTest.xml
new file mode 100644
index 0000000..783eafe
--- /dev/null
+++ b/tests/tests/hardware/AndroidTest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Base config for Sensor CTS tests. Put SensorService in restricted mode">
+    <include name="common-config" />
+    <!-- Put SensorService in restricted mode so that only CTS tests will be able to get access to
+    sensors -->
+    <option name="run-command:run-command" value="dumpsys sensorservice restrict" />
+    <option name="run-command:teardown-command" value="dumpsys sensorservice enable" />
+</configuration>
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java
new file mode 100644
index 0000000..a64ceb9
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java
@@ -0,0 +1,721 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureRequest.Builder;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleImageReaderListener;
+import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.media.Image;
+import android.util.Log;
+import android.util.Range;
+import android.util.Size;
+
+import java.util.ArrayList;
+
+/**
+ * Basic tests for burst capture in RAW10/16.
+ */
+public class BurstCaptureRawTest extends Camera2SurfaceViewTestCase {
+    private static final String TAG = "BurstCaptureRawTest";
+    private static final int RAW_FORMATS[] = {
+            ImageFormat.RAW10, ImageFormat.RAW_SENSOR };
+    private static final long EXPOSURE_MULTIPLIERS[] = {
+            1, 3, 5 };
+    private static final int SENSITIVITY_MLTIPLIERS[] = {
+            1, 3, 5 };
+    private static final int MAX_FRAMES_BURST =
+            EXPOSURE_MULTIPLIERS.length * SENSITIVITY_MLTIPLIERS.length;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    /**
+     * Verify raw sensor size information is correctly configured.
+     */
+    public void testRawSensorSize() throws Exception {
+        Log.i(TAG, "Begin testRawSensorSize");
+        for (String id : mCameraIds) {
+            try {
+                openDevice(id);
+
+                ArrayList<Integer> supportedRawList = new ArrayList<Integer>(RAW_FORMATS.length);
+                if (!checkCapability(supportedRawList)) {
+                    Log.i(TAG, "Capability is not supported on camera " + id
+                            + ". Skip the test.");
+                    continue;
+                }
+
+                Size[] rawSizes = mStaticInfo.getRawOutputSizesChecked();
+                assertTrue("No capture sizes available for RAW format!", rawSizes.length != 0);
+
+                Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+                Size size = new Size(activeArray.width(), activeArray.height());
+                mCollector.expectTrue("Missing ActiveArraySize",
+                        activeArray.width() > 0 && activeArray.height() > 0);
+                mCollector.expectContains(
+                        "Available sizes for RAW format must include ActiveArraySize",
+                        rawSizes, size);
+
+            } finally {
+                closeDevice();
+            }
+        }
+        Log.i(TAG, "End testRawSensorSize");
+    }
+
+    /**
+     * Round [exposure, gain] down, rather than to the nearest, in RAW 10/16
+     * <p>
+     * Verify the value of metadata (exposure and sensitivity) is rounded down if the request cannot
+     * be honored.
+     * </p>
+     */
+    public void testMetadataRoundDown() throws Exception {
+        Log.i(TAG, "Begin testMetadataRoundDown");
+
+        performTestRoutine(new TestMetaDataRoundDownRoutine());
+
+        Log.i(TAG, "End testMetadataRoundDown");
+    }
+
+    /**
+     * Manual and Auto setting test in RAW10/16
+     * <p>
+     * Make sure switching between manual and auto setting would not make the capture results out of
+     * sync.
+     * </p>
+     */
+    public void testManualAutoSwitch() throws Exception {
+        Log.i(TAG, "Begin testManualAutoSwitch");
+
+        performTestRoutine(new TestManualAutoSwitch());
+
+        Log.i(TAG, "End testManualAutoSwitch");
+    }
+
+    /**
+     * Per frame timestamp test in RAW10/16
+     */
+    public void testTimestamp() throws Exception {
+        Log.i(TAG, "Begin testTimestamp");
+
+        performTestRoutine(new TestTimestamp());
+
+        Log.i(TAG, "End testTimestamp");
+    }
+
+    /*
+     * Below are private infrastructure for all tests
+     */
+
+    /**
+     * A structure encapsulates all the parameters for setting up preview, and RAW capture.
+     */
+    class CaptureSetup
+    {
+        public CaptureSetup(Size previewCaptureSize, Size rawCaptureSize,
+                CaptureRequest.Builder previewRequestBuilder,
+                CaptureRequest.Builder rawRequestBuilder,
+                SimpleCaptureCallback previewCaptureCallback,
+                SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener)
+        {
+            mPreviewCaptureSize = previewCaptureSize;
+            mRawCaptureSize = rawCaptureSize;
+            mPreviewRequestBuilder = previewRequestBuilder;
+            mRawRequestBuilder = rawRequestBuilder;
+            mPreviewCaptureCallback = previewCaptureCallback;
+            mRawCaptureCallback = rawCaptureCallback;
+            mRawReaderListener = rawReaderListener;
+        }
+
+        public Size getPreviewCaptureSize()
+        {
+            return mPreviewCaptureSize;
+        }
+
+        public Size getRawCaptureSize()
+        {
+            return mRawCaptureSize;
+        }
+
+        public CaptureRequest.Builder getPreviewRequestBuilder()
+        {
+            return mPreviewRequestBuilder;
+        }
+
+        public CaptureRequest.Builder getRawRequestBuilder() {
+            return mRawRequestBuilder;
+        }
+
+        public SimpleCaptureCallback getPreviewCaptureCallback() {
+            return mPreviewCaptureCallback;
+        }
+
+        public SimpleCaptureCallback getRawCaptureCallback() {
+            return mRawCaptureCallback;
+        }
+
+        public SimpleImageReaderListener getRawReaderListener() {
+            return mRawReaderListener;
+        }
+
+        private Size mPreviewCaptureSize;
+        private Size mRawCaptureSize;
+        private CaptureRequest.Builder mPreviewRequestBuilder;
+        private CaptureRequest.Builder mRawRequestBuilder;
+
+        /** all the non-testing requests are sent to here */
+        private SimpleCaptureCallback mPreviewCaptureCallback;
+        /** all the testing requests are sent to here */
+        private SimpleCaptureCallback mRawCaptureCallback;
+        /** all the testing framebuffers are sent to here */
+        private SimpleImageReaderListener mRawReaderListener;
+    }
+
+    /**
+     * Interface for the test routines that are being called by performTestRoutines(). Implement
+     * different test cases in execute().
+     */
+    interface TestRoutine {
+        public void execute(CaptureRequest.Builder rawBurstBuilder,
+                SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener, int rawFormat) throws Exception;
+    }
+
+    /**
+     * Implementation of metadata round down test.
+     */
+    class TestMetaDataRoundDownRoutine implements TestRoutine
+    {
+        @Override
+        public void execute(CaptureRequest.Builder rawBurstBuilder,
+                SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener, int rawFormat) throws Exception
+        {
+            // build burst capture
+            ArrayList<CaptureRequest> rawRequestList = createBurstRequest(rawBurstBuilder);
+
+            // submit captrue
+            Log.i(TAG, "Submitting Burst Request.");
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // verify metadata
+            for (int i = 0; i < MAX_FRAMES_BURST; i++) {
+                CaptureResult result = rawCaptureCallback.getCaptureResult(
+                        CAPTURE_IMAGE_TIMEOUT_MS);
+
+                long resultExposure = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
+                int resultSensitivity = result.get(CaptureResult.SENSOR_SENSITIVITY);
+                long desiredExposure = rawRequestList.get(i).get(
+                        CaptureRequest.SENSOR_EXPOSURE_TIME);
+                int desiredSensitivity = rawRequestList.get(i).get(
+                        CaptureRequest.SENSOR_SENSITIVITY);
+
+                Log.i(TAG, String.format(
+                        "Received capture result, exposure = %d, sensitivity = %d. "
+                                + "Requested exposure = %d, sensitivity = %d.",
+                        resultExposure,
+                        resultSensitivity, desiredExposure, desiredSensitivity));
+
+                mCollector.expectTrue(
+                        String.format("Exposure value is greater than requested: "
+                                + "requested = %d, result = %d.",
+                                desiredExposure, resultExposure),
+                                resultExposure <= desiredExposure);
+
+                mCollector.expectTrue(
+                        String.format("Sensitivity value is greater than requested: "
+                                + "requested = %d, result = %d.",
+                                desiredSensitivity, resultSensitivity),
+                                resultSensitivity <= desiredSensitivity);
+            }
+        }
+    }
+
+    /**
+     * Implementation of manual-auto switching test.
+     */
+    class TestManualAutoSwitch implements TestRoutine
+    {
+        @Override
+        public void execute(CaptureRequest.Builder rawBurstBuilder,
+                SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener, int rawFormat) throws Exception
+        {
+            // create a capture request builder to preserve all the original values
+            CaptureRequest.Builder originBuilder = mCamera.createCaptureRequest(
+                    CameraDevice.TEMPLATE_STILL_CAPTURE);
+            copyBurstRequetBuilder(originBuilder, rawBurstBuilder);
+
+            // build burst capture
+            ArrayList<CaptureRequest> rawRequestList = createBurstRequest(rawBurstBuilder);
+
+            // submit captrue but ignore
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // drain the capture result
+            drainQueues(rawReaderListener, rawCaptureCallback);
+
+            // reset and build capture with 3A
+            copyBurstRequetBuilder(rawBurstBuilder, originBuilder);
+            rawRequestList = createBurstRequestWith3A(rawBurstBuilder);
+
+            // submit captrue but ignore
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // drain the capture result
+            drainQueues(rawReaderListener, rawCaptureCallback);
+
+            // reset and rebuild manual raw burst capture
+            copyBurstRequetBuilder(rawBurstBuilder, originBuilder);
+            rawRequestList = createBurstRequest(rawBurstBuilder);
+
+            // submit capture
+            Log.i(TAG, "Submitting Burst Request.");
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // verify metadata
+            for (int i = 0; i < MAX_FRAMES_BURST; i++) {
+                CaptureResult result = rawCaptureCallback.getCaptureResult(
+                        CAPTURE_IMAGE_TIMEOUT_MS);
+
+                long resultExposure = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
+                int resultSensitivity = result.get(CaptureResult.SENSOR_SENSITIVITY);
+                int resultEdgeMode = result.get(CaptureResult.EDGE_MODE);
+                int resultNoiseReductionMode = result.get(
+                        CaptureResult.NOISE_REDUCTION_MODE);
+                long desiredExposure = rawRequestList.get(i).get(
+                        CaptureRequest.SENSOR_EXPOSURE_TIME);
+                int desiredSensitivity = rawRequestList.get(i).get(
+                        CaptureRequest.SENSOR_SENSITIVITY);
+
+                Log.i(TAG, String.format(
+                        "Received capture result, exposure = %d, sensitivity = %d. "
+                                + "Requested exposure = %d, sensitivity = %d.",
+                        resultExposure,
+                        resultSensitivity, desiredExposure, desiredSensitivity));
+
+                mCollector.expectTrue(String.format("Edge mode is not turned off."),
+                        resultEdgeMode == CaptureRequest.EDGE_MODE_OFF);
+
+                mCollector.expectTrue(String.format("Noise reduction is not turned off."),
+                        resultNoiseReductionMode
+                        == CaptureRequest.NOISE_REDUCTION_MODE_OFF);
+
+                mCollector.expectTrue(
+                        String.format("Exposure value is greater than requested: "
+                                + "requested = %d, result = %d.",
+                                desiredExposure, resultExposure),
+                                resultExposure <= desiredExposure);
+
+                mCollector.expectTrue(
+                        String.format("Sensitivity value is greater than requested: "
+                                + "requested = %d, result = %d.",
+                                desiredSensitivity, resultSensitivity),
+                                resultSensitivity <= desiredSensitivity);
+            }
+
+        }
+    }
+
+    /**
+     * Implementation of timestamp test
+     */
+    class TestTimestamp implements TestRoutine
+    {
+        private final double THRESHOLD = 5000000.0; // 5ms
+        private final long EXPOSURE_MULTIPLIERS_PRIVATE[] = {
+                1, 1, 1 };
+        private final int SENSITIVITY_MLTIPLIERS_PRIVATE[] = {
+                1, 1, 1 };
+        private final int MAX_FRAMES_BURST_PRIVATE =
+                EXPOSURE_MULTIPLIERS_PRIVATE.length * SENSITIVITY_MLTIPLIERS_PRIVATE.length;
+
+        @Override
+        public void execute(Builder rawBurstBuilder, SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener, int rawFormat) throws Exception {
+            // prepare some local variables
+            ArrayList<Long> sensorTime = new ArrayList<Long>(MAX_FRAMES_BURST_PRIVATE);
+
+            // build burst capture
+            ArrayList<CaptureRequest> rawRequestList = createBurstRequest(rawBurstBuilder,
+                    EXPOSURE_MULTIPLIERS_PRIVATE, SENSITIVITY_MLTIPLIERS_PRIVATE);
+
+            // submit capture while recording timestamp
+            Log.i(TAG, "Submitting Burst Request.");
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // receive frames while recording timestamp
+            for (int i = 0; i < MAX_FRAMES_BURST_PRIVATE; i++) {
+                CaptureResult result = rawCaptureCallback.getCaptureResult(
+                        CAPTURE_IMAGE_TIMEOUT_MS);
+                long resultExposure = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
+                int resultSensitivity = result.get(CaptureResult.SENSOR_SENSITIVITY);
+                long resultTimestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+                Log.i(TAG, String.format(
+                        "Received capture result, exposure = %d, sensitivity = %d, timestamp = %d",
+                        resultExposure, resultSensitivity, resultTimestamp));
+
+                sensorTime.add(resultTimestamp);
+            }
+
+            // compare sensor time and compute the difference
+            ArrayList<Long> deltaList = new ArrayList<Long>();
+            for (int i = 1; i < MAX_FRAMES_BURST_PRIVATE; i++)
+            {
+                deltaList.add(sensorTime.get(i) - sensorTime.get(i - 1));
+            }
+
+            // compute the average and standard deviation of the differences
+            double average = 0.0;
+            for (int i = 0; i < deltaList.size(); i++)
+            {
+                average += deltaList.get(i);
+            }
+            average /= deltaList.size();
+
+            double stddev = 0.0;
+            for (int i = 0; i < deltaList.size(); i++)
+            {
+                double diff = deltaList.get(i) - average;
+                stddev += diff * diff;
+            }
+            stddev = Math.sqrt(stddev / deltaList.size());
+
+            Log.i(TAG, String.format("average = %.2f, stddev = %.2f", average, stddev));
+
+            StringBuilder sensorTimestampMessage = new StringBuilder();
+            for (int i = 0; i < sensorTime.size(); i++)
+            {
+                sensorTimestampMessage.append("frame [");
+                sensorTimestampMessage.append(i);
+                sensorTimestampMessage.append("] SENSOR_TIMESTAMP = ");
+                sensorTimestampMessage.append(sensorTime.get(i));
+                sensorTimestampMessage.append("\n");
+            }
+
+            mCollector.expectLessOrEqual(
+                    "The standard deviation of frame interval is larger then threshold: " +
+                    String.format("stddev = %.2f, threshold = %.2f.\n", stddev, THRESHOLD) +
+                    sensorTimestampMessage.toString(),
+                    THRESHOLD, stddev);
+        }
+    }
+
+    /**
+     * Check sensor capability prior to the test.
+     *
+     * @return true if the it is has the capability to execute the test.
+     */
+    private boolean checkCapability(ArrayList<Integer> supportedRawList) {
+        // make sure the sensor has manual support
+        if (!mStaticInfo.isCapabilitySupported(
+                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)) {
+            Log.w(TAG, "Full hardware level is not supported");
+            return false;
+        }
+
+        // get the list of supported RAW format
+        StreamConfigurationMap config = mStaticInfo.getValueFromKeyNonNull(
+                CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+
+        // check for the RAW support
+        supportedRawList.clear();
+        for (int rawFormat : RAW_FORMATS) {
+            if (!config.isOutputSupportedFor(rawFormat)) {
+                continue;
+            }
+            supportedRawList.add(rawFormat);
+        }
+
+        if (supportedRawList.size() == 0)
+        {
+            Log.w(TAG, "RAW output is not supported!");
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Return the sensor format to human readable string.
+     *
+     * @param format Sensor image format.
+     * @return Human readable string.
+     */
+    private String imageFormatToString(int format) {
+        switch (format) {
+            case ImageFormat.RAW10:
+                return "RAW10";
+            case ImageFormat.RAW_SENSOR:
+                return "RAW_SENSOR";
+        }
+
+        return "Unknown";
+    }
+
+    /**
+     * Setting up various classes prior to the request, e.g.: capture size, builder, callback and
+     * listener
+     *
+     * @return initialized variables that can be directly fed into prepareCaptureAndStartPreview().
+     */
+    private CaptureSetup initCaptureSetupForPreviewAndRaw() throws Exception
+    {
+        // capture size
+        Size previewSize = mOrderedPreviewSizes.get(0);
+        Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+        Size rawSize = new Size(activeArray.width(), activeArray.height());
+
+        // builder
+        CaptureRequest.Builder previewCaptureBuilder = mCamera.createCaptureRequest(
+                CameraDevice.TEMPLATE_PREVIEW);
+        CaptureRequest.Builder rawCaptureBuilder = mCamera.createCaptureRequest(
+                CameraDevice.TEMPLATE_STILL_CAPTURE);
+
+        // callback
+        SimpleCaptureCallback previewCaptureCallback = new SimpleCaptureCallback();
+        SimpleCaptureCallback rawCaptureCallback = new SimpleCaptureCallback();
+        SimpleImageReaderListener rawReaderListener = new SimpleImageReaderListener();
+
+        CaptureSetup setup = new CaptureSetup(previewSize, rawSize, previewCaptureBuilder,
+                rawCaptureBuilder, previewCaptureCallback, rawCaptureCallback, rawReaderListener);
+
+        return setup;
+    }
+
+    /**
+     * Construct an array of burst request with manual exposure and sensitivity.
+     * <p>
+     * For each capture request, 3A and post processing (noise reduction, sharpening, etc) will be
+     * turned off. Then exposure and sensitivity value will be configured, which are determined by
+     * EXPOSURE_MULIPLIERS and SENSITIVITY_MULTIPLIERS.
+     * </p>
+     *
+     * @param rawBurstBuilder The builder needs to have targets setup.
+     * @return An array list capture request for burst.
+     */
+    private ArrayList<CaptureRequest> createBurstRequest(CaptureRequest.Builder rawBurstBuilder)
+    {
+        return createBurstRequest(rawBurstBuilder, EXPOSURE_MULTIPLIERS, SENSITIVITY_MLTIPLIERS);
+    }
+
+    private ArrayList<CaptureRequest> createBurstRequest(CaptureRequest.Builder rawBurstBuilder,
+            long[] exposureMultipliers, int[] sensitivityMultipliers) {
+        // set manual mode
+        rawBurstBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
+        rawBurstBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF);
+        rawBurstBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE,
+                CaptureRequest.NOISE_REDUCTION_MODE_OFF);
+        rawBurstBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_OFF);
+        // exposure has higher priority over frame duration; therefore the frame readout time:
+        // exposure time + overhead
+        rawBurstBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, 0L);
+
+        // get the exposure and sensitivity range
+        Range<Long> exposureRangeNs = new Range<Long>(mStaticInfo.getExposureMinimumOrDefault(),
+                mStaticInfo.getExposureMaximumOrDefault());
+
+        Range<Integer> isoRange = new Range<Integer>(mStaticInfo.getSensitivityMinimumOrDefault(),
+                mStaticInfo.getSensitivityMaximumOrDefault());
+
+        Log.i(TAG, String.format("Exposure time - max: %d, min: %d.", exposureRangeNs.getUpper(),
+                exposureRangeNs.getLower()));
+        Log.i(TAG, String.format("Sensitivity - max: %d, min: %d.", isoRange.getUpper(),
+                isoRange.getLower()));
+
+        // building burst request
+        int maxFramesBurst = exposureMultipliers.length * sensitivityMultipliers.length;
+        Log.i(TAG, String.format("Setting up burst = %d frames.", maxFramesBurst));
+        ArrayList<CaptureRequest> rawRequestList = new ArrayList<CaptureRequest>(maxFramesBurst);
+
+        for (int i = 0; i < exposureMultipliers.length; i++) {
+            for (int j = 0; j < sensitivityMultipliers.length; j++) {
+                long desiredExposure = Math.min(
+                        exposureRangeNs.getLower() * exposureMultipliers[i],
+                        exposureRangeNs.getUpper());
+
+                int desiredSensitivity =
+                        Math.min(isoRange.getLower() * sensitivityMultipliers[j],
+                                isoRange.getUpper());
+
+                rawBurstBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, desiredExposure);
+                rawBurstBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, desiredSensitivity);
+
+                rawRequestList.add(rawBurstBuilder.build());
+            }
+        }
+        return rawRequestList;
+    }
+
+    /**
+     * Construct an array of burst request with 3A
+     * <p>
+     * For each capture request, 3A and post processing (noise reduction, sharpening, etc) will be
+     * turned on.
+     * </p>
+     *
+     * @param rawBurstBuilder The builder needs to have targets setup.
+     * @return An array list capture request for burst.
+     */
+    private ArrayList<CaptureRequest> createBurstRequestWith3A(
+            CaptureRequest.Builder rawBurstBuilder)
+    {
+        // set 3A mode to simulate regular still capture
+        rawBurstBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
+        rawBurstBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO);
+        rawBurstBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE,
+                CaptureRequest.NOISE_REDUCTION_MODE_HIGH_QUALITY);
+        rawBurstBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_HIGH_QUALITY);
+
+        // building burst request
+        Log.i(TAG, String.format("Setting up burst = %d frames.", MAX_FRAMES_BURST));
+        ArrayList<CaptureRequest> rawRequestList = new ArrayList<CaptureRequest>(MAX_FRAMES_BURST);
+
+        for (int i = 0; i < MAX_FRAMES_BURST; i++) {
+            rawRequestList.add(rawBurstBuilder.build());
+        }
+
+        return rawRequestList;
+    }
+
+    /**
+     * An utility method to copy capture request builders. This is used for recovery purpose to
+     * reverse the changes we made to the builder.
+     *
+     * @param dst the builder to write into.
+     * @param src the builder that needs to be copied.
+     */
+    private void copyBurstRequetBuilder(CaptureRequest.Builder dst, CaptureRequest.Builder src)
+    {
+        dst.set(CaptureRequest.CONTROL_AE_MODE, src.get(CaptureRequest.CONTROL_AE_MODE));
+        dst.set(CaptureRequest.CONTROL_AWB_MODE, src.get(CaptureRequest.CONTROL_AWB_MODE));
+        dst.set(CaptureRequest.NOISE_REDUCTION_MODE, src.get(CaptureRequest.NOISE_REDUCTION_MODE));
+        dst.set(CaptureRequest.EDGE_MODE, src.get(CaptureRequest.EDGE_MODE));
+        dst.set(CaptureRequest.SENSOR_FRAME_DURATION,
+                src.get(CaptureRequest.SENSOR_FRAME_DURATION));
+        dst.set(CaptureRequest.SENSOR_EXPOSURE_TIME, src.get(CaptureRequest.SENSOR_EXPOSURE_TIME));
+        dst.set(CaptureRequest.SENSOR_SENSITIVITY, src.get(CaptureRequest.SENSOR_SENSITIVITY));
+    }
+
+    /**
+     * Draining the image reader and capture callback queue
+     *
+     * @param readerListener Image reader listener needs to be drained.
+     * @param captureCallback Capture callback needs to be drained.
+     * @throws Exception Exception from the queue.
+     */
+    private void drainQueues(SimpleImageReaderListener readerListener,
+            SimpleCaptureCallback captureCallback) throws Exception
+    {
+        for (int i = 0; i < MAX_FRAMES_BURST; i++) {
+            Image image = readerListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            image.close();
+
+            CaptureResult result = captureCallback.getCaptureResult(
+                    CAPTURE_IMAGE_TIMEOUT_MS);
+            long timestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+            Log.d(TAG, String.format("timestamp = %d", timestamp));
+        }
+    }
+
+    /**
+     * Stop preview and remove the target surfaces inside the CaptureRequest.Builder.
+     *
+     * @param previewBuilder Configured builder for preview.
+     * @param rawBurstBuilder Configured builder for RAW.
+     * @throws Exception Exceptions from stopPreview.
+     */
+    private void stopPreviewAndClearSurface(CaptureRequest.Builder previewBuilder,
+            CaptureRequest.Builder rawBurstBuilder) throws Exception
+    {
+        previewBuilder.removeTarget(mPreviewSurface);
+        rawBurstBuilder.removeTarget(mPreviewSurface);
+        rawBurstBuilder.removeTarget(mReaderSurface);
+
+        stopPreview();
+    }
+
+    private void performTestRoutine(TestRoutine routine) throws Exception
+    {
+        for (String id : mCameraIds) {
+            try {
+                openDevice(id);
+
+                ArrayList<Integer> supportedRawList = new ArrayList<Integer>(RAW_FORMATS.length);
+                if (!checkCapability(supportedRawList)) {
+                    Log.i(TAG, "Capability is not supported on camera " + id
+                            + ". Skip the test.");
+                    continue;
+                }
+
+                // test each supported RAW format
+                for (int rawFormat : supportedRawList) {
+                    Log.i(TAG, "Testing format " + imageFormatToString(rawFormat) + ".");
+
+                    // prepare preview and still RAW capture
+                    CaptureSetup captureSetup = initCaptureSetupForPreviewAndRaw();
+
+                    Size previewCaptureSize = captureSetup.getPreviewCaptureSize();
+                    Size rawCaptureSize = captureSetup.getRawCaptureSize();
+
+                    CaptureRequest.Builder previewBuilder = captureSetup.getPreviewRequestBuilder();
+                    CaptureRequest.Builder rawBurstBuilder = captureSetup.getRawRequestBuilder();
+
+                    SimpleCaptureCallback previewCaptureCallback =
+                            captureSetup.getPreviewCaptureCallback();
+                    SimpleCaptureCallback rawCaptureCallback = captureSetup.getRawCaptureCallback();
+                    SimpleImageReaderListener rawReaderListener = captureSetup
+                            .getRawReaderListener();
+
+                    // start preview and prepare RAW capture
+                    prepareCaptureAndStartPreview(previewBuilder, rawBurstBuilder,
+                            previewCaptureSize, rawCaptureSize, rawFormat, previewCaptureCallback,
+                            MAX_FRAMES_BURST, rawReaderListener);
+
+                    // execute test routine
+                    routine.execute(rawBurstBuilder, rawCaptureCallback, rawReaderListener,
+                            rawFormat);
+
+                    // clear out the surface and camera session
+                    stopPreviewAndClearSurface(previewBuilder, rawBurstBuilder);
+                    closeImageReader();
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureTest.java
index 5d0841e..5a66fa7 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureTest.java
@@ -25,12 +25,14 @@
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.hardware.camera2.params.StreamConfigurationMap;
+import android.media.Image;
 import android.util.Log;
 import android.util.Range;
 import android.util.Size;
 
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Arrays;
 
 public class BurstCaptureTest extends Camera2SurfaceViewTestCase {
     private static final String TAG = "BurstCaptureTest";
@@ -48,8 +50,9 @@
                 Log.i(TAG, "Testing YUV Burst for camera " + id);
                 openDevice(id);
 
-                if (mStaticInfo.isHardwareLevelLegacy()) {
-                    Log.i(TAG, "Skip burst test on legacy devices.");
+                if (!mStaticInfo.isAeLockSupported() || !mStaticInfo.isAwbLockSupported()) {
+                    Log.i(TAG, "AE/AWB lock is not supported in camera " + id +
+                            ". Skip the test");
                     continue;
                 }
 
@@ -72,7 +75,8 @@
         final Size previewSize = mOrderedPreviewSizes.get(0);
 
         // Get maximum YUV_420_888 size
-        final Size stillSize = getMaxPreviewSize(cameraId, mCameraManager);
+        final Size stillSize = getSortedSizesForFormat(
+                cameraId, mCameraManager, ImageFormat.YUV_420_888, /*bound*/null).get(0);
 
         // Find max pipeline depth and sync latency
         final int maxPipelineDepth = mStaticInfo.getCharacteristics().get(
@@ -87,24 +91,34 @@
                 config.getOutputMinFrameDuration(ImageFormat.YUV_420_888, stillSize);
 
         // Find suitable target FPS range - as high as possible
-        Range<Integer>[] fpsRanges = mStaticInfo.getAeAvailableTargetFpsRangesChecked();
-        int minBurstFps = (int) Math.floor(1e9 / minStillFrameDuration);
-        Range<Integer> targetRange = null;
-        for (Range<Integer> candidateRange : fpsRanges) {
-            if (candidateRange.getLower() >= minBurstFps) {
-                if (targetRange == null) {
-                    targetRange = candidateRange;
-                } else if (candidateRange.getLower() > targetRange.getLower()) {
-                    targetRange = candidateRange;
-                } else if (candidateRange.getUpper() > targetRange.getUpper()) {
-                    targetRange = candidateRange;
-                }
+        List<Range<Integer> > fpsRanges = Arrays.asList(
+                mStaticInfo.getAeAvailableTargetFpsRangesChecked());
+        Range<Integer> targetRange = mStaticInfo.getAeMaxTargetFpsRange();
+        // Add 0.05 here so Fps like 29.99 evaluated to 30
+        int minBurstFps = (int) Math.floor(1e9 / minStillFrameDuration + 0.05f);
+        boolean foundConstantMaxYUVRange = false;
+        boolean foundYUVStreamingRange = false;
+
+        for (Range<Integer> fpsRange : fpsRanges) {
+            if (fpsRange.getLower() == minBurstFps && fpsRange.getUpper() == minBurstFps) {
+                foundConstantMaxYUVRange = true;
             }
+            if (fpsRange.getLower() <= 15 && fpsRange.getUpper() == minBurstFps) {
+                foundYUVStreamingRange = true;
+            }
+        }
+
+        if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+            assertTrue(String.format("Cam %s: Target FPS range of (%d, %d) must be supported",
+                    cameraId, minBurstFps, minBurstFps), foundConstantMaxYUVRange);
+            assertTrue(String.format(
+                    "Cam %s: Target FPS range of (x, %d) where x <= 15 must be supported",
+                    cameraId, minBurstFps), foundYUVStreamingRange);
         }
         assertTrue(String.format("Cam %s: No target FPS range found with minimum FPS above " +
                         " 1/minFrameDuration (%d fps, duration %d ns) for full-resolution YUV",
-                cameraId, minBurstFps, minStillFrameDuration),
-            targetRange != null);
+                        cameraId, minBurstFps, minStillFrameDuration),
+                targetRange.getLower() >= minBurstFps);
 
         Log.i(TAG, String.format("Selected frame rate range %d - %d for YUV burst",
                         targetRange.getLower(), targetRange.getUpper()));
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index 29c7362..be80eea 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -23,6 +23,7 @@
 import static android.hardware.camera2.CaptureRequest.*;
 
 import android.content.Context;
+import android.graphics.SurfaceTexture;
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
@@ -380,11 +381,7 @@
                 closeSession();
             }
             finally {
-                try {
-
-                } finally {
-                    closeDevice(mCameraIds[i], mCameraMockListener);
-                }
+                closeDevice(mCameraIds[i], mCameraMockListener);
             }
         }
     }
@@ -581,6 +578,146 @@
         }
     }
 
+    /**
+     * Verify basic semantics and error conditions of the prepare call.
+     *
+     */
+    public void testPrepare() throws Exception {
+        for (int i = 0; i < mCameraIds.length; i++) {
+            try {
+                openDevice(mCameraIds[i], mCameraMockListener);
+                waitForDeviceState(STATE_OPENED, CAMERA_OPEN_TIMEOUT_MS);
+
+                prepareTestByCamera();
+            }
+            finally {
+                closeDevice(mCameraIds[i], mCameraMockListener);
+            }
+        }
+    }
+
+    private void prepareTestByCamera() throws Exception {
+        final int PREPARE_TIMEOUT_MS = 10000;
+
+        mSessionMockListener = spy(new BlockingSessionCallback());
+
+        SurfaceTexture output1 = new SurfaceTexture(1);
+        Surface output1Surface = new Surface(output1);
+        SurfaceTexture output2 = new SurfaceTexture(2);
+        Surface output2Surface = new Surface(output2);
+
+        List<Surface> outputSurfaces = new ArrayList<>(
+            Arrays.asList(output1Surface, output2Surface));
+        mCamera.createCaptureSession(outputSurfaces, mSessionMockListener, mHandler);
+
+        mSession = mSessionMockListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+
+        // Try basic prepare
+
+        mSession.prepare(output1Surface);
+
+        verify(mSessionMockListener, timeout(PREPARE_TIMEOUT_MS).times(1))
+                .onSurfacePrepared(eq(mSession), eq(output1Surface));
+
+        // Should not complain if preparing already prepared stream
+
+        mSession.prepare(output1Surface);
+
+        verify(mSessionMockListener, timeout(PREPARE_TIMEOUT_MS).times(2))
+                .onSurfacePrepared(eq(mSession), eq(output1Surface));
+
+        // Check surface not included in session
+
+        SurfaceTexture output3 = new SurfaceTexture(3);
+        Surface output3Surface = new Surface(output3);
+        try {
+            mSession.prepare(output3Surface);
+            fail("Preparing surface not part of session must throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        // Ensure second prepare also works
+
+        mSession.prepare(output2Surface);
+
+        verify(mSessionMockListener, timeout(PREPARE_TIMEOUT_MS).times(1))
+                .onSurfacePrepared(eq(mSession), eq(output2Surface));
+
+        // Use output1
+
+        CaptureRequest.Builder r = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+        r.addTarget(output1Surface);
+
+        mSession.capture(r.build(), null, null);
+
+        try {
+            mSession.prepare(output1Surface);
+            fail("Preparing already-used surface must throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        // Create new session with outputs 1 and 3, ensure output1Surface still can't be prepared
+        // again
+
+        mSessionMockListener = spy(new BlockingSessionCallback());
+
+        outputSurfaces = new ArrayList<>(
+            Arrays.asList(output1Surface, output3Surface));
+        mCamera.createCaptureSession(outputSurfaces, mSessionMockListener, mHandler);
+
+        mSession = mSessionMockListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+
+        try {
+            mSession.prepare(output1Surface);
+            fail("Preparing surface used in previous session must throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        // Use output3, wait for result, then make sure prepare still doesn't work
+
+        r = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+        r.addTarget(output3Surface);
+
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+        mSession.capture(r.build(), resultListener, mHandler);
+
+        resultListener.getCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
+
+        try {
+            mSession.prepare(output3Surface);
+            fail("Preparing already-used surface must throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        // Create new session with outputs 1 and 2, ensure output2Surface can be prepared again
+
+        mSessionMockListener = spy(new BlockingSessionCallback());
+
+        outputSurfaces = new ArrayList<>(
+            Arrays.asList(output1Surface, output2Surface));
+        mCamera.createCaptureSession(outputSurfaces, mSessionMockListener, mHandler);
+
+        mSession = mSessionMockListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+
+        mSession.prepare(output2Surface);
+
+        verify(mSessionMockListener, timeout(PREPARE_TIMEOUT_MS).times(1))
+                .onSurfacePrepared(eq(mSession), eq(output2Surface));
+
+        try {
+            mSession.prepare(output1Surface);
+            fail("Preparing surface used in previous session must throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+    }
+
+
     private void invalidRequestCaptureTestByCamera() throws Exception {
         if (VERBOSE) Log.v(TAG, "invalidRequestCaptureTestByCamera");
 
@@ -888,7 +1025,7 @@
         mSession = mSessionMockListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
         waitForSessionState(SESSION_CONFIGURED, SESSION_CONFIGURE_TIMEOUT_MS);
         waitForSessionState(SESSION_READY, SESSION_READY_TIMEOUT_MS);
-}
+    }
 
     private void waitForDeviceState(int state, long timeoutMs) {
         mCameraMockListener.waitForState(state, timeoutMs);
@@ -1089,16 +1226,22 @@
             mCollector.expectKeyValueEquals(request, CONTROL_AE_MODE,
                     CaptureRequest.CONTROL_AE_MODE_ON);
             mCollector.expectKeyValueEquals(request, CONTROL_AE_EXPOSURE_COMPENSATION, 0);
-            mCollector.expectKeyValueEquals(request, CONTROL_AE_LOCK, false);
             mCollector.expectKeyValueEquals(request, CONTROL_AE_PRECAPTURE_TRIGGER,
                     CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
+            // if AE lock is not supported, expect the control key to be non-exist or false
+            if (mStaticInfo.isAeLockSupported() || request.get(CONTROL_AE_LOCK) != null) {
+                mCollector.expectKeyValueEquals(request, CONTROL_AE_LOCK, false);
+            }
 
             mCollector.expectKeyValueEquals(request, CONTROL_AF_TRIGGER,
                     CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
 
             mCollector.expectKeyValueEquals(request, CONTROL_AWB_MODE,
                     CaptureRequest.CONTROL_AWB_MODE_AUTO);
-            mCollector.expectKeyValueEquals(request, CONTROL_AWB_LOCK, false);
+            // if AWB lock is not supported, expect the control key to be non-exist or false
+            if (mStaticInfo.isAwbLockSupported() || request.get(CONTROL_AWB_LOCK) != null) {
+                mCollector.expectKeyValueEquals(request, CONTROL_AWB_LOCK, false);
+            }
 
             // Check 3A regions.
             if (VERBOSE) {
@@ -1292,6 +1435,10 @@
             if (mStaticInfo.areKeysAvailable(TONEMAP_MODE)) {
                 mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
                         CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE);
+                mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
+                        CaptureRequest.TONEMAP_MODE_GAMMA_VALUE);
+                mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
+                        CaptureRequest.TONEMAP_MODE_PRESET_CURVE);
             }
             if (mStaticInfo.areKeysAvailable(STATISTICS_LENS_SHADING_MAP_MODE)) {
                 mCollector.expectKeyValueNotNull(request, STATISTICS_LENS_SHADING_MAP_MODE);
@@ -1325,6 +1472,10 @@
                         !mStaticInfo.isCapabilitySupported(CameraCharacteristics.
                                 REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
                     // OK
+                } else if (template == CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG &&
+                        !mStaticInfo.isCapabilitySupported(CameraCharacteristics.
+                                REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING)) {
+                    // OK.
                 } else if (sLegacySkipTemplates.contains(template) &&
                         mStaticInfo.isHardwareLevelLegacy()) {
                     // OK
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
index 27ff6d1..77a0c8e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -422,38 +422,23 @@
                         new BlockingStateCallback(mockFailListener);
 
                 mCameraManager.openCamera(ids[i], successListener, mHandler);
-
-                try {
-                    mCameraManager.openCamera(ids[i], failListener,
-                            mHandler);
-                } catch (CameraAccessException e) {
-                    // Optional (but common). Camera might fail asynchronously only.
-                    // Don't assert here, otherwise, all subsequent tests will fail because the
-                    // opened camera is never closed.
-                    mCollector.expectEquals(
-                            "If second camera open fails immediately, must be due to"
-                            + "camera being busy for ID: " + ids[i],
-                            CameraAccessException.CAMERA_ERROR, e.getReason());
-                }
+                mCameraManager.openCamera(ids[i], failListener,
+                        mHandler);
 
                 successListener.waitForState(BlockingStateCallback.STATE_OPENED,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
-                // Have to get the successCamera here, otherwise, it won't be
-                // closed if STATE_ERROR timeout exception occurs.
                 ArgumentCaptor<CameraDevice> argument =
                         ArgumentCaptor.forClass(CameraDevice.class);
                 verify(mockSuccessListener, atLeastOnce()).onOpened(argument.capture());
+                verify(mockSuccessListener, atLeastOnce()).onDisconnected(argument.capture());
 
-                failListener.waitForState(BlockingStateCallback.STATE_ERROR,
+                failListener.waitForState(BlockingStateCallback.STATE_OPENED,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
+                verify(mockFailListener, atLeastOnce()).onOpened(argument.capture());
 
                 successCamera = verifyCameraStateOpened(
-                        ids[i], mockSuccessListener);
+                        ids[i], mockFailListener);
 
-                verify(mockFailListener)
-                        .onError(
-                                and(notNull(CameraDevice.class), not(eq(successCamera))),
-                                eq(StateCallback.ERROR_CAMERA_IN_USE));
                 verifyNoMoreInteractions(mockFailListener);
             } finally {
                 if (successCamera != null) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
index be43d2f..fbedca9 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -16,8 +16,6 @@
 
 package android.hardware.camera2.cts;
 
-import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
-
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.ImageFormat;
@@ -31,16 +29,19 @@
 import android.hardware.camera2.CaptureFailure;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.params.InputConfiguration;
 import android.hardware.camera2.TotalCaptureResult;
 import android.hardware.cts.helpers.CameraUtils;
-import android.util.Size;
 import android.hardware.camera2.params.MeteringRectangle;
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.media.Image;
 import android.media.ImageReader;
+import android.media.ImageWriter;
 import android.media.Image.Plane;
 import android.os.Handler;
 import android.util.Log;
+import android.util.Pair;
+import android.util.Size;
 import android.view.Surface;
 
 import com.android.ex.camera2.blocking.BlockingCameraManager;
@@ -61,10 +62,12 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
 
 /**
  * A package private utility class for wrapping up the camera2 cts test common utility functions
@@ -106,7 +109,8 @@
      */
     public static ImageReader makeImageReader(Size size, int format, int maxNumImages,
             ImageReader.OnImageAvailableListener listener, Handler handler) {
-        ImageReader reader =  ImageReader.newInstance(size.getWidth(), size.getHeight(), format,
+        ImageReader reader;
+        reader = ImageReader.newInstance(size.getWidth(), size.getHeight(), format,
                 maxNumImages);
         reader.setOnImageAvailableListener(listener, handler);
         if (VERBOSE) Log.v(TAG, "Created ImageReader size " + size);
@@ -114,6 +118,23 @@
     }
 
     /**
+     * Create an ImageWriter and hook up the ImageListener.
+     *
+     * @param inputSurface The input surface of the ImageWriter.
+     * @param maxImages The max number of Images that can be dequeued simultaneously.
+     * @param listener The listener used by this ImageWriter to notify callbacks
+     * @param handler The handler to post listener callbacks.
+     * @return ImageWriter object created.
+     */
+    public static ImageWriter makeImageWriter(
+            Surface inputSurface, int maxImages,
+            ImageWriter.OnImageReleasedListener listener, Handler handler) {
+        ImageWriter writer = ImageWriter.newInstance(inputSurface, maxImages);
+        writer.setOnImageReleasedListener(listener, handler);
+        return writer;
+    }
+
+    /**
      * Close pending images and clean up an {@link android.media.ImageReader} object.
      * @param reader an {@link android.media.ImageReader} to close.
      */
@@ -124,6 +145,16 @@
     }
 
     /**
+     * Close pending images and clean up an {@link android.media.ImageWriter} object.
+     * @param writer an {@link android.media.ImageWriter} to close.
+     */
+    public static void closeImageWriter(ImageWriter writer) {
+        if (writer != null) {
+            writer.close();
+        }
+    }
+
+    /**
      * Dummy listener that release the image immediately once it is available.
      *
      * <p>
@@ -174,11 +205,52 @@
             implements ImageReader.OnImageAvailableListener {
         private final LinkedBlockingQueue<Image> mQueue =
                 new LinkedBlockingQueue<Image>();
+        // Indicate whether this listener will drop images or not,
+        // when the queued images reaches the reader maxImages
+        private final boolean mAsyncMode;
+        // maxImages held by the queue in async mode.
+        private final int mMaxImages;
+
+        /**
+         * Create a synchronous SimpleImageReaderListener that queues the images
+         * automatically when they are available, no image will be dropped. If
+         * the caller doesn't call getImage(), the producer will eventually run
+         * into buffer starvation.
+         */
+        public SimpleImageReaderListener() {
+            mAsyncMode = false;
+            mMaxImages = 0;
+        }
+
+        /**
+         * Create a synchronous/asynchronous SimpleImageReaderListener that
+         * queues the images automatically when they are available. For
+         * asynchronous listener, image will be dropped if the queued images
+         * reach to maxImages queued. If the caller doesn't call getImage(), the
+         * producer will not be blocked. For synchronous listener, no image will
+         * be dropped. If the caller doesn't call getImage(), the producer will
+         * eventually run into buffer starvation.
+         *
+         * @param asyncMode If the listener is operating at asynchronous mode.
+         * @param maxImages The max number of images held by this listener.
+         */
+        /**
+         *
+         * @param asyncMode
+         */
+        public SimpleImageReaderListener(boolean asyncMode, int maxImages) {
+            mAsyncMode = asyncMode;
+            mMaxImages = maxImages;
+        }
 
         @Override
         public void onImageAvailable(ImageReader reader) {
             try {
                 mQueue.put(reader.acquireNextImage());
+                if (mAsyncMode && mQueue.size() >= mMaxImages) {
+                    Image img = mQueue.poll();
+                    img.close();
+                }
             } catch (InterruptedException e) {
                 throw new UnsupportedOperationException(
                         "Can't handle InterruptedException in onImageAvailable");
@@ -196,17 +268,69 @@
             assertNotNull("Wait for an image timed out in " + timeout + "ms", image);
             return image;
         }
+
+        /**
+         * Drain the pending images held by this listener currently.
+         *
+         */
+        public void drain() {
+            for (int i = 0; i < mQueue.size(); i++) {
+                Image image = mQueue.poll();
+                assertNotNull("Unable to get an image", image);
+                image.close();
+            }
+        }
+    }
+
+    public static class SimpleImageWriterListener implements ImageWriter.OnImageReleasedListener {
+        private final Semaphore mImageReleasedSema = new Semaphore(0);
+        private final ImageWriter mWriter;
+        @Override
+        public void onImageReleased(ImageWriter writer) {
+            if (writer != mWriter) {
+                return;
+            }
+
+            if (VERBOSE) {
+                Log.v(TAG, "Input image is released");
+            }
+            mImageReleasedSema.release();
+        }
+
+        public SimpleImageWriterListener(ImageWriter writer) {
+            if (writer == null) {
+                throw new IllegalArgumentException("writer cannot be null");
+            }
+            mWriter = writer;
+        }
+
+        public void waitForImageReleased(long timeoutMs) throws InterruptedException {
+            if (!mImageReleasedSema.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
+                fail("wait for image available timed out after " + timeoutMs + "ms");
+            }
+        }
     }
 
     public static class SimpleCaptureCallback extends CameraCaptureSession.CaptureCallback {
-        private final LinkedBlockingQueue<CaptureResult> mQueue =
-                new LinkedBlockingQueue<CaptureResult>();
+        private final LinkedBlockingQueue<TotalCaptureResult> mQueue =
+                new LinkedBlockingQueue<TotalCaptureResult>();
+        private final LinkedBlockingQueue<CaptureFailure> mFailureQueue =
+                new LinkedBlockingQueue<>();
+        // Pair<CaptureRequest, Long> is a pair of capture request and timestamp.
+        private final LinkedBlockingQueue<Pair<CaptureRequest, Long>> mCaptureStartQueue =
+                new LinkedBlockingQueue<>();
+
         private AtomicLong mNumFramesArrived = new AtomicLong(0);
 
         @Override
         public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request,
-                long timestamp, long frameNumber)
-        {
+                long timestamp, long frameNumber) {
+            try {
+                mCaptureStartQueue.put(new Pair(request, timestamp));
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException(
+                        "Can't handle InterruptedException in onCaptureStarted");
+            }
         }
 
         @Override
@@ -224,6 +348,12 @@
         @Override
         public void onCaptureFailed(CameraCaptureSession session, CaptureRequest request,
                 CaptureFailure failure) {
+            try {
+                mFailureQueue.put(failure);
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException(
+                        "Can't handle InterruptedException in onCaptureFailed");
+            }
         }
 
         @Override
@@ -236,8 +366,33 @@
         }
 
         public CaptureResult getCaptureResult(long timeout) {
+            return getTotalCaptureResult(timeout);
+        }
+
+        public TotalCaptureResult getCaptureResult(long timeout, long timestamp) {
             try {
-                CaptureResult result = mQueue.poll(timeout, TimeUnit.MILLISECONDS);
+                long currentTs = -1L;
+                TotalCaptureResult result;
+                while (true) {
+                    result = mQueue.poll(timeout, TimeUnit.MILLISECONDS);
+                    if (result == null) {
+                        throw new RuntimeException(
+                                "Wait for a capture result timed out in " + timeout + "ms");
+                    }
+                    currentTs = result.get(CaptureResult.SENSOR_TIMESTAMP);
+                    if (currentTs == timestamp) {
+                        return result;
+                    }
+                }
+
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException("Unhandled interrupted exception", e);
+            }
+        }
+
+        public TotalCaptureResult getTotalCaptureResult(long timeout) {
+            try {
+                TotalCaptureResult result = mQueue.poll(timeout, TimeUnit.MILLISECONDS);
                 assertNotNull("Wait for a capture result timed out in " + timeout + "ms", result);
                 return result;
             } catch (InterruptedException e) {
@@ -261,16 +416,82 @@
          */
         public CaptureResult getCaptureResultForRequest(CaptureRequest myRequest,
                 int numResultsWait) {
+            return getTotalCaptureResultForRequest(myRequest, numResultsWait);
+        }
+
+        /**
+         * Get the {@link #TotalCaptureResult total capture result} for a given
+         * {@link #CaptureRequest capture request}.
+         *
+         * @param myRequest The {@link #CaptureRequest capture request} whose
+         *            corresponding {@link #TotalCaptureResult capture result} was
+         *            being waited for
+         * @param numResultsWait Number of frames to wait for the capture result
+         *            before timeout.
+         * @throws TimeoutRuntimeException If more than numResultsWait results are
+         *            seen before the result matching myRequest arrives, or each
+         *            individual wait for result times out after
+         *            {@value #CAPTURE_RESULT_TIMEOUT_MS}ms.
+         */
+        public TotalCaptureResult getTotalCaptureResultForRequest(CaptureRequest myRequest,
+                int numResultsWait) {
+            ArrayList<CaptureRequest> captureRequests = new ArrayList<>(1);
+            captureRequests.add(myRequest);
+            return getTotalCaptureResultsForRequests(captureRequests, numResultsWait)[0];
+        }
+
+        /**
+         * Get an array of {@link #TotalCaptureResult total capture results} for a given list of
+         * {@link #CaptureRequest capture requests}. This can be used when the order of results
+         * may not the same as the order of requests.
+         *
+         * @param captureRequests The list of {@link #CaptureRequest capture requests} whose
+         *            corresponding {@link #TotalCaptureResult capture results} are
+         *            being waited for.
+         * @param numResultsWait Number of frames to wait for the capture results
+         *            before timeout.
+         * @throws TimeoutRuntimeException If more than numResultsWait results are
+         *            seen before all the results matching captureRequests arrives.
+         */
+        public TotalCaptureResult[] getTotalCaptureResultsForRequests(
+                List<CaptureRequest> captureRequests, int numResultsWait) {
             if (numResultsWait < 0) {
                 throw new IllegalArgumentException("numResultsWait must be no less than 0");
             }
+            if (captureRequests == null || captureRequests.size() == 0) {
+                throw new IllegalArgumentException("captureRequests must have at least 1 request.");
+            }
 
-            CaptureResult result;
+            // Create a request -> a list of result indices map that it will wait for.
+            HashMap<CaptureRequest, ArrayList<Integer>> remainingResultIndicesMap = new HashMap<>();
+            for (int i = 0; i < captureRequests.size(); i++) {
+                CaptureRequest request = captureRequests.get(i);
+                ArrayList<Integer> indices = remainingResultIndicesMap.get(request);
+                if (indices == null) {
+                    indices = new ArrayList<>();
+                    remainingResultIndicesMap.put(request, indices);
+                }
+                indices.add(i);
+            }
+
+            TotalCaptureResult[] results = new TotalCaptureResult[captureRequests.size()];
             int i = 0;
             do {
-                result = getCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
-                if (result.getRequest().equals(myRequest)) {
-                    return result;
+                TotalCaptureResult result = getTotalCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
+                CaptureRequest request = result.getRequest();
+                ArrayList<Integer> indices = remainingResultIndicesMap.get(request);
+                if (indices != null) {
+                    results[indices.get(0)] = result;
+                    indices.remove(0);
+
+                    // Remove the entry if all results for this request has been fulfilled.
+                    if (indices.isEmpty()) {
+                        remainingResultIndicesMap.remove(request);
+                    }
+                }
+
+                if (remainingResultIndicesMap.isEmpty()) {
+                    return results;
                 }
             } while (i++ < numResultsWait);
 
@@ -278,10 +499,77 @@
                     + "waiting for " + numResultsWait + " results");
         }
 
+        /**
+         * Get an array list of {@link #CaptureFailure capture failure} with maxNumFailures entries
+         * at most. If it times out before maxNumFailures failures are received, return the failures
+         * received so far.
+         *
+         * @param maxNumFailures The maximal number of failures to return. If it times out before
+         *                       the maximal number of failures are received, return the received
+         *                       failures so far.
+         * @throws UnsupportedOperationException If an error happens while waiting on the failure.
+         */
+        public ArrayList<CaptureFailure> getCaptureFailures(long maxNumFailures) {
+            ArrayList<CaptureFailure> failures = new ArrayList<>();
+            try {
+                for (int i = 0; i < maxNumFailures; i++) {
+                    CaptureFailure failure = mFailureQueue.poll(CAPTURE_RESULT_TIMEOUT_MS,
+                            TimeUnit.MILLISECONDS);
+                    if (failure == null) {
+                        // If waiting on a failure times out, return the failures so far.
+                        break;
+                    }
+                    failures.add(failure);
+                }
+            }  catch (InterruptedException e) {
+                throw new UnsupportedOperationException("Unhandled interrupted exception", e);
+            }
+
+            return failures;
+        }
+
+        /**
+         * Wait until the capture start of a request and expected timestamp arrives or it times
+         * out after a number of capture starts.
+         *
+         * @param request The request for the capture start to wait for.
+         * @param timestamp The timestamp for the capture start to wait for.
+         * @param numCaptureStartsWait The number of capture start events to wait for before timing
+         *                             out.
+         */
+        public void waitForCaptureStart(CaptureRequest request, Long timestamp,
+                int numCaptureStartsWait) throws Exception {
+            Pair<CaptureRequest, Long> expectedShutter = new Pair<>(request, timestamp);
+
+            int i = 0;
+            do {
+                Pair<CaptureRequest, Long> shutter = mCaptureStartQueue.poll(
+                        CAPTURE_RESULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+
+                if (shutter == null) {
+                    throw new TimeoutRuntimeException("Unable to get any more capture start " +
+                            "event after waiting for " + CAPTURE_RESULT_TIMEOUT_MS + " ms.");
+                } else if (expectedShutter.equals(shutter)) {
+                    return;
+                }
+
+            } while (i++ < numCaptureStartsWait);
+
+            throw new TimeoutRuntimeException("Unable to get the expected capture start " +
+                    "event after waiting for " + numCaptureStartsWait + " capture starts");
+        }
+
         public boolean hasMoreResults()
         {
             return mQueue.isEmpty();
         }
+
+        public void drain() {
+            mQueue.clear();
+            mNumFramesArrived.getAndSet(0);
+            mFailureQueue.clear();
+            mCaptureStartQueue.clear();
+        }
     }
 
     /**
@@ -352,8 +640,26 @@
             throws CameraAccessException {
         BlockingSessionCallback sessionListener = new BlockingSessionCallback(listener);
         camera.createCaptureSession(outputSurfaces, sessionListener, handler);
+        CameraCaptureSession session =
+                sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+        assertFalse("Camera session should not be a reprocessable session",
+                session.isReprocessable());
 
-        return sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+        return session;
+    }
+
+    public static CameraCaptureSession configureReprocessableCameraSession(CameraDevice camera,
+            InputConfiguration inputConfiguration, List<Surface> outputSurfaces,
+            CameraCaptureSession.StateCallback listener, Handler handler)
+            throws CameraAccessException {
+        BlockingSessionCallback sessionListener = new BlockingSessionCallback(listener);
+        camera.createReprocessableCaptureSession(inputConfiguration, outputSurfaces,
+                sessionListener, handler);
+        CameraCaptureSession session =
+                sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+        assertTrue("Camera session should be a reprocessable session", session.isReprocessable());
+
+        return session;
     }
 
     public static <T> void assertArrayNotEmpty(T arr, String message) {
@@ -546,7 +852,8 @@
         StreamConfigurationMap configMap =
                 properties.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
         Size[] availableSizes = configMap.getOutputSizes(format);
-        assertArrayNotEmpty(availableSizes, "availableSizes should not be empty");
+        assertArrayNotEmpty(availableSizes, "availableSizes should not be empty for format: "
+                + format);
         if (VERBOSE) Log.v(TAG, "Supported sizes are: " + Arrays.deepToString(availableSizes));
         return availableSizes;
     }
@@ -968,6 +1275,17 @@
         return value;
     }
 
+    public static <T> T getValueNotNull(CameraCharacteristics characteristics,
+            CameraCharacteristics.Key<T> key) {
+        if (characteristics == null) {
+            throw new IllegalArgumentException("Camera characteristics must not be null");
+        }
+
+        T value = characteristics.get(key);
+        assertNotNull("Value of Key " + key.getName() + "shouldn't be null", value);
+        return value;
+    }
+
     /**
      * Get a crop region for a given zoom factor and center position.
      * <p>
@@ -1058,4 +1376,115 @@
         }
         return resultRegions;
     }
+
+    /**
+     * Copy source image data to destination image.
+     *
+     * @param src The source image to be copied from.
+     * @param dst The destination image to be copied to.
+     * @throws IllegalArgumentException If the source and destination images have
+     *             different format, or one of the images is not copyable.
+     */
+    public static void imageCopy(Image src, Image dst) {
+        if (src == null || dst == null) {
+            throw new IllegalArgumentException("Images should be non-null");
+        }
+        if (src.getFormat() != dst.getFormat()) {
+            throw new IllegalArgumentException("Src and dst images should have the same format");
+        }
+        if (src.getFormat() == ImageFormat.PRIVATE ||
+                dst.getFormat() == ImageFormat.PRIVATE) {
+            throw new IllegalArgumentException("PRIVATE format images are not copyable");
+        }
+
+        // TODO: check the owner of the dst image, it must be from ImageWriter, other source may
+        // not be writable. Maybe we should add an isWritable() method in image class.
+
+        Plane[] srcPlanes = src.getPlanes();
+        Plane[] dstPlanes = dst.getPlanes();
+        ByteBuffer srcBuffer = null;
+        ByteBuffer dstBuffer = null;
+        for (int i = 0; i < srcPlanes.length; i++) {
+            srcBuffer = srcPlanes[i].getBuffer();
+            int srcPos = srcBuffer.position();
+            srcBuffer.rewind();
+            dstBuffer = dstPlanes[i].getBuffer();
+            dstBuffer.rewind();
+            dstBuffer.put(srcBuffer);
+            srcBuffer.position(srcPos);
+            dstBuffer.rewind();
+        }
+    }
+
+    /**
+     * <p>
+     * Checks whether the two images are strongly equal.
+     * </p>
+     * <p>
+     * Two images are strongly equal if and only if the data, formats, sizes,
+     * and timestamps are same. For {@link ImageFormat#PRIVATE PRIVATE} format
+     * images, the image data is not not accessible thus the data comparison is
+     * effectively skipped as the number of planes is zero.
+     * </p>
+     * <p>
+     * Note that this method compares the pixel data even outside of the crop
+     * region, which may not be necessary for general use case.
+     * </p>
+     *
+     * @param lhsImg First image to be compared with.
+     * @param rhsImg Second image to be compared with.
+     * @return true if the two images are equal, false otherwise.
+     * @throws IllegalArgumentException If either of image is null.
+     */
+    public static boolean isImageStronglyEqual(Image lhsImg, Image rhsImg) {
+        if (lhsImg == null || rhsImg == null) {
+            throw new IllegalArgumentException("Images should be non-null");
+        }
+
+        if (lhsImg.getFormat() != rhsImg.getFormat()) {
+            Log.i(TAG, "lhsImg format " + lhsImg.getFormat() + " is different with rhsImg format "
+                    + rhsImg.getFormat());
+            return false;
+        }
+
+        if (lhsImg.getWidth() != rhsImg.getWidth()) {
+            Log.i(TAG, "lhsImg width " + lhsImg.getWidth() + " is different with rhsImg width "
+                    + rhsImg.getWidth());
+            return false;
+        }
+
+        if (lhsImg.getHeight() != rhsImg.getHeight()) {
+            Log.i(TAG, "lhsImg height " + lhsImg.getHeight() + " is different with rhsImg height "
+                    + rhsImg.getHeight());
+            return false;
+        }
+
+        if (lhsImg.getTimestamp() != rhsImg.getTimestamp()) {
+            Log.i(TAG, "lhsImg timestamp " + lhsImg.getTimestamp()
+                    + " is different with rhsImg timestamp " + rhsImg.getTimestamp());
+            return false;
+        }
+
+        if (!lhsImg.getCropRect().equals(rhsImg.getCropRect())) {
+            Log.i(TAG, "lhsImg crop rect " + lhsImg.getCropRect()
+                    + " is different with rhsImg crop rect " + rhsImg.getCropRect());
+            return false;
+        }
+
+        // Compare data inside of the image.
+        Plane[] lhsPlanes = lhsImg.getPlanes();
+        Plane[] rhsPlanes = rhsImg.getPlanes();
+        ByteBuffer lhsBuffer = null;
+        ByteBuffer rhsBuffer = null;
+        for (int i = 0; i < lhsPlanes.length; i++) {
+            lhsBuffer = lhsPlanes[i].getBuffer();
+            rhsBuffer = rhsPlanes[i].getBuffer();
+            if (!lhsBuffer.equals(rhsBuffer)) {
+                Log.i(TAG, "byte buffers for plane " +  i + " don't matach.");
+                return false;
+            }
+        }
+
+        return true;
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
index d5bd4b5..42da12e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -188,45 +188,61 @@
                 openDevice(mCameraIds[i]);
 
                 if (!mStaticInfo.isManualLensShadingMapSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " doesn't support lens shading controls, skipping test");
+                    continue;
+                }
+
+                List<Integer> lensShadingMapModes = Arrays.asList(CameraTestUtils.toObject(
+                        mStaticInfo.getAvailableLensShadingMapModesChecked()));
+
+                if (!lensShadingMapModes.contains(STATISTICS_LENS_SHADING_MAP_MODE_ON)) {
                     continue;
                 }
 
                 SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-
-                // Shading map mode OFF, lensShadingMapMode ON, camera device
-                // should output unity maps.
-                requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_OFF);
                 requestBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
                         STATISTICS_LENS_SHADING_MAP_MODE_ON);
 
                 Size previewSz =
                         getMaxPreviewSize(mCamera.getId(), mCameraManager, PREVIEW_SIZE_BOUND);
+                List<Integer> lensShadingModes = Arrays.asList(CameraTestUtils.toObject(
+                        mStaticInfo.getAvailableLensShadingModesChecked()));
 
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, previewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_OFF);
+                // Shading map mode OFF, lensShadingMapMode ON, camera device
+                // should output unity maps.
+                if (lensShadingModes.contains(SHADING_MODE_OFF)) {
+                    requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_OFF);
+                    listener = new SimpleCaptureCallback();
+                    startPreview(requestBuilder, previewSz, listener);
+                    waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+                    verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_OFF);
+                }
 
                 // Shading map mode FAST, lensShadingMapMode ON, camera device
                 // should output valid maps.
-                requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_FAST);
+                if (lensShadingModes.contains(SHADING_MODE_FAST)) {
+                    requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_FAST);
 
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, previewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                // Allow at most one lock OFF state as the exposure is changed once.
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_FAST);
+                    listener = new SimpleCaptureCallback();
+                    startPreview(requestBuilder, previewSz, listener);
+                    waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+                    // Allow at most one lock OFF state as the exposure is changed once.
+                    verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_FAST);
+                }
 
                 // Shading map mode HIGH_QUALITY, lensShadingMapMode ON, camera device
                 // should output valid maps.
-                requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_HIGH_QUALITY);
+                if (lensShadingModes.contains(SHADING_MODE_HIGH_QUALITY)) {
+                    requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_HIGH_QUALITY);
 
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, previewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_HIGH_QUALITY);
+                    listener = new SimpleCaptureCallback();
+                    startPreview(requestBuilder, previewSz, listener);
+                    waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+                    verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_HIGH_QUALITY);
+                }
 
                 stopPreview();
             } finally {
@@ -282,11 +298,6 @@
             try {
                 openDevice(mCameraIds[i]);
 
-                if (mStaticInfo.isHardwareLevelLegacy()) {
-                    Log.i(TAG, "Skipping test on legacy devices");
-                    continue;
-                }
-
                 Size maxPreviewSz = mOrderedPreviewSizes.get(0); // Max preview size.
 
                 // Update preview surface with given size for all sub-tests.
@@ -384,7 +395,7 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-                if (!mStaticInfo.isManualColorCorrectionSupported()) {
+                if (!mStaticInfo.isColorCorrectionSupported()) {
                     Log.i(TAG, "Camera " + id +
                             " doesn't support color correction controls, skipping test");
                     continue;
@@ -466,11 +477,6 @@
             try {
                 openDevice(id);
 
-                if (mStaticInfo.isHardwareLevelLegacy()) {
-                    Log.i(TAG, "Skipping test on legacy devices");
-                    continue;
-                }
-
                 awbModeAndLockTestByCamera();
             } finally {
                 closeDevice();
@@ -556,8 +562,9 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-
-                sceneModeTestByCamera();
+                if (mStaticInfo.isSceneModeSupported()) {
+                    sceneModeTestByCamera();
+                }
             } finally {
                 closeDevice();
             }
@@ -756,35 +763,55 @@
         result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
         validateColorCorrectionResult(result,
                 previewRequestBuilder.get(CaptureRequest.COLOR_CORRECTION_MODE));
-
+        int colorCorrectionMode = CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX;
         // TRANSFORM_MATRIX mode
         // Only test unit gain and identity transform
-        RggbChannelVector UNIT_GAIN = new RggbChannelVector(1.0f, 1.0f, 1.0f, 1.0f);
+        List<Integer> availableControlModes = Arrays.asList(
+                CameraTestUtils.toObject(mStaticInfo.getAvailableControlModesChecked()));
+        List<Integer> availableAwbModes = Arrays.asList(
+                CameraTestUtils.toObject(mStaticInfo.getAwbAvailableModesChecked()));
+        boolean isManualCCSupported =
+                availableControlModes.contains(CaptureRequest.CONTROL_MODE_OFF) ||
+                availableAwbModes.contains(CaptureRequest.CONTROL_AWB_MODE_OFF);
+        if (isManualCCSupported) {
+            if (!availableControlModes.contains(CaptureRequest.CONTROL_MODE_OFF)) {
+                // Only manual AWB mode is supported
+                manualRequestBuilder.set(CaptureRequest.CONTROL_MODE,
+                        CaptureRequest.CONTROL_MODE_AUTO);
+                manualRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE,
+                        CaptureRequest.CONTROL_AWB_MODE_OFF);
+            } else {
+                // All 3A manual controls are supported, it doesn't matter what we set for AWB mode.
+                manualRequestBuilder.set(CaptureRequest.CONTROL_MODE,
+                        CaptureRequest.CONTROL_MODE_OFF);
+            }
 
-        ColorSpaceTransform IDENTITY_TRANSFORM = new ColorSpaceTransform(
-            new Rational[] {
-                ONE_R, ZERO_R, ZERO_R,
-                ZERO_R, ONE_R, ZERO_R,
-                ZERO_R, ZERO_R, ONE_R
-            });
+            RggbChannelVector UNIT_GAIN = new RggbChannelVector(1.0f, 1.0f, 1.0f, 1.0f);
 
-        int colorCorrectionMode = CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX;
-        manualRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);
-        manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, colorCorrectionMode);
-        manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, UNIT_GAIN);
-        manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, IDENTITY_TRANSFORM);
-        request = manualRequestBuilder.build();
-        mSession.capture(request, listener, mHandler);
-        result = listener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
-        RggbChannelVector gains = result.get(CaptureResult.COLOR_CORRECTION_GAINS);
-        ColorSpaceTransform transform = result.get(CaptureResult.COLOR_CORRECTION_TRANSFORM);
-        validateColorCorrectionResult(result, colorCorrectionMode);
-        mCollector.expectEquals("control mode result/request mismatch",
-                CaptureResult.CONTROL_MODE_OFF, result.get(CaptureResult.CONTROL_MODE));
-        mCollector.expectEquals("Color correction gain result/request mismatch",
-                UNIT_GAIN, gains);
-        mCollector.expectEquals("Color correction gain result/request mismatch",
-                IDENTITY_TRANSFORM, transform);
+            ColorSpaceTransform IDENTITY_TRANSFORM = new ColorSpaceTransform(
+                new Rational[] {
+                    ONE_R, ZERO_R, ZERO_R,
+                    ZERO_R, ONE_R, ZERO_R,
+                    ZERO_R, ZERO_R, ONE_R
+                });
+
+            manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, colorCorrectionMode);
+            manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, UNIT_GAIN);
+            manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, IDENTITY_TRANSFORM);
+            request = manualRequestBuilder.build();
+            mSession.capture(request, listener, mHandler);
+            result = listener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
+            RggbChannelVector gains = result.get(CaptureResult.COLOR_CORRECTION_GAINS);
+            ColorSpaceTransform transform = result.get(CaptureResult.COLOR_CORRECTION_TRANSFORM);
+            validateColorCorrectionResult(result, colorCorrectionMode);
+            mCollector.expectEquals("control mode result/request mismatch",
+                    CaptureResult.CONTROL_MODE_OFF, result.get(CaptureResult.CONTROL_MODE));
+            mCollector.expectEquals("Color correction gain result/request mismatch",
+                    UNIT_GAIN, gains);
+            mCollector.expectEquals("Color correction gain result/request mismatch",
+                    IDENTITY_TRANSFORM, transform);
+
+        }
 
         // FAST mode
         colorCorrectionMode = CaptureRequest.COLOR_CORRECTION_MODE_FAST;
@@ -1056,7 +1083,9 @@
     private void aeAutoModeTestLock(int mode) throws Exception {
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
+        if (mStaticInfo.isAeLockSupported()) {
+            requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
+        }
         requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, mode);
         configurePreviewOutput(requestBuilder);
 
@@ -1087,9 +1116,12 @@
         SimpleCaptureCallback listener =  new SimpleCaptureCallback();
 
         CaptureResult[] resultsDuringLock = new CaptureResult[numCapturesDuringLock];
+        boolean canSetAeLock = mStaticInfo.isAeLockSupported();
 
         // Reset the AE lock to OFF, since we are reusing this builder many times
-        requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
+        if (canSetAeLock) {
+            requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
+        }
 
         // Just send several captures with auto AE, lock off.
         CaptureRequest request = requestBuilder.build();
@@ -1098,6 +1130,11 @@
         }
         waitForNumResults(listener, NUM_CAPTURES_BEFORE_LOCK);
 
+        if (!canSetAeLock) {
+            // Without AE lock, the remaining tests items won't work
+            return;
+        }
+
         // Then fire several capture to lock the AE.
         requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
 
@@ -1122,7 +1159,7 @@
 
         // Can't read manual sensor/exposure settings without manual sensor
         if (mStaticInfo.isCapabilitySupported(
-                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
             int sensitivityLocked =
                     getValueNotNull(resultsDuringLock[0], CaptureResult.SENSOR_SENSITIVITY);
             long expTimeLocked =
@@ -1368,73 +1405,70 @@
             return;
         }
 
-        SimpleCaptureCallback listener;
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-
-        Size maxPreviewSz = mOrderedPreviewSizes.get(0); // Max preview size.
-
         int[] toneMapModes = mStaticInfo.getAvailableToneMapModesChecked();
         for (int mode : toneMapModes) {
-            requestBuilder.set(CaptureRequest.TONEMAP_MODE, mode);
             if (VERBOSE) {
                 Log.v(TAG, "Testing tonemap mode " + mode);
             }
 
-            if (mode == CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE) {
-                TonemapCurve tcLinear = new TonemapCurve(
-                        TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR);
-                requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcLinear);
-                // Create a new listener for each run to avoid the results from one run spill
-                // into another run.
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, maxPreviewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
-                        TONEMAP_CURVE_LINEAR);
+            requestBuilder.set(CaptureRequest.TONEMAP_MODE, mode);
+            switch (mode) {
+                case CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE:
+                    TonemapCurve toneCurve = new TonemapCurve(TONEMAP_CURVE_LINEAR,
+                            TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR);
+                    requestBuilder.set(CaptureRequest.TONEMAP_CURVE, toneCurve);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
 
-                TonemapCurve tcSrgb = new TonemapCurve(
-                        TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB);
-                requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcSrgb);
-                // Create a new listener for each run to avoid the results from one run spill
-                // into another run.
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, maxPreviewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
-                        TONEMAP_CURVE_SRGB);
-            } else {
-                // Create a new listener for each run to avoid the results from one run spill
-                // into another run.
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, maxPreviewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
-                        /*inputToneCurve*/null);
+                    toneCurve = new TonemapCurve(TONEMAP_CURVE_SRGB,
+                            TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB);
+                    requestBuilder.set(CaptureRequest.TONEMAP_CURVE, toneCurve);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    break;
+                case CaptureRequest.TONEMAP_MODE_GAMMA_VALUE:
+                    requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 1.0f);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 2.2f);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 5.0f);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    break;
+                case CaptureRequest.TONEMAP_MODE_PRESET_CURVE:
+                    requestBuilder.set(CaptureRequest.TONEMAP_PRESET_CURVE,
+                            CaptureRequest.TONEMAP_PRESET_CURVE_REC709);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    requestBuilder.set(CaptureRequest.TONEMAP_PRESET_CURVE,
+                            CaptureRequest.TONEMAP_PRESET_CURVE_SRGB);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    break;
+                default:
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    break;
             }
         }
 
-        stopPreview();
+
     }
 
     /**
-     * Verify tonemap results.
-     * <p>
-     * Assumes R,G,B channels use the same tone curve
-     * </p>
+     * Test tonemap mode with speficied request settings
      *
-     * @param listener The capture listener used to get the capture results
      * @param numFramesVerified Number of results to be verified
-     * @param tonemapMode Tonemap mode to verify
-     * @param inputToneCurve Tonemap curve used by all 3 channels, ignored when
-     * map mode is not CONTRAST_CURVE.
+     * @param requestBuilder the request builder of settings to be tested
      */
-    private void verifyToneMapModeResults(SimpleCaptureCallback listener, int numFramesVerified,
-            int tonemapMode, float[] inputToneCurve) {
+    private void testToneMapMode (int numFramesVerified,
+            CaptureRequest.Builder requestBuilder)  throws Exception  {
         final int MIN_TONEMAP_CURVE_POINTS = 2;
         final Float ZERO = new Float(0);
         final Float ONE = new Float(1.0f);
 
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
+        int tonemapMode = requestBuilder.get(CaptureRequest.TONEMAP_MODE);
+        Size maxPreviewSz = mOrderedPreviewSizes.get(0); // Max preview size.
+        startPreview(requestBuilder, maxPreviewSz, listener);
+        waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+
         int maxCurvePoints = mStaticInfo.getMaxTonemapCurvePointChecked();
         for (int i = 0; i < numFramesVerified; i++) {
             CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
@@ -1456,6 +1490,14 @@
                  * between request and result, as they may have different array
                  * size.
                  */
+            } else if (tonemapMode == CaptureResult.TONEMAP_MODE_GAMMA_VALUE) {
+                mCollector.expectEquals("Capture result gamma value should match request",
+                        requestBuilder.get(CaptureRequest.TONEMAP_GAMMA),
+                        result.get(CaptureResult.TONEMAP_GAMMA));
+            } else if (tonemapMode == CaptureResult.TONEMAP_MODE_PRESET_CURVE) {
+                mCollector.expectEquals("Capture result preset curve should match request",
+                        requestBuilder.get(CaptureRequest.TONEMAP_PRESET_CURVE),
+                        result.get(CaptureResult.TONEMAP_PRESET_CURVE));
             }
 
             // Tonemap curve result availability and basic sanity check for all modes.
@@ -1472,6 +1514,7 @@
             mCollector.expectInRange("Tonemap curve blue length is out of range",
                     mapBlue.length, MIN_TONEMAP_CURVE_POINTS, maxCurvePoints * 2);
         }
+        stopPreview();
     }
 
     /**
@@ -1485,6 +1528,7 @@
     private void awbModeAndLockTestByCamera() throws Exception {
         int[] awbModes = mStaticInfo.getAwbAvailableModesChecked();
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
+        boolean canSetAwbLock = mStaticInfo.isAwbLockSupported();
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         startPreview(requestBuilder, maxPreviewSize, /*listener*/null);
@@ -1500,7 +1544,7 @@
             verifyCaptureResultForKey(CaptureResult.CONTROL_AWB_MODE, mode, listener,
                     NUM_FRAMES_VERIFIED);
 
-            if (mode == CameraMetadata.CONTROL_AWB_MODE_AUTO) {
+            if (mode == CameraMetadata.CONTROL_AWB_MODE_AUTO && canSetAwbLock) {
                 // Verify color correction transform and gains stay unchanged after a lock.
                 requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);
                 listener = new SimpleCaptureCallback();
@@ -1513,7 +1557,10 @@
                 }
 
             }
-            verifyAwbCaptureResultUnchanged(listener, NUM_FRAMES_VERIFIED);
+            // Don't verify auto mode result if AWB lock is not supported
+            if (mode != CameraMetadata.CONTROL_AWB_MODE_AUTO || canSetAwbLock) {
+                verifyAwbCaptureResultUnchanged(listener, NUM_FRAMES_VERIFIED);
+            }
         }
     }
 
@@ -2021,12 +2068,6 @@
         validatePipelineDepth(result);
     }
 
-    private <T> T getValueNotNull(CaptureResult result, CaptureResult.Key<T> key) {
-        T value = result.get(key);
-        assertNotNull("Value of Key " + key.getName() + " shouldn't be null", value);
-        return value;
-    }
-
     /**
      * Basic verification for the control mode capture result.
      *
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
index 61bf36c..2430dd0 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
@@ -440,17 +440,21 @@
 
         // Keys only present when corresponding control is on are being
         // verified in its own functional test
-        // Only present when tone mapping mode is CONTRAST_CURVE
+        // Only present in certain tonemap mode. Test in CaptureRequestTest.
         waiverKeys.add(CaptureResult.TONEMAP_CURVE);
+        waiverKeys.add(CaptureResult.TONEMAP_GAMMA);
+        waiverKeys.add(CaptureResult.TONEMAP_PRESET_CURVE);
         // Only present when test pattern mode is SOLID_COLOR.
         // TODO: verify this key in test pattern test later
         waiverKeys.add(CaptureResult.SENSOR_TEST_PATTERN_DATA);
         // Only present when STATISTICS_LENS_SHADING_MAP_MODE is ON
         waiverKeys.add(CaptureResult.STATISTICS_LENS_SHADING_CORRECTION_MAP);
-        //  Only present when STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES is ON
+        // Only present when STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES is ON
         waiverKeys.add(CaptureResult.STATISTICS_HOT_PIXEL_MAP);
-        //  Only present when face detection is on
+        // Only present when face detection is on
         waiverKeys.add(CaptureResult.STATISTICS_FACES);
+        // Only present in reprocessing capture result.
+        waiverKeys.add(CaptureResult.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR);
 
         //Keys not required if RAW is not supported
         if (!mStaticInfo.isCapabilitySupported(
@@ -460,6 +464,13 @@
             waiverKeys.add(CaptureResult.SENSOR_NOISE_PROFILE);
         }
 
+        //Keys for depth output capability
+        if (!mStaticInfo.isCapabilitySupported(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT)) {
+            waiverKeys.add(CaptureResult.LENS_POSE_ROTATION);
+            waiverKeys.add(CaptureResult.LENS_POSE_TRANSLATION);
+        }
+
         if (mStaticInfo.getAeMaxRegionsChecked() == 0) {
             waiverKeys.add(CaptureResult.CONTROL_AE_REGIONS);
         }
@@ -478,7 +489,7 @@
          * Hardware Level = LIMITED or LEGACY
          */
         // Key not present if certain control is not supported
-        if (!mStaticInfo.isManualColorCorrectionSupported()) {
+        if (!mStaticInfo.isColorCorrectionSupported()) {
             waiverKeys.add(CaptureResult.COLOR_CORRECTION_GAINS);
             waiverKeys.add(CaptureResult.COLOR_CORRECTION_MODE);
             waiverKeys.add(CaptureResult.COLOR_CORRECTION_TRANSFORM);
@@ -687,6 +698,8 @@
         resultKeys.add(CaptureResult.LENS_FOCAL_LENGTH);
         resultKeys.add(CaptureResult.LENS_FOCUS_DISTANCE);
         resultKeys.add(CaptureResult.LENS_OPTICAL_STABILIZATION_MODE);
+        resultKeys.add(CaptureResult.LENS_POSE_ROTATION);
+        resultKeys.add(CaptureResult.LENS_POSE_TRANSLATION);
         resultKeys.add(CaptureResult.LENS_FOCUS_RANGE);
         resultKeys.add(CaptureResult.LENS_STATE);
         resultKeys.add(CaptureResult.NOISE_REDUCTION_MODE);
@@ -712,7 +725,10 @@
         resultKeys.add(CaptureResult.STATISTICS_LENS_SHADING_MAP_MODE);
         resultKeys.add(CaptureResult.TONEMAP_CURVE);
         resultKeys.add(CaptureResult.TONEMAP_MODE);
+        resultKeys.add(CaptureResult.TONEMAP_GAMMA);
+        resultKeys.add(CaptureResult.TONEMAP_PRESET_CURVE);
         resultKeys.add(CaptureResult.BLACK_LEVEL_LOCK);
+        resultKeys.add(CaptureResult.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR);
 
         return resultKeys;
     }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
index 67fad4e..a8f1b48 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
@@ -645,18 +645,4 @@
 
         return ret;
     }
-
-    private CaptureRequest.Builder prepareCaptureRequestForSurfaces(List<Surface> surfaces)
-            throws Exception {
-        createSession(surfaces);
-
-        CaptureRequest.Builder captureBuilder =
-                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-        assertNotNull("Fail to get captureRequest", captureBuilder);
-        for (Surface surface : surfaces) {
-            captureBuilder.addTarget(surface);
-        }
-
-        return captureBuilder;
-    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
index 8619f73..04375cb 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
@@ -84,6 +84,10 @@
             CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING;
     private static final int RAW =
             CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW;
+    private static final int YUV_REPROCESS =
+            CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING;
+    private static final int OPAQUE_REPROCESS =
+            CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING;
 
     @Override
     public void setContext(Context context) {
@@ -194,16 +198,19 @@
             {
                 //                                           (Key Name)                                     (HW Level)  (Capabilities <Var-Arg>)
                 expectKeyAvailable(c, CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES     , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_MODES                         , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES          , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES                      , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES          , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE                   , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP                    , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE                       , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES                      , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS                       , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES                   , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES     , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES                     , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE                      , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AE                          , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AF                          , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AWB                         , LEGACY   ,   BC                   );
@@ -222,6 +229,7 @@
                 expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE                , LIMITED  ,   NONE                 );
                 expectKeyAvailable(c, CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES                  , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_INPUT_STREAMS                   , OPT      ,   YUV_REPROCESS, OPAQUE_REPROCESS);
                 expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC                     , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC_STALLING            , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_RAW                      , LEGACY   ,   BC                   );
@@ -251,8 +259,10 @@
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_ORIENTATION                              , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_REFERENCE_ILLUMINANT1                    , OPT      ,   RAW                  );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_REFERENCE_ILLUMINANT2                    , OPT      ,   RAW                  );
+                expectKeyAvailable(c, CameraCharacteristics.SHADING_AVAILABLE_MODES                         , LIMITED  ,   MANUAL_POSTPROC, RAW );
                 expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES     , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES   , OPT      ,   RAW                  );
+                expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES, LIMITED  ,   RAW                  );
                 expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT                  , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.SYNC_MAX_LATENCY                                , LEGACY   ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.TONEMAP_AVAILABLE_TONE_MAP_MODES                , FULL     ,   MANUAL_POSTPROC      );
@@ -329,6 +339,10 @@
             BlackLevelPattern blackLevel = mCollector.expectKeyValueNotNull(c,
                     CameraCharacteristics.SENSOR_BLACK_LEVEL_PATTERN);
             if (blackLevel != null) {
+                String blackLevelPatternString = blackLevel.toString();
+                if (VERBOSE) {
+                    Log.v(TAG, "Black level pattern: " + blackLevelPatternString);
+                }
                 int[] blackLevelPattern = new int[BlackLevelPattern.COUNT];
                 blackLevel.copyTo(blackLevelPattern, /*offset*/0);
                 Integer whitelevel = c.get(CameraCharacteristics.SENSOR_INFO_WHITE_LEVEL);
@@ -353,9 +367,8 @@
         int counter = 0;
         final float SIZE_ERROR_MARGIN = 0.03f;
         for (CameraCharacteristics c : mCharacteristics) {
-            int[] actualCapabilities = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
-            assertNotNull("android.request.availableCapabilities must never be null",
-                    actualCapabilities);
+            int[] actualCapabilities = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
 
             // Check if the burst capability is defined
             boolean haveBurstCapability = arrayContains(actualCapabilities,
@@ -365,7 +378,8 @@
                     c.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
             assertNotNull(String.format("No stream configuration map found for: ID %s",
                     mIds[counter]), config);
-            Rect activeRect = c.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+            Rect activeRect = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
             Size sensorSize = new Size(activeRect.width(), activeRect.height());
 
             // Ensure that max YUV size matches max JPEG size
@@ -383,6 +397,12 @@
                      maxYuvSize.getHeight() <= sensorSize.getHeight() * (1.0 + SIZE_ERROR_MARGIN) &&
                      maxYuvSize.getHeight() >= sensorSize.getHeight() * (1.0 - SIZE_ERROR_MARGIN));
 
+            // No need to do null check since framework will generate the key if HAL don't supply
+            boolean haveAeLock = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE);
+            boolean haveAwbLock = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE);
+
             // Ensure that YUV output is fast enough - needs to be at least 20 fps
 
             long maxYuvRate =
@@ -393,7 +413,8 @@
 
             // Ensure that there's an FPS range that's fast enough to capture at above
             // minFrameDuration, for full-auto bursts
-            Range[] fpsRanges = c.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
+            Range[] fpsRanges = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
             float minYuvFps = 1.f / maxYuvRate;
 
             boolean haveFastAeTargetFps = false;
@@ -438,14 +459,25 @@
                                 mIds[counter], maxSyncLatency, MAX_LATENCY_BOUND),
                         haveFastSyncLatency);
                 assertTrue(
-                        "Active array size and max YUV size should be similar",
+                        String.format("BURST-capable camera device %s max YUV size %s should be" +
+                                "close to active array size %s",
+                                mIds[counter], maxYuvSize.toString(), sensorSize.toString()),
                         maxYuvMatchSensor);
+                assertTrue(
+                        String.format("BURST-capable camera device %s does not support AE lock",
+                                mIds[counter]),
+                        haveAeLock);
+                assertTrue(
+                        String.format("BURST-capable camera device %s does not support AWB lock",
+                                mIds[counter]),
+                        haveAwbLock);
             } else {
                 assertTrue(
                         String.format("Camera device %s has all the requirements for BURST" +
                                 " capability but does not report it!", mIds[counter]),
                         !(haveMaxYuv && haveMaxYuvRate && haveFastAeTargetFps &&
-                                haveFastSyncLatency && maxYuvMatchSensor));
+                                haveFastSyncLatency && maxYuvMatchSensor &&
+                                haveAeLock && haveAwbLock));
             }
 
             counter++;
@@ -453,6 +485,79 @@
     }
 
     /**
+     * Check reprocessing capabilities.
+     */
+    public void testReprocessingCharacteristics() {
+        int counter = 0;
+
+        for (CameraCharacteristics c : mCharacteristics) {
+            Log.i(TAG, "testReprocessingCharacteristics: Testing camera ID " + mIds[counter]);
+
+            int[] capabilities = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+            assertNotNull("android.request.availableCapabilities must never be null",
+                    capabilities);
+            boolean supportYUV = arrayContains(capabilities,
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING);
+            boolean supportOpaque = arrayContains(capabilities,
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING);
+            StreamConfigurationMap configs =
+                    c.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+            Integer maxNumInputStreams =
+                    c.get(CameraCharacteristics.REQUEST_MAX_NUM_INPUT_STREAMS);
+
+            int[] inputFormats = configs.getInputFormats();
+
+            assertFalse("Doesn't support reprocessing but report input format: " +
+                    Arrays.toString(inputFormats), !supportYUV && !supportOpaque &&
+                    inputFormats.length > 0);
+
+            assertFalse("Doesn't support reprocessing but max number of input stream is " +
+                    maxNumInputStreams, !supportYUV && !supportOpaque &&
+                    maxNumInputStreams != null && maxNumInputStreams != 0);
+
+            if (supportYUV || supportOpaque) {
+                assertTrue("Support reprocessing but max number of input stream is " +
+                        maxNumInputStreams, maxNumInputStreams != null && maxNumInputStreams > 0);
+
+                // Verify mandatory input formats are supported
+                assertTrue("YUV_420_888 input must be supported for YUV reprocessing",
+                        !supportYUV || arrayContains(inputFormats, ImageFormat.YUV_420_888));
+                assertTrue("PRIVATE input must be supported for OPAQUE reprocessing",
+                        !supportOpaque || arrayContains(inputFormats, ImageFormat.PRIVATE));
+
+                // max capture stall must be reported if one of the reprocessing is supported.
+                final int MAX_ALLOWED_STALL_FRAMES = 4;
+                Integer maxCaptureStall = c.get(CameraCharacteristics.REPROCESS_MAX_CAPTURE_STALL);
+                assertTrue("max capture stall must be non-null and no larger than "
+                        + MAX_ALLOWED_STALL_FRAMES,
+                        maxCaptureStall != null && maxCaptureStall <= MAX_ALLOWED_STALL_FRAMES);
+
+                for (int input : inputFormats) {
+                    // Verify mandatory output formats are supported
+                    int[] outputFormats = configs.getValidOutputFormatsForInput(input);
+                    assertTrue("YUV_420_888 output must be supported for reprocessing",
+                            arrayContains(outputFormats, ImageFormat.YUV_420_888));
+                    assertTrue("JPEG output must be supported for reprocessing",
+                            arrayContains(outputFormats, ImageFormat.JPEG));
+
+                    // Verify camera can output the reprocess input formats and sizes.
+                    Size[] inputSizes = configs.getInputSizes(input);
+                    Size[] outputSizes = configs.getOutputSizes(input);
+                    assertTrue("no input size supported for format " + input,
+                            inputSizes.length > 0);
+                    assertTrue("no output size supported for format " + input,
+                            outputSizes.length > 0);
+
+                    for (Size inputSize : inputSizes) {
+                        assertTrue("Camera must be able to output the supported reprocessing " +
+                            "input size", arrayContains(outputSizes, inputSize));
+                    }
+                }
+            }
+        }
+    }
+
+    /**
      * Cross-check StreamConfigurationMap output
      */
     public void testStreamConfigurationMap() {
@@ -534,29 +639,30 @@
                                 minDuration >= 0);
                     }
 
-                    ImageReader testReader = ImageReader.newInstance(
-                        size.getWidth(),
-                        size.getHeight(),
-                        format,
-                        1);
-                    Surface testSurface = testReader.getSurface();
+                    // todo: test opaque image reader when it's supported.
+                    if (format != ImageFormat.PRIVATE) {
+                        ImageReader testReader = ImageReader.newInstance(
+                            size.getWidth(),
+                            size.getHeight(),
+                            format,
+                            1);
+                        Surface testSurface = testReader.getSurface();
 
-                    assertTrue(
-                        String.format("isOutputSupportedFor fails for config %s, format %d",
-                                size.toString(), format),
-                        config.isOutputSupportedFor(testSurface));
+                        assertTrue(
+                            String.format("isOutputSupportedFor fails for config %s, format %d",
+                                    size.toString(), format),
+                            config.isOutputSupportedFor(testSurface));
 
-                    testReader.close();
-
+                        testReader.close();
+                    }
                 } // sizes
 
                 // Try an invalid size in this format, should round
                 Size invalidSize = findInvalidSize(supportedSizes);
-                // WAR: the intended threshold is 1920, but to counter the bug
-                // in Lollipop framework, we need to set it to 1080 here.
-                // The threshold will be changed back to 1920 in next Android release.
-                int MAX_ROUNDING_WIDTH = 1080;
-                if (invalidSize.getWidth() <= MAX_ROUNDING_WIDTH) {
+                int MAX_ROUNDING_WIDTH = 1920;
+                // todo: test opaque image reader when it's supported.
+                if (format != ImageFormat.PRIVATE &&
+                        invalidSize.getWidth() <= MAX_ROUNDING_WIDTH) {
                     ImageReader testReader = ImageReader.newInstance(
                                                                      invalidSize.getWidth(),
                                                                      invalidSize.getHeight(),
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/FlashlightTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/FlashlightTest.java
new file mode 100644
index 0000000..44b13c3
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/FlashlightTest.java
@@ -0,0 +1,386 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.cts;
+
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
+import android.hardware.camera2.cts.helpers.StaticMetadata;
+import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
+import android.util.Log;
+import android.os.SystemClock;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import static org.mockito.Mockito.*;
+
+/**
+ * <p>Tests for flashlight API.</p>
+ */
+public class FlashlightTest extends Camera2AndroidTestCase {
+    private static final String TAG = "FlashlightTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final int TORCH_DURATION_MS = 1000;
+    private static final int TORCH_TIMEOUT_MS = 3000;
+    private static final int NUM_REGISTERS = 10;
+
+    private ArrayList<String> mFlashCameraIdList;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // initialize the list of cameras that have a flash unit so it won't interfere with
+        // flash tests.
+        mFlashCameraIdList = new ArrayList<String>();
+        for (String id : mCameraIds) {
+            StaticMetadata info =
+                    new StaticMetadata(mCameraManager.getCameraCharacteristics(id),
+                                       CheckLevel.ASSERT, /*collector*/ null);
+            if (info.hasFlash()) {
+                mFlashCameraIdList.add(id);
+            }
+        }
+    }
+
+    public void testSetTorchModeOnOff() throws Exception {
+        if (mFlashCameraIdList.size() == 0)
+            return;
+
+        // reset flash status for all devices with a flash unit
+        for (String id : mFlashCameraIdList) {
+            resetTorchModeStatus(id);
+        }
+
+        // turn on and off torch mode one by one
+        for (String id : mFlashCameraIdList) {
+            CameraManager.TorchCallback torchListener = mock(CameraManager.TorchCallback.class);
+            mCameraManager.registerTorchCallback(torchListener, mHandler); // should get OFF
+
+            mCameraManager.setTorchMode(id, true); // should get ON
+            SystemClock.sleep(TORCH_DURATION_MS);
+            mCameraManager.setTorchMode(id, false); // should get OFF
+
+            // verify corrected numbers of callbacks
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(2)).onTorchModeChanged(id, false);
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(mFlashCameraIdList.size() + 1)).
+                    onTorchModeChanged(anyString(), eq(false));
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(1)).onTorchModeChanged(id, true);
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(1)).onTorchModeChanged(anyString(), eq(true));
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).never()).
+                    onTorchModeUnavailable(anyString());
+
+            mCameraManager.unregisterTorchCallback(torchListener);
+        }
+
+        // turn on all torch modes at once
+        if (mFlashCameraIdList.size() >= 2) {
+            CameraManager.TorchCallback torchListener = mock(CameraManager.TorchCallback.class);
+            mCameraManager.registerTorchCallback(torchListener, mHandler); // should get OFF.
+
+            for (String id : mFlashCameraIdList) {
+                // should get ON for this ID.
+                // may get OFF for previously-on IDs.
+                mCameraManager.setTorchMode(id, true);
+            }
+
+            SystemClock.sleep(TORCH_DURATION_MS);
+
+            for (String id : mFlashCameraIdList) {
+                // should get OFF if not turned off previously.
+                mCameraManager.setTorchMode(id, false);
+            }
+
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).times(mFlashCameraIdList.size())).
+                    onTorchModeChanged(anyString(), eq(true));
+            // one more off for each id due to callback registeration.
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(mFlashCameraIdList.size() * 2)).
+                    onTorchModeChanged(anyString(), eq(false));
+
+            mCameraManager.unregisterTorchCallback(torchListener);
+        }
+    }
+
+    public void testTorchCallback() throws Exception {
+        if (mFlashCameraIdList.size() == 0)
+            return;
+
+        // reset torch mode status
+        for (String id : mFlashCameraIdList) {
+            resetTorchModeStatus(id);
+        }
+
+        CameraManager.TorchCallback torchListener = mock(CameraManager.TorchCallback.class);
+
+        for (int i = 0; i < NUM_REGISTERS; i++) {
+            // should get OFF for all cameras with a flash unit.
+            mCameraManager.registerTorchCallback(torchListener, mHandler);
+            mCameraManager.unregisterTorchCallback(torchListener);
+        }
+
+        verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                times(NUM_REGISTERS * mFlashCameraIdList.size())).
+                onTorchModeChanged(anyString(), eq(false));
+        verify(torchListener, timeout(TORCH_TIMEOUT_MS).never()).
+                onTorchModeChanged(anyString(), eq(true));
+        verify(torchListener, timeout(TORCH_TIMEOUT_MS).never()).
+                onTorchModeUnavailable(anyString());
+
+        // verify passing a null handler will raise IllegalArgumentException
+        try {
+            mCameraManager.registerTorchCallback(torchListener, null);
+            mCameraManager.unregisterTorchCallback(torchListener);
+            fail("should get IllegalArgumentException due to no handler");
+        } catch (IllegalArgumentException e) {
+            // expected exception
+        }
+    }
+
+    public void testCameraDeviceOpenAfterTorchOn() throws Exception {
+        if (mFlashCameraIdList.size() == 0)
+            return;
+
+        for (String id : mFlashCameraIdList) {
+            for (String idToOpen : mCameraIds) {
+                resetTorchModeStatus(id);
+
+                CameraManager.TorchCallback torchListener =
+                        mock(CameraManager.TorchCallback.class);
+
+                // this will trigger OFF for each id in mFlashCameraIdList
+                mCameraManager.registerTorchCallback(torchListener, mHandler);
+
+                // this will trigger ON for id
+                mCameraManager.setTorchMode(id, true);
+                SystemClock.sleep(TORCH_DURATION_MS);
+
+                // if id == idToOpen, this will trigger UNAVAILABLE and may trigger OFF.
+                // this may trigger UNAVAILABLE for any other id in mFlashCameraIdList
+                openDevice(idToOpen);
+
+                // if id == idToOpen, this will trigger OFF.
+                // this may trigger OFF for any other id in mFlashCameraIdList.
+                closeDevice(idToOpen);
+
+                // this may trigger OFF for id if not received previously.
+                mCameraManager.setTorchMode(id, false);
+
+                verify(torchListener, timeout(TORCH_TIMEOUT_MS).times(1)).
+                        onTorchModeChanged(id, true);
+                verify(torchListener, timeout(TORCH_TIMEOUT_MS).times(1)).
+                        onTorchModeChanged(anyString(), eq(true));
+
+                verify(torchListener, timeout(TORCH_TIMEOUT_MS).atLeast(2)).
+                        onTorchModeChanged(id, false);
+                verify(torchListener, atMost(3)).onTorchModeChanged(id, false);
+
+                verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                        atLeast(mFlashCameraIdList.size())).
+                        onTorchModeChanged(anyString(), eq(false));
+                verify(torchListener, atMost(mFlashCameraIdList.size() * 2 + 1)).
+                        onTorchModeChanged(anyString(), eq(false));
+
+                if (hasFlash(idToOpen)) {
+                    verify(torchListener, timeout(TORCH_TIMEOUT_MS).times(1)).
+                            onTorchModeUnavailable(idToOpen);
+                }
+                verify(torchListener, atMost(mFlashCameraIdList.size())).
+                            onTorchModeUnavailable(anyString());
+
+                mCameraManager.unregisterTorchCallback(torchListener);
+            }
+        }
+    }
+
+    public void testTorchModeExceptions() throws Exception {
+        // cameraIdsToTestTorch = all available camera ID + non-existing camera id +
+        //                        non-existing numeric camera id + null
+        String[] cameraIdsToTestTorch = new String[mCameraIds.length + 3];
+        System.arraycopy(mCameraIds, 0, cameraIdsToTestTorch, 0, mCameraIds.length);
+        cameraIdsToTestTorch[mCameraIds.length] = generateNonexistingCameraId();
+        cameraIdsToTestTorch[mCameraIds.length + 1] = generateNonexistingNumericCameraId();
+
+        for (String idToOpen : mCameraIds) {
+            openDevice(idToOpen);
+            try {
+                for (String id : cameraIdsToTestTorch) {
+                    try {
+                        mCameraManager.setTorchMode(id, true);
+                        SystemClock.sleep(TORCH_DURATION_MS);
+                        mCameraManager.setTorchMode(id, false);
+                        if (!hasFlash(id)) {
+                            fail("exception should be thrown when turning on torch mode of a " +
+                                    "camera without a flash");
+                        } else if (id.equals(idToOpen)) {
+                            fail("exception should be thrown when turning on torch mode of an " +
+                                    "opened camera");
+                        }
+                    } catch (CameraAccessException e) {
+                        if ((hasFlash(id) &&  id.equals(idToOpen) &&
+                                    e.getReason() == CameraAccessException.CAMERA_IN_USE) ||
+                            (hasFlash(id) && !id.equals(idToOpen) &&
+                                    e.getReason() == CameraAccessException.MAX_CAMERAS_IN_USE)) {
+                            continue;
+                        }
+                        fail("(" + id + ") not expecting: " + e.getMessage());
+                    } catch (IllegalArgumentException e) {
+                        if (hasFlash(id)) {
+                            fail("not expecting IllegalArgumentException");
+                        }
+                    }
+                }
+            } finally {
+                closeDevice(idToOpen);
+            }
+        }
+    }
+
+    private boolean hasFlash(String cameraId) {
+        return mFlashCameraIdList.contains(cameraId);
+    }
+
+    // make sure the torch status is off.
+    private void resetTorchModeStatus(String cameraId) throws Exception {
+        TorchCallbackListener torchListener = new TorchCallbackListener(cameraId);
+
+        mCameraManager.registerTorchCallback(torchListener, mHandler);
+        mCameraManager.setTorchMode(cameraId, true);
+        mCameraManager.setTorchMode(cameraId, false);
+
+        torchListener.waitOnStatusChange(TorchCallbackListener.STATUS_ON);
+        torchListener.waitOnStatusChange(TorchCallbackListener.STATUS_OFF);
+
+        mCameraManager.unregisterTorchCallback(torchListener);
+    }
+
+    private String generateNonexistingCameraId() {
+        String nonExisting = "none_existing_camera";
+        for (String id : mCameraIds) {
+            if (Arrays.asList(mCameraIds).contains(nonExisting)) {
+                nonExisting += id;
+            } else {
+                break;
+            }
+        }
+        return nonExisting;
+    }
+
+    // return a non-existing and non-negative numeric camera id.
+    private String generateNonexistingNumericCameraId() {
+        int[] numericCameraIds = new int[mCameraIds.length];
+        int size = 0;
+
+        for (String cameraId : mCameraIds) {
+            try {
+                int value = Integer.parseInt(cameraId);
+                if (value >= 0) {
+                    numericCameraIds[size++] = value;
+                }
+            } catch (Throwable e) {
+                // do nothing if camera id isn't an integer
+            }
+        }
+
+        if (size == 0) {
+            return "0";
+        }
+
+        Arrays.sort(numericCameraIds, 0, size);
+        if (numericCameraIds[0] != 0) {
+            return "0";
+        }
+
+        for (int i = 0; i < size - 1; i++) {
+            if (numericCameraIds[i] + 1 < numericCameraIds[i + 1]) {
+                return String.valueOf(numericCameraIds[i] + 1);
+            }
+        }
+
+        if (numericCameraIds[size - 1] != Integer.MAX_VALUE) {
+            return String.valueOf(numericCameraIds[size - 1] + 1);
+        }
+
+        fail("cannot find a non-existing and non-negative numeric camera id");
+        return null;
+    }
+
+    private final class TorchCallbackListener extends CameraManager.TorchCallback {
+        private static final String TAG = "TorchCallbackListener";
+        private static final int STATUS_WAIT_TIMEOUT_MS = 3000;
+        private static final int QUEUE_CAPACITY = 100;
+
+        private String mCameraId;
+        private ArrayBlockingQueue<Integer> mStatusQueue =
+                new ArrayBlockingQueue<Integer>(QUEUE_CAPACITY);
+
+        public static final int STATUS_UNAVAILABLE = 0;
+        public static final int STATUS_OFF = 1;
+        public static final int STATUS_ON = 2;
+
+        public TorchCallbackListener(String cameraId) {
+            // only care about events for this camera id.
+            mCameraId = cameraId;
+        }
+
+        public void waitOnStatusChange(int status) throws Exception {
+            while (true) {
+                Integer s = mStatusQueue.poll(STATUS_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+                if (s == null) {
+                    fail("waiting for status " + status + " timed out");
+                } else if (s.intValue() == status) {
+                    return;
+                }
+            }
+        }
+
+        @Override
+        public void onTorchModeUnavailable(String cameraId) {
+            if (cameraId.equals(mCameraId)) {
+                Integer s = new Integer(STATUS_UNAVAILABLE);
+                try {
+                    mStatusQueue.put(s);
+                } catch (Throwable e) {
+                    fail(e.getMessage());
+                }
+            }
+        }
+
+        @Override
+        public void onTorchModeChanged(String cameraId, boolean enabled) {
+            if (cameraId.equals(mCameraId)) {
+                Integer s;
+                if (enabled) {
+                    s = new Integer(STATUS_ON);
+                } else {
+                    s = new Integer(STATUS_OFF);
+                }
+                try {
+                    mStatusQueue.put(s);
+                } catch (Throwable e) {
+                    fail(e.getMessage());
+                }
+            }
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
index a410775..c10deac 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -34,6 +34,7 @@
 import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.media.Image;
+import android.media.Image.Plane;
 import android.media.ImageReader;
 import android.os.ConditionVariable;
 import android.util.Log;
@@ -154,8 +155,8 @@
     }
 
     /**
-     * Test invalid access of image byte buffers: when an image is closed, further access
-     * of the image byte buffers will get an IllegalStateException. The basic assumption of
+     * Test invalid access of image after an image is closed, further access
+     * of the image will get an IllegalStateException. The basic assumption of
      * this test is that the ImageReader always gives direct byte buffer, which is always true
      * for camera case. For if the produced image byte buffer is not direct byte buffer, there
      * is no guarantee to get an ISE for this invalid access case.
@@ -166,16 +167,12 @@
             try {
                 Log.v(TAG, "Testing invalid image access for Camera " + id);
                 openDevice(id);
-                bufferAccessAfterRelease();
-                fail("ImageReader should throw IllegalStateException when accessing a byte buffer"
-                        + " after the image is closed");
-            } catch (IllegalStateException e) {
-                // Expected.
+                invalidAccessTestAfterClose();
             } finally {
                 closeDevice(id);
+                closeDefaultImageReader();
             }
         }
-
     }
 
     /**
@@ -553,7 +550,8 @@
                 List<Surface> outputSurfaces = new ArrayList<Surface>();
                 outputSurfaces.add(yuvSurface);
                 outputSurfaces.add(captureSurface);
-                CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces);
+                CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces,
+                        CameraDevice.TEMPLATE_PREVIEW);
                 SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
 
                 for (int i = 0; i < NUM_SINGLE_CAPTURE_TESTED; i++) {
@@ -595,34 +593,27 @@
         }
     }
 
-    /**
-     * Test buffer access after release, YUV420_888 single capture is tested. This method
-     * should throw ISE.
-     */
-    private void bufferAccessAfterRelease() throws Exception {
+    private void invalidAccessTestAfterClose() throws Exception {
         final int FORMAT = ImageFormat.YUV_420_888;
         Size[] availableSizes = mStaticInfo.getAvailableSizesForFormatChecked(FORMAT,
                 StaticMetadata.StreamDirection.Output);
+        Image img = null;
+        // Create ImageReader.
+        mListener = new SimpleImageListener();
+        createDefaultImageReader(availableSizes[0], FORMAT, MAX_NUM_IMAGES, mListener);
 
-        try {
-            // Create ImageReader.
-            mListener = new SimpleImageListener();
-            createDefaultImageReader(availableSizes[0], FORMAT, MAX_NUM_IMAGES, mListener);
+        // Start capture.
+        CaptureRequest request = prepareCaptureRequest();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
+        startCapture(request, /* repeating */false, listener, mHandler);
 
-            // Start capture.
-            CaptureRequest request = prepareCaptureRequest();
-            SimpleCaptureCallback listener = new SimpleCaptureCallback();
-            startCapture(request, /* repeating */false, listener, mHandler);
+        mListener.waitForAnyImageAvailable(CAPTURE_WAIT_TIMEOUT_MS);
+        img = mReader.acquireNextImage();
+        Plane firstPlane = img.getPlanes()[0];
+        ByteBuffer buffer = firstPlane.getBuffer();
+        img.close();
 
-            mListener.waitForAnyImageAvailable(CAPTURE_WAIT_TIMEOUT_MS);
-            Image img = mReader.acquireNextImage();
-            ByteBuffer buffer = img.getPlanes()[0].getBuffer();
-            img.close();
-
-            byte data = buffer.get(); // An ISE should be thrown here.
-        } finally {
-            closeDefaultImageReader();
-        }
+        imageInvalidAccessTestAfterClose(img, firstPlane, buffer);
     }
 
     private void bufferFormatTestByCamera(int format, boolean repeating) throws Exception {
@@ -729,28 +720,6 @@
         }
     }
 
-    private CaptureRequest prepareCaptureRequest() throws Exception {
-        List<Surface> outputSurfaces = new ArrayList<Surface>();
-        Surface surface = mReader.getSurface();
-        assertNotNull("Fail to get surface from ImageReader", surface);
-        outputSurfaces.add(surface);
-        return prepareCaptureRequestForSurfaces(outputSurfaces).build();
-    }
-
-    private CaptureRequest.Builder prepareCaptureRequestForSurfaces(List<Surface> surfaces)
-            throws Exception {
-        createSession(surfaces);
-
-        CaptureRequest.Builder captureBuilder =
-                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        assertNotNull("Fail to get captureRequest", captureBuilder);
-        for (Surface surface : surfaces) {
-            captureBuilder.addTarget(surface);
-        }
-
-        return captureBuilder;
-    }
-
     private void validateImage(Size sz, int format, int captureCount,  boolean repeating)
             throws Exception {
         // TODO: Add more format here, and wrap each one as a function.
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageWriterTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageWriterTest.java
new file mode 100644
index 0000000..b081660
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageWriterTest.java
@@ -0,0 +1,314 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+
+import android.graphics.ImageFormat;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
+import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.media.Image;
+import android.media.Image.Plane;
+import android.media.ImageReader;
+import android.media.ImageWriter;
+import android.util.Log;
+import android.util.Size;
+import android.view.Surface;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * <p>
+ * Basic test for ImageWriter APIs. ImageWriter takes the images produced by
+ * camera (via ImageReader), then the data is consumed by either camera input
+ * interface or ImageReader.
+ * </p>
+ */
+public class ImageWriterTest extends Camera2AndroidTestCase {
+    private static final String TAG = "ImageWriterTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    // Max number of images can be accessed simultaneously from ImageReader.
+    private static final int MAX_NUM_IMAGES = 3;
+    private static final int CAMERA_PRIVATE_FORMAT = ImageFormat.PRIVATE;
+    private ImageReader mReaderForWriter;
+    private ImageWriter mWriter;
+
+    @Override
+    protected void tearDown() throws Exception {
+        try {
+            closeImageReader(mReaderForWriter);
+        } finally {
+            mReaderForWriter = null;
+            if (mWriter != null) {
+                mWriter.close();
+                mWriter = null;
+            }
+        }
+
+        super.tearDown();
+    }
+
+    /**
+     * `
+     * <p>
+     * Basic YUV420_888 format ImageWriter ImageReader test that checks the
+     * images produced by camera can be passed correctly by ImageWriter.
+     * </p>
+     * <p>
+     * {@link ImageReader} reads the images produced by {@link CameraDevice}.
+     * The images are then passed to ImageWriter, which produces new images that
+     * are consumed by the second image reader. The images from first
+     * ImageReader should be identical with the images from the second
+     * ImageReader. This validates the basic image input interface of the
+     * ImageWriter. Below is the data path tested:
+     * <li>Explicit data copy: Dequeue an image from ImageWriter, copy the image
+     * data from first ImageReader into this image, then queue this image back
+     * to ImageWriter. This validates the ImageWriter explicit buffer copy
+     * interface.</li>
+     * </p>
+     */
+    public void testYuvImageWriterReaderOperation() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.i(TAG, "Testing Camera " + id);
+                openDevice(id);
+                readerWriterFormatTestByCamera(ImageFormat.YUV_420_888);
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * Basic Opaque format ImageWriter ImageReader test that checks the images
+     * produced by camera can be passed correctly by ImageWriter.
+     * </p>
+     * <p>
+     * {@link ImageReader} reads the images produced by {@link CameraDevice}.
+     * The images are then passed to ImageWriter, which produces new images that
+     * are consumed by the second image reader. The images from first
+     * ImageReader should be identical with the images from the second
+     * ImageReader. This validates the basic image input interface of the
+     * ImageWriter. Because opaque image is inaccessible by client, this test
+     * only covers below path, and only the image info is validated.
+     * <li>Direct image input to ImageWriter. The image from first ImageReader
+     * is directly injected into ImageWriter without needing to dequeue an input
+     * image. ImageWriter will migrate this opaque image into the destination
+     * surface without any data copy.</li>
+     * </p>
+     */
+    public void testOpaqueImageWriterReaderOperation() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.i(TAG, "Testing Camera " + id);
+                openDevice(id);
+                readerWriterFormatTestByCamera(CAMERA_PRIVATE_FORMAT);
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    private void readerWriterFormatTestByCamera(int format)  throws Exception {
+        List<Size> sizes = getSortedSizesForFormat(mCamera.getId(), mCameraManager, format, null);
+        Size maxSize = sizes.get(0);
+        if (VERBOSE) {
+            Log.v(TAG, "Testing size " + maxSize);
+        }
+
+        // Create ImageReader for camera output.
+        SimpleImageReaderListener listenerForCamera  = new SimpleImageReaderListener();
+        createDefaultImageReader(maxSize, format, MAX_NUM_IMAGES, listenerForCamera);
+        if (VERBOSE) {
+            Log.v(TAG, "Created camera output ImageReader");
+        }
+
+        // Create ImageReader for ImageWriter output
+        SimpleImageReaderListener listenerForWriter  = new SimpleImageReaderListener();
+        mReaderForWriter = createImageReader(maxSize, format, MAX_NUM_IMAGES, listenerForWriter);
+        if (VERBOSE) {
+            Log.v(TAG, "Created ImageWriter output ImageReader");
+        }
+
+        // Create ImageWriter
+        Surface surface = mReaderForWriter.getSurface();
+        assertNotNull("Surface from ImageReader shouldn't be null", surface);
+        mWriter = ImageWriter.newInstance(surface, MAX_NUM_IMAGES);
+        SimpleImageWriterListener writerImageListener = new SimpleImageWriterListener(mWriter);
+        mWriter.setOnImageReleasedListener(writerImageListener, mHandler);
+
+        // Start capture: capture 2 images.
+        List<Surface> outputSurfaces = new ArrayList<Surface>();
+        outputSurfaces.add(mReader.getSurface());
+        CaptureRequest.Builder requestBuilder = prepareCaptureRequestForSurfaces(outputSurfaces,
+                CameraDevice.TEMPLATE_PREVIEW);
+        SimpleCaptureCallback captureListener = new SimpleCaptureCallback();
+        // Capture 1st image.
+        startCapture(requestBuilder.build(), /*repeating*/false, captureListener, mHandler);
+        // Capture 2nd image.
+        startCapture(requestBuilder.build(), /*repeating*/false, captureListener, mHandler);
+        if (VERBOSE) {
+            Log.v(TAG, "Submitted 2 captures");
+        }
+
+        // Image from the first ImageReader.
+        Image cameraImage = null;
+        // ImageWriter input image.
+        Image inputImage = null;
+        // Image from the second ImageReader.
+        Image outputImage = null;
+        assertTrue("ImageWriter max images should be " + MAX_NUM_IMAGES,
+                mWriter.getMaxImages() == MAX_NUM_IMAGES);
+        if (format == CAMERA_PRIVATE_FORMAT) {
+            assertTrue("First ImageReader format should be PRIVATE",
+                    mReader.getImageFormat() == CAMERA_PRIVATE_FORMAT);
+            assertTrue("Second ImageReader should be PRIVATE",
+                    mReaderForWriter.getImageFormat() == CAMERA_PRIVATE_FORMAT);
+            assertTrue("Format of first ImageReader should be PRIVATE",
+                    mReader.getImageFormat() == CAMERA_PRIVATE_FORMAT);
+            assertTrue(" Format of second ImageReader should be PRIVATE",
+                    mReaderForWriter.getImageFormat() == CAMERA_PRIVATE_FORMAT);
+            assertTrue(" Format of ImageWriter should be PRIVATE",
+                    mWriter.getFormat() == CAMERA_PRIVATE_FORMAT);
+
+            // Validate 2 images
+            validateOpaqueImages(maxSize, listenerForCamera, listenerForWriter, captureListener,
+                    /*numImages*/2, writerImageListener);
+        } else {
+            // Test case 1: Explicit data copy, only applicable for explicit formats.
+
+            // Get 1st image from first ImageReader, and copy the data to ImageWrtier input image
+            cameraImage = listenerForCamera.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            inputImage = mWriter.dequeueInputImage();
+            inputImage.setTimestamp(cameraImage.getTimestamp());
+            if (VERBOSE) {
+                Log.v(TAG, "Image is being copied");
+            }
+            imageCopy(cameraImage, inputImage);
+            if (VERBOSE) {
+                Log.v(TAG, "Image copy is done");
+            }
+            mCollector.expectTrue(
+                    "ImageWriter 1st input image should match camera 1st output image",
+                    isImageStronglyEqual(inputImage, cameraImage));
+
+            // Image should be closed after queueInputImage call
+            Plane closedPlane = inputImage.getPlanes()[0];
+            ByteBuffer closedBuffer = closedPlane.getBuffer();
+            mWriter.queueInputImage(inputImage);
+            imageInvalidAccessTestAfterClose(inputImage, closedPlane, closedBuffer);
+
+            outputImage = listenerForWriter.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            mCollector.expectTrue("ImageWriter 1st output image should match 1st input image",
+                    isImageStronglyEqual(cameraImage, outputImage));
+            if (DEBUG) {
+                String img1FileName = DEBUG_FILE_NAME_BASE + "/" + maxSize + "_image1_copy.yuv";
+                String outputImg1FileName = DEBUG_FILE_NAME_BASE + "/" + maxSize
+                        + "_outputImage2_copy.yuv";
+                dumpFile(img1FileName, getDataFromImage(cameraImage));
+                dumpFile(outputImg1FileName, getDataFromImage(outputImage));
+            }
+            // No need to close inputImage, as it is sent to the surface after queueInputImage;
+            cameraImage.close();
+            outputImage.close();
+
+            // Make sure ImageWriter listener callback is fired.
+            writerImageListener.waitForImageReleased(CAPTURE_IMAGE_TIMEOUT_MS);
+
+            // Test case 2: Directly inject the image into ImageWriter: works for all formats.
+
+            // Get 2nd image and queue it directly to ImageWrier
+            cameraImage = listenerForCamera.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            // make a copy of image1 data, as it will be closed after queueInputImage;
+            byte[] img1Data = getDataFromImage(cameraImage);
+            if (DEBUG) {
+                String img2FileName = DEBUG_FILE_NAME_BASE + "/" + maxSize + "_image2.yuv";
+                dumpFile(img2FileName, img1Data);
+            }
+
+            // Image should be closed after queueInputImage call
+            closedPlane = cameraImage.getPlanes()[0];
+            closedBuffer = closedPlane.getBuffer();
+            mWriter.queueInputImage(cameraImage);
+            imageInvalidAccessTestAfterClose(cameraImage, closedPlane, closedBuffer);
+
+            outputImage = listenerForWriter.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            byte[] outputImageData = getDataFromImage(outputImage);
+
+            mCollector.expectTrue("ImageWriter 2nd output image should match camera "
+                    + "2nd output image", Arrays.equals(img1Data, outputImageData));
+
+            if (DEBUG) {
+                String outputImgFileName = DEBUG_FILE_NAME_BASE + "/" + maxSize +
+                        "_outputImage2.yuv";
+                dumpFile(outputImgFileName, outputImageData);
+            }
+            // No need to close inputImage, as it is sent to the surface after queueInputImage;
+            outputImage.close();
+
+            // Make sure ImageWriter listener callback is fired.
+            writerImageListener.waitForImageReleased(CAPTURE_IMAGE_TIMEOUT_MS);
+        }
+
+        stopCapture(/*fast*/false);
+        mReader.close();
+        mReader = null;
+        mReaderForWriter.close();
+        mReaderForWriter = null;
+        mWriter.close();
+        mWriter = null;
+    }
+
+    private void validateOpaqueImages(Size maxSize, SimpleImageReaderListener listenerForCamera,
+            SimpleImageReaderListener listenerForWriter, SimpleCaptureCallback captureListener,
+            int numImages, SimpleImageWriterListener writerListener) throws Exception {
+        Image cameraImage;
+        Image outputImage;
+        for (int i = 0; i < numImages; i++) {
+            cameraImage = listenerForCamera.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            CaptureResult result = captureListener.getCaptureResult(CAPTURE_IMAGE_TIMEOUT_MS);
+            validateOpaqueImage(cameraImage, "Opaque image " + i + "from camera: ", maxSize,
+                    result);
+            mWriter.queueInputImage(cameraImage);
+            // Image should be closed after queueInputImage
+            imageInvalidAccessTestAfterClose(cameraImage,
+                    /*closedPlane*/null, /*closedBuffer*/null);
+            outputImage = listenerForWriter.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            validateOpaqueImage(outputImage, "First Opaque image output by ImageWriter: ",
+                    maxSize, result);
+            outputImage.close();
+            writerListener.waitForImageReleased(CAPTURE_IMAGE_TIMEOUT_MS);
+        }
+    }
+
+    private void validateOpaqueImage(Image image, String msg, Size imageSize,
+            CaptureResult result) {
+        assertNotNull("Opaque image Capture result should not be null", result != null);
+        mCollector.expectImageProperties(msg + "Opaque ", image, CAMERA_PRIVATE_FORMAT,
+                imageSize, result.get(CaptureResult.SENSOR_TIMESTAMP));
+        mCollector.expectTrue(msg + "Opaque image number planes should be zero",
+                image.getPlanes().length == 0);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
index bb73629..31a8d98 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -19,16 +19,19 @@
 import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
 
 import android.graphics.ImageFormat;
+import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.CameraTestUtils.SimpleImageReaderListener;
 import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
+import android.hardware.camera2.params.InputConfiguration;
 import android.util.Log;
 import android.util.Pair;
 import android.util.Size;
@@ -36,10 +39,10 @@
 import android.cts.util.DeviceReportLog;
 import android.media.Image;
 import android.media.ImageReader;
+import android.media.ImageWriter;
 import android.os.ConditionVariable;
 import android.os.SystemClock;
 
-import com.android.cts.util.ReportLog;
 import com.android.cts.util.ResultType;
 import com.android.cts.util.ResultUnit;
 import com.android.cts.util.Stat;
@@ -47,6 +50,7 @@
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
@@ -61,9 +65,28 @@
     private static final int NUM_TEST_LOOPS = 5;
     private static final int NUM_MAX_IMAGES = 4;
     private static final int NUM_RESULTS_WAIT = 30;
+    private static final int[] REPROCESS_FORMATS = {ImageFormat.YUV_420_888, ImageFormat.PRIVATE};
+    private final int MAX_REPROCESS_IMAGES = 10;
+    private final int MAX_JPEG_IMAGES = MAX_REPROCESS_IMAGES;
+    private final int MAX_INPUT_IMAGES = MAX_REPROCESS_IMAGES;
+    // ZSL queue depth should be bigger than the max simultaneous reprocessing capture request
+    // count to maintain reasonable number of candidate image for the worse-case.
+    // Here we want to make sure we at most dequeue half of the queue max images for the worst-case.
+    private final int MAX_ZSL_IMAGES = MAX_REPROCESS_IMAGES * 2;
+    private final double REPROCESS_STALL_MARGIN = 0.1;
 
     private DeviceReportLog mReportLog;
 
+    // Used for reading camera output buffers.
+    private ImageReader mCameraZslReader;
+    private SimpleImageReaderListener mCameraZslImageListener;
+    // Used for reprocessing (jpeg) output.
+    private ImageReader mJpegReader;
+    private SimpleImageReaderListener mJpegListener;
+    // Used for reprocessing input.
+    private ImageWriter mWriter;
+    private SimpleCaptureCallback mZslResultListener;
+
     @Override
     protected void setUp() throws Exception {
         mReportLog = new DeviceReportLog();
@@ -121,8 +144,8 @@
                         configureStreamTimes[i] = configureTimeMs - openTimeMs;
 
                         // Blocking start preview (start preview to first image arrives)
-                        CameraTestUtils.SimpleCaptureCallback resultListener =
-                                new CameraTestUtils.SimpleCaptureCallback();
+                        SimpleCaptureCallback resultListener =
+                                new SimpleCaptureCallback();
                         blockingStartPreview(resultListener, imageListener);
                         previewStartedTimeMs = SystemClock.elapsedRealtime();
                         startPreviewTimes[i] = previewStartedTimeMs - configureTimeMs;
@@ -205,8 +228,8 @@
                             mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                     CaptureRequest.Builder captureBuilder =
                             mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-                    CameraTestUtils.SimpleCaptureCallback previewResultListener =
-                            new CameraTestUtils.SimpleCaptureCallback();
+                    SimpleCaptureCallback previewResultListener =
+                            new SimpleCaptureCallback();
                     SimpleTimingResultListener captureResultListener =
                             new SimpleTimingResultListener();
                     SimpleImageListener imageListener = new SimpleImageListener();
@@ -267,6 +290,11 @@
                 mReportLog.printArray("Camera " + id
                         + ": Camera capture result latency", getResultTimes,
                         ResultType.LOWER_BETTER, ResultUnit.MS);
+
+                // Result will not be reported in CTS report if no summary is printed.
+                mReportLog.printSummary("Camera capture result average latency for Camera " + id,
+                        Stat.getAverage(getResultTimes),
+                        ResultType.LOWER_BETTER, ResultUnit.MS);
             }
             finally {
                 closeImageReader();
@@ -275,6 +303,338 @@
         }
     }
 
+    /**
+     * Test reprocessing shot-to-shot latency, i.e., from the time a reprocess
+     * request is issued to the time the reprocess image is returned.
+     *
+     */
+    public void testReprocessingLatency() throws Exception {
+        for (String id : mCameraIds) {
+            for (int format : REPROCESS_FORMATS) {
+                if (!isReprocessSupported(id, format)) {
+                    continue;
+                }
+
+                try {
+                    openDevice(id);
+
+                    reprocessingPerformanceTestByCamera(format, /*asyncMode*/false);
+                } finally {
+                    closeReaderWriters();
+                    closeDevice();
+                }
+            }
+        }
+    }
+
+    /**
+     * Test reprocessing throughput, i.e., how many frames can be reprocessed
+     * during a given amount of time.
+     *
+     */
+    public void testReprocessingThroughput() throws Exception {
+        for (String id : mCameraIds) {
+            for (int format : REPROCESS_FORMATS) {
+                if (!isReprocessSupported(id, format)) {
+                    continue;
+                }
+
+                try {
+                    openDevice(id);
+
+                    reprocessingPerformanceTestByCamera(format, /*asyncMode*/true);
+                } finally {
+                    closeReaderWriters();
+                    closeDevice();
+                }
+            }
+        }
+    }
+
+    /**
+     * Testing reprocessing caused preview stall (frame drops)
+     */
+    public void testReprocessingCaptureStall() throws Exception {
+        for (String id : mCameraIds) {
+            for (int format : REPROCESS_FORMATS) {
+                if (!isReprocessSupported(id, format)) {
+                    continue;
+                }
+
+                try {
+                    openDevice(id);
+
+                    reprocessingCaptureStallTestByCamera(format);
+                } finally {
+                    closeReaderWriters();
+                    closeDevice();
+                }
+            }
+        }
+    }
+
+    private void reprocessingCaptureStallTestByCamera(int reprocessInputFormat) throws Exception {
+        prepareReprocessCapture(reprocessInputFormat);
+
+        // Let it stream for a while before reprocessing
+        startZslStreaming();
+        waitForFrames(NUM_RESULTS_WAIT);
+
+        final int NUM_REPROCESS_TESTED = MAX_REPROCESS_IMAGES / 2;
+        // Prepare several reprocessing request
+        Image[] inputImages = new Image[NUM_REPROCESS_TESTED];
+        CaptureRequest.Builder[] reprocessReqs = new CaptureRequest.Builder[MAX_REPROCESS_IMAGES];
+        for (int i = 0; i < NUM_REPROCESS_TESTED; i++) {
+            inputImages[i] =
+                    mCameraZslImageListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+            TotalCaptureResult zslResult =
+                    mZslResultListener.getCaptureResult(
+                            WAIT_FOR_RESULT_TIMEOUT_MS, inputImages[i].getTimestamp());
+            reprocessReqs[i] = mCamera.createReprocessCaptureRequest(zslResult);
+            reprocessReqs[i].addTarget(mJpegReader.getSurface());
+            mWriter.queueInputImage(inputImages[i]);
+        }
+
+        double[] maxCaptureGapsMs = new double[NUM_REPROCESS_TESTED];
+        double[] averageFrameDurationMs = new double[NUM_REPROCESS_TESTED];
+        Arrays.fill(averageFrameDurationMs, 0.0);
+        final int MAX_REPROCESS_RETURN_FRAME_COUNT = 20;
+        SimpleCaptureCallback reprocessResultListener = new SimpleCaptureCallback();
+        for (int i = 0; i < NUM_REPROCESS_TESTED; i++) {
+            mZslResultListener.drain();
+            CaptureRequest reprocessRequest = reprocessReqs[i].build();
+            mSession.capture(reprocessRequest, reprocessResultListener, mHandler);
+            // Wait for reprocess output jpeg and result come back.
+            reprocessResultListener.getCaptureResultForRequest(reprocessRequest,
+                    CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+            mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+            long numFramesMaybeStalled = mZslResultListener.getTotalNumFrames();
+            assertTrue("Reprocess capture result should be returned in "
+                    + MAX_REPROCESS_RETURN_FRAME_COUNT + " frames",
+                    numFramesMaybeStalled <= MAX_REPROCESS_RETURN_FRAME_COUNT);
+
+            // Need look longer time, as the stutter could happen after the reprocessing
+            // output frame is received.
+            long[] timestampGap = new long[MAX_REPROCESS_RETURN_FRAME_COUNT + 1];
+            Arrays.fill(timestampGap, 0);
+            CaptureResult[] results = new CaptureResult[timestampGap.length];
+            long[] frameDurationsNs = new long[timestampGap.length];
+            for (int j = 0; j < results.length; j++) {
+                results[j] = mZslResultListener.getCaptureResult(
+                        CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+                if (j > 0) {
+                    timestampGap[j] = results[j].get(CaptureResult.SENSOR_TIMESTAMP) -
+                            results[j - 1].get(CaptureResult.SENSOR_TIMESTAMP);
+                    assertTrue("Time stamp should be monotonically increasing",
+                            timestampGap[j] > 0);
+                }
+                frameDurationsNs[j] = results[j].get(CaptureResult.SENSOR_FRAME_DURATION);
+            }
+
+            if (VERBOSE) {
+                Log.i(TAG, "timestampGap: " + Arrays.toString(timestampGap));
+                Log.i(TAG, "frameDurationsNs: " + Arrays.toString(frameDurationsNs));
+            }
+
+            // Get the number of candidate results, calculate the average frame duration
+            // and max timestamp gap.
+            Arrays.sort(timestampGap);
+            double maxTimestampGapMs = timestampGap[timestampGap.length - 1] / 1000000.0;
+            for (int m = 0; m < frameDurationsNs.length; m++) {
+                averageFrameDurationMs[i] += (frameDurationsNs[m] / 1000000.0);
+            }
+            averageFrameDurationMs[i] /= frameDurationsNs.length;
+
+            maxCaptureGapsMs[i] = maxTimestampGapMs;
+        }
+
+        String reprocessType = " YUV reprocessing ";
+        if (reprocessInputFormat == ImageFormat.PRIVATE) {
+            reprocessType = " opaque reprocessing ";
+        }
+
+        mReportLog.printArray("Camera " + mCamera.getId()
+                + ":" + reprocessType + " max capture timestamp gaps", maxCaptureGapsMs,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        mReportLog.printArray("Camera " + mCamera.getId()
+                + ":" + reprocessType + "capture average frame duration", averageFrameDurationMs,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        mReportLog.printSummary("Camera reprocessing average max capture timestamp gaps for Camera "
+                + mCamera.getId(), Stat.getAverage(maxCaptureGapsMs), ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+
+        // The max timestamp gap should be less than (captureStall + 1) x average frame
+        // duration * (1 + error margin).
+        int maxCaptureStallFrames = mStaticInfo.getMaxCaptureStallOrDefault();
+        for (int i = 0; i < maxCaptureGapsMs.length; i++) {
+            double stallDurationBound = averageFrameDurationMs[i] *
+                    (maxCaptureStallFrames + 1) * (1 + REPROCESS_STALL_MARGIN);
+            assertTrue("max capture stall duration should be no larger than ",
+                    maxCaptureGapsMs[i] <= stallDurationBound);
+        }
+    }
+
+    private void reprocessingPerformanceTestByCamera(int reprocessInputFormat, boolean asyncMode)
+            throws Exception {
+        // Prepare the reprocessing capture
+        prepareReprocessCapture(reprocessInputFormat);
+
+        // Start ZSL streaming
+        startZslStreaming();
+        waitForFrames(NUM_RESULTS_WAIT);
+
+        CaptureRequest.Builder[] reprocessReqs = new CaptureRequest.Builder[MAX_REPROCESS_IMAGES];
+        Image[] inputImages = new Image[MAX_REPROCESS_IMAGES];
+        double[] getImageLatenciesMs = new double[MAX_REPROCESS_IMAGES];
+        long startTimeMs;
+        for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+            inputImages[i] =
+                    mCameraZslImageListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+            TotalCaptureResult zslResult =
+                    mZslResultListener.getCaptureResult(
+                            WAIT_FOR_RESULT_TIMEOUT_MS, inputImages[i].getTimestamp());
+            reprocessReqs[i] = mCamera.createReprocessCaptureRequest(zslResult);
+            reprocessReqs[i].addTarget(mJpegReader.getSurface());
+        }
+
+        if (asyncMode) {
+            // async capture: issue all the reprocess requests as quick as possible, then
+            // check the throughput of the output jpegs.
+            for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+                // Could be slow for YUV reprocessing, do it in advance.
+                mWriter.queueInputImage(inputImages[i]);
+            }
+
+            // Submit the requests
+            for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+                mSession.capture(reprocessReqs[i].build(), null, null);
+            }
+
+            // Get images
+            startTimeMs = SystemClock.elapsedRealtime();
+            for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+                mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+                getImageLatenciesMs[i] = SystemClock.elapsedRealtime() - startTimeMs;
+                startTimeMs = SystemClock.elapsedRealtime();
+            }
+        } else {
+            // sync capture: issue reprocess request one by one, only submit next one when
+            // the previous capture image is returned. This is to test the back to back capture
+            // performance.
+            for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+                startTimeMs = SystemClock.elapsedRealtime();
+                mWriter.queueInputImage(inputImages[i]);
+                mSession.capture(reprocessReqs[i].build(), null, null);
+                mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+                getImageLatenciesMs[i] = SystemClock.elapsedRealtime() - startTimeMs;
+            }
+        }
+
+        String reprocessType = " YUV reprocessing ";
+        if (reprocessInputFormat == ImageFormat.PRIVATE) {
+            reprocessType = " opaque reprocessing ";
+        }
+
+        // Report the performance data
+        if (asyncMode) {
+            mReportLog.printArray("Camera " + mCamera.getId()
+                    + ":" + reprocessType + "capture latency", getImageLatenciesMs,
+                    ResultType.LOWER_BETTER, ResultUnit.MS);
+            mReportLog.printSummary("Camera reprocessing average latency for Camera " +
+                    mCamera.getId(), Stat.getAverage(getImageLatenciesMs), ResultType.LOWER_BETTER,
+                    ResultUnit.MS);
+        } else {
+            mReportLog.printArray("Camera " + mCamera.getId()
+                    + ":" + reprocessType + "shot to shot latency", getImageLatenciesMs,
+                    ResultType.LOWER_BETTER, ResultUnit.MS);
+            mReportLog.printSummary("Camera reprocessing shot to shot average latency for Camera " +
+                    mCamera.getId(), Stat.getAverage(getImageLatenciesMs), ResultType.LOWER_BETTER,
+                    ResultUnit.MS);
+        }
+    }
+
+    /**
+     * Start preview and ZSL streaming
+     */
+    private void startZslStreaming() throws Exception {
+        CaptureRequest.Builder zslBuilder =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG);
+        zslBuilder.addTarget(mPreviewSurface);
+        zslBuilder.addTarget(mCameraZslReader.getSurface());
+        mSession.setRepeatingRequest(zslBuilder.build(), mZslResultListener, mHandler);
+    }
+
+    /**
+     * Wait for a certain number of frames, the images and results will be drained from the
+     * listeners to make sure that next reprocessing can get matched results and images.
+     *
+     * @param numFrameWait The number of frames to wait before return, 0 means that
+     *      this call returns immediately after streaming on.
+     */
+    private void waitForFrames(int numFrameWait) {
+        if (numFrameWait < 0) {
+            throw new IllegalArgumentException("numFrameWait " + numFrameWait +
+                    " should be non-negative");
+        }
+
+        if (numFrameWait == 0) {
+            // Let is stream out for a while
+            waitForNumResults(mZslResultListener, numFrameWait);
+            // Drain the pending images, to ensure that all future images have an associated
+            // capture result available.
+            mCameraZslImageListener.drain();
+        }
+    }
+
+    private void closeReaderWriters() {
+        CameraTestUtils.closeImageReader(mCameraZslReader);
+        mCameraZslReader = null;
+        CameraTestUtils.closeImageReader(mJpegReader);
+        mJpegReader = null;
+        CameraTestUtils.closeImageWriter(mWriter);
+        mWriter = null;
+    }
+
+    private void prepareReprocessCapture(int inputFormat)
+                    throws CameraAccessException {
+        // 1. Find the right preview and capture sizes.
+        Size maxPreviewSize = mOrderedPreviewSizes.get(0);
+        Size[] supportedInputSizes =
+                mStaticInfo.getAvailableSizesForFormatChecked(inputFormat,
+                StaticMetadata.StreamDirection.Input);
+        Size maxInputSize = CameraTestUtils.getMaxSize(supportedInputSizes);
+        Size maxJpegSize = mOrderedStillSizes.get(0);
+        updatePreviewSurface(maxPreviewSize);
+        mZslResultListener = new SimpleCaptureCallback();
+
+        // 2. Create camera output ImageReaders.
+        // YUV/Opaque output, camera should support output with input size/format
+        mCameraZslImageListener = new SimpleImageReaderListener(
+                /*asyncMode*/true, MAX_ZSL_IMAGES / 2);
+        mCameraZslReader = CameraTestUtils.makeImageReader(
+                maxInputSize, inputFormat, MAX_ZSL_IMAGES, mCameraZslImageListener, mHandler);
+        // Jpeg reprocess output
+        mJpegListener = new SimpleImageReaderListener();
+        mJpegReader = CameraTestUtils.makeImageReader(
+                maxJpegSize, ImageFormat.JPEG, MAX_JPEG_IMAGES, mJpegListener, mHandler);
+
+        // create camera reprocess session
+        List<Surface> outSurfaces = new ArrayList<Surface>();
+        outSurfaces.add(mPreviewSurface);
+        outSurfaces.add(mCameraZslReader.getSurface());
+        outSurfaces.add(mJpegReader.getSurface());
+        InputConfiguration inputConfig = new InputConfiguration(maxInputSize.getWidth(),
+                maxInputSize.getHeight(), inputFormat);
+        mSessionListener = new BlockingSessionCallback();
+        mSession = CameraTestUtils.configureReprocessableCameraSession(
+                mCamera, inputConfig, outSurfaces, mSessionListener, mHandler);
+
+        // 3. Create ImageWriter for input
+        mWriter = CameraTestUtils.makeImageWriter(
+                mSession.getInputSurface(), MAX_INPUT_IMAGES, /*listener*/null, /*handler*/null);
+
+    }
+
     private void blockingStopPreview() throws Exception {
         stopPreview();
         mSessionListener.getStateWaiter().waitForState(SESSION_CLOSED,
@@ -295,19 +655,6 @@
         imageListener.waitForImageAvailable(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
     }
 
-    private void blockingCaptureImage(CaptureCallback listener,
-            SimpleImageListener imageListener) throws Exception {
-        if (mReaderSurface == null) {
-            throw new IllegalStateException("reader surface must be initialized first");
-        }
-
-        CaptureRequest.Builder captureBuilder =
-                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-        captureBuilder.addTarget(mReaderSurface);
-        mSession.capture(captureBuilder.build(), listener, mHandler);
-        imageListener.waitForImageAvailable(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
-    }
-
     /**
      * Configure reader and preview outputs and wait until done.
      */
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
index 4792a42..ed43b06 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
@@ -24,6 +24,7 @@
 import android.util.Size;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.media.CamcorderProfile;
+import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaCodecInfo.CodecProfileLevel;
@@ -46,6 +47,7 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -82,6 +84,7 @@
     private static final int MAX_NUM_FRAME_DROP_INTERVAL_ALLOWED = 4;
     private List<Size> mSupportedVideoSizes;
     private Surface mRecordingSurface;
+    private Surface mPersistentSurface;
     private MediaRecorder mMediaRecorder;
     private String mOutMediaFileName;
     private int mVideoFrameRate;
@@ -98,19 +101,7 @@
         super.tearDown();
     }
 
-    /**
-     * <p>
-     * Test basic camera recording.
-     * </p>
-     * <p>
-     * This test covers the typical basic use case of camera recording.
-     * MediaRecorder is used to record the audio and video, CamcorderProfile is
-     * used to configure the MediaRecorder. It goes through the pre-defined
-     * CamcorderProfile list, test each profile configuration and validate the
-     * recorded video. Preview is set to the video size.
-     * </p>
-     */
-    public void testBasicRecording() throws Exception {
+    private void doBasicRecording() throws Exception {
         for (int i = 0; i < mCameraIds.length; i++) {
             try {
                 Log.i(TAG, "Testing basic recording for camera " + mCameraIds[i]);
@@ -130,6 +121,43 @@
 
     /**
      * <p>
+     * Test basic camera recording.
+     * </p>
+     * <p>
+     * This test covers the typical basic use case of camera recording.
+     * MediaRecorder is used to record the audio and video, CamcorderProfile is
+     * used to configure the MediaRecorder. It goes through the pre-defined
+     * CamcorderProfile list, test each profile configuration and validate the
+     * recorded video. Preview is set to the video size.
+     * </p>
+     */
+    public void testBasicRecording() throws Exception {
+        doBasicRecording();
+    }
+
+    /**
+     * <p>
+     * Test basic camera recording from a persistent input surface.
+     * </p>
+     * <p>
+     * This test is similar to testBasicRecording except that MediaRecorder records
+     * from a persistent input surface that's used across multiple recording sessions.
+     * </p>
+     */
+    public void testRecordingFromPersistentSurface() throws Exception {
+        mPersistentSurface = MediaCodec.createPersistentInputSurface();
+        assertNotNull("Failed to create persistent input surface!", mPersistentSurface);
+
+        try {
+            doBasicRecording();
+        } finally {
+            mPersistentSurface.release();
+            mPersistentSurface = null;
+        }
+    }
+
+    /**
+     * <p>
      * Test camera recording for all supported sizes by using MediaRecorder.
      * </p>
      * <p>
@@ -439,8 +467,10 @@
      */
     private void basicRecordingTestByCamera(int[] camcorderProfileList) throws Exception {
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
+        List<Range<Integer> > fpsRanges = Arrays.asList(
+                mStaticInfo.getAeAvailableTargetFpsRangesChecked());
+        int cameraId = Integer.valueOf(mCamera.getId());
         for (int profileId : camcorderProfileList) {
-            int cameraId = Integer.valueOf(mCamera.getId());
             if (!CamcorderProfile.hasProfile(cameraId, profileId) ||
                     allowedUnsupported(cameraId, profileId)) {
                 continue;
@@ -448,6 +478,7 @@
 
             CamcorderProfile profile = CamcorderProfile.get(cameraId, profileId);
             Size videoSz = new Size(profile.videoFrameWidth, profile.videoFrameHeight);
+            Range<Integer> fpsRange = new Range(profile.videoFrameRate, profile.videoFrameRate);
             if (mStaticInfo.isHardwareLevelLegacy() &&
                     (videoSz.getWidth() > maxPreviewSize.getWidth() ||
                      videoSz.getHeight() > maxPreviewSize.getHeight())) {
@@ -457,6 +488,9 @@
             assertTrue("Video size " + videoSz.toString() + " for profile ID " + profileId +
                             " must be one of the camera device supported video size!",
                             mSupportedVideoSizes.contains(videoSz));
+            assertTrue("Frame rate range " + fpsRange + " (for profile ID " + profileId +
+                    ") must be one of the camera device available FPS range!",
+                    fpsRanges.contains(fpsRange));
 
             if (VERBOSE) {
                 Log.v(TAG, "Testing camera recording with video size " + videoSz.toString());
@@ -819,8 +853,14 @@
         mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
         mMediaRecorder.setProfile(profile);
         mMediaRecorder.setOutputFile(mOutMediaFileName);
+        if (mPersistentSurface != null) {
+            mMediaRecorder.setInputSurface(mPersistentSurface);
+            mRecordingSurface = mPersistentSurface;
+        }
         mMediaRecorder.prepare();
-        mRecordingSurface = mMediaRecorder.getSurface();
+        if (mPersistentSurface == null) {
+            mRecordingSurface = mMediaRecorder.getSurface();
+        }
         assertNotNull("Recording surface must be non-null!", mRecordingSurface);
         mVideoFrameRate = profile.videoFrameRate;
         mVideoSize = new Size(profile.videoFrameWidth, profile.videoFrameHeight);
@@ -844,8 +884,14 @@
         mMediaRecorder.setVideoSize(sz.getWidth(), sz.getHeight());
         mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
         mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
+        if (mPersistentSurface != null) {
+            mMediaRecorder.setInputSurface(mPersistentSurface);
+            mRecordingSurface = mPersistentSurface;
+        }
         mMediaRecorder.prepare();
-        mRecordingSurface = mMediaRecorder.getSurface();
+        if (mPersistentSurface == null) {
+            mRecordingSurface = mMediaRecorder.getSurface();
+        }
         assertNotNull("Recording surface must be non-null!", mRecordingSurface);
         mVideoFrameRate = videoFrameRate;
         mVideoSize = sz;
@@ -908,7 +954,7 @@
         } else {
             // TODO: need implement MediaCodec path.
         }
-        if (mRecordingSurface != null) {
+        if (mPersistentSurface == null && mRecordingSurface != null) {
             mRecordingSurface.release();
             mRecordingSurface = null;
         }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ReprocessCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ReprocessCaptureTest.java
new file mode 100644
index 0000000..a115fbe
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ReprocessCaptureTest.java
@@ -0,0 +1,1175 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+
+import android.graphics.ImageFormat;
+import android.media.Image;
+import android.media.ImageReader;
+import android.media.ImageWriter;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.cts.helpers.StaticMetadata;
+import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
+import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
+import android.hardware.camera2.params.InputConfiguration;
+import android.util.Log;
+import android.util.Size;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>Tests for Reprocess API.</p>
+ */
+public class ReprocessCaptureTest extends Camera2SurfaceViewTestCase  {
+    private static final String TAG = "ReprocessCaptureTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    private static final int CAPTURE_TIMEOUT_FRAMES = 100;
+    private static final int CAPTURE_TIMEOUT_MS = 3000;
+    private static final int WAIT_FOR_SURFACE_CHANGE_TIMEOUT_MS = 1000;
+    private static final int CAPTURE_TEMPLATE = CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG;
+    private static final int PREVIEW_TEMPLATE = CameraDevice.TEMPLATE_PREVIEW;
+    private static final int NUM_REPROCESS_TEST_LOOP = 3;
+    private static final int NUM_REPROCESS_CAPTURES = 3;
+    private static final int NUM_REPROCESS_BURST = 3;
+    private int mDumpFrameCount = 0;
+
+    // The image reader for the first regular capture
+    private ImageReader mFirstImageReader;
+    // The image reader for the reprocess capture
+    private ImageReader mSecondImageReader;
+    // A flag indicating whether the regular capture and the reprocess capture share the same image
+    // reader. If it's true, mFirstImageReader should be used for regular and reprocess outputs.
+    private boolean mShareOneImageReader;
+    private SimpleImageReaderListener mFirstImageReaderListener;
+    private SimpleImageReaderListener mSecondImageReaderListener;
+    private Surface mInputSurface;
+    private ImageWriter mImageWriter;
+    private SimpleImageWriterListener mImageWriterListener;
+
+    private enum CaptureTestCase {
+        SINGLE_SHOT,
+        BURST,
+        MIXED_BURST,
+        ABORT_CAPTURE,
+        TIMESTAMPS
+    }
+
+    /**
+     * Test YUV_420_888 -> YUV_420_888 with maximal supported sizes
+     */
+    public void testBasicYuvToYuvReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id)) {
+                continue;
+            }
+
+            // YUV_420_888 -> YUV_420_888 must be supported.
+            testBasicReprocessing(id, ImageFormat.YUV_420_888, ImageFormat.YUV_420_888);
+        }
+    }
+
+    /**
+     * Test YUV_420_888 -> JPEG with maximal supported sizes
+     */
+    public void testBasicYuvToJpegReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id)) {
+                continue;
+            }
+
+            // YUV_420_888 -> JPEG must be supported.
+            testBasicReprocessing(id, ImageFormat.YUV_420_888, ImageFormat.JPEG);
+        }
+    }
+
+    /**
+     * Test OPAQUE -> YUV_420_888 with maximal supported sizes
+     */
+    public void testBasicOpaqueToYuvReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            // Opaque -> YUV_420_888 must be supported.
+            testBasicReprocessing(id, ImageFormat.PRIVATE, ImageFormat.YUV_420_888);
+        }
+    }
+
+    /**
+     * Test OPAQUE -> JPEG with maximal supported sizes
+     */
+    public void testBasicOpaqueToJpegReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            // OPAQUE -> JPEG must be supported.
+            testBasicReprocessing(id, ImageFormat.PRIVATE, ImageFormat.JPEG);
+        }
+    }
+
+    /**
+     * Test all supported size and format combinations.
+     */
+    public void testReprocessingSizeFormat() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+                // no preview
+                testReprocessingAllCombinations(id, /*previewSize*/null,
+                        CaptureTestCase.SINGLE_SHOT);
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test all supported size and format combinations with preview.
+     */
+    public void testReprocessingSizeFormatWithPreview() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+                testReprocessingAllCombinations(id, mOrderedPreviewSizes.get(0),
+                        CaptureTestCase.SINGLE_SHOT);
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test recreating reprocessing sessions.
+     */
+    public void testRecreateReprocessingSessions() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                openDevice(id);
+
+                // Test supported input/output formats with the largest sizes.
+                int[] inputFormats =
+                        mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+                for (int inputFormat : inputFormats) {
+                    int[] reprocessOutputFormats =
+                            mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+                    for (int reprocessOutputFormat : reprocessOutputFormats) {
+                        Size maxInputSize =
+                                getMaxSize(inputFormat, StaticMetadata.StreamDirection.Input);
+                        Size maxReprocessOutputSize = getMaxSize(reprocessOutputFormat,
+                                StaticMetadata.StreamDirection.Output);
+
+                        for (int i = 0; i < NUM_REPROCESS_TEST_LOOP; i++) {
+                            testReprocess(id, maxInputSize, inputFormat, maxReprocessOutputSize,
+                                    reprocessOutputFormat,
+                                    /* previewSize */null, NUM_REPROCESS_CAPTURES);
+                        }
+                    }
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Verify issuing cross session capture requests is invalid.
+     */
+    public void testCrossSessionCaptureException() throws Exception {
+        for (String id : mCameraIds) {
+            // Test one supported input format -> JPEG
+            int inputFormat;
+            int reprocessOutputFormat = ImageFormat.JPEG;
+
+            if (isOpaqueReprocessSupported(id)) {
+                inputFormat = ImageFormat.PRIVATE;
+            } else if (isYuvReprocessSupported(id)) {
+                inputFormat = ImageFormat.YUV_420_888;
+            } else {
+                continue;
+            }
+
+            openDevice(id);
+
+            // Test the largest sizes
+            Size inputSize =
+                    getMaxSize(inputFormat, StaticMetadata.StreamDirection.Input);
+            Size reprocessOutputSize =
+                    getMaxSize(reprocessOutputFormat, StaticMetadata.StreamDirection.Output);
+
+            try {
+                if (VERBOSE) {
+                    Log.v(TAG, "testCrossSessionCaptureException: cameraId: " + id +
+                            " inputSize: " + inputSize + " inputFormat: " + inputFormat +
+                            " reprocessOutputSize: " + reprocessOutputSize +
+                            " reprocessOutputFormat: " + reprocessOutputFormat);
+                }
+
+                setupImageReaders(inputSize, inputFormat, reprocessOutputSize,
+                        reprocessOutputFormat, /*maxImages*/1);
+                setupReprocessableSession(/*previewSurface*/null, /*numImageWriterImages*/1);
+
+                TotalCaptureResult result = submitCaptureRequest(mFirstImageReader.getSurface(),
+                        /*inputResult*/null);
+                Image image = mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS);
+
+                // queue the image to image writer
+                mImageWriter.queueInputImage(image);
+
+                // recreate the session
+                closeReprossibleSession();
+                setupReprocessableSession(/*previewSurface*/null, /*numImageWriterImages*/1);
+                try {
+                    TotalCaptureResult reprocessResult;
+                    // issue and wait on reprocess capture request
+                    if (mShareOneImageReader) {
+                        reprocessResult =
+                                submitCaptureRequest(mFirstImageReader.getSurface(), result);
+                    } else {
+                        reprocessResult =
+                                submitCaptureRequest(mSecondImageReader.getSurface(), result);
+                    }
+                    fail("Camera " + id + ": should get IllegalArgumentException for cross " +
+                            "session reprocess captrue.");
+                } catch (IllegalArgumentException e) {
+                    // expected
+                    if (DEBUG) {
+                        Log.d(TAG, "Camera " + id + ": get IllegalArgumentException for cross " +
+                                "session reprocess capture as expected: " + e.getMessage());
+                    }
+                }
+            } finally {
+                closeReprossibleSession();
+                closeImageReaders();
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test burst reprocessing captures with and without preview.
+     */
+    public void testBurstReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+                // no preview
+                testReprocessingAllCombinations(id, /*previewSize*/null, CaptureTestCase.BURST);
+                // with preview
+                testReprocessingAllCombinations(id, mOrderedPreviewSizes.get(0),
+                        CaptureTestCase.BURST);
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test burst captures mixed with regular and reprocess captures with and without preview.
+     */
+    public void testMixedBurstReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+                // no preview
+                testReprocessingAllCombinations(id, /*previewSize*/null,
+                        CaptureTestCase.MIXED_BURST);
+                // with preview
+                testReprocessingAllCombinations(id, mOrderedPreviewSizes.get(0),
+                        CaptureTestCase.MIXED_BURST);
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test aborting reprocess capture requests of the largest input and output sizes for each
+     * supported format.
+     */
+    public void testReprocessAbort() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+
+                int[] supportedInputFormats =
+                    mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+                for (int inputFormat : supportedInputFormats) {
+                    int[] supportedReprocessOutputFormats =
+                            mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+                    for (int reprocessOutputFormat : supportedReprocessOutputFormats) {
+                        testReprocessingMaxSizes(id, inputFormat, reprocessOutputFormat,
+                                /*previewSize*/null, CaptureTestCase.ABORT_CAPTURE);
+                    }
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test reprocess timestamps for the largest input and output sizes for each supported format.
+     */
+    public void testReprocessTimestamps() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+
+                int[] supportedInputFormats =
+                    mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+                for (int inputFormat : supportedInputFormats) {
+                    int[] supportedReprocessOutputFormats =
+                            mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+                    for (int reprocessOutputFormat : supportedReprocessOutputFormats) {
+                        testReprocessingMaxSizes(id, inputFormat, reprocessOutputFormat,
+                                /*previewSize*/null, CaptureTestCase.TIMESTAMPS);
+                    }
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test the input format and output format with the largest input and output sizes.
+     */
+    private void testBasicReprocessing(String cameraId, int inputFormat,
+            int reprocessOutputFormat) throws Exception {
+        try {
+            openDevice(cameraId);
+
+            testReprocessingMaxSizes(cameraId, inputFormat, reprocessOutputFormat,
+                    /* previewSize */null, CaptureTestCase.SINGLE_SHOT);
+        } finally {
+            closeDevice();
+        }
+    }
+
+    /**
+     * Test the input format and output format with the largest input and output sizes for a
+     * certain test case.
+     */
+    private void testReprocessingMaxSizes(String cameraId, int inputFormat,
+            int reprocessOutputFormat, Size previewSize, CaptureTestCase captureTestCase)
+            throws Exception {
+        Size maxInputSize = getMaxSize(inputFormat, StaticMetadata.StreamDirection.Input);
+        Size maxReprocessOutputSize =
+                getMaxSize(reprocessOutputFormat, StaticMetadata.StreamDirection.Output);
+
+        switch (captureTestCase) {
+            case SINGLE_SHOT:
+                testReprocess(cameraId, maxInputSize, inputFormat, maxReprocessOutputSize,
+                        reprocessOutputFormat, previewSize, NUM_REPROCESS_CAPTURES);
+                break;
+            case ABORT_CAPTURE:
+                testReprocessAbort(cameraId, maxInputSize, inputFormat, maxReprocessOutputSize,
+                        reprocessOutputFormat);
+                break;
+            case TIMESTAMPS:
+                testReprocessTimestamps(cameraId, maxInputSize, inputFormat, maxReprocessOutputSize,
+                        reprocessOutputFormat);
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid test case");
+        }
+    }
+
+    /**
+     * Test all input format, input size, output format, and output size combinations.
+     */
+    private void testReprocessingAllCombinations(String cameraId, Size previewSize,
+            CaptureTestCase captureTestCase) throws Exception {
+
+        int[] supportedInputFormats =
+                mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+        for (int inputFormat : supportedInputFormats) {
+            Size[] supportedInputSizes =
+                    mStaticInfo.getAvailableSizesForFormatChecked(inputFormat,
+                    StaticMetadata.StreamDirection.Input);
+
+            for (Size inputSize : supportedInputSizes) {
+                int[] supportedReprocessOutputFormats =
+                        mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+
+                for (int reprocessOutputFormat : supportedReprocessOutputFormats) {
+                    Size[] supportedReprocessOutputSizes =
+                            mStaticInfo.getAvailableSizesForFormatChecked(reprocessOutputFormat,
+                            StaticMetadata.StreamDirection.Output);
+
+                    for (Size reprocessOutputSize : supportedReprocessOutputSizes) {
+                        switch (captureTestCase) {
+                            case SINGLE_SHOT:
+                                testReprocess(cameraId, inputSize, inputFormat,
+                                        reprocessOutputSize, reprocessOutputFormat, previewSize,
+                                        NUM_REPROCESS_CAPTURES);
+                                break;
+                            case BURST:
+                                testReprocessBurst(cameraId, inputSize, inputFormat,
+                                        reprocessOutputSize, reprocessOutputFormat, previewSize,
+                                        NUM_REPROCESS_BURST);
+                                break;
+                            case MIXED_BURST:
+                                testReprocessMixedBurst(cameraId, inputSize, inputFormat,
+                                        reprocessOutputSize, reprocessOutputFormat, previewSize,
+                                        NUM_REPROCESS_BURST);
+                                break;
+                            default:
+                                throw new IllegalArgumentException("Invalid test case");
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Test burst that is mixed with regular and reprocess capture requests.
+     */
+    private void testReprocessMixedBurst(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat, Size previewSize,
+            int numBurst) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessMixedBurst: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat +
+                    " previewSize: " + previewSize + " numBurst: " + numBurst);
+        }
+
+        boolean enablePreview = (previewSize != null);
+        ImageResultHolder[] imageResultHolders = new ImageResultHolder[0];
+
+        try {
+            // totalNumBurst = number of regular burst + number of reprocess burst.
+            int totalNumBurst = numBurst * 2;
+
+            if (enablePreview) {
+                updatePreviewSurface(previewSize);
+            } else {
+                mPreviewSurface = null;
+            }
+
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                totalNumBurst);
+            setupReprocessableSession(mPreviewSurface, /*numImageWriterImages*/numBurst);
+
+            if (enablePreview) {
+                startPreview(mPreviewSurface);
+            }
+
+            // Prepare an array of booleans indicating each capture's type (regular or reprocess)
+            boolean[] isReprocessCaptures = new boolean[totalNumBurst];
+            for (int i = 0; i < totalNumBurst; i++) {
+                if ((i & 1) == 0) {
+                    isReprocessCaptures[i] = true;
+                } else {
+                    isReprocessCaptures[i] = false;
+                }
+            }
+
+            imageResultHolders = doMixedReprocessBurstCapture(isReprocessCaptures);
+            for (ImageResultHolder holder : imageResultHolders) {
+                Image reprocessedImage = holder.getImage();
+                TotalCaptureResult result = holder.getTotalCaptureResult();
+
+                mCollector.expectImageProperties("testReprocessMixedBurst", reprocessedImage,
+                            reprocessOutputFormat, reprocessOutputSize,
+                            result.get(CaptureResult.SENSOR_TIMESTAMP));
+
+                if (DEBUG) {
+                    Log.d(TAG, String.format("camera %s in %dx%d %d out %dx%d %d",
+                            cameraId, inputSize.getWidth(), inputSize.getHeight(), inputFormat,
+                            reprocessOutputSize.getWidth(), reprocessOutputSize.getHeight(),
+                            reprocessOutputFormat));
+                    dumpImage(reprocessedImage,
+                            "/testReprocessMixedBurst_camera" + cameraId + "_" + mDumpFrameCount);
+                    mDumpFrameCount++;
+                }
+            }
+        } finally {
+            for (ImageResultHolder holder : imageResultHolders) {
+                holder.getImage().close();
+            }
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test burst of reprocess capture requests.
+     */
+    private void testReprocessBurst(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat, Size previewSize,
+            int numBurst) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessBurst: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat +
+                    " previewSize: " + previewSize + " numBurst: " + numBurst);
+        }
+
+        boolean enablePreview = (previewSize != null);
+        ImageResultHolder[] imageResultHolders = new ImageResultHolder[0];
+
+        try {
+            if (enablePreview) {
+                updatePreviewSurface(previewSize);
+            } else {
+                mPreviewSurface = null;
+            }
+
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                numBurst);
+            setupReprocessableSession(mPreviewSurface, numBurst);
+
+            if (enablePreview) {
+                startPreview(mPreviewSurface);
+            }
+
+            imageResultHolders = doReprocessBurstCapture(numBurst);
+            for (ImageResultHolder holder : imageResultHolders) {
+                Image reprocessedImage = holder.getImage();
+                TotalCaptureResult result = holder.getTotalCaptureResult();
+
+                mCollector.expectImageProperties("testReprocessBurst", reprocessedImage,
+                            reprocessOutputFormat, reprocessOutputSize,
+                            result.get(CaptureResult.SENSOR_TIMESTAMP));
+
+                if (DEBUG) {
+                    Log.d(TAG, String.format("camera %s in %dx%d %d out %dx%d %d",
+                            cameraId, inputSize.getWidth(), inputSize.getHeight(), inputFormat,
+                            reprocessOutputSize.getWidth(), reprocessOutputSize.getHeight(),
+                            reprocessOutputFormat));
+                    dumpImage(reprocessedImage,
+                            "/testReprocessBurst_camera" + cameraId + "_" + mDumpFrameCount);
+                    mDumpFrameCount++;
+                }
+            }
+        } finally {
+            for (ImageResultHolder holder : imageResultHolders) {
+                holder.getImage().close();
+            }
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test a sequences of reprocess capture requests.
+     */
+    private void testReprocess(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat, Size previewSize,
+            int numReprocessCaptures) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocess: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat +
+                    " previewSize: " + previewSize);
+        }
+
+        boolean enablePreview = (previewSize != null);
+
+        try {
+            if (enablePreview) {
+                updatePreviewSurface(previewSize);
+            } else {
+                mPreviewSurface = null;
+            }
+
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                    /*maxImages*/1);
+            setupReprocessableSession(mPreviewSurface, /*numImageWriterImages*/1);
+
+            if (enablePreview) {
+                startPreview(mPreviewSurface);
+            }
+
+            for (int i = 0; i < numReprocessCaptures; i++) {
+                ImageResultHolder imageResultHolder = null;
+
+                try {
+                    imageResultHolder = doReprocessCapture();
+                    Image reprocessedImage = imageResultHolder.getImage();
+                    TotalCaptureResult result = imageResultHolder.getTotalCaptureResult();
+
+                    mCollector.expectImageProperties("testReprocess", reprocessedImage,
+                            reprocessOutputFormat, reprocessOutputSize,
+                            result.get(CaptureResult.SENSOR_TIMESTAMP));
+
+                    if (DEBUG) {
+                        Log.d(TAG, String.format("camera %s in %dx%d %d out %dx%d %d",
+                                cameraId, inputSize.getWidth(), inputSize.getHeight(), inputFormat,
+                                reprocessOutputSize.getWidth(), reprocessOutputSize.getHeight(),
+                                reprocessOutputFormat));
+
+                        dumpImage(reprocessedImage,
+                                "/testReprocess_camera" + cameraId + "_" + mDumpFrameCount);
+                        mDumpFrameCount++;
+                    }
+                } finally {
+                    if (imageResultHolder != null) {
+                        imageResultHolder.getImage().close();
+                    }
+                }
+            }
+        } finally {
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test aborting a burst reprocess capture and multiple single reprocess captures.
+     */
+    private void testReprocessAbort(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessAbort: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat);
+        }
+
+        try {
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                    NUM_REPROCESS_CAPTURES);
+            setupReprocessableSession(/*previewSurface*/null, NUM_REPROCESS_CAPTURES);
+
+            // Test two cases: submitting reprocess requests one by one and in a burst.
+            boolean submitInBursts[] = {false, true};
+            for (boolean submitInBurst : submitInBursts) {
+                // Prepare reprocess capture requests.
+                ArrayList<CaptureRequest> reprocessRequests =
+                        new ArrayList<>(NUM_REPROCESS_CAPTURES);
+
+                for (int i = 0; i < NUM_REPROCESS_CAPTURES; i++) {
+                    TotalCaptureResult result = submitCaptureRequest(mFirstImageReader.getSurface(),
+                            /*inputResult*/null);
+
+                    mImageWriter.queueInputImage(
+                            mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS));
+                    CaptureRequest.Builder builder = mCamera.createReprocessCaptureRequest(result);
+                    if (mShareOneImageReader) {
+                        builder.addTarget(mFirstImageReader.getSurface());
+                    } else {
+                        builder.addTarget(mSecondImageReader.getSurface());
+                    }
+                    reprocessRequests.add(builder.build());
+                }
+
+                SimpleCaptureCallback captureCallback = new SimpleCaptureCallback();
+
+                // Submit reprocess capture requests.
+                if (submitInBurst) {
+                    mSession.captureBurst(reprocessRequests, captureCallback, mHandler);
+                } else {
+                    for (CaptureRequest request : reprocessRequests) {
+                        mSession.capture(request, captureCallback, mHandler);
+                    }
+                }
+
+                // Abort after getting the first result
+                TotalCaptureResult reprocessResult =
+                        captureCallback.getTotalCaptureResultForRequest(reprocessRequests.get(0),
+                        CAPTURE_TIMEOUT_FRAMES);
+                mSession.abortCaptures();
+
+                // Wait until the session is ready again.
+                mSessionListener.getStateWaiter().waitForState(
+                        BlockingSessionCallback.SESSION_READY, SESSION_CLOSE_TIMEOUT_MS);
+
+                // Gather all failed requests.
+                ArrayList<CaptureFailure> failures =
+                        captureCallback.getCaptureFailures(NUM_REPROCESS_CAPTURES - 1);
+                ArrayList<CaptureRequest> failedRequests = new ArrayList<>();
+                for (CaptureFailure failure : failures) {
+                    failedRequests.add(failure.getRequest());
+                }
+
+                // For each request that didn't fail must have a valid result.
+                for (int i = 1; i < reprocessRequests.size(); i++) {
+                    CaptureRequest request = reprocessRequests.get(i);
+                    if (!failedRequests.contains(request)) {
+                        captureCallback.getTotalCaptureResultForRequest(request,
+                                CAPTURE_TIMEOUT_FRAMES);
+                    }
+                }
+
+                // Drain the image reader listeners.
+                mFirstImageReaderListener.drain();
+                if (!mShareOneImageReader) {
+                    mSecondImageReaderListener.drain();
+                }
+
+                // Make sure all input surfaces are released.
+                for (int i = 0; i < NUM_REPROCESS_CAPTURES; i++) {
+                    mImageWriterListener.waitForImageReleased(CAPTURE_TIMEOUT_MS);
+                }
+            }
+        } finally {
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test timestamps for reprocess requests. Reprocess request's shutter timestamp, result's
+     * sensor timestamp, and output image's timestamp should match the reprocess input's timestamp.
+     */
+    private void testReprocessTimestamps(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessTimestamps: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat);
+        }
+
+        try {
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                    NUM_REPROCESS_CAPTURES);
+            setupReprocessableSession(/*previewSurface*/null, NUM_REPROCESS_CAPTURES);
+
+            // Prepare reprocess capture requests.
+            ArrayList<CaptureRequest> reprocessRequests = new ArrayList<>(NUM_REPROCESS_CAPTURES);
+            ArrayList<Long> expectedTimestamps = new ArrayList<>(NUM_REPROCESS_CAPTURES);
+
+            for (int i = 0; i < NUM_REPROCESS_CAPTURES; i++) {
+                TotalCaptureResult result = submitCaptureRequest(mFirstImageReader.getSurface(),
+                        /*inputResult*/null);
+
+                mImageWriter.queueInputImage(
+                        mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS));
+                CaptureRequest.Builder builder = mCamera.createReprocessCaptureRequest(result);
+                if (mShareOneImageReader) {
+                    builder.addTarget(mFirstImageReader.getSurface());
+                } else {
+                    builder.addTarget(mSecondImageReader.getSurface());
+                }
+                reprocessRequests.add(builder.build());
+                // Reprocess result's timestamp should match input image's timestamp.
+                expectedTimestamps.add(result.get(CaptureResult.SENSOR_TIMESTAMP));
+            }
+
+            // Submit reprocess requests.
+            SimpleCaptureCallback captureCallback = new SimpleCaptureCallback();
+            mSession.captureBurst(reprocessRequests, captureCallback, mHandler);
+
+            // Verify we get the expected timestamps.
+            for (int i = 0; i < reprocessRequests.size(); i++) {
+                captureCallback.waitForCaptureStart(reprocessRequests.get(i),
+                        expectedTimestamps.get(i), CAPTURE_TIMEOUT_FRAMES);
+            }
+
+            TotalCaptureResult[] reprocessResults =
+                    captureCallback.getTotalCaptureResultsForRequests(reprocessRequests,
+                    CAPTURE_TIMEOUT_FRAMES);
+
+            for (int i = 0; i < expectedTimestamps.size(); i++) {
+                // Verify the result timestamps match the input image's timestamps.
+                long expected = expectedTimestamps.get(i);
+                long timestamp = reprocessResults[i].get(CaptureResult.SENSOR_TIMESTAMP);
+                assertEquals("Reprocess result timestamp (" + timestamp + ") doesn't match input " +
+                        "image's timestamp (" + expected + ")", expected, timestamp);
+
+                // Verify the reprocess output image timestamps match the input image's timestamps.
+                Image image;
+                if (mShareOneImageReader) {
+                    image = mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS);
+                } else {
+                    image = mSecondImageReaderListener.getImage(CAPTURE_TIMEOUT_MS);
+                }
+                timestamp = image.getTimestamp();
+                image.close();
+
+                assertEquals("Reprocess output timestamp (" + timestamp + ") doesn't match input " +
+                        "image's timestamp (" + expected + ")", expected, timestamp);
+            }
+
+            // Make sure all input surfaces are released.
+            for (int i = 0; i < NUM_REPROCESS_CAPTURES; i++) {
+                mImageWriterListener.waitForImageReleased(CAPTURE_TIMEOUT_MS);
+            }
+        } finally {
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Set up two image readers: one for regular capture (used for reprocess input) and one for
+     * reprocess capture.
+     */
+    private void setupImageReaders(Size inputSize, int inputFormat, Size reprocessOutputSize,
+            int reprocessOutputFormat, int maxImages) {
+
+        mShareOneImageReader = false;
+        // If the regular output and reprocess output have the same size and format,
+        // they can share one image reader.
+        if (inputFormat == reprocessOutputFormat &&
+                inputSize.equals(reprocessOutputSize)) {
+            maxImages *= 2;
+            mShareOneImageReader = true;
+        }
+        // create an ImageReader for the regular capture
+        mFirstImageReaderListener = new SimpleImageReaderListener();
+        mFirstImageReader = makeImageReader(inputSize, inputFormat, maxImages,
+                mFirstImageReaderListener, mHandler);
+
+        if (!mShareOneImageReader) {
+            // create an ImageReader for the reprocess capture
+            mSecondImageReaderListener = new SimpleImageReaderListener();
+            mSecondImageReader = makeImageReader(reprocessOutputSize, reprocessOutputFormat,
+                    maxImages, mSecondImageReaderListener, mHandler);
+        }
+    }
+
+    /**
+     * Close two image readers.
+     */
+    private void closeImageReaders() {
+        CameraTestUtils.closeImageReader(mFirstImageReader);
+        mFirstImageReader = null;
+        CameraTestUtils.closeImageReader(mSecondImageReader);
+        mSecondImageReader = null;
+    }
+
+    /**
+     * Set up a reprocessable session and create an ImageWriter with the sessoin's input surface.
+     */
+    private void setupReprocessableSession(Surface previewSurface, int numImageWriterImages)
+            throws Exception {
+        // create a reprocessable capture session
+        List<Surface> outSurfaces = new ArrayList<Surface>();
+        outSurfaces.add(mFirstImageReader.getSurface());
+        if (!mShareOneImageReader) {
+            outSurfaces.add(mSecondImageReader.getSurface());
+        }
+        if (previewSurface != null) {
+            outSurfaces.add(previewSurface);
+        }
+
+        InputConfiguration inputConfig = new InputConfiguration(mFirstImageReader.getWidth(),
+                mFirstImageReader.getHeight(), mFirstImageReader.getImageFormat());
+        String inputConfigString = inputConfig.toString();
+        if (VERBOSE) {
+            Log.v(TAG, "InputConfiguration: " + inputConfigString);
+        }
+        assertTrue(String.format("inputConfig is wrong: %dx%d format %d. Expect %dx%d format %d",
+                inputConfig.getWidth(), inputConfig.getHeight(), inputConfig.getFormat(),
+                mFirstImageReader.getWidth(), mFirstImageReader.getHeight(),
+                mFirstImageReader.getImageFormat()),
+                inputConfig.getWidth() == mFirstImageReader.getWidth() &&
+                inputConfig.getHeight() == mFirstImageReader.getHeight() &&
+                inputConfig.getFormat() == mFirstImageReader.getImageFormat());
+
+        mSessionListener = new BlockingSessionCallback();
+        mSession = configureReprocessableCameraSession(mCamera, inputConfig, outSurfaces,
+                mSessionListener, mHandler);
+
+        // create an ImageWriter
+        mInputSurface = mSession.getInputSurface();
+        mImageWriter = ImageWriter.newInstance(mInputSurface,
+                numImageWriterImages);
+
+        mImageWriterListener = new SimpleImageWriterListener(mImageWriter);
+        mImageWriter.setOnImageReleasedListener(mImageWriterListener, mHandler);
+    }
+
+    /**
+     * Close the reprocessable session and ImageWriter.
+     */
+    private void closeReprossibleSession() {
+        mInputSurface = null;
+
+        if (mSession != null) {
+            mSession.close();
+            mSession = null;
+        }
+
+        if (mImageWriter != null) {
+            mImageWriter.close();
+            mImageWriter = null;
+        }
+    }
+
+    /**
+     * Do one reprocess capture.
+     */
+    private ImageResultHolder doReprocessCapture() throws Exception {
+        return doReprocessBurstCapture(/*numBurst*/1)[0];
+    }
+
+    /**
+     * Do a burst of reprocess captures.
+     */
+    private ImageResultHolder[] doReprocessBurstCapture(int numBurst) throws Exception {
+        boolean[] isReprocessCaptures = new boolean[numBurst];
+        for (int i = 0; i < numBurst; i++) {
+            isReprocessCaptures[i] = true;
+        }
+
+        return doMixedReprocessBurstCapture(isReprocessCaptures);
+    }
+
+    /**
+     * Do a burst of captures that are mixed with regular and reprocess captures.
+     *
+     * @param isReprocessCaptures An array whose elements indicate whether it's a reprocess capture
+     *                            request. If the element is true, it represents a reprocess capture
+     *                            request. If the element is false, it represents a regular capture
+     *                            request. The size of the array is the number of capture requests
+     *                            in the burst.
+     */
+    private ImageResultHolder[] doMixedReprocessBurstCapture(boolean[] isReprocessCaptures)
+            throws Exception {
+        if (isReprocessCaptures == null || isReprocessCaptures.length <= 0) {
+            throw new IllegalArgumentException("isReprocessCaptures must have at least 1 capture.");
+        }
+
+        TotalCaptureResult[] results = new TotalCaptureResult[isReprocessCaptures.length];
+        for (int i = 0; i < isReprocessCaptures.length; i++) {
+            // submit a capture and get the result if this entry is a reprocess capture.
+            if (isReprocessCaptures[i]) {
+                results[i] = submitCaptureRequest(mFirstImageReader.getSurface(),
+                        /*inputResult*/null);
+                mImageWriter.queueInputImage(
+                        mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS));
+            }
+        }
+
+        Surface[] outputSurfaces = new Surface[isReprocessCaptures.length];
+        for (int i = 0; i < isReprocessCaptures.length; i++) {
+            if (mShareOneImageReader) {
+                outputSurfaces[i] = mFirstImageReader.getSurface();
+            } else {
+                outputSurfaces[i] = mSecondImageReader.getSurface();
+            }
+        }
+
+        TotalCaptureResult[] finalResults = submitMixedCaptureBurstRequest(outputSurfaces, results);
+
+        ImageResultHolder[] holders = new ImageResultHolder[isReprocessCaptures.length];
+        for (int i = 0; i < isReprocessCaptures.length; i++) {
+            Image image;
+            if (mShareOneImageReader) {
+                image = mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS);
+            } else {
+                image = mSecondImageReaderListener.getImage(CAPTURE_TIMEOUT_MS);
+            }
+            holders[i] = new ImageResultHolder(image, finalResults[i]);
+        }
+
+        return holders;
+    }
+
+    /**
+     * Start preview without a listener.
+     */
+    private void startPreview(Surface previewSurface) throws Exception {
+        CaptureRequest.Builder builder = mCamera.createCaptureRequest(PREVIEW_TEMPLATE);
+        builder.addTarget(previewSurface);
+        mSession.setRepeatingRequest(builder.build(), null, mHandler);
+    }
+
+    /**
+     * Issue a capture request and return the result. If inputResult is null, it's a regular
+     * request. Otherwise, it's a reprocess request.
+     */
+    private TotalCaptureResult submitCaptureRequest(Surface output,
+            TotalCaptureResult inputResult) throws Exception {
+        Surface[] outputs = new Surface[1];
+        outputs[0] = output;
+        TotalCaptureResult[] inputResults = new TotalCaptureResult[1];
+        inputResults[0] = inputResult;
+
+        return submitMixedCaptureBurstRequest(outputs, inputResults)[0];
+    }
+
+    /**
+     * Submit a burst request mixed with regular and reprocess requests.
+     *
+     * @param outputs An array of output surfaces. One output surface will be used in one request
+     *                so the length of the array is the number of requests in a burst request.
+     * @param inputResults An array of input results. If it's null, all requests are regular
+     *                     requests. If an element is null, that element represents a regular
+     *                     request. If an element if not null, that element represents a reprocess
+     *                     request.
+     *
+     */
+    private TotalCaptureResult[] submitMixedCaptureBurstRequest(Surface[] outputs,
+            TotalCaptureResult[] inputResults) throws Exception {
+        if (outputs == null || outputs.length <= 0) {
+            throw new IllegalArgumentException("outputs must have at least 1 surface");
+        } else if (inputResults != null && inputResults.length != outputs.length) {
+            throw new IllegalArgumentException("The lengths of outputs and inputResults " +
+                    "don't match");
+        }
+
+        int numReprocessCaptures = 0;
+        SimpleCaptureCallback captureCallback = new SimpleCaptureCallback();
+        ArrayList<CaptureRequest> captureRequests = new ArrayList<>(outputs.length);
+
+        // Prepare a list of capture requests. Whether it's a regular or reprocess capture request
+        // is based on inputResults array.
+        for (int i = 0; i < outputs.length; i++) {
+            CaptureRequest.Builder builder;
+            boolean isReprocess = (inputResults != null && inputResults[i] != null);
+            if (isReprocess) {
+                builder = mCamera.createReprocessCaptureRequest(inputResults[i]);
+                numReprocessCaptures++;
+            } else {
+                builder = mCamera.createCaptureRequest(CAPTURE_TEMPLATE);
+            }
+            builder.addTarget(outputs[i]);
+            CaptureRequest request = builder.build();
+            assertTrue("Capture request reprocess type " + request.isReprocess() + " is wrong.",
+                request.isReprocess() == isReprocess);
+
+            captureRequests.add(request);
+        }
+
+        if (captureRequests.size() == 1) {
+            mSession.capture(captureRequests.get(0), captureCallback, mHandler);
+        } else {
+            mSession.captureBurst(captureRequests, captureCallback, mHandler);
+        }
+
+        TotalCaptureResult[] results;
+        if (numReprocessCaptures == 0 || numReprocessCaptures == outputs.length) {
+            results = new TotalCaptureResult[outputs.length];
+            // If the requests are not mixed, they should come in order.
+            for (int i = 0; i < results.length; i++){
+                results[i] = captureCallback.getTotalCaptureResultForRequest(
+                        captureRequests.get(i), CAPTURE_TIMEOUT_FRAMES);
+            }
+        } else {
+            // If the requests are mixed, they may not come in order.
+            results = captureCallback.getTotalCaptureResultsForRequests(
+                    captureRequests, CAPTURE_TIMEOUT_FRAMES * captureRequests.size());
+        }
+
+        // make sure all input surfaces are released.
+        for (int i = 0; i < numReprocessCaptures; i++) {
+            mImageWriterListener.waitForImageReleased(CAPTURE_TIMEOUT_MS);
+        }
+
+        return results;
+    }
+
+    private Size getMaxSize(int format, StaticMetadata.StreamDirection direction) {
+        Size[] sizes = mStaticInfo.getAvailableSizesForFormatChecked(format, direction);
+        return getAscendingOrderSizes(Arrays.asList(sizes), /*ascending*/false).get(0);
+    }
+
+    private boolean isYuvReprocessSupported(String cameraId) throws Exception {
+        return isReprocessSupported(cameraId, ImageFormat.YUV_420_888);
+    }
+
+    private boolean isOpaqueReprocessSupported(String cameraId) throws Exception {
+        return isReprocessSupported(cameraId, ImageFormat.PRIVATE);
+    }
+
+    private void dumpImage(Image image, String name) {
+        String filename = DEBUG_FILE_NAME_BASE + name;
+        switch(image.getFormat()) {
+            case ImageFormat.JPEG:
+                filename += ".jpg";
+                break;
+            case ImageFormat.NV16:
+            case ImageFormat.NV21:
+            case ImageFormat.YUV_420_888:
+                filename += ".yuv";
+                break;
+            default:
+                filename += "." + image.getFormat();
+                break;
+        }
+
+        Log.d(TAG, "dumping an image to " + filename);
+        dumpFile(filename , getDataFromImage(image));
+    }
+
+    /**
+     * A class that holds an Image and a TotalCaptureResult.
+     */
+    private static class ImageResultHolder {
+        private final Image mImage;
+        private final TotalCaptureResult mResult;
+
+        public ImageResultHolder(Image image, TotalCaptureResult result) {
+            mImage = image;
+            mResult = result;
+        }
+
+        public Image getImage() {
+            return mImage;
+        }
+
+        public TotalCaptureResult getTotalCaptureResult() {
+            return mResult;
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
index 61860a7..3d5ceaa 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -49,6 +49,7 @@
  */
 public class RobustnessTest extends Camera2AndroidTestCase {
     private static final String TAG = "RobustnessTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
 
     private static final int CONFIGURE_TIMEOUT = 5000; //ms
     private static final int CAPTURE_TIMEOUT = 1000; //ms
@@ -223,6 +224,11 @@
             MaxOutputSizes maxSizes = new MaxOutputSizes(cc, id);
 
             final StaticMetadata staticInfo = new StaticMetadata(cc);
+            String streamConfigurationMapString =
+                    cc.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).toString();
+            if (VERBOSE) {
+                Log.v(TAG, "StreamConfigurationMap: " + streamConfigurationMapString);
+            }
 
             openDevice(id);
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
index b8c2f2e..0dba61e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
@@ -268,12 +268,10 @@
                 capabilityName = "REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE";
                 requestKeys.add(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE);
                 requestKeys.add(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION);
-                requestKeys.add(CaptureRequest.CONTROL_AE_LOCK);
                 requestKeys.add(CaptureRequest.CONTROL_AE_MODE);
                 requestKeys.add(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
                 requestKeys.add(CaptureRequest.CONTROL_AF_MODE);
                 requestKeys.add(CaptureRequest.CONTROL_AF_TRIGGER);
-                requestKeys.add(CaptureRequest.CONTROL_AWB_LOCK);
                 requestKeys.add(CaptureRequest.CONTROL_AWB_MODE);
                 requestKeys.add(CaptureRequest.CONTROL_CAPTURE_INTENT);
                 requestKeys.add(CaptureRequest.CONTROL_EFFECT_MODE);
@@ -319,9 +317,11 @@
                 requestKeys.add(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE);
                 requestKeys.add(CaptureRequest.TONEMAP_CURVE);
                 requestKeys.add(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE);
+                requestKeys.add(CaptureRequest.CONTROL_AWB_LOCK);
 
                 // Legacy mode always doesn't support these requirements
                 Boolean contrastCurveModeSupported = false;
+                Boolean gammaAndPresetModeSupported = false;
                 Boolean offColorAberrationModeSupported = false;
                 if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
                     int[] tonemapModes = mStaticInfo.getAvailableToneMapModesChecked();
@@ -330,6 +330,10 @@
                             Arrays.asList(CameraTestUtils.toObject(tonemapModes));
                     contrastCurveModeSupported =
                             modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE);
+                    gammaAndPresetModeSupported =
+                            modeList.contains(CameraMetadata.TONEMAP_MODE_GAMMA_VALUE) &&
+                            modeList.contains(CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
+
                     int[] colorAberrationModes =
                             mStaticInfo.getAvailableColorAberrationModesChecked();
                     modeList = (colorAberrationModes.length == 0) ?
@@ -338,13 +342,20 @@
                     offColorAberrationModeSupported =
                             modeList.contains(CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF);
                 }
+                Boolean tonemapModeQualified =
+                        contrastCurveModeSupported || gammaAndPresetModeSupported;
                 additionalRequirements.add(new Pair<String, Boolean>(
-                        "Tonemap mode must include CONTRAST_CURVE", contrastCurveModeSupported));
+                        "Tonemap mode must include {CONTRAST_CURVE} and/or " +
+                        "{GAMMA_VALUE, PRESET_CURVE}",
+                        tonemapModeQualified));
                 additionalRequirements.add(new Pair<String, Boolean>(
                         "Color aberration mode must include OFF", offColorAberrationModeSupported));
+                additionalRequirements.add(new Pair<String, Boolean>(
+                        "Must support AWB lock", mStaticInfo.isAwbLockSupported()));
                 break;
             case REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:
                 capabilityName = "REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR";
+                requestKeys.add(CaptureRequest.CONTROL_AE_LOCK);
                 requestKeys.add(CaptureRequest.SENSOR_FRAME_DURATION);
                 requestKeys.add(CaptureRequest.SENSOR_EXPOSURE_TIME);
                 requestKeys.add(CaptureRequest.SENSOR_SENSITIVITY);
@@ -355,6 +366,8 @@
                     requestKeys.add(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE);
                 }
                 requestKeys.add(CaptureRequest.BLACK_LEVEL_LOCK);
+                additionalRequirements.add(new Pair<String, Boolean>(
+                        "Must support AE lock", mStaticInfo.isAeLockSupported()));
                 break;
             case REQUEST_AVAILABLE_CAPABILITIES_RAW:
                 // RAW_CAPABILITY needs to check for not just capture request keys
@@ -374,6 +387,11 @@
                     resultKeys.add(CaptureResult.LENS_FILTER_DENSITY);
                 }
                 break;
+
+            case REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING:
+            case REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING:
+                // Tested in ExtendedCameraCharacteristicsTest
+                return;
             default:
                 capabilityName = "Unknown";
                 assertTrue(String.format("Unknown capability set: %d", capability),
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
index b4113e5..c3cf8d0 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
@@ -523,7 +523,10 @@
             // LEGACY Devices don't have the AWB_STATE reported in results, so just wait
             waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
         }
-        previewRequest.set(CaptureRequest.CONTROL_AWB_LOCK, true);
+        boolean canSetAwbLock = mStaticInfo.isAwbLockSupported();
+        if (canSetAwbLock) {
+            previewRequest.set(CaptureRequest.CONTROL_AWB_LOCK, true);
+        }
         mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
         // Validate the next result immediately for region and mode.
         result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
@@ -1000,9 +1003,23 @@
             }
 
             // Validate capture result vs. request
+            Size resultThumbnailSize = stillResult.get(CaptureResult.JPEG_THUMBNAIL_SIZE);
+            int orientationTested = EXIF_TEST_DATA[i].jpegOrientation;
+            if ((orientationTested == 90 || orientationTested == 270)) {
+                int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
+                        /*defaultValue*/-1);
+                if (exifOrientation == ExifInterface.ORIENTATION_UNDEFINED) {
+                    // Device physically rotated image+thumbnail data
+                    // Expect thumbnail size to be also rotated
+                    resultThumbnailSize = new Size(
+                            resultThumbnailSize.getHeight(),
+                            resultThumbnailSize.getWidth());
+                }
+            }
+
             mCollector.expectEquals("JPEG thumbnail size result and request should match",
                     testThumbnailSizes[i],
-                    stillResult.get(CaptureResult.JPEG_THUMBNAIL_SIZE));
+                    resultThumbnailSize);
             if (mCollector.expectKeyValueNotNull(stillResult, CaptureResult.JPEG_GPS_LOCATION) !=
                     null) {
                 mCollector.expectTrue("GPS location result and request should match.",
@@ -1267,7 +1284,12 @@
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         CaptureRequest.Builder stillRequest =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-        stillRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+        boolean canSetAeLock = mStaticInfo.isAeLockSupported();
+
+        if (canSetAeLock) {
+            stillRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+        }
+
         CaptureResult normalResult;
         CaptureResult compensatedResult;
 
@@ -1277,7 +1299,7 @@
         long maxExposureValuePreview = -1;
         long maxExposureValueStill = -1;
         if (mStaticInfo.isCapabilitySupported(
-                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
             // Minimum exposure settings is mostly static while maximum exposure setting depends on
             // frame rate range which in term depends on capture request.
             minExposureValue = mStaticInfo.getSensitivityMinimumOrDefault() *
@@ -1305,7 +1327,7 @@
 
             long normalExposureValue = -1;
             if (mStaticInfo.isCapabilitySupported(
-                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
                 // get and check if current exposure value is valid
                 normalExposureValue = getExposureValue(normalResult);
                 mCollector.expectInRange("Exposure setting out of bound", normalExposureValue,
@@ -1329,9 +1351,15 @@
             // frames to go back to locked state
             previewRequest.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION,
                     exposureCompensation);
-            previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+            if (canSetAeLock) {
+                previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+            }
             mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
-            waitForAeLocked(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+            if (canSetAeLock) {
+                waitForAeLocked(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+            } else {
+                waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+            }
 
             // Issue still capture
             if (VERBOSE) {
@@ -1347,7 +1375,7 @@
                     request, WAIT_FOR_RESULT_TIMEOUT_MS);
 
             if (mStaticInfo.isCapabilitySupported(
-                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
                 // Verify the exposure value compensates as requested
                 long compensatedExposureValue = getExposureValue(compensatedResult);
                 mCollector.expectInRange("Exposure setting out of bound", compensatedExposureValue,
@@ -1374,8 +1402,10 @@
             mCollector.expectEquals("Exposure compensation result should match requested value.",
                     exposureCompensation,
                     compensatedResult.get(CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION));
-            mCollector.expectTrue("Exposure lock should be set",
-                    compensatedResult.get(CaptureResult.CONTROL_AE_LOCK));
+            if (canSetAeLock) {
+                mCollector.expectTrue("Exposure lock should be set",
+                        compensatedResult.get(CaptureResult.CONTROL_AE_LOCK));
+            }
 
             Image image = imageListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
             validateJpegCapture(image, maxStillSz);
@@ -1383,7 +1413,9 @@
 
             // Recover AE compensation and lock
             previewRequest.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
-            previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, false);
+            if (canSetAeLock) {
+                previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, false);
+            }
             mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
         }
     }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
index 01da4c8..7d377d6 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
@@ -18,6 +18,8 @@
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
 
+import android.graphics.ImageFormat;
+import android.view.Surface;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
@@ -29,6 +31,7 @@
 import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.util.Log;
+import android.util.Pair;
 import android.util.Range;
 
 import org.mockito.ArgumentCaptor;
@@ -36,6 +39,7 @@
 
 import static org.mockito.Mockito.*;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -118,6 +122,192 @@
     }
 
     /**
+     * Test to verify the {@link CameraCaptureSession#prepare} method works correctly, and has the
+     * expected effects on performance.
+     *
+     * - Ensure that prepare() results in onSurfacePrepared() being invoked
+     * - Ensure that prepare() does not cause preview glitches while operating
+     * - Ensure that starting to use a newly-prepared output does not cause additional
+     *   preview glitches to occur
+     */
+    public void testPreparePerformance() throws Throwable {
+        for (int i = 0; i < mCameraIds.length; i++) {
+            try {
+                openDevice(mCameraIds[i]);
+
+                preparePerformanceTestByCamera(mCameraIds[i]);
+            }
+            finally {
+                closeDevice();
+            }
+        }
+    }
+
+    private void preparePerformanceTestByCamera(String cameraId) throws Exception {
+        final int MAX_IMAGES_TO_PREPARE = 10;
+        final int UNKNOWN_LATENCY_RESULT_WAIT = 5;
+        final int MAX_RESULTS_TO_WAIT = 10;
+        final int FRAMES_FOR_AVERAGING = 100;
+        final int PREPARE_TIMEOUT_MS = 10000; // 10 s
+        final float PREPARE_FRAME_RATE_BOUNDS = 0.05f; // fraction allowed difference
+        final float PREPARE_PEAK_RATE_BOUNDS = 0.5f; // fraction allowed difference
+
+        Size maxYuvSize = getSupportedPreviewSizes(cameraId, mCameraManager, null).get(0);
+        Size maxPreviewSize = mOrderedPreviewSizes.get(0);
+
+        // Don't need image data, just drop it right away to minimize overhead
+        ImageDropperListener imageListener = new ImageDropperListener();
+
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+
+        CaptureRequest.Builder previewRequest =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+
+        // Configure outputs and session
+
+        updatePreviewSurface(maxPreviewSize);
+
+        createImageReader(maxYuvSize, ImageFormat.YUV_420_888, MAX_IMAGES_TO_PREPARE, imageListener);
+
+        List<Surface> outputSurfaces = new ArrayList<Surface>();
+        outputSurfaces.add(mPreviewSurface);
+        outputSurfaces.add(mReaderSurface);
+
+        CameraCaptureSession.StateCallback mockSessionListener =
+                mock(CameraCaptureSession.StateCallback.class);
+
+        mSession = configureCameraSession(mCamera, outputSurfaces, mockSessionListener, mHandler);
+
+        previewRequest.addTarget(mPreviewSurface);
+        Range<Integer> maxFpsTarget = mStaticInfo.getAeMaxTargetFpsRange();
+        previewRequest.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, maxFpsTarget);
+
+        mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
+
+        // Converge AE
+        waitForAeStable(resultListener, UNKNOWN_LATENCY_RESULT_WAIT);
+
+        if (mStaticInfo.isAeLockSupported()) {
+            // Lock AE if possible to improve stability
+            previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+            mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
+            waitForResultValue(resultListener, CaptureResult.CONTROL_AE_STATE,
+                    CaptureResult.CONTROL_AE_STATE_LOCKED, MAX_RESULTS_TO_WAIT);
+        }
+
+        // Measure frame rate for a bit
+        Pair<Long, Long> frameDurationStats =
+                measureMeanFrameInterval(resultListener, FRAMES_FOR_AVERAGING, /*prevTimestamp*/ 0);
+
+        Log.i(TAG, String.format("Frame interval avg during normal preview: %f ms, peak %f ms",
+                        frameDurationStats.first / 1e6, frameDurationStats.second / 1e6));
+
+        // Drain results, do prepare
+        resultListener.drain();
+
+        mSession.prepare(mReaderSurface);
+
+        verify(mockSessionListener,
+                timeout(PREPARE_TIMEOUT_MS).times(1)).
+                onSurfacePrepared(eq(mSession), eq(mReaderSurface));
+
+        // Calculate frame rate during prepare
+
+        int resultsReceived = (int) resultListener.getTotalNumFrames();
+        if (resultsReceived > 2) {
+            // Only verify frame rate if there are a couple of results
+            Pair<Long, Long> whilePreparingFrameDurationStats =
+                    measureMeanFrameInterval(resultListener, resultsReceived, /*prevTimestamp*/ 0);
+
+            Log.i(TAG, String.format("Frame interval during prepare avg: %f ms, peak %f ms",
+                            whilePreparingFrameDurationStats.first / 1e6,
+                            whilePreparingFrameDurationStats.second / 1e6));
+
+            if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                mCollector.expectTrue(
+                    String.format("Camera %s: Preview peak frame interval affected by prepare " +
+                            "call: preview avg frame duration: %f ms, peak during prepare: %f ms",
+                            cameraId,
+                            frameDurationStats.first / 1e6,
+                            whilePreparingFrameDurationStats.second / 1e6),
+                    (whilePreparingFrameDurationStats.second <=
+                            frameDurationStats.first * (1 + PREPARE_PEAK_RATE_BOUNDS)));
+                mCollector.expectTrue(
+                    String.format("Camera %s: Preview average frame interval affected by prepare " +
+                            "call: preview avg frame duration: %f ms, during prepare: %f ms",
+                            cameraId,
+                            frameDurationStats.first / 1e6,
+                            whilePreparingFrameDurationStats.first / 1e6),
+                    (whilePreparingFrameDurationStats.first <=
+                            frameDurationStats.first * (1 + PREPARE_FRAME_RATE_BOUNDS)));
+            }
+        }
+
+        resultListener.drain();
+
+        // Get at least one more preview result without prepared target
+        CaptureResult result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
+        long prevTimestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+
+        // Now use the prepared stream and ensure there are no hiccups from using it
+        previewRequest.addTarget(mReaderSurface);
+
+        mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
+
+        Pair<Long, Long> preparedFrameDurationStats =
+                measureMeanFrameInterval(resultListener, MAX_IMAGES_TO_PREPARE*2, prevTimestamp);
+
+        Log.i(TAG, String.format("Frame interval with prepared stream added avg: %f ms, peak %f ms",
+                        preparedFrameDurationStats.first / 1e6,
+                        preparedFrameDurationStats.second / 1e6));
+
+        if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+            mCollector.expectTrue(
+                String.format("Camera %s: Preview peak frame interval affected by use of new " +
+                        " stream: preview avg frame duration: %f ms, peak with new stream: %f ms",
+                        cameraId,
+                        frameDurationStats.first / 1e6, preparedFrameDurationStats.second / 1e6),
+                (preparedFrameDurationStats.second <=
+                        frameDurationStats.first * (1 + PREPARE_PEAK_RATE_BOUNDS)));
+            mCollector.expectTrue(
+                String.format("Camera %s: Preview average frame interval affected by use of new " +
+                        "stream: preview avg frame duration: %f ms, with new stream: %f ms",
+                        cameraId,
+                        frameDurationStats.first / 1e6, preparedFrameDurationStats.first / 1e6),
+                (preparedFrameDurationStats.first <=
+                        frameDurationStats.first * (1 + PREPARE_FRAME_RATE_BOUNDS)));
+        }
+    }
+
+    /**
+     * Measure the inter-frame interval based on SENSOR_TIMESTAMP for frameCount frames from the
+     * provided capture listener.  If prevTimestamp is positive, it is used for the first interval
+     * calculation; otherwise, the first result is used to establish the starting time.
+     *
+     * Returns the mean interval in the first pair entry, and the largest interval in the second
+     * pair entry
+     */
+    Pair<Long, Long> measureMeanFrameInterval(SimpleCaptureCallback resultListener, int frameCount,
+            long prevTimestamp) throws Exception {
+        long summedIntervals = 0;
+        long maxInterval = 0;
+        int measurementCount = frameCount - ((prevTimestamp > 0) ? 0 : 1);
+
+        for (int i = 0; i < frameCount; i++) {
+            CaptureResult result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
+            long timestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+            if (prevTimestamp > 0) {
+                long interval = timestamp - prevTimestamp;
+                if (interval > maxInterval) maxInterval = interval;
+                summedIntervals += interval;
+            }
+            prevTimestamp = timestamp;
+        }
+        return new Pair<Long, Long>(summedIntervals / measurementCount, maxInterval);
+    }
+
+
+    /**
      * Test preview fps range for all supported ranges. The exposure time are frame duration are
      * validated.
      */
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraErrorCollector.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraErrorCollector.java
index 0ee5ffc..9f0c012 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraErrorCollector.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraErrorCollector.java
@@ -22,6 +22,7 @@
 import android.hardware.camera2.CaptureRequest.Builder;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.params.MeteringRectangle;
+import android.media.Image;
 import android.util.Log;
 import android.util.Size;
 
@@ -1049,4 +1050,13 @@
         Set<T> sizeSet = new HashSet<T>(list);
         expectTrue(msg + " each element must be distinct", sizeSet.size() == list.size());
     }
+
+    public void expectImageProperties(String msg, Image image, int format, Size size,
+            long timestampNs) {
+        expectEquals(msg + "Image format is wrong.", image.getFormat(), format);
+        expectEquals(msg + "Image width is wrong.", image.getWidth(), size.getWidth());
+        expectEquals(msg + "Image height is wrong.", image.getHeight(), size.getHeight());
+        expectEquals(msg + "Image timestamp is wrong.", image.getTimestamp(), timestampNs);
+    }
+
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
index 2a654db..36fedae 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
@@ -64,6 +64,7 @@
     private static final int CONTROL_AE_COMPENSATION_RANGE_DEFAULT_MAX = 2;
     private static final Rational CONTROL_AE_COMPENSATION_STEP_DEFAULT = new Rational(1, 2);
     private static final byte REQUEST_PIPELINE_MAX_DEPTH_MAX = 8;
+    private static final int MAX_REPROCESS_MAX_CAPTURE_STALL = 4;
 
     // TODO: Consider making this work across any metadata object, not just camera characteristics
     private final CameraCharacteristics mCharacteristics;
@@ -586,6 +587,17 @@
             checkTrueForKey(key, "Full-capability camera devices must support FAST mode",
                     modeList.contains(CameraMetadata.HOT_PIXEL_MODE_FAST));
         }
+
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.HOT_PIXEL_MODE_FAST,
+                    CameraMetadata.HOT_PIXEL_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
+        }
         checkElementDistinct(key, modeList);
         checkArrayValuesInRange(key, modes, CameraMetadata.HOT_PIXEL_MODE_OFF,
                 CameraMetadata.HOT_PIXEL_MODE_HIGH_QUALITY);
@@ -666,16 +678,22 @@
         List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
         checkTrueForKey(key, " Camera devices must always support FAST mode",
                 modeList.contains(CameraMetadata.TONEMAP_MODE_FAST));
-        if (isCapabilitySupported(
-                CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING)) {
-            checkTrueForKey(key, "MANUAL_POST_PROCESSING supported camera devices must support"
-                    + "CONTRAST_CURVE mode",
-                    modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE) &&
-                    modeList.contains(CameraMetadata.TONEMAP_MODE_FAST));
+        // Qualification check for MANUAL_POSTPROCESSING capability is in
+        // StaticMetadataTest#testCapabilities
+
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.TONEMAP_MODE_FAST,
+                    CameraMetadata.TONEMAP_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
         }
         checkElementDistinct(key, modeList);
         checkArrayValuesInRange(key, modes, CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE,
-                CameraMetadata.TONEMAP_MODE_HIGH_QUALITY);
+                CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
 
         return modes;
     }
@@ -688,16 +706,23 @@
     public int getMaxTonemapCurvePointChecked() {
         Key<Integer> key = CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS;
         Integer count = getValueFromKeyNonNull(key);
+        List<Integer> modeList =
+                Arrays.asList(CameraTestUtils.toObject(getAvailableToneMapModesChecked()));
+        boolean tonemapCurveOutputSupported =
+                modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE) ||
+                modeList.contains(CameraMetadata.TONEMAP_MODE_GAMMA_VALUE) ||
+                modeList.contains(CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
 
         if (count == null) {
+            if (tonemapCurveOutputSupported) {
+                Assert.fail("Tonemap curve output is supported but MAX_CURVE_POINTS is null");
+            }
             return 0;
         }
 
-        List<Integer> modeList =
-                Arrays.asList(CameraTestUtils.toObject(getAvailableToneMapModesChecked()));
-        if (modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE)) {
-            checkTrueForKey(key, "Full-capability camera device must support maxCurvePoints "
-                    + ">= " + TONEMAP_MAX_CURVE_POINTS_AT_LEAST,
+        if (tonemapCurveOutputSupported) {
+            checkTrueForKey(key, "Tonemap curve output supported camera device must support "
+                    + "maxCurvePoints >= " + TONEMAP_MAX_CURVE_POINTS_AT_LEAST,
                     count >= TONEMAP_MAX_CURVE_POINTS_AT_LEAST);
         }
 
@@ -955,6 +980,62 @@
     }
 
     /**
+     * get android.control.availableModes and do the sanity check.
+     *
+     * @return available control modes.
+     */
+    public int[] getAvailableControlModesChecked() {
+        Key<int[]> modesKey = CameraCharacteristics.CONTROL_AVAILABLE_MODES;
+        int[] modes = getValueFromKeyNonNull(modesKey);
+        if (modes == null) {
+            modes = new int[0];
+        }
+
+        List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
+        checkTrueForKey(modesKey, "value is empty", !modeList.isEmpty());
+
+        // All camera device must support AUTO
+        checkTrueForKey(modesKey, "values " + modeList.toString() + " must contain AUTO mode",
+                modeList.contains(CameraMetadata.CONTROL_MODE_AUTO));
+
+        boolean isAeOffSupported =  Arrays.asList(
+                CameraTestUtils.toObject(getAeAvailableModesChecked())).contains(
+                        CameraMetadata.CONTROL_AE_MODE_OFF);
+        boolean isAfOffSupported =  Arrays.asList(
+                CameraTestUtils.toObject(getAfAvailableModesChecked())).contains(
+                        CameraMetadata.CONTROL_AF_MODE_OFF);
+        boolean isAwbOffSupported =  Arrays.asList(
+                CameraTestUtils.toObject(getAwbAvailableModesChecked())).contains(
+                        CameraMetadata.CONTROL_AWB_MODE_OFF);
+        if (isAeOffSupported && isAfOffSupported && isAwbOffSupported) {
+            // 3A OFF controls are supported, OFF mode must be supported here.
+            checkTrueForKey(modesKey, "values " + modeList.toString() + " must contain OFF mode",
+                    modeList.contains(CameraMetadata.CONTROL_MODE_OFF));
+        }
+
+        if (isSceneModeSupported()) {
+            checkTrueForKey(modesKey, "values " + modeList.toString() + " must contain"
+                    + " USE_SCENE_MODE",
+                    modeList.contains(CameraMetadata.CONTROL_MODE_USE_SCENE_MODE));
+        }
+
+        return modes;
+    }
+
+    public boolean isSceneModeSupported() {
+        List<Integer> availableSceneModes = Arrays.asList(
+                CameraTestUtils.toObject(getAvailableSceneModesChecked()));
+
+        if (availableSceneModes.isEmpty()) {
+            return false;
+        }
+
+        // If sceneMode is not supported, camera device will contain single entry: DISABLED.
+        return availableSceneModes.size() > 1 ||
+                !availableSceneModes.contains(CameraMetadata.CONTROL_SCENE_MODE_DISABLED);
+    }
+
+    /**
      * Get aeAvailableModes and do the sanity check.
      *
      * <p>Depending on the check level this class has, for WAR or COLLECT levels,
@@ -1104,9 +1185,51 @@
     }
 
     /**
-     * Get available sizes for given user-defined format.
+     * Get available formats for a given direction.
      *
-     * <p><strong>Does not</strong> work with implementation-defined format.</p>
+     * @param direction The stream direction, input or output.
+     * @return The formats of the given direction, empty array if no available format is found.
+     */
+    public int[] getAvailableFormats(StreamDirection direction) {
+        Key<StreamConfigurationMap> key =
+                CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP;
+        StreamConfigurationMap config = getValueFromKeyNonNull(key);
+
+        if (config == null) {
+            return new int[0];
+        }
+
+        switch (direction) {
+            case Output:
+                return config.getOutputFormats();
+            case Input:
+                return config.getInputFormats();
+            default:
+                throw new IllegalArgumentException("direction must be output or input");
+        }
+    }
+
+    /**
+     * Get valid output formats for a given input format.
+     *
+     * @param inputFormat The input format used to produce the output images.
+     * @return The output formats for the given input format, empty array if
+     *         no available format is found.
+     */
+    public int[] getValidOutputFormatsForInput(int inputFormat) {
+        Key<StreamConfigurationMap> key =
+                CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP;
+        StreamConfigurationMap config = getValueFromKeyNonNull(key);
+
+        if (config == null) {
+            return new int[0];
+        }
+
+        return config.getValidOutputFormatsForInput(inputFormat);
+    }
+
+    /**
+     * Get available sizes for given format and direction.
      *
      * @param format The format for the requested size array.
      * @param direction The stream direction, input or output.
@@ -1121,28 +1244,21 @@
             return new Size[0];
         }
 
-        android.util.Size[] utilSizes;
+        Size[] sizes;
 
         switch (direction) {
             case Output:
-                utilSizes = config.getOutputSizes(format);
+                sizes = config.getOutputSizes(format);
                 break;
             case Input:
-                utilSizes = null;
+                sizes = config.getInputSizes(format);
                 break;
             default:
                 throw new IllegalArgumentException("direction must be output or input");
         }
 
-        // TODO: Get rid of android.util.Size
-        if (utilSizes == null) {
-            Log.i(TAG, "This camera doesn't support format " + format + " for " + direction);
-            return new Size[0];
-        }
-
-        Size[] sizes = new Size[utilSizes.length];
-        for (int i = 0; i < utilSizes.length; ++i) {
-            sizes[i] = new Size(utilSizes[i].getWidth(), utilSizes[i].getHeight());
+        if (sizes == null) {
+            sizes = new Size[0];
         }
 
         return sizes;
@@ -1168,9 +1284,17 @@
         int fpsRangeLength = fpsRanges.length;
         int minFps, maxFps;
         long maxFrameDuration = getMaxFrameDurationChecked();
+        boolean foundConstant30Range = false;
+        boolean foundPreviewStreamingRange = false;
         for (int i = 0; i < fpsRangeLength; i += 1) {
             minFps = fpsRanges[i].getLower();
             maxFps = fpsRanges[i].getUpper();
+            if (minFps == 30 && maxFps == 30) {
+                foundConstant30Range = true;
+            }
+            if (minFps <= 15 && maxFps >= 30) {
+                foundPreviewStreamingRange = true;
+            }
             checkTrueForKey(key, " min fps must be no larger than max fps!",
                     minFps > 0 && maxFps >= minFps);
             long maxDuration = (long) (1e9 / minFps);
@@ -1178,11 +1302,38 @@
                     " the frame duration %d for min fps %d must smaller than maxFrameDuration %d",
                     maxDuration, minFps, maxFrameDuration), maxDuration <= maxFrameDuration);
         }
-
+        checkTrueForKey(key, String.format(" (30, 30) must be included"), foundConstant30Range);
+        checkTrueForKey(key, String.format(
+                " (min, max) where min <= 15 and max >= 30 must be included"),
+                foundPreviewStreamingRange);
         return fpsRanges;
     }
 
     /**
+     * Get the highest supported target FPS range.
+     * Prioritizes maximizing the min FPS, then the max FPS without lowering min FPS.
+     */
+    public Range<Integer> getAeMaxTargetFpsRange() {
+        Range<Integer>[] fpsRanges = getAeAvailableTargetFpsRangesChecked();
+
+        Range<Integer> targetRange = fpsRanges[0];
+        // Assume unsorted list of target FPS ranges, so use two passes, first maximize min FPS
+        for (Range<Integer> candidateRange : fpsRanges) {
+            if (candidateRange.getLower() > targetRange.getLower()) {
+                targetRange = candidateRange;
+            }
+        }
+        // Then maximize max FPS while not lowering min FPS
+        for (Range<Integer> candidateRange : fpsRanges) {
+            if (candidateRange.getLower() >= targetRange.getLower() &&
+                    candidateRange.getUpper() > targetRange.getUpper()) {
+                targetRange = candidateRange;
+            }
+        }
+        return targetRange;
+    }
+
+    /**
      * Get max frame duration.
      *
      * @return 0 if maxFrameDuration is null
@@ -1200,9 +1351,7 @@
     }
 
     /**
-     * Get available minimal frame durations for a given user-defined format.
-     *
-     * <p><strong>Does not</strong> work with implementation-defined format.</p>
+     * Get available minimal frame durations for a given format.
      *
      * @param format One of the format from {@link ImageFormat}.
      * @return HashMap of minimal frame durations for different sizes, empty HashMap
@@ -1239,14 +1388,25 @@
             return new int[0];
         }
 
+        List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(edgeModes));
         // Full device should always include OFF and FAST
         if (isHardwareLevelFull()) {
-            List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(edgeModes));
             checkTrueForKey(key, "Full device must contain OFF and FAST edge modes",
                     modeList.contains(CameraMetadata.EDGE_MODE_OFF) &&
                     modeList.contains(CameraMetadata.EDGE_MODE_FAST));
         }
 
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.EDGE_MODE_FAST,
+                    CameraMetadata.EDGE_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
+        }
+
         return edgeModes;
     }
 
@@ -1259,14 +1419,25 @@
             return new int[0];
         }
 
+        List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(noiseReductionModes));
         // Full device should always include OFF and FAST
         if (isHardwareLevelFull()) {
-            List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(noiseReductionModes));
+
             checkTrueForKey(key, "Full device must contain OFF and FAST noise reduction modes",
                     modeList.contains(CameraMetadata.NOISE_REDUCTION_MODE_OFF) &&
                     modeList.contains(CameraMetadata.NOISE_REDUCTION_MODE_FAST));
         }
 
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.NOISE_REDUCTION_MODE_FAST,
+                    CameraMetadata.NOISE_REDUCTION_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
+        }
         return noiseReductionModes;
     }
 
@@ -1444,6 +1615,17 @@
         checkTrueForKey(key, " Camera devices must always support either OFF or FAST mode",
                 modeList.contains(CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF) ||
                 modeList.contains(CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_FAST));
+
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_FAST,
+                    CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
+        }
         checkElementDistinct(key, modeList);
         checkArrayValuesInRange(key, modes,
                 CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF,
@@ -1473,6 +1655,52 @@
     }
 
     /**
+     * Get available lens shading modes.
+     */
+     public int[] getAvailableLensShadingModesChecked() {
+         Key<int[]> key =
+                 CameraCharacteristics.SHADING_AVAILABLE_MODES;
+         int[] modes = getValueFromKeyNonNull(key);
+         if (modes == null) {
+             return new int[0];
+         }
+
+         List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
+         // FAST must be included.
+         checkTrueForKey(key, " FAST must be included",
+                 modeList.contains(CameraMetadata.SHADING_MODE_FAST));
+
+         if (isCapabilitySupported(
+                 CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING)) {
+             checkTrueForKey(key, " OFF must be included for MANUAL_POST_PROCESSING devices",
+                     modeList.contains(CameraMetadata.SHADING_MODE_OFF));
+         }
+         return modes;
+     }
+
+     /**
+      * Get available lens shading map modes.
+      */
+      public int[] getAvailableLensShadingMapModesChecked() {
+          Key<int[]> key =
+                  CameraCharacteristics.STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES;
+          int[] modes = getValueFromKeyNonNull(key);
+          if (modes == null) {
+              return new int[0];
+          }
+
+          List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
+
+          if (isCapabilitySupported(
+                  CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+              checkTrueForKey(key, " ON must be included for RAW capability devices",
+                      modeList.contains(CameraMetadata.STATISTICS_LENS_SHADING_MAP_MODE_ON));
+          }
+          return modes;
+      }
+
+
+    /**
      * Get available capabilities and do the sanity check.
      *
      * @return reported available capabilities list, empty list if the value is unavailable.
@@ -1489,7 +1717,7 @@
 
         checkArrayValuesInRange(key, availableCaps,
                 CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,
-                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE);
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING);
         capList = Arrays.asList(CameraTestUtils.toObject(availableCaps));
         return capList;
     }
@@ -1618,6 +1846,25 @@
     }
 
     /*
+     * Determine if camera device support AE lock control
+     *
+     * @return {@code true} if AE lock control is supported
+     */
+    public boolean isAeLockSupported() {
+        return getValueFromKeyNonNull(CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE);
+    }
+
+    /*
+     * Determine if camera device support AWB lock control
+     *
+     * @return {@code true} if AWB lock control is supported
+     */
+    public boolean isAwbLockSupported() {
+        return getValueFromKeyNonNull(CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE);
+    }
+
+
+    /*
      * Determine if camera device support manual lens shading map control
      *
      * @return {@code true} if manual lens shading map control is supported
@@ -1631,7 +1878,7 @@
      *
      * @return {@code true} if manual color correction control is supported
      */
-    public boolean isManualColorCorrectionSupported() {
+    public boolean isColorCorrectionSupported() {
         return areKeysAvailable(CaptureRequest.COLOR_CORRECTION_MODE);
     }
 
@@ -1739,6 +1986,26 @@
     }
 
     /**
+     * Get maxCaptureStall frames or default value (if value doesn't exist)
+     * @return maxCaptureStall frames or default value.
+     */
+    public int getMaxCaptureStallOrDefault() {
+        Key<Integer> key =
+                CameraCharacteristics.REPROCESS_MAX_CAPTURE_STALL;
+        Integer value = getValueFromKeyNonNull(key);
+
+        if (value == null) {
+            return MAX_REPROCESS_MAX_CAPTURE_STALL;
+        }
+
+        checkTrueForKey(key, " value is out of range ",
+                value >= 0 &&
+                value <= MAX_REPROCESS_MAX_CAPTURE_STALL);
+
+        return value;
+    }
+
+    /**
      * Get the scaler's cropping type (center only or freeform)
      * @return cropping type, return default value (CENTER_ONLY) if value is unavailable
      */
@@ -1928,6 +2195,19 @@
         }
     }
 
+    /* Helper function to check if the coupled modes are either all present or all non-present */
+    private <T> boolean containsAllOrNone(Collection<T> observedModes, Collection<T> coupledModes) {
+        if (observedModes.containsAll(coupledModes)) {
+            return true;
+        }
+        for (T mode : coupledModes) {
+            if (observedModes.contains(mode)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     private <T> void failKeyCheck(Key<T> key, String message) {
         // TODO: Consider only warning once per key/message combination if it's too spammy.
         // TODO: Consider offering other options such as throwing an assertion exception
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/rs/raw_converter.rs b/tests/tests/hardware/src/android/hardware/camera2/cts/rs/raw_converter.rs
index c8b353e..fb467bb 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/rs/raw_converter.rs
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/rs/raw_converter.rs
@@ -169,6 +169,9 @@
         case 4: // impossible
         case 5: // impossible
         default:
+            finalRGB.x = 0.f;
+            finalRGB.y = 0.f;
+            finalRGB.z = 0.f;
             LOGD("raw_converter.rs: Logic error in tonemap.", 0);
             break;
     }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
index 5fc6321..78370b3 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
@@ -20,6 +20,8 @@
 import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
@@ -31,6 +33,7 @@
 import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
 import android.media.Image;
+import android.media.Image.Plane;
 import android.media.ImageReader;
 import android.os.Environment;
 import android.os.Handler;
@@ -42,6 +45,8 @@
 import com.android.ex.camera2.blocking.BlockingSessionCallback;
 import com.android.ex.camera2.blocking.BlockingStateCallback;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.List;
 
 public class Camera2AndroidTestCase extends AndroidTestCase {
@@ -288,8 +293,10 @@
     protected ImageReader createImageReader(Size size, int format, int maxNumImages,
             ImageReader.OnImageAvailableListener listener) throws Exception {
 
-        ImageReader reader = ImageReader.newInstance(size.getWidth(), size.getHeight(),
+        ImageReader reader = null;
+        reader = ImageReader.newInstance(size.getWidth(), size.getHeight(),
                 format, maxNumImages);
+
         reader.setOnImageAvailableListener(listener, mHandler);
         if (VERBOSE) Log.v(TAG, "Created ImageReader size " + size.toString());
         return reader;
@@ -323,4 +330,159 @@
             }
         }
     }
+
+    protected CaptureRequest prepareCaptureRequest() throws Exception {
+        List<Surface> outputSurfaces = new ArrayList<Surface>();
+        Surface surface = mReader.getSurface();
+        assertNotNull("Fail to get surface from ImageReader", surface);
+        outputSurfaces.add(surface);
+        return prepareCaptureRequestForSurfaces(outputSurfaces, CameraDevice.TEMPLATE_PREVIEW)
+                .build();
+    }
+
+    protected CaptureRequest.Builder prepareCaptureRequestForSurfaces(List<Surface> surfaces,
+            int template)
+            throws Exception {
+        createSession(surfaces);
+
+        CaptureRequest.Builder captureBuilder =
+                mCamera.createCaptureRequest(template);
+        assertNotNull("Fail to get captureRequest", captureBuilder);
+        for (Surface surface : surfaces) {
+            captureBuilder.addTarget(surface);
+        }
+
+        return captureBuilder;
+    }
+
+    /**
+     * Test the invalid Image access: accessing a closed image must result in
+     * {@link IllegalStateException}.
+     *
+     * @param closedImage The closed image.
+     * @param closedBuffer The ByteBuffer from a closed Image. buffer invalid
+     *            access will be skipped if it is null.
+     */
+    protected void imageInvalidAccessTestAfterClose(Image closedImage,
+            Plane closedPlane, ByteBuffer closedBuffer) {
+        if (closedImage == null) {
+            throw new IllegalArgumentException(" closedImage must be non-null");
+        }
+        if (closedBuffer != null && !closedBuffer.isDirect()) {
+            throw new IllegalArgumentException("The input ByteBuffer should be direct ByteBuffer");
+        }
+
+        if (closedPlane != null) {
+            // Plane#getBuffer test
+            try {
+                closedPlane.getBuffer(); // An ISE should be thrown here.
+                fail("Image should throw IllegalStateException when calling getBuffer"
+                        + " after the image is closed");
+            } catch (IllegalStateException e) {
+                // Expected.
+            }
+
+            // Plane#getPixelStride test
+            try {
+                closedPlane.getPixelStride(); // An ISE should be thrown here.
+                fail("Image should throw IllegalStateException when calling getPixelStride"
+                        + " after the image is closed");
+            } catch (IllegalStateException e) {
+                // Expected.
+            }
+
+            // Plane#getRowStride test
+            try {
+                closedPlane.getRowStride(); // An ISE should be thrown here.
+                fail("Image should throw IllegalStateException when calling getRowStride"
+                        + " after the image is closed");
+            } catch (IllegalStateException e) {
+                // Expected.
+            }
+        }
+
+        // ByteBuffer access test
+        if (closedBuffer != null) {
+            try {
+                closedBuffer.get(); // An ISE should be thrown here.
+                fail("Image should throw IllegalStateException when accessing a byte buffer"
+                        + " after the image is closed");
+            } catch (IllegalStateException e) {
+                // Expected.
+            }
+        }
+
+        // Image#getFormat test
+        try {
+            closedImage.getFormat();
+            fail("Image should throw IllegalStateException when calling getFormat"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getWidth test
+        try {
+            closedImage.getWidth();
+            fail("Image should throw IllegalStateException when calling getWidth"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getHeight test
+        try {
+            closedImage.getHeight();
+            fail("Image should throw IllegalStateException when calling getHeight"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getTimestamp test
+        try {
+            closedImage.getTimestamp();
+            fail("Image should throw IllegalStateException when calling getTimestamp"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getTimestamp test
+        try {
+            closedImage.getTimestamp();
+            fail("Image should throw IllegalStateException when calling getTimestamp"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getCropRect test
+        try {
+            closedImage.getCropRect();
+            fail("Image should throw IllegalStateException when calling getCropRect"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#setCropRect test
+        try {
+            Rect rect = new Rect();
+            closedImage.setCropRect(rect);
+            fail("Image should throw IllegalStateException when calling setCropRect"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getPlanes test
+        try {
+            closedImage.getPlanes();
+            fail("Image should throw IllegalStateException when calling getPlanes"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
index bcc4061..3ca696b 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
@@ -694,4 +694,21 @@
 
         return null;
     }
+
+    protected boolean isReprocessSupported(String cameraId, int format)
+            throws CameraAccessException {
+        if (format != ImageFormat.YUV_420_888 && format != ImageFormat.PRIVATE) {
+            throw new IllegalArgumentException(
+                    "format " + format + " is not supported for reprocessing");
+        }
+
+        StaticMetadata info =
+                new StaticMetadata(mCameraManager.getCameraCharacteristics(cameraId),
+                                   CheckLevel.ASSERT, /*collector*/ null);
+        int cap = CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING;
+        if (format == ImageFormat.PRIVATE) {
+            cap = CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING;
+        }
+        return info.isCapabilitySupported(cap);
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorManagerStaticTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorManagerStaticTest.java
new file mode 100644
index 0000000..11ac701
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorManagerStaticTest.java
@@ -0,0 +1,776 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.cts;
+
+import junit.framework.Assert;
+
+import android.content.Context;
+import android.hardware.SensorManager;
+import android.os.PowerManager;
+
+import java.util.Random;
+
+public class SensorManagerStaticTest extends SensorTestCase {
+    private static final String TAG = "SensorManagerTest";
+
+    // local float version of PI
+    private static final float FLOAT_PI = (float) Math.PI;
+
+
+    private PowerManager.WakeLock mWakeLock;
+
+    @Override
+    protected void setUp() throws Exception {
+        Context context = getContext();
+        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+
+        mWakeLock.acquire();
+    }
+
+    @Override
+    protected void tearDown(){
+        if (mWakeLock != null && mWakeLock.isHeld()) {
+            mWakeLock.release();
+        }
+    }
+
+    // SensorManager Tests
+    public void testGetAltitude() throws Exception {
+        float r, q;
+        float altitude;
+
+        // identity property
+        for (r = 0.5f; r < 1.3f; r += 0.1f) {
+
+            altitude = SensorManager.getAltitude(r * SensorManager.PRESSURE_STANDARD_ATMOSPHERE,
+                                                 r * SensorManager.PRESSURE_STANDARD_ATMOSPHERE);
+            assertRoughlyEqual("getAltitude identity property violated.", altitude, 0.0f, 0.1f);
+        }
+
+        // uniform increasing as pressure decreases property
+        float prevAltitude = 1e5f; // 100km ceiling
+        for (r = 0.5f; r < 1.3f; r += 0.01f) {
+            altitude = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE,
+                                                 r * SensorManager.PRESSURE_STANDARD_ATMOSPHERE);
+
+            assertTrue("getAltitude result has to decrease as p increase.", prevAltitude > altitude);
+            prevAltitude = altitude;
+        }
+
+        // compare to a reference algorithm
+        final float coef = 1.0f / 5.255f;
+        for (r = 0.8f; r < 1.3f; r += 0.1f) {
+            for (q = 1.1f * r; q > 0.5f * r; q -= 0.1f * r) {
+                float p0 = r * SensorManager.PRESSURE_STANDARD_ATMOSPHERE;
+                float p  = q * SensorManager.PRESSURE_STANDARD_ATMOSPHERE;
+
+                float t1 = SensorManager.getAltitude(p0, p);
+                float t2 = 44330.f*(1.0f- (float) Math.pow(p/p0, coef));
+
+                assertRoughlyEqual(
+                      String.format("getAltitude comparing to reference algorithm failed. " +
+                          "Detail: getAltitude(%f, %f) => %f, reference => %f",
+                          p0, p, t1, t2),
+                      t1, t2, 100.f);
+            }
+        }
+
+    }
+
+    public void testGetAngleChange() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] rotv = new float[3];
+        float [] rotv2 = new float[3];
+
+        // test many instances
+        for (i=0; i<100; ++i) {
+            float [] R1, R12, R2;
+            // azimuth(yaw) pitch roll
+            data.nextRotationAngles(rotv);
+            R1 = mat9VRot(rotv); // random base
+
+            // azimuth(yaw) pitch roll
+            data.nextRotationAngles(rotv);
+            R12 = mat9VRot(rotv);
+            R2 = mat9Mul(R1, R12); // apply another random rotation
+
+            // test different variations of input matrix format
+            switch(i & 3) {
+                case 0:
+                    SensorManager.getAngleChange(rotv2, R2, R1);
+                    break;
+                case 1:
+                    SensorManager.getAngleChange(rotv2, mat9to16(R2), R1);
+                    break;
+                case 2:
+                    SensorManager.getAngleChange(rotv2, R2, mat9to16(R1));
+                    break;
+                case 3:
+                    SensorManager.getAngleChange(rotv2, mat9to16(R2), mat9to16(R1));
+                    break;
+            }
+
+            // check range
+            assertRotationAnglesValid("getAngleChange result out of range.", rotv2);
+
+            // avoid directly checking the rotation angles to avoid corner cases
+            float [] R12rt = mat9T(mat9VRot(rotv2));
+            float [] RI = mat9Mul(R12rt, R12);
+
+            assertRoughlyEqual(
+                String.format("getAngleChange result is incorrect. Details: case %d, " +
+                    "truth = [%f, %f, %f], result = [%f, %f, %f]", i, rotv[0], rotv[1], rotv[2],
+                    rotv2[0], rotv2[1], rotv2[2]),
+                RI[0] + RI[4] + RI[8], 3.f, 1e-4f);
+        }
+    }
+
+    public void testGetInclination() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] rotv = new float[3];
+        float [] rotv2 = new float[3];
+        float [] rotv3;
+
+        // test many instances
+        for (i = 0; i < 100; ++i) {
+            float [] R;
+            float angle;
+            angle = (data.nextFloat()-0.5f) * FLOAT_PI;
+            R = mat9Rot(SensorManager.AXIS_X, -angle);
+
+            float angler = ((i&1) != 0) ?
+                    SensorManager.getInclination(mat9to16(R)) : SensorManager.getInclination(R);
+            assertRoughlyEqual(
+                String.format(
+                    "getInclination return incorrect result. Detail: case %d, truth %f, result %f.",
+                    i, angle, angler),
+                angle, angler, 1e-4f);
+        }
+    }
+
+    public void testGetOrientation() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] rotv = new float[3];
+        float [] rotv2 = new float[3];
+        float [] rotv3;
+
+        // test many instances
+        for (i=0; i<100; ++i) {
+            float [] R;
+            // yaw pitch roll
+            data.nextRotationAngles(rotv);
+            R = mat9VRot(rotv);
+
+            rotv3 = SensorManager.getOrientation( ((i&1) != 0) ? R : mat9to16(R), rotv2);
+            assertTrue("getOrientaion has to return the array passed in argument", rotv3 == rotv2);
+
+            // check range
+            assertRotationAnglesValid("getOrientation result out of range.", rotv2);
+
+            // Avoid directly comparing rotation angles. Instead, compare the rotation matrix.
+            float [] Rr = mat9T(mat9VRot(rotv2));
+            float [] RI = mat9Mul(Rr, R);
+
+            assertRoughlyEqual(
+                String.format("getOrientation result is incorrect. Details: case %d, " +
+                    "truth = [%f, %f, %f], result = [%f, %f, %f]", i, rotv[0], rotv[1], rotv[2],
+                    rotv2[0], rotv2[1], rotv2[2]),
+                RI[0] + RI[4] + RI[8], 3.f, 1e-4f);
+        }
+    }
+
+    public void testGetQuaternionFromVector() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] v;
+        float [] q = new float[4];
+        float [] q2 = new float[4];
+        float [] v3 = new float[3];
+        float [] v4 = new float[4];
+        float [] v5 = new float[5];
+        float [][] vs = new float[][] {v3, v4, v5};
+
+        float [] xyzth = new float[4];
+        for (i = 0; i < 100; ++i) {
+            float c, s;
+
+            data.nextRotationAxisAngle(xyzth);
+
+            c = (float) Math.cos(xyzth[3]);
+            s = (float) Math.sin(xyzth[3]);
+            if (c < 0.f) {
+                c = -c;
+                s = -s;
+            }
+
+            v = vs[i%3];
+            switch(i%3) {
+                case 2:
+                    v[4] = data.nextBoolean() ? data.nextFloat() : -1.f;
+                case 1:
+                    v[3] = c;
+                case 0:
+                    v[0] = s * xyzth[0];
+                    v[1] = s * xyzth[1];
+                    v[2] = s * xyzth[2];
+            }
+
+            q2[0] = c;
+            q2[1] = v[0];
+            q2[2] = v[1];
+            q2[3] = v[2];
+
+            SensorManager.getQuaternionFromVector(q, v);
+            assertVectorRoughlyEqual(
+                String.format("getQuaternionFromVector returns wrong results, Details: case %d, " +
+                    "truth = (%f, %f, %f, %f), result = (%f, %f, %f, %f).",
+                    i, q2[0], q2[1], q2[2], q2[3], q[0], q[1], q[2], q[3]),
+                q, q2, 1e-4f);
+        }
+    }
+
+    public void testGetRotationMatrix() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+        final float gravity = 9.81f;
+        final float magStrength = 50.f;
+
+        int i;
+        float [] gm = new float[9];
+        float [] rotv = new float[3];
+        float [] gI = null;
+        float [] mI = null;
+        float [] Rr = new float[9];
+        float [] Ir = new float[9];
+
+        gm[6] = gravity; // m/s^2, first column gravity
+
+        // test many instances
+        for (i=0; i<100; ++i) {
+            float [] Rt;
+            float incline;
+            // yaw pitch roll
+            data.nextRotationAngles(rotv);
+            Rt = mat9T(mat9VRot(rotv)); // from world frame to phone frame
+            //Rt = mat9I();
+
+            incline = -0.9f * (data.nextFloat() - 0.5f) * FLOAT_PI; // ~ +-80 degrees
+            //incline = 0.f;
+            gm[4] = magStrength * (float) Math.cos(-incline); // positive means rotate downwards
+            gm[7] = magStrength * (float) Math.sin(-incline);
+
+            float [] gmb = mat9Mul(Rt, gm); // do not care about right most column
+            gI = mat9Axis(gmb, SensorManager.AXIS_X);
+            mI = mat9Axis(gmb, SensorManager.AXIS_Y);
+
+            assertTrue("getRotationMatrix returns false on valid inputs",
+                SensorManager.getRotationMatrix(Rr, Ir, gI, mI));
+
+            float [] n = mat9Mul(Rr, Rt);
+            assertRoughlyEqual(
+                String.format("getRotationMatrix returns incorrect R matrix. " +
+                    "Details: case %d, truth R = %s, result R = %s.",
+                    i, mat9ToStr(mat9T(Rt)), mat9ToStr(Rr)),
+                n[0] + n[4] + n[8], 3.f, 1e-4f);
+
+
+            // Magnetic incline is defined so that it means the magnetic field lines is formed
+            // by rotate local y axis around -x axis by incline angle. However, I matrix is
+            // defined as (according to document):
+            //     [0 m 0] = I * R * geomagnetic,
+            // which means,
+            //     I' * [0 m 0] = R * geomagnetic.
+            // Thus, I' = Rot(-x, incline) and I = Rot(-x, incline)' = Rot(x, incline)
+            float [] Ix = mat9Rot(SensorManager.AXIS_X, incline);
+            assertVectorRoughlyEqual(
+                String.format("getRotationMatrix returns incorrect I matrix. " +
+                    "Details: case %d, truth I = %s, result I = %s.",
+                    i, mat9ToStr(Ix), mat9ToStr(Ir)),
+                Ix, Ir, 1e-4f);
+        }
+
+        // test 16 element inputs
+        float [] Rr2 = new float[16];
+        float [] Ir2 = new float[16];
+
+        assertTrue("getRotationMatrix returns false on valid inputs",
+            SensorManager.getRotationMatrix(Rr2, Ir2, gI, mI));
+
+        assertVectorRoughlyEqual(
+            "getRotationMatrix acts inconsistent with 9- and 16- elements matrix buffer",
+            mat16to9(Rr2), Rr, 1e-4f);
+
+        assertVectorRoughlyEqual(
+            "getRotationMatrix acts inconsistent with 9- and 16- elements matrix buffer",
+            mat16to9(Ir2), Ir, 1e-4f);
+
+        // test null inputs
+        assertTrue("getRotationMatrix does not handle null inputs",
+            SensorManager.getRotationMatrix(Rr, null, gI, mI));
+
+        assertTrue("getRotationMatrix does not handle null inputs",
+            SensorManager.getRotationMatrix(null, Ir, gI, mI));
+
+        assertTrue("getRotationMatrix does not handle null inputs",
+            SensorManager.getRotationMatrix(null, null, gI, mI));
+
+        // test fail cases
+        // free fall, if the acc reading is less than 10% of gravity
+        gI[0] = gI[1] = gI[2] = data.nextFloat() * gravity * 0.05f; // sqrt(3) * 0.05 < 0.1
+         assertFalse("getRotationMatrix does not fail when it supposed to fail (gravity too small)",
+            SensorManager.getRotationMatrix(Rr, Ir, gI, mI));
+
+        // wrong input
+        assertFalse("getRotationMatrix does not fail when it supposed to fail (singular axis)",
+            SensorManager.getRotationMatrix(Rr, Ir, gI, gI));
+    }
+
+    public void testGetRotationMatrixFromVector() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] v;
+        float [] q = new float[4];
+
+        float [] v3 = new float[3];
+        float [] v4 = new float[4];
+        float [] v5 = new float[5];
+        float [][] vs = new float[][]{v3, v4, v5};
+
+        float [] m9 = new float[9];
+        float [] m16 = new float[16];
+
+        // format: x y z theta/2
+        float [] xyzth = new float[4];
+        // test the orthogonal property of returned matrix
+        for (i=0; i<20; ++i) {
+            float c, s;
+            data.nextRotationAxisAngle(xyzth);
+
+            c = (float) Math.cos(xyzth[3]);
+            s = (float) Math.sin(xyzth[3]);
+            if (c < 0.f) {
+                c = -c;
+                s = -s;
+            }
+
+            v = vs[i%3];
+            switch(i%3) {
+                case 2:
+                    v[4] = data.nextBoolean() ? data.nextFloat() : -1.f;
+                case 1:
+                    v[3] = c;
+                case 0:
+                    v[0] = s * xyzth[0];
+                    v[1] = s * xyzth[1];
+                    v[2] = s * xyzth[2];
+            }
+
+            if ((i % 1) != 0) {
+                SensorManager.getRotationMatrixFromVector(m16, v);
+                m9 = mat16to9(m16);
+            }else {
+                SensorManager.getRotationMatrixFromVector(m9, v);
+            }
+
+            float [] n = mat9Mul(m9, mat9T(m9));
+            assertRoughlyEqual("getRotationMatrixFromVector do not return proper matrix",
+                    n[0]+ n[4] + n[8], 3.f, 1e-4f);
+        }
+
+        // test if multiple rotation (total 2pi) about an axis result in identity
+        v = v3;
+        float [] Rr = new float[9];
+
+        for (i=0; i<20; ++i) {
+            float j, halfTheta, residualHalfTheta = FLOAT_PI;
+            float [] R = mat9I();
+            float c, s;
+
+            data.nextRotationAxisAngle(xyzth);  // half theta is ignored
+
+            j = data.nextInt(5) + 2;  // 2 ~ 6 rotations
+
+            while(j-- > 0) {
+                if (j == 0) {
+                    halfTheta = residualHalfTheta;
+                } else {
+                    halfTheta = data.nextFloat() * FLOAT_PI;
+                }
+
+                c = (float) Math.cos(halfTheta);
+                s = (float) Math.sin(halfTheta);
+                if (c < 0.f) {
+                    c = -c;
+                    s = -s;
+                }
+
+                v[0] = s * xyzth[0];
+                v[1] = s * xyzth[1];
+                v[2] = s * xyzth[2];
+
+                SensorManager.getRotationMatrixFromVector(Rr, v);
+                R = mat9Mul(Rr, R);
+
+                residualHalfTheta -= halfTheta;
+            }
+
+            assertRoughlyEqual("getRotationMatrixFromVector returns incorrect matrix",
+                    R[0] + R[4] + R[8], 3.f, 1e-4f);
+        }
+
+        // test if rotation about trival axis works
+        v = v3;
+        for (i=0; i<20; ++i) {
+            int axis = (i % 3) + 1;
+            float theta = data.nextFloat() * 2.f * FLOAT_PI;
+            float [] R;
+
+            v[0] = v[1] = v[2] = 0.f;
+            v[axis - 1] = (float) Math.sin(theta / 2.f);
+            if ( (float) Math.cos(theta / 2.f) < 0.f) {
+                v[axis-1] = -v[axis-1];
+            }
+
+            SensorManager.getRotationMatrixFromVector(m9, v);
+            R = mat9Rot(axis, theta);
+
+            assertVectorRoughlyEqual(
+                String.format("getRotationMatrixFromVector returns incorrect matrix with "+
+                    "simple rotation. Details: case %d, truth R = %s, result R = %s.",
+                    i, mat9ToStr(R), mat9ToStr(m9)),
+                R, m9, 1e-4f);
+        }
+    }
+
+    public void testRemapCoordinateSystem() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i, j, k;
+        float [] rotv = new float[3];
+        float [] Rout = new float[9];
+        float [] Rout2 = new float[16];
+        int a1, a2; // AXIS_X/Y/Z
+        int b1, b2, b3; // AXIS_X/Y/Z w/ or w/o MINUS
+
+        // test a few instances
+        for (i=0; i<10; ++i) {
+            float [] R;
+            // yaw pitch roll
+            data.nextRotationAngles(rotv);
+            R = mat9VRot(rotv);
+
+            // total of 6*4 = 24 variations
+            // 6 = A(3,2)
+            for (j=0; j<9; ++j) {
+                // axis without minus
+                a1 = j/3 + 1;
+                a2 = j%3 + 1;
+
+                // skip cases when two axis are the same
+                if (a1 == a2) continue;
+
+                for (k=0; k<3; ++k) {
+                    // test all minus axis combination: ++, +-, -+, --
+                    b1 = a1 | (((k & 2) != 0) ? 0x80 : 0);
+                    b2 = a2 | (((k & 1) != 0) ? 0x80 : 0);
+                    // the third axis
+                    b3 = (6 - a1 -a2) |
+                         ( (((a2 + 3 - a1) % 3 == 2) ? 0x80 : 0) ^ (b1 & 0x80) ^ (b2 & 0x80));
+
+                    // test both input formats
+                    if ( (i & 1) != 0 ) {
+                      assertTrue(SensorManager.remapCoordinateSystem(R, b1, b2, Rout));
+                    } else {
+                      assertTrue(SensorManager.remapCoordinateSystem(mat9to16(R), b1, b2, Rout2));
+                      Rout = mat16to9(Rout2);
+                    }
+
+                    float [] v1, v2;
+
+                    String detail = String.format(
+                            "Details: case %d (%x %x %x), original R = %s, result R = %s.",
+                            i, b1, b2, b3, mat9ToStr(R), mat9ToStr(Rout));
+
+                    v1 = mat9Axis(R, SensorManager.AXIS_X);
+                    v2 = mat9Axis(Rout, b1);
+                    assertVectorRoughlyEqual(
+                        "remapCoordinateSystem gives incorrect result (x)." + detail,
+                        v1, v2, 1e-4f);
+
+                    v1 = mat9Axis(R, SensorManager.AXIS_Y);
+                    v2 = mat9Axis(Rout, b2);
+                    assertVectorRoughlyEqual(
+                        "remapCoordinateSystem gives incorrect result (y)." + detail,
+                        v1, v2, 1e-4f);
+
+                    v1 = mat9Axis(R, SensorManager.AXIS_Z);
+                    v2 = mat9Axis(Rout, b3);
+                    assertVectorRoughlyEqual(
+                        "remapCoordinateSystem gives incorrect result (z)." + detail,
+                        v1, v2, 1e-4f);
+                }
+            }
+
+        }
+
+        // test cases when false should be returned
+        assertTrue("remapCoordinateSystem should return false with mismatch size input and output",
+                   !SensorManager.remapCoordinateSystem(Rout,
+                     SensorManager.AXIS_Y, SensorManager.AXIS_Z, Rout2));
+        assertTrue("remapCoordinateSystem should return false with invalid axis setting",
+                   !SensorManager.remapCoordinateSystem(Rout,
+                     SensorManager.AXIS_X, SensorManager.AXIS_X, Rout));
+        assertTrue("remapCoordinateSystem should return false with invalid axis setting",
+                   !SensorManager.remapCoordinateSystem(Rout,
+                     SensorManager.AXIS_X, SensorManager.AXIS_MINUS_X, Rout));
+
+    }
+
+    // Utilities class & functions
+
+    private class TestDataGenerator {
+        // carry out test deterministically without manually picking numbers
+        private final long DEFAULT_SEED = 0xFEDCBA9876543210l;
+
+        private Random mRandom;
+
+        TestDataGenerator(long seed) {
+            mRandom = new Random(seed);
+        }
+
+        TestDataGenerator() {
+            mRandom = new Random(DEFAULT_SEED);
+        }
+
+        void nextRotationAngles(float [] rotv) {
+            assertTrue(rotv.length == 3);
+
+            rotv[0] = (mRandom.nextFloat()-0.5f) * 2.0f * FLOAT_PI; // azimuth(yaw) -pi ~ pi
+            rotv[1] = (mRandom.nextFloat()-0.5f) * FLOAT_PI; // pitch -pi/2 ~ +pi/2
+            rotv[2] = (mRandom.nextFloat()-0.5f) * 2.f * FLOAT_PI; // roll -pi ~ +pi
+        }
+
+        void nextRotationAxisAngle(float [] aa) {
+            assertTrue(aa.length == 4);
+
+            aa[0] = (mRandom.nextFloat() - 0.5f) * 2.f;
+            aa[1] = (mRandom.nextFloat() - 0.5f ) * 2.f * (float) Math.sqrt(1.f - aa[0] * aa[0]);
+            aa[2] = (mRandom.nextBoolean() ? 1.f : -1.f) *
+                        (float) Math.sqrt(1.f - aa[0] * aa[0] - aa[1] * aa[1]);
+            aa[3] = mRandom.nextFloat() * FLOAT_PI;
+        }
+
+        int nextInt(int i) {
+            return mRandom.nextInt(i);
+        }
+
+        float nextFloat() {
+            return mRandom.nextFloat();
+        }
+
+        boolean nextBoolean() {
+            return mRandom.nextBoolean();
+        }
+    }
+
+    private static void assertRotationAnglesValid(String message, float[] ra) {
+
+        assertTrue(message, ra.length == 3 &&
+            ra[0] >= -FLOAT_PI && ra[0] <= FLOAT_PI &&         // azimuth
+            ra[1] >= -FLOAT_PI / 2.f && ra[1] <= FLOAT_PI / 2.f && // pitch
+            ra[2] >= -FLOAT_PI && ra[2] <= FLOAT_PI);          // roll
+    }
+
+    private static void assertRoughlyEqual(String message, float a, float b, float bound) {
+        assertTrue(message, Math.abs(a-b) < bound);
+    }
+
+    private static void assertVectorRoughlyEqual(String message, float [] v1, float [] v2,
+                                                 float bound) {
+        assertTrue(message, v1.length == v2.length);
+        int i;
+        float sum = 0.f;
+        for (i=0; i<v1.length; ++i) {
+            sum += (v1[i] - v2[i]) * (v1[i] - v2[i]);
+        }
+        assertRoughlyEqual(message, (float)Math.sqrt(sum), 0.f, bound);
+    }
+
+    private static float [] mat9to16(float [] m) {
+        assertTrue(m.length == 9);
+
+        float [] n  = new float[16];
+        int i;
+        for (i=0; i<9; ++i) {
+            n[i+i/3] = m[i];
+        }
+        n[15] = 1.f;
+        return n;
+    }
+
+    private static float [] mat16to9(float [] m) {
+        assertTrue(m.length == 16);
+
+        float [] n = new float[9];
+        int i;
+        for (i=0; i<9; ++i) {
+            n[i] = m[i + i/3];
+        }
+        return n;
+    }
+
+    private static float [] mat9Mul(float [] m, float [] n) {
+        assertTrue(m.length == 9 && n.length == 9);
+
+        float [] r = new float[9];
+        int i, j, k;
+
+        for (i = 0; i < 3; ++i)
+            for (j = 0; j < 3; ++j)
+                for (k = 0; k < 3; ++k)
+                    r[i * 3 + j] += m[i * 3 + k] * n[k * 3 + j];
+
+        return r;
+    }
+
+    private static float [] mat9T(float [] m) {
+        assertTrue(m.length == 9);
+
+        int i, j;
+        float [] n = new float[9];
+
+        for (i = 0; i < 3; ++i)
+            for (j = 0; j < 3; ++j)
+                n[i * 3 + j] = m[j * 3 + i];
+
+        return n;
+    }
+
+    private static float [] mat9I() {
+        float [] m = new float[9];
+        m[0] = m[4] = m[8] = 1.f;
+        return m;
+    }
+
+    private static float [] mat9Rot(int axis, float angle) {
+        float [] m = new float[9];
+        switch (axis) {
+            case SensorManager.AXIS_X:
+                m[0] = 1.f;
+                m[4] = m[8] = (float) Math.cos(angle);
+                m[5] = - (m[7] = (float) Math.sin(angle));
+                break;
+            case SensorManager.AXIS_Y:
+                m[4] = 1.f;
+                m[0] = m[8] = (float) Math.cos(angle);
+                m[6] = - (m[2] = (float) Math.sin(angle));
+                break;
+            case SensorManager.AXIS_Z:
+                m[8] = 1.f;
+                m[0] = m[4] = (float) Math.cos(angle);
+                m[1] = - (m[3] = (float) Math.sin(angle));
+                break;
+            default:
+                // should never be here
+                assertTrue(false);
+        }
+        return m;
+    }
+
+    private static float [] mat9VRot(float [] angles) {
+        assertTrue(angles.length == 3);
+        // yaw, android yaw rotate to -z
+        float [] R = mat9Rot(SensorManager.AXIS_Z, -angles[0]);
+        // pitch, android pitch rotate to -x
+        R = mat9Mul(R, mat9Rot(SensorManager.AXIS_X, -angles[1]));
+        // roll
+        R = mat9Mul(R, mat9Rot(SensorManager.AXIS_Y, angles[2]));
+
+        return R;
+    }
+
+    private static float [] mat9Axis(float m[], int axis) {
+        assertTrue(m.length == 9);
+
+        boolean negative = (axis & 0x80) != 0;
+        float [] v = new float[3];
+        int offset;
+
+        offset = (axis & ~0x80) - 1;
+        v[0] = negative ? -m[offset]   : m[offset];
+        v[1] = negative ? -m[offset+3] : m[offset+3];
+        v[2] = negative ? -m[offset+6] : m[offset+6];
+        return v;
+    }
+
+    private static float vecInner(float u[], float v[]) {
+        assertTrue(u.length == v.length);
+
+        int i;
+        float sum = 0.f;
+
+        for (i=0; i < v.length; ++i) {
+            sum += u[i]*v[i];
+        }
+        return (float)Math.sqrt(sum);
+    }
+
+    private static String vecToStr(float u[]) {
+        int i;
+        String s;
+        switch (u.length) {
+            case 3:
+                return String.format("[%f, %f, %f]", u[0], u[1], u[2]);
+            case 4:
+                return String.format("(%f, %f, %f, %f)", u[0], u[1], u[2], u[3]);
+            default:
+                s = "[";
+                for (i = 0; i < u.length-1; ++i) {
+                    s += String.format("%f, ", u[i]);
+                }
+                s += String.format("%f]", u[i]);
+                return s;
+        }
+    }
+
+    private static String mat9ToStr(float m[]) {
+        assertTrue(m.length == 9);
+        return String.format("[%f, %f, %f; %f, %f, %f; %f, %f, %f]",
+            m[0], m[1], m[2],
+            m[3], m[4], m[5],
+            m[6], m[7], m[8]);
+    }
+
+    private static String mat16ToStr(float m[]) {
+        assertTrue(m.length == 16);
+        return String.format("[%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f]",
+            m[0], m[1], m[2], m[3],
+            m[4], m[5], m[6], m[7],
+            m[8], m[9], m[10], m[11],
+            m[12], m[13], m[14], m[15]);
+    }
+
+}
+
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index 6703c47..4450339 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -47,6 +47,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -353,9 +354,43 @@
         listener.assertEventsReceivedInHandler();
     }
 
+    /**
+     *  Explicit testing the SensorManager.registerListener(SensorEventListener, Sensor, int, int).
+     */
+    @TimeoutReq(minutes=10)
+    public void testBatchAndFlushUseDefaultHandler() throws Exception {
+        Sensor sensor = null;
+        for (Sensor s : mSensorList) {
+            if (s.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS) {
+                sensor = s;
+                break;
+            }
+        }
+        if (sensor == null) {
+            throw new SensorTestStateNotSupportedException(
+                    "There are no Continuous sensors in the device.");
+        }
+
+        TestSensorEnvironment environment = new TestSensorEnvironment(
+                getContext(),
+                sensor,
+                SensorManager.SENSOR_DELAY_FASTEST,
+                (int) TimeUnit.SECONDS.toMicros(5));
+        mTestSensorManager = new TestSensorManager(environment);
+
+        TestSensorEventListener listener = new TestSensorEventListener(environment, null);
+
+        // specifyHandler <= false, use the SensorManager API without Handler parameter
+        CountDownLatch eventLatch = mTestSensorManager.registerListener(listener, 1, false);
+        listener.waitForEvents(eventLatch, 1);
+        CountDownLatch flushLatch = mTestSensorManager.requestFlush();
+        listener.waitForFlushComplete(flushLatch);
+        listener.assertEventsReceivedInHandler();
+    }
+
     // TODO: after L release move to SensorBatchingTests and run in all sensors with default
     //       verifications enabled
-    public void testBatchAndFlushWithMutipleSensors() throws Exception {
+    public void testBatchAndFlushWithMultipleSensors() throws Exception {
         final int maxSensors = 3;
         final int maxReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(10);
         List<Sensor> sensorsToTest = new ArrayList<Sensor>();
@@ -568,4 +603,5 @@
         @Override
         public void onAccuracyChanged(Sensor sensor, int accuracy) {}
     }
+
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
index 2468bd1..23580de 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
@@ -77,6 +77,7 @@
 
         mTestSensorEventListener = listener;
         String message = SensorCtsHelper.formatAssertionMessage("registerListener", mEnvironment);
+
         boolean result = mSensorManager.registerListener(
                 mTestSensorEventListener,
                 mEnvironment.getSensor(),
@@ -94,7 +95,10 @@
      * @throws AssertionError if there was an error registering the listener with the
      * {@link SensorManager}
      */
-    public CountDownLatch registerListener(TestSensorEventListener listener, int eventCount) {
+    public CountDownLatch registerListener(
+            TestSensorEventListener listener,
+            int eventCount,
+            boolean specifyHandler) {
         if (mTestSensorEventListener != null) {
             Log.w(LOG_TAG, "Listener already registered, returning.");
             return null;
@@ -103,17 +107,41 @@
         CountDownLatch latch = listener.getLatchForSensorEvents(eventCount);
         mTestSensorEventListener = listener;
         String message = SensorCtsHelper.formatAssertionMessage("registerListener", mEnvironment);
-        boolean result = mSensorManager.registerListener(
-                mTestSensorEventListener,
-                mEnvironment.getSensor(),
-                mEnvironment.getRequestedSamplingPeriodUs(),
-                mEnvironment.getMaxReportLatencyUs(),
-                mTestSensorEventListener.getHandler());
+
+        boolean result;
+        if (specifyHandler) {
+            result = mSensorManager.registerListener(
+                    mTestSensorEventListener,
+                    mEnvironment.getSensor(),
+                    mEnvironment.getRequestedSamplingPeriodUs(),
+                    mEnvironment.getMaxReportLatencyUs(),
+                    mTestSensorEventListener.getHandler());
+        } else {
+            result = mSensorManager.registerListener(
+                    mTestSensorEventListener,
+                    mEnvironment.getSensor(),
+                    mEnvironment.getRequestedSamplingPeriodUs(),
+                    mEnvironment.getMaxReportLatencyUs());
+        }
         Assert.assertTrue(message, result);
         return latch;
     }
 
     /**
+     * Register the listener. This method will perform a no-op if the sensor is already registered.
+     *
+     * @return A CountDownLatch initialized with eventCount which is used to wait for sensor
+     * events.
+     * @throws AssertionError if there was an error registering the listener with the
+     * {@link SensorManager}
+     */
+    public CountDownLatch registerListener(
+            TestSensorEventListener listener,
+            int eventCount) {
+        return registerListener(listener, eventCount, true);
+    }
+
+    /**
      * Unregister the listener. This method will perform a no-op if the sensor is not registered.
      */
     public void unregisterListener() {
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/ErrorLoggingService.java b/tests/tests/hardware/src/android/hardware/multiprocess/ErrorLoggingService.java
new file mode 100644
index 0000000..1b713ba
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/ErrorLoggingService.java
@@ -0,0 +1,611 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.multiprocess;
+
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.ConditionVariable;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.util.Log;
+import android.util.Pair;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Service for collecting error messages from other processes.
+ *
+ * <p />
+ * Used by CTS for multi-process error logging.
+ */
+public class ErrorLoggingService extends Service {
+    public static final String TAG = "ErrorLoggingService";
+
+    /**
+     * Receive all currently logged error strings in replyTo Messenger.
+     */
+    public static final int MSG_GET_LOG = 0;
+
+    /**
+     * Append a new error string to the log maintained in this service.
+     */
+    public static final int MSG_LOG_EVENT = 1;
+
+    /**
+     * Logged errors being reported in a replyTo Messenger by this service.
+     */
+    public static final int MSG_LOG_REPORT = 2;
+
+    /**
+     * A list of strings containing all error messages reported to this service.
+     */
+    private final ArrayList<LogEvent> mLog = new ArrayList<>();
+
+    /**
+     * A list of Messengers waiting for logs for any event.
+     */
+    private final ArrayList<Pair<Integer, Messenger>> mEventWaiters = new ArrayList<>();
+
+    private static final int DO_EVENT_FILTER = 1;
+    private static final String LOG_EVENT = "log_event";
+    private static final String LOG_EVENT_ARRAY = "log_event_array";
+
+
+    /**
+     * The messenger binder used by clients of this service to report/retrieve errors.
+     */
+    private final Messenger mMessenger = new Messenger(new MainHandler(mLog, mEventWaiters));
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mLog.clear();
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return mMessenger.getBinder();
+    }
+
+    /**
+     * Handler implementing the message interface for this service.
+     */
+    private static class MainHandler extends Handler {
+
+        ArrayList<LogEvent> mErrorLog;
+        ArrayList<Pair<Integer, Messenger>> mEventWaiters;
+
+        MainHandler(ArrayList<LogEvent> log, ArrayList<Pair<Integer, Messenger>> waiters) {
+            mErrorLog = log;
+            mEventWaiters = waiters;
+        }
+
+        private void sendMessages() {
+            if (mErrorLog.size() > 0) {
+                ListIterator<Pair<Integer, Messenger>> iter = mEventWaiters.listIterator();
+                boolean messagesHandled = false;
+                while (iter.hasNext()) {
+                    Pair<Integer, Messenger> elem = iter.next();
+                    for (LogEvent i : mErrorLog) {
+                        if (elem.first == null || elem.first == i.getEvent()) {
+                            Message m = Message.obtain(null, MSG_LOG_REPORT);
+                            Bundle b = m.getData();
+                            b.putParcelableArray(LOG_EVENT_ARRAY,
+                                    mErrorLog.toArray(new LogEvent[mErrorLog.size()]));
+                            m.setData(b);
+                            try {
+                                elem.second.send(m);
+                                messagesHandled = true;
+                            } catch (RemoteException e) {
+                                Log.e(TAG, "Could not report log message to remote, " +
+                                        "received exception from remote: " + e +
+                                        "\n  Original errors: " +
+                                        Arrays.toString(mErrorLog.toArray()));
+                            }
+                            iter.remove();
+                        }
+                    }
+                }
+                if (messagesHandled) {
+                    mErrorLog.clear();
+                }
+            }
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch(msg.what) {
+                case MSG_GET_LOG:
+                    if (msg.replyTo == null) {
+                        break;
+                    }
+
+                    if (msg.arg1 == DO_EVENT_FILTER) {
+                        mEventWaiters.add(new Pair<Integer, Messenger>(msg.arg2, msg.replyTo));
+                    } else {
+                        mEventWaiters.add(new Pair<Integer, Messenger>(null, msg.replyTo));
+                    }
+
+                    sendMessages();
+
+                    break;
+                case MSG_LOG_EVENT:
+                    Bundle b = msg.getData();
+                    b.setClassLoader(LogEvent.class.getClassLoader());
+                    LogEvent error = b.getParcelable(LOG_EVENT);
+                    mErrorLog.add(error);
+
+                    sendMessages();
+
+                    break;
+                default:
+                    Log.e(TAG, "Unknown message type: " + msg.what);
+                    super.handleMessage(msg);
+            }
+        }
+    }
+
+    /**
+     * Parcelable object to use with logged events.
+     */
+    public static class LogEvent implements Parcelable {
+
+        private final int mEvent;
+        private final String mLogText;
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel out, int flags) {
+            out.writeInt(mEvent);
+            out.writeString(mLogText);
+        }
+
+        public int getEvent() {
+            return mEvent;
+        }
+
+        public String getLogText() {
+            return mLogText;
+        }
+
+        public static final Parcelable.Creator<LogEvent> CREATOR
+                = new Parcelable.Creator<LogEvent>() {
+
+            public LogEvent createFromParcel(Parcel in) {
+                return new LogEvent(in);
+            }
+
+            public LogEvent[] newArray(int size) {
+                return new LogEvent[size];
+            }
+        };
+
+        private LogEvent(Parcel in) {
+            mEvent = in.readInt();
+            mLogText = in.readString();
+        }
+
+        public LogEvent(int id, String msg) {
+            mEvent = id;
+            mLogText = msg;
+        }
+
+        @Override
+        public String toString() {
+            return "LogEvent{" +
+                    "Event=" + mEvent +
+                    ", LogText='" + mLogText + '\'' +
+                    '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            LogEvent logEvent = (LogEvent) o;
+
+            if (mEvent != logEvent.mEvent) return false;
+            if (mLogText != null ? !mLogText.equals(logEvent.mLogText) : logEvent.mLogText != null)
+                return false;
+
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            int result = mEvent;
+            result = 31 * result + (mLogText != null ? mLogText.hashCode() : 0);
+            return result;
+        }
+    }
+
+    /**
+     * Implementation of Future to use when retrieving error messages from service.
+     *
+     * <p />
+     * To use this, either pass a {@link Runnable} or {@link Callable} in the constructor,
+     * or use the default constructor and set the result externally with {@link #setResult(Object)}.
+     */
+    private static class SettableFuture<T> extends FutureTask<T> {
+
+        public SettableFuture() {
+            super(new Callable<T>() {
+                @Override
+                public T call() throws Exception {
+                    throw new IllegalStateException(
+                            "Empty task, use #setResult instead of calling run.");
+                }
+            });
+        }
+
+        public SettableFuture(Callable<T> callable) {
+            super(callable);
+        }
+
+        public SettableFuture(Runnable runnable, T result) {
+            super(runnable, result);
+        }
+
+        public void setResult(T result) {
+            set(result);
+        }
+    }
+
+    /**
+     * Helper class for setting up and using a connection to {@link ErrorLoggingService}.
+     */
+    public static class ErrorServiceConnection implements AutoCloseable {
+
+        private Messenger mService = null;
+        private boolean mBind = false;
+        private final Object mLock = new Object();
+        private final Context mContext;
+        private final HandlerThread mReplyThread;
+        private ReplyHandler mReplyHandler;
+        private Messenger mReplyMessenger;
+
+        /**
+         * Construct a connection to the {@link ErrorLoggingService} in the given {@link Context}.
+         *
+         * @param context the {@link Context} to bind the service in.
+         */
+        public ErrorServiceConnection(final Context context) {
+            mContext = context;
+            mReplyThread = new HandlerThread("ErrorServiceConnection");
+            mReplyThread.start();
+            mReplyHandler = new ReplyHandler(mReplyThread.getLooper());
+            mReplyMessenger = new Messenger(mReplyHandler);
+        }
+
+        @Override
+        public void close() {
+            stop();
+            mReplyThread.quit();
+            synchronized (mLock) {
+                mService = null;
+                mBind = false;
+                mReplyHandler.cancelAll();
+            }
+        }
+
+        @Override
+        protected void finalize() throws Throwable {
+            close();
+            super.finalize();
+        }
+
+        private static final class ReplyHandler extends Handler {
+
+            private final LinkedBlockingQueue<SettableFuture<List<LogEvent>>> mFuturesQueue =
+                    new LinkedBlockingQueue<>();
+
+            private ReplyHandler(Looper looper) {
+                super(looper);
+            }
+
+            /**
+             * Cancel all pending futures for this handler.
+             */
+            public void cancelAll() {
+                List<SettableFuture<List<LogEvent>>> logFutures = new ArrayList<>();
+                mFuturesQueue.drainTo(logFutures);
+                for (SettableFuture<List<LogEvent>> i : logFutures) {
+                    i.cancel(true);
+                }
+            }
+
+            /**
+             * Cancel a given future, and remove from the pending futures for this handler.
+             *
+             * @param report future to remove.
+             */
+            public void cancel(SettableFuture<List<LogEvent>> report) {
+                mFuturesQueue.remove(report);
+                report.cancel(true);
+            }
+
+            /**
+             * Add future for the next received report from this service.
+             *
+             * @param report a future to get the next received event report from.
+             */
+            public void addFuture(SettableFuture<List<LogEvent>> report) {
+                if (!mFuturesQueue.offer(report)) {
+                    Log.e(TAG, "Could not request another error report, too many requests queued.");
+                }
+            }
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public void handleMessage(Message msg) {
+                switch (msg.what) {
+                    case MSG_LOG_REPORT:
+                        SettableFuture<List<LogEvent>> task = mFuturesQueue.poll();
+                        if (task == null) break;
+                        Bundle b = msg.getData();
+                        b.setClassLoader(LogEvent.class.getClassLoader());
+                        Parcelable[] array = b.getParcelableArray(LOG_EVENT_ARRAY);
+                        LogEvent[] events = Arrays.copyOf(array, array.length, LogEvent[].class);
+                        List<LogEvent> res = Arrays.asList(events);
+                        task.setResult(res);
+                        break;
+                    default:
+                        Log.e(TAG, "Unknown message type: " + msg.what);
+                        super.handleMessage(msg);
+                }
+            }
+        }
+
+        private ServiceConnection mConnection = new ServiceConnection() {
+            @Override
+            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
+                Log.i(TAG, "Service connected.");
+                synchronized (mLock) {
+                    mService = new Messenger(iBinder);
+                    mBind = true;
+                    mLock.notifyAll();
+                }
+            }
+
+            @Override
+            public void onServiceDisconnected(ComponentName componentName) {
+                Log.i(TAG, "Service disconnected.");
+                synchronized (mLock) {
+                    mService = null;
+                    mBind = false;
+                    mReplyHandler.cancelAll();
+                }
+            }
+        };
+
+        private Messenger blockingGetBoundService() {
+            synchronized (mLock) {
+                if (!mBind) {
+                    mContext.bindService(new Intent(mContext, ErrorLoggingService.class), mConnection,
+                            Context.BIND_AUTO_CREATE);
+                    mBind = true;
+                }
+                try {
+                    while (mService == null && mBind) {
+                        mLock.wait();
+                    }
+                } catch (InterruptedException e) {
+                    Log.e(TAG, "Waiting for error service interrupted: " + e);
+                }
+                if (!mBind) {
+                    Log.w(TAG, "Could not get service, service disconnected.");
+                }
+                return mService;
+            }
+        }
+
+        private Messenger getBoundService() {
+            synchronized (mLock) {
+                if (!mBind) {
+                    mContext.bindService(new Intent(mContext, ErrorLoggingService.class), mConnection,
+                            Context.BIND_AUTO_CREATE);
+                    mBind = true;
+                }
+                return mService;
+            }
+        }
+
+        /**
+         * If the {@link ErrorLoggingService} is not yet bound, begin service connection attempt.
+         *
+         * <p />
+         * Note: This will not block.
+         */
+        public void start() {
+            synchronized (mLock) {
+                if (!mBind) {
+                    mContext.bindService(new Intent(mContext, ErrorLoggingService.class), mConnection,
+                            Context.BIND_AUTO_CREATE);
+                    mBind = true;
+                }
+            }
+        }
+
+        /**
+         * Unbind from the {@link ErrorLoggingService} if it has been bound.
+         *
+         * <p />
+         * Note: This will not block.
+         */
+        public void stop() {
+            synchronized (mLock) {
+                if (mBind) {
+                    mContext.unbindService(mConnection);
+                    mBind = false;
+                }
+            }
+        }
+
+        /**
+         * Send an logged event to the bound {@link ErrorLoggingService}.
+         *
+         * <p />
+         * If the service is not yet bound, this will bind the service and wait until it has been
+         * connected.
+         *
+         * <p />
+         * This is not safe to call from the UI thread, as this will deadlock with the looper used
+         * when connecting the service.
+         *
+         * @param id an int indicating the ID of this event.
+         * @param msg a {@link String} message to send.
+         */
+        public void log(final int id, final String msg) {
+            Messenger service = blockingGetBoundService();
+            Message m = Message.obtain(null, MSG_LOG_EVENT);
+            m.getData().putParcelable(LOG_EVENT, new LogEvent(id, msg));
+            try {
+                service.send(m);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Received exception while logging error: " + e);
+            }
+        }
+
+        /**
+         * Send an logged event to the bound {@link ErrorLoggingService} when it becomes available.
+         *
+         * <p />
+         * If the service is not yet bound, this will bind the service.
+         *
+         * @param id an int indicating the ID of this event.
+         * @param msg a {@link String} message to send.
+         */
+        public void logAsync(final int id, final String msg) {
+            AsyncTask.SERIAL_EXECUTOR.execute(new Runnable() {
+                @Override
+                public void run() {
+                    log(id, msg);
+                }
+            });
+        }
+
+        /**
+         * Retrieve all events logged in the {@link ErrorLoggingService}.
+         *
+         * <p />
+         * If the service is not yet bound, this will bind the service and wait until it has been
+         * connected.  Likewise, after the service has been bound, this method will block until
+         * the given timeout passes or an event is logged in the service.  Passing a negative
+         * timeout is equivalent to using an infinite timeout value.
+         *
+         * <p />
+         * This is not safe to call from the UI thread, as this will deadlock with the looper used
+         * when connecting the service.
+         *
+         * <p />
+         * Note: This method clears the events stored in the bound {@link ErrorLoggingService}.
+         *
+         * @param timeoutMs the number of milliseconds to wait for a logging event.
+         * @return a list of {@link String} error messages reported to the bound
+         *          {@link ErrorLoggingService} since the last call to getLog.
+         *
+         * @throws TimeoutException if the given timeout elapsed with no events logged.
+         */
+        public List<LogEvent> getLog(long timeoutMs) throws TimeoutException {
+            return retrieveLog(false, 0, timeoutMs);
+        }
+
+        /**
+         * Retrieve all events logged in the {@link ErrorLoggingService}.
+         *
+         * <p />
+         * If the service is not yet bound, this will bind the service and wait until it has been
+         * connected.  Likewise, after the service has been bound, this method will block until
+         * the given timeout passes or an event with the given event ID is logged in the service.
+         * Passing a negative timeout is equivalent to using an infinite timeout value.
+         *
+         * <p />
+         * This is not safe to call from the UI thread, as this will deadlock with the looper used
+         * when connecting the service.
+         *
+         * <p />
+         * Note: This method clears the events stored in the bound {@link ErrorLoggingService}.
+         *
+         * @param timeoutMs the number of milliseconds to wait for a logging event.
+         * @param event the ID of the event to wait for.
+         * @return a list of {@link String} error messages reported to the bound
+         *          {@link ErrorLoggingService} since the last call to getLog.
+         *
+         * @throws TimeoutException if the given timeout elapsed with no events of the given type
+         *          logged.
+         */
+        public List<LogEvent> getLog(long timeoutMs, int event) throws TimeoutException {
+            return retrieveLog(true, event, timeoutMs);
+        }
+
+        private List<LogEvent> retrieveLog(boolean hasEvent, int event, long timeout)
+                throws TimeoutException {
+            Messenger service = blockingGetBoundService();
+
+            SettableFuture<List<LogEvent>> task = new SettableFuture<>();
+
+            Message m = (hasEvent) ?
+                    Message.obtain(null, MSG_GET_LOG, DO_EVENT_FILTER, event, null) :
+                    Message.obtain(null, MSG_GET_LOG);
+            m.replyTo = mReplyMessenger;
+
+            synchronized(this) {
+                mReplyHandler.addFuture(task);
+                try {
+                    service.send(m);
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Received exception while retrieving errors: " + e);
+                    return null;
+                }
+            }
+
+            List<LogEvent> res = null;
+            try {
+                res = (timeout < 0) ? task.get() : task.get(timeout, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException|ExecutionException e) {
+                Log.e(TAG, "Received exception while retrieving errors: " + e);
+            }
+            return res;
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera1Activity.java b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera1Activity.java
new file mode 100644
index 0000000..5c27111
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera1Activity.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.multiprocess.camera.cts;
+
+import android.app.Activity;
+import android.hardware.Camera;
+import android.hardware.multiprocess.ErrorLoggingService;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * Activity implementing basic access of the Camera1 API.
+ *
+ * <p />
+ * This will log all errors to {@link android.hardware.multiprocess.ErrorLoggingService}.
+ */
+public class Camera1Activity extends Activity {
+    private static final String TAG = "Camera1Activity";
+
+    Camera mCamera;
+    ErrorLoggingService.ErrorServiceConnection mErrorServiceConnection;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate called.");
+        super.onCreate(savedInstanceState);
+        mErrorServiceConnection = new ErrorLoggingService.ErrorServiceConnection(this);
+        mErrorServiceConnection.start();
+    }
+
+    @Override
+    protected void onResume() {
+        Log.i(TAG, "onResume called.");
+        super.onResume();
+        try {
+            mCamera = Camera.open();
+            if (mCamera == null) {
+                mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                        " no cameras available.");
+            }
+            mCamera.setErrorCallback(new Camera.ErrorCallback() {
+                @Override
+                public void onError(int i, Camera camera) {
+                    if (i == Camera.CAMERA_ERROR_EVICTED) {
+                        mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_EVICTED,
+                                TAG + " camera evicted");
+                        Log.e(TAG, "onError called with event " + i + ", camera evicted");
+                    } else {
+                        mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR,
+                                TAG + " camera experienced error: " + i);
+                        Log.e(TAG, "onError called with event " + i + ", camera error");
+                    }
+                }
+            });
+            mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_CONNECT,
+                    TAG + " camera connected");
+        } catch (RuntimeException e) {
+            mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                    " camera exception during connection: " + e);
+            Log.e(TAG, "Runtime error: " + e);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        Log.i(TAG, "onPause called.");
+        super.onPause();
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.i(TAG, "onDestroy called.");
+        super.onDestroy();
+        if (mErrorServiceConnection != null) {
+            mErrorServiceConnection.stop();
+            mErrorServiceConnection = null;
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera2Activity.java b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera2Activity.java
new file mode 100644
index 0000000..2a78649
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera2Activity.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.multiprocess.camera.cts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.multiprocess.ErrorLoggingService;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.Log;
+
+/**
+ * Activity implementing basic access of the Camera2 API.
+ *
+ * <p />
+ * This will log all errors to {@link android.hardware.multiprocess.ErrorLoggingService}.
+ */
+public class Camera2Activity extends Activity {
+    private static final String TAG = "Camera2Activity";
+
+    ErrorLoggingService.ErrorServiceConnection mErrorServiceConnection;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate called.");
+        super.onCreate(savedInstanceState);
+        mErrorServiceConnection = new ErrorLoggingService.ErrorServiceConnection(this);
+        mErrorServiceConnection.start();
+    }
+
+    @Override
+    protected void onPause() {
+        Log.i(TAG, "onPause called.");
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        Log.i(TAG, "onResume called.");
+        super.onResume();
+
+        try {
+            CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
+
+            if (manager == null) {
+                mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                        " could not connect camera service");
+                return;
+            }
+            String[] cameraIds = manager.getCameraIdList();
+
+            if (cameraIds == null || cameraIds.length == 0) {
+                mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                        " device reported having no cameras");
+                return;
+            }
+
+            manager.registerAvailabilityCallback(new CameraManager.AvailabilityCallback() {
+                @Override
+                public void onCameraAvailable(String cameraId) {
+                    super.onCameraAvailable(cameraId);
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_AVAILABLE,
+                            cameraId);
+                    Log.i(TAG, "Camera " + cameraId + " is available");
+                }
+
+                @Override
+                public void onCameraUnavailable(String cameraId) {
+                    super.onCameraUnavailable(cameraId);
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_UNAVAILABLE,
+                            cameraId);
+                    Log.i(TAG, "Camera " + cameraId + " is unavailable");
+                }
+            }, null);
+
+            final String chosen = cameraIds[0];
+
+            manager.openCamera(chosen, new CameraDevice.StateCallback() {
+                @Override
+                public void onOpened(CameraDevice cameraDevice) {
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_CONNECT,
+                            chosen);
+                    Log.i(TAG, "Camera " + chosen + " is opened");
+                }
+
+                @Override
+                public void onDisconnected(CameraDevice cameraDevice) {
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_EVICTED,
+                            chosen);
+                    Log.i(TAG, "Camera " + chosen + " is disconnected");
+                }
+
+                @Override
+                public void onError(CameraDevice cameraDevice, int i) {
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                            " Camera " + chosen + " experienced error " + i);
+                    Log.e(TAG, "Camera " + chosen + " onError called with error " + i);
+                }
+            }, null);
+        } catch (CameraAccessException e) {
+            mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                    " camera exception during connection: " + e);
+            Log.e(TAG, "Access exception: " + e);
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.i(TAG, "onDestroy called.");
+        super.onDestroy();
+        if (mErrorServiceConnection != null) {
+            mErrorServiceConnection.stop();
+            mErrorServiceConnection = null;
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/CameraEvictionTest.java b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/CameraEvictionTest.java
new file mode 100644
index 0000000..3cf1dc7
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/CameraEvictionTest.java
@@ -0,0 +1,494 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.multiprocess.camera.cts;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.Camera;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.cts.CameraCtsActivity;
+import android.hardware.multiprocess.ErrorLoggingService;
+import android.os.Handler;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeoutException;
+
+import static org.mockito.Mockito.*;
+
+/**
+ * Tests for multi-process camera usage behavior.
+ */
+public class CameraEvictionTest extends ActivityInstrumentationTestCase2<CameraCtsActivity> {
+
+    public static final String TAG = "CameraEvictionTest";
+
+    private static final int OPEN_TIMEOUT = 2000; // Timeout for camera to open (ms).
+    private static final int SETUP_TIMEOUT = 5000; // Remote camera setup timeout (ms).
+    private static final int EVICTION_TIMEOUT = 1000; // Remote camera eviction timeout (ms).
+    private static final int WAIT_TIME = 2000; // Time to wait for process to launch (ms).
+    private static final int UI_TIMEOUT = 10000; // Time to wait for UI event before timeout (ms).
+    ErrorLoggingService.ErrorServiceConnection mErrorServiceConnection;
+
+    private ActivityManager mActivityManager;
+    private Context mContext;
+    private Camera mCamera;
+    private CameraDevice mCameraDevice;
+    private final Object mLock = new Object();
+    private boolean mCompleted = false;
+    private int mProcessPid = -1;
+
+    public CameraEvictionTest() {
+        super(CameraCtsActivity.class);
+    }
+
+    public static class StateCallbackImpl extends CameraDevice.StateCallback {
+        CameraDevice mCameraDevice;
+
+        public StateCallbackImpl() {
+            super();
+        }
+
+        @Override
+        public void onOpened(CameraDevice cameraDevice) {
+            synchronized(this) {
+                mCameraDevice = cameraDevice;
+            }
+            Log.i(TAG, "CameraDevice onOpened called for main CTS test process.");
+        }
+
+        @Override
+        public void onClosed(CameraDevice camera) {
+            super.onClosed(camera);
+            synchronized(this) {
+                mCameraDevice = null;
+            }
+            Log.i(TAG, "CameraDevice onClosed called for main CTS test process.");
+        }
+
+        @Override
+        public void onDisconnected(CameraDevice cameraDevice) {
+            synchronized(this) {
+                mCameraDevice = null;
+            }
+            Log.i(TAG, "CameraDevice onDisconnected called for main CTS test process.");
+
+        }
+
+        @Override
+        public void onError(CameraDevice cameraDevice, int i) {
+            Log.i(TAG, "CameraDevice onError called for main CTS test process with error " +
+                    "code: " + i);
+        }
+
+        public synchronized CameraDevice getCameraDevice() {
+            return mCameraDevice;
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mCompleted = false;
+        mContext = getActivity();
+        System.setProperty("dexmaker.dexcache", mContext.getCacheDir().toString());
+        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+        mErrorServiceConnection = new ErrorLoggingService.ErrorServiceConnection(mContext);
+        mErrorServiceConnection.start();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        if (mProcessPid != -1) {
+            android.os.Process.killProcess(mProcessPid);
+            mProcessPid = -1;
+        }
+        if (mErrorServiceConnection != null) {
+            mErrorServiceConnection.stop();
+            mErrorServiceConnection = null;
+        }
+        if (mCamera != null) {
+            mCamera.release();
+            mCamera = null;
+        }
+        if (mCameraDevice != null) {
+            mCameraDevice.close();
+            mCameraDevice = null;
+        }
+        mContext = null;
+        mActivityManager = null;
+    }
+
+    /**
+     * Test basic eviction scenarios for the Camera1 API.
+     */
+    public void testCamera1ActivityEviction() throws Throwable {
+
+        // Open a camera1 client in the main CTS process's activity
+        final Camera.ErrorCallback mockErrorCb1 = mock(Camera.ErrorCallback.class);
+        final boolean[] skip = {false};
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // Open camera
+                mCamera = Camera.open();
+                if (mCamera == null) {
+                    skip[0] = true;
+                } else {
+                    mCamera.setErrorCallback(mockErrorCb1);
+                }
+                notifyFromUI();
+            }
+        });
+        waitForUI();
+
+        if (skip[0]) {
+            Log.i(TAG, "Skipping testCamera1ActivityEviction, device has no cameras.");
+            return;
+        }
+
+        verifyZeroInteractions(mockErrorCb1);
+
+        startRemoteProcess(Camera1Activity.class, "camera1ActivityProcess");
+
+        // Make sure camera was setup correctly in remote activity
+        List<ErrorLoggingService.LogEvent> events = null;
+        try {
+            events = mErrorServiceConnection.getLog(SETUP_TIMEOUT,
+                    TestConstants.EVENT_CAMERA_CONNECT);
+        } finally {
+            if (events != null) assertOnly(TestConstants.EVENT_CAMERA_CONNECT, events);
+        }
+
+        Thread.sleep(WAIT_TIME);
+
+        // Ensure UI thread has a chance to process callbacks.
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Log.i("CTS", "Did something on UI thread.");
+                notifyFromUI();
+            }
+        });
+        waitForUI();
+
+        // Make sure we received correct callback in error listener, and nothing else
+        verify(mockErrorCb1, only()).onError(eq(Camera.CAMERA_ERROR_EVICTED), isA(Camera.class));
+        mCamera = null;
+
+        // Try to open the camera again (even though other TOP process holds the camera).
+        final boolean[] pass = {false};
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // Open camera
+                try {
+                    mCamera = Camera.open();
+                } catch (RuntimeException e) {
+                    pass[0] = true;
+                }
+                notifyFromUI();
+            }
+        });
+        waitForUI();
+
+        assertTrue("Did not receive exception when opening camera while camera is held by a" +
+                " higher priority client process.", pass[0]);
+
+        // Verify that attempting to open the camera didn't cause anything weird to happen in the
+        // other process.
+        List<ErrorLoggingService.LogEvent> eventList2 = null;
+        boolean timeoutExceptionHit = false;
+        try {
+            eventList2 = mErrorServiceConnection.getLog(EVICTION_TIMEOUT);
+        } catch (TimeoutException e) {
+            timeoutExceptionHit = true;
+        }
+
+        assertNone("Remote camera service received invalid events: ", eventList2);
+        assertTrue("Remote camera service exited early", timeoutExceptionHit);
+        android.os.Process.killProcess(mProcessPid);
+        mProcessPid = -1;
+    }
+
+    /**
+     * Test basic eviction scenarios for the Camera2 API.
+     */
+    public void testBasicCamera2ActivityEviction() throws Throwable {
+        CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
+        assertNotNull(manager);
+        String[] cameraIds = manager.getCameraIdList();
+        assertNotEmpty(cameraIds);
+        assertTrue(mContext.getMainLooper() != null);
+
+        // Setup camera manager
+        String chosenCamera = cameraIds[0];
+        Handler cameraHandler = new Handler(mContext.getMainLooper());
+        final CameraManager.AvailabilityCallback mockAvailCb =
+                mock(CameraManager.AvailabilityCallback.class);
+
+        manager.registerAvailabilityCallback(mockAvailCb, cameraHandler);
+
+        Thread.sleep(WAIT_TIME);
+
+        verify(mockAvailCb, times(1)).onCameraAvailable(chosenCamera);
+        verify(mockAvailCb, never()).onCameraUnavailable(chosenCamera);
+
+        // Setup camera device
+        final CameraDevice.StateCallback spyStateCb = spy(new StateCallbackImpl());
+        manager.openCamera(chosenCamera, spyStateCb, cameraHandler);
+
+        verify(spyStateCb, timeout(OPEN_TIMEOUT).times(1)).onOpened(any(CameraDevice.class));
+        verify(spyStateCb, never()).onClosed(any(CameraDevice.class));
+        verify(spyStateCb, never()).onDisconnected(any(CameraDevice.class));
+        verify(spyStateCb, never()).onError(any(CameraDevice.class), anyInt());
+
+        // Open camera from remote process
+        startRemoteProcess(Camera2Activity.class, "camera2ActivityProcess");
+
+        // Verify that the remote camera was opened correctly
+        List<ErrorLoggingService.LogEvent> allEvents  = mErrorServiceConnection.getLog(SETUP_TIMEOUT,
+                TestConstants.EVENT_CAMERA_CONNECT);
+        assertNotNull("Camera device not setup in remote process!", allEvents);
+
+        // Filter out relevant events for other camera devices
+        ArrayList<ErrorLoggingService.LogEvent> events = new ArrayList<>();
+        for (ErrorLoggingService.LogEvent e : allEvents) {
+            int eventTag = e.getEvent();
+            if (eventTag == TestConstants.EVENT_CAMERA_UNAVAILABLE ||
+                    eventTag == TestConstants.EVENT_CAMERA_CONNECT ||
+                    eventTag == TestConstants.EVENT_CAMERA_AVAILABLE) {
+                if (!Objects.equals(e.getLogText(), chosenCamera)) {
+                    continue;
+                }
+            }
+            events.add(e);
+        }
+        int[] eventList = new int[events.size()];
+        int eventIdx = 0;
+        for (ErrorLoggingService.LogEvent e : events) {
+            eventList[eventIdx++] = e.getEvent();
+        }
+        String[] actualEvents = TestConstants.convertToStringArray(eventList);
+        String[] expectedEvents = new String[] {TestConstants.EVENT_CAMERA_UNAVAILABLE_STR,
+                TestConstants.EVENT_CAMERA_CONNECT_STR};
+        String[] ignoredEvents = new String[] { TestConstants.EVENT_CAMERA_AVAILABLE_STR,
+                TestConstants.EVENT_CAMERA_UNAVAILABLE_STR };
+        assertOrderedEvents(actualEvents, expectedEvents, ignoredEvents);
+
+        // Verify that the local camera was evicted properly
+        verify(spyStateCb, times(1)).onDisconnected(any(CameraDevice.class));
+        verify(spyStateCb, never()).onClosed(any(CameraDevice.class));
+        verify(spyStateCb, never()).onError(any(CameraDevice.class), anyInt());
+        verify(spyStateCb, times(1)).onOpened(any(CameraDevice.class));
+
+        // Verify that we can no longer open the camera, as it is held by a higher priority process
+        boolean openException = false;
+        try {
+            manager.openCamera(chosenCamera, spyStateCb, cameraHandler);
+        } catch(CameraAccessException e) {
+            assertTrue("Received incorrect camera exception when opening camera: " + e,
+                    e.getReason() == CameraAccessException.CAMERA_IN_USE);
+            openException = true;
+        }
+
+        assertTrue("Didn't receive exception when trying to open camera held by higher priority " +
+                "process.", openException);
+
+        // Verify that attempting to open the camera didn't cause anything weird to happen in the
+        // other process.
+        List<ErrorLoggingService.LogEvent> eventList2 = null;
+        boolean timeoutExceptionHit = false;
+        try {
+            eventList2 = mErrorServiceConnection.getLog(EVICTION_TIMEOUT);
+        } catch (TimeoutException e) {
+            timeoutExceptionHit = true;
+        }
+
+        assertNone("Remote camera service received invalid events: ", eventList2);
+        assertTrue("Remote camera service exited early", timeoutExceptionHit);
+        android.os.Process.killProcess(mProcessPid);
+        mProcessPid = -1;
+    }
+
+    /**
+     * Block until UI thread calls {@link #notifyFromUI()}.
+     * @throws InterruptedException
+     */
+    private void waitForUI() throws InterruptedException {
+        synchronized(mLock) {
+            if (mCompleted) return;
+            while (!mCompleted) {
+                mLock.wait();
+            }
+            mCompleted = false;
+        }
+    }
+
+    /**
+     * Wake up any threads waiting in calls to {@link #waitForUI()}.
+     */
+    private void notifyFromUI() {
+        synchronized (mLock) {
+            mCompleted = true;
+            mLock.notifyAll();
+        }
+    }
+
+    /**
+     * Return the PID for the process with the given name in the given list of process info.
+     *
+     * @param processName the name of the process who's PID to return.
+     * @param list a list of {@link ActivityManager.RunningAppProcessInfo} to check.
+     * @return the PID of the given process, or -1 if it was not included in the list.
+     */
+    private static int getPid(String processName,
+                              List<ActivityManager.RunningAppProcessInfo> list) {
+        for (ActivityManager.RunningAppProcessInfo rai : list) {
+            if (processName.equals(rai.processName))
+                return rai.pid;
+        }
+        return -1;
+    }
+
+    /**
+     * Start an activity of the given class running in a remote process with the given name.
+     *
+     * @param klass the class of the {@link android.app.Activity} to start.
+     * @param processName the remote activity name.
+     * @throws InterruptedException
+     */
+    public void startRemoteProcess(java.lang.Class<?> klass, String processName)
+            throws InterruptedException {
+        // Ensure no running activity process with same name
+        String cameraActivityName = mContext.getPackageName() + ":" + processName;
+        List<ActivityManager.RunningAppProcessInfo> list =
+                mActivityManager.getRunningAppProcesses();
+        assertEquals(-1, getPid(cameraActivityName, list));
+
+        // Start activity in a new top foreground process
+        Intent activityIntent = new Intent(mContext, klass);
+        activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(activityIntent);
+        Thread.sleep(WAIT_TIME);
+
+        // Fail if activity isn't running
+        list = mActivityManager.getRunningAppProcesses();
+        mProcessPid = getPid(cameraActivityName, list);
+        assertTrue(-1 != mProcessPid);
+    }
+
+    /**
+     * Assert that there is only one event of the given type in the event list.
+     *
+     * @param event event type to check for.
+     * @param events {@link List} of events.
+     */
+    public static void assertOnly(int event, List<ErrorLoggingService.LogEvent> events) {
+        assertTrue("Remote camera activity never received event: " + event, events != null);
+        for (ErrorLoggingService.LogEvent e : events) {
+            assertFalse("Remote camera activity received invalid event (" + e +
+                    ") while waiting for event: " + event,
+                    e.getEvent() < 0 || e.getEvent() != event);
+        }
+        assertTrue("Remote camera activity never received event: " + event, events.size() >= 1);
+        assertTrue("Remote camera activity received too many " + event + " events, received: " +
+                events.size(), events.size() == 1);
+    }
+
+    /**
+     * Assert there were no logEvents in the given list.
+     *
+     * @param msg message to show on assertion failure.
+     * @param events {@link List} of events.
+     */
+    public static void assertNone(String msg, List<ErrorLoggingService.LogEvent> events) {
+        if (events == null) return;
+        StringBuilder builder = new StringBuilder(msg + "\n");
+        for (ErrorLoggingService.LogEvent e : events) {
+            builder.append(e).append("\n");
+        }
+        assertTrue(builder.toString(), events.isEmpty());
+    }
+
+    /**
+     * Assert array is null or empty.
+     *
+     * @param array array to check.
+     */
+    public static <T> void assertNotEmpty(T[] array) {
+        assertNotNull(array);
+        assertFalse("Array is empty: " + Arrays.toString(array), array.length == 0);
+    }
+
+    /**
+     * Given an 'actual' array of objects, check that the objects given in the 'expected'
+     * array are also present in the 'actual' array in the same order.  Objects in the 'actual'
+     * array that are not in the 'expected' array are skipped and ignored if they are given
+     * in the 'ignored' array, otherwise this assertion will fail.
+     *
+     * @param actual the ordered array of objects to check.
+     * @param expected the ordered array of expected objects.
+     * @param ignored the array of objects that will be ignored if present in actual,
+     *                but not in expected (or are out of order).
+     * @param <T>
+     */
+    public static <T> void assertOrderedEvents(T[] actual, T[] expected, T[] ignored) {
+        assertNotNull(actual);
+        assertNotNull(expected);
+        assertNotNull(ignored);
+
+        int expIndex = 0;
+        int index = 0;
+        for (T i : actual) {
+            // If explicitly expected, move to next
+            if (expIndex < expected.length && Objects.equals(i, expected[expIndex])) {
+                expIndex++;
+                continue;
+            }
+
+            // Fail if not ignored
+            boolean canIgnore = false;
+            for (T j : ignored) {
+                if (Objects.equals(i, j)) {
+                    canIgnore = true;
+                    break;
+                }
+
+            }
+
+            // Fail if not ignored.
+            assertTrue("Event at index " + index + " in actual array " +
+                    Arrays.toString(actual) + " was unexpected: expected array was " +
+                    Arrays.toString(expected) + ", ignored array was: " +
+                    Arrays.toString(ignored), canIgnore);
+            index++;
+        }
+        assertTrue("Only had " + expIndex + " of " + expected.length +
+                " expected objects in array " + Arrays.toString(actual) + ", expected was " +
+                Arrays.toString(expected), expIndex == expected.length);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/TestConstants.java b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/TestConstants.java
new file mode 100644
index 0000000..2805e02
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/TestConstants.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.multiprocess.camera.cts;
+
+/**
+ * Constants used throughout the multi-process unit tests.
+ */
+public class TestConstants {
+
+    public static final int EVENT_CAMERA_ERROR = -1;
+    public static final int EVENT_CAMERA_CONNECT = 1;
+    public static final int EVENT_CAMERA_EVICTED = 2;
+    public static final int EVENT_CAMERA_AVAILABLE = 3;
+    public static final int EVENT_CAMERA_UNAVAILABLE = 4;
+
+    public static final String EVENT_CAMERA_ERROR_STR = "error";
+    public static final String EVENT_CAMERA_CONNECT_STR = "connect";
+    public static final String EVENT_CAMERA_EVICTED_STR = "evicted";
+    public static final String EVENT_CAMERA_AVAILABLE_STR = "available";
+    public static final String EVENT_CAMERA_UNAVAILABLE_STR = "unavailable";
+
+    public static final String EVENT_CAMERA_UNKNOWN_STR = "unknown";
+
+    /**
+     * Convert the given error code to a string.
+     *
+     * @param err error code from {@link TestConstants}.
+     * @return string for this error code.
+     */
+    public static String errToStr(int err) {
+        switch(err) {
+            case EVENT_CAMERA_ERROR:
+                return EVENT_CAMERA_ERROR_STR;
+            case EVENT_CAMERA_CONNECT:
+                return EVENT_CAMERA_CONNECT_STR;
+            case EVENT_CAMERA_EVICTED:
+                return EVENT_CAMERA_EVICTED_STR;
+            case EVENT_CAMERA_AVAILABLE:
+                return EVENT_CAMERA_AVAILABLE_STR;
+            case EVENT_CAMERA_UNAVAILABLE:
+                return EVENT_CAMERA_UNAVAILABLE_STR;
+            default:
+                return EVENT_CAMERA_UNKNOWN_STR + " " + err;
+        }
+    }
+
+    /**
+     * Convert the given array of error codes to an array of strings.
+     *
+     * @param err array of error codes from {@link TestConstants}.
+     * @return string array for the given error codes.
+     */
+    public static String[] convertToStringArray(int[] err) {
+        if (err == null) return null;
+        String[] ret = new String[err.length];
+        for (int i = 0; i < err.length; i++) {
+            ret[i] = errToStr(err[i]);
+        }
+        return ret;
+    }
+
+}
diff --git a/tests/webgl/Android.mk b/tests/tests/libcorelegacy22/Android.mk
old mode 100755
new mode 100644
similarity index 69%
copy from tests/webgl/Android.mk
copy to tests/tests/libcorelegacy22/Android.mk
index ce22dd8..fb3c503
--- a/tests/webgl/Android.mk
+++ b/tests/tests/libcorelegacy22/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 The Android Open Source Project
+# Copyright (C) 2015 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -16,19 +16,17 @@
 
 include $(CLEAR_VARS)
 
-# Don't include this package in any target.
+# don't include this package in any target
 LOCAL_MODULE_TAGS := optional
-
-# When built, explicitly put it in the data partition.
+# and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-# Must match the package name in CtsTestCaseList.mk
-LOCAL_PACKAGE_NAME := CtsWebGLTestCases
+LOCAL_PACKAGE_NAME := CtsLibcoreLegacy22TestCases
 
-LOCAL_SDK_VERSION := current
+LOCAL_SDK_VERSION := 22
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/libcorelegacy22/AndroidManifest.xml b/tests/tests/libcorelegacy22/AndroidManifest.xml
new file mode 100644
index 0000000..4ff9ec2
--- /dev/null
+++ b/tests/tests/libcorelegacy22/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.libcorelegacy22">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.READ_LOGS" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.libcorelegacy22"
+                     android:label="CTS tests of android APIs last available in API 22">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
+
diff --git a/tests/tests/util/src/android/util/cts/FloatMathTest.java b/tests/tests/libcorelegacy22/src/android/util/cts/FloatMathTest.java
similarity index 62%
rename from tests/tests/util/src/android/util/cts/FloatMathTest.java
rename to tests/tests/libcorelegacy22/src/android/util/cts/FloatMathTest.java
index 4d0b572..6b775fc 100644
--- a/tests/tests/util/src/android/util/cts/FloatMathTest.java
+++ b/tests/tests/libcorelegacy22/src/android/util/cts/FloatMathTest.java
@@ -19,27 +19,44 @@
 import android.util.FloatMath;
 
 public class FloatMathTest extends TestCase {
-    public void testFloatMathMethods() {
-        // ceil
-        assertEquals(8.0f, FloatMath.ceil(7.2f));
-        assertEquals(-6.0f, FloatMath.ceil(-6.3f));
 
-        // floor
+    public void testSqrt() {
+        assertEquals(5.0f, FloatMath.sqrt(25));
+        assertEquals(7, FloatMath.sqrt(49), 0);
+        assertEquals(10, FloatMath.sqrt(100), 0);
+        assertEquals(0, FloatMath.sqrt(0), 0);
+        assertEquals(1, FloatMath.sqrt(1), 0);
+    }
+
+    public void testFloor() {
+        assertEquals(78, FloatMath.floor(78.89f), 0);
+        assertEquals(-79, FloatMath.floor(-78.89f), 0);
         assertEquals(7.0f, FloatMath.floor(7.2f));
         assertEquals(-7.0f, FloatMath.floor(-6.3f));
+    }
 
-        // sin
+    public void testCeil() {
+        assertEquals(79, FloatMath.ceil(78.89f), 0);
+        assertEquals(-78, FloatMath.ceil(-78.89f), 0);
+        assertEquals(8.0f, FloatMath.ceil(7.2f));
+        assertEquals(-6.0f, FloatMath.ceil(-6.3f));
+    }
+
+    public void testCos() {
+        assertEquals(1.0f, FloatMath.cos(0), 0);
+        assertEquals(0.5403023058681398f, FloatMath.cos(1), 0);
+        assertEquals(0.964966f, FloatMath.cos(50));
+        assertEquals(0.69925081f, FloatMath.cos(150));
+        assertEquals(0.964966f, FloatMath.cos(-50));
+    }
+
+    public void testSin() {
+        assertEquals(0.0, FloatMath.sin(0), 0);
+        assertEquals(0.8414709848078965f, FloatMath.sin(1), 0);
         assertEquals(-0.26237485f, FloatMath.sin(50));
         assertEquals(-0.71487643f, FloatMath.sin(150));
         assertEquals(0.26237485f, FloatMath.sin(-50));
 
-        // cos
-        assertEquals(0.964966f, FloatMath.cos(50));
-        assertEquals(0.69925081f, FloatMath.cos(150));
-        assertEquals(0.964966f, FloatMath.cos(-50));
-
-        // sqrt
-        assertEquals(5.0f, FloatMath.sqrt(25));
     }
-
 }
+
diff --git a/tests/tests/location/src/android/location/cts/BaseMockLocationTest.java b/tests/tests/location/src/android/location/cts/BaseMockLocationTest.java
new file mode 100644
index 0000000..fbc7d8d
--- /dev/null
+++ b/tests/tests/location/src/android/location/cts/BaseMockLocationTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ *
+ */
+
+package android.location.cts;
+
+import android.os.ParcelFileDescriptor;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Base class for instrumentations tests that use mock location.
+ */
+public abstract class BaseMockLocationTest extends InstrumentationTestCase {
+    private static final String LOG_TAG = "BaseMockLocationTest";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setAsMoskLocationProvider(true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        setAsMoskLocationProvider(false);
+        super.tearDown();
+    }
+
+    private void setAsMoskLocationProvider(boolean enable) {
+        StringBuilder command = new StringBuilder();
+        command.append("appops set ");
+        command.append(getInstrumentation().getContext().getPackageName());
+        command.append(" android:mock_location ");
+        command.append(enable ? "allow" : "deny");
+
+        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+                .executeShellCommand(command.toString());
+
+        InputStream is = new FileInputStream(pfd.getFileDescriptor());
+        try {
+            final byte[] buffer = new byte[8192];
+            while ((is.read(buffer)) != -1);
+        } catch (IOException e) {
+            Log.e(LOG_TAG, "Error managing mock locaiton app", e);
+        }
+    }
+}
diff --git a/tests/tests/location/src/android/location/cts/CriteriaTest.java b/tests/tests/location/src/android/location/cts/CriteriaTest.java
index d812965..422f561 100644
--- a/tests/tests/location/src/android/location/cts/CriteriaTest.java
+++ b/tests/tests/location/src/android/location/cts/CriteriaTest.java
@@ -113,6 +113,19 @@
         assertTrue(criteria.isAltitudeRequired());
     }
 
+    public void testAccessBearingAccuracy() {
+        Criteria criteria = new Criteria();
+
+        criteria.setBearingAccuracy(Criteria.ACCURACY_LOW);
+        assertEquals(Criteria.ACCURACY_LOW, criteria.getBearingAccuracy());
+
+        criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH);
+        assertEquals(Criteria.ACCURACY_HIGH, criteria.getBearingAccuracy());
+
+        criteria.setBearingAccuracy(Criteria.NO_REQUIREMENT);
+        assertEquals(Criteria.NO_REQUIREMENT, criteria.getBearingAccuracy());
+      }
+
     public void testAccessBearingRequired() {
         Criteria criteria = new Criteria();
 
@@ -133,6 +146,35 @@
         assertTrue(criteria.isCostAllowed());
     }
 
+    public void testAccessHorizontalAccuracy() {
+        Criteria criteria = new Criteria();
+
+        criteria.setHorizontalAccuracy(Criteria.ACCURACY_LOW);
+        assertEquals(Criteria.ACCURACY_LOW, criteria.getHorizontalAccuracy());
+
+        criteria.setHorizontalAccuracy(Criteria.ACCURACY_MEDIUM);
+        assertEquals(Criteria.ACCURACY_MEDIUM, criteria.getHorizontalAccuracy());
+
+        criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
+        assertEquals(Criteria.ACCURACY_HIGH, criteria.getHorizontalAccuracy());
+
+        criteria.setHorizontalAccuracy(Criteria.NO_REQUIREMENT);
+        assertEquals(Criteria.NO_REQUIREMENT, criteria.getHorizontalAccuracy());
+    }
+
+    public void testAccessSpeedAccuracy() {
+        Criteria criteria = new Criteria();
+
+        criteria.setSpeedAccuracy(Criteria.ACCURACY_LOW);
+        assertEquals(Criteria.ACCURACY_LOW, criteria.getSpeedAccuracy());
+
+        criteria.setSpeedAccuracy(Criteria.ACCURACY_HIGH);
+        assertEquals(Criteria.ACCURACY_HIGH, criteria.getSpeedAccuracy());
+
+        criteria.setSpeedAccuracy(Criteria.NO_REQUIREMENT);
+        assertEquals(Criteria.NO_REQUIREMENT, criteria.getSpeedAccuracy());
+    }
+
     public void testAccessSpeedRequired() {
         Criteria criteria = new Criteria();
 
@@ -143,6 +185,19 @@
         assertTrue(criteria.isSpeedRequired());
     }
 
+    public void testAccessVerticalAccuracy() {
+        Criteria criteria = new Criteria();
+
+        criteria.setVerticalAccuracy(Criteria.ACCURACY_LOW);
+        assertEquals(Criteria.ACCURACY_LOW, criteria.getVerticalAccuracy());
+
+       criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);
+        assertEquals(Criteria.ACCURACY_HIGH, criteria.getVerticalAccuracy());
+
+        criteria.setVerticalAccuracy(Criteria.NO_REQUIREMENT);
+        assertEquals(Criteria.NO_REQUIREMENT, criteria.getVerticalAccuracy());
+    }
+
     public void testWriteToParcel() {
         Criteria criteria = new Criteria();
         criteria.setAltitudeRequired(true);
diff --git a/tests/tests/location/src/android/location/cts/LocationManagerTest.java b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
index a985aee..8ac56ae 100644
--- a/tests/tests/location/src/android/location/cts/LocationManagerTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
@@ -16,7 +16,6 @@
 
 package android.location.cts;
 
-
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
@@ -27,6 +26,7 @@
 import android.location.Criteria;
 import android.location.GpsStatus;
 import android.location.GpsStatus.Listener;
+import android.location.GpsStatus.NmeaListener;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
@@ -36,7 +36,6 @@
 import android.os.Looper;
 import android.os.SystemClock;
 import android.provider.Settings;
-import android.test.InstrumentationTestCase;
 import android.test.UiThreadTest;
 
 import java.util.List;
@@ -48,7 +47,7 @@
  * android.permission.ACCESS_FINE_LOCATION to access GPS provider
  * android.permission.ACCESS_LOCATION_EXTRA_COMMANDS to send extra commands to GPS provider
  */
-public class LocationManagerTest extends InstrumentationTestCase {
+public class LocationManagerTest extends BaseMockLocationTest {
     private static final long TEST_TIME_OUT = 5000;
 
     private static final String TEST_MOCK_PROVIDER_NAME = "test_provider";
@@ -72,13 +71,6 @@
 
         mManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
 
-        // test that mock locations are allowed so a more descriptive error message can be logged
-        if (Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.ALLOW_MOCK_LOCATION, 0) == 0) {
-            fail("Mock locations are currently disabled in Settings - this test requires "
-                    + "mock locations");
-        }
-
         // remove test provider if left over from an aborted run
         LocationProvider lp = mManager.getProvider(TEST_MOCK_PROVIDER_NAME);
         if (lp != null) {
@@ -537,6 +529,358 @@
         }
     }
 
+    public void testSingleUpdateWithLocationListenerAndLooper() throws InterruptedException {
+        double latitude1 = 60;
+        double longitude1 = 20;
+        double latitude2 = 40;
+        double longitude2 = 30;
+        double latitude3 = 10;
+        double longitude3 = 50;
+        final MockLocationListener listener = new MockLocationListener();
+
+        // update location and notify listener
+        HandlerThread handlerThread = new HandlerThread("testLocationUpdates4");
+        handlerThread.start();
+        mManager.requestSingleUpdate(TEST_MOCK_PROVIDER_NAME, listener, handlerThread.getLooper());
+
+        updateLocation(latitude1, longitude1);
+        assertTrue(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+        Location location = listener.getLocation();
+        assertEquals(TEST_MOCK_PROVIDER_NAME, location.getProvider());
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Any further location change doesn't trigger an update.
+        updateLocation(latitude2, longitude2);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        // update location without notifying listener
+        mManager.removeUpdates(listener);
+        listener.reset();
+        updateLocation(latitude3, longitude3);
+        assertFalse(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+
+        try {
+            mManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, (LocationListener) null,
+                    Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestSingleUpdate((String) null, listener, Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param provider is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (LocationListener) null );
+            fail("Should throw IllegalArgumentException if listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
+    public void testLocationUpdatesWithCriteriaAndPendingIntent() throws InterruptedException {
+        double latitude1 = 10;
+        double longitude1 = 20;
+        double latitude2 = 30;
+        double longitude2 = 40;
+
+        registerIntentReceiver();
+        mockFusedLocation();
+
+        // Update location and receive broadcast.
+        Criteria criteria = createLocationCriteria();
+        mManager.requestLocationUpdates(0, 0 , criteria, mPendingIntent);
+        updateFusedLocation(latitude1, longitude1);
+        waitForReceiveBroadcast();
+
+        assertNotNull(mIntentReceiver.getLastReceivedIntent());
+        Location location = (Location) mIntentReceiver.getLastReceivedIntent().getExtras()
+                .get(LocationManager.KEY_LOCATION_CHANGED);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertTrue(location.hasAccuracy());
+        assertEquals(1.0f, location.getAccuracy());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Update location without receiving broadcast.
+        mManager.removeUpdates(mPendingIntent);
+        mIntentReceiver.clearReceivedIntents();
+        updateFusedLocation(latitude2, longitude2);
+        waitForReceiveBroadcast();
+        assertNull(mIntentReceiver.getLastReceivedIntent());
+
+        // Missing arguments throw exceptions.
+        try {
+            mManager.requestLocationUpdates(0, 0, criteria, (PendingIntent) null);
+            fail("Should throw IllegalArgumentException if param intent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestLocationUpdates(0, 0, null, mPendingIntent);
+            fail("Should throw IllegalArgumentException if param criteria is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (PendingIntent) null );
+            fail("Should throw IllegalArgumentException if param PendingIntent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        unmockFusedLocation();
+    }
+
+    public void testSingleUpdateWithCriteriaAndPendingIntent() throws InterruptedException {
+        double latitude1 = 10;
+        double longitude1 = 20;
+        double latitude2 = 30;
+        double longitude2 = 40;
+        double latitude3 = 50;
+        double longitude3 = 60;
+
+        registerIntentReceiver();
+        mockFusedLocation();
+
+        // Update location and receive broadcast.
+        Criteria criteria = createLocationCriteria();
+        mManager.requestSingleUpdate(criteria, mPendingIntent);
+        updateFusedLocation(latitude1, longitude1);
+        waitForReceiveBroadcast();
+
+        assertNotNull(mIntentReceiver.getLastReceivedIntent());
+        Location location = (Location) mIntentReceiver.getLastReceivedIntent().getExtras()
+                .get(LocationManager.KEY_LOCATION_CHANGED);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertTrue(location.hasAccuracy());
+        assertEquals(1.0f, location.getAccuracy());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Any further location change doesn't trigger an update.
+        updateFusedLocation(latitude2, longitude2);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        // Update location without receiving broadcast.
+        mManager.removeUpdates(mPendingIntent);
+        mIntentReceiver.clearReceivedIntents();
+        updateFusedLocation(latitude3, longitude3);
+        waitForReceiveBroadcast();
+        assertNull(mIntentReceiver.getLastReceivedIntent());
+
+        // Missing arguments throw exceptions.
+        try {
+            mManager.requestSingleUpdate(criteria, (PendingIntent) null);
+            fail("Should throw IllegalArgumentException if param intent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestSingleUpdate((Criteria) null, mPendingIntent);
+            fail("Should throw IllegalArgumentException if param criteria is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (PendingIntent) null );
+            fail("Should throw IllegalArgumentException if param PendingIntent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        unmockFusedLocation();
+    }
+
+    public void testLocationUpdatesWithCriteriaAndLocationListenerAndLooper()
+            throws InterruptedException {
+        double latitude1 = 40;
+        double longitude1 = 10;
+        double latitude2 = 20;
+        double longitude2 = 30;
+       final MockLocationListener listener = new MockLocationListener();
+        mockFusedLocation();
+
+        // update location and notify listener
+        HandlerThread handlerThread = new HandlerThread("testLocationUpdates1");
+        handlerThread.start();
+        Criteria criteria = createLocationCriteria();
+        mManager.requestLocationUpdates(0, 0, criteria, listener, handlerThread.getLooper());
+
+        updateFusedLocation(latitude1, longitude1);
+        assertTrue(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+        Location location = listener.getLocation();
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertTrue(location.hasAccuracy());
+        assertEquals(1.0f, location.getAccuracy());
+        assertEquals(true, location.isFromMockProvider());
+
+        // update location without notifying listener
+        mManager.removeUpdates(listener);
+        listener.reset();
+        updateFusedLocation(latitude2, longitude2);
+        assertFalse(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+
+        // Missing arguments throw exceptions.
+        try {
+            mManager.requestLocationUpdates(0, 0, criteria, (LocationListener) null,
+                    Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestLocationUpdates(0, 0, null, listener, Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param criteria is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (LocationListener) null );
+            fail("Should throw IllegalArgumentException if listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        unmockFusedLocation();
+    }
+
+    public void testSingleUpdateWithCriteriaAndLocationListenerAndLooper()
+            throws InterruptedException {
+        double latitude1 = 40;
+        double longitude1 = 10;
+        double latitude2 = 20;
+        double longitude2 = 30;
+        double latitude3 = 60;
+        double longitude3 = 50;
+        final MockLocationListener listener = new MockLocationListener();
+        mockFusedLocation();
+
+        // update location and notify listener
+        HandlerThread handlerThread = new HandlerThread("testLocationUpdates2");
+        handlerThread.start();
+        Criteria criteria = createLocationCriteria();
+        mManager.requestSingleUpdate(criteria, listener, handlerThread.getLooper());
+
+        updateFusedLocation(latitude1, longitude1);
+        assertTrue(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+        Location location = listener.getLocation();
+        assertEquals(FUSED_PROVIDER_NAME, location.getProvider());
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertTrue(location.hasAccuracy());
+        assertEquals(1.0f, location.getAccuracy());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Any further location change doesn't trigger an update.
+        updateFusedLocation(latitude2, longitude2);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        // update location without notifying listener
+        mManager.removeUpdates(listener);
+        listener.reset();
+        updateFusedLocation(latitude3, longitude3);
+        assertFalse(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+
+        // Missing arguments throw exceptions.
+        try {
+            mManager.requestLocationUpdates(0, 0, criteria, (LocationListener) null,
+                    Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestLocationUpdates(0, 0, null, listener, Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param criteria is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (LocationListener) null );
+            fail("Should throw IllegalArgumentException if listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        unmockFusedLocation();
+    }
+
+    public void testSingleUpdateWithPendingIntent() throws InterruptedException {
+        double latitude1 = 20;
+        double longitude1 = 40;
+        double latitude2 = 30;
+        double longitude2 = 50;
+        double latitude3 = 10;
+        double longitude3 = 60;
+
+        // update location and receive broadcast.
+        registerIntentReceiver();
+        mManager.requestLocationUpdates(TEST_MOCK_PROVIDER_NAME, 0, 0, mPendingIntent);
+        updateLocation(latitude1, longitude1);
+        waitForReceiveBroadcast();
+
+        assertNotNull(mIntentReceiver.getLastReceivedIntent());
+        Location location = mManager.getLastKnownLocation(TEST_MOCK_PROVIDER_NAME);
+        assertEquals(TEST_MOCK_PROVIDER_NAME, location.getProvider());
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Any further location change doesn't trigger an update.
+        updateLocation(latitude2, longitude2);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        // update location without receiving broadcast.
+        mManager.removeUpdates(mPendingIntent);
+        mIntentReceiver.clearReceivedIntents();
+        updateLocation(latitude3, longitude3);
+        waitForReceiveBroadcast();
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        try {
+            mManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
+                    (PendingIntent) null);
+            fail("Should throw IllegalArgumentException if param intent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestLocationUpdates(null, 0, 0, mPendingIntent);
+            fail("Should throw IllegalArgumentException if param provider is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (PendingIntent) null );
+            fail("Should throw IllegalArgumentException if intent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
     public void testAddProximityAlert() {
         Intent i = new Intent();
         i.setAction("android.location.cts.TEST_GET_GPS_STATUS_ACTION");
@@ -546,6 +890,17 @@
         mManager.removeProximityAlert(pi);
     }
 
+
+    @UiThreadTest
+    public void testNmeaListener() {
+        MockNmeaListener listener = new MockNmeaListener();
+        mManager.addNmeaListener(listener);
+        mManager.removeNmeaListener(listener);
+
+        mManager.addNmeaListener(null);
+        mManager.removeNmeaListener(null);
+    }
+
     public void testIsProviderEnabled() {
         // this test assumes enabled TEST_MOCK_PROVIDER_NAME was created in setUp.
         assertNotNull(mManager.getProvider(TEST_MOCK_PROVIDER_NAME));
@@ -840,6 +1195,21 @@
         updateLocation(TEST_MOCK_PROVIDER_NAME, latitude, longitude);
     }
 
+    private void updateFusedLocation(final double latitude, final double longitude) {
+      updateLocation(FUSED_PROVIDER_NAME, latitude, longitude);
+ }
+
+    private Criteria createLocationCriteria() {
+        Criteria criteria = new Criteria();
+        criteria.setAccuracy(Criteria.ACCURACY_FINE);
+        criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
+        criteria.setAltitudeRequired(false);
+        criteria.setBearingRequired(false);
+        criteria.setCostAllowed(false);
+        criteria.setSpeedRequired(false);
+        return criteria;
+     }
+
     private void mockFusedLocation() {
         addTestProvider(FUSED_PROVIDER_NAME);
     }
@@ -1003,6 +1373,23 @@
         }
     }
 
+    private static class MockNmeaListener implements NmeaListener {
+        private boolean mIsNmeaReceived;
+
+        @Override
+        public void onNmeaReceived(long timestamp, String nmea) {
+            mIsNmeaReceived = true;
+        }
+
+        public boolean isNmeaRecevied() {
+            return mIsNmeaReceived;
+        }
+
+        public void reset() {
+            mIsNmeaReceived = false;
+        }
+    }
+
     private static class MockGpsStatusListener implements Listener {
         private boolean mHasCallOnGpsStatusChanged;
 
diff --git a/tests/tests/location/src/android/location/cts/LocationProviderTest.java b/tests/tests/location/src/android/location/cts/LocationProviderTest.java
index 716801d..1e6feda 100644
--- a/tests/tests/location/src/android/location/cts/LocationProviderTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationProviderTest.java
@@ -16,14 +16,11 @@
 
 package android.location.cts;
 
-
-import android.content.Context;
 import android.location.Criteria;
 import android.location.LocationManager;
 import android.location.LocationProvider;
-import android.test.AndroidTestCase;
 
-public class LocationProviderTest extends AndroidTestCase {
+public class LocationProviderTest extends BaseMockLocationTest {
     private static final String PROVIDER_NAME = "location_provider_test";
 
     private LocationManager mLocationManager;
@@ -31,8 +28,8 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mLocationManager =
-            (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
+        mLocationManager = getInstrumentation().getContext().getSystemService(
+                LocationManager.class);
         addTestProvider(PROVIDER_NAME);
     }
 
diff --git a/tests/tests/location/src/android/location/cts/LocationTest.java b/tests/tests/location/src/android/location/cts/LocationTest.java
index f037109..b60b8b1 100644
--- a/tests/tests/location/src/android/location/cts/LocationTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationTest.java
@@ -16,8 +16,15 @@
 
 package android.location.cts;
 
-
+import android.content.Context;
+import android.content.Intent;
 import android.location.Location;
+import android.location.SettingInjectorService;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
@@ -41,6 +48,9 @@
     private final boolean TEST_KEY1VALUE = false;
     private final byte TEST_KEY2VALUE = 10;
 
+    private static final String ENABLED_KEY = "enabled";
+    private static final String MESSENGER_KEY = "messenger";
+
     public void testConstructor() {
         new Location("LocationProvider");
 
@@ -407,6 +417,56 @@
         assertTestLocation(newLocation);
     }
 
+    public void testSettingInjectorService() {
+        Context c = getContext();
+        SettingInjectorServiceDerived service = new SettingInjectorServiceDerived();
+
+        assertNotNull(c);
+
+        Intent intent =
+            new Intent(c, android.location.SettingInjectorService.class);
+
+        assertNotNull(c.getMainLooper());
+        SettingInjectorResultHandler resultHandler =
+            new SettingInjectorResultHandler(c.getMainLooper());
+
+        Messenger m = new Messenger(resultHandler);
+        intent.putExtra(MESSENGER_KEY, m);
+
+        int ret;
+        final long timeout = 500;
+
+        // should refuse binding
+        IBinder binder = service.onBind(intent);
+        assertNull("onBind should always fail.", binder);
+
+        // test if result consistent with the truth
+        // enabled == false case
+        service.setEnabled(false);
+        resultHandler.expectEnabled(false);
+        resultHandler.expectMessage(true);
+        ret = service.onStartCommand(intent, SettingInjectorService.START_NOT_STICKY, 0);
+        assertEquals("onStartCommand return value invalid in (enabled == false) case.",
+            ret, SettingInjectorService.START_NOT_STICKY);
+        assertTrue("Message time out in (enabled == false case).",
+            resultHandler.waitForMessage(timeout));
+
+        // enabled == true case
+        service.setEnabled(true);
+        resultHandler.expectEnabled(true);
+        resultHandler.expectMessage(true);
+        ret = service.onStartCommand(intent, SettingInjectorService.START_NOT_STICKY, 0);
+        assertEquals("onStartCommand return value invalid in (enabled == true) case.",
+            ret, SettingInjectorService.START_NOT_STICKY);
+        assertTrue("Message time out in (enabled == true) case.",
+            resultHandler.waitForMessage(timeout));
+
+        // should not respond to the deprecated method
+        resultHandler.expectMessage(false);
+        service.onStart(intent, 0);
+        resultHandler.waitForMessage(timeout);
+    }
+
     private void assertTestLocation(Location l) {
         assertNotNull(l);
         assertEquals(TEST_PROVIDER, l.getProvider());
@@ -441,4 +501,79 @@
         assertFalse(bundle.getBoolean(TEST_KEY1NAME));
         assertEquals(TEST_KEY2VALUE, bundle.getByte(TEST_KEY2NAME));
     }
+
+    private class SettingInjectorResultHandler extends Handler {
+        private boolean mEnabledShouldBe;
+        private boolean mExpectingMessage;
+        private boolean mMessageArrived;
+
+        SettingInjectorResultHandler(Looper l) {
+            super(l);
+        }
+
+        @Override
+        public void handleMessage(Message m) {
+
+            assertTrue("Unexpected message.", mExpectingMessage);
+
+            boolean enabled = m.getData().getBoolean(ENABLED_KEY);
+
+            assertEquals(String.format(
+                    "Message value (%s) inconsistent with service state (%s).",
+                    String.valueOf(enabled), String.valueOf(mEnabledShouldBe) ),
+                    mEnabledShouldBe, enabled);
+
+            synchronized (this) {
+                mMessageArrived = true;
+                notify();
+            }
+        }
+
+        public void expectEnabled(boolean enabled) {
+            mEnabledShouldBe = enabled;
+        }
+
+        public void expectMessage(boolean expecting) {
+            mMessageArrived = false;
+            mExpectingMessage = expecting;
+        }
+
+        public synchronized boolean waitForMessage(long millis) {
+            synchronized (this) {
+                try {
+                    wait(millis);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                return mMessageArrived;
+            }
+        }
+    }
+
+
+    private class SettingInjectorServiceDerived extends SettingInjectorService {
+
+        private boolean mEnabled;
+
+        SettingInjectorServiceDerived() {
+            super("SettingInjectorServiceDerived");
+            setEnabled(false);
+        }
+
+        @Override
+        // Deprecated API
+        protected String onGetSummary() {
+            return "";
+        }
+
+        @Override
+        protected boolean onGetEnabled() {
+            return mEnabled;
+        }
+
+        public void setEnabled(boolean enabled) {
+            mEnabled = enabled;
+        }
+    }
+
 }
diff --git a/tests/tests/location2/AndroidManifest.xml b/tests/tests/location2/AndroidManifest.xml
index ad77b7e..b2e0802 100644
--- a/tests/tests/location2/AndroidManifest.xml
+++ b/tests/tests/location2/AndroidManifest.xml
@@ -23,7 +23,6 @@
         <uses-library android:name="android.test.runner" />
     </application>
 
-    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
 
diff --git a/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java b/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
index b298b97..6764223 100644
--- a/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
+++ b/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
@@ -16,31 +16,29 @@
 
 package android.location2.cts;
 
-
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.pm.PackageManager;
 import android.location.Criteria;
-import android.location.GpsStatus;
 import android.location.GpsStatus.Listener;
 import android.location.GpsStatus.NmeaListener;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
-import android.location.LocationProvider;
 import android.os.Bundle;
 import android.os.HandlerThread;
-import android.os.Looper;
+import android.os.ParcelFileDescriptor;
 import android.os.SystemClock;
-import android.provider.Settings;
 import android.test.InstrumentationTestCase;
 import android.test.UiThreadTest;
+import android.util.Log;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
-import java.lang.Thread;
 
 /**
  * Requires the permissions
@@ -50,6 +48,8 @@
  */
 public class LocationManagerTest extends InstrumentationTestCase {
 
+    public static final String LOG_TAG = "LocationManagerTest";
+
     private static final long TEST_TIME_OUT_MS = 10 * 1000;
 
     private static final double LAT = 10.0;
@@ -71,12 +71,13 @@
 
         mManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
 
-        // test that mock locations are allowed so a more descriptive error message can be logged
-        if (Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.ALLOW_MOCK_LOCATION, 0) == 0) {
-            fail("Mock locations are currently disabled in Settings - this test requires "
-                    + "mock locations");
-        }
+        setAsMoskLocationProvider(true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        setAsMoskLocationProvider(false);
+        super.tearDown();
     }
 
     public void testGetGpsProvider_notAllowed() {
@@ -319,6 +320,25 @@
         mManager.setTestProviderLocation(providerName, location);
     }
 
+    private void setAsMoskLocationProvider(boolean enable) {
+        StringBuilder command = new StringBuilder();
+        command.append("appops set ");
+        command.append(getInstrumentation().getContext().getPackageName());
+        command.append(" android:mock_location ");
+        command.append(enable ? "allow" : "deny");
+
+        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+                .executeShellCommand(command.toString());
+
+        InputStream is = new FileInputStream(pfd.getFileDescriptor());
+        try {
+            final byte[] buffer = new byte[8192];
+            while ((is.read(buffer)) != -1);
+        } catch (IOException e) {
+            Log.e(LOG_TAG, "Error managing mock locaiton app", e);
+        }
+    }
+
     /**
      * Helper class that receives a proximity intent and notifies the main class
      * when received
diff --git a/tests/tests/media/Android.mk b/tests/tests/media/Android.mk
index 77d4bb7..43e3e89 100644
--- a/tests/tests/media/Android.mk
+++ b/tests/tests/media/Android.mk
@@ -49,7 +49,7 @@
 
 # uncomment when b/13249737 is fixed
 #LOCAL_SDK_VERSION := current
-LOCAL_JAVA_LIBRARIES += android.test.runner
+LOCAL_JAVA_LIBRARIES += android.test.runner org.apache.http.legacy
 
 include $(BUILD_CTS_PACKAGE)
 
diff --git a/tests/tests/media/AndroidManifest.xml b/tests/tests/media/AndroidManifest.xml
index 32df531..cdc0e60 100644
--- a/tests/tests/media/AndroidManifest.xml
+++ b/tests/tests/media/AndroidManifest.xml
@@ -28,6 +28,7 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
 
         <activity android:name="android.media.cts.AudioManagerStub"
             android:label="AudioManagerStub"/>
@@ -51,6 +52,21 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
+        <activity android:name="android.media.cts.ResourceManagerStubActivity"
+            android:label="ResourceManagerStubActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        <activity android:name="android.media.cts.ResourceManagerTestActivity1"
+            android:label="ResourceManagerTestActivity1"
+            android:process=":mediaCodecTestProcess1">
+        </activity>
+        <activity android:name="android.media.cts.ResourceManagerTestActivity2"
+            android:label="ResourceManagerTestActivity2"
+            android:process=":mediaCodecTestProcess2">
+        </activity>
         <activity android:name="android.media.cts.RingtonePickerActivity"
             android:label="RingtonePickerActivity">
             <intent-filter>
diff --git a/tests/tests/media/assets/fileSequence0.ts b/tests/tests/media/assets/fileSequence0.ts
new file mode 100644
index 0000000..48f2bcd
--- /dev/null
+++ b/tests/tests/media/assets/fileSequence0.ts
Binary files differ
diff --git a/tests/tests/media/assets/fileSequence1.ts b/tests/tests/media/assets/fileSequence1.ts
new file mode 100644
index 0000000..737fbd0
--- /dev/null
+++ b/tests/tests/media/assets/fileSequence1.ts
Binary files differ
diff --git a/tests/tests/media/assets/prog_index.m3u8 b/tests/tests/media/assets/prog_index.m3u8
new file mode 100644
index 0000000..88f99d3
--- /dev/null
+++ b/tests/tests/media/assets/prog_index.m3u8
@@ -0,0 +1,10 @@
+#EXTM3U
+#EXT-X-TARGETDURATION:10
+#EXT-X-VERSION:3
+#EXT-X-MEDIA-SEQUENCE:0
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:9.90000,
+fileSequence0.ts
+#EXTINF:10.00000,
+fileSequence1.ts
+#EXT-X-ENDLIST
diff --git a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
index 67473e1..1fb3ea7 100644
--- a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
+++ b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
@@ -862,6 +862,15 @@
             mCodec.configure(format, mSurface.getSurface(), null /* crypto */, 0 /* flags */);
             Log.i(TAG, "start");
             mCodec.start();
+
+            // inject some minimal setOutputSurface test
+            // TODO: change this test to also change the surface midstream
+            try {
+                mCodec.setOutputSurface(null);
+                fail("should not be able to set surface to NULL");
+            } catch (IllegalArgumentException e) {}
+            mCodec.setOutputSurface(mSurface.getSurface());
+
             mInputBuffers = mCodec.getInputBuffers();
             mOutputBuffers = mCodec.getOutputBuffers();
             Log.i(TAG, "configured " + mInputBuffers.length + " input[" +
@@ -1310,13 +1319,11 @@
 
             /* test if the explicitly named codec is present on the system */
             if (explicitCodecName != null) {
-                try {
-                    MediaCodec codec = MediaCodec.createByCodecName(explicitCodecName);
-                    if (codec != null) {
-                        codec.release();
-                        add(new Codec(explicitCodecName, null, mediaList));
-                    }
-                } catch (Exception e) {}
+                MediaCodec codec = MediaCodec.createByCodecName(explicitCodecName);
+                if (codec != null) {
+                    codec.release();
+                    add(new Codec(explicitCodecName, null, mediaList));
+                }
             }
         } catch (Throwable t) {
             Log.wtf("Constructor failed", t);
diff --git a/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java b/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
index 08e1d67..9272d58 100644
--- a/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.media.AsyncPlayer;
+import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.provider.Settings;
@@ -34,4 +35,13 @@
         asyncPlayer.stop();
     }
 
+    public void testAsyncPlayerAudioAttributes() throws Exception {
+        final Uri PLAY_URI = Settings.System.DEFAULT_NOTIFICATION_URI;
+        AsyncPlayer asyncPlayer = new AsyncPlayer(null);
+        asyncPlayer.play(getContext(), PLAY_URI, true,
+                new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build());
+        final int PLAY_TIME = 3000;
+        Thread.sleep(PLAY_TIME);
+        asyncPlayer.stop();
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/AudioEffectTest.java b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
index 1c96abd..dce7680 100644
--- a/tests/tests/media/src/android/media/cts/AudioEffectTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
@@ -65,9 +65,6 @@
 
     //Test case 0.0: test queryEffects() and platfrom at least provides an Equalizer
     public void test0_0QueryEffects() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
 
         AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
 
@@ -125,9 +122,6 @@
 
     //Test case 1.3: test getEnabled() failure when called on released effect
     public void test1_3GetEnabledAfterRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         try {
             AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER,
                     AudioEffect.EFFECT_TYPE_NULL,
@@ -150,9 +144,6 @@
 
     //Test case 1.4: test contructor on mediaPlayer audio session
     public void test1_4InsertOnMediaPlayer() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         MediaPlayer mp = new MediaPlayer();
         assertNotNull("could not create mediaplayer", mp);
         AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(R.raw.testmp3);
@@ -285,9 +276,6 @@
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
     public void test2_0SetEnabledGetEnabled() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         try {
             AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER,
                     AudioEffect.EFFECT_TYPE_NULL,
@@ -315,9 +303,6 @@
 
     //Test case 2.1: test setEnabled() throws exception after release
     public void test2_1SetEnabledAfterRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         try {
             AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER,
                     AudioEffect.EFFECT_TYPE_NULL,
@@ -649,9 +634,6 @@
 
     //Test case 4.0: test control passed to higher priority client
     public void test4_0setEnabledLowerPriority() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         AudioEffect effect1 = null;
         AudioEffect effect2 = null;
         try {
diff --git a/tests/tests/media/src/android/media/cts/AudioHelper.java b/tests/tests/media/src/android/media/cts/AudioHelper.java
new file mode 100644
index 0000000..efee024
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AudioHelper.java
@@ -0,0 +1,411 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import java.nio.ByteBuffer;
+
+import org.junit.Assert;
+
+import android.media.AudioAttributes;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+import android.media.AudioTrack;
+import android.os.Looper;
+
+// Used for statistics and loopers in listener tests.
+// See AudioRecordTest.java and AudioTrack_ListenerTest.java.
+public class AudioHelper {
+
+    // create sine waves or chirps for data arrays
+    public static byte[] createSoundDataInByteArray(int bufferSamples, final int sampleRate,
+            final double frequency, double sweep) {
+        final double rad = 2 * Math.PI * frequency / sampleRate;
+        byte[] vai = new byte[bufferSamples];
+        sweep = Math.PI * sweep / ((double)sampleRate * vai.length);
+        for (int j = 0; j < vai.length; j++) {
+            int unsigned =  (int)(Math.sin(j * (rad + j * sweep)) * Byte.MAX_VALUE)
+                    + Byte.MAX_VALUE & 0xFF;
+            vai[j] = (byte) unsigned;
+        }
+        return vai;
+    }
+
+    public static short[] createSoundDataInShortArray(int bufferSamples, final int sampleRate,
+            final double frequency, double sweep) {
+        final double rad = 2 * Math.PI * frequency / sampleRate;
+        short[] vai = new short[bufferSamples];
+        sweep = Math.PI * sweep / ((double)sampleRate * vai.length);
+        for (int j = 0; j < vai.length; j++) {
+            vai[j] = (short)(Math.sin(j * (rad + j * sweep)) * Short.MAX_VALUE);
+        }
+        return vai;
+    }
+
+    public static float[] createSoundDataInFloatArray(int bufferSamples, final int sampleRate,
+            final double frequency, double sweep) {
+        final double rad = 2 * Math.PI * frequency / sampleRate;
+        float[] vaf = new float[bufferSamples];
+        sweep = Math.PI * sweep / ((double)sampleRate * vaf.length);
+        for (int j = 0; j < vaf.length; j++) {
+            vaf[j] = (float)(Math.sin(j * (rad + j * sweep)));
+        }
+        return vaf;
+    }
+
+    public static int frameSizeFromFormat(AudioFormat format) {
+        return format.getChannelCount()
+                * format.getBytesPerSample(format.getEncoding());
+    }
+
+    public static int frameCountFromMsec(int ms, AudioFormat format) {
+        return ms * format.getSampleRate() / 1000;
+    }
+
+    public static class Statistics {
+        public void add(double value) {
+            final double absValue = Math.abs(value);
+            mSum += value;
+            mSumAbs += absValue;
+            mMaxAbs = Math.max(mMaxAbs, absValue);
+            ++mCount;
+        }
+
+        public double getAvg() {
+            if (mCount == 0) {
+                return 0;
+            }
+            return mSum / mCount;
+        }
+
+        public double getAvgAbs() {
+            if (mCount == 0) {
+                return 0;
+            }
+            return mSumAbs / mCount;
+        }
+
+        public double getMaxAbs() {
+            return mMaxAbs;
+        }
+
+        private int mCount = 0;
+        private double mSum = 0;
+        private double mSumAbs = 0;
+        private double mMaxAbs = 0;
+    }
+
+    // for listener tests
+    // lightweight java.util.concurrent.Future*
+    public static class FutureLatch<T>
+    {
+        private T mValue;
+        private boolean mSet;
+        public void set(T value)
+        {
+            synchronized (this) {
+                assert !mSet;
+                mValue = value;
+                mSet = true;
+                notify();
+            }
+        }
+        public T get()
+        {
+            T value;
+            synchronized (this) {
+                while (!mSet) {
+                    try {
+                        wait();
+                    } catch (InterruptedException e) {
+                        ;
+                    }
+                }
+                value = mValue;
+            }
+            return value;
+        }
+    }
+
+    // for listener tests
+    // represents a factory for T
+    public interface MakesSomething<T>
+    {
+        T makeSomething();
+    }
+
+    // for listener tests
+    // used to construct an object in the context of an asynchronous thread with looper
+    public static class MakeSomethingAsynchronouslyAndLoop<T>
+    {
+        private Thread mThread;
+        volatile private Looper mLooper;
+        private final MakesSomething<T> mWhatToMake;
+
+        public MakeSomethingAsynchronouslyAndLoop(MakesSomething<T> whatToMake)
+        {
+            assert whatToMake != null;
+            mWhatToMake = whatToMake;
+        }
+
+        public T make()
+        {
+            final FutureLatch<T> futureLatch = new FutureLatch<T>();
+            mThread = new Thread()
+            {
+                @Override
+                public void run()
+                {
+                    Looper.prepare();
+                    mLooper = Looper.myLooper();
+                    T something = mWhatToMake.makeSomething();
+                    futureLatch.set(something);
+                    Looper.loop();
+                }
+            };
+            mThread.start();
+            return futureLatch.get();
+        }
+        public void join()
+        {
+            mLooper.quit();
+            try {
+                mThread.join();
+            } catch (InterruptedException e) {
+                ;
+            }
+            // avoid dangling references
+            mLooper = null;
+            mThread = null;
+        }
+    }
+
+    public static int outChannelMaskFromInChannelMask(int channelMask) {
+        switch (channelMask) {
+            case AudioFormat.CHANNEL_IN_MONO:
+                return AudioFormat.CHANNEL_OUT_MONO;
+            case AudioFormat.CHANNEL_IN_STEREO:
+                return AudioFormat.CHANNEL_OUT_STEREO;
+            default:
+                return AudioFormat.CHANNEL_INVALID;
+        }
+    }
+
+    /* AudioRecordAudit extends AudioRecord to allow concurrent playback
+     * of read content to an AudioTrack.  This is for testing only.
+     * For general applications, it is NOT recommended to extend AudioRecord.
+     * This affects AudioRecord timing.
+     */
+    public static class AudioRecordAudit extends AudioRecord {
+        AudioRecordAudit(int audioSource, int sampleRate, int channelMask,
+                int format, int bufferSize, boolean isChannelIndex) {
+            this(audioSource, sampleRate, channelMask, format, bufferSize, isChannelIndex,
+                    AudioManager.STREAM_MUSIC, 500 /*delayMs*/);
+        }
+
+        AudioRecordAudit(int audioSource, int sampleRate, int channelMask,
+                int format, int bufferSize,
+                boolean isChannelIndex, int auditStreamType, int delayMs) {
+            // without channel index masks, one could call:
+            // super(audioSource, sampleRate, channelMask, format, bufferSize);
+            super(new AudioAttributes.Builder()
+                            .setInternalCapturePreset(audioSource)
+                            .build(),
+                    (isChannelIndex
+                            ? new AudioFormat.Builder().setChannelIndexMask(channelMask)
+                                    : new AudioFormat.Builder().setChannelMask(channelMask))
+                            .setEncoding(format)
+                            .setSampleRate(sampleRate)
+                            .build(),
+                    bufferSize,
+                    AudioManager.AUDIO_SESSION_ID_GENERATE);
+
+            if (delayMs >= 0) { // create an AudioTrack
+                final int channelOutMask = isChannelIndex ? channelMask :
+                    outChannelMaskFromInChannelMask(channelMask);
+                final int bufferOutFrames = sampleRate * delayMs / 1000;
+                final int bufferOutSamples = bufferOutFrames
+                        * AudioFormat.channelCountFromOutChannelMask(channelOutMask);
+                final int bufferOutSize = bufferOutSamples
+                        * AudioFormat.getBytesPerSample(format);
+
+                // Caution: delayMs too large results in buffer sizes that cannot be created.
+                mTrack = new AudioTrack.Builder()
+                                .setAudioAttributes(new AudioAttributes.Builder()
+                                        .setLegacyStreamType(auditStreamType)
+                                        .build())
+                                .setAudioFormat((isChannelIndex ?
+                                  new AudioFormat.Builder().setChannelIndexMask(channelOutMask) :
+                                  new AudioFormat.Builder().setChannelMask(channelOutMask))
+                                        .setEncoding(format)
+                                        .setSampleRate(sampleRate)
+                                        .build())
+                                .setBufferSizeInBytes(bufferOutSize)
+                                .build();
+                Assert.assertEquals(AudioTrack.STATE_INITIALIZED, mTrack.getState());
+                mPosition = 0;
+                mFinishAtMs = 0;
+            }
+        }
+
+        @Override
+        public int read(byte[] audioData, int offsetInBytes, int sizeInBytes) {
+            // for byte array access we verify format is 8 bit PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_8BIT, getAudioFormat());
+            int samples = super.read(audioData, offsetInBytes, sizeInBytes);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInBytes, samples));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(byte[] audioData, int offsetInBytes, int sizeInBytes, int readMode) {
+            // for byte array access we verify format is 8 bit PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_8BIT, getAudioFormat());
+            int samples = super.read(audioData, offsetInBytes, sizeInBytes, readMode);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInBytes, samples,
+                        AudioTrack.WRITE_BLOCKING));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(short[] audioData, int offsetInShorts, int sizeInShorts) {
+            // for short array access we verify format is 16 bit PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_16BIT, getAudioFormat());
+            int samples = super.read(audioData, offsetInShorts, sizeInShorts);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInShorts, samples));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(short[] audioData, int offsetInShorts, int sizeInShorts, int readMode) {
+            // for short array access we verify format is 16 bit PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_16BIT, getAudioFormat());
+            int samples = super.read(audioData, offsetInShorts, sizeInShorts, readMode);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInShorts, samples,
+                        AudioTrack.WRITE_BLOCKING));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(float[] audioData, int offsetInFloats, int sizeInFloats, int readMode) {
+            // for float array access we verify format is float PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_FLOAT, getAudioFormat());
+            int samples = super.read(audioData, offsetInFloats, sizeInFloats, readMode);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInFloats, samples,
+                        AudioTrack.WRITE_BLOCKING));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(ByteBuffer audioBuffer, int sizeInBytes) {
+            int bytes = super.read(audioBuffer, sizeInBytes);
+            if (mTrack != null) {
+                // read does not affect position and limit of the audioBuffer.
+                // we make a duplicate to change that for writing to the output AudioTrack
+                // which does check position and limit.
+                ByteBuffer copy = audioBuffer.duplicate();
+                copy.position(0).limit(bytes);  // read places data at the start of the buffer.
+                Assert.assertEquals(bytes, mTrack.write(copy, bytes, AudioTrack.WRITE_BLOCKING));
+                mPosition += bytes /
+                        (mTrack.getChannelCount()
+                                * AudioFormat.getBytesPerSample(mTrack.getAudioFormat()));
+            }
+            return bytes;
+        }
+
+        @Override
+        public int read(ByteBuffer audioBuffer, int sizeInBytes, int readMode) {
+            int bytes = super.read(audioBuffer, sizeInBytes, readMode);
+            if (mTrack != null) {
+                // read does not affect position and limit of the audioBuffer.
+                // we make a duplicate to change that for writing to the output AudioTrack
+                // which does check position and limit.
+                ByteBuffer copy = audioBuffer.duplicate();
+                copy.position(0).limit(bytes);  // read places data at the start of the buffer.
+                Assert.assertEquals(bytes, mTrack.write(copy, bytes, AudioTrack.WRITE_BLOCKING));
+                mPosition += bytes /
+                        (mTrack.getChannelCount()
+                                * AudioFormat.getBytesPerSample(mTrack.getAudioFormat()));
+            }
+            return bytes;
+        }
+
+        @Override
+        public void startRecording() {
+            super.startRecording();
+            if (mTrack != null) {
+                mTrack.play();
+            }
+        }
+
+        @Override
+        public void stop() {
+            super.stop();
+            if (mTrack != null) {
+                if (mPosition > 0) { // stop may be called multiple times.
+                    final int remainingFrames = mPosition - mTrack.getPlaybackHeadPosition();
+                    mFinishAtMs = System.currentTimeMillis()
+                            + remainingFrames * 1000 / mTrack.getSampleRate();
+                    mPosition = 0;
+                }
+                mTrack.stop(); // allows remaining data to play out
+            }
+        }
+
+        @Override
+        public void release() {
+            super.release();
+            if (mTrack != null) {
+                final long remainingMs = mFinishAtMs - System.currentTimeMillis();
+                if (remainingMs > 0) {
+                    try {
+                        Thread.sleep(remainingMs);
+                    } catch (InterruptedException e) {
+                        ;
+                    }
+                }
+                mTrack.release();
+                mTrack = null;
+            }
+        }
+
+        public AudioTrack mTrack;
+        private final static String TAG = "AudioRecordAudit";
+        private int mPosition;
+        private long mFinishAtMs;
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerTest.java b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
index f58e6ab..ded0539 100644
--- a/tests/tests/media/src/android/media/cts/AudioManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
@@ -19,7 +19,6 @@
 import static android.media.AudioManager.ADJUST_LOWER;
 import static android.media.AudioManager.ADJUST_RAISE;
 import static android.media.AudioManager.ADJUST_SAME;
-import static android.media.AudioManager.FLAG_ALLOW_RINGER_MODES;
 import static android.media.AudioManager.MODE_IN_CALL;
 import static android.media.AudioManager.MODE_IN_COMMUNICATION;
 import static android.media.AudioManager.MODE_NORMAL;
@@ -45,7 +44,7 @@
 import android.media.MediaPlayer;
 import android.os.Vibrator;
 import android.provider.Settings;
-import android.telephony.TelephonyManager;
+import android.provider.Settings.System;
 import android.test.AndroidTestCase;
 import android.view.SoundEffectConstants;
 
@@ -57,10 +56,7 @@
     private final static long TIME_TO_PLAY = 2000;
     private AudioManager mAudioManager;
     private boolean mHasVibrator;
-    private boolean mUseMasterVolume;
     private boolean mUseFixedVolume;
-    private int[] mMasterVolumeRamp;
-    private TreeMap<Integer, Integer> mMasterVolumeMap = new TreeMap<Integer, Integer>();
     private boolean mIsTelevision;
 
     @Override
@@ -69,16 +65,8 @@
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
         Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
         mHasVibrator = (vibrator != null) && vibrator.hasVibrator();
-        mUseMasterVolume = mContext.getResources().getBoolean(
-                Resources.getSystem().getIdentifier("config_useMasterVolume", "bool", "android"));
         mUseFixedVolume = mContext.getResources().getBoolean(
                 Resources.getSystem().getIdentifier("config_useFixedVolume", "bool", "android"));
-        mMasterVolumeRamp = mContext.getResources().getIntArray(
-                Resources.getSystem().getIdentifier("config_masterVolumeRamp", "array", "android"));
-        assertTrue((mMasterVolumeRamp.length > 0) && (mMasterVolumeRamp.length % 2 == 0));
-        for (int i = 0; i < mMasterVolumeRamp.length; i+=2) {
-            mMasterVolumeMap.put(mMasterVolumeRamp[i], mMasterVolumeRamp[i+1]);
-        }
         PackageManager packageManager = mContext.getPackageManager();
         mIsTelevision = packageManager != null
                 && (packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
@@ -350,6 +338,12 @@
             mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
 
             int maxVolume = mAudioManager.getStreamMaxVolume(streams[i]);
+            int minVolume = mAudioManager.getStreamMinVolume(streams[i]);
+
+            // validate min
+            assertTrue(String.format("minVolume(%d) must be >= 0", minVolume), minVolume >= 0);
+            assertTrue(String.format("minVolume(%d) must be < maxVolume(%d)", minVolume, maxVolume),
+                    minVolume < maxVolume);
 
             mAudioManager.setStreamVolume(streams[i], 1, 0);
             if (mUseFixedVolume) {
@@ -384,7 +378,7 @@
             // volume lower
             mAudioManager.setStreamVolume(streams[i], maxVolume, 0);
             volume = mAudioManager.getStreamVolume(streams[i]);
-            while (volume > 0) {
+            while (volume > minVolume) {
                 volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(streams[i]));
                 mAudioManager.adjustStreamVolume(streams[i], ADJUST_LOWER, 0);
                 assertEquals(Math.max(0, volume - volumeDelta),
@@ -457,6 +451,88 @@
         assertFalse(mAudioManager.isMusicActive());
     }
 
+    public void testMute() {
+        int[] streams = {
+                AudioManager.STREAM_VOICE_CALL,
+                AudioManager.STREAM_MUSIC,
+                AudioManager.STREAM_RING,
+                AudioManager.STREAM_ALARM,
+                AudioManager.STREAM_NOTIFICATION,
+                AudioManager.STREAM_SYSTEM };
+
+        int muteAffectedStreams = System.getInt(mContext.getContentResolver(),
+                System.MUTE_STREAMS_AFFECTED,
+                        // Same defaults as in AudioService. Should be kept in
+                        // sync.
+                        ((1 << AudioManager.STREAM_MUSIC) |
+                                (1 << AudioManager.STREAM_RING) |
+                                (1 << AudioManager.STREAM_NOTIFICATION) |
+                                (1 << AudioManager.STREAM_SYSTEM)));
+        if (mUseFixedVolume) {
+            for (int i = 0; i < streams.length; i++) {
+                mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_MUTE, 0);
+                assertFalse("Muting should not affect a fixed volume device.",
+                        mAudioManager.isStreamMute(streams[i]));
+
+                mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_TOGGLE_MUTE, 0);
+                assertFalse("Toggling mute should not affect a fixed volume device.",
+                        mAudioManager.isStreamMute(streams[i]));
+
+                mAudioManager.setStreamMute(streams[i], true);
+                assertFalse("Muting should not affect a fixed volume device.",
+                        mAudioManager.isStreamMute(streams[i]));
+            }
+            return;
+        }
+        // This ensures we're out of vibrate or silent modes.
+        mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
+        for (int i = 0; i < streams.length; i++) {
+            // ensure each stream is on and turned up.
+            mAudioManager.setStreamVolume(streams[i], mAudioManager.getStreamMaxVolume(streams[i]),
+                    0);
+            if (((1 << streams[i]) & muteAffectedStreams) == 0) {
+                mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_MUTE, 0);
+                assertFalse("Stream " + streams[i] + " should not be affected by mute.",
+                        mAudioManager.isStreamMute(streams[i]));
+                mAudioManager.setStreamMute(streams[i], true);
+                assertFalse("Stream " + streams[i] + " should not be affected by mute.",
+                        mAudioManager.isStreamMute(streams[i]));
+                mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_TOGGLE_MUTE, 0);
+                assertFalse("Stream " + streams[i] + " should not be affected by mute.",
+                        mAudioManager.isStreamMute(streams[i]));
+                continue;
+            }
+            mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_MUTE, 0);
+            assertTrue("Muting stream " + streams[i] + " failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_UNMUTE, 0);
+            assertFalse("Unmuting stream " + streams[i] + " failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_TOGGLE_MUTE, 0);
+            assertTrue("Toggling mute on stream " + streams[i] + " failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_TOGGLE_MUTE, 0);
+            assertFalse("Toggling mute on stream " + streams[i] + " failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            mAudioManager.setStreamMute(streams[i], true);
+            assertTrue("Muting stream " + streams[i] + " using setStreamMute failed",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            // mute it three more times to verify the ref counting is gone.
+            mAudioManager.setStreamMute(streams[i], true);
+            mAudioManager.setStreamMute(streams[i], true);
+            mAudioManager.setStreamMute(streams[i], true);
+
+            mAudioManager.setStreamMute(streams[i], false);
+            assertFalse("Unmuting stream " + streams[i] + " using setStreamMute failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+        }
+    }
+
     public void testSetInvalidRingerMode() {
         int ringerMode = mAudioManager.getRingerMode();
         mAudioManager.setRingerMode(-1337);
@@ -467,11 +543,6 @@
     }
 
     private int getVolumeDelta(int volume) {
-        if (!mUseMasterVolume) {
-            return 1;
-        }
-        int volumeDelta = mMasterVolumeMap.floorEntry(volume).getValue();
-        assertTrue(volumeDelta > 0);
-        return volumeDelta;
+        return 1;
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordTest.java b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
index 7ff631f..56d2b68 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecordTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
@@ -17,26 +17,44 @@
 package android.media.cts;
 
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 
 import android.content.pm.PackageManager;
+import android.cts.util.CtsAndroidTestCase;
 import android.media.AudioFormat;
+import android.media.AudioManager;
 import android.media.AudioRecord;
-import android.media.MediaRecorder;
 import android.media.AudioRecord.OnRecordPositionUpdateListener;
+import android.media.AudioTrack;
+import android.media.MediaRecorder;
+import android.media.MediaSyncEvent;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.test.AndroidTestCase;
+import android.util.Log;
 
-public class AudioRecordTest extends AndroidTestCase {
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
 
+public class AudioRecordTest extends CtsAndroidTestCase {
+    private final static String TAG = "AudioRecordTest";
     private AudioRecord mAudioRecord;
     private int mHz = 44100;
     private boolean mIsOnMarkerReachedCalled;
     private boolean mIsOnPeriodicNotificationCalled;
     private boolean mIsHandleMessageCalled;
     private Looper mLooper;
-    private int MAX_RECORD_START_TIME_MS = 100;
+    // For doTest
+    private int mMarkerPeriodInFrames;
+    private int mMarkerPosition;
+    private Handler mHandler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(Message msg) {
+            mIsHandleMessageCalled = true;
+            super.handleMessage(msg);
+        }
+    };
 
     @Override
     protected void setUp() throws Exception {
@@ -212,7 +230,757 @@
         assertEquals(AudioRecord.STATE_UNINITIALIZED, mAudioRecord.getState());
     }
 
+    public void testAudioRecordResamplerMono8Bit() throws Exception {
+        doTest("ResamplerResamplerMono8Bit", true /*localRecord*/, false /*customHandler*/,
+                1 /*periodsPerSecond*/, 1 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/,  false /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 88200 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT);
+    }
+
+    public void testAudioRecordResamplerStereo8Bit() throws Exception {
+        doTest("ResamplerStereo8Bit", true /*localRecord*/, false /*customHandler*/,
+                0 /*periodsPerSecond*/, 3 /*markerPeriodsPerSecond*/,
+                true /*useByteBuffer*/,  true /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 45000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_8BIT);
+    }
+
+    public void testAudioRecordLocalMono16Bit() throws Exception {
+        doTest("LocalMono16Bit", true /*localRecord*/, false /*customHandler*/,
+                30 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, true /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 8000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
+    }
+
+    public void testAudioRecordStereo16Bit() throws Exception {
+        doTest("Stereo16Bit", false /*localRecord*/, false /*customHandler*/,
+                2 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 17000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
+    }
+
+    public void testAudioRecordMonoFloat() throws Exception {
+        doTest("MonoFloat", false /*localRecord*/, true /*customHandler*/,
+                30 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, true /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 32000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_FLOAT);
+    }
+
+    public void testAudioRecordLocalNonblockingStereoFloat() throws Exception {
+        doTest("LocalNonblockingStereoFloat", true /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 48000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_FLOAT);
+    }
+
+    // Audit modes work best with non-blocking mode
+    public void testAudioRecordAuditByteBufferResamplerStereoFloat() throws Exception {
+        doTest("AuditByteBufferResamplerStereoFloat",
+                false /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                true /*useByteBuffer*/, false /*blocking*/,
+                true /*auditRecording*/, false /*isChannelIndex*/, 96000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_FLOAT);
+    }
+
+    public void testAudioRecordAuditChannelIndexMonoFloat() throws Exception {
+        doTest("AuditChannelIndexMonoFloat", true /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                true /*auditRecording*/, true /*isChannelIndex*/, 47000 /*TEST_SR*/,
+                (1 << 0) /* 1 channel */, AudioFormat.ENCODING_PCM_FLOAT);
+    }
+
+    // Audit buffers can run out of space with high sample rate,
+    // so keep the channels and pcm encoding low
+    public void testAudioRecordAuditChannelIndex2() throws Exception {
+        doTest("AuditChannelIndex2", true /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                true /*auditRecording*/, true /*isChannelIndex*/, 192000 /*TEST_SR*/,
+                (1 << 0) | (1 << 2) /* 2 channels, gap in middle */,
+                AudioFormat.ENCODING_PCM_8BIT);
+    }
+
+    // Audit buffers can run out of space with high numbers of channels,
+    // so keep the sample rate low.
+    public void testAudioRecordAuditChannelIndex5() throws Exception {
+        doTest("AuditChannelIndex5", true /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                true /*auditRecording*/, true /*isChannelIndex*/, 16000 /*TEST_SR*/,
+                (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)  /* 5 channels */,
+                AudioFormat.ENCODING_PCM_16BIT);
+    }
+
+    // Test AudioRecord.Builder to verify the observed configuration of an AudioRecord built with
+    // an empty Builder matches the documentation / expected values
+    public void testAudioRecordBuilderDefault() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testAudioRecordBuilderDefault";
+        // expected values below match the AudioRecord.Builder documentation
+        final int expectedCapturePreset = MediaRecorder.AudioSource.DEFAULT;
+        final String rateStr = new AudioManager(getContext())
+                .getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
+        final int expectedRate = Integer.valueOf(rateStr).intValue();
+        final int expectedChannel = AudioFormat.CHANNEL_IN_MONO;
+        final int expectedEncoding = AudioFormat.ENCODING_PCM_16BIT;
+        final int expectedState = AudioRecord.STATE_INITIALIZED;
+        // use builder with default values
+        final AudioRecord rec = new AudioRecord.Builder().build();
+        // save results
+        final int observedRate = rec.getSampleRate();
+        final int observedSource = rec.getAudioSource();
+        final int observedChannel = rec.getChannelConfiguration();
+        final int observedEncoding = rec.getAudioFormat();
+        final int observedState = rec.getState();
+        // release recorder before the test exits (either successfully or with an exception)
+        rec.release();
+        // compare results
+        assertEquals(TEST_NAME + ": default capture preset", expectedCapturePreset, observedSource);
+        assertEquals(TEST_NAME + ": default rate", expectedRate, observedRate);
+        assertEquals(TEST_NAME + ": default channel config", expectedChannel, observedChannel);
+        assertEquals(TEST_NAME + ": default encoding", expectedEncoding, observedEncoding);
+        assertEquals(TEST_NAME + ": state", expectedState, observedState);
+    }
+
+    // Test AudioRecord.Builder to verify the observed configuration of an AudioRecord built with
+    // an incomplete AudioFormat matches the documentation / expected values
+    public void testAudioRecordBuilderPartialFormat() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testAudioRecordBuilderPartialFormat";
+        final int expectedRate = 16000;
+        final int expectedState = AudioRecord.STATE_INITIALIZED;
+        // expected values below match the AudioRecord.Builder documentation
+        final int expectedChannel = AudioFormat.CHANNEL_IN_MONO;
+        final int expectedEncoding = AudioFormat.ENCODING_PCM_16BIT;
+        // use builder with a partial audio format
+        final AudioRecord rec = new AudioRecord.Builder()
+                .setAudioFormat(new AudioFormat.Builder().setSampleRate(expectedRate).build())
+                .build();
+        // save results
+        final int observedRate = rec.getSampleRate();
+        final int observedChannel = rec.getChannelConfiguration();
+        final int observedEncoding = rec.getAudioFormat();
+        final int observedState = rec.getState();
+        // release recorder before the test exits (either successfully or with an exception)
+        rec.release();
+        // compare results
+        assertEquals(TEST_NAME + ": configured rate", expectedRate, observedRate);
+        assertEquals(TEST_NAME + ": default channel config", expectedChannel, observedChannel);
+        assertEquals(TEST_NAME + ": default encoding", expectedEncoding, observedEncoding);
+        assertEquals(TEST_NAME + ": state", expectedState, observedState);
+    }
+
+    // Test AudioRecord.Builder to verify the observed configuration of an AudioRecord matches
+    // the parameters used in the builder
+    public void testAudioRecordBuilderParams() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testAudioRecordBuilderParams";
+        final int expectedRate = 8000;
+        final int expectedChannel = AudioFormat.CHANNEL_IN_MONO;
+        final int expectedChannelCount = 1;
+        final int expectedEncoding = AudioFormat.ENCODING_PCM_16BIT;
+        final int expectedSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
+        final int expectedState = AudioRecord.STATE_INITIALIZED;
+        // use builder with expected parameters
+        final AudioRecord rec = new AudioRecord.Builder()
+                .setAudioFormat(new AudioFormat.Builder()
+                        .setSampleRate(expectedRate)
+                        .setChannelMask(expectedChannel)
+                        .setEncoding(expectedEncoding)
+                        .build())
+                .setAudioSource(expectedSource)
+                .build();
+        // save results
+        final int observedRate = rec.getSampleRate();
+        final int observedChannel = rec.getChannelConfiguration();
+        final int observedChannelCount = rec.getChannelCount();
+        final int observedEncoding = rec.getAudioFormat();
+        final int observedSource = rec.getAudioSource();
+        final int observedState = rec.getState();
+        // release recorder before the test exits (either successfully or with an exception)
+        rec.release();
+        // compare results
+        assertEquals(TEST_NAME + ": configured rate", expectedRate, observedRate);
+        assertEquals(TEST_NAME + ": configured channel config", expectedChannel, observedChannel);
+        assertEquals(TEST_NAME + ": configured encoding", expectedEncoding, observedEncoding);
+        assertEquals(TEST_NAME + ": implicit channel count", expectedChannelCount,
+                observedChannelCount);
+        assertEquals(TEST_NAME + ": configured source", expectedSource, observedSource);
+        assertEquals(TEST_NAME + ": state", expectedState, observedState);
+    }
+
+    public void testSynchronizedRecord() throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        final String TEST_NAME = "testSynchronizedRecord";
+        AudioTrack track = null;
+        AudioRecord record = null;
+
+        try {
+            // 1. create a static AudioTrack.
+            final int PLAYBACK_TIME_IN_MS = 2000; /* ms duration. */
+            final int PLAYBACK_SAMPLE_RATE = 8000; /* in hz */
+            AudioFormat format = new AudioFormat.Builder()
+                    .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
+                    .setEncoding(AudioFormat.ENCODING_PCM_8BIT)
+                    .setSampleRate(PLAYBACK_SAMPLE_RATE)
+                    .build();
+            final int frameCount = AudioHelper.frameCountFromMsec(PLAYBACK_TIME_IN_MS, format);
+            final int frameSize = AudioHelper.frameSizeFromFormat(format);
+            track = new AudioTrack.Builder()
+                    .setAudioFormat(format)
+                    .setBufferSizeInBytes(frameCount * frameSize)
+                    .setTransferMode(AudioTrack.MODE_STATIC)
+                    .build();
+            // create float array and write it
+            final int sampleCount = frameCount * format.getChannelCount();
+            byte[] vab = AudioHelper.createSoundDataInByteArray(
+                    sampleCount, PLAYBACK_SAMPLE_RATE, 600 /* frequency */, 0 /* sweep */);
+            assertEquals(TEST_NAME, vab.length,
+                    track.write(vab, 0 /* offsetInBytes */, vab.length,
+                            AudioTrack.WRITE_NON_BLOCKING));
+            final int trackSessionId = track.getAudioSessionId();
+
+            // 2. create an AudioRecord to sync off of AudioTrack completion.
+            final int RECORD_TIME_IN_MS = 2000;
+            final int RECORD_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
+            final int RECORD_CHANNEL_MASK = AudioFormat.CHANNEL_IN_STEREO;
+            final int RECORD_SAMPLE_RATE = 44100;
+            record = new AudioRecord.Builder()
+                    .setAudioFormat(new AudioFormat.Builder()
+                            .setSampleRate(RECORD_SAMPLE_RATE)
+                            .setChannelMask(RECORD_CHANNEL_MASK)
+                            .setEncoding(RECORD_ENCODING)
+                            .build())
+                    .build();
+            // AudioRecord creation may have silently failed, check state now
+            assertEquals(TEST_NAME, AudioRecord.STATE_INITIALIZED, record.getState());
+
+            // 3. create a MediaSyncEvent
+            // This MediaSyncEvent checks playback completion of an AudioTrack
+            // (or MediaPlayer, or ToneGenerator) based on its audio session id.
+            //
+            // Note: when synchronizing record from a MediaSyncEvent
+            // (1) You need to be "close" to the end of the associated AudioTrack.
+            // If the track does not complete in 30 seconds, recording begins regardless.
+            // (actual delay limit may vary).
+            //
+            // (2) Track completion may be triggered by pause() as well as stop()
+            // or when a static AudioTrack completes playback.
+            //
+            final int eventType = MediaSyncEvent.SYNC_EVENT_PRESENTATION_COMPLETE;
+            MediaSyncEvent event = MediaSyncEvent.createEvent(eventType)
+                    .setAudioSessionId(trackSessionId);
+            assertEquals(TEST_NAME, trackSessionId, event.getAudioSessionId());
+            assertEquals(TEST_NAME, eventType, event.getType());
+
+            // 4. now set the AudioTrack playing and start the recording synchronized
+            track.play();
+            // start recording.  Recording state turns to RECORDSTATE_RECORDING immediately
+            // but the data read() only occurs after the AudioTrack completes.
+            record.startRecording(event);
+            assertEquals(TEST_NAME,
+                    AudioRecord.RECORDSTATE_RECORDING, record.getRecordingState());
+            long startTime = System.currentTimeMillis();
+
+            // 5. get record data.
+            // For our tests, we could set test duration by timed sleep or by # frames received.
+            // Since we don't know *exactly* when AudioRecord actually begins recording,
+            // we end the test by # frames read.
+            final int numChannels =
+                    AudioFormat.channelCountFromInChannelMask(RECORD_CHANNEL_MASK);
+            final int bytesPerSample = AudioFormat.getBytesPerSample(RECORD_ENCODING);
+            final int bytesPerFrame = numChannels * bytesPerSample;
+            // careful about integer overflow in the formula below:
+            final int targetSamples =
+                    (int)((long)RECORD_TIME_IN_MS * RECORD_SAMPLE_RATE * numChannels / 1000);
+            final int BUFFER_FRAMES = 512;
+            final int BUFFER_SAMPLES = BUFFER_FRAMES * numChannels;
+
+            // After starting, there is no guarantee when the first frame of data is read.
+            long firstSampleTime = 0;
+            int samplesRead = 0;
+
+            // For 16 bit data, use shorts
+            short[] shortData = new short[BUFFER_SAMPLES];
+            while (samplesRead < targetSamples) {
+                // the first time through, we read a single frame.
+                // this sets the recording anchor position.
+                int amount = samplesRead == 0 ? numChannels :
+                    Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                int ret = record.read(shortData, 0, amount);
+                assertEquals(TEST_NAME, amount, ret);
+                if (samplesRead == 0 && ret > 0) {
+                    firstSampleTime = System.currentTimeMillis();
+                }
+                samplesRead += ret;
+                // sanity check: elapsed time cannot be more than a second
+                // than what we expect.
+                assertTrue(System.currentTimeMillis() - startTime <=
+                        PLAYBACK_TIME_IN_MS + RECORD_TIME_IN_MS + 1000);
+            }
+
+            // 6. We've read all the frames, now check the timing.
+            final long endTime = System.currentTimeMillis();
+            //Log.d(TEST_NAME, "first sample time " + (firstSampleTime - startTime)
+            //        + " test time " + (endTime - firstSampleTime));
+            //
+            // Verify recording starts within 400 ms of AudioTrack completion (typical 180ms)
+            // Verify recording completes within 50 ms of expected test time (typical 20ms)
+            assertEquals(TEST_NAME, PLAYBACK_TIME_IN_MS, firstSampleTime - startTime, 400);
+            assertEquals(TEST_NAME, RECORD_TIME_IN_MS, endTime - firstSampleTime, 50);
+
+            record.stop();
+            assertEquals(TEST_NAME, AudioRecord.RECORDSTATE_STOPPED, record.getRecordingState());
+        } finally {
+            if (record != null) {
+                record.release();
+                record = null;
+            }
+            if (track != null) {
+                track.release();
+                track = null;
+            }
+        }
+    }
+
+    private AudioRecord createAudioRecord(
+            int audioSource, int sampleRateInHz,
+            int channelConfig, int audioFormat, int bufferSizeInBytes,
+            boolean auditRecording, boolean isChannelIndex) {
+        final AudioRecord record;
+        if (auditRecording) {
+            record = new AudioHelper.AudioRecordAudit(
+                    audioSource, sampleRateInHz, channelConfig,
+                    audioFormat, bufferSizeInBytes, isChannelIndex);
+        } else if (isChannelIndex) {
+            record = new AudioRecord.Builder()
+                    .setAudioFormat(new AudioFormat.Builder()
+                            .setChannelIndexMask(channelConfig)
+                            .setEncoding(audioFormat)
+                            .setSampleRate(sampleRateInHz)
+                            .build())
+                    .setBufferSizeInBytes(bufferSizeInBytes)
+                    .build();
+        } else {
+            record = new AudioRecord(audioSource, sampleRateInHz, channelConfig,
+                    audioFormat, bufferSizeInBytes);
+        }
+
+        // did we get the AudioRecord we expected?
+        final AudioFormat format = record.getFormat();
+        assertEquals(isChannelIndex ? channelConfig : AudioFormat.CHANNEL_INVALID,
+                format.getChannelIndexMask());
+        assertEquals(isChannelIndex ? AudioFormat.CHANNEL_INVALID : channelConfig,
+                format.getChannelMask());
+        assertEquals(audioFormat, format.getEncoding());
+        assertEquals(sampleRateInHz, format.getSampleRate());
+        final int frameSize =
+                format.getChannelCount() * AudioFormat.getBytesPerSample(audioFormat);
+        // our native frame count cannot be smaller than our minimum buffer size request.
+        assertTrue(record.getBufferSizeInFrames() * frameSize >= bufferSizeInBytes);
+        return record;
+    }
+
+    private void doTest(String reportName, boolean localRecord, boolean customHandler,
+            int periodsPerSecond, int markerPeriodsPerSecond,
+            boolean useByteBuffer, boolean blocking,
+            final boolean auditRecording, final boolean isChannelIndex,
+            final int TEST_SR, final int TEST_CONF, final int TEST_FORMAT) throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        // audit recording plays back recorded audio, so use longer test timing
+        final int TEST_TIME_MS = auditRecording ? 10000 : 2000;
+        final int TEST_SOURCE = MediaRecorder.AudioSource.DEFAULT;
+        mIsHandleMessageCalled = false;
+
+        // For channelIndex use one frame in bytes for buffer size.
+        // This is adjusted to the minimum buffer size by native code.
+        final int bufferSizeInBytes = isChannelIndex ?
+                (AudioFormat.getBytesPerSample(TEST_FORMAT)
+                        * AudioFormat.channelCountFromInChannelMask(TEST_CONF)) :
+                AudioRecord.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+        assertTrue(bufferSizeInBytes > 0);
+
+        final AudioRecord record;
+        final AudioHelper
+                .MakeSomethingAsynchronouslyAndLoop<AudioRecord> makeSomething;
+
+        if (localRecord) {
+            makeSomething = null;
+            record = createAudioRecord(TEST_SOURCE, TEST_SR, TEST_CONF,
+                    TEST_FORMAT, bufferSizeInBytes, auditRecording, isChannelIndex);
+        } else {
+            makeSomething =
+                    new AudioHelper.MakeSomethingAsynchronouslyAndLoop<AudioRecord>(
+                            new AudioHelper.MakesSomething<AudioRecord>() {
+                                @Override
+                                public AudioRecord makeSomething() {
+                                    return createAudioRecord(TEST_SOURCE, TEST_SR, TEST_CONF,
+                                            TEST_FORMAT, bufferSizeInBytes, auditRecording,
+                                            isChannelIndex);
+                                }
+                            }
+                            );
+           // create AudioRecord on different thread's looper.
+           record = makeSomething.make();
+        }
+
+        // AudioRecord creation may have silently failed, check state now
+        assertEquals(AudioRecord.STATE_INITIALIZED, record.getState());
+
+        final MockOnRecordPositionUpdateListener listener;
+        if (customHandler) {
+            listener = new MockOnRecordPositionUpdateListener(record, mHandler);
+        } else {
+            listener = new MockOnRecordPositionUpdateListener(record);
+        }
+
+        if (markerPeriodsPerSecond != 0) {
+            mMarkerPeriodInFrames = TEST_SR / markerPeriodsPerSecond;
+            mMarkerPosition = mMarkerPeriodInFrames;
+            assertEquals(AudioRecord.SUCCESS,
+                    record.setNotificationMarkerPosition(mMarkerPosition));
+        } else {
+            mMarkerPeriodInFrames = 0;
+        }
+        final int updatePeriodInFrames = (periodsPerSecond == 0)
+                ? 0 : TEST_SR / periodsPerSecond;
+        assertEquals(AudioRecord.SUCCESS,
+                record.setPositionNotificationPeriod(updatePeriodInFrames));
+
+        listener.start(TEST_SR);
+        record.startRecording();
+        assertEquals(AudioRecord.RECORDSTATE_RECORDING, record.getRecordingState());
+        long startTime = System.currentTimeMillis();
+
+        // For our tests, we could set test duration by timed sleep or by # frames received.
+        // Since we don't know *exactly* when AudioRecord actually begins recording,
+        // we end the test by # frames read.
+        final int numChannels =  AudioFormat.channelCountFromInChannelMask(TEST_CONF);
+        final int bytesPerSample = AudioFormat.getBytesPerSample(TEST_FORMAT);
+        final int bytesPerFrame = numChannels * bytesPerSample;
+        // careful about integer overflow in the formula below:
+        final int targetSamples = (int)((long)TEST_TIME_MS * TEST_SR * numChannels / 1000);
+        final int BUFFER_FRAMES = 512;
+        final int BUFFER_SAMPLES = BUFFER_FRAMES * numChannels;
+        // TODO: verify behavior when buffer size is not a multiple of frame size.
+
+        // After starting, there is no guarantee when the first frame of data is read.
+        long firstSampleTime = 0;
+        int samplesRead = 0;
+        if (useByteBuffer) {
+            ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER_SAMPLES * bytesPerSample);
+            while (samplesRead < targetSamples) {
+                // the first time through, we read a single frame.
+                // this sets the recording anchor position.
+                int amount = samplesRead == 0 ? numChannels :
+                    Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                amount *= bytesPerSample;    // in bytes
+                // read always places data at the start of the byte buffer with
+                // position and limit are ignored.  test this by setting
+                // position and limit to arbitrary values here.
+                final int lastPosition = 7;
+                final int lastLimit = 13;
+                byteBuffer.position(lastPosition);
+                byteBuffer.limit(lastLimit);
+                int ret = blocking ? record.read(byteBuffer, amount) :
+                    record.read(byteBuffer, amount, AudioRecord.READ_NON_BLOCKING);
+                // so long as amount requested in bytes is a multiple of the frame size
+                // we expect the byte buffer request to be filled.  Caution: the
+                // byte buffer data will be in native endian order, not Java order.
+                if (blocking) {
+                    assertEquals(amount, ret);
+                } else {
+                    assertTrue("0 <= " + ret + " <= " + amount, 0 <= ret && ret <= amount);
+                }
+                // position, limit are not changed by read().
+                assertEquals(lastPosition, byteBuffer.position());
+                assertEquals(lastLimit, byteBuffer.limit());
+                if (samplesRead == 0 && ret > 0) {
+                    firstSampleTime = System.currentTimeMillis();
+                }
+                samplesRead += ret / bytesPerSample;
+            }
+        } else {
+            switch (TEST_FORMAT) {
+            case AudioFormat.ENCODING_PCM_8BIT: {
+                // For 8 bit data, use bytes
+                byte[] byteData = new byte[BUFFER_SAMPLES];
+                while (samplesRead < targetSamples) {
+                    // the first time through, we read a single frame.
+                    // this sets the recording anchor position.
+                    int amount = samplesRead == 0 ? numChannels :
+                        Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                    int ret = blocking ? record.read(byteData, 0, amount) :
+                        record.read(byteData, 0, amount, AudioRecord.READ_NON_BLOCKING);
+                    if (blocking) {
+                        assertEquals(amount, ret);
+                    } else {
+                        assertTrue("0 <= " + ret + " <= " + amount, 0 <= ret && ret <= amount);
+                    }
+                    if (samplesRead == 0 && ret > 0) {
+                        firstSampleTime = System.currentTimeMillis();
+                    }
+                    samplesRead += ret;
+                }
+            } break;
+            case AudioFormat.ENCODING_PCM_16BIT: {
+                // For 16 bit data, use shorts
+                short[] shortData = new short[BUFFER_SAMPLES];
+                while (samplesRead < targetSamples) {
+                    // the first time through, we read a single frame.
+                    // this sets the recording anchor position.
+                    int amount = samplesRead == 0 ? numChannels :
+                        Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                    int ret = blocking ? record.read(shortData, 0, amount) :
+                        record.read(shortData, 0, amount, AudioRecord.READ_NON_BLOCKING);
+                    if (blocking) {
+                        assertEquals(amount, ret);
+                    } else {
+                        assertTrue("0 <= " + ret + " <= " + amount, 0 <= ret && ret <= amount);
+                    }
+                    if (samplesRead == 0 && ret > 0) {
+                        firstSampleTime = System.currentTimeMillis();
+                    }
+                    samplesRead += ret;
+                }
+            } break;
+            case AudioFormat.ENCODING_PCM_FLOAT: {
+                float[] floatData = new float[BUFFER_SAMPLES];
+                while (samplesRead < targetSamples) {
+                    // the first time through, we read a single frame.
+                    // this sets the recording anchor position.
+                    int amount = samplesRead == 0 ? numChannels :
+                        Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                    int ret = record.read(floatData, 0, amount, blocking ?
+                            AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING);
+                    if (blocking) {
+                        assertEquals(amount, ret);
+                    } else {
+                        assertTrue("0 <= " + ret + " <= " + amount, 0 <= ret && ret <= amount);
+                    }
+                    if (samplesRead == 0 && ret > 0) {
+                        firstSampleTime = System.currentTimeMillis();
+                    }
+                    samplesRead += ret;
+                }
+            } break;
+            }
+        }
+
+        // We've read all the frames, now check the record timing.
+        final long endTime = System.currentTimeMillis();
+        //Log.d(TAG, "first sample time " + (firstSampleTime - startTime)
+        //        + " test time " + (endTime - firstSampleTime));
+        // Verify recording starts within 200 ms of record.startRecording() (typical 100ms)
+        // Verify recording completes within 50 ms of expected test time (typical 20ms)
+        assertEquals(0, firstSampleTime - startTime, 200);
+        assertEquals(TEST_TIME_MS, endTime - firstSampleTime, auditRecording ? 1000 : 50);
+
+        // Even though we've read all the frames we want, the events may not be sent to
+        // the listeners (events are handled through a separate internal callback thread).
+        // One must sleep to make sure the last event(s) come in.
+        Thread.sleep(30);
+
+        record.stop();
+        assertEquals(AudioRecord.RECORDSTATE_STOPPED, record.getRecordingState());
+
+        final long stopTime = System.currentTimeMillis();
+
+        // stop listening - we should be done.
+        // Caution M behavior and likely much earlier:
+        // we assume no events can happen after stop(), but this may not
+        // always be true as stop can take 100ms to complete (as it may disable
+        // input recording on the hal); thus the event handler may be block with
+        // valid events, issuing right after stop completes. Except for those events,
+        // no other events should show up after stop.
+        // This behavior may change in the future but we account for it here in testing.
+        listener.stop();
+
+        // clean up
+        if (makeSomething != null) {
+            makeSomething.join();
+        }
+        listener.release();
+        record.release();
+        if (auditRecording) { // don't check timing if auditing (messes up timing)
+            return;
+        }
+        final int markerPeriods = markerPeriodsPerSecond * TEST_TIME_MS / 1000;
+        final int updatePeriods = periodsPerSecond * TEST_TIME_MS / 1000;
+        final int markerPeriodsMax =
+                markerPeriodsPerSecond * (int)(stopTime - firstSampleTime) / 1000 + 1;
+        final int updatePeriodsMax =
+                periodsPerSecond * (int)(stopTime - firstSampleTime) / 1000 + 1;
+
+        // collect statistics
+        final ArrayList<Integer> markerList = listener.getMarkerList();
+        final ArrayList<Integer> periodicList = listener.getPeriodicList();
+        // verify count of markers and periodic notifications.
+        // there could be an extra notification since we don't stop() immediately
+        // rather wait for potential events to come in.
+        //Log.d(TAG, "markerPeriods " + markerPeriods +
+        //        " markerPeriodsReceived " + markerList.size());
+        //Log.d(TAG, "updatePeriods " + updatePeriods +
+        //        " updatePeriodsReceived " + periodicList.size());
+        assertTrue(TAG + ": markerPeriods " + markerPeriods +
+                " <= markerPeriodsReceived " + markerList.size() +
+                " <= markerPeriodsMax " + markerPeriodsMax,
+                markerPeriods <= markerList.size()
+                && markerList.size() <= markerPeriodsMax);
+        assertTrue(TAG + ": updatePeriods " + updatePeriods +
+               " <= updatePeriodsReceived " + periodicList.size() +
+               " <= updatePeriodsMax " + updatePeriodsMax,
+                updatePeriods <= periodicList.size()
+                && periodicList.size() <= updatePeriodsMax);
+
+        // Since we don't have accurate positioning of the start time of the recorder,
+        // and there is no record.getPosition(), we consider only differential timing
+        // from the first marker or periodic event.
+        final int toleranceInFrames = TEST_SR * 80 / 1000; // 80 ms
+
+        AudioHelper.Statistics markerStat = new AudioHelper.Statistics();
+        for (int i = 1; i < markerList.size(); ++i) {
+            final int expected = mMarkerPeriodInFrames * i;
+            final int actual = markerList.get(i) - markerList.get(0);
+            //Log.d(TAG, "Marker: " + i + " expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (actual - expected) + ")"
+            //        + " tolerance " + toleranceInFrames);
+            assertEquals(expected, actual, toleranceInFrames);
+            markerStat.add((double)(actual - expected) * 1000 / TEST_SR);
+        }
+
+        AudioHelper.Statistics periodicStat = new AudioHelper.Statistics();
+        for (int i = 1; i < periodicList.size(); ++i) {
+            final int expected = updatePeriodInFrames * i;
+            final int actual = periodicList.get(i) - periodicList.get(0);
+            //Log.d(TAG, "Update: " + i + " expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (actual - expected) + ")"
+            //        + " tolerance " + toleranceInFrames);
+            assertEquals(expected, actual, toleranceInFrames);
+            periodicStat.add((double)(actual - expected) * 1000 / TEST_SR);
+        }
+
+        // report this
+        ReportLog log = getReportLog();
+        log.printValue(reportName + ": startRecording lag", firstSampleTime - startTime,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Total record time expected", TEST_TIME_MS,
+                ResultType.NEUTRAL, ResultUnit.MS);
+        log.printValue(reportName + ": Total record time actual", (endTime - firstSampleTime),
+                ResultType.NEUTRAL, ResultUnit.MS);
+        log.printValue(reportName + ": Total markers expected", markerPeriods,
+                ResultType.NEUTRAL, ResultUnit.COUNT);
+        log.printValue(reportName + ": Total markers actual", markerList.size(),
+                ResultType.NEUTRAL, ResultUnit.COUNT);
+        log.printValue(reportName + ": Total periods expected", updatePeriods,
+                ResultType.NEUTRAL, ResultUnit.COUNT);
+        log.printValue(reportName + ": Total periods actual", periodicList.size(),
+                ResultType.NEUTRAL, ResultUnit.COUNT);
+        log.printValue(reportName + ": Average Marker diff", markerStat.getAvg(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Maximum Marker abs diff", markerStat.getMaxAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Marker abs diff", markerStat.getAvgAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Periodic diff", periodicStat.getAvg(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Maximum Periodic abs diff", periodicStat.getMaxAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Periodic abs diff", periodicStat.getAvgAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printSummary(reportName + ": Unified abs diff",
+                (periodicStat.getAvgAbs() + markerStat.getAvgAbs()) / 2,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+    }
+
+    private class MockOnRecordPositionUpdateListener
+                                        implements OnRecordPositionUpdateListener {
+        public MockOnRecordPositionUpdateListener(AudioRecord record) {
+            mAudioRecord = record;
+            record.setRecordPositionUpdateListener(this);
+        }
+
+        public MockOnRecordPositionUpdateListener(AudioRecord record, Handler handler) {
+            mAudioRecord = record;
+            record.setRecordPositionUpdateListener(this, handler);
+        }
+
+        public synchronized void onMarkerReached(AudioRecord record) {
+            if (mIsTestActive) {
+                int position = getPosition();
+                mOnMarkerReachedCalled.add(position);
+                mMarkerPosition += mMarkerPeriodInFrames;
+                assertEquals(AudioRecord.SUCCESS,
+                        mAudioRecord.setNotificationMarkerPosition(mMarkerPosition));
+            } else {
+                // stop() is not sufficient to end all notifications
+                // as is not synchronous with the event handling thread
+                // so we comment out the line below.
+                // fail("onMarkerReached called when not active");
+            }
+        }
+
+        public synchronized void onPeriodicNotification(AudioRecord record) {
+            if (mIsTestActive) {
+                int position = getPosition();
+                mOnPeriodicNotificationCalled.add(position);
+            } else {
+                // see above comments about stop
+                // fail("onPeriodicNotification called when not active");
+            }
+        }
+
+        public synchronized void start(int sampleRate) {
+            mIsTestActive = true;
+            mSampleRate = sampleRate;
+            mStartTime = System.currentTimeMillis();
+        }
+
+        public synchronized void stop() {
+            mIsTestActive = false;
+        }
+
+        public ArrayList<Integer> getMarkerList() {
+            return mOnMarkerReachedCalled;
+        }
+
+        public ArrayList<Integer> getPeriodicList() {
+            return mOnPeriodicNotificationCalled;
+        }
+
+        public synchronized void release() {
+            mAudioRecord.setRecordPositionUpdateListener(null);
+            mAudioRecord = null;
+        }
+
+        private int getPosition() {
+            // we don't have mAudioRecord.getRecordPosition();
+            // so we fake this by timing.
+            long delta = System.currentTimeMillis() - mStartTime;
+            return (int)(delta * mSampleRate / 1000);
+        }
+
+        private long mStartTime;
+        private int mSampleRate;
+        private boolean mIsTestActive = true;
+        private AudioRecord mAudioRecord;
+        private ArrayList<Integer> mOnMarkerReachedCalled = new ArrayList<Integer>();
+        private ArrayList<Integer> mOnPeriodicNotificationCalled = new ArrayList<Integer>();
+    }
+
     private boolean hasMicrophone() {
-        return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE);
+        return getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_MICROPHONE);
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java b/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
index e597827..1de6302 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
@@ -53,6 +53,11 @@
             } catch (Throwable e) {
                 Log.e(TAG, "Sample rate: " + SAMPLE_RATES_IN_HZ[i], e);
                 failedSampleRates.add(SAMPLE_RATES_IN_HZ[i]);
+                if (mAudioRecord != null) {
+                    // clean up.  AudioRecords are in scarce supply.
+                    mAudioRecord.release();
+                    mAudioRecord = null;
+                }
             }
         }
         assertTrue("Failed sample rates: " + failedSampleRates + " See log for more details.",
@@ -61,21 +66,26 @@
 
     private void record(int sampleRateInHz) {
         int bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, CHANNEL_CONFIG, AUDIO_FORMAT);
-        byte[] buffer = new byte[bufferSize];
         assertTrue(bufferSize > 0);
 
         createAudioRecord(sampleRateInHz, bufferSize);
-        checkRecordingState(AudioRecord.STATE_INITIALIZED);
+        // RecordingState changes are reflected synchronously (no need to poll)
+        assertEquals(AudioRecord.RECORDSTATE_STOPPED, mAudioRecord.getRecordingState());
 
         mAudioRecord.startRecording();
-        checkRecordingState(AudioRecord.RECORDSTATE_RECORDING);
+        assertEquals(AudioRecord.RECORDSTATE_RECORDING, mAudioRecord.getRecordingState());
 
+        // it is preferred to use a short array to read AudioFormat.ENCODING_PCM_16BIT data
+        // but it's ok to read using using a byte array.  16 bit PCM data will be
+        // stored as two bytes, native endian.
+        byte[] buffer = new byte[bufferSize];
         assertTrue(mAudioRecord.read(buffer, 0, bufferSize) > 0);
 
         mAudioRecord.stop();
-        checkRecordingState(AudioRecord.RECORDSTATE_STOPPED);
+        assertEquals(AudioRecord.RECORDSTATE_STOPPED, mAudioRecord.getRecordingState());
 
         mAudioRecord.release();
+        mAudioRecord = null;
     }
 
     private void createAudioRecord(final int sampleRateInHz, final int bufferSize) {
@@ -84,15 +94,6 @@
         assertNotNull(mAudioRecord);
     }
 
-    private void checkRecordingState(final int state) {
-        new PollingCheck() {
-            @Override
-            protected boolean check() {
-                return mAudioRecord.getRecordingState() == state;
-            }
-        }.run();
-    }
-
     private boolean hasMicrophone() {
         return getContext().getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_MICROPHONE);
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index be68756..dfb83eb 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -18,11 +18,14 @@
 
 import android.content.pm.PackageManager;
 import android.cts.util.CtsAndroidTestCase;
+import android.media.AudioAttributes;
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioTimestamp;
 import android.media.AudioTrack;
+import android.media.PlaybackParams;
 import android.util.Log;
+
 import com.android.cts.util.ReportLog;
 import com.android.cts.util.ResultType;
 import com.android.cts.util.ResultUnit;
@@ -261,6 +264,116 @@
     }
 
     // -----------------------------------------------------------------
+    // AudioTrack construction with Builder
+    // ----------------------------------
+
+    // Test case 1: build AudioTrack with default parameters, test documented default params
+    public void testBuilderDefault() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testBuilderDefault";
+        final int expectedDefaultEncoding = AudioFormat.ENCODING_PCM_16BIT;
+        final int expectedDefaultRate =
+                AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
+        final int expectedDefaultChannels = AudioFormat.CHANNEL_OUT_STEREO;
+        // use Builder
+        final int buffSizeInBytes = AudioTrack.getMinBufferSize(
+                expectedDefaultRate, expectedDefaultChannels, expectedDefaultEncoding);
+        final AudioTrack track = new AudioTrack.Builder()
+                .setBufferSizeInBytes(buffSizeInBytes)
+                .build();
+        // save results
+        final int observedState = track.getState();
+        final int observedFormat = track.getAudioFormat();
+        final int observedChannelConf = track.getChannelConfiguration();
+        final int observedRate = track.getSampleRate();
+        // release track before the test exits (either successfully or with an exception)
+        track.release();
+        // compare results
+        assertEquals(TEST_NAME + ": Track initialized", AudioTrack.STATE_INITIALIZED,
+                observedState);
+        assertEquals(TEST_NAME + ": Default track encoding", expectedDefaultEncoding,
+                observedFormat);
+        assertEquals(TEST_NAME + ": Default track channels", expectedDefaultChannels,
+                observedChannelConf);
+        assertEquals(TEST_NAME + ": Default track sample rate", expectedDefaultRate,
+                observedRate);
+    }
+
+    // Test case 2: build AudioTrack with AudioFormat, test it's used
+    public void testBuilderFormat() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testBuilderFormat";
+        final int TEST_RATE = 32000;
+        final int TEST_CHANNELS = AudioFormat.CHANNEL_OUT_STEREO;
+        // use Builder
+        final int buffSizeInBytes = AudioTrack.getMinBufferSize(
+                TEST_RATE, TEST_CHANNELS, AudioFormat.ENCODING_PCM_16BIT);
+        final AudioTrack track = new AudioTrack.Builder()
+                .setAudioAttributes(new AudioAttributes.Builder().build())
+                .setBufferSizeInBytes(buffSizeInBytes)
+                .setAudioFormat(new AudioFormat.Builder()
+                        .setChannelMask(TEST_CHANNELS).setSampleRate(TEST_RATE).build())
+                .build();
+        // save results
+        final int observedState = track.getState();
+        final int observedChannelConf = track.getChannelConfiguration();
+        final int observedRate = track.getSampleRate();
+        // release track before the test exits (either successfully or with an exception)
+        track.release();
+        // compare results
+        assertEquals(TEST_NAME + ": Track initialized", AudioTrack.STATE_INITIALIZED,
+                observedState);
+        assertEquals(TEST_NAME + ": Track channels", TEST_CHANNELS, observedChannelConf);
+        assertEquals(TEST_NAME + ": Track sample rate", TEST_RATE, observedRate);
+    }
+
+    // Test case 3: build AudioTrack with session ID, test it's used
+    public void testBuilderSession() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testBuilderSession";
+        // generate a session ID
+        final int expectedSessionId = new AudioManager(getContext()).generateAudioSessionId();
+        // use builder
+        final AudioTrack track = new AudioTrack.Builder()
+                .setSessionId(expectedSessionId)
+                .build();
+        // save results
+        final int observedSessionId = track.getAudioSessionId();
+        // release track before the test exits (either successfully or with an exception)
+        track.release();
+        // compare results
+        assertEquals(TEST_NAME + ": Assigned track session ID", expectedSessionId,
+                observedSessionId);
+    }
+
+    // Test case 4: build AudioTrack with AudioAttributes built from stream type, test it's used
+    public void testBuilderAttributesStream() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testBuilderAttributesStream";
+        //     use a stream type documented in AudioAttributes.Builder.setLegacyStreamType(int)
+        final int expectedStreamType = AudioManager.STREAM_ALARM;
+        final int expectedContentType = AudioAttributes.CONTENT_TYPE_SPEECH;
+        final AudioAttributes aa = new AudioAttributes.Builder()
+                .setLegacyStreamType(expectedStreamType)
+                .setContentType(expectedContentType)
+                .build();
+        // use builder
+        final AudioTrack track = new AudioTrack.Builder()
+                .setAudioAttributes(aa)
+                .build();
+        // save results
+        final int observedStreamType = track.getStreamType();
+        // release track before the test exits (either successfully or with an exception)
+        track.release();
+        // compare results
+        assertEquals(TEST_NAME + ": track stream type", expectedStreamType, observedStreamType);
+        //    also test content type was preserved in the attributes even though they
+        //     were first configured with a legacy stream type
+        assertEquals(TEST_NAME + ": attributes content type", expectedContentType,
+                aa.getContentType());
+    }
+
+    // -----------------------------------------------------------------
     // Playback head position
     // ----------------------------------
 
@@ -1225,7 +1338,7 @@
         // constant for test
         final String TEST_NAME = "testGetMinBufferSizeTooHighSR";
         // FIXME need an API to retrieve AudioTrack.SAMPLE_RATE_HZ_MAX
-        final int TEST_SR = 96001;
+        final int TEST_SR = 192001;
         final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO;
         final int TEST_FORMAT = AudioFormat.ENCODING_PCM_8BIT;
 
@@ -1278,6 +1391,7 @@
             frameCount /= 2;
         }
         assertTrue(TEST_NAME, track.getNativeFrameCount() >= frameCount);
+        assertEquals(TEST_NAME, track.getNativeFrameCount(), track.getBufferSizeInFrames());
     }
 
     public void testReloadStaticData() throws Exception {
@@ -1291,7 +1405,8 @@
 
         // -------- initialization --------------
         int bufferSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
-        byte data[] = createSoundDataInByteArray(bufferSize, TEST_SR, 1024);
+        byte data[] = AudioHelper.createSoundDataInByteArray(
+                bufferSize, TEST_SR, 1024 /* frequency */, 0 /* sweep */);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
                 bufferSize, TEST_MODE);
         // -------- test --------------
@@ -1309,58 +1424,10 @@
         track.release();
     }
 
-    public static byte[] createSoundDataInByteArray(int bufferSamples, final int sampleRate,
-            final double frequency, double sweep) {
-        final double rad = 2 * Math.PI * frequency / sampleRate;
-        byte[] vai = new byte[bufferSamples];
-        sweep = Math.PI * sweep / ((double)sampleRate * vai.length);
-        for (int j = 0; j < vai.length; j++) {
-            int unsigned =  (int)(Math.sin(j * (rad + j * sweep)) * Byte.MAX_VALUE)
-                    + Byte.MAX_VALUE & 0xFF;
-            vai[j] = (byte) unsigned;
-        }
-        return vai;
-    }
-
-    public static short[] createSoundDataInShortArray(int bufferSamples, final int sampleRate,
-            final double frequency, double sweep) {
-        final double rad = 2 * Math.PI * frequency / sampleRate;
-        short[] vai = new short[bufferSamples];
-        sweep = Math.PI * sweep / ((double)sampleRate * vai.length);
-        for (int j = 0; j < vai.length; j++) {
-            vai[j] = (short)(Math.sin(j * (rad + j * sweep)) * Short.MAX_VALUE);
-        }
-        return vai;
-    }
-
-    public static float[] createSoundDataInFloatArray(int bufferSamples, final int sampleRate,
-            final double frequency, double sweep) {
-        final double rad = 2 * Math.PI * frequency / sampleRate;
-        float[] vaf = new float[bufferSamples];
-        sweep = Math.PI * sweep / ((double)sampleRate * vaf.length);
-        for (int j = 0; j < vaf.length; j++) {
-            vaf[j] = (float)(Math.sin(j * (rad + j * sweep)));
-        }
-        return vaf;
-    }
-
-    public static byte[] createSoundDataInByteArray(int bufferSamples, final int sampleRate,
-            final double frequency) {
-        return createSoundDataInByteArray(bufferSamples, sampleRate, frequency, 0 /*sweep*/);
-    }
-
-    public static short[] createSoundDataInShortArray(int bufferSamples, final int sampleRate,
-            final double frequency) {
-        return createSoundDataInShortArray(bufferSamples, sampleRate, frequency, 0 /*sweep*/);
-    }
-
-    public static float[] createSoundDataInFloatArray(int bufferSamples, final int sampleRate,
-            final double frequency) {
-        return createSoundDataInFloatArray(bufferSamples, sampleRate, frequency, 0 /*sweep*/);
-    }
-
     public void testPlayStaticData() throws Exception {
         if (!hasAudioOutput()) {
+            Log.w(TAG,"AUDIO_OUTPUT feature not found. This system might not have a valid "
+                    + "audio output HAL");
             return;
         }
         // constants for test
@@ -1399,54 +1466,54 @@
                     final long MILLISECONDS_PER_SECOND = 1000;
                     AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR,
                             TEST_CONF, TEST_FORMAT, bufferSize, TEST_MODE);
-                    assertEquals(TEST_NAME, track.getState(), AudioTrack.STATE_NO_STATIC_DATA);
+                    assertEquals(TEST_NAME, AudioTrack.STATE_NO_STATIC_DATA, track.getState());
 
                     // -------- test --------------
 
                     // test setLoopPoints and setPosition can be called here.
                     assertEquals(TEST_NAME,
-                            track.setPlaybackHeadPosition(bufferFrames/2),
-                            android.media.AudioTrack.SUCCESS);
+                            android.media.AudioTrack.SUCCESS,
+                            track.setPlaybackHeadPosition(bufferFrames/2));
                     assertEquals(TEST_NAME,
+                            android.media.AudioTrack.SUCCESS,
                             track.setLoopPoints(
-                                    0 /*startInFrames*/, bufferFrames, 10 /*loopCount*/),
-                            android.media.AudioTrack.SUCCESS);
+                                    0 /*startInFrames*/, bufferFrames, 10 /*loopCount*/));
                     // only need to write once to the static track
                     switch (TEST_FORMAT) {
                     case AudioFormat.ENCODING_PCM_8BIT: {
-                        byte data[] = createSoundDataInByteArray(
+                        byte data[] = AudioHelper.createSoundDataInByteArray(
                                 bufferSamples, TEST_SR,
                                 testFrequency, TEST_SWEEP);
                         assertEquals(TEST_NAME,
-                                track.write(data, 0 /*offsetInBytes*/, data.length),
-                                bufferSamples);
+                                bufferSamples,
+                                track.write(data, 0 /*offsetInBytes*/, data.length));
                         } break;
                     case AudioFormat.ENCODING_PCM_16BIT: {
-                        short data[] = createSoundDataInShortArray(
+                        short data[] = AudioHelper.createSoundDataInShortArray(
                                 bufferSamples, TEST_SR,
                                 testFrequency, TEST_SWEEP);
                         assertEquals(TEST_NAME,
-                                track.write(data, 0 /*offsetInBytes*/, data.length),
-                                bufferSamples);
+                                bufferSamples,
+                                track.write(data, 0 /*offsetInBytes*/, data.length));
                         } break;
                     case AudioFormat.ENCODING_PCM_FLOAT: {
-                        float data[] = createSoundDataInFloatArray(
+                        float data[] = AudioHelper.createSoundDataInFloatArray(
                                 bufferSamples, TEST_SR,
                                 testFrequency, TEST_SWEEP);
                         assertEquals(TEST_NAME,
+                                bufferSamples,
                                 track.write(data, 0 /*offsetInBytes*/, data.length,
-                                        AudioTrack.WRITE_BLOCKING),
-                                bufferSamples);
+                                        AudioTrack.WRITE_BLOCKING));
                         } break;
                     }
-                    assertEquals(TEST_NAME, track.getState(), AudioTrack.STATE_INITIALIZED);
+                    assertEquals(TEST_NAME, AudioTrack.STATE_INITIALIZED, track.getState());
                     // test setLoopPoints and setPosition can be called here.
                     assertEquals(TEST_NAME,
-                            track.setPlaybackHeadPosition(0 /*positionInFrames*/),
-                            android.media.AudioTrack.SUCCESS);
+                            android.media.AudioTrack.SUCCESS,
+                            track.setPlaybackHeadPosition(0 /*positionInFrames*/));
                     assertEquals(TEST_NAME,
-                            track.setLoopPoints(0 /*startInFrames*/, bufferFrames, TEST_LOOPS),
-                            android.media.AudioTrack.SUCCESS);
+                            android.media.AudioTrack.SUCCESS,
+                            track.setLoopPoints(0 /*startInFrames*/, bufferFrames, TEST_LOOPS));
 
                     track.play();
                     Thread.sleep(seconds * MILLISECONDS_PER_SECOND * (TEST_LOOPS + 1));
@@ -1455,7 +1522,7 @@
                     // Check position after looping. AudioTrack.getPlaybackHeadPosition() returns
                     // the running count of frames played, not the actual static buffer position.
                     int position = track.getPlaybackHeadPosition();
-                    assertEquals(TEST_NAME, position, bufferFrames * (TEST_LOOPS + 1));
+                    assertEquals(TEST_NAME, bufferFrames * (TEST_LOOPS + 1), position);
 
                     track.stop();
                     Thread.sleep(WAIT_MSEC);
@@ -1475,12 +1542,14 @@
                 AudioFormat.ENCODING_PCM_16BIT,
                 AudioFormat.ENCODING_PCM_FLOAT,
         };
+        // due to downmixer algorithmic latency, source channels greater than 2 may
+        // sound shorter in duration at 4kHz sampling rate.
         final int TEST_SR_ARRAY[] = {
                 4000,
-                22050,
                 44100,
                 48000,
                 96000,
+                192000,
         };
         final int TEST_CONF_ARRAY[] = {
                 AudioFormat.CHANNEL_OUT_MONO,    // 1.0
@@ -1494,6 +1563,7 @@
         };
         final int TEST_MODE = AudioTrack.MODE_STREAM;
         final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+        final float TEST_SWEEP = 0; // sine wave only
 
         for (int TEST_FORMAT : TEST_FORMAT_ARRAY) {
             double frequency = 400; // frequency changes for each test
@@ -1502,72 +1572,81 @@
                     // -------- initialization --------------
                     final int minBufferSize = AudioTrack.getMinBufferSize(TEST_SR,
                             TEST_CONF, TEST_FORMAT); // in bytes
-                    final int bufferSamples = 12 * minBufferSize
-                            / AudioFormat.getBytesPerSample(TEST_FORMAT);
-                    final int channelCount = Integer.bitCount(TEST_CONF);
-                    final double testFrequency = frequency / channelCount;
                     AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR,
                             TEST_CONF, TEST_FORMAT, minBufferSize, TEST_MODE);
                     assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
-                    boolean hasPlayed = false;
-                    int written = 0;
 
+                    // compute parameters for the source signal data.
+                    final int channelCount = Integer.bitCount(TEST_CONF);
+                    AudioFormat format = track.getFormat();
+                    assertEquals(TEST_NAME, TEST_SR, format.getSampleRate());
+                    assertEquals(TEST_NAME, TEST_CONF, format.getChannelMask());
+                    assertEquals(TEST_NAME, channelCount, format.getChannelCount());
+                    assertEquals(TEST_NAME, TEST_FORMAT, format.getEncoding());
+                    final int sourceSamples = channelCount
+                            * AudioHelper.frameCountFromMsec(500,
+                                    format); // duration of test tones
+                    final double testFrequency = frequency / channelCount;
+
+                    int written = 0;
+                    // For streaming tracks, it's ok to issue the play() command
+                    // before any audio is written.
+                    track.play();
                     // -------- test --------------
+
+                    // samplesPerWrite can be any positive value.
+                    // We prefer this to be a multiple of channelCount so write()
+                    // does not return a short count.
+                    // If samplesPerWrite is very large, it is limited to the data length
+                    // and we simply write (blocking) the entire source data and not even loop.
+                    // We choose a value here which simulates double buffer writes.
+                    final int buffers = 2; // double buffering mode
+                    final int samplesPerWrite =
+                            (track.getBufferSizeInFrames() / buffers) * channelCount;
                     switch (TEST_FORMAT) {
                     case AudioFormat.ENCODING_PCM_8BIT: {
-                        byte data[] = createSoundDataInByteArray(
-                                bufferSamples, TEST_SR,
-                                testFrequency);
+                        byte data[] = AudioHelper.createSoundDataInByteArray(
+                                sourceSamples, TEST_SR,
+                                testFrequency, TEST_SWEEP);
                         while (written < data.length) {
-                            int ret = track.write(data, written,
-                                    Math.min(data.length - written, minBufferSize));
-                            assertTrue(TEST_NAME, ret >= 0);
+                            int samples = Math.min(data.length - written, samplesPerWrite);
+                            int ret = track.write(data, written, samples);
+                            assertEquals(TEST_NAME, samples, ret);
                             written += ret;
-                            if (!hasPlayed) {
-                                track.play();
-                                hasPlayed = true;
-                            }
                         }
                         } break;
                     case AudioFormat.ENCODING_PCM_16BIT: {
-                        short data[] = createSoundDataInShortArray(
-                                bufferSamples, TEST_SR,
-                                testFrequency);
+                        short data[] = AudioHelper.createSoundDataInShortArray(
+                                sourceSamples, TEST_SR,
+                                testFrequency, TEST_SWEEP);
                         while (written < data.length) {
-                            int ret = track.write(data, written,
-                                    Math.min(data.length - written, minBufferSize));
-                            assertTrue(TEST_NAME, ret >= 0);
+                            int samples = Math.min(data.length - written, samplesPerWrite);
+                            int ret = track.write(data, written, samples);
+                            assertEquals(TEST_NAME, samples, ret);
                             written += ret;
-                            if (!hasPlayed) {
-                                track.play();
-                                hasPlayed = true;
-                            }
                         }
                         } break;
                     case AudioFormat.ENCODING_PCM_FLOAT: {
-                        float data[] = createSoundDataInFloatArray(
-                                bufferSamples, TEST_SR,
-                                testFrequency);
+                        float data[] = AudioHelper.createSoundDataInFloatArray(
+                                sourceSamples, TEST_SR,
+                                testFrequency, TEST_SWEEP);
                         while (written < data.length) {
-                            int ret = track.write(data, written,
-                                    Math.min(data.length - written, minBufferSize),
+                            int samples = Math.min(data.length - written, samplesPerWrite);
+                            int ret = track.write(data, written, samples,
                                     AudioTrack.WRITE_BLOCKING);
-                            assertTrue(TEST_NAME, ret >= 0);
+                            assertEquals(TEST_NAME, samples, ret);
                             written += ret;
-                            if (!hasPlayed) {
-                                track.play();
-                                hasPlayed = true;
-                            }
                         }
                         } break;
                     }
 
-                    Thread.sleep(WAIT_MSEC);
+                    // For streaming tracks, AudioTrack.stop() doesn't immediately stop playback.
+                    // Rather, it allows the remaining data in the internal buffer to drain.
                     track.stop();
-                    Thread.sleep(WAIT_MSEC);
+                    Thread.sleep(WAIT_MSEC); // wait for the data to drain.
                     // -------- tear down --------------
                     track.release();
-                    frequency += 70; // increment test tone frequency
+                    frequency += 50; // increment test tone frequency
                 }
             }
         }
@@ -1593,6 +1672,7 @@
         };
         final int TEST_MODE = AudioTrack.MODE_STREAM;
         final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+        final float TEST_SWEEP = 0; // sine wave only
 
         for (int TEST_FORMAT : TEST_FORMAT_ARRAY) {
             double frequency = 800; // frequency changes for each test
@@ -1606,12 +1686,19 @@
                             int bufferSize = 12 * minBufferSize;
                             int bufferSamples = bufferSize
                                     / AudioFormat.getBytesPerSample(TEST_FORMAT);
+
+                            // create audio track and confirm settings
                             AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR,
                                     TEST_CONF, TEST_FORMAT, minBufferSize, TEST_MODE);
-                            assertTrue(TEST_NAME,
-                                    track.getState() == AudioTrack.STATE_INITIALIZED);
-                            boolean hasPlayed = false;
-                            int written = 0;
+                            assertEquals(TEST_NAME + ": state",
+                                    AudioTrack.STATE_INITIALIZED, track.getState());
+                            assertEquals(TEST_NAME + ": sample rate",
+                                    TEST_SR, track.getSampleRate());
+                            assertEquals(TEST_NAME + ": channel mask",
+                                    TEST_CONF, track.getChannelConfiguration());
+                            assertEquals(TEST_NAME + ": encoding",
+                                    TEST_FORMAT, track.getAudioFormat());
+
                             ByteBuffer bb = (useDirect == 1)
                                     ? ByteBuffer.allocateDirect(bufferSize)
                                             : ByteBuffer.allocate(bufferSize);
@@ -1620,30 +1707,32 @@
                             // -------- test --------------
                             switch (TEST_FORMAT) {
                                 case AudioFormat.ENCODING_PCM_8BIT: {
-                                    byte data[] = createSoundDataInByteArray(
+                                    byte data[] = AudioHelper.createSoundDataInByteArray(
                                             bufferSamples, TEST_SR,
-                                            frequency);
+                                            frequency, TEST_SWEEP);
                                     bb.put(data);
                                     bb.flip();
                                 } break;
                                 case AudioFormat.ENCODING_PCM_16BIT: {
-                                    short data[] = createSoundDataInShortArray(
+                                    short data[] = AudioHelper.createSoundDataInShortArray(
                                             bufferSamples, TEST_SR,
-                                            frequency);
+                                            frequency, TEST_SWEEP);
                                     ShortBuffer sb = bb.asShortBuffer();
                                     sb.put(data);
                                     bb.limit(sb.limit() * 2);
                                 } break;
                                 case AudioFormat.ENCODING_PCM_FLOAT: {
-                                    float data[] = createSoundDataInFloatArray(
+                                    float data[] = AudioHelper.createSoundDataInFloatArray(
                                             bufferSamples, TEST_SR,
-                                            frequency);
+                                            frequency, TEST_SWEEP);
                                     FloatBuffer fb = bb.asFloatBuffer();
                                     fb.put(data);
                                     bb.limit(fb.limit() * 4);
                                 } break;
                             }
 
+                            boolean hasPlayed = false;
+                            int written = 0;
                             while (written < bufferSize) {
                                 int ret = track.write(bb,
                                         Math.min(bufferSize - written, minBufferSize),
@@ -1656,7 +1745,6 @@
                                 }
                             }
 
-                            Thread.sleep(WAIT_MSEC);
                             track.stop();
                             Thread.sleep(WAIT_MSEC);
                             // -------- tear down --------------
@@ -1669,6 +1757,137 @@
         }
     }
 
+    public void testPlayChannelIndexStreamBuffer() throws Exception {
+        // should hear 4 tones played 3 or 4 times depending
+        // on the device output capabilities (e.g. stereo or 5.1 or otherwise)
+        final String TEST_NAME = "testPlayChannelIndexStreamBuffer";
+        final int TEST_FORMAT_ARRAY[] = {
+                AudioFormat.ENCODING_PCM_8BIT,
+                //AudioFormat.ENCODING_PCM_16BIT,
+                //AudioFormat.ENCODING_PCM_FLOAT,
+        };
+        final int TEST_SR_ARRAY[] = {
+                48000,
+        };
+        // The following channel index masks are iterated over and route
+        // the AudioTrack channels to the output sink channels based on
+        // the set bits in counting order (lsb to msb).
+        //
+        // For a stereo output sink, the sound may come from L and R, L only, none, or R only.
+        // For a 5.1 output sink, the sound may come from a variety of outputs
+        // as commented below.
+        final int TEST_CONF_ARRAY[] = { // matches output sink channels:
+                (1 << 0) | (1 << 1), // Stereo(L, R) 5.1(FL, FR)
+                (1 << 0) | (1 << 2), // Stereo(L)    5.1(FL, FC)
+                (1 << 4) | (1 << 5), // Stereo(None) 5.1(BL, BR)
+                (1 << 1) | (1 << 2), // Stereo(R)    5.1(FR, FC)
+        };
+        final int TEST_WRITE_MODE_ARRAY[] = {
+                AudioTrack.WRITE_BLOCKING,
+                AudioTrack.WRITE_NON_BLOCKING,
+        };
+        final float TEST_SWEEP = 0;
+
+        for (int TEST_FORMAT : TEST_FORMAT_ARRAY) {
+            for (int TEST_CONF : TEST_CONF_ARRAY) {
+                double frequency = 800; // frequency changes for each test
+                for (int TEST_SR : TEST_SR_ARRAY) {
+                    for (int TEST_WRITE_MODE : TEST_WRITE_MODE_ARRAY) {
+                        for (int useDirect = 0; useDirect < 2; ++useDirect) {
+                            AudioFormat format = new AudioFormat.Builder()
+                                    .setEncoding(TEST_FORMAT)
+                                    .setSampleRate(TEST_SR)
+                                    .setChannelIndexMask(TEST_CONF)
+                                    .build();
+                            AudioTrack track = new AudioTrack.Builder()
+                                    .setAudioFormat(format)
+                                    .build();
+                            assertEquals(TEST_NAME,
+                                    AudioTrack.STATE_INITIALIZED, track.getState());
+
+                            // create the byte buffer and fill with test data
+                            final int frameSize = AudioHelper.frameSizeFromFormat(format);
+                            final int frameCount =
+                                    AudioHelper.frameCountFromMsec(300 /* ms */, format);
+                            final int bufferSize = frameCount * frameSize;
+                            final int bufferSamples = frameCount * format.getChannelCount();
+                            ByteBuffer bb = (useDirect == 1)
+                                    ? ByteBuffer.allocateDirect(bufferSize)
+                                            : ByteBuffer.allocate(bufferSize);
+                            bb.order(java.nio.ByteOrder.nativeOrder());
+
+                            switch (TEST_FORMAT) {
+                            case AudioFormat.ENCODING_PCM_8BIT: {
+                                byte data[] = AudioHelper.createSoundDataInByteArray(
+                                        bufferSamples, TEST_SR,
+                                        frequency, TEST_SWEEP);
+                                bb.put(data);
+                                bb.flip();
+                            } break;
+                            case AudioFormat.ENCODING_PCM_16BIT: {
+                                short data[] = AudioHelper.createSoundDataInShortArray(
+                                        bufferSamples, TEST_SR,
+                                        frequency, TEST_SWEEP);
+                                ShortBuffer sb = bb.asShortBuffer();
+                                sb.put(data);
+                                bb.limit(sb.limit() * 2);
+                            } break;
+                            case AudioFormat.ENCODING_PCM_FLOAT: {
+                                float data[] = AudioHelper.createSoundDataInFloatArray(
+                                        bufferSamples, TEST_SR,
+                                        frequency, TEST_SWEEP);
+                                FloatBuffer fb = bb.asFloatBuffer();
+                                fb.put(data);
+                                bb.limit(fb.limit() * 4);
+                            } break;
+                            }
+
+                            // start the AudioTrack
+                            // This can be done before or after the first write.
+                            // Current behavior for streaming tracks is that
+                            // actual playback does not begin before the internal
+                            // data buffer is completely full.
+                            track.play();
+
+                            // write data
+                            final long startTime = System.currentTimeMillis();
+                            final long maxDuration = frameCount * 1000 / TEST_SR + 1000;
+                            for (int written = 0; written < bufferSize; ) {
+                                // ret may return a short count if write
+                                // is non blocking or even if write is blocking
+                                // when a stop/pause/flush is issued from another thread.
+                                final int kBatchFrames = 1000;
+                                int ret = track.write(bb,
+                                        Math.min(bufferSize - written, frameSize * kBatchFrames),
+                                        TEST_WRITE_MODE);
+                                // for non-blocking mode, this loop may spin quickly
+                                assertTrue(TEST_NAME + ": write error " + ret, ret >= 0);
+                                assertTrue(TEST_NAME + ": write timeout",
+                                        (System.currentTimeMillis() - startTime) <= maxDuration);
+                                written += ret;
+                            }
+
+                            // for streaming tracks, stop will allow the rest of the data to
+                            // drain out, but we don't know how long to wait unless
+                            // we check the position before stop. if we check position
+                            // after we stop, we read 0.
+                            final int position = track.getPlaybackHeadPosition();
+                            final int remainingTimeMs = (int)((double)(frameCount - position)
+                                    * 1000 / TEST_SR);
+                            track.stop();
+                            Thread.sleep(remainingTimeMs);
+                            // tear down
+                            track.release();
+                            // add a gap to make tones distinct
+                            Thread.sleep(100 /* millis */);
+                            frequency += 200; // increment test tone frequency
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     private boolean hasAudioOutput() {
         return getContext().getPackageManager()
             .hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
@@ -1676,9 +1895,10 @@
 
     public void testGetTimestamp() throws Exception {
         if (!hasAudioOutput()) {
+            Log.w(TAG,"AUDIO_OUTPUT feature not found. This system might not have a valid "
+                    + "audio output HAL");
             return;
         }
-        
         // constants for test
         final String TEST_NAME = "testGetTimestamp";
         final int TEST_SR = 22050;
@@ -1805,6 +2025,195 @@
         }
     }
 
+    public void testVariableRatePlayback() throws Exception {
+        final String TEST_NAME = "testVariableRatePlayback";
+        final int TEST_SR = 24000;
+        final int TEST_FINAL_SR = 96000;
+        final int TEST_CONF = AudioFormat.CHANNEL_OUT_MONO;
+        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_8BIT; // required for test
+        final int TEST_MODE = AudioTrack.MODE_STATIC; // required for test
+        final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+
+        final int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+        final int bufferSizeInBytes = minBuffSize * 100;
+        final int numChannels =  AudioFormat.channelCountFromOutChannelMask(TEST_CONF);
+        final int bytesPerSample = AudioFormat.getBytesPerSample(TEST_FORMAT);
+        final int bytesPerFrame = numChannels * bytesPerSample;
+        final int frameCount = bufferSizeInBytes / bytesPerFrame;
+
+        AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF,
+                TEST_FORMAT, bufferSizeInBytes, TEST_MODE);
+
+        // create byte array and write it
+        byte[] vai = AudioHelper.createSoundDataInByteArray(bufferSizeInBytes, TEST_SR,
+                600 /* frequency */, 0 /* sweep */);
+        assertEquals(vai.length, track.write(vai, 0 /* offsetInBytes */, vai.length));
+
+        // sweep up test and sweep down test
+        int[] sampleRates = {TEST_SR, TEST_FINAL_SR};
+        int[] deltaMss = {10, 10};
+        int[] deltaFreqs = {200, -200};
+
+        for (int i = 0; i < 2; ++i) {
+            int remainingTime;
+            int sampleRate = sampleRates[i];
+            final int deltaMs = deltaMss[i];
+            final int deltaFreq = deltaFreqs[i];
+            final int lastCheckMs = 500; // check the last 500 ms
+
+            assertEquals(TEST_NAME, AudioTrack.SUCCESS, track.setPlaybackRate(sampleRate));
+            track.play();
+            do {
+                Thread.sleep(deltaMs);
+                final int position = track.getPlaybackHeadPosition();
+                sampleRate += deltaFreq;
+                sampleRate = Math.min(TEST_FINAL_SR, Math.max(TEST_SR, sampleRate));
+                assertEquals(TEST_NAME, AudioTrack.SUCCESS, track.setPlaybackRate(sampleRate));
+                remainingTime = (int)((double)(frameCount - position) * 1000
+                        / sampleRate / bytesPerFrame);
+            } while (remainingTime >= lastCheckMs + deltaMs);
+
+            // ensure the final frequency set is constant and plays frames as expected
+            final int position1 = track.getPlaybackHeadPosition();
+            Thread.sleep(lastCheckMs);
+            final int position2 = track.getPlaybackHeadPosition();
+
+            final int tolerance60MsInFrames = sampleRate * 60 / 1000;
+            final int expected = lastCheckMs * sampleRate / 1000;
+            final int actual = position2 - position1;
+
+            // Log.d(TAG, "Variable Playback: expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (expected - actual) + ")");
+            assertEquals(expected, actual, tolerance60MsInFrames);
+            track.stop();
+        }
+        track.release();
+    }
+
+    public void testVariableSpeedPlayback() throws Exception {
+        final String TEST_NAME = "testVariableSpeedPlayback";
+        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_FLOAT; // required for test
+        final int TEST_MODE = AudioTrack.MODE_STATIC;           // required for test
+        final int TEST_SR = 48000;
+
+        AudioFormat format = new AudioFormat.Builder()
+                //.setChannelIndexMask((1 << 0))  // output to first channel, FL
+                .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
+                .setEncoding(TEST_FORMAT)
+                .setSampleRate(TEST_SR)
+                .build();
+
+        // create track
+        final int frameCount = AudioHelper.frameCountFromMsec(100 /*ms*/, format);
+        final int frameSize = AudioHelper.frameSizeFromFormat(format);
+        AudioTrack track = new AudioTrack.Builder()
+                .setAudioFormat(format)
+                .setBufferSizeInBytes(frameCount * frameSize)
+                .setTransferMode(TEST_MODE)
+                .build();
+
+        // create float array and write it
+        final int sampleCount = frameCount * format.getChannelCount();
+        float[] vaf = AudioHelper.createSoundDataInFloatArray(
+                sampleCount, TEST_SR, 600 /* frequency */, 0 /* sweep */);
+        assertEquals(vaf.length, track.write(vaf, 0 /* offsetInFloats */, vaf.length,
+                AudioTrack.WRITE_NON_BLOCKING));
+
+        // sweep speed and pitch
+        final float[][][] speedAndPitch = {
+             // { {speedStart, pitchStart} {speedEnd, pitchEnd} }
+                { {0.5f, 0.5f}, {2.0f, 2.0f} },  // speed by SR conversion (chirp)
+                { {0.5f, 1.0f}, {2.0f, 1.0f} },  // speed by time stretch (constant pitch)
+                { {1.0f, 0.5f}, {1.0f, 2.0f} },  // pitch by SR conversion (chirp)
+        };
+
+        // sanity test that playback params works as expected
+        PlaybackParams params = new PlaybackParams().allowDefaults();
+        assertEquals(TEST_NAME, 1.0f, params.getSpeed());
+        assertEquals(TEST_NAME, 1.0f, params.getPitch());
+        assertEquals(TEST_NAME,
+                params.AUDIO_FALLBACK_MODE_DEFAULT,
+                params.getAudioFallbackMode());
+        track.setPlaybackParams(params); // OK
+        params.setAudioFallbackMode(params.AUDIO_FALLBACK_MODE_FAIL);
+        assertEquals(TEST_NAME,
+                params.AUDIO_FALLBACK_MODE_FAIL, params.getAudioFallbackMode());
+        params.setPitch(0.0f);
+        try {
+            track.setPlaybackParams(params);
+            fail("IllegalArgumentException should be thrown on out of range data");
+        } catch (IllegalArgumentException e) {
+            ; // expect this is invalid
+        }
+        // on failure, the AudioTrack params should not change.
+        PlaybackParams paramCheck = track.getPlaybackParams();
+        assertEquals(TEST_NAME,
+                paramCheck.AUDIO_FALLBACK_MODE_DEFAULT, paramCheck.getAudioFallbackMode());
+        assertEquals(TEST_NAME,
+                1.0f, paramCheck.getPitch());
+
+        // now try to see if we can do extreme pitch correction that should probably be muted.
+        params.setAudioFallbackMode(params.AUDIO_FALLBACK_MODE_MUTE);
+        assertEquals(TEST_NAME,
+                params.AUDIO_FALLBACK_MODE_MUTE, params.getAudioFallbackMode());
+        params.setPitch(0.1f);
+        track.setPlaybackParams(params); // OK
+
+        // now do our actual playback
+        final int TEST_TIME_MS = 2000;
+        final int TEST_DELTA_MS = 100;
+        final int testSteps = TEST_TIME_MS / TEST_DELTA_MS;
+
+        for (int i = 0; i < speedAndPitch.length; ++i) {
+            final float speedStart = speedAndPitch[i][0][0];
+            final float pitchStart = speedAndPitch[i][0][1];
+            final float speedEnd = speedAndPitch[i][1][0];
+            final float pitchEnd = speedAndPitch[i][1][1];
+            final float speedInc = (speedEnd - speedStart) / testSteps;
+            final float pitchInc = (pitchEnd - pitchStart) / testSteps;
+
+            PlaybackParams playbackParams = new PlaybackParams()
+                    .setPitch(pitchStart)
+                    .setSpeed(speedStart)
+                    .allowDefaults();
+
+            // set track in infinite loop to be a sine generator
+            track.setLoopPoints(0, frameCount, -1 /* loopCount */); // cleared by stop()
+            track.play();
+
+            Thread.sleep(300 /* millis */); // warm up track
+
+            int anticipatedPosition = track.getPlaybackHeadPosition();
+            for (int j = 0; j < testSteps; ++j) {
+                // set playback settings
+                final float pitch = playbackParams.getPitch();
+                final float speed = playbackParams.getSpeed();
+
+                track.setPlaybackParams(playbackParams);
+
+                // verify that settings have changed
+                PlaybackParams checkParams = track.getPlaybackParams();
+                assertEquals(TAG, pitch, checkParams.getPitch());
+                assertEquals(TAG, speed, checkParams.getSpeed());
+
+                // sleep for playback
+                Thread.sleep(TEST_DELTA_MS);
+                // Log.d(TAG, "position[" + j + "] " + track.getPlaybackHeadPosition());
+                anticipatedPosition +=
+                        playbackParams.getSpeed() * TEST_DELTA_MS * TEST_SR / 1000;
+                playbackParams.setPitch(playbackParams.getPitch() + pitchInc);
+                playbackParams.setSpeed(playbackParams.getSpeed() + speedInc);
+            }
+            final int endPosition = track.getPlaybackHeadPosition();
+            final int tolerance100MsInFrames = 100 * TEST_SR / 1000;
+            assertEquals(TAG, anticipatedPosition, endPosition, tolerance100MsInFrames);
+            track.stop();
+
+            Thread.sleep(100 /* millis */); // distinct pause between each test
+        }
+        track.release();
+    }
+
 /* Do not run in JB-MR1. will be re-opened in the next platform release.
     public void testResourceLeakage() throws Exception {
         final int BUFFER_SIZE = 600 * 1024;
@@ -1828,6 +2237,7 @@
     }
 */
 
+    /* MockAudioTrack allows testing of protected getNativeFrameCount() and setState(). */
     private class MockAudioTrack extends AudioTrack {
 
         public MockAudioTrack(int streamType, int sampleRateInHz, int channelConfig,
diff --git a/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java b/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
index eb675fc..e059e36 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
@@ -16,25 +16,35 @@
 
 package android.media.cts;
 
+import java.util.ArrayList;
 
+import android.cts.util.CtsAndroidTestCase;
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioTrack;
 import android.media.AudioTrack.OnPlaybackPositionUpdateListener;
+import android.media.cts.AudioHelper;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.test.AndroidTestCase;
+import android.util.Log;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
 
-public class AudioTrack_ListenerTest extends AndroidTestCase {
-    private boolean mOnMarkerReachedCalled;
-    private boolean mOnPeriodicNotificationCalled;
+public class AudioTrack_ListenerTest extends CtsAndroidTestCase {
+    private final static String TAG = "AudioTrack_ListenerTest";
+    private final static int TEST_SR = 11025;
+    private final static int TEST_CONF = AudioFormat.CHANNEL_OUT_MONO;
+    private final static int TEST_FORMAT = AudioFormat.ENCODING_PCM_8BIT;
+    private final static int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+    private final static int TEST_LOOP_FACTOR = 2; // # loops (>= 1) for static tracks
+                                                   // simulated for streaming.
+    private final static int TEST_BUFFER_FACTOR = 25;
     private boolean mIsHandleMessageCalled;
-    private final int TEST_SR = 11025;
-    private final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO;
-    private final int TEST_FORMAT = AudioFormat.ENCODING_PCM_8BIT;
-    private final int TEST_MODE = AudioTrack.MODE_STREAM;
-    private final int TEST_STREAM_TYPE1 = AudioManager.STREAM_MUSIC;
+    private int mMarkerPeriodInFrames;
+    private int mMarkerPosition;
+    private int mFrameCount;
     private Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
@@ -42,180 +52,232 @@
             super.handleMessage(msg);
         }
     };
-    private final int mMinBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
-    private AudioTrack mAudioTrack;
-    private OnPlaybackPositionUpdateListener mListener =
-                                new MockOnPlaybackPositionUpdateListener();
-    private MakeSomethingAsynchronouslyAndLoop<AudioTrack> mMakeSomething;
-
-    @Override
-    protected void setUp() throws Exception
-    {
-        super.setUp();
-        if (mAudioTrack == null) {
-            mMakeSomething = new MakeSomethingAsynchronouslyAndLoop<AudioTrack>(
-                new MakesSomething<AudioTrack>() {
-                    @Override
-                    public AudioTrack makeSomething()
-                    {
-                        return new AudioTrack(TEST_STREAM_TYPE1, TEST_SR, TEST_CONF,
-                            TEST_FORMAT, 2 * mMinBuffSize, TEST_MODE);
-                    }
-                }
-            );
-            mAudioTrack = mMakeSomething.make();
-        }
-    }
 
     public void testAudioTrackCallback() throws Exception {
-        mAudioTrack.setPlaybackPositionUpdateListener(mListener);
-        doTest(false /*customHandler*/);
+        doTest("Streaming Local Looper", true /*localTrack*/, false /*customHandler*/,
+                30 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/, AudioTrack.MODE_STREAM);
     }
 
     public void testAudioTrackCallbackWithHandler() throws Exception {
-        mAudioTrack.setPlaybackPositionUpdateListener(mListener, mHandler);
-        doTest(true /*customHandler*/);
-        // ToBeFixed: Handler#handleMessage() is never called
-        // FIXME possibly because the new Handler() is missing the Looper parameter
+        // with 100 periods per second, trigger back-to-back notifications.
+        doTest("Streaming Private Handler", false /*localTrack*/, true /*customHandler*/,
+                100 /*periodsPerSecond*/, 10 /*markerPeriodsPerSecond*/, AudioTrack.MODE_STREAM);
+        // verify mHandler is used only for accessing its associated Looper
         assertFalse(mIsHandleMessageCalled);
     }
 
-    private void doTest(boolean customHandler) throws Exception {
-        mOnMarkerReachedCalled = false;
-        mOnPeriodicNotificationCalled = false;
-        byte[] vai = AudioTrackTest.createSoundDataInByteArray(2 * mMinBuffSize, TEST_SR, 1024);
-        int markerInFrames = vai.length / 4;
-        assertEquals(AudioTrack.SUCCESS, mAudioTrack.setNotificationMarkerPosition(markerInFrames));
-        int periodInFrames = vai.length / 2;
-        assertEquals(AudioTrack.SUCCESS, mAudioTrack.setPositionNotificationPeriod(periodInFrames));
-
-        boolean hasPlayed = false;
-        int written = 0;
-        while (written < vai.length) {
-            written += mAudioTrack.write(vai, written, vai.length - written);
-            if (!hasPlayed) {
-                mAudioTrack.play();
-                hasPlayed = true;
-            }
-        }
-
-        final int numChannels = (TEST_CONF == AudioFormat.CHANNEL_CONFIGURATION_STEREO) ? 2 : 1;
-        final int bytesPerSample = (TEST_FORMAT == AudioFormat.ENCODING_PCM_16BIT) ? 2 : 1;
-        final int bytesPerFrame = numChannels * bytesPerSample;
-        final int sampleLengthMs = (int)(1000 * ((float)vai.length / TEST_SR / bytesPerFrame));
-        Thread.sleep(sampleLengthMs + 1000);
-        if (!customHandler) {
-            assertTrue(mOnMarkerReachedCalled);
-            assertTrue(mOnPeriodicNotificationCalled);
-        }
-        mAudioTrack.stop();
+    public void testStaticAudioTrackCallback() throws Exception {
+        doTest("Static", false /*localTrack*/, false /*customHandler*/,
+                100 /*periodsPerSecond*/, 10 /*markerPeriodsPerSecond*/, AudioTrack.MODE_STATIC);
     }
 
-    // lightweight java.util.concurrent.Future*
-    private static class FutureLatch<T>
-    {
-        private T mValue;
-        private boolean mSet;
-        public void set(T value)
-        {
-            synchronized (this) {
-                assert !mSet;
-                mValue = value;
-                mSet = true;
-                notify();
-            }
+    public void testStaticAudioTrackCallbackWithHandler() throws Exception {
+        doTest("Static Private Handler", false /*localTrack*/, true /*customHandler*/,
+                30 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/, AudioTrack.MODE_STATIC);
+        // verify mHandler is used only for accessing its associated Looper
+        assertFalse(mIsHandleMessageCalled);
+    }
+
+    private void doTest(String reportName, boolean localTrack, boolean customHandler,
+            int periodsPerSecond, int markerPeriodsPerSecond, final int mode) throws Exception {
+        mIsHandleMessageCalled = false;
+        final int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+        final int bufferSizeInBytes;
+        if (mode == AudioTrack.MODE_STATIC && TEST_LOOP_FACTOR > 1) {
+            // use setLoopPoints for static mode
+            bufferSizeInBytes = minBuffSize * TEST_BUFFER_FACTOR;
+            mFrameCount = bufferSizeInBytes * TEST_LOOP_FACTOR;
+        } else {
+            bufferSizeInBytes = minBuffSize * TEST_BUFFER_FACTOR * TEST_LOOP_FACTOR;
+            mFrameCount = bufferSizeInBytes;
         }
-        public T get()
-        {
-            T value;
-            synchronized (this) {
-                while (!mSet) {
-                    try {
-                        wait();
-                    } catch (InterruptedException e) {
-                        ;
+
+        final AudioTrack track;
+        final AudioHelper.MakeSomethingAsynchronouslyAndLoop<AudioTrack> makeSomething;
+        if (localTrack) {
+            makeSomething = null;
+            track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF,
+                    TEST_FORMAT, bufferSizeInBytes, mode);
+        } else {
+            makeSomething =
+                    new AudioHelper.MakeSomethingAsynchronouslyAndLoop<AudioTrack>(
+                    new AudioHelper.MakesSomething<AudioTrack>() {
+                        @Override
+                        public AudioTrack makeSomething() {
+                            return new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF,
+                                TEST_FORMAT, bufferSizeInBytes, mode);
+                        }
                     }
-                }
-                value = mValue;
-            }
-            return value;
+                );
+           // create audiotrack on different thread's looper.
+           track = makeSomething.make();
         }
-    }
-
-    // represents a factory for T
-    private interface MakesSomething<T>
-    {
-        T makeSomething();
-    }
-
-    // used to construct an object in the context of an asynchronous thread with looper
-    private static class MakeSomethingAsynchronouslyAndLoop<T>
-    {
-        private Thread mThread;
-        volatile private Looper mLooper;
-        private final MakesSomething<T> mWhatToMake;
-
-        public MakeSomethingAsynchronouslyAndLoop(MakesSomething<T> whatToMake)
-        {
-            assert whatToMake != null;
-            mWhatToMake = whatToMake;
+        final MockOnPlaybackPositionUpdateListener listener;
+        if (customHandler) {
+            listener = new MockOnPlaybackPositionUpdateListener(track, mHandler);
+        } else {
+            listener = new MockOnPlaybackPositionUpdateListener(track);
         }
 
-        public T make()
-        {
-            final FutureLatch<T> futureLatch = new FutureLatch<T>();
-            mThread = new Thread()
-            {
-                @Override
-                public void run()
-                {
-                    Looper.prepare();
-                    mLooper = Looper.myLooper();
-                    T something = mWhatToMake.makeSomething();
-                    futureLatch.set(something);
-                    Looper.loop();
-                }
-            };
-            mThread.start();
-            return futureLatch.get();
+        byte[] vai = AudioHelper.createSoundDataInByteArray(
+                bufferSizeInBytes, TEST_SR, 1024 /* frequency */, 0 /* sweep */);
+        int markerPeriods = Math.max(3, mFrameCount * markerPeriodsPerSecond / TEST_SR);
+        mMarkerPeriodInFrames = mFrameCount / markerPeriods;
+        markerPeriods = mFrameCount / mMarkerPeriodInFrames; // recalculate due to round-down
+        mMarkerPosition = mMarkerPeriodInFrames;
+
+        // check that we can get and set notification marker position
+        assertEquals(0, track.getNotificationMarkerPosition());
+        assertEquals(AudioTrack.SUCCESS,
+                track.setNotificationMarkerPosition(mMarkerPosition));
+        assertEquals(mMarkerPosition, track.getNotificationMarkerPosition());
+
+        int updatePeriods = Math.max(3, mFrameCount * periodsPerSecond / TEST_SR);
+        final int updatePeriodInFrames = mFrameCount / updatePeriods;
+        updatePeriods = mFrameCount / updatePeriodInFrames; // recalculate due to round-down
+
+        // we set the notification period before running for better period positional accuracy.
+        // check that we can get and set notification periods
+        assertEquals(0, track.getPositionNotificationPeriod());
+        assertEquals(AudioTrack.SUCCESS,
+                track.setPositionNotificationPeriod(updatePeriodInFrames));
+        assertEquals(updatePeriodInFrames, track.getPositionNotificationPeriod());
+
+        if (mode == AudioTrack.MODE_STATIC && TEST_LOOP_FACTOR > 1) {
+            track.setLoopPoints(0, vai.length, TEST_LOOP_FACTOR - 1);
         }
-        public void join()
-        {
-            mLooper.quit();
-            try {
-                mThread.join();
-            } catch (InterruptedException e) {
-                ;
-            }
-            // avoid dangling references
-            mLooper = null;
-            mThread = null;
+        // write data with single blocking write, then play.
+        assertEquals(vai.length, track.write(vai, 0 /* offsetInBytes */, vai.length));
+        track.play();
+
+        // sleep until track completes playback - it must complete within 1 second
+        // of the expected length otherwise the periodic test should fail.
+        final int numChannels =  AudioFormat.channelCountFromOutChannelMask(TEST_CONF);
+        final int bytesPerSample = AudioFormat.getBytesPerSample(TEST_FORMAT);
+        final int bytesPerFrame = numChannels * bytesPerSample;
+        final int trackLengthMs = (int)((double)mFrameCount * 1000 / TEST_SR / bytesPerFrame);
+        Thread.sleep(trackLengthMs + 1000);
+
+        // stop listening - we should be done.
+        listener.stop();
+
+        // Beware: stop() resets the playback head position for both static and streaming
+        // audio tracks, so stop() cannot be called while we're still logging playback
+        // head positions. We could recycle the track after stop(), which isn't done here.
+        track.stop();
+
+        // clean up
+        if (makeSomething != null) {
+            makeSomething.join();
         }
+        listener.release();
+        track.release();
+
+        // collect statistics
+        final ArrayList<Integer> markerList = listener.getMarkerList();
+        final ArrayList<Integer> periodicList = listener.getPeriodicList();
+        // verify count of markers and periodic notifications.
+        assertEquals(markerPeriods, markerList.size());
+        assertEquals(updatePeriods, periodicList.size());
+        // verify actual playback head positions returned.
+        // the max diff should really be around 24 ms,
+        // but system load and stability will affect this test;
+        // we use 80ms limit here for failure.
+        final int tolerance80MsInFrames = TEST_SR * 80 / 1000;
+
+        AudioHelper.Statistics markerStat = new AudioHelper.Statistics();
+        for (int i = 0; i < markerPeriods; ++i) {
+            final int expected = mMarkerPeriodInFrames * (i + 1);
+            final int actual = markerList.get(i);
+            // Log.d(TAG, "Marker: expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (actual - expected) + ")");
+            assertEquals(expected, actual, tolerance80MsInFrames);
+            markerStat.add((double)(actual - expected) * 1000 / TEST_SR);
+        }
+
+        AudioHelper.Statistics periodicStat = new AudioHelper.Statistics();
+        for (int i = 0; i < updatePeriods; ++i) {
+            final int expected = updatePeriodInFrames * (i + 1);
+            final int actual = periodicList.get(i);
+            // Log.d(TAG, "Update: expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (actual - expected) + ")");
+            assertEquals(expected, actual, tolerance80MsInFrames);
+            periodicStat.add((double)(actual - expected) * 1000 / TEST_SR);
+        }
+
+        // report this
+        ReportLog log = getReportLog();
+        log.printValue(reportName + ": Average Marker diff", markerStat.getAvg(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Maximum Marker abs diff", markerStat.getMaxAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Marker abs diff", markerStat.getAvgAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Periodic diff", periodicStat.getAvg(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Maximum Periodic abs diff", periodicStat.getMaxAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Periodic abs diff", periodicStat.getAvgAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printSummary(reportName + ": Unified abs diff",
+                (periodicStat.getAvgAbs() + markerStat.getAvgAbs()) / 2,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
     }
 
     private class MockOnPlaybackPositionUpdateListener
                                         implements OnPlaybackPositionUpdateListener {
-
-        public void onMarkerReached(AudioTrack track) {
-            mOnMarkerReachedCalled = true;
+        public MockOnPlaybackPositionUpdateListener(AudioTrack track) {
+            mAudioTrack = track;
+            track.setPlaybackPositionUpdateListener(this);
         }
 
-        public void onPeriodicNotification(AudioTrack track) {
-            mOnPeriodicNotificationCalled = true;
+        public MockOnPlaybackPositionUpdateListener(AudioTrack track, Handler handler) {
+            mAudioTrack = track;
+            track.setPlaybackPositionUpdateListener(this, handler);
         }
 
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        if (mMakeSomething != null) {
-            mMakeSomething.join();
+        public synchronized void onMarkerReached(AudioTrack track) {
+            if (mIsTestActive) {
+                int position = mAudioTrack.getPlaybackHeadPosition();
+                mOnMarkerReachedCalled.add(position);
+                mMarkerPosition += mMarkerPeriodInFrames;
+                if (mMarkerPosition <= mFrameCount) {
+                    assertEquals(AudioTrack.SUCCESS,
+                            mAudioTrack.setNotificationMarkerPosition(mMarkerPosition));
+                }
+            } else {
+                fail("onMarkerReached called when not active");
+            }
         }
-        if (mAudioTrack != null) {
-            mAudioTrack.release();
+
+        public synchronized void onPeriodicNotification(AudioTrack track) {
+            if (mIsTestActive) {
+                mOnPeriodicNotificationCalled.add(mAudioTrack.getPlaybackHeadPosition());
+            } else {
+                fail("onPeriodicNotification called when not active");
+            }
+        }
+
+        public synchronized void stop() {
+            mIsTestActive = false;
+        }
+
+        public ArrayList<Integer> getMarkerList() {
+            return mOnMarkerReachedCalled;
+        }
+
+        public ArrayList<Integer> getPeriodicList() {
+            return mOnPeriodicNotificationCalled;
+        }
+
+        public synchronized void release() {
+            mAudioTrack.setPlaybackPositionUpdateListener(null);
             mAudioTrack = null;
         }
-        super.tearDown();
-    }
 
+        private boolean mIsTestActive = true;
+        private AudioTrack mAudioTrack;
+        private ArrayList<Integer> mOnMarkerReachedCalled = new ArrayList<Integer>();
+        private ArrayList<Integer> mOnPeriodicNotificationCalled = new ArrayList<Integer>();
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java b/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
index c837d0a..02276bc 100644
--- a/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
+++ b/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
@@ -320,9 +320,6 @@
      * Tests clear key system playback.
      */
     public void testClearKeyPlayback() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
 
         MediaDrm drm = startDrm();
         if (null == drm) {
diff --git a/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java b/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
index b6c94c1..40934f5 100644
--- a/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
@@ -209,15 +209,32 @@
      */
     public void testEncodeDecodeVideoFromSurfaceToSurfaceQCIF() throws Throwable {
         setParameters(176, 144, 1000000, MIME_TYPE_AVC, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
     }
     public void testEncodeDecodeVideoFromSurfaceToSurfaceQVGA() throws Throwable {
         setParameters(320, 240, 2000000, MIME_TYPE_AVC, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
     }
     public void testEncodeDecodeVideoFromSurfaceToSurface720p() throws Throwable {
         setParameters(1280, 720, 6000000, MIME_TYPE_AVC, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
+    }
+
+    /**
+     * Tests streaming of AVC video through the encoder and decoder.  Data is provided through
+     * a PersistentSurface and decoded onto a Surface.  The output is checked for validity.
+     */
+    public void testEncodeDecodeVideoFromPersistentSurfaceToSurfaceQCIF() throws Throwable {
+        setParameters(176, 144, 1000000, MIME_TYPE_AVC, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
+    }
+    public void testEncodeDecodeVideoFromPersistentSurfaceToSurfaceQVGA() throws Throwable {
+        setParameters(320, 240, 2000000, MIME_TYPE_AVC, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
+    }
+    public void testEncodeDecodeVideoFromPersistentSurfaceToSurface720p() throws Throwable {
+        setParameters(1280, 720, 6000000, MIME_TYPE_AVC, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
     }
 
     /**
@@ -226,40 +243,77 @@
      */
     public void testVP8EncodeDecodeVideoFromSurfaceToSurfaceQCIF() throws Throwable {
         setParameters(176, 144, 1000000, MIME_TYPE_VP8, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
     }
     public void testVP8EncodeDecodeVideoFromSurfaceToSurfaceQVGA() throws Throwable {
         setParameters(320, 240, 2000000, MIME_TYPE_VP8, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
     }
     public void testVP8EncodeDecodeVideoFromSurfaceToSurface720p() throws Throwable {
         setParameters(1280, 720, 6000000, MIME_TYPE_VP8, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
+    }
+
+    /**
+     * Tests streaming of VP8 video through the encoder and decoder.  Data is provided through
+     * a PersistentSurface and decoded onto a Surface.  The output is checked for validity.
+     */
+    public void testVP8EncodeDecodeVideoFromPersistentSurfaceToSurfaceQCIF() throws Throwable {
+        setParameters(176, 144, 1000000, MIME_TYPE_VP8, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
+    }
+    public void testVP8EncodeDecodeVideoFromPersistentSurfaceToSurfaceQVGA() throws Throwable {
+        setParameters(320, 240, 2000000, MIME_TYPE_VP8, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
+    }
+    public void testVP8EncodeDecodeVideoFromPersistentSurfaceToSurface720p() throws Throwable {
+        setParameters(1280, 720, 6000000, MIME_TYPE_VP8, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
     }
 
     /** Wraps testEncodeDecodeVideoFromSurfaceToSurface() */
     private static class SurfaceToSurfaceWrapper implements Runnable {
         private Throwable mThrowable;
         private EncodeDecodeTest mTest;
+        private boolean mUsePersistentInput;
 
-        private SurfaceToSurfaceWrapper(EncodeDecodeTest test) {
+        private SurfaceToSurfaceWrapper(EncodeDecodeTest test, boolean persistent) {
             mTest = test;
+            mUsePersistentInput = persistent;
         }
 
         @Override
         public void run() {
+            InputSurface inputSurface = null;
             try {
-                mTest.encodeDecodeVideoFromSurfaceToSurface();
+                if (!mUsePersistentInput) {
+                    mTest.encodeDecodeVideoFromSurfaceToSurface(null);
+                } else {
+                    Log.d(TAG, "creating persistent surface");
+                    inputSurface = new InputSurface(
+                            MediaCodec.createPersistentInputSurface());
+
+                    for (int i = 0; i < 3; i++) {
+                        Log.d(TAG, "test persistent surface - round " + i);
+                        mTest.encodeDecodeVideoFromSurfaceToSurface(inputSurface);
+                    }
+                }
             } catch (Throwable th) {
                 mThrowable = th;
+            } finally {
+                if (inputSurface != null) {
+                    inputSurface.release();
+                }
             }
         }
 
         /**
          * Entry point.
          */
-        public static void runTest(EncodeDecodeTest obj) throws Throwable {
-            SurfaceToSurfaceWrapper wrapper = new SurfaceToSurfaceWrapper(obj);
+        public static void runTest(EncodeDecodeTest obj, boolean persisent)
+                throws Throwable {
+            SurfaceToSurfaceWrapper wrapper =
+                    new SurfaceToSurfaceWrapper(obj, persisent);
             Thread th = new Thread(wrapper, "codec test");
             th.start();
             th.join();
@@ -357,10 +411,10 @@
      * We encode several frames of a video test pattern using MediaCodec, then decode the
      * output with MediaCodec and do some simple checks.
      */
-    private void encodeDecodeVideoFromSurfaceToSurface() throws Exception {
+    private void encodeDecodeVideoFromSurfaceToSurface(InputSurface inSurf) throws Exception {
         MediaCodec encoder = null;
         MediaCodec decoder = null;
-        InputSurface inputSurface = null;
+        InputSurface inputSurface = inSurf;
         OutputSurface outputSurface = null;
 
         mLargestColorDelta = -1;
@@ -402,13 +456,19 @@
             // our desired properties.  Request a Surface to use for input.
             encoder = MediaCodec.createByCodecName(codec);
             encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
-            inputSurface = new InputSurface(encoder.createInputSurface());
+            if (inSurf != null) {
+                Log.d(TAG, "using persistent surface");
+                encoder.setInputSurface(inputSurface.getSurface());
+                inputSurface.updateSize(mWidth, mHeight);
+            } else {
+                inputSurface = new InputSurface(encoder.createInputSurface());
+            }
             encoder.start();
 
             doEncodeDecodeVideoFromSurfaceToSurface(encoder, inputSurface, decoder, outputSurface);
         } finally {
             if (VERBOSE) Log.d(TAG, "releasing codecs");
-            if (inputSurface != null) {
+            if (inSurf == null && inputSurface != null) {
                 inputSurface.release();
             }
             if (outputSurface != null) {
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
index 014c1a5..2320990 100644
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
@@ -802,12 +802,15 @@
             if (mTopPresentation != null) {
                 mTopPresentation.dismissPresentation();
                 mTopPresentation.destroyVirtualDisplay();
+                mTopPresentation = null;
             }
             if (mTopWindow != null) {
                 mTopWindow.cleanup();
+                mTopWindow = null;
             }
             if (mEglHelper != null) {
                 mEglHelper.release();
+                mEglHelper = null;
             }
         }
 
diff --git a/tests/tests/media/src/android/media/cts/EnumDevicesTest.java b/tests/tests/media/src/android/media/cts/EnumDevicesTest.java
new file mode 100644
index 0000000..f513709
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/EnumDevicesTest.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import android.test.AndroidTestCase;
+
+/**
+ * TODO: Insert description here. (generated by pmclean)
+ */
+public class EnumDevicesTest extends AndroidTestCase {
+    private AudioManager mAudioManager;
+
+    boolean mAddCallbackCalled = false;
+    boolean mRemoveCallbackCalled = false;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // get the AudioManager
+        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        assertNotNull(mAudioManager);
+    }
+
+    public void test_getDevices() {
+        AudioDeviceInfo[] deviceList;
+
+        // test an empty flags set
+        deviceList = mAudioManager.getDevices(0);
+        assertTrue(deviceList != null);
+        assertTrue(deviceList.length == 0);
+
+        int numOutputDevices = 0;
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) {
+            // test OUTPUTS
+            deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
+            assertTrue(deviceList != null);
+            numOutputDevices = deviceList.length;
+            assertTrue(numOutputDevices != 0);
+
+            // all should be "sinks"
+            for(int index = 0; index < numOutputDevices; index++) {
+                assertTrue(deviceList[index].isSink());
+            }
+        }
+
+        int numInputDevices = 0;
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            // test INPUTS
+            deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
+            assertTrue(deviceList != null);
+            numInputDevices = deviceList.length;
+            assertTrue(numInputDevices != 0);
+
+            // all should be "sources"
+            for(int index = 0; index < numInputDevices; index++) {
+                assertTrue(deviceList[index].isSource());
+            }
+        }
+
+        // INPUTS & OUTPUTS
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT) &&
+                mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_ALL);
+            assertTrue(deviceList.length == (numOutputDevices + numInputDevices));
+        }
+    }
+
+    public void test_devicesInfoFields() {
+        AudioDeviceInfo[] deviceList;
+        deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_ALL);
+        for (int index = 0; index < deviceList.length; index++) {
+            AudioDeviceInfo deviceInfo = deviceList[index];
+
+            // we don't say anything about the returned value.
+            int id = deviceInfo.getId();
+
+            // Product Name
+            CharSequence productName = deviceInfo.getProductName();
+            assertNotNull(productName);
+            assertTrue(productName.length() != 0);
+
+            // Address
+            String address = deviceInfo.getAddress();
+            assertNotNull(address);
+            // address may be empty
+
+            // isSource() XOR isSink()
+            assertTrue(deviceInfo.isSource() != deviceInfo.isSink());
+
+            // Sample Rates
+            int[] sampleRates = deviceInfo.getSampleRates();
+            assertNotNull(sampleRates);
+            // "analog" devices won't list any sample rates
+
+            // Channel Masks
+            int[] channelMasks = deviceInfo.getChannelMasks();
+            assertNotNull(channelMasks);
+            // "analog" devices won't list any channel masks
+
+            // Channel Index Masks
+            int[] indexMasks = deviceInfo.getChannelIndexMasks();
+            assertNotNull(channelMasks);
+
+            // Channel Counts
+            int[] channelCounts = deviceInfo.getChannelCounts();
+            assertNotNull(channelCounts);
+            // "analog" devices won't list any channel Counts
+
+            // Encodings
+            int[] encodings = deviceInfo.getEncodings();
+            assertNotNull(encodings);
+            // "analog" devices won't list any encodings
+
+            int type = deviceInfo.getType();
+            assert(type > AudioDeviceInfo.TYPE_UNKNOWN);
+        }
+    }
+
+    private class EmptyDeviceCallback extends AudioDeviceCallback {
+        public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
+            mAddCallbackCalled = true;
+        }
+
+        public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
+            mRemoveCallbackCalled = true;
+        }
+    }
+
+    /*
+     * tests if the Looper for the current thread has been prepared,
+     * If not, it makes one, prepares it and returns it.
+     * If this returns non-null, the caller is reponsible for calling quit()
+     * on the returned Looper.
+     */
+    private Looper prepareIfNeededLooper() {
+        // non-null Handler
+        Looper myLooper = null;
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+            myLooper = Looper.myLooper();
+            assertNotNull(myLooper);
+        }
+        return myLooper;
+    }
+    
+    public void test_deviceCallback() {
+        // null callback?
+        mAudioManager.registerAudioDeviceCallback(null,null);
+
+        AudioDeviceCallback callback =  new EmptyDeviceCallback();
+        AudioDeviceCallback someOtherCallback =  new EmptyDeviceCallback();
+        // null Handler
+        mAudioManager.registerAudioDeviceCallback(callback, null);
+
+        // unregister null callback
+        mAudioManager.unregisterAudioDeviceCallback(null);
+        // unregister callback not registered
+        mAudioManager.unregisterAudioDeviceCallback(someOtherCallback);
+        // nominal case
+        mAudioManager.unregisterAudioDeviceCallback(callback);
+        // remove twice
+        mAudioManager.unregisterAudioDeviceCallback(callback);
+
+        Looper myLooper = prepareIfNeededLooper();
+        
+        mAudioManager.registerAudioDeviceCallback(callback, new Handler());
+        // unregister null callback
+        mAudioManager.unregisterAudioDeviceCallback(null);
+        // unregister callback not registered
+        mAudioManager.unregisterAudioDeviceCallback(someOtherCallback);
+        // nominal case
+        mAudioManager.unregisterAudioDeviceCallback(callback);
+        // remove twice
+        mAudioManager.unregisterAudioDeviceCallback(callback);
+
+        if (myLooper != null) {
+            myLooper.quit();
+        }
+    }
+
+    //TODO - Need tests for device connect/disconnect callbacks
+}
diff --git a/tests/tests/media/src/android/media/cts/EqualizerTest.java b/tests/tests/media/src/android/media/cts/EqualizerTest.java
index 15f0c73..f07c99e 100644
--- a/tests/tests/media/src/android/media/cts/EqualizerTest.java
+++ b/tests/tests/media/src/android/media/cts/EqualizerTest.java
@@ -49,9 +49,6 @@
 
     //Test case 0.0: test constructor and release
     public void test0_0ConstructorAndRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         Equalizer eq = null;
         try {
             eq = new Equalizer(0, 0);
@@ -78,9 +75,6 @@
 
     //Test case 1.0: test setBandLevel() and getBandLevel()
     public void test1_0BandLevel() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             short numBands = mEqualizer.getNumberOfBands();
@@ -110,9 +104,6 @@
 
     //Test case 1.1: test band frequency
     public void test1_1BandFrequency() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             short band = mEqualizer.getBand(TEST_FREQUENCY_MILLIHERTZ);
@@ -138,9 +129,6 @@
 
     //Test case 1.2: test presets
     public void test1_2Presets() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             short numPresets = mEqualizer.getNumberOfPresets();
@@ -166,9 +154,6 @@
 
     //Test case 1.3: test properties
     public void test1_3Properties() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             Equalizer.Settings settings = mEqualizer.getProperties();
@@ -200,9 +185,6 @@
 
     //Test case 1.4: test setBandLevel() throws exception after release
     public void test1_4SetBandLevelAfterRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         mEqualizer.release();
         try {
@@ -220,9 +202,6 @@
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
     public void test2_0SetEnabledGetEnabled() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             mEqualizer.setEnabled(true);
@@ -239,9 +218,6 @@
 
     //Test case 2.1: test setEnabled() throws exception after release
     public void test2_1SetEnabledAfterRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         mEqualizer.release();
         try {
@@ -259,9 +235,6 @@
 
     //Test case 3.0: test control status listener
     public void test3_0ControlStatusListener() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         synchronized(mLock) {
             mHasControl = true;
             mInitialized = false;
@@ -284,9 +257,6 @@
 
     //Test case 3.1: test enable status listener
     public void test3_1EnableStatusListener() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         synchronized(mLock) {
             mInitialized = false;
             createListenerLooper(false, true, false);
@@ -311,9 +281,6 @@
 
     //Test case 3.2: test parameter changed listener
     public void test3_2ParameterChangedListener() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         synchronized(mLock) {
             mInitialized = false;
             createListenerLooper(false, false, true);
diff --git a/tests/tests/media/src/android/media/cts/InputSurface.java b/tests/tests/media/src/android/media/cts/InputSurface.java
index 157ed88..37ca423 100644
--- a/tests/tests/media/src/android/media/cts/InputSurface.java
+++ b/tests/tests/media/src/android/media/cts/InputSurface.java
@@ -41,8 +41,11 @@
     private EGLDisplay mEGLDisplay = EGL14.EGL_NO_DISPLAY;
     private EGLContext mEGLContext = EGL14.EGL_NO_CONTEXT;
     private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;
+    private EGLConfig[] mConfigs = new EGLConfig[1];
 
     private Surface mSurface;
+    private int mWidth;
+    private int mHeight;
 
     /**
      * Creates an InputSurface from a Surface.
@@ -80,9 +83,8 @@
                 EGL_RECORDABLE_ANDROID, 1,
                 EGL14.EGL_NONE
         };
-        EGLConfig[] configs = new EGLConfig[1];
         int[] numConfigs = new int[1];
-        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
+        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, mConfigs, 0, mConfigs.length,
                 numConfigs, 0)) {
             throw new RuntimeException("unable to find RGB888+recordable ES2 EGL config");
         }
@@ -92,7 +94,7 @@
                 EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
                 EGL14.EGL_NONE
         };
-        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT,
+        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, mConfigs[0], EGL14.EGL_NO_CONTEXT,
                 attrib_list, 0);
         checkEglError("eglCreateContext");
         if (mEGLContext == null) {
@@ -100,17 +102,40 @@
         }
 
         // Create a window surface, and attach it to the Surface we received.
+        createEGLSurface();
+
+        mWidth = getWidth();
+        mHeight = getHeight();
+    }
+
+    public void updateSize(int width, int height) {
+        if (width != mWidth || height != mHeight) {
+            Log.d(TAG, "re-create EGLSurface");
+            releaseEGLSurface();
+            createEGLSurface();
+            mWidth = getWidth();
+            mHeight = getHeight();
+        }
+    }
+
+    private void createEGLSurface() {
+        //EGLConfig[] configs = new EGLConfig[1];
         int[] surfaceAttribs = {
                 EGL14.EGL_NONE
         };
-        mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, configs[0], mSurface,
+        mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, mConfigs[0], mSurface,
                 surfaceAttribs, 0);
         checkEglError("eglCreateWindowSurface");
         if (mEGLSurface == null) {
             throw new RuntimeException("surface was null");
         }
     }
-
+    private void releaseEGLSurface() {
+        if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+            EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+            mEGLSurface = EGL14.EGL_NO_SURFACE;
+        }
+    }
     /**
      * Discard all resources held by this class, notably the EGL context.  Also releases the
      * Surface that was passed to our constructor.
diff --git a/tests/tests/media/src/android/media/cts/LoudnessEnhancerTest.java b/tests/tests/media/src/android/media/cts/LoudnessEnhancerTest.java
index be5099e..c19102b 100644
--- a/tests/tests/media/src/android/media/cts/LoudnessEnhancerTest.java
+++ b/tests/tests/media/src/android/media/cts/LoudnessEnhancerTest.java
@@ -43,9 +43,6 @@
 
     //Test case 0.0: test constructor and release
     public void test0_0ConstructorAndRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
         assertNotNull("null AudioManager", am);
         getLoudnessEnhancer(0);
@@ -63,9 +60,6 @@
 
     //Test case 1.0: test set/get target gain
     public void test1_0TargetGain() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getLoudnessEnhancer(0);
         try {
             mLE.setTargetGain(0);
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
index 159d13f..daf55a7 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -39,6 +39,7 @@
 import java.util.HashSet;
 import java.util.Set;
 import java.util.Arrays;
+import java.util.Vector;
 
 /**
  * Basic sanity test of data returned by MediaCodeCapabilities.
@@ -528,4 +529,84 @@
             MediaUtils.skipTest("no non-tunneled/non-secure video decoders found");
         }
     }
+
+    private static MediaFormat createMinFormat(String mime, VideoCapabilities vcaps, int color) {
+        int minWidth = vcaps.getSupportedWidths().getLower();
+        int minHeight = vcaps.getSupportedHeightsFor(minWidth).getLower();
+        int minBitrate = vcaps.getBitrateRange().getLower();
+
+        MediaFormat format = MediaFormat.createVideoFormat(mime, minWidth, minHeight);
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, color);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, minBitrate);
+        format.setInteger(MediaFormat.KEY_FRAME_RATE, 10);
+        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10);
+        return format;
+    }
+
+    private static int getActualMax(
+            boolean isEncoder, String name, String mime, CodecCapabilities caps, int max) {
+        int flag = isEncoder ? MediaCodec.CONFIGURE_FLAG_ENCODE : 0;
+        MediaFormat format =
+                createMinFormat(mime, caps.getVideoCapabilities(), caps.colorFormats[0]);
+        Vector<MediaCodec> codecs = new Vector<MediaCodec>();
+        for (int i = 0; i < max; ++i) {
+            try {
+                Log.d(TAG, "Create codec " + name + " #" + i);
+                MediaCodec codec = MediaCodec.createByCodecName(name);
+                codec.configure(format, null, null, flag);
+                codec.start();
+                codecs.add(codec);
+            } catch (IllegalArgumentException e) {
+                fail("Got unexpected IllegalArgumentException " + e.getMessage());
+            } catch (IOException e) {
+                fail("Got unexpected IOException " + e.getMessage());
+            } catch (MediaCodec.CodecException e) {
+                // ERROR_INSUFFICIENT_RESOURCE is expected as the test keep creating codecs.
+                // But other exception should be treated as failure.
+                if (e.getErrorCode() == MediaCodec.CodecException.ERROR_INSUFFICIENT_RESOURCE) {
+                    Log.d(TAG, "Got CodecException with ERROR_INSUFFICIENT_RESOURCE.");
+                    break;
+                } else {
+                    fail("Unexpected CodecException " + e.getDiagnosticInfo());
+                }
+            }
+        }
+        int actualMax = codecs.size();
+        for (int i = 0; i < codecs.size(); ++i) {
+            codecs.get(i).release();
+        }
+        return actualMax;
+    }
+
+    private static boolean shouldTestActual(CodecCapabilities caps) {
+        if (caps.getVideoCapabilities() == null) {
+            // TODO: test audio codecs.
+            return false;
+        }
+        return true;
+    }
+
+    public void testGetMaxSupportedInstances() {
+        MediaCodecList allCodecs = new MediaCodecList(MediaCodecList.ALL_CODECS);
+        for (MediaCodecInfo info : allCodecs.getCodecInfos()) {
+            Log.d(TAG, "codec: " + info.getName());
+            Log.d(TAG, "  isEncoder = " + info.isEncoder());
+
+            String[] types = info.getSupportedTypes();
+            for (int j = 0; j < types.length; ++j) {
+                Log.d(TAG, "calling getCapabilitiesForType " + types[j]);
+                CodecCapabilities caps = info.getCapabilitiesForType(types[j]);
+                int max = caps.getMaxSupportedInstances();
+                Log.d(TAG, "getMaxSupportedInstances returns " + max);
+                assertTrue(max > 0);
+
+                if (shouldTestActual(caps)) {
+                    int actualMax = getActualMax(
+                            info.isEncoder(), info.getName(), types[j], caps, max + 1);
+                    Log.d(TAG, "actualMax " + actualMax + " vs reported max " + max);
+                    assertTrue(actualMax >= (int)(max * 0.9));
+                }
+            }
+        }
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCencPlayer.java b/tests/tests/media/src/android/media/cts/MediaCodecCencPlayer.java
index b96d38c..2473078 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCencPlayer.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCencPlayer.java
@@ -248,12 +248,14 @@
 
         if (null == mCrypto && (mEncryptedVideo || mEncryptedAudio)) {
             try {
-                mCrypto = new MediaCrypto(CLEARKEY_SCHEME_UUID, mSessionId);
+                byte[] initData = new byte[0];
+                mCrypto = new MediaCrypto(CLEARKEY_SCHEME_UUID, initData);
             } catch (MediaCryptoException e) {
                 reset();
                 Log.e(TAG, "Failed to create MediaCrypto instance.");
                 throw e;
             }
+            mCrypto.setMediaDrmSession(mSessionId);
         } else {
             reset();
             mCrypto.release();
diff --git a/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java b/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
index 1a3184d..a197cca 100644
--- a/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
@@ -17,9 +17,10 @@
 package android.media.cts;
 
 import android.media.MediaDrm;
-import android.media.MediaDrm.ProvisionRequest;
-import android.media.MediaDrm.KeyRequest;
 import android.media.MediaDrm.CryptoSession;
+import android.media.MediaDrm.KeyRequest;
+import android.media.MediaDrm.KeyStatus;
+import android.media.MediaDrm.ProvisionRequest;
 import android.media.MediaDrmException;
 import android.media.NotProvisionedException;
 import android.media.ResourceBusyException;
@@ -231,6 +232,7 @@
         md.setPropertyByteArray("mock-request", testRequest);
         String testDefaultUrl = "http://1.2.3.4:8080/blah";
         md.setPropertyString("mock-defaultUrl", testDefaultUrl);
+        md.setPropertyString("mock-keyRequestType", "1" /*kKeyRequestType_Initial*/);
 
         byte[] initData = {0x0a, 0x0b, 0x0c, 0x0d};
         HashMap<String, String> optionalParameters = new HashMap<String, String>();
@@ -243,6 +245,7 @@
                                                       optionalParameters);
         assertTrue(Arrays.equals(request.getData(), testRequest));
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
+        assertEquals(request.getRequestType(), MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL);
 
         assertTrue(Arrays.equals(initData, md.getPropertyByteArray("mock-initdata")));
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
@@ -265,6 +268,7 @@
         md.setPropertyByteArray("mock-request", testRequest);
         String testDefaultUrl = "http://1.2.3.4:8080/blah";
         md.setPropertyString("mock-defaultUrl", testDefaultUrl);
+        md.setPropertyString("mock-keyRequestType", "1" /*kKeyRequestType_Initial*/);
 
         byte[] initData = {0x0a, 0x0b, 0x0c, 0x0d};
 
@@ -274,6 +278,7 @@
                                                       null);
         assertTrue(Arrays.equals(request.getData(), testRequest));
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
+        assertEquals(request.getRequestType(), MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL);
 
         assertTrue(Arrays.equals(initData, md.getPropertyByteArray("mock-initdata")));
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
@@ -295,6 +300,7 @@
         md.setPropertyByteArray("mock-request", testRequest);
         String testDefaultUrl = "http://1.2.3.4:8080/blah";
         md.setPropertyString("mock-defaultUrl", testDefaultUrl);
+        md.setPropertyString("mock-keyRequestType", "2" /*kKeyRequestType_Renewal*/);
 
         byte[] initData = {0x0a, 0x0b, 0x0c, 0x0d};
 
@@ -304,6 +310,7 @@
                                               null);
         assertTrue(Arrays.equals(request.getData(), testRequest));
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
+        assertEquals(request.getRequestType(), MediaDrm.KeyRequest.REQUEST_TYPE_RENEWAL);
 
         assertTrue(Arrays.equals(initData, md.getPropertyByteArray("mock-initdata")));
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
@@ -325,6 +332,7 @@
         md.setPropertyByteArray("mock-request", testRequest);
         String testDefaultUrl = "http://1.2.3.4:8080/blah";
         md.setPropertyString("mock-defaultUrl", testDefaultUrl);
+        md.setPropertyString("mock-keyRequestType", "3" /*kKeyRequestType_Release*/);
 
         String mimeType = "video/iso.segment";
         KeyRequest request = md.getKeyRequest(sessionId, null, mimeType,
@@ -332,6 +340,7 @@
                                               null);
         assertTrue(Arrays.equals(request.getData(), testRequest));
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
+        assertEquals(request.getRequestType(), MediaDrm.KeyRequest.REQUEST_TYPE_RELEASE);
 
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
         assertTrue(md.getPropertyString("mock-keytype").equals("2"));
@@ -780,6 +789,170 @@
         assertTrue(mGotEvent);
     }
 
+    public void testExpirationUpdate() throws Exception {
+        if (!isMockPluginInstalled()) {
+            return;
+        }
+
+
+        new Thread() {
+            @Override
+            public void run() {
+                // Set up a looper to be used by mMediaPlayer.
+                Looper.prepare();
+
+                // Save the looper so that we can terminate this thread
+                // after we are done with it.
+                mLooper = Looper.myLooper();
+
+                try {
+                    mMediaDrm = new MediaDrm(mockScheme);
+                } catch (MediaDrmException e) {
+                    e.printStackTrace();
+                    fail();
+                }
+
+
+                final byte[] expected_sessionId = openSession(mMediaDrm);
+
+                mMediaDrm.setPropertyByteArray("mock-event-session-id", expected_sessionId);
+
+                synchronized(mLock) {
+                    mLock.notify();
+
+                    mMediaDrm.setOnExpirationUpdateListener(new MediaDrm.OnExpirationUpdateListener() {
+                            @Override
+                            public void onExpirationUpdate(MediaDrm md, byte[] sessionId,
+                                    long expiryTimeMS) {
+                                synchronized(mLock) {
+                                    Log.d(TAG,"testExpirationUpdate.onExpirationUpdate");
+                                    assertTrue(md == mMediaDrm);
+                                    assertTrue(Arrays.equals(sessionId, expected_sessionId));
+                                    assertTrue(expiryTimeMS == 123456789012345L);
+                                    mGotEvent = true;
+                                    mLock.notify();
+                                }
+                            }
+                        }, null);
+                }
+                Looper.loop();  // Blocks forever until Looper.quit() is called.
+            }
+        }.start();
+
+        // wait for mMediaDrm to be created
+        synchronized(mLock) {
+            try {
+                mLock.wait(1000);
+            } catch (Exception e) {
+            }
+        }
+        assertTrue(mMediaDrm != null);
+
+        mGotEvent = false;
+        mMediaDrm.setPropertyString("mock-send-expiration-update", "123456789012345");
+
+        synchronized(mLock) {
+            try {
+                mLock.wait(1000);
+            } catch (Exception e) {
+            }
+        }
+
+        mLooper.quit();
+        assertTrue(mGotEvent);
+    }
+
+    public void testKeyStatusChange() throws Exception {
+        if (!isMockPluginInstalled()) {
+            return;
+        }
+
+
+        new Thread() {
+            @Override
+            public void run() {
+                // Set up a looper to be used by mMediaPlayer.
+                Looper.prepare();
+
+                // Save the looper so that we can terminate this thread
+                // after we are done with it.
+                mLooper = Looper.myLooper();
+
+                try {
+                    mMediaDrm = new MediaDrm(mockScheme);
+                } catch (MediaDrmException e) {
+                    e.printStackTrace();
+                    fail();
+                }
+
+
+                final byte[] expected_sessionId = openSession(mMediaDrm);
+
+                mMediaDrm.setPropertyByteArray("mock-event-session-id", expected_sessionId);
+
+                synchronized(mLock) {
+                    mLock.notify();
+
+                    mMediaDrm.setOnKeyStatusChangeListener(new MediaDrm.OnKeyStatusChangeListener() {
+                            @Override
+                            public void onKeyStatusChange(MediaDrm md, byte[] sessionId,
+                                    List<KeyStatus> keyInformation, boolean hasNewUsableKey) {
+                                synchronized(mLock) {
+                                    Log.d(TAG,"testKeyStatusChange.onKeyStatusChange");
+                                    assertTrue(md == mMediaDrm);
+                                    assertTrue(Arrays.equals(sessionId, expected_sessionId));
+                                    try {
+                                        KeyStatus keyStatus = keyInformation.get(0);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key1".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_USABLE);
+                                        keyStatus = keyInformation.get(1);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key2".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_EXPIRED);
+                                        keyStatus = keyInformation.get(2);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key3".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_OUTPUT_NOT_ALLOWED);
+                                        keyStatus = keyInformation.get(3);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key4".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_PENDING);
+                                        keyStatus = keyInformation.get(4);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key5".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_INTERNAL_ERROR);
+                                        assertTrue(hasNewUsableKey);
+                                        mGotEvent = true;
+                                    } catch (IndexOutOfBoundsException e) {
+                                    }
+                                    mLock.notify();
+                                }
+                            }
+                        }, null);
+                }
+                Looper.loop();  // Blocks forever until Looper.quit() is called.
+            }
+        }.start();
+
+        // wait for mMediaDrm to be created
+        synchronized(mLock) {
+            try {
+                mLock.wait(1000);
+            } catch (Exception e) {
+            }
+        }
+        assertTrue(mMediaDrm != null);
+
+        mGotEvent = false;
+        mMediaDrm.setPropertyString("mock-send-keys-change", "123456789012345");
+
+        synchronized(mLock) {
+            try {
+                mLock.wait(1000);
+            } catch (Exception e) {
+            }
+        }
+
+        mLooper.quit();
+        assertTrue(mGotEvent);
+    }
+
     private byte[] openSession(MediaDrm md) {
         byte[] sessionId = null;
         try {
diff --git a/tests/tests/media/src/android/media/cts/MediaExtractorTest.java b/tests/tests/media/src/android/media/cts/MediaExtractorTest.java
new file mode 100644
index 0000000..9db54ff
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MediaExtractorTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import com.android.cts.media.R;
+
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.media.MediaDataSource;
+import android.media.MediaExtractor;
+import android.test.AndroidTestCase;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class MediaExtractorTest extends AndroidTestCase {
+    protected Resources mResources;
+    protected MediaExtractor mExtractor;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResources = getContext().getResources();
+        mExtractor = new MediaExtractor();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mExtractor.release();
+    }
+
+    protected TestMediaDataSource getDataSourceFor(int resid) throws Exception {
+        AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+        return TestMediaDataSource.fromAssetFd(afd);
+    }
+
+    protected TestMediaDataSource setDataSource(int resid) throws Exception {
+        TestMediaDataSource ds = getDataSourceFor(resid);
+        mExtractor.setDataSource(ds);
+        return ds;
+    }
+
+    public void testNullMediaDataSourceIsRejected() throws Exception {
+        try {
+            mExtractor.setDataSource((MediaDataSource)null);
+            fail("Expected IllegalArgumentException.");
+        } catch (IllegalArgumentException ex) {
+            // Expected, test passed.
+        }
+    }
+
+    public void testMediaDataSourceIsClosedOnRelease() throws Exception {
+        TestMediaDataSource dataSource = setDataSource(R.raw.testvideo);
+        mExtractor.release();
+        assertTrue(dataSource.isClosed());
+    }
+
+    public void testExtractorFailsIfMediaDataSourceThrows() throws Exception {
+        TestMediaDataSource dataSource = getDataSourceFor(R.raw.testvideo);
+        dataSource.throwFromReadAt();
+        try {
+            mExtractor.setDataSource(dataSource);
+            fail("Expected IOException.");
+        } catch (IOException e) {
+            // Expected.
+        }
+    }
+
+    public void testExtractorFailsIfMediaDataSourceReturnsAnError() throws Exception {
+        TestMediaDataSource dataSource = getDataSourceFor(R.raw.testvideo);
+        dataSource.returnFromReadAt(-2);
+        try {
+            mExtractor.setDataSource(dataSource);
+            fail("Expected IOException.");
+        } catch (IOException e) {
+            // Expected.
+        }
+    }
+
+    // Smoke test MediaExtractor reading from a DataSource.
+    public void testExtractFromAMediaDataSource() throws Exception {
+        TestMediaDataSource dataSource = setDataSource(R.raw.testvideo);
+        // 1MB is enough for any sample.
+        final ByteBuffer buf = ByteBuffer.allocate(1024*1024);
+        final int trackCount = mExtractor.getTrackCount();
+
+        for (int i = 0; i < trackCount; i++) {
+            mExtractor.selectTrack(i);
+        }
+
+        for (int i = 0; i < trackCount; i++) {
+            assertTrue(mExtractor.readSampleData(buf, 0) > 0);
+            assertTrue(mExtractor.advance());
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java b/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
index 30c8370..562656b 100644
--- a/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
@@ -20,102 +20,133 @@
 
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Resources;
+import android.media.MediaDataSource;
 import android.media.MediaMetadataRetriever;
 import android.test.AndroidTestCase;
 
 public class MediaMetadataRetrieverTest extends AndroidTestCase {
+    protected Resources mResources;
+    protected MediaMetadataRetriever mRetriever;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        mResources = getContext().getResources();
+        mRetriever = new MediaMetadataRetriever();
     }
 
     @Override
     protected void tearDown() throws Exception {
         super.tearDown();
+        mRetriever.release();
     }
 
-    public void test3gppMetadata() {
-        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
-
+    protected void setDataSourceFd(int resid) {
         try {
-            Resources resources = getContext().getResources();
-            AssetFileDescriptor afd = resources.openRawResourceFd(R.raw.testvideo);
-
-            retriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
-
+            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            mRetriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
         } catch (Exception e) {
             fail("Unable to open file");
         }
+    }
+
+    protected TestMediaDataSource setDataSourceCallback(int resid) {
+        TestMediaDataSource ds = null;
+        try {
+            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            ds = TestMediaDataSource.fromAssetFd(afd);
+            mRetriever.setDataSource(ds);
+        } catch (Exception e) {
+            fail("Unable to open file");
+        }
+        return ds;
+    }
+
+    public void test3gppMetadata() {
+        setDataSourceCallback(R.raw.testvideo);
 
         assertEquals("Title was other than expected",
-                "Title", retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
+                "Title", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
 
         assertEquals("Artist was other than expected",
                 "UTF16LE エンディアン ",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
 
         assertEquals("Album was other than expected",
                 "Test album",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
 
         assertEquals("Track number was other than expected",
                 "10",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
 
         assertEquals("Year was other than expected",
-                "2013", retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR));
+                "2013", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR));
 
         assertNull("Writer was unexpected present",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER));
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER));
     }
 
-    public void testSetDataSourceNull() {
-        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+    public void testID3v2Metadata() {
+        setDataSourceFd(R.raw.video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2);
 
+        assertEquals("Title was other than expected",
+                "Title", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
+
+        assertEquals("Artist was other than expected",
+                "UTF16LE エンディアン ",
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
+
+        assertEquals("Album was other than expected",
+                "Test album",
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
+
+        assertEquals("Track number was other than expected",
+                "10",
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
+
+        assertEquals("Year was other than expected",
+                "2013", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR));
+
+        assertNull("Writer was unexpectedly present",
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER));
+    }
+
+    public void testSetDataSourceNullPath() {
         try {
-            retriever.setDataSource((String)null);
+            mRetriever.setDataSource((String)null);
             fail("Expected IllegalArgumentException.");
         } catch (IllegalArgumentException ex) {
             // Expected, test passed.
         }
     }
 
-    public void testID3v2Metadata() {
-        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
-
+    public void testNullMediaDataSourceIsRejected() {
         try {
-            Resources resources = getContext().getResources();
-            AssetFileDescriptor afd = resources.openRawResourceFd(
-                    R.raw.video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2);
-
-            retriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
-
-            afd.close();
-        } catch (Exception e) {
-            fail("Unable to open file");
+            mRetriever.setDataSource((MediaDataSource)null);
+            fail("Expected IllegalArgumentException.");
+        } catch (IllegalArgumentException ex) {
+            // Expected, test passed.
         }
+    }
 
-        assertEquals("Title was other than expected",
-                "Title", retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
+    public void testMediaDataSourceIsClosedOnRelease() throws Exception {
+        TestMediaDataSource dataSource = setDataSourceCallback(R.raw.testvideo);
+        mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
+        mRetriever.release();
+        assertTrue(dataSource.isClosed());
+    }
 
-        assertEquals("Artist was other than expected",
-                "UTF16LE エンディアン ",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
+    public void testRetrieveFailsIfMediaDataSourceThrows() throws Exception {
+        TestMediaDataSource dataSource = setDataSourceCallback(R.raw.testvideo);
+        dataSource.throwFromReadAt();
+        assertTrue(mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null);
+    }
 
-        assertEquals("Album was other than expected",
-                "Test album",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
-
-        assertEquals("Track number was other than expected",
-                "10",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
-
-        assertEquals("Year was other than expected",
-                "2013", retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR));
-
-        assertNull("Writer was unexpectedly present",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER));
+    public void testRetrieveFailsIfMediaDataSourceReturnsAnError() throws Exception {
+        TestMediaDataSource dataSource = setDataSourceCallback(R.raw.testvideo);
+        dataSource.returnFromReadAt(-2);
+        assertTrue(mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null);
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaMuxerTest.java b/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
index 67eeca0..0f664a5 100644
--- a/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
@@ -104,6 +104,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c 2 video tracks were added.
@@ -115,6 +117,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c 2 audio tracks were added.
@@ -125,6 +129,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c 3 tracks were added.
@@ -137,6 +143,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c no tracks was added.
@@ -146,6 +154,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c a wrong format.
@@ -155,6 +165,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
         new File(outputFile).delete();
     }
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
index 32fbfb5..640083f 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
@@ -23,6 +23,8 @@
 import android.os.SystemClock;
 import android.webkit.cts.CtsTestServer;
 
+import com.android.cts.util.TimeoutReq;
+
 import org.apache.http.HttpServerConnection;
 
 import org.apache.http.impl.DefaultHttpServerConnection;
@@ -67,30 +69,37 @@
         super.tearDown();
     }
 
+    @TimeoutReq(minutes = 5)
     public void test_S0P0() throws Throwable {
         doPlayStreams(0, 0);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S1P000005() throws Throwable {
         doPlayStreams(1, 0.000005f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S2P00001() throws Throwable {
         doPlayStreams(2, 0.00001f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S3P00001() throws Throwable {
         doPlayStreams(3, 0.00001f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S4P00001() throws Throwable {
         doPlayStreams(4, 0.00001f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S5P00001() throws Throwable {
         doPlayStreams(5, 0.00001f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S6P00002() throws Throwable {
         doPlayStreams(6, 0.00002f);
     }
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index e058981..86f0313 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -23,12 +23,16 @@
 import android.cts.util.MediaUtils;
 import android.media.AudioManager;
 import android.media.MediaCodec;
+import android.media.MediaDataSource;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
+import android.media.MediaMetadataRetriever;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer.OnErrorListener;
 import android.media.MediaRecorder;
-import android.media.MediaMetadataRetriever;
+import android.media.MediaTimestamp;
+import android.media.PlaybackParams;
+import android.media.SyncParams;
 import android.media.TimedText;
 import android.media.audiofx.AudioEffect;
 import android.media.audiofx.Visualizer;
@@ -67,6 +71,8 @@
     private static final int  RECORDED_VIDEO_WIDTH  = 176;
     private static final int  RECORDED_VIDEO_HEIGHT = 144;
     private static final long RECORDED_DURATION_MS  = 3000;
+    private static final float FLOAT_TOLERANCE = .0001f;
+
     private Vector<Integer> mTimedTextTrackIndex = new Vector<Integer>();
     private int mSelectedTimedTextIndex;
     private Monitor mOnTimedTextCalled = new Monitor();
@@ -117,10 +123,10 @@
         }
     }
 
-    public void testPlayNullSource() throws Exception {
+    public void testPlayNullSourcePath() throws Exception {
         try {
             mMediaPlayer.setDataSource((String) null);
-            fail("Null URI was accepted");
+            fail("Null path was accepted");
         } catch (RuntimeException e) {
             // expected
         }
@@ -348,10 +354,6 @@
     }
 
     public void testPlayAudioTwice() throws Exception {
-        if (!hasAudioOutput()) {
-            Log.i(LOG_TAG, "SKIPPING testPlayAudioTwice(). No audio output.");
-            return;
-        }
 
         final int resid = R.raw.camera_click;
 
@@ -599,10 +601,6 @@
     }
 
     private void testGapless(int resid1, int resid2) throws Exception {
-        if (!hasAudioOutput()) {
-            Log.i(LOG_TAG, "SKIPPING testPlayAudioTwice(). No audio output.");
-            return;
-        }
 
         MediaPlayer mp1 = new MediaPlayer();
         mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
@@ -838,6 +836,92 @@
         assertEquals(Integer.parseInt(rotation), angle);
     }
 
+    public void testPlaybackRate() throws Exception {
+        final int toleranceMs = 1000;
+        if (!checkLoadResource(
+                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz)) {
+            return; // skip
+        }
+
+        mMediaPlayer.setDisplay(mActivity.getSurfaceHolder());
+        mMediaPlayer.prepare();
+        SyncParams sync = new SyncParams().allowDefaults();
+        mMediaPlayer.setSyncParams(sync);
+        sync = mMediaPlayer.getSyncParams();
+
+        float[] rates = { 0.25f, 0.5f, 1.0f, 2.0f };
+        for (float playbackRate : rates) {
+            mMediaPlayer.seekTo(0);
+            Thread.sleep(1000);
+            int playTime = 4000;  // The testing clip is about 10 second long.
+            mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(playbackRate));
+            mMediaPlayer.start();
+            Thread.sleep(playTime);
+            PlaybackParams pbp = mMediaPlayer.getPlaybackParams();
+            assertEquals(
+                    playbackRate, pbp.getSpeed(),
+                    FLOAT_TOLERANCE + playbackRate * sync.getTolerance());
+            assertTrue("MediaPlayer should still be playing", mMediaPlayer.isPlaying());
+
+            int playedMediaDurationMs = mMediaPlayer.getCurrentPosition();
+            int diff = Math.abs((int)(playedMediaDurationMs / playbackRate) - playTime);
+            if (diff > toleranceMs) {
+                fail("Media player had error in playback rate " + playbackRate
+                     + ", play time is " + playTime + " vs expected " + playedMediaDurationMs);
+            }
+            mMediaPlayer.pause();
+            pbp = mMediaPlayer.getPlaybackParams();
+            assertEquals(0.f, pbp.getSpeed(), FLOAT_TOLERANCE);
+        }
+        mMediaPlayer.stop();
+    }
+
+    public void testGetTimestamp() throws Exception {
+        final int toleranceUs = 100000;
+        final float playbackRate = 1.0f;
+        if (!checkLoadResource(
+                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz)) {
+            return; // skip
+        }
+
+        mMediaPlayer.setDisplay(mActivity.getSurfaceHolder());
+        mMediaPlayer.prepare();
+        mMediaPlayer.start();
+        mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(playbackRate));
+        Thread.sleep(SLEEP_TIME);  // let player get into stable state.
+        long nt1 = System.nanoTime();
+        MediaTimestamp ts1 = mMediaPlayer.getTimestamp();
+        long nt2 = System.nanoTime();
+        assertTrue("Media player should return a valid time stamp", ts1 != null);
+        assertEquals("MediaPlayer had error in clockRate " + ts1.getMediaClockRate(),
+                playbackRate, ts1.getMediaClockRate(), 0.001f);
+        assertTrue("The nanoTime of Media timestamp should be taken when getTimestamp is called.",
+                nt1 <= ts1.getAnchorSytemNanoTime() && ts1.getAnchorSytemNanoTime() <= nt2);
+
+        mMediaPlayer.pause();
+        ts1 = mMediaPlayer.getTimestamp();
+        assertTrue("Media player should return a valid time stamp", ts1 != null);
+        assertTrue("Media player should have play rate of 0.0f when paused",
+                ts1.getMediaClockRate() == 0.0f);
+
+        mMediaPlayer.seekTo(0);
+        mMediaPlayer.start();
+        Thread.sleep(SLEEP_TIME);  // let player get into stable state.
+        int playTime = 4000;  // The testing clip is about 10 second long.
+        ts1 = mMediaPlayer.getTimestamp();
+        assertTrue("Media player should return a valid time stamp", ts1 != null);
+        Thread.sleep(playTime);
+        MediaTimestamp ts2 = mMediaPlayer.getTimestamp();
+        assertTrue("Media player should return a valid time stamp", ts2 != null);
+        assertTrue("The clockRate should not be changed.",
+                ts1.getMediaClockRate() == ts2.getMediaClockRate());
+        assertEquals("MediaPlayer had error in timestamp.",
+                ts1.getAnchorMediaTimeUs() + (long)(playTime * ts1.getMediaClockRate() * 1000),
+                ts2.getAnchorMediaTimeUs(), toleranceUs);
+
+        mMediaPlayer.stop();
+    }
+
     public void testLocalVideo_MP4_H264_480x360_500kbps_25fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
         playVideoTest(
@@ -1038,13 +1122,22 @@
         if (trackInfos == null || trackInfos.length == 0) {
             return;
         }
+
+        Vector<Integer> externalTrackIndex = new Vector<>();
         for (int i = 0; i < trackInfos.length; ++i) {
             assertTrue(trackInfos[i] != null);
-            if (trackInfos[i].getTrackType() ==
-                 MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {
-                mTimedTextTrackIndex.add(i);
+            if (trackInfos[i].getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {
+                MediaFormat format = trackInfos[i].getFormat();
+                String mime = format.getString(MediaFormat.KEY_MIME);
+                if (MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP.equals(mime)) {
+                    externalTrackIndex.add(i);
+                } else {
+                    mTimedTextTrackIndex.add(i);
+                }
             }
         }
+
+        mTimedTextTrackIndex.addAll(externalTrackIndex);
     }
 
     private int getTimedTextTrackCount() {
@@ -1470,4 +1563,94 @@
         return getActivity().getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_MICROPHONE);
     }
+
+    // Smoke test playback from a MediaDataSource.
+    public void testPlaybackFromAMediaDataSource() throws Exception {
+        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        final int duration = 10000;
+
+        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+            return;
+        }
+
+        TestMediaDataSource dataSource =
+                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+        // Test returning -1 from getSize() to indicate unknown size.
+        dataSource.returnFromGetSize(-1);
+        mMediaPlayer.setDataSource(dataSource);
+        playLoadedVideo(null, null, -1);
+        assertTrue(mMediaPlayer.isPlaying());
+
+        // Test pause and restart.
+        mMediaPlayer.pause();
+        Thread.sleep(SLEEP_TIME);
+        assertFalse(mMediaPlayer.isPlaying());
+        mMediaPlayer.start();
+        assertTrue(mMediaPlayer.isPlaying());
+
+        // Test reset.
+        mMediaPlayer.stop();
+        mMediaPlayer.reset();
+        mMediaPlayer.setDataSource(dataSource);
+        mMediaPlayer.prepare();
+        mMediaPlayer.start();
+        assertTrue(mMediaPlayer.isPlaying());
+
+        // Test seek. Note: the seek position is cached and returned as the
+        // current position so there's no point in comparing them.
+        mMediaPlayer.seekTo(duration - SLEEP_TIME);
+        while (mMediaPlayer.isPlaying()) {
+            Thread.sleep(SLEEP_TIME);
+        }
+    }
+
+    public void testNullMediaDataSourceIsRejected() throws Exception {
+        try {
+            mMediaPlayer.setDataSource((MediaDataSource) null);
+            fail("Null MediaDataSource was accepted");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
+    public void testMediaDataSourceIsClosedOnReset() throws Exception {
+        TestMediaDataSource dataSource = new TestMediaDataSource(new byte[0]);
+        mMediaPlayer.setDataSource(dataSource);
+        mMediaPlayer.reset();
+        assertTrue(dataSource.isClosed());
+    }
+
+    public void testPlaybackFailsIfMediaDataSourceThrows() throws Exception {
+        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+            return;
+        }
+
+        setOnErrorListener();
+        TestMediaDataSource dataSource =
+                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+        mMediaPlayer.setDataSource(dataSource);
+        mMediaPlayer.prepare();
+
+        dataSource.throwFromReadAt();
+        mMediaPlayer.start();
+        assertTrue(mOnErrorCalled.waitForSignal());
+    }
+
+    public void testPlaybackFailsIfMediaDataSourceReturnsAnError() throws Exception {
+        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+            return;
+        }
+
+        setOnErrorListener();
+        TestMediaDataSource dataSource =
+                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+        mMediaPlayer.setDataSource(dataSource);
+        mMediaPlayer.prepare();
+
+        dataSource.returnFromReadAt(-2);
+        mMediaPlayer.start();
+        assertTrue(mOnErrorCalled.waitForSignal());
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
index d089658..95cb43c 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
@@ -294,11 +294,6 @@
 
     private static class PrepareFailedException extends Exception {}
 
-    public boolean hasAudioOutput() {
-        return getInstrumentation().getTargetContext().getPackageManager()
-            .hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
-    }
-
     public boolean isTv() {
         PackageManager pm = getInstrumentation().getTargetContext().getPackageManager();
         return pm.hasSystemFeature(pm.FEATURE_TELEVISION)
@@ -308,4 +303,14 @@
     public boolean checkTv() {
         return MediaUtils.check(isTv(), "not a TV");
     }
+
+    protected void setOnErrorListener() {
+        mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
+            @Override
+            public boolean onError(MediaPlayer mp, int what, int extra) {
+                mOnErrorCalled.signal();
+                return false;
+            }
+        });
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
index 78b5cfd..b6ee1db 100644
--- a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
@@ -18,10 +18,16 @@
 
 import android.content.pm.PackageManager;
 import android.cts.util.MediaUtils;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
 import android.hardware.Camera;
+import android.media.EncoderCapabilities;
+import android.media.MediaCodec;
 import android.media.MediaFormat;
 import android.media.MediaMetadataRetriever;
 import android.media.MediaRecorder;
+import android.media.EncoderCapabilities.VideoEncoderCap;
 import android.media.MediaRecorder.OnErrorListener;
 import android.media.MediaRecorder.OnInfoListener;
 import android.media.MediaMetadataRetriever;
@@ -38,6 +44,7 @@
 import java.io.FileOutputStream;
 import java.lang.InterruptedException;
 import java.lang.Runnable;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -62,6 +69,12 @@
     private static final int MAX_DURATION_MSEC = 2000;
     private static final float LATITUDE = 0.0000f;
     private static final float LONGITUDE  = -180.0f;
+    private static final int NORMAL_FPS = 30;
+    private static final int TIME_LAPSE_FPS = 5;
+    private static final int SLOW_MOTION_FPS = 120;
+    private static final List<VideoEncoderCap> mVideoEncoders =
+            EncoderCapabilities.getVideoEncoders();
+
     private boolean mOnInfoCalled;
     private boolean mOnErrorCalled;
     private File mOutFile;
@@ -138,8 +151,10 @@
 
     @Override
     protected void tearDown() throws Exception {
-        mMediaRecorder.release();
-        mMediaRecorder = null;
+        if (mMediaRecorder != null) {
+            mMediaRecorder.release();
+            mMediaRecorder = null;
+        }
         if (mOutFile != null && mOutFile.exists()) {
             mOutFile.delete();
         }
@@ -477,6 +492,441 @@
         assertFalse(mOnErrorCalled);
     }
 
+    private void setupRecorder(String filename, boolean useSurface, boolean hasAudio)
+            throws Exception {
+        int codec = MediaRecorder.VideoEncoder.H264;
+        int frameRate = getMaxFrameRateForCodec(codec);
+        if (mMediaRecorder == null) {
+            mMediaRecorder = new MediaRecorder();
+        }
+
+        if (!useSurface) {
+            mCamera = Camera.open(0);
+            Camera.Parameters params = mCamera.getParameters();
+            frameRate = params.getPreviewFrameRate();
+            mCamera.unlock();
+            mMediaRecorder.setCamera(mCamera);
+            mMediaRecorder.setPreviewDisplay(mActivity.getSurfaceHolder().getSurface());
+        }
+
+        mMediaRecorder.setVideoSource(useSurface ?
+                MediaRecorder.VideoSource.SURFACE : MediaRecorder.VideoSource.CAMERA);
+
+        if (hasAudio) {
+            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+        }
+
+        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
+        mMediaRecorder.setOutputFile(filename);
+
+        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
+        mMediaRecorder.setVideoFrameRate(frameRate);
+        mMediaRecorder.setVideoSize(VIDEO_WIDTH, VIDEO_HEIGHT);
+
+        if (hasAudio) {
+            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
+        }
+    }
+
+    private Surface tryGetSurface(boolean shouldThrow) throws Exception {
+        Surface surface = null;
+        try {
+            surface = mMediaRecorder.getSurface();
+            assertFalse("failed to throw IllegalStateException", shouldThrow);
+        } catch (IllegalStateException e) {
+            assertTrue("threw unexpected exception: " + e, shouldThrow);
+        }
+        return surface;
+    }
+
+    private boolean validateGetSurface(boolean useSurface) {
+        Log.v(TAG,"validateGetSurface, useSurface=" + useSurface);
+        if (!useSurface && !hasCamera()) {
+            // pass if testing camera source but no hardware
+            return true;
+        }
+        Surface surface = null;
+        boolean success = true;
+        try {
+            setupRecorder(OUTPUT_PATH, useSurface, false /* hasAudio */);
+
+            /* Test: getSurface() before prepare()
+             * should throw IllegalStateException
+             */
+            surface = tryGetSurface(true /* shouldThow */);
+
+            mMediaRecorder.prepare();
+
+            /* Test: getSurface() after prepare()
+             * should succeed for surface source
+             * should fail for camera source
+             */
+            surface = tryGetSurface(!useSurface);
+
+            mMediaRecorder.start();
+
+            /* Test: getSurface() after start()
+             * should succeed for surface source
+             * should fail for camera source
+             */
+            surface = tryGetSurface(!useSurface);
+
+            try {
+                mMediaRecorder.stop();
+            } catch (Exception e) {
+                // stop() could fail if the recording is empty, as we didn't render anything.
+                // ignore any failure in stop, we just want it stopped.
+            }
+
+            /* Test: getSurface() after stop()
+             * should throw IllegalStateException
+             */
+            surface = tryGetSurface(true /* shouldThow */);
+        } catch (Exception e) {
+            Log.d(TAG, e.toString());
+            success = false;
+        } finally {
+            // reset to clear states, as stop() might have failed
+            mMediaRecorder.reset();
+
+            if (mCamera != null) {
+                mCamera.release();
+                mCamera = null;
+            }
+            if (surface != null) {
+                surface.release();
+                surface = null;
+            }
+        }
+
+        return success;
+    }
+
+    private void trySetInputSurface(Surface surface) throws Exception {
+        boolean testBadArgument = (surface == null);
+        try {
+            mMediaRecorder.setInputSurface(testBadArgument ? new Surface() : surface);
+            fail("failed to throw exception");
+        } catch (IllegalArgumentException e) {
+            // OK only if testing bad arg
+            assertTrue("threw unexpected exception: " + e, testBadArgument);
+        } catch (IllegalStateException e) {
+            // OK only if testing error case other than bad arg
+            assertFalse("threw unexpected exception: " + e, testBadArgument);
+        }
+    }
+
+    private boolean validatePersistentSurface(boolean errorCase) {
+        Log.v(TAG, "validatePersistentSurface, errorCase=" + errorCase);
+
+        Surface surface = MediaCodec.createPersistentInputSurface();
+        if (surface == null) {
+            return false;
+        }
+        Surface dummy = null;
+
+        boolean success = true;
+        try {
+            setupRecorder(OUTPUT_PATH, true /* useSurface */, false /* hasAudio */);
+
+            if (errorCase) {
+                /*
+                 * Test: should throw if called with non-persistent surface
+                 */
+                trySetInputSurface(null);
+            } else {
+                /*
+                 * Test: should succeed if called with a persistent surface before prepare()
+                 */
+                mMediaRecorder.setInputSurface(surface);
+            }
+
+            /*
+             * Test: getSurface() should fail before prepare
+             */
+            dummy = tryGetSurface(true /* shouldThow */);
+
+            mMediaRecorder.prepare();
+
+            /*
+             * Test: setInputSurface() should fail after prepare
+             */
+            trySetInputSurface(surface);
+
+            /*
+             * Test: getSurface() should fail if setInputSurface() succeeded
+             */
+            dummy = tryGetSurface(!errorCase /* shouldThow */);
+
+            mMediaRecorder.start();
+
+            /*
+             * Test: setInputSurface() should fail after start
+             */
+            trySetInputSurface(surface);
+
+            /*
+             * Test: getSurface() should fail if setInputSurface() succeeded
+             */
+            dummy = tryGetSurface(!errorCase /* shouldThow */);
+
+            try {
+                mMediaRecorder.stop();
+            } catch (Exception e) {
+                // stop() could fail if the recording is empty, as we didn't render anything.
+                // ignore any failure in stop, we just want it stopped.
+            }
+
+            /*
+             * Test: getSurface() should fail after stop
+             */
+            dummy = tryGetSurface(true /* shouldThow */);
+        } catch (Exception e) {
+            Log.d(TAG, e.toString());
+            success = false;
+        } finally {
+            // reset to clear states, as stop() might have failed
+            mMediaRecorder.reset();
+
+            if (mCamera != null) {
+                mCamera.release();
+                mCamera = null;
+            }
+            if (surface != null) {
+                surface.release();
+                surface = null;
+            }
+            if (dummy != null) {
+                dummy.release();
+                dummy = null;
+            }
+        }
+
+        return success;
+    }
+
+    public void testGetSurfaceApi() {
+        if (!hasH264()) {
+            MediaUtils.skipTest("no codecs");
+            return;
+        }
+
+        if (hasCamera()) {
+            // validate getSurface() with CAMERA source
+            assertTrue(validateGetSurface(false /* useSurface */));
+        }
+
+        // validate getSurface() with SURFACE source
+        assertTrue(validateGetSurface(true /* useSurface */));
+    }
+
+    public void testPersistentSurfaceApi() {
+        if (!hasH264()) {
+            MediaUtils.skipTest("no codecs");
+            return;
+        }
+
+        // test valid use case
+        assertTrue(validatePersistentSurface(false /* errorCase */));
+
+        // test invalid use case
+        assertTrue(validatePersistentSurface(true /* errorCase */));
+    }
+
+    private static int getMaxFrameRateForCodec(int codec) {
+        for (VideoEncoderCap cap : mVideoEncoders) {
+            if (cap.mCodec == codec) {
+                return cap.mMaxFrameRate < NORMAL_FPS ? cap.mMaxFrameRate : NORMAL_FPS;
+            }
+        }
+        fail("didn't find max FPS for codec");
+        return -1;
+    }
+
+    private boolean recordFromSurface(
+            String filename,
+            int captureRate,
+            boolean hasAudio,
+            Surface persistentSurface) {
+        Log.v(TAG, "recordFromSurface");
+        Surface surface = null;
+        try {
+            setupRecorder(filename, true /* useSurface */, hasAudio);
+
+            int sleepTimeMs;
+            if (captureRate > 0) {
+                mMediaRecorder.setCaptureRate(captureRate);
+                sleepTimeMs = 1000 / captureRate;
+            } else {
+                sleepTimeMs = 1000 / getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H264);
+            }
+
+            if (persistentSurface != null) {
+                Log.v(TAG, "using persistent surface");
+                surface = persistentSurface;
+                mMediaRecorder.setInputSurface(surface);
+            }
+
+            mMediaRecorder.prepare();
+
+            if (persistentSurface == null) {
+                surface = mMediaRecorder.getSurface();
+            }
+
+            Paint paint = new Paint();
+            paint.setTextSize(16);
+            paint.setColor(Color.RED);
+            int i;
+
+            /* Test: draw 10 frames at 30fps before start
+             * these should be dropped and not causing malformed stream.
+             */
+            for(i = 0; i < 10; i++) {
+                Canvas canvas = surface.lockCanvas(null);
+                int background = (i * 255 / 99);
+                canvas.drawARGB(255, background, background, background);
+                String text = "Frame #" + i;
+                canvas.drawText(text, 50, 50, paint);
+                surface.unlockCanvasAndPost(canvas);
+                Thread.sleep(sleepTimeMs);
+            }
+
+            Log.v(TAG, "start");
+            mMediaRecorder.start();
+
+            /* Test: draw another 90 frames at 30fps after start */
+            for(i = 10; i < 100; i++) {
+                Canvas canvas = surface.lockCanvas(null);
+                int background = (i * 255 / 99);
+                canvas.drawARGB(255, background, background, background);
+                String text = "Frame #" + i;
+                canvas.drawText(text, 50, 50, paint);
+                surface.unlockCanvasAndPost(canvas);
+                Thread.sleep(sleepTimeMs);
+            }
+
+            Log.v(TAG, "stop");
+            mMediaRecorder.stop();
+        } catch (Exception e) {
+            Log.v(TAG, "record video failed: " + e.toString());
+            return false;
+        } finally {
+            // We need to test persistent surface across multiple MediaRecorder
+            // instances, so must destroy mMediaRecorder here.
+            if (mMediaRecorder != null) {
+                mMediaRecorder.release();
+                mMediaRecorder = null;
+            }
+
+            // release surface if not using persistent surface
+            if (persistentSurface == null && surface != null) {
+                surface.release();
+                surface = null;
+            }
+        }
+        return true;
+    }
+
+    private boolean checkCaptureFps(String filename, int captureRate) {
+        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+
+        retriever.setDataSource(filename);
+
+        // verify capture rate meta key is present and correct
+        String captureFps = retriever.extractMetadata(
+                MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE);
+
+        if (captureFps == null) {
+            Log.d(TAG, "METADATA_KEY_CAPTURE_FRAMERATE is missing");
+            return false;
+        }
+
+        if (Math.abs(Float.parseFloat(captureFps) - captureRate) > 0.001) {
+            Log.d(TAG, "METADATA_KEY_CAPTURE_FRAMERATE is incorrect: "
+                    + captureFps + "vs. " + captureRate);
+            return false;
+        }
+
+        // verify other meta keys here if necessary
+        return true;
+    }
+
+    private boolean testRecordFromSurface(boolean persistent, boolean timelapse) {
+        Log.v(TAG, "testRecordFromSurface: " +
+                   "persistent=" + persistent + ", timelapse=" + timelapse);
+        boolean success = false;
+        Surface surface = null;
+        int noOfFailure = 0;
+        try {
+            if (persistent) {
+                surface = MediaCodec.createPersistentInputSurface();
+            }
+
+            for (int k = 0; k < 2; k++) {
+                String filename = (k == 0) ? OUTPUT_PATH : OUTPUT_PATH2;
+                boolean hasAudio = false;
+                int captureRate = 0;
+
+                if (timelapse) {
+                    // if timelapse/slow-mo, k chooses between low/high capture fps
+                    captureRate = (k == 0) ? TIME_LAPSE_FPS : SLOW_MOTION_FPS;
+                } else {
+                    // otherwise k chooses between no-audio and audio
+                    hasAudio = (k == 0) ? false : true;
+                }
+
+                if (hasAudio && (!hasMicrophone() || !hasAmrNb())) {
+                    // audio test waived if no audio support
+                    continue;
+                }
+
+                Log.v(TAG, "testRecordFromSurface - round " + k);
+                success = recordFromSurface(filename, captureRate, hasAudio, surface);
+                if (success) {
+                    checkTracksAndDuration(0, true /* hasVideo */, hasAudio, filename);
+
+                    // verify capture fps meta key
+                    if (timelapse && !checkCaptureFps(filename, captureRate)) {
+                        noOfFailure++;
+                    }
+                }
+                if (!success) {
+                    noOfFailure++;
+                }
+            }
+        } catch (Exception e) {
+            Log.v(TAG, e.toString());
+            noOfFailure++;
+        } finally {
+            if (surface != null) {
+                Log.v(TAG, "releasing persistent surface");
+                surface.release();
+                surface = null;
+            }
+        }
+        return (noOfFailure == 0);
+    }
+
+    // Test recording from surface source with/without audio)
+    public void testSurfaceRecording() {
+        assertTrue(testRecordFromSurface(false /* persistent */, false /* timelapse */));
+    }
+
+    // Test recording from persistent surface source with/without audio
+    public void testPersistentSurfaceRecording() {
+        assertTrue(testRecordFromSurface(true /* persistent */, false /* timelapse */));
+    }
+
+    // Test timelapse recording from surface without audio
+    public void testSurfaceRecordingTimeLapse() {
+        assertTrue(testRecordFromSurface(false /* persistent */, true /* timelapse */));
+    }
+
+    // Test timelapse recording from persisent surface without audio
+    public void testPersistentSurfaceRecordingTimeLapse() {
+        assertTrue(testRecordFromSurface(true /* persistent */, true /* timelapse */));
+    }
+
     private void recordMedia(long maxFileSize, File outFile) throws Exception {
         mMediaRecorder.setMaxFileSize(maxFileSize);
         mMediaRecorder.prepare();
diff --git a/tests/tests/media/src/android/media/cts/MediaSessionTest.java b/tests/tests/media/src/android/media/cts/MediaSessionTest.java
index 21839f5..7999092 100644
--- a/tests/tests/media/src/android/media/cts/MediaSessionTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaSessionTest.java
@@ -29,6 +29,9 @@
 import android.media.session.MediaSessionManager;
 import android.media.session.PlaybackState;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
@@ -36,12 +39,20 @@
 import java.util.Set;
 
 public class MediaSessionTest extends AndroidTestCase {
+    // The maximum time to wait for an operation.
+    private static final long TIME_OUT_MS = 5000L;
+    private static final String SESSION_TAG = "test-session";
+    private static final String EXTRAS_KEY = "test-key";
+    private static final String EXTRAS_VALUE = "test-val";
+    private static final String SESSION_EVENT = "test-session-event";
+
     private AudioManager mAudioManager;
+    private Handler mHandler = new Handler(Looper.getMainLooper());
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
     }
 
     /**
@@ -49,23 +60,21 @@
      * initialized correctly.
      */
     public void testCreateSession() throws Exception {
-        String tag = "test session";
-        MediaSession session = new MediaSession(getContext(), tag);
+        MediaSession session = new MediaSession(getContext(), SESSION_TAG);
         assertNotNull(session.getSessionToken());
         assertFalse("New session should not be active", session.isActive());
 
         // Verify by getting the controller and checking all its fields
         MediaController controller = session.getController();
         assertNotNull(controller);
-        verifyNewSession(controller, tag);
+        verifyNewSession(controller, SESSION_TAG);
     }
 
     /**
      * Tests MediaSession.Token created in the constructor of MediaSession.
      */
     public void testSessionToken() throws Exception {
-        String tag = "test session";
-        MediaSession session = new MediaSession(getContext(), tag);
+        MediaSession session = new MediaSession(getContext(), SESSION_TAG);
         MediaSession.Token sessionToken = session.getSessionToken();
 
         assertNotNull(sessionToken);
@@ -85,30 +94,28 @@
      * controller.
      */
     public void testConfigureSession() throws Exception {
-        String tag = "test session";
-        String key = "test-key";
-        String val = "test-val";
-        MediaSession session = new MediaSession(getContext(), tag);
+        MediaSession session = new MediaSession(getContext(), SESSION_TAG);
         MediaController controller = session.getController();
 
         // test setExtras
         Bundle extras = new Bundle();
-        extras.putString(key, val);
+        extras.putString(EXTRAS_KEY, EXTRAS_VALUE);
         session.setExtras(extras);
         Bundle extrasOut = controller.getExtras();
         assertNotNull(extrasOut);
-        assertEquals(val, extrasOut.get(key));
+        assertEquals(EXTRAS_VALUE, extrasOut.get(EXTRAS_KEY));
 
         // test setFlags
         session.setFlags(5);
         assertEquals(5, controller.getFlags());
 
         // test setMetadata
-        MediaMetadata metadata = new MediaMetadata.Builder().putString(key, val).build();
+        MediaMetadata metadata =
+                new MediaMetadata.Builder().putString(EXTRAS_KEY, EXTRAS_VALUE).build();
         session.setMetadata(metadata);
         MediaMetadata metadataOut = controller.getMetadata();
         assertNotNull(metadataOut);
-        assertEquals(val, metadataOut.getString(key));
+        assertEquals(EXTRAS_VALUE, metadataOut.getString(EXTRAS_KEY));
 
         // test setPlaybackState
         PlaybackState state = new PlaybackState.Builder().setActions(55).build();
@@ -135,27 +142,27 @@
         assertEquals(VolumeProvider.VOLUME_CONTROL_FIXED, info.getVolumeControl());
 
         // test setPlaybackToLocal
-        AudioAttributes attrs = new AudioAttributes.Builder().addTag(val).build();
+        AudioAttributes attrs = new AudioAttributes.Builder().addTag(EXTRAS_VALUE).build();
         session.setPlaybackToLocal(attrs);
         info = controller.getPlaybackInfo();
         assertNotNull(info);
         assertEquals(MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL, info.getPlaybackType());
         Set<String> tags = info.getAudioAttributes().getTags();
         assertNotNull(tags);
-        assertTrue(tags.contains(val));
+        assertTrue(tags.contains(EXTRAS_VALUE));
 
         // test setQueue and setQueueTitle
         ArrayList<MediaSession.QueueItem> queue = new ArrayList<MediaSession.QueueItem>();
         MediaSession.QueueItem item = new MediaSession.QueueItem(new MediaDescription.Builder()
-                .setMediaId(val).setTitle("title").build(), 11);
+                .setMediaId(EXTRAS_VALUE).setTitle("title").build(), 11);
         queue.add(item);
         session.setQueue(queue);
-        session.setQueueTitle(val);
+        session.setQueueTitle(EXTRAS_VALUE);
 
-        assertEquals(val, controller.getQueueTitle());
+        assertEquals(EXTRAS_VALUE, controller.getQueueTitle());
         assertEquals(1, controller.getQueue().size());
         assertEquals(11, controller.getQueue().get(0).getQueueId());
-        assertEquals(val, controller.getQueue().get(0).getDescription().getMediaId());
+        assertEquals(EXTRAS_VALUE, controller.getQueue().get(0).getDescription().getMediaId());
 
         session.setQueue(null);
         session.setQueueTitle(null);
@@ -170,6 +177,24 @@
         assertEquals(pi, controller.getSessionActivity());
     }
 
+    public void testSendSessionEvent() throws Exception {
+        MediaSession session = new MediaSession(getContext(), SESSION_TAG);
+        MediaController controller = new MediaController(getContext(), session.getSessionToken());
+        Object lock = new Object();
+        MediaControllerCallback callback = new MediaControllerCallback(lock);
+        controller.registerCallback(callback, mHandler);
+
+        Bundle extras = new Bundle();
+        extras.putString(EXTRAS_KEY, EXTRAS_VALUE);
+
+        synchronized (lock) {
+            session.sendSessionEvent(SESSION_EVENT, extras);
+            lock.wait(TIME_OUT_MS);
+            assertEquals(SESSION_EVENT, callback.mEvent);
+            assertEquals(EXTRAS_VALUE, callback.mExtras.getString(EXTRAS_KEY));
+        }
+    }
+
     /**
      * Verifies that a new session hasn't had any configuration bits set yet.
      *
@@ -201,4 +226,23 @@
         assertEquals(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC),
                 info.getCurrentVolume());
     }
+
+    private class MediaControllerCallback extends MediaController.Callback {
+        private Object mLock;
+        private String mEvent;
+        private Bundle mExtras;
+
+        MediaControllerCallback(Object lock) {
+            mLock = lock;
+        }
+
+        @Override
+        public void onSessionEvent(String event, Bundle extras) {
+            synchronized (mLock) {
+                mEvent = event;
+                mExtras = (Bundle) extras.clone();
+                mLock.notify();
+            }
+        }
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaSyncTest.java b/tests/tests/media/src/android/media/cts/MediaSyncTest.java
new file mode 100644
index 0000000..6f9e2a2
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MediaSyncTest.java
@@ -0,0 +1,745 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media.cts;
+
+import com.android.cts.media.R;
+
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.cts.util.MediaUtils;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecList;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.media.MediaSync;
+import android.media.MediaTimestamp;
+import android.media.PlaybackParams;
+import android.media.SyncParams;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+
+import java.io.IOException;
+import java.lang.Long;
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.List;
+import java.util.LinkedList;
+
+/**
+ * Tests for the MediaSync API and local video/audio playback.
+ *
+ * <p>The file in res/raw used by all tests are (c) copyright 2008,
+ * Blender Foundation / www.bigbuckbunny.org, and are licensed under the Creative Commons
+ * Attribution 3.0 License at http://creativecommons.org/licenses/by/3.0/us/.
+ */
+public class MediaSyncTest extends ActivityInstrumentationTestCase2<MediaStubActivity> {
+    private static final String LOG_TAG = "MediaSyncTest";
+
+    private final long NO_TIMESTAMP = -1;
+    private final int PLAYBACK_RATE_TOLERANCE_PERCENT = 2;
+    private final long TIME_MEASUREMENT_TOLERANCE_US = 20000;
+    final int INPUT_RESOURCE_ID =
+            R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+    private final int APPLICATION_AUDIO_PERIOD_MS = 200;
+    private final int TEST_MAX_SPEED = 2;
+    private static final float FLOAT_TOLERANCE = .00001f;
+
+    private Context mContext;
+    private Resources mResources;
+
+    private MediaStubActivity mActivity;
+
+    private MediaSync mMediaSync = null;
+    private Surface mSurface = null;
+    private AudioTrack mAudioTrack = null;
+
+    private Decoder mDecoderVideo = null;
+    private Decoder mDecoderAudio = null;
+    private boolean mHasAudio = false;
+    private boolean mHasVideo = false;
+    private boolean mEosAudio = false;
+    private boolean mEosVideo = false;
+    private final Object mConditionEos = new Object();
+    private final Object mConditionEosAudio = new Object();
+
+    private int mNumBuffersReturned = 0;
+
+    public MediaSyncTest() {
+        super(MediaStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        getInstrumentation().waitForIdleSync();
+        try {
+            runTestOnUiThread(new Runnable() {
+                public void run() {
+                    mMediaSync = new MediaSync();
+                }
+            });
+        } catch (Throwable e) {
+            e.printStackTrace();
+            fail();
+        }
+        mContext = getInstrumentation().getTargetContext();
+        mResources = mContext.getResources();
+        mDecoderVideo = new Decoder(this, mMediaSync, false);
+        mDecoderAudio = new Decoder(this, mMediaSync, true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mMediaSync != null) {
+            mMediaSync.release();
+            mMediaSync = null;
+        }
+        if (mDecoderAudio != null) {
+            mDecoderAudio.release();
+            mDecoderAudio = null;
+        }
+        if (mDecoderVideo != null) {
+            mDecoderVideo.release();
+            mDecoderVideo = null;
+        }
+        if (mSurface != null) {
+            mSurface.release();
+            mSurface = null;
+        }
+        mActivity = null;
+        super.tearDown();
+    }
+
+    private boolean reachedEos_l() {
+        return ((!mHasVideo || mEosVideo) && (!mHasAudio || mEosAudio));
+    }
+
+    public void onEos(Decoder decoder) {
+        synchronized(mConditionEosAudio) {
+            if (decoder == mDecoderAudio) {
+                mEosAudio = true;
+                mConditionEosAudio.notify();
+            }
+        }
+
+        synchronized(mConditionEos) {
+            if (decoder == mDecoderVideo) {
+                mEosVideo = true;
+            }
+            if (reachedEos_l()) {
+                mConditionEos.notify();
+            }
+        }
+    }
+
+    /**
+     * Tests setPlaybackParams is handled correctly for wrong rate.
+     */
+    public void testSetPlaybackParamsFail() throws InterruptedException {
+        final float rate = -1.0f;
+        try {
+            mMediaSync.setPlaybackParams(new PlaybackParams().setSpeed(rate));
+            fail("playback rate " + rate + " is not handled correctly");
+        } catch (IllegalArgumentException e) {
+        }
+
+        assertTrue("The stream in test file can not be decoded",
+                mDecoderAudio.setup(INPUT_RESOURCE_ID, null, Long.MAX_VALUE));
+
+        // get audio track.
+        mAudioTrack = mDecoderAudio.getAudioTrack();
+
+        mMediaSync.setAudioTrack(mAudioTrack);
+
+        try {
+            mMediaSync.setPlaybackParams(new PlaybackParams().setSpeed(rate));
+            fail("With audio track set, playback rate " + rate
+                    + " is not handled correctly");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    /**
+     * Tests setPlaybackParams is handled correctly for good rate without audio track set.
+     * The case for good rate with audio track set is tested in testPlaybackRate*.
+     */
+    public void testSetPlaybackParamsSucceed() throws InterruptedException {
+        final float rate = (float)TEST_MAX_SPEED;
+        try {
+            mMediaSync.setPlaybackParams(new PlaybackParams().setSpeed(rate));
+            PlaybackParams pbp = mMediaSync.getPlaybackParams();
+            assertEquals(rate, pbp.getSpeed(), FLOAT_TOLERANCE);
+        } catch (IllegalArgumentException e) {
+            fail("playback rate " + rate + " is not handled correctly");
+        }
+    }
+
+    /**
+     * Tests returning audio buffers correctly.
+     */
+    public void testAudioBufferReturn() throws InterruptedException {
+        final int timeOutMs = 10000;
+        boolean completed = runCheckAudioBuffer(INPUT_RESOURCE_ID, timeOutMs);
+        if (!completed) {
+            throw new RuntimeException("timed out waiting for audio buffer return");
+        }
+    }
+
+    private PlaybackParams PAUSED_RATE = new PlaybackParams().setSpeed(0.f);
+    private PlaybackParams NORMAL_RATE = new PlaybackParams().setSpeed(1.f);
+
+    private boolean runCheckAudioBuffer(int inputResourceId, int timeOutMs) {
+        final int NUM_LOOPS = 10;
+        final Object condition = new Object();
+
+        mHasAudio = true;
+        if (mDecoderAudio.setup(inputResourceId, null, Long.MAX_VALUE) == false) {
+            return true;
+        }
+
+        // get audio track.
+        mAudioTrack = mDecoderAudio.getAudioTrack();
+
+        mMediaSync.setAudioTrack(mAudioTrack);
+
+        mMediaSync.setCallback(new MediaSync.Callback() {
+            @Override
+            public void onAudioBufferConsumed(
+                    MediaSync sync, ByteBuffer byteBuffer, int bufferIndex) {
+                Decoder decoderAudio = mDecoderAudio;
+                if (decoderAudio != null) {
+                    decoderAudio.checkReturnedAudioBuffer(byteBuffer, bufferIndex);
+                    decoderAudio.releaseOutputBuffer(bufferIndex, NO_TIMESTAMP);
+                    synchronized (condition) {
+                        ++mNumBuffersReturned;
+                        if (mNumBuffersReturned >= NUM_LOOPS) {
+                            condition.notify();
+                        }
+                    }
+                }
+            }
+        }, null);
+
+        mMediaSync.setPlaybackParams(NORMAL_RATE);
+
+        synchronized (condition) {
+            mDecoderAudio.start();
+
+            try {
+                condition.wait(timeOutMs);
+            } catch (InterruptedException e) {
+            }
+            return (mNumBuffersReturned >= NUM_LOOPS);
+        }
+    }
+
+    /**
+     * Tests flush.
+     */
+    public void testFlush() throws InterruptedException {
+        final int timeOutMs = 5000;
+        boolean completed = runFlush(INPUT_RESOURCE_ID, timeOutMs);
+        if (!completed) {
+            throw new RuntimeException("timed out waiting for flush");
+        }
+    }
+
+    private boolean runFlush(int inputResourceId, int timeOutMs) {
+        final int INDEX_BEFORE_FLUSH = 1;
+        final int INDEX_AFTER_FLUSH = 2;
+        final int BUFFER_SIZE = 1024;
+        final int[] returnedIndex = new int[1];
+        final Object condition = new Object();
+
+        returnedIndex[0] = -1;
+
+        mHasAudio = true;
+        if (mDecoderAudio.setup(inputResourceId, null, Long.MAX_VALUE) == false) {
+            return true;
+        }
+
+        // get audio track.
+        mAudioTrack = mDecoderAudio.getAudioTrack();
+
+        mMediaSync.setAudioTrack(mAudioTrack);
+
+        mMediaSync.setCallback(new MediaSync.Callback() {
+            @Override
+            public void onAudioBufferConsumed(
+                    MediaSync sync, ByteBuffer byteBuffer, int bufferIndex) {
+                synchronized (condition) {
+                    if (returnedIndex[0] == -1) {
+                        returnedIndex[0] = bufferIndex;
+                        condition.notify();
+                    }
+                }
+            }
+        }, null);
+
+        mMediaSync.setOnErrorListener(new MediaSync.OnErrorListener() {
+            @Override
+            public void onError(MediaSync sync, int what, int extra) {
+                fail("got error from media sync (" + what + ", " + extra + ")");
+            }
+        }, null);
+
+        mMediaSync.setPlaybackParams(PAUSED_RATE);
+
+        ByteBuffer buffer1 = ByteBuffer.allocate(BUFFER_SIZE);
+        ByteBuffer buffer2 = ByteBuffer.allocate(BUFFER_SIZE);
+        mMediaSync.queueAudio(buffer1, INDEX_BEFORE_FLUSH, 0 /* presentationTimeUs */);
+        mMediaSync.flush();
+        mMediaSync.queueAudio(buffer2, INDEX_AFTER_FLUSH, 0 /* presentationTimeUs */);
+
+        synchronized (condition) {
+            mMediaSync.setPlaybackParams(NORMAL_RATE);
+
+            try {
+                condition.wait(timeOutMs);
+            } catch (InterruptedException e) {
+            }
+            return (returnedIndex[0] == INDEX_AFTER_FLUSH);
+        }
+    }
+
+    /**
+     * Tests playing back audio successfully.
+     */
+    public void testPlayVideo() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+               false /* audio */, true /* video */, 10000 /* timeOutMs */);
+    }
+
+    /**
+     * Tests playing back video successfully.
+     */
+    public void testPlayAudio() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+               true /* audio */, false /* video */, 10000 /* timeOutMs */);
+    }
+
+    /**
+     * Tests playing back audio and video successfully.
+     */
+    public void testPlayAudioAndVideo() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+               true /* audio */, true /* video */, 10000 /* timeOutMs */);
+    }
+
+    /**
+     * Tests playing at specified playback rate successfully.
+     */
+    public void testPlaybackRateQuarter() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 2000 /* lastBufferTimestampMs */,
+               true /* audio */, true /* video */, 10000 /* timeOutMs */,
+               0.25f /* playbackRate */);
+    }
+    public void testPlaybackRateHalf() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 4000 /* lastBufferTimestampMs */,
+               true /* audio */, true /* video */, 10000 /* timeOutMs */,
+               0.5f /* playbackRate */);
+    }
+    public void testPlaybackRateDouble() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 8000 /* lastBufferTimestampMs */,
+               true /* audio */, true /* video */, 10000 /* timeOutMs */,
+               (float)TEST_MAX_SPEED /* playbackRate */);
+    }
+
+    private void playAV(
+            final int inputResourceId,
+            final long lastBufferTimestampMs,
+            final boolean audio,
+            final boolean video,
+            int timeOutMs) throws InterruptedException {
+        playAV(inputResourceId, lastBufferTimestampMs, audio, video, timeOutMs, 1.0f);
+    }
+
+    private void playAV(
+            final int inputResourceId,
+            final long lastBufferTimestampMs,
+            final boolean audio,
+            final boolean video,
+            int timeOutMs,
+            final float playbackRate) throws InterruptedException {
+        final AtomicBoolean completed = new AtomicBoolean();
+        Thread decodingThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                completed.set(runPlayAV(inputResourceId, lastBufferTimestampMs * 1000,
+                        audio, video, playbackRate));
+            }
+        });
+        decodingThread.start();
+        decodingThread.join(timeOutMs);
+        if (!completed.get()) {
+            throw new RuntimeException("timed out decoding to end-of-stream");
+        }
+    }
+
+    private boolean runPlayAV(
+            int inputResourceId,
+            long lastBufferTimestampUs,
+            boolean audio,
+            boolean video,
+            float playbackRate) {
+        // allow 250ms for playback to get to stable state.
+        final int PLAYBACK_RAMP_UP_TIME_MS = 250;
+
+        final Object conditionFirstAudioBuffer = new Object();
+
+        if (video) {
+            mMediaSync.setSurface(mActivity.getSurfaceHolder().getSurface());
+            mSurface = mMediaSync.createInputSurface();
+
+            if (mDecoderVideo.setup(
+                    inputResourceId, mSurface, lastBufferTimestampUs) == false) {
+                return true;
+            }
+            mHasVideo = true;
+        }
+
+        if (audio) {
+            if (mDecoderAudio.setup(inputResourceId, null, lastBufferTimestampUs) == false) {
+                return true;
+            }
+
+            // get audio track.
+            mAudioTrack = mDecoderAudio.getAudioTrack();
+
+            mMediaSync.setAudioTrack(mAudioTrack);
+
+            mMediaSync.setCallback(new MediaSync.Callback() {
+                @Override
+                public void onAudioBufferConsumed(
+                        MediaSync sync, ByteBuffer byteBuffer, int bufferIndex) {
+                    Decoder decoderAudio = mDecoderAudio;
+                    if (decoderAudio != null) {
+                        decoderAudio.releaseOutputBuffer(bufferIndex, NO_TIMESTAMP);
+                    }
+                    synchronized (conditionFirstAudioBuffer) {
+                        conditionFirstAudioBuffer.notify();
+                    }
+                }
+            }, null);
+
+            mHasAudio = true;
+        }
+
+        SyncParams sync = new SyncParams().allowDefaults();
+        mMediaSync.setSyncParams(sync);
+        sync = mMediaSync.getSyncParams();
+
+        mMediaSync.setPlaybackParams(new PlaybackParams().setSpeed(playbackRate));
+
+        synchronized (conditionFirstAudioBuffer) {
+            if (video) {
+                mDecoderVideo.start();
+            }
+            if (audio) {
+                mDecoderAudio.start();
+
+                // wait for the first audio output buffer returned by media sync.
+                try {
+                    conditionFirstAudioBuffer.wait();
+                } catch (InterruptedException e) {
+                    Log.i(LOG_TAG, "worker thread is interrupted.");
+                    return true;
+                }
+            }
+        }
+
+        if (audio) {
+            try {
+                Thread.sleep(PLAYBACK_RAMP_UP_TIME_MS);
+            } catch (InterruptedException e) {
+                Log.i(LOG_TAG, "worker thread is interrupted during sleeping.");
+                return true;
+            }
+
+            MediaTimestamp mediaTimestamp = mMediaSync.getTimestamp();
+            assertTrue("No timestamp available for starting", mediaTimestamp != null);
+            long checkStartTimeRealUs = System.nanoTime() / 1000;
+            long checkStartTimeMediaUs = mediaTimestamp.mediaTimeUs;
+
+            synchronized (mConditionEosAudio) {
+                if (!mEosAudio) {
+                    try {
+                        mConditionEosAudio.wait();
+                    } catch (InterruptedException e) {
+                        Log.i(LOG_TAG, "worker thread is interrupted when waiting for audio EOS.");
+                        return true;
+                    }
+                }
+            }
+            mediaTimestamp = mMediaSync.getTimestamp();
+            assertTrue("No timestamp available for ending", mediaTimestamp != null);
+            long playTimeUs = System.nanoTime() / 1000 - checkStartTimeRealUs;
+            long mediaDurationUs = mediaTimestamp.mediaTimeUs - checkStartTimeMediaUs;
+            assertEquals("Mediasync had error in playback rate " + playbackRate
+                    + ", play time is " + playTimeUs + " vs expected " + mediaDurationUs,
+                    mediaDurationUs,
+                    playTimeUs * playbackRate,
+                    // sync.getTolerance() is MediaSync's tolerance of the playback rate, whereas
+                    // PLAYBACK_RATE_TOLERANCE_PERCENT / 100 is our test's tolerance.
+                    // We need to add both to get an upperbound for allowable error.
+                    mediaDurationUs * (sync.getTolerance() + PLAYBACK_RATE_TOLERANCE_PERCENT / 100)
+                            + TIME_MEASUREMENT_TOLERANCE_US);
+        }
+
+        boolean completed = false;
+        synchronized (mConditionEos) {
+            if (!reachedEos_l()) {
+                try {
+                    mConditionEos.wait();
+                } catch (InterruptedException e) {
+                }
+            }
+            completed = reachedEos_l();
+        }
+        return completed;
+    }
+
+    private class Decoder extends MediaCodec.Callback {
+        private final int NO_SAMPLE_RATE = -1;
+        private final int NO_BUFFER_INDEX = -1;
+
+        private MediaSyncTest mMediaSyncTest = null;
+        private MediaSync mMediaSync = null;
+        private boolean mIsAudio = false;
+        private long mLastBufferTimestampUs = 0;
+
+        private Surface mSurface = null;
+
+        private AudioTrack mAudioTrack = null;
+
+        private final Object mConditionCallback = new Object();
+        private MediaExtractor mExtractor = null;
+        private MediaCodec mDecoder = null;
+
+        private final Object mAudioBufferLock = new Object();
+        private List<AudioBuffer> mAudioBuffers = new LinkedList<AudioBuffer>();
+
+        // accessed only on callback thread.
+        private boolean mEos = false;
+        private boolean mSignaledEos = false;
+
+        private class AudioBuffer {
+            public ByteBuffer mByteBuffer;
+            public int mBufferIndex;
+
+            public AudioBuffer(ByteBuffer byteBuffer, int bufferIndex) {
+                mByteBuffer = byteBuffer;
+                mBufferIndex = bufferIndex;
+            }
+        }
+
+        Decoder(MediaSyncTest test, MediaSync sync, boolean isAudio) {
+            mMediaSyncTest = test;
+            mMediaSync = sync;
+            mIsAudio = isAudio;
+        }
+
+        public boolean setup(int inputResourceId, Surface surface, long lastBufferTimestampUs) {
+            if (!mIsAudio) {
+                mSurface = surface;
+            }
+            mLastBufferTimestampUs = lastBufferTimestampUs;
+            try {
+                // get extrator.
+                String type = mIsAudio ? "audio/" : "video/";
+                mExtractor = MediaUtils.createMediaExtractorForMimeType(
+                        mContext, inputResourceId, type);
+
+                // get decoder.
+                MediaFormat mediaFormat =
+                    mExtractor.getTrackFormat(mExtractor.getSampleTrackIndex());
+                String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME);
+                if (!MediaUtils.hasDecoder(mimeType)) {
+                    Log.i(LOG_TAG, "No decoder found for mimeType= " + mimeType);
+                    return false;
+                }
+                mDecoder = MediaCodec.createDecoderByType(mimeType);
+                mDecoder.configure(mediaFormat, mSurface, null, 0);
+                mDecoder.setCallback(this);
+
+                return true;
+            } catch (IOException e) {
+                throw new RuntimeException("error reading input resource", e);
+            }
+        }
+
+        public void start() {
+            if (mDecoder != null) {
+                mDecoder.start();
+            }
+        }
+
+        public void release() {
+            synchronized (mConditionCallback) {
+                if (mDecoder != null) {
+                    try {
+                        mDecoder.stop();
+                    } catch (IllegalStateException e) {
+                    }
+                    mDecoder.release();
+                    mDecoder = null;
+                }
+                if (mExtractor != null) {
+                    mExtractor.release();
+                    mExtractor = null;
+                }
+            }
+
+            if (mAudioTrack != null) {
+                mAudioTrack.release();
+                mAudioTrack = null;
+            }
+        }
+
+        public AudioTrack getAudioTrack() {
+            if (!mIsAudio) {
+                throw new RuntimeException("can not create audio track for video");
+            }
+
+            if (mExtractor == null) {
+                throw new RuntimeException("extrator is null");
+            }
+
+            if (mAudioTrack == null) {
+                MediaFormat mediaFormat =
+                    mExtractor.getTrackFormat(mExtractor.getSampleTrackIndex());
+                int sampleRateInHz = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
+                int channelConfig = (mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT) == 1 ?
+                        AudioFormat.CHANNEL_OUT_MONO : AudioFormat.CHANNEL_OUT_STEREO);
+                int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
+                int minBufferSizeInBytes = AudioTrack.getMinBufferSize(
+                        sampleRateInHz,
+                        channelConfig,
+                        audioFormat);
+                final int frameCount = APPLICATION_AUDIO_PERIOD_MS * sampleRateInHz / 1000;
+                final int frameSizeInBytes = Integer.bitCount(channelConfig)
+                        * AudioFormat.getBytesPerSample(audioFormat);
+                // ensure we consider application requirements for writing audio data
+                minBufferSizeInBytes = TEST_MAX_SPEED /* speed influences buffer size */
+                        * Math.max(minBufferSizeInBytes, frameCount * frameSizeInBytes);
+                mAudioTrack = new AudioTrack(
+                        AudioManager.STREAM_MUSIC,
+                        sampleRateInHz,
+                        channelConfig,
+                        audioFormat,
+                        minBufferSizeInBytes,
+                        AudioTrack.MODE_STREAM);
+            }
+
+            return mAudioTrack;
+        }
+
+        public void releaseOutputBuffer(int bufferIndex, long renderTimestampNs) {
+            synchronized (mConditionCallback) {
+                if (mDecoder != null) {
+                    if (renderTimestampNs == NO_TIMESTAMP) {
+                        mDecoder.releaseOutputBuffer(bufferIndex, false /* render */);
+                    } else {
+                        mDecoder.releaseOutputBuffer(bufferIndex, renderTimestampNs);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void onError(MediaCodec codec, MediaCodec.CodecException e) {
+        }
+
+        @Override
+        public void onInputBufferAvailable(MediaCodec codec, int index) {
+            synchronized (mConditionCallback) {
+                if (mExtractor == null || mExtractor.getSampleTrackIndex() == -1
+                        || mSignaledEos || mDecoder != codec) {
+                    return;
+                }
+
+                ByteBuffer buffer = codec.getInputBuffer(index);
+                int size = mExtractor.readSampleData(buffer, 0);
+                long timestampUs = mExtractor.getSampleTime();
+                mExtractor.advance();
+                mSignaledEos = mExtractor.getSampleTrackIndex() == -1
+                        || timestampUs >= mLastBufferTimestampUs;
+                codec.queueInputBuffer(
+                        index,
+                        0,
+                        size,
+                        timestampUs,
+                        mSignaledEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+            }
+        }
+
+        @Override
+        public void onOutputBufferAvailable(
+                MediaCodec codec, int index, MediaCodec.BufferInfo info) {
+            synchronized (mConditionCallback) {
+                if (mEos || mDecoder != codec) {
+                    return;
+                }
+
+                mEos = (info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
+
+                if (info.size > 0) {
+                    if (mIsAudio) {
+                        ByteBuffer outputByteBuffer = codec.getOutputBuffer(index);
+                        synchronized(mAudioBufferLock) {
+                            mAudioBuffers.add(new AudioBuffer(outputByteBuffer, index));
+                        }
+                        mMediaSync.queueAudio(
+                                outputByteBuffer,
+                                index,
+                                info.presentationTimeUs);
+                    } else {
+                        codec.releaseOutputBuffer(index, info.presentationTimeUs * 1000);
+                    }
+                } else {
+                    codec.releaseOutputBuffer(index, false);
+                }
+            }
+
+            if (mEos) {
+                mMediaSyncTest.onEos(this);
+            }
+        }
+
+        @Override
+        public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
+        }
+
+        public void checkReturnedAudioBuffer(ByteBuffer byteBuffer, int bufferIndex) {
+            synchronized(mAudioBufferLock) {
+                AudioBuffer audioBuffer = mAudioBuffers.get(0);
+                if (audioBuffer.mByteBuffer != byteBuffer
+                        || audioBuffer.mBufferIndex != bufferIndex) {
+                    fail("returned buffer doesn't match what's sent");
+                }
+                mAudioBuffers.remove(0);
+            }
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/MidiSoloTest.java b/tests/tests/media/src/android/media/cts/MidiSoloTest.java
new file mode 100644
index 0000000..4c1a5e8
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MidiSoloTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import java.io.IOException;
+
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.cts.util.CtsAndroidTestCase;
+import android.media.midi.MidiDevice;
+import android.media.midi.MidiDevice.MidiConnection;
+import android.media.midi.MidiDeviceInfo;
+import android.media.midi.MidiDeviceStatus;
+import android.media.midi.MidiInputPort;
+import android.media.midi.MidiManager;
+import android.media.midi.MidiReceiver;
+import android.media.midi.MidiSender;
+import android.os.Handler;
+import android.os.Looper;
+
+/**
+ * Test MIDI when there may be no MIDI devices available. There is not much we
+ * can test without a device.
+ */
+public class MidiSoloTest extends CtsAndroidTestCase {
+    private static final String TAG = "MidiSoloTest";
+    private final static int LOCAL_STORAGE_SIZE = 256;
+
+    // Store received data so we can check it later.
+    class MyMidiReceiver extends MidiReceiver {
+        public int byteCount;
+        public byte[] data = new byte[LOCAL_STORAGE_SIZE];
+
+        public MyMidiReceiver(int maxMessageSize) {
+            super(maxMessageSize);
+        }
+
+        @Override
+        // Abstract method declared in MidiReceiver
+        public void onSend(byte[] msg, int offset, int count, long timestamp)
+                throws IOException {
+            assertTrue("Message too large.", (count <= getMaxMessageSize()));
+            try {
+                System.arraycopy(msg, offset, data, byteCount, count);
+            } catch (ArrayIndexOutOfBoundsException e) {
+                throw new IOException("Exceeded local storage.", e);
+            }
+            byteCount += count;
+        }
+
+        @Override
+        public void onFlush() {
+            byteCount = 0;
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        // setup for each test case.
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Test case clean up.
+        super.tearDown();
+    }
+
+    public void testMidiManager() throws Exception {
+        PackageManager pm = getContext().getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiManager midiManager = (MidiManager) getContext().getSystemService(
+                Context.MIDI_SERVICE);
+        assertTrue("MidiManager not supported.", midiManager != null);
+
+        MidiDeviceInfo[] infos = midiManager.getDevices();
+        assertTrue("Device list was null.", infos != null);
+
+        MidiManager.DeviceCallback callback = new MidiManager.DeviceCallback();
+
+        // These should not crash.
+        midiManager.unregisterDeviceCallback(null);
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.registerDeviceCallback(null, null);
+        midiManager.registerDeviceCallback(callback, null);
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.registerDeviceCallback(callback, new Handler(Looper.getMainLooper()));
+        midiManager.registerDeviceCallback(callback, new Handler(Looper.getMainLooper()));
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.registerDeviceCallback(null, new Handler(Looper.getMainLooper()));
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.unregisterDeviceCallback(null);
+    }
+
+    public void testMidiReceiver() throws Exception {
+        PackageManager pm = getContext().getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiReceiver receiver = new MidiReceiver() {
+                @Override
+            public void onSend(byte[] msg, int offset, int count,
+                    long timestamp) throws IOException {
+            }
+        };
+        assertEquals("MidiReceiver default size wrong.", Integer.MAX_VALUE,
+                receiver.getMaxMessageSize());
+
+        int maxSize = 11;
+        MyMidiReceiver myReceiver = new MyMidiReceiver(maxSize);
+        assertEquals("MidiReceiver set size wrong.", maxSize,
+                myReceiver.getMaxMessageSize());
+
+        // Fill array with predictable data.
+        byte[] bar = new byte[200];
+        for (int i = 0; i < bar.length; i++) {
+            bar[i] = (byte) (i ^ 15);
+        }
+        // Small message with no offset.
+        int offset = 0;
+        int count = 3;
+        checkReceivedData(myReceiver, bar, offset, count);
+
+        // Small with an offset.
+        offset = 50;
+        count = 3;
+        checkReceivedData(myReceiver, bar, offset, count);
+
+        // Entire array.
+        offset = 0;
+        count = bar.length;
+        checkReceivedData(myReceiver, bar, offset, count);
+
+        offset = 20;
+        count = 100;
+        checkReceivedData(myReceiver, bar, offset, count);
+    }
+
+    public void testMidiReceiverException() throws Exception {
+        PackageManager pm = getContext().getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        int maxSize = 11;
+        MyMidiReceiver myReceiver = new MyMidiReceiver(maxSize);
+        assertEquals("MidiReceiver set size wrong.", maxSize,
+                myReceiver.getMaxMessageSize());
+
+        // Fill array with predictable data.
+        byte[] bar = new byte[200];
+        int offset = 0;
+        int count = bar.length;
+        myReceiver.flush(); // reset byte counter
+        IOException exception = null;
+        // Send too much data and intentionally cause an IOException.
+        try {
+            int sent = 0;
+            while (sent < LOCAL_STORAGE_SIZE) {
+                myReceiver.send(bar, offset, count);
+                sent += count;
+            }
+        } catch (IOException e) {
+            exception = e;
+        }
+        assertTrue("We should have caught an IOException", exception != null);
+    }
+
+    // Does the data we sent match the data received by the MidiReceiver?
+    private void checkReceivedData(MyMidiReceiver myReceiver, byte[] bar,
+            int offset, int count) throws IOException {
+        myReceiver.flush(); // reset byte counter
+        assertEquals("MidiReceiver flush ", 0, myReceiver.byteCount);
+        myReceiver.send(bar, offset, count);
+        // Did we get all the data
+        assertEquals("MidiReceiver count ", count, myReceiver.byteCount);
+        for (int i = 0; i < count; i++) {
+            assertEquals("MidiReceiver byte " + i + " + " + offset,
+                    bar[i + offset], myReceiver.data[i]);
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ParamsTest.java b/tests/tests/media/src/android/media/cts/ParamsTest.java
new file mode 100644
index 0000000..5e32828
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ParamsTest.java
@@ -0,0 +1,374 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import com.android.cts.media.R;
+
+import android.media.PlaybackParams;
+import android.media.SyncParams;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+
+/**
+ * General Params tests.
+ *
+ * In particular, check Params objects' behavior.
+ */
+public class ParamsTest extends AndroidTestCase {
+    private static final String TAG = "ParamsTest";
+    private static final float FLOAT_TOLERANCE = .00001f;
+    private static final float MAX_DEFAULT_TOLERANCE = 1/24.f;
+
+    public void testSyncParamsConstants() {
+        assertEquals(0, SyncParams.SYNC_SOURCE_DEFAULT);
+        assertEquals(1, SyncParams.SYNC_SOURCE_SYSTEM_CLOCK);
+        assertEquals(2, SyncParams.SYNC_SOURCE_AUDIO);
+        assertEquals(3, SyncParams.SYNC_SOURCE_VSYNC);
+
+        assertEquals(0, SyncParams.AUDIO_ADJUST_MODE_DEFAULT);
+        assertEquals(1, SyncParams.AUDIO_ADJUST_MODE_STRETCH);
+        assertEquals(2, SyncParams.AUDIO_ADJUST_MODE_RESAMPLE);
+    }
+
+    public void testSyncParamsDefaults() {
+        SyncParams p = new SyncParams();
+        try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+        try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+        try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+        try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+
+        SyncParams q = p.allowDefaults();
+        assertSame(p, q);
+        assertEquals(p.AUDIO_ADJUST_MODE_DEFAULT, p.getAudioAdjustMode());
+        assertEquals(p.SYNC_SOURCE_DEFAULT,       p.getSyncSource());
+        assertTrue(p.getTolerance() >= 0.f
+                && p.getTolerance() < MAX_DEFAULT_TOLERANCE + FLOAT_TOLERANCE);
+        try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+    }
+
+    public void testSyncParamsAudioAdjustMode() {
+        // setting this cannot fail
+        SyncParams p = new SyncParams();
+        for (int i : new int[] {
+                SyncParams.AUDIO_ADJUST_MODE_STRETCH,
+                SyncParams.AUDIO_ADJUST_MODE_RESAMPLE,
+                -1 /* invalid */}) {
+            SyncParams q = p.setAudioAdjustMode(i); // verify both initial set and update
+            assertSame(p, q);
+            assertEquals(i, p.getAudioAdjustMode());
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+        }
+    }
+
+    public void testSyncParamsSyncSource() {
+        // setting this cannot fail
+        SyncParams p = new SyncParams();
+        for (int i : new int[] {
+                SyncParams.SYNC_SOURCE_SYSTEM_CLOCK,
+                SyncParams.SYNC_SOURCE_AUDIO,
+                -1 /* invalid */}) {
+            SyncParams q = p.setSyncSource(i); // verify both initial set and update
+            assertSame(p, q);
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            assertEquals(i, p.getSyncSource());
+            try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+        }
+    }
+
+    public void testSyncParamsTolerance() {
+        // this can fail on values not in [0, 1)
+
+        // test good values
+        SyncParams p = new SyncParams();
+        float lastValue = 2.f; /* some initial value to avoid compile error */
+        for (float f : new float[] { 0.f, .1f, .9999f }) {
+            SyncParams q = p.setTolerance(f); // verify both initial set and update
+            assertSame(p, q);
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            assertEquals(f, p.getTolerance(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+            lastValue = f;
+        }
+
+        // test bad values - these should have no effect
+        boolean update = true;
+        for (float f : new float[] { -.0001f, 1.f }) {
+            try {
+                p.setTolerance(f);
+                fail("set tolerance to " + f);
+            } catch (IllegalArgumentException e) {}
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            if (update) {
+                // if updating, last value should remain
+                assertEquals(lastValue, p.getTolerance(), FLOAT_TOLERANCE);
+            } else {
+                // otherwise, it should remain undefined
+                try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            }
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+
+            // no longer updating in subsequent iterations
+            p = new SyncParams();
+            update = false;
+        }
+    }
+
+    public void testSyncParamsFrameRate() {
+        // setting this cannot fail, but negative values may be normalized to some negative value
+        SyncParams p = new SyncParams();
+        for (float f : new float[] { 0.f, .0001f, 30.f, 300.f, -.0001f, -1.f }) {
+            SyncParams q = p.setFrameRate(f);
+            assertSame(p, q);
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            if (f >= 0) {
+                assertEquals(f, p.getFrameRate(), FLOAT_TOLERANCE);
+            } else {
+                assertTrue(p.getFrameRate() < 0.f);
+            }
+        }
+    }
+
+    public void testSyncParamsMultipleSettings() {
+        {
+            SyncParams p = new SyncParams();
+            p.setAudioAdjustMode(p.AUDIO_ADJUST_MODE_STRETCH);
+            SyncParams q = p.setTolerance(.5f);
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_ADJUST_MODE_STRETCH, p.getAudioAdjustMode());
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            assertEquals(.5f, p.getTolerance(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+
+            // allowDefaults should not change set values
+            q = p.allowDefaults();
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_ADJUST_MODE_STRETCH, p.getAudioAdjustMode());
+            assertEquals(p.SYNC_SOURCE_DEFAULT, p.getSyncSource());
+            assertEquals(.5f, p.getTolerance(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+        }
+
+        {
+            SyncParams p = new SyncParams();
+            p.setSyncSource(p.SYNC_SOURCE_VSYNC);
+            SyncParams q = p.setFrameRate(25.f);
+            assertSame(p, q);
+
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            assertEquals(p.SYNC_SOURCE_VSYNC, p.getSyncSource());
+            try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            assertEquals(25.f, p.getFrameRate(), FLOAT_TOLERANCE);
+
+            // allowDefaults should not change set values
+            q = p.allowDefaults();
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_ADJUST_MODE_DEFAULT, p.getAudioAdjustMode());
+            assertEquals(p.SYNC_SOURCE_VSYNC, p.getSyncSource());
+            assertTrue(p.getTolerance() >= 0.f
+                    && p.getTolerance() < MAX_DEFAULT_TOLERANCE + FLOAT_TOLERANCE);
+            assertEquals(25.f, p.getFrameRate(), FLOAT_TOLERANCE);
+        }
+    }
+
+    public void testPlaybackParamsConstants() {
+        assertEquals(0, PlaybackParams.AUDIO_STRETCH_MODE_DEFAULT);
+        assertEquals(1, PlaybackParams.AUDIO_STRETCH_MODE_VOICE);
+
+        assertEquals(0, PlaybackParams.AUDIO_FALLBACK_MODE_DEFAULT);
+        assertEquals(1, PlaybackParams.AUDIO_FALLBACK_MODE_MUTE);
+        assertEquals(2, PlaybackParams.AUDIO_FALLBACK_MODE_FAIL);
+    }
+
+    public void testPlaybackParamsDefaults() {
+        PlaybackParams p = new PlaybackParams();
+        try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+        try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+        try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+        try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+
+        PlaybackParams q = p.allowDefaults();
+        assertSame(p, q);
+        assertEquals(p.AUDIO_FALLBACK_MODE_DEFAULT, p.getAudioFallbackMode());
+        assertEquals(p.AUDIO_STRETCH_MODE_DEFAULT,  p.getAudioStretchMode());
+        assertEquals(1.f, p.getPitch(), FLOAT_TOLERANCE);
+        assertEquals(1.f, p.getSpeed(), FLOAT_TOLERANCE);
+    }
+
+    public void testPlaybackParamsAudioFallbackMode() {
+        // setting this cannot fail
+        PlaybackParams p = new PlaybackParams();
+        for (int i : new int[] {
+                PlaybackParams.AUDIO_FALLBACK_MODE_MUTE,
+                PlaybackParams.AUDIO_FALLBACK_MODE_FAIL,
+                -1 /* invalid */}) {
+            PlaybackParams q = p.setAudioFallbackMode(i); // verify both initial set and update
+            assertSame(p, q);
+            assertEquals(i, p.getAudioFallbackMode());
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+        }
+    }
+
+    public void testPlaybackParamsAudioStretchMode() {
+        // setting this cannot fail
+        PlaybackParams p = new PlaybackParams();
+        for (int i : new int[] {
+                PlaybackParams.AUDIO_STRETCH_MODE_DEFAULT,
+                PlaybackParams.AUDIO_STRETCH_MODE_VOICE,
+                -1 /* invalid */}) {
+            PlaybackParams q = p.setAudioStretchMode(i); // verify both initial set and update
+            assertSame(p, q);
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            assertEquals(i, p.getAudioStretchMode());
+            try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+        }
+    }
+
+    public void testPlaybackParamsPitch() {
+        // this can fail on values not in [0, Inf)
+
+        // test good values
+        PlaybackParams p = new PlaybackParams();
+        float lastValue = 2.f; /* some initial value to avoid compile error */
+        for (float f : new float[] { 0.f, .1f, 9999.f }) {
+            PlaybackParams q = p.setPitch(f); // verify both initial set and update
+            assertSame(p, q);
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            assertEquals(f, p.getPitch(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+            lastValue = f;
+        }
+
+        // test bad values - these should have no effect
+        boolean update = true;
+        for (float f : new float[] { -.0001f, -1.f }) {
+            try {
+                p.setPitch(f);
+                fail("set tolerance to " + f);
+            } catch (IllegalArgumentException e) {}
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            if (update) {
+                // if updating, last value should remain
+                assertEquals(lastValue, p.getPitch(), FLOAT_TOLERANCE);
+            } else {
+                // otherwise, it should remain undefined
+                try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            }
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+
+            // no longer updating in subsequent iterations
+            p = new PlaybackParams();
+            update = false;
+        }
+    }
+
+    public void testPlaybackParamsSpeed() {
+        // setting this cannot fail
+        PlaybackParams p = new PlaybackParams();
+        for (float f : new float[] { 0.f, .0001f, 30.f, 300.f, -.0001f, -1.f, -300.f }) {
+            PlaybackParams q = p.setSpeed(f);
+            assertSame(p, q);
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            assertEquals(f, p.getSpeed(), FLOAT_TOLERANCE);
+        }
+    }
+
+    public void testPlaybackParamsMultipleSettings() {
+        {
+            PlaybackParams p = new PlaybackParams();
+            p.setAudioFallbackMode(p.AUDIO_FALLBACK_MODE_MUTE);
+            PlaybackParams q = p.setPitch(.5f);
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_FALLBACK_MODE_MUTE, p.getAudioFallbackMode());
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            assertEquals(.5f, p.getPitch(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+
+            // allowDefaults should not change set values
+            q = p.allowDefaults();
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_FALLBACK_MODE_MUTE, p.getAudioFallbackMode());
+            assertEquals(p.AUDIO_STRETCH_MODE_DEFAULT, p.getAudioStretchMode());
+            assertEquals(.5f, p.getPitch(), FLOAT_TOLERANCE);
+            assertEquals(1.f, p.getSpeed(), FLOAT_TOLERANCE);
+        }
+
+        {
+            PlaybackParams p = new PlaybackParams();
+            p.setAudioStretchMode(p.AUDIO_STRETCH_MODE_VOICE);
+            PlaybackParams q = p.setSpeed(25.f);
+            assertSame(p, q);
+
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            assertEquals(p.AUDIO_STRETCH_MODE_VOICE, p.getAudioStretchMode());
+            try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            assertEquals(25.f, p.getSpeed(), FLOAT_TOLERANCE);
+
+            // allowDefaults should not change set values
+            q = p.allowDefaults();
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_FALLBACK_MODE_DEFAULT, p.getAudioFallbackMode());
+            assertEquals(p.AUDIO_STRETCH_MODE_VOICE, p.getAudioStretchMode());
+            assertEquals(1.f, p.getPitch(), FLOAT_TOLERANCE);
+            assertEquals(25.f, p.getSpeed(), FLOAT_TOLERANCE);
+        }
+    }
+
+    public void testPlaybackParamsDescribeContents() {
+        PlaybackParams p = new PlaybackParams();
+        assertEquals(0, p.describeContents());
+    }
+
+    public void testPlaybackParamsWriteToParcel() {
+        PlaybackParams p = new PlaybackParams();
+        p.setAudioFallbackMode(PlaybackParams.AUDIO_FALLBACK_MODE_FAIL);
+        p.setAudioStretchMode(PlaybackParams.AUDIO_STRETCH_MODE_VOICE);
+        p.setPitch(.5f);
+        p.setSpeed(.0001f);
+
+        Parcel parcel = Parcel.obtain();
+        p.writeToParcel(parcel, 0 /* flags */);
+        parcel.setDataPosition(0);
+        PlaybackParams q = PlaybackParams.CREATOR.createFromParcel(parcel);
+
+        assertEquals(p.getAudioFallbackMode(), q.getAudioFallbackMode());
+        assertEquals(p.getAudioStretchMode(), q.getAudioStretchMode());
+        assertEquals(p.getPitch(), q.getPitch());
+        assertEquals(p.getSpeed(), q.getSpeed());
+        parcel.recycle();
+    }
+
+}
diff --git a/tests/tests/media/src/android/media/cts/PostProcTestBase.java b/tests/tests/media/src/android/media/cts/PostProcTestBase.java
index ef87662..cefbbf4 100644
--- a/tests/tests/media/src/android/media/cts/PostProcTestBase.java
+++ b/tests/tests/media/src/android/media/cts/PostProcTestBase.java
@@ -40,30 +40,18 @@
     }
 
     protected boolean isBassBoostAvailable() {
-        if (!hasAudioOutput()) {
-            return false;
-        }
         return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_BASS_BOOST);
     }
 
     protected boolean isVirtualizerAvailable() {
-        if (!hasAudioOutput()) {
-            return false;
-        }
         return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_VIRTUALIZER);
     }
 
     protected boolean isPresetReverbAvailable() {
-        if (!hasAudioOutput()) {
-            return false;
-        }
         return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_PRESET_REVERB);
     }
 
     protected boolean isEnvReverbAvailable() {
-        if (!hasAudioOutput()) {
-            return false;
-        }
         return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_ENV_REVERB);
     }
 
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerStubActivity.java b/tests/tests/media/src/android/media/cts/ResourceManagerStubActivity.java
new file mode 100644
index 0000000..214ced4
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerStubActivity.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media.cts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import junit.framework.Assert;
+
+public class ResourceManagerStubActivity extends Activity {
+    private static final String TAG = "ResourceManagerStubActivity";
+    private final Object mFinishEvent = new Object();
+    private int[] mRequestCodes = {0, 1};
+    private boolean[] mResults = {false, false};
+    private int mNumResults = 0;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        Log.d(TAG, "Activity " + requestCode + " finished.");
+        mResults[requestCode] = (resultCode == RESULT_OK);
+        if (++mNumResults == mResults.length) {
+            synchronized (mFinishEvent) {
+                mFinishEvent.notify();
+            }
+        }
+    }
+
+    public boolean testReclaimResource() throws InterruptedException {
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                try {
+                    Context context = getApplicationContext();
+                    Intent intent1 = new Intent(context, ResourceManagerTestActivity1.class);
+                    startActivityForResult(intent1, mRequestCodes[0]);
+                    Thread.sleep(2000);  // wait for process to launch.
+
+                    Intent intent2 = new Intent(context, ResourceManagerTestActivity2.class);
+                    startActivityForResult(intent2, mRequestCodes[1]);
+
+                    synchronized (mFinishEvent) {
+                        mFinishEvent.wait();
+                    }
+                } catch(Exception e) {
+                    Log.d(TAG, "testReclaimResource got exception " + e.toString());
+                }
+            }
+        };
+        thread.start();
+        thread.join(10000);
+
+        for (int i = 0; i < mResults.length; ++i) {
+            Assert.assertTrue("Result from activity " + i + " is a fail.", mResults[i]);
+        }
+        return true;
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerTest.java b/tests/tests/media/src/android/media/cts/ResourceManagerTest.java
new file mode 100644
index 0000000..5170aac
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import android.os.Bundle;
+import android.test.ActivityInstrumentationTestCase2;
+
+public class ResourceManagerTest
+        extends ActivityInstrumentationTestCase2<ResourceManagerStubActivity> {
+
+    public ResourceManagerTest() {
+        super("com.android.cts.media", ResourceManagerStubActivity.class);
+    }
+
+    public void testReclaimResource() throws Exception {
+        Bundle extras = new Bundle();
+        ResourceManagerStubActivity activity = launchActivity(
+                "com.android.cts.media", ResourceManagerStubActivity.class, extras);
+        activity.testReclaimResource();
+        activity.finish();
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity1.java b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity1.java
new file mode 100644
index 0000000..aff3f03
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity1.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+public class ResourceManagerTestActivity1 extends ResourceManagerTestActivityBase {
+    private static final int MAX_INSTANCES = 32;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        TAG = "ResourceManagerTestActivity1";
+
+        Log.d(TAG, "onCreate called.");
+        super.onCreate(savedInstanceState);
+        moveTaskToBack(true);
+
+        if (allocateCodecs(MAX_INSTANCES) == MAX_INSTANCES) {
+            // haven't reached the limit with MAX_INSTANCES, report RESULT_OK directly and
+            // skip additional test.
+            setResult(Activity.RESULT_OK);
+            finish();
+        }
+        useCodecs();
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity2.java b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity2.java
new file mode 100644
index 0000000..f4c57f5
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity2.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+public class ResourceManagerTestActivity2 extends ResourceManagerTestActivityBase {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        TAG = "ResourceManagerTestActivity2";
+
+        Log.d(TAG, "onCreate called.");
+        super.onCreate(savedInstanceState);
+
+        if (allocateCodecs(1) == 1) {
+          setResult(Activity.RESULT_OK);
+          finish();
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerTestActivityBase.java b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivityBase.java
new file mode 100644
index 0000000..9c48fc4
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivityBase.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import android.app.Activity;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.VideoCapabilities;
+import android.media.MediaCodecList;
+import android.media.MediaFormat;
+import android.os.Bundle;
+import android.util.Log;
+import java.io.IOException;
+import java.util.Vector;
+
+public class ResourceManagerTestActivityBase extends Activity {
+    protected String TAG;
+    private static final int IFRAME_INTERVAL = 10;  // 10 seconds between I-frames
+    private static final String MIME = MediaFormat.MIMETYPE_VIDEO_AVC;
+
+    private Vector<MediaCodec> mCodecs = new Vector<MediaCodec>();
+
+    private class TestCodecCallback extends MediaCodec.Callback {
+        @Override
+        public void onInputBufferAvailable(MediaCodec codec, int index) {
+            Log.d(TAG, "onInputBufferAvailable " + codec.toString());
+        }
+
+        @Override
+        public void onOutputBufferAvailable(
+                MediaCodec codec, int index, MediaCodec.BufferInfo info) {
+            Log.d(TAG, "onOutputBufferAvailable " + codec.toString());
+        }
+
+        @Override
+        public void onError(MediaCodec codec, MediaCodec.CodecException e) {
+            Log.d(TAG, "onError " + codec.toString() + " errorCode " + e.getErrorCode());
+        }
+
+        @Override
+        public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
+            Log.d(TAG, "onOutputFormatChanged " + codec.toString());
+        }
+    }
+
+    private MediaCodec.Callback mCallback = new TestCodecCallback();
+
+    private static MediaFormat getTestFormat(VideoCapabilities vcaps) {
+        int maxWidth = vcaps.getSupportedWidths().getUpper();
+        int maxHeight = vcaps.getSupportedHeightsFor(maxWidth).getUpper();
+        int maxBitrate = vcaps.getBitrateRange().getUpper();
+        int maxFramerate = vcaps.getSupportedFrameRatesFor(maxWidth, maxHeight)
+                .getUpper().intValue();
+
+        MediaFormat format = MediaFormat.createVideoFormat(MIME, maxWidth, maxHeight);
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                CodecCapabilities.COLOR_FormatYUV420Flexible);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, maxBitrate);
+        format.setInteger(MediaFormat.KEY_FRAME_RATE, maxFramerate);
+        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
+        return format;
+    }
+
+    private MediaCodecInfo getTestCodecInfo() {
+        // Use avc decoder for testing.
+        boolean isEncoder = false;
+
+        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        for (MediaCodecInfo info : mcl.getCodecInfos()) {
+            if (info.isEncoder() != isEncoder) {
+                continue;
+            }
+            CodecCapabilities caps;
+            try {
+                caps = info.getCapabilitiesForType(MIME);
+            } catch (IllegalArgumentException e) {
+                // mime is not supported
+                continue;
+            }
+            return info;
+        }
+
+        return null;
+    }
+
+    protected int allocateCodecs(int max) {
+        MediaCodecInfo info = getTestCodecInfo();
+        if (info == null) {
+            // skip the test
+            return 0;
+        }
+
+        String name = info.getName();
+        VideoCapabilities vcaps = info.getCapabilitiesForType(MIME).getVideoCapabilities();
+        MediaFormat format = getTestFormat(vcaps);
+        for (int i = 0; i < max; ++i) {
+            try {
+                Log.d(TAG, "Create codec " + name + " #" + i);
+                MediaCodec codec = MediaCodec.createByCodecName(name);
+                codec.setCallback(mCallback);
+                Log.d(TAG, "Configure codec " + format);
+                codec.configure(format, null, null, 0);
+                Log.d(TAG, "Start codec " + format);
+                codec.start();
+                mCodecs.add(codec);
+            } catch (IllegalArgumentException e) {
+                Log.d(TAG, "IllegalArgumentException " + e.getMessage());
+                break;
+            } catch (IOException e) {
+                Log.d(TAG, "IOException " + e.getMessage());
+                break;
+            } catch (MediaCodec.CodecException e) {
+                Log.d(TAG, "CodecException 0x" + Integer.toHexString(e.getErrorCode()));
+                break;
+            }
+        }
+
+        return mCodecs.size();
+    }
+
+    private void doUseCodecs() {
+        int current = 0;
+        try {
+            for (current = 0; current < mCodecs.size(); ++current) {
+                mCodecs.get(current).getName();
+            }
+        } catch (MediaCodec.CodecException e) {
+            Log.d(TAG, "useCodecs got CodecException 0x" + Integer.toHexString(e.getErrorCode()));
+            if (e.getErrorCode() == MediaCodec.CodecException.ERROR_RECLAIMED) {
+                Log.d(TAG, "Remove codec " + current + " from the list");
+                mCodecs.remove(current);
+                setResult(Activity.RESULT_OK);
+                finish();
+            }
+            return;
+        }
+    }
+
+    private Thread mWorkerThread;
+    protected void useCodecs() {
+        mWorkerThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                while (true) {
+                    doUseCodecs();
+                }
+            }
+        });
+        mWorkerThread.start();
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.d(TAG, "onDestroy called.");
+        super.onDestroy();
+
+        for (int i = 0; i < mCodecs.size(); ++i) {
+            mCodecs.get(i).release();
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/RoutingTest.java b/tests/tests/media/src/android/media/cts/RoutingTest.java
new file mode 100644
index 0000000..c0e9a3e
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/RoutingTest.java
@@ -0,0 +1,351 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import android.media.AudioDeviceInfo;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+import android.media.AudioTrack;
+import android.media.MediaRecorder;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import android.test.AndroidTestCase;
+
+import android.util.Log;
+
+import java.lang.Runnable;
+
+/**
+ * TODO: Insert description here. (generated by pmclean)
+ */
+public class RoutingTest extends AndroidTestCase {
+    private static final String TAG = "RoutingTest";
+
+    private AudioManager mAudioManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // get the AudioManager
+        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        assertNotNull(mAudioManager);
+    }
+
+    private AudioTrack allocAudioTrack() {
+        int bufferSize =
+                AudioTrack.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_STEREO,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        AudioTrack audioTrack =
+            new AudioTrack(
+                AudioManager.STREAM_MUSIC,
+                41000,
+                AudioFormat.CHANNEL_OUT_STEREO,
+                AudioFormat.ENCODING_PCM_16BIT,
+                bufferSize,
+                AudioTrack.MODE_STREAM);
+        return audioTrack;
+    }
+
+    public void test_audioTrack_preferredDevice() {
+        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) {
+            // Can't do it so skip this test
+            return;
+        }
+
+        AudioTrack audioTrack = allocAudioTrack();
+        assertNotNull(audioTrack);
+
+        // None selected (new AudioTrack), so check for default
+        assertNull(audioTrack.getPreferredDevice());
+
+        // resets to default
+        assertTrue(audioTrack.setPreferredDevice(null));
+
+        // test each device
+        AudioDeviceInfo[] deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
+        for (int index = 0; index < deviceList.length; index++) {
+            assertTrue(audioTrack.setPreferredDevice(deviceList[index]));
+            assertTrue(audioTrack.getPreferredDevice() == deviceList[index]);
+        }
+
+        // Check defaults again
+        assertTrue(audioTrack.setPreferredDevice(null));
+        assertNull(audioTrack.getPreferredDevice());
+
+        audioTrack.release();
+    }
+
+    /*
+     * tests if the Looper for the current thread has been prepared,
+     * If not, it makes one, prepares it and returns it.
+     * If this returns non-null, the caller is reponsible for calling quit()
+     * on the returned Looper.
+     */
+    private Looper prepareIfNeededLooper() {
+        // non-null Handler
+        Looper myLooper = null;
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+            myLooper = Looper.myLooper();
+            assertNotNull(myLooper);
+        }
+        return myLooper;
+    }
+
+    private class AudioTrackRoutingListener implements AudioTrack.OnRoutingChangedListener {
+        public void onRoutingChanged(AudioTrack audioTrack) {}
+    }
+
+    public void test_audioTrack_RoutingListener() {
+        AudioTrack audioTrack = allocAudioTrack();
+
+        audioTrack.addOnRoutingChangedListener(null, null);
+
+        AudioTrackRoutingListener listener = new AudioTrackRoutingListener();
+        AudioTrackRoutingListener someOtherListener = new AudioTrackRoutingListener();
+
+        audioTrack.addOnRoutingChangedListener(listener, null);
+
+        // remove a listener we didn't add
+        audioTrack.removeOnRoutingChangedListener(someOtherListener);
+
+        audioTrack.removeOnRoutingChangedListener(listener);
+
+        Looper myLooper = prepareIfNeededLooper();
+        audioTrack.addOnRoutingChangedListener(listener, new Handler());
+
+        audioTrack.removeOnRoutingChangedListener(listener);
+
+        audioTrack.release();
+        if (myLooper != null) {
+            myLooper.quit();
+        }
+   }
+
+    private AudioRecord allocAudioRecord() {
+        int bufferSize =
+                AudioRecord.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_DEFAULT,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        AudioRecord audioRecord =
+            new AudioRecord(
+                MediaRecorder.AudioSource.DEFAULT,
+                41000, AudioFormat.CHANNEL_OUT_DEFAULT,
+                AudioFormat.ENCODING_PCM_16BIT,
+                bufferSize);
+        return audioRecord;
+    }
+
+    private class AudioRecordRoutingListener implements AudioRecord.OnRoutingChangedListener {
+        public void onRoutingChanged(AudioRecord audioRecord) {}
+    }
+
+    public void test_audioRecord_RoutingListener() {
+        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            // Can't do it so skip this test
+            return;
+        }
+        AudioRecord audioRecord = allocAudioRecord();
+
+        audioRecord.addOnRoutingChangedListener(null, null);
+
+        AudioRecordRoutingListener listener = new AudioRecordRoutingListener();
+        AudioRecordRoutingListener someOtherListener = new AudioRecordRoutingListener();
+
+        audioRecord.addOnRoutingChangedListener(listener, null);
+
+        // remove a listener we didn't add
+        audioRecord.removeOnRoutingChangedListener(someOtherListener);
+
+        audioRecord.removeOnRoutingChangedListener(listener);
+
+        Looper myLooper = prepareIfNeededLooper();
+        audioRecord.addOnRoutingChangedListener(listener, new Handler());
+
+        audioRecord.removeOnRoutingChangedListener(listener);
+
+        audioRecord.release();
+        if (myLooper != null) {
+            myLooper.quit();
+        }
+    }
+
+    public void test_audioRecord_preferredDevice() {
+        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            // Can't do it so skip this test
+            return;
+        }
+
+        AudioRecord audioRecord = allocAudioRecord();
+        assertNotNull(audioRecord);
+
+        // None selected (new AudioRecord), so check for default
+        assertNull(audioRecord.getPreferredDevice());
+
+        // resets to default
+        assertTrue(audioRecord.setPreferredDevice(null));
+
+        // test each device
+        AudioDeviceInfo[] deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
+        for (int index = 0; index < deviceList.length; index++) {
+            assertTrue(audioRecord.setPreferredDevice(deviceList[index]));
+            assertTrue(audioRecord.getPreferredDevice() == deviceList[index]);
+        }
+
+        // Check defaults again
+        assertTrue(audioRecord.setPreferredDevice(null));
+        assertNull(audioRecord.getPreferredDevice());
+
+        audioRecord.release();
+    }
+
+    private class AudioTrackFiller implements Runnable {
+        AudioTrack mAudioTrack;
+        int mBufferSize;
+
+        boolean mPlaying;
+
+        short[] mAudioData;
+
+        public AudioTrackFiller(AudioTrack audioTrack, int bufferSize) {
+            mAudioTrack = audioTrack;
+            mBufferSize = bufferSize;
+            mPlaying = false;
+
+            // setup audio data (silence will suffice)
+            mAudioData = new short[mBufferSize];
+            for (int index = 0; index < mBufferSize; index++) {
+                mAudioData[index] = 0;
+            }
+        }
+
+        public void start() { mPlaying = true; }
+        public void stop() { mPlaying = false; }
+
+        @Override
+        public void run() {
+            while (mAudioTrack != null && mPlaying) {
+                mAudioTrack.write(mAudioData, 0, mBufferSize);
+            }
+        }
+    }
+
+    public void test_audioTrack_getRoutedDevice() {
+        int bufferSize =
+                AudioTrack.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_STEREO,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        AudioTrack audioTrack =
+            new AudioTrack(
+                AudioManager.STREAM_MUSIC,
+                41000,
+                AudioFormat.CHANNEL_OUT_STEREO,
+                AudioFormat.ENCODING_PCM_16BIT,
+                bufferSize,
+                AudioTrack.MODE_STREAM);
+
+        AudioTrackFiller filler = new AudioTrackFiller(audioTrack, bufferSize);
+        filler.start();
+
+        audioTrack.play();
+
+        Thread fillerThread = new Thread(filler);
+        fillerThread.start();
+
+        try { Thread.sleep(1000); } catch (InterruptedException ex) {}
+
+        // No explicit route
+        AudioDeviceInfo routedDevice = audioTrack.getRoutedDevice();
+        assertNotNull(routedDevice); // we probably can't say anything more than this
+
+        filler.stop();
+        audioTrack.stop();
+        audioTrack.release();
+    }
+
+    private class AudioRecordPuller implements Runnable {
+        AudioRecord mAudioRecord;
+        int mBufferSize;
+
+        boolean mRecording;
+
+        short[] mAudioData;
+
+        public AudioRecordPuller(AudioRecord audioRecord, int bufferSize) {
+            mAudioRecord = audioRecord;
+            mBufferSize = bufferSize;
+            mRecording = false;
+        }
+
+        public void start() { mRecording = true; }
+        public void stop() { mRecording = false; }
+
+        @Override
+        public void run() {
+            while (mAudioRecord != null && mRecording) {
+                mAudioRecord.read(mAudioData, 0, mBufferSize);
+           }
+        }
+    }
+
+    public void test_audioRecord_getRoutedDevice() {
+        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            return;
+        }
+
+        int bufferSize =
+                AudioRecord.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_DEFAULT,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        AudioRecord audioRecord =
+            new AudioRecord(
+                MediaRecorder.AudioSource.DEFAULT,
+                41000, AudioFormat.CHANNEL_OUT_DEFAULT,
+                AudioFormat.ENCODING_PCM_16BIT,
+                bufferSize);
+
+        AudioRecordPuller puller = new AudioRecordPuller(audioRecord, bufferSize);
+        puller.start();
+
+        audioRecord.startRecording();
+
+        Thread pullerThread = new Thread(puller);
+        pullerThread.start();
+
+        try { Thread.sleep(1000); } catch (InterruptedException ex) {}
+
+        // No explicit route
+        AudioDeviceInfo routedDevice = audioRecord.getRoutedDevice();
+        assertNotNull(routedDevice); // we probably can't say anything more than this
+
+        puller.stop();
+        audioRecord.stop();
+        audioRecord.release();
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/SoundPoolTest.java b/tests/tests/media/src/android/media/cts/SoundPoolTest.java
index 15d18a0..23c4a7c 100644
--- a/tests/tests/media/src/android/media/cts/SoundPoolTest.java
+++ b/tests/tests/media/src/android/media/cts/SoundPoolTest.java
@@ -21,6 +21,7 @@
 
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
+import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.media.SoundPool;
 import android.test.AndroidTestCase;
@@ -29,6 +30,8 @@
 import java.io.FileDescriptor;
 import java.io.FileOutputStream;
 import java.io.InputStream;
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
 
 abstract class SoundPoolTest extends AndroidTestCase {
 
@@ -230,6 +233,104 @@
         mSoundPool.release();
     }
 
+    public void testAutoPauseResume() throws Exception {
+        // The number of possible SoundPool streams simultaneously active is limited by
+        // track resources. Generally this is no greater than 32, but the actual
+        // amount may be less depending on concurrently running applications.
+        // Here we attempt to create more streams than what is normally possible;
+        // SoundPool should gracefully degrade to play those streams it can.
+        //
+        // Try to keep the maxStreams less than the number required to be active
+        // and certainly less than 20 to be cooperative to other applications.
+        final int TEST_STREAMS = 40;
+        SoundPool soundPool = null;
+        try {
+            soundPool = new SoundPool.Builder()
+                    .setAudioAttributes(new AudioAttributes.Builder().build())
+                    .setMaxStreams(TEST_STREAMS)
+                    .build();
+
+            // get our sounds
+            final int[] sounds = getSounds();
+
+            // set our completion listener
+            final int[] loadIds = new int[TEST_STREAMS];
+            final Object done = new Object();
+            final int[] loaded = new int[1]; // used as a "pointer" to an integer
+            final SoundPool fpool = soundPool; // final reference in scope of try block
+            soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
+                    @Override
+                    public void onLoadComplete(SoundPool pool, int sampleId, int status) {
+                        assertEquals(fpool, pool);
+                        assertEquals(0 /* success */, status);
+                        synchronized(done) {
+                            loadIds[loaded[0]++] = sampleId;
+                            if (loaded[0] == loadIds.length) {
+                                done.notify();
+                            }
+                        }
+                    }
+                });
+
+            // initiate loading
+            final int[] soundIds = new int[TEST_STREAMS];
+            for (int i = 0; i < soundIds.length; i++) {
+                soundIds[i] = soundPool.load(mContext, sounds[i % sounds.length], PRIORITY);
+            }
+
+            // wait for all sounds to load
+            final long LOAD_TIMEOUT_IN_MS = 10000;
+            final long startTime = System.currentTimeMillis();
+            synchronized(done) {
+                while (loaded[0] != soundIds.length) {
+                    final long waitTime =
+                            LOAD_TIMEOUT_IN_MS - (System.currentTimeMillis() - startTime);
+                    assertTrue(waitTime > 0);
+                    done.wait(waitTime);
+                }
+            }
+
+            // verify the Ids match (actually does sorting too)
+            Arrays.sort(loadIds);
+            Arrays.sort(soundIds);
+            assertTrue(Arrays.equals(loadIds, soundIds));
+
+            // play - should hear the following:
+            // 1 second of sound
+            // 1 second of silence
+            // 1 second of sound.
+            int[] streamIds = new int[soundIds.length];
+            for (int i = 0; i < soundIds.length; i++) {
+                streamIds[i] = soundPool.play(soundIds[i],
+                        0.5f /* leftVolume */, 0.5f /* rightVolume */, PRIORITY,
+                        -1 /* loop (infinite) */, 1.0f /* rate */);
+            }
+            Thread.sleep(1000 /* millis */);
+            soundPool.autoPause();
+            Thread.sleep(1000 /* millis */);
+            soundPool.autoResume();
+            Thread.sleep(1000 /* millis */);
+
+            // clean up
+            for (int stream : streamIds) {
+                assertTrue(stream != 0);
+                soundPool.stop(stream);
+            }
+            for (int sound : soundIds) {
+                assertEquals(true, soundPool.unload(sound));
+            }
+            // check to see we're really unloaded
+            for (int sound : soundIds) {
+                assertEquals(false, soundPool.unload(sound));
+            }
+        } finally {
+            if (soundPool != null) {
+                soundPool.release();
+                soundPool = null;
+            }
+        }
+    }
+
     /**
      * Load a sample and wait until it is ready to be played.
      * @return The sample ID.
diff --git a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
index dd7c1f6..7497da2 100644
--- a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
@@ -18,12 +18,16 @@
 import android.cts.util.MediaUtils;
 import android.media.MediaFormat;
 import android.media.MediaPlayer;
+import android.media.MediaPlayer.TrackInfo;
+import android.media.TimedMetaData;
 import android.os.Looper;
+import android.os.PowerManager;
 import android.os.SystemClock;
 import android.util.Log;
 import android.webkit.cts.CtsTestServer;
 
 import java.io.IOException;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Tests of MediaPlayer streaming capabilities.
@@ -307,6 +311,94 @@
         localHlsTest("hls.m3u8", false, true);
     }
 
+    public void testPlayHlsStreamWithTimedId3() throws Throwable {
+        mServer = new CtsTestServer(mContext);
+        try {
+            // counter must be final if we want to access it inside onTimedMetaData;
+            // use AtomicInteger so we can have a final counter object with mutable integer value.
+            final AtomicInteger counter = new AtomicInteger();
+            String stream_url = mServer.getAssetUrl("prog_index.m3u8");
+            mMediaPlayer.setDataSource(stream_url);
+            mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
+            mMediaPlayer.setScreenOnWhilePlaying(true);
+            mMediaPlayer.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
+            mMediaPlayer.setOnTimedMetaDataAvailableListener(new MediaPlayer.OnTimedMetaDataAvailableListener() {
+                @Override
+                public void onTimedMetaDataAvailable(MediaPlayer mp, TimedMetaData md) {
+                    counter.incrementAndGet();
+                    int pos = mp.getCurrentPosition();
+                    long timeUs = md.getTimestamp();
+                    byte[] rawData = md.getMetaData();
+                    // Raw data contains an id3 tag holding the decimal string representation of
+                    // the associated time stamp rounded to the closest half second.
+
+                    int offset = 0;
+                    offset += 3; // "ID3"
+                    offset += 2; // version
+                    offset += 1; // flags
+                    offset += 4; // size
+                    offset += 4; // "TXXX"
+                    offset += 4; // frame size
+                    offset += 2; // frame flags
+                    offset += 1; // "\x03" : UTF-8 encoded Unicode
+                    offset += 1; // "\x00" : null-terminated empty description
+
+                    int length = rawData.length;
+                    length -= offset;
+                    length -= 1; // "\x00" : terminating null
+
+                    String data = new String(rawData, offset, length);
+                    int dataTimeUs = Integer.parseInt(data);
+                    assertTrue("Timed ID3 timestamp does not match content",
+                            Math.abs(dataTimeUs - timeUs) < 500000);
+                    assertTrue("Timed ID3 arrives after timestamp", pos * 1000 < timeUs);
+                }
+            });
+
+            final Object completion = new Object();
+            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
+                int run;
+                @Override
+                public void onCompletion(MediaPlayer mp) {
+                    if (run++ == 0) {
+                        mMediaPlayer.seekTo(0);
+                        mMediaPlayer.start();
+                    } else {
+                        mMediaPlayer.stop();
+                        synchronized (completion) {
+                            completion.notify();
+                        }
+                    }
+                }
+            });
+
+            mMediaPlayer.prepare();
+            mMediaPlayer.start();
+            assertTrue("MediaPlayer not playing", mMediaPlayer.isPlaying());
+
+            int i = -1;
+            TrackInfo[] trackInfos = mMediaPlayer.getTrackInfo();
+            for (i = 0; i < trackInfos.length; i++) {
+                TrackInfo trackInfo = trackInfos[i];
+                if (trackInfo.getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_METADATA) {
+                    break;
+                }
+            }
+            assertTrue("Stream has no timed ID3 track", i >= 0);
+            mMediaPlayer.selectTrack(i);
+
+            synchronized (completion) {
+                completion.wait();
+            }
+
+            // There are a total of 19 metadata access units in the test stream; every one of them
+            // should be received twice: once before the seek and once after.
+            assertTrue("Incorrect number of timed ID3s recieved", counter.get() == 38);
+        } finally {
+            mServer.shutdown();
+        }
+    }
+
     private static class WorkerWithPlayer implements Runnable {
         private final Object mLock = new Object();
         private Looper mLooper;
diff --git a/tests/tests/media/src/android/media/cts/TestMediaDataSource.java b/tests/tests/media/src/android/media/cts/TestMediaDataSource.java
new file mode 100644
index 0000000..a10840b
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/TestMediaDataSource.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import android.content.res.AssetFileDescriptor;
+import android.media.cts.MediaPlayerTestBase.Monitor;
+import android.media.MediaDataSource;
+import android.util.Log;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * A MediaDataSource that reads from a byte array for use in tests.
+ */
+public class TestMediaDataSource extends MediaDataSource {
+    private static final String TAG = "TestMediaDataSource";
+
+    private byte[] mData;
+
+    private boolean mThrowFromReadAt;
+    private boolean mThrowFromGetSize;
+    private Integer mReturnFromReadAt;
+    private Long mReturnFromGetSize;
+    private boolean mIsClosed;
+
+    // Read an asset fd into a new byte array data source. Closes afd.
+    public static TestMediaDataSource fromAssetFd(AssetFileDescriptor afd) throws IOException {
+        try {
+            InputStream in = afd.createInputStream();
+            final int size = (int) afd.getDeclaredLength();
+            byte[] data = new byte[(int) size];
+            int writeIndex = 0;
+            int numRead = 0;
+            do {
+                numRead = in.read(data, writeIndex, size - writeIndex);
+                writeIndex += numRead;
+            } while (numRead >= 0);
+            return new TestMediaDataSource(data);
+        } finally {
+            afd.close();
+        }
+    }
+
+    public TestMediaDataSource(byte[] data) {
+        mData = data;
+    }
+
+    @Override
+    public synchronized int readAt(long position, byte[] buffer, int offset, int size)
+            throws IOException {
+        if (mThrowFromReadAt) {
+            throw new IOException("Test exception from readAt()");
+        }
+        if (mReturnFromReadAt != null) {
+            return mReturnFromReadAt;
+        }
+
+        // Clamp reads past the end of the source.
+        if (position >= mData.length) {
+            return -1; // -1 indicates EOF
+        }
+        if (position + size > mData.length) {
+            size -= (position + size) - mData.length;
+        }
+        System.arraycopy(mData, (int)position, buffer, offset, size);
+        return size;
+    }
+
+    @Override
+    public synchronized long getSize() throws IOException {
+        if (mThrowFromGetSize) {
+            throw new IOException("Test exception from getSize()");
+        }
+        if (mReturnFromGetSize != null) {
+            return mReturnFromGetSize;
+        }
+
+        Log.v(TAG, "getSize: " + mData.length);
+        return mData.length;
+    }
+
+    // Note: it's fine to keep using this data source after closing it.
+    @Override
+    public synchronized void close() {
+        Log.v(TAG, "close()");
+        mIsClosed = true;
+    }
+
+    // Whether close() has been called.
+    public synchronized boolean isClosed() {
+        return mIsClosed;
+    }
+
+    public void throwFromReadAt() {
+        mThrowFromReadAt = true;
+    }
+
+    public void throwFromGetSize() {
+        mThrowFromGetSize = true;
+    }
+
+    public void returnFromReadAt(int numRead) {
+        mReturnFromReadAt = numRead;
+    }
+
+    public void returnFromGetSize(long size) {
+        mReturnFromGetSize = size;
+    }
+}
+
diff --git a/tests/tests/media/src/android/media/cts/VisualizerTest.java b/tests/tests/media/src/android/media/cts/VisualizerTest.java
index 3c639a0..0d46ca7 100644
--- a/tests/tests/media/src/android/media/cts/VisualizerTest.java
+++ b/tests/tests/media/src/android/media/cts/VisualizerTest.java
@@ -55,9 +55,6 @@
 
     //Test case 0.0: test constructor and release
     public void test0_0ConstructorAndRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         Visualizer visualizer = null;
         try {
             visualizer = new Visualizer(0);
@@ -79,9 +76,6 @@
 
     //Test case 1.0: capture rates
     public void test1_0CaptureRates() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getVisualizer(0);
         try {
             int captureRate = mVisualizer.getMaxCaptureRate();
@@ -101,9 +95,6 @@
 
     //Test case 1.1: test capture size
     public void test1_1CaptureSize() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getVisualizer(0);
         try {
             int[] range = mVisualizer.getCaptureSizeRange();
@@ -135,6 +126,8 @@
     //Test case 2.0: test capture in polling mode
     public void test2_0PollingCapture() throws Exception {
         if (!hasAudioOutput()) {
+            Log.w(TAG,"AUDIO_OUTPUT feature not found. This system might not have a valid "
+                    + "audio output HAL");
             return;
         }
         try {
@@ -165,6 +158,8 @@
     //Test case 2.1: test capture with listener
     public void test2_1ListenerCapture() throws Exception {
         if (!hasAudioOutput()) {
+            Log.w(TAG,"AUDIO_OUTPUT feature not found. This system might not have a valid "
+                    + "audio output HAL");
             return;
         }
         try {
diff --git a/tests/tests/net/Android.mk b/tests/tests/net/Android.mk
index f6e5c90..a35e145 100644
--- a/tests/tests/net/Android.mk
+++ b/tests/tests/net/Android.mk
@@ -24,7 +24,7 @@
 # Include both the 32 and 64 bit versions
 LOCAL_MULTILIB := both
 
-LOCAL_JAVA_LIBRARIES := voip-common conscrypt
+LOCAL_JAVA_LIBRARIES := voip-common conscrypt org.apache.http.legacy
 
 LOCAL_JNI_SHARED_LIBRARIES := libcts_jni libnativedns_jni
 
diff --git a/tests/tests/net/AndroidManifest.xml b/tests/tests/net/AndroidManifest.xml
index 652262d..bca2d2c 100644
--- a/tests/tests/net/AndroidManifest.xml
+++ b/tests/tests/net/AndroidManifest.xml
@@ -30,6 +30,7 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/net/src/android/net/ipv6/cts/PingTest.java b/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
index eddb416..c23ad30 100644
--- a/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
+++ b/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
@@ -155,7 +155,7 @@
     public void testLoopbackPing() throws ErrnoException, IOException {
         // Generate a random ping packet and send it to localhost.
         InetAddress ipv6Loopback = InetAddress.getByName(null);
-        assertEquals("localhost/::1", ipv6Loopback.toString());
+        assertEquals("::1", ipv6Loopback.getHostAddress());
 
         for (int i = 0; i < NUM_PACKETS; i++) {
             byte[] packet = pingPacket((int) (Math.random() * (MAX_SIZE - ICMP_HEADER_SIZE)));
diff --git a/tests/tests/openglperf/Android.mk b/tests/tests/openglperf/Android.mk
index 7be16e8..6b42ed0 100644
--- a/tests/tests/openglperf/Android.mk
+++ b/tests/tests/openglperf/Android.mk
@@ -38,4 +38,10 @@
 
 include $(BUILD_CTS_PACKAGE)
 
+# Make the replica island app and copy it to CTS out dir.
+cts_replica_name := com.replica.replicaisland
+cts_replica_apk := $(CTS_TESTCASES_OUT)/$(cts_replica_name).apk
+$(cts_replica_apk): $(call intermediates-dir-for,APPS,$(cts_replica_name))/package.apk
+	$(call copy-file-to-target)
+
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/os/jni/Android.mk b/tests/tests/os/jni/Android.mk
index dd3bb51..fab1ec2 100644
--- a/tests/tests/os/jni/Android.mk
+++ b/tests/tests/os/jni/Android.mk
@@ -27,7 +27,30 @@
 		android_os_cts_TaggedPointer.cpp \
 		android_os_cts_HardwareName.cpp \
 		android_os_cts_OSFeatures.cpp \
-		android_os_cts_NoExecutePermissionTest.cpp
+		android_os_cts_NoExecutePermissionTest.cpp \
+		android_os_cts_SeccompTest.cpp
+
+# Select the architectures on which seccomp-bpf are supported. This is used to
+# include extra test files that will not compile on architectures where it is
+# not supported.
+ARCH_SUPPORTS_SECCOMP := 0
+ifeq ($(strip $(TARGET_ARCH)),arm)
+	ARCH_SUPPORTS_SECCOMP = 1
+endif
+
+ifeq ($(strip $(TARGET_ARCH)),x86)
+	ARCH_SUPPORTS_SECCOMP = 1
+endif
+
+ifeq ($(strip $(TARGET_ARCH)),x86_64)
+	ARCH_SUPPORTS_SECCOMP = 1
+endif
+
+ifeq ($(ARCH_SUPPORTS_SECCOMP),1)
+	LOCAL_SRC_FILES += seccomp-tests/tests/seccomp_bpf_tests.c
+	# This define controls the behavior of OSFeatures.needsSeccompSupport().
+	LOCAL_CFLAGS += -DARCH_SUPPORTS_SECCOMP
+endif
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 
diff --git a/tests/tests/os/jni/CtsOsJniOnLoad.cpp b/tests/tests/os/jni/CtsOsJniOnLoad.cpp
index e4a0dc0..cac750f 100644
--- a/tests/tests/os/jni/CtsOsJniOnLoad.cpp
+++ b/tests/tests/os/jni/CtsOsJniOnLoad.cpp
@@ -29,6 +29,8 @@
 
 extern int register_android_os_cts_NoExecutePermissionTest(JNIEnv*);
 
+extern int register_android_os_cts_SeccompTest(JNIEnv*);
+
 jint JNI_OnLoad(JavaVM *vm, void *reserved) {
     JNIEnv *env = NULL;
 
@@ -60,5 +62,9 @@
         return JNI_ERR;
     }
 
+    if (register_android_os_cts_SeccompTest(env)) {
+        return JNI_ERR;
+    }
+
     return JNI_VERSION_1_4;
 }
diff --git a/tests/tests/os/jni/android_os_cts_OSFeatures.cpp b/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
index 2ee31b1..153fb27 100644
--- a/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
+++ b/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
@@ -84,8 +84,9 @@
 
 jboolean android_os_cts_OSFeatures_needsSeccompSupport(JNIEnv*, jobject)
 {
-#if !defined(__arm__) && !defined(__i386__) && !defined(__x86_64__)
+#if !defined(ARCH_SUPPORTS_SECCOMP)
     // Seccomp support is only available for ARM, x86, x86_64.
+    // This define is controlled by the Android.mk.
     return false;
 #endif
 
diff --git a/tests/tests/os/jni/android_os_cts_SeccompTest.cpp b/tests/tests/os/jni/android_os_cts_SeccompTest.cpp
new file mode 100644
index 0000000..cd1543d
--- /dev/null
+++ b/tests/tests/os/jni/android_os_cts_SeccompTest.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android/log.h>
+#include <jni.h>
+#include <string.h>
+
+#include "seccomp-tests/tests/test_harness.h"
+
+// Forward declare from seccomp_bpf_tests.c.
+extern "C" {
+struct __test_metadata* get_seccomp_test_list();
+}
+
+static const char TAG[] = "SecompBpfTest-Native";
+
+jboolean android_security_cts_SeccompBpfTest_runKernelUnitTest(
+      JNIEnv* env, jobject thiz __unused, jstring name) {
+#if defined(ARCH_SUPPORTS_SECCOMP)
+    const char* nameStr = env->GetStringUTFChars(name, nullptr);
+
+    for (struct __test_metadata* t = get_seccomp_test_list(); t; t = t->next) {
+        if (strcmp(t->name, nameStr) == 0) {
+            __android_log_print(ANDROID_LOG_INFO, TAG, "Start: %s", t->name);
+            __run_test(t);
+            __android_log_print(ANDROID_LOG_INFO, TAG, "%s: %s",
+                t->passed ? "PASS" : "FAIL", t->name);
+            return t->passed;
+        }
+    }
+#endif  // ARCH_SUPPORTS_SECCOMP
+
+    return false;
+}
+
+static JNINativeMethod methods[] = {
+    { "runKernelUnitTest", "(Ljava/lang/String;)Z",
+        (void*)android_security_cts_SeccompBpfTest_runKernelUnitTest },
+};
+
+int register_android_os_cts_SeccompTest(JNIEnv* env) {
+    jclass clazz = env->FindClass("android/os/cts/SeccompTest");
+    return env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(JNINativeMethod));
+}
diff --git a/tests/tests/os/jni/seccomp-tests/LICENSE b/tests/tests/os/jni/seccomp-tests/LICENSE
new file mode 100644
index 0000000..b9e779f
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/LICENSE
@@ -0,0 +1,27 @@
+// Copyright 2014 The Chromium OS Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/tests/tests/os/jni/seccomp-tests/README b/tests/tests/os/jni/seccomp-tests/README
new file mode 100644
index 0000000..c8cd2ad
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/README
@@ -0,0 +1,4 @@
+seccomp
+-------
+
+Landing place for code relating to seccomp_filter work for the Linux kernel.
diff --git a/tests/tests/os/jni/seccomp-tests/README.android b/tests/tests/os/jni/seccomp-tests/README.android
new file mode 100644
index 0000000..4c5bb83
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/README.android
@@ -0,0 +1,13 @@
+This is the kernel unittest for seccomp-bpf sandboxing.
+
+URL: https://github.com/redpig/seccomp
+Revision: e65c79a14dc2bbb6d8dbf12ebf71905e2253a4b2
+License: BSD
+
+Local modifications:
+- Remove usage of pthread_cancel()
+- Use __android_log_print() instead of fprintf()
+- Rename main() to seccomp_test_main()
+- Add get_seccomp_test_list()
+
+The diff of modifications can be found in local-modifications-android.diff.
diff --git a/tests/tests/os/jni/seccomp-tests/local-modifications-android.diff b/tests/tests/os/jni/seccomp-tests/local-modifications-android.diff
new file mode 100644
index 0000000..288261a
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/local-modifications-android.diff
@@ -0,0 +1,59 @@
+diff --git a/tests/seccomp_bpf_tests.c b/tests/seccomp_bpf_tests.c
+index deb78d1..98b0231 100644
+--- a/tests/seccomp_bpf_tests.c
++++ b/tests/seccomp_bpf_tests.c
+@@ -1457,7 +1457,7 @@ FIXTURE_TEARDOWN(TSYNC) {
+ 		if (!s->tid)
+ 			continue;
+ 		if (pthread_kill(s->tid, 0)) {
+-			pthread_cancel(s->tid);
++			//pthread_cancel(s->tid);  // ANDROID
+ 			pthread_join(s->tid, &status);
+ 		}
+ 	}
+@@ -1940,4 +1940,10 @@ TEST(syscall_restart) {
+  * - ...
+  */
+ 
++// ANDROID:begin
++struct __test_metadata* get_seccomp_test_list() {
++  return __test_list;
++}
++// ANDROID:end
++
+ TEST_HARNESS_MAIN
+diff --git a/tests/test_harness.h b/tests/test_harness.h
+index 47ee027..597e40c 100644
+--- a/tests/test_harness.h
++++ b/tests/test_harness.h
+@@ -49,6 +49,8 @@
+ #include <sys/wait.h>
+ #include <unistd.h>
+ 
++#include <android/log.h>  // ANDROID
++
+ /* All exported functionality should be declared through this macro. */
+ #define TEST_API(x) _##x
+ 
+@@ -206,9 +208,11 @@
+ } while (0)
+ 
+ /* Unconditional logger for internal use. */
++// ANDROID:begin
+ #define __TH_LOG(fmt, ...) \
+-    fprintf(TH_LOG_STREAM, "%s:%d:%s:" fmt "\n", \
++    __android_log_print(ANDROID_LOG_ERROR, "SeccompBpfTest-KernelUnit", "%s:%d:%s:" fmt "\n", \
+             __FILE__, __LINE__, _metadata->name, ##__VA_ARGS__)
++// ANDROID:end
+ 
+ /* Defines the test function and creates the registration stub. */
+ #define _TEST(test_name) __TEST_IMPL(test_name, -1)
+@@ -292,7 +296,7 @@
+     if (!__constructor_order) \
+       __constructor_order = _CONSTRUCTOR_ORDER_BACKWARD; \
+   } \
+-  int main(int argc, char **argv) { return test_harness_run(argc, argv); }
++  int seccomp_test_main(int argc, char **argv) { return test_harness_run(argc, argv); }  // ANDROID
+ 
+ #define _ASSERT_EQ(_expected, _seen) \
+   __EXPECT(_expected, _seen, ==, 1)
diff --git a/tests/tests/os/jni/seccomp-tests/tests/.gitignore b/tests/tests/os/jni/seccomp-tests/tests/.gitignore
new file mode 100644
index 0000000..cdfc7c6
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/.gitignore
@@ -0,0 +1,3 @@
+sigsegv
+resumption
+seccomp_bpf_tests
diff --git a/tests/tests/os/jni/seccomp-tests/tests/Makefile b/tests/tests/os/jni/seccomp-tests/tests/Makefile
new file mode 100644
index 0000000..88994b3
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/Makefile
@@ -0,0 +1,23 @@
+CFLAGS += -Wall
+EXEC=resumption seccomp_bpf_tests sigsegv
+
+all: $(EXEC)
+
+clean:
+	rm -f $(EXEC)
+
+seccomp_bpf_tests: seccomp_bpf_tests.c test_harness.h
+	$(CC) seccomp_bpf_tests.c -o seccomp_bpf_tests $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -pthread
+
+resumption: resumption.c test_harness.h
+	$(CC) $^ -o $@ $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -ggdb3
+
+sigsegv: sigsegv.c test_harness.h
+	$(CC) $^ -o $@ $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -ggdb3
+
+run_tests: $(EXEC)
+	./seccomp_bpf_tests
+	./resumption
+	./sigsegv
+
+.PHONY: clean run_tests
diff --git a/tests/tests/os/jni/seccomp-tests/tests/resumption.c b/tests/tests/os/jni/seccomp-tests/tests/resumption.c
new file mode 100644
index 0000000..41795c0
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/resumption.c
@@ -0,0 +1,217 @@
+/* seccomp_bpf_tests.c
+ * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Test code for seccomp bpf.
+ */
+
+#include <asm/siginfo.h>
+#define __have_siginfo_t 1
+#define __have_sigval_t 1
+#define __have_sigevent_t 1
+
+#include <linux/filter.h>
+#include <sys/prctl.h>
+#include <linux/prctl.h>
+#include <linux/seccomp.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <string.h>
+#include <syscall.h>
+#define __USE_GNU 1
+#include <sys/ucontext.h>
+#include <sys/mman.h>
+
+#include "test_harness.h"
+
+#ifndef PR_SET_NO_NEW_PRIVS
+#define PR_SET_NO_NEW_PRIVS 38
+#define PR_GET_NO_NEW_PRIVS 39
+#endif
+
+#if defined(__i386__)
+#define REG_IP	REG_EIP
+#define REG_SP	REG_ESP
+#define REG_RESULT	REG_EAX
+#define REG_SYSCALL	REG_EAX
+#define REG_ARG0	REG_EBX
+#define REG_ARG1	REG_ECX
+#define REG_ARG2	REG_EDX
+#define REG_ARG3	REG_ESI
+#define REG_ARG4	REG_EDI
+#define REG_ARG5	REG_EBP
+#elif defined(__x86_64__)
+#define REG_IP	REG_RIP
+#define REG_SP	REG_RSP
+#define REG_RESULT	REG_RAX
+#define REG_SYSCALL	REG_RAX
+#define REG_ARG0	REG_RDI
+#define REG_ARG1	REG_RSI
+#define REG_ARG2	REG_RDX
+#define REG_ARG3	REG_R10
+#define REG_ARG4	REG_R8
+#define REG_ARG5	REG_R9
+#endif
+
+FIXTURE_DATA(TRAP) {
+	struct sock_fprog prog;
+};
+
+/* XXX: will need one per arch, etc.
+ *      thankfully _arch can tell us the calling convention!
+ */
+extern void *thunk_ip;	/* label for the instruction _after_ syscall */
+static void syscall_thunk(void)
+{
+	asm("syscall; thunk_ip:");
+}
+
+static time_t vsyscall_time(time_t *p)
+{
+	register time_t t asm ("rax");
+	__attribute__((unused)) register time_t *p1 asm ("rdi") = p;
+	__asm__("call 0xffffffffff600400 \n");
+	return t;
+}
+
+
+#if 0
+/* For instance, we could jump here instead. */
+static void compat_thunk(void)
+{
+	asm("int 0x80");
+}
+#endif
+
+FIXTURE_SETUP(TRAP) {
+	/* instruction after the syscall. Will be arch specific, of course. */
+	unsigned long thunk_addr = (unsigned long)&thunk_ip;
+	TH_LOG("Thunk: 0x%lX\n", thunk_addr);
+	{
+		struct sock_filter filter[] = {
+			BPF_STMT(BPF_LD+BPF_W+BPF_ABS,
+				offsetof(struct seccomp_data, nr)),
+			/* Whitelist anything you might need in the sigaction */
+#ifdef __NR_sigreturn
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_sigreturn, 3, 0),
+#endif
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_exit, 2, 0),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_rt_sigreturn, 1, 0),
+			/* Allow __NR_write so easy logging. */
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_write, 0, 1),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),
+			/* Check if we're within the thunk. */
+			BPF_STMT(BPF_LD+BPF_W+BPF_ABS,
+				offsetof(struct seccomp_data, instruction_pointer)),
+			/* XXX: make this 32-bit friendly. */
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ((__u32*)&thunk_addr)[0], 0, 3),
+			BPF_STMT(BPF_LD+BPF_W+BPF_ABS,
+				offsetof(struct seccomp_data, instruction_pointer)+sizeof(int)),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ((__u32*)&thunk_addr)[1], 0, 1),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_TRAP),
+		};
+		memset(&self->prog, 0, sizeof(self->prog));
+		self->prog.filter = malloc(sizeof(filter));
+		ASSERT_NE(NULL, self->prog.filter);
+		memcpy(self->prog.filter, filter, sizeof(filter));
+		self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+	}
+}
+
+FIXTURE_TEARDOWN(TRAP) {
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+struct arch_sigsys {
+		void *_call_addr; /* calling user insn */
+		int _syscall;	/* triggering system call number */
+		unsigned int _arch;	/* AUDIT_ARCH_* of syscall */
+};
+
+static void TRAP_action(int nr, siginfo_t *info, void *void_context)
+{
+	ucontext_t *ctx = (ucontext_t *)void_context;
+	char buf[256];
+	int len;
+	int do_ret = 1;
+	struct arch_sigsys *sys = (struct arch_sigsys *)
+#ifdef si_syscall
+		&(info->si_call_addr);
+#else
+		&(info->si_pid);
+#endif
+
+	if (info->si_code != SYS_SECCOMP)
+		return;
+	if (!ctx)
+		return;
+	len = snprintf(buf, sizeof(buf),
+			"@0x%lX:%X:%d:0x%lX:0x%lX:0x%lX:0x%lX:0x%lX:0x%lX\n",
+			(unsigned long)sys->_call_addr,
+			sys->_arch,
+			sys->_syscall,
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG0],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG1],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG2],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG3],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG4],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG5]);
+	/* Send the soft-fail to our "listener" */
+	syscall(__NR_write, STDOUT_FILENO, buf, len);
+	if (ctx->uc_mcontext.gregs[REG_IP] >= 0xffffffffff600000ULL &&
+	    ctx->uc_mcontext.gregs[REG_IP] < 0xffffffffff601000ULL)
+		do_ret = 0;
+	if (do_ret) {
+		/* push [REG_IP] */
+		ctx->uc_mcontext.gregs[REG_SP] -= sizeof(unsigned long);
+		*((unsigned long *)ctx->uc_mcontext.gregs[REG_SP]) =
+		    ctx->uc_mcontext.gregs[REG_IP];
+	}
+	/* jmp syscall_thunk */
+	ctx->uc_mcontext.gregs[REG_IP] = (unsigned long)syscall_thunk;
+	return;
+}
+
+TEST_F(TRAP, handler) {
+	int ret;
+	struct sigaction act;
+	pid_t pid;
+	sigset_t mask;
+	memset(&act, 0, sizeof(act));
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGSYS);
+
+	act.sa_sigaction = &TRAP_action;
+	act.sa_flags = SA_SIGINFO;
+	ret = sigaction(SIGSYS, &act, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigaction failed");
+	}
+	ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigprocmask failed");
+	}
+
+	/* Get the pid to compare against. */
+	pid = getpid();
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+
+	/* Call anything! */
+	ret = syscall(__NR_getpid);
+	ASSERT_EQ(pid, ret);
+	ret = syscall(__NR_close, 0);
+	ASSERT_EQ(0, ret);
+	ret = syscall(__NR_close, 0);
+	ASSERT_EQ(-1, ret);
+	printf("The time is %ld\n", vsyscall_time(NULL));
+	ASSERT_LT(0, vsyscall_time(NULL));
+}
+
+TEST_HARNESS_MAIN
diff --git a/tests/tests/os/jni/seccomp-tests/tests/seccomp_bpf_tests.c b/tests/tests/os/jni/seccomp-tests/tests/seccomp_bpf_tests.c
new file mode 100644
index 0000000..98b0231
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/seccomp_bpf_tests.c
@@ -0,0 +1,1949 @@
+/* seccomp_bpf_tests.c
+ * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Test code for seccomp bpf.
+ */
+
+#include <asm/siginfo.h>
+#define __have_siginfo_t 1
+#define __have_sigval_t 1
+#define __have_sigevent_t 1
+
+#include <errno.h>
+#include <linux/filter.h>
+#include <sys/prctl.h>
+#include <sys/ptrace.h>
+#include <sys/user.h>
+#include <linux/prctl.h>
+#include <linux/ptrace.h>
+#include <linux/seccomp.h>
+#include <poll.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <signal.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <string.h>
+#include <linux/elf.h>
+#include <sys/uio.h>
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/syscall.h>
+
+#include "test_harness.h"
+
+#ifndef PR_SET_PTRACER
+# define PR_SET_PTRACER 0x59616d61
+#endif
+
+#ifndef PR_SET_NO_NEW_PRIVS
+#define PR_SET_NO_NEW_PRIVS 38
+#define PR_GET_NO_NEW_PRIVS 39
+#endif
+
+#ifndef PR_SECCOMP_EXT
+#define PR_SECCOMP_EXT 43
+#endif
+
+#ifndef SECCOMP_EXT_ACT
+#define SECCOMP_EXT_ACT 1
+#endif
+
+#ifndef SECCOMP_EXT_ACT_TSYNC
+#define SECCOMP_EXT_ACT_TSYNC 1
+#endif
+
+#ifndef SECCOMP_MODE_STRICT
+#define SECCOMP_MODE_STRICT 1
+#endif
+
+#ifndef SECCOMP_MODE_FILTER
+#define SECCOMP_MODE_FILTER 2
+#endif
+
+#ifndef SECCOMP_RET_KILL
+#define SECCOMP_RET_KILL        0x00000000U // kill the task immediately
+#define SECCOMP_RET_TRAP        0x00030000U // disallow and force a SIGSYS
+#define SECCOMP_RET_ERRNO       0x00050000U // returns an errno
+#define SECCOMP_RET_TRACE       0x7ff00000U // pass to a tracer or disallow
+#define SECCOMP_RET_ALLOW       0x7fff0000U // allow
+
+/* Masks for the return value sections. */
+#define SECCOMP_RET_ACTION      0x7fff0000U
+#define SECCOMP_RET_DATA        0x0000ffffU
+
+struct seccomp_data {
+	int nr;
+	__u32 arch;
+	__u64 instruction_pointer;
+	__u64 args[6];
+};
+#endif
+
+#define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n]))
+
+#define SIBLING_EXIT_UNKILLED	0xbadbeef
+#define SIBLING_EXIT_FAILURE	0xbadface
+#define SIBLING_EXIT_NEWPRIVS	0xbadfeed
+
+TEST(mode_strict_support) {
+	long ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support CONFIG_SECCOMP");
+	}
+	syscall(__NR_exit, 1);
+}
+
+TEST_SIGNAL(mode_strict_cannot_call_prctl, SIGKILL) {
+	long ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support CONFIG_SECCOMP");
+	}
+	syscall(__NR_prctl, PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, NULL, NULL);
+	EXPECT_FALSE(true) {
+		TH_LOG("Unreachable!");
+	}
+}
+
+/* Note! This doesn't test no new privs behavior */
+TEST(no_new_privs_support) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	EXPECT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+}
+
+/* Tests kernel support by checking for a copy_from_user() fault on * NULL. */
+TEST(mode_filter_support) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, NULL, NULL);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(EFAULT, errno) {
+		TH_LOG("Kernel does not support CONFIG_SECCOMP_FILTER!");
+	}
+}
+
+TEST(mode_filter_without_nnp) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_GET_NO_NEW_PRIVS, 0, NULL, 0, 0);
+	ASSERT_LE(0, ret) {
+		TH_LOG("Expected 0 or unsupported for NO_NEW_PRIVS");
+	}
+	errno = 0;
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	/* Succeeds with CAP_SYS_ADMIN, fails without */
+	/* TODO(wad) check caps not euid */
+	if (geteuid()) {
+		EXPECT_EQ(-1, ret);
+		EXPECT_EQ(EACCES, errno);
+	} else {
+		EXPECT_EQ(0, ret);
+	}
+}
+
+#define MAX_INSNS_PER_PATH 32768
+
+TEST(filter_size_limits) {
+	int i;
+	int count = BPF_MAXINSNS + 1;
+	struct sock_filter allow[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_filter *filter;
+	struct sock_fprog prog = { };
+
+	filter = calloc(count, sizeof(*filter));
+	ASSERT_NE(NULL, filter);
+
+	for (i = 0; i < count; i++) {
+		filter[i] = allow[0];
+	}
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	prog.filter = filter;
+	prog.len = count;
+
+	/* Too many filter instructions in a single filter. */
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_NE(0, ret) {
+		TH_LOG("Installing %d insn filter was allowed", prog.len);
+	}
+
+	/* One less is okay, though. */
+	prog.len -= 1;
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Installing %d insn filter wasn't allowed", prog.len);
+	}
+}
+
+TEST(filter_chain_limits) {
+	int i;
+	int count = BPF_MAXINSNS;
+	struct sock_filter allow[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_filter *filter;
+	struct sock_fprog prog = { };
+
+	filter = calloc(count, sizeof(*filter));
+	ASSERT_NE(NULL, filter);
+
+	for (i = 0; i < count; i++) {
+		filter[i] = allow[0];
+	}
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	prog.filter = filter;
+	prog.len = 1;
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	prog.len = count;
+
+	/* Too many total filter instructions. */
+	for (i = 0; i < MAX_INSNS_PER_PATH; i++) {
+		ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+		if (ret != 0)
+			break;
+	}
+	ASSERT_NE(0, ret) {
+		TH_LOG("Allowed %d %d-insn filters (total with penalties:%d)",
+		       i, count, i * (count + 4));
+	}
+}
+
+TEST(mode_filter_cannot_move_to_strict) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, 0, 0);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(EINVAL, errno);
+}
+
+
+TEST(mode_filter_get_seccomp) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
+	EXPECT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
+	EXPECT_EQ(2, ret);
+}
+
+
+TEST(ALLOW_all) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+}
+
+TEST(empty_prog) {
+	struct sock_filter filter[] = {
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(EINVAL, errno);
+}
+
+TEST_SIGNAL(unknown_ret_is_kill_inside, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, 0x10000000U),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+	EXPECT_EQ(0, syscall(__NR_getpid)) {
+		TH_LOG("getpid() shouldn't ever return");
+	}
+}
+
+/* return code >= 0x80000000 is unused. */
+TEST_SIGNAL(unknown_ret_is_kill_above_allow, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, 0x90000000U),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+	EXPECT_EQ(0, syscall(__NR_getpid)) {
+		TH_LOG("getpid() shouldn't ever return");
+	}
+}
+
+TEST_SIGNAL(KILL_all, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+}
+
+TEST_SIGNAL(KILL_one, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_SIGNAL(KILL_one_arg_one, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		/* Only both with lower 32-bit for now. */
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(0)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0x0C0FFEE, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	pid_t pid = getpid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(pid, syscall(__NR_getpid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid, 0x0C0FFEE));
+}
+
+TEST_SIGNAL(KILL_one_arg_six, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		/* Only both with lower 32-bit for now. */
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(5)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0x0C0FFEE, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	pid_t pid = getpid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(pid, syscall(__NR_getpid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid, 1, 2, 3, 4, 5, 0x0C0FFEE));
+}
+
+/* TODO(wad) add 64-bit versus 32-bit arg tests. */
+
+TEST(arg_out_of_range) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(6)),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(EINVAL, errno);
+}
+
+TEST(ERRNO_one) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | E2BIG),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(-1, read(0, NULL, 0));
+	EXPECT_EQ(E2BIG, errno);
+}
+
+TEST(ERRNO_one_ok) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* "errno" of 0 is ok. */
+	EXPECT_EQ(0, read(0, NULL, 0));
+}
+
+FIXTURE_DATA(TRAP) {
+	struct sock_fprog prog;
+};
+
+FIXTURE_SETUP(TRAP) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	memset(&self->prog, 0, sizeof(self->prog));
+	self->prog.filter = malloc(sizeof(filter));
+	ASSERT_NE(NULL, self->prog.filter);
+	memcpy(self->prog.filter, filter, sizeof(filter));
+	self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+}
+
+FIXTURE_TEARDOWN(TRAP) {
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+TEST_F_SIGNAL(TRAP, dfl, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+	syscall(__NR_getpid);
+}
+
+/* Ensure that SIGSYS overrides SIG_IGN */
+TEST_F_SIGNAL(TRAP, ign, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	signal(SIGSYS, SIG_IGN);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+	syscall(__NR_getpid);
+}
+
+static struct siginfo TRAP_info;
+static volatile int TRAP_nr;
+static void TRAP_action(int nr, siginfo_t *info, void *void_context)
+{
+	memcpy(&TRAP_info, info, sizeof(TRAP_info));
+	TRAP_nr = nr;
+	return;
+}
+
+TEST_F(TRAP, handler) {
+	int ret, test;
+	struct sigaction act;
+	sigset_t mask;
+	memset(&act, 0, sizeof(act));
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGSYS);
+
+	act.sa_sigaction = &TRAP_action;
+	act.sa_flags = SA_SIGINFO;
+	ret = sigaction(SIGSYS, &act, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigaction failed");
+	}
+	ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigprocmask failed");
+	}
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+	TRAP_nr = 0;
+	memset(&TRAP_info, 0, sizeof(TRAP_info));
+	/* Expect the registers to be rolled back. (nr = error) may vary
+	 * based on arch. */
+	ret = syscall(__NR_getpid);
+	/* Silence gcc warning about volatile. */
+	test = TRAP_nr;
+	EXPECT_EQ(SIGSYS, test);
+	struct local_sigsys {
+			void *_call_addr; /* calling user insn */
+			int _syscall;	/* triggering system call number */
+			unsigned int _arch;	/* AUDIT_ARCH_* of syscall */
+	} *sigsys = (struct local_sigsys *)
+#ifdef si_syscall
+		&(TRAP_info.si_call_addr);
+#else
+		&TRAP_info.si_pid;
+#endif
+	EXPECT_EQ(__NR_getpid, sigsys->_syscall);
+	/* Make sure arch is non-zero. */
+	EXPECT_NE(0, sigsys->_arch);
+	EXPECT_NE(0, (unsigned long)sigsys->_call_addr);
+}
+
+FIXTURE_DATA(precedence) {
+	struct sock_fprog allow;
+	struct sock_fprog trace;
+	struct sock_fprog error;
+	struct sock_fprog trap;
+	struct sock_fprog kill;
+};
+
+FIXTURE_SETUP(precedence) {
+	struct sock_filter allow_insns[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_filter trace_insns[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE),
+	};
+	struct sock_filter error_insns[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO),
+	};
+	struct sock_filter trap_insns[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP),
+	};
+	struct sock_filter kill_insns[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+	};
+	memset(self, 0, sizeof(*self));
+#define FILTER_ALLOC(_x) \
+	self->_x.filter = malloc(sizeof(_x##_insns)); \
+	ASSERT_NE(NULL, self->_x.filter); \
+	memcpy(self->_x.filter, &_x##_insns, sizeof(_x##_insns)); \
+	self->_x.len = (unsigned short)(sizeof(_x##_insns)/sizeof(_x##_insns[0]))
+	FILTER_ALLOC(allow);
+	FILTER_ALLOC(trace);
+	FILTER_ALLOC(error);
+	FILTER_ALLOC(trap);
+	FILTER_ALLOC(kill);
+}
+
+FIXTURE_TEARDOWN(precedence) {
+#define FILTER_FREE(_x) if (self->_x.filter) free(self->_x.filter)
+	FILTER_FREE(allow);
+	FILTER_FREE(trace);
+	FILTER_FREE(error);
+	FILTER_FREE(trap);
+	FILTER_FREE(kill);
+}
+
+TEST_F(precedence, allow_ok) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	pid_t res = 0;
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	res = syscall(__NR_getppid);
+	EXPECT_EQ(parent, res);
+}
+
+TEST_F_SIGNAL(precedence, kill_is_highest, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	pid_t res = 0;
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	res = syscall(__NR_getppid);
+	EXPECT_EQ(parent, res);
+	/* getpid() should never return. */
+	res = syscall(__NR_getpid);
+	EXPECT_EQ(0, res);
+}
+
+TEST_F_SIGNAL(precedence, kill_is_highest_in_any_order, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F_SIGNAL(precedence, trap_is_second, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F_SIGNAL(precedence, trap_is_second_in_any_order, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, errno_is_third) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, errno_is_third_in_any_order) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, trace_is_fourth) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* No ptracer */
+	EXPECT_EQ(-1, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, trace_is_fourth_in_any_order) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* No ptracer */
+	EXPECT_EQ(-1, syscall(__NR_getpid));
+}
+
+#ifndef PTRACE_O_TRACESECCOMP
+#define PTRACE_O_TRACESECCOMP	0x00000080
+#endif
+
+/* Catch the Ubuntu 12.04 value error. */
+#if PTRACE_EVENT_SECCOMP != 7
+#undef PTRACE_EVENT_SECCOMP
+#endif
+
+#ifndef PTRACE_EVENT_SECCOMP
+#define PTRACE_EVENT_SECCOMP 7
+#endif
+
+#define IS_SECCOMP_EVENT(status) ((status >> 16) == PTRACE_EVENT_SECCOMP)
+bool tracer_running;
+void tracer_stop(int sig)
+{
+	tracer_running = false;
+}
+
+typedef void tracer_func_t(struct __test_metadata *_metadata,
+			   pid_t tracee, int status, void *args);
+
+void tracer(struct __test_metadata *_metadata, int fd, pid_t tracee,
+	    tracer_func_t tracer_func, void *args) {
+	int ret = -1;
+	struct sigaction action = {
+		.sa_handler = tracer_stop,
+	};
+
+	/* Allow external shutdown. */
+	tracer_running = true;
+	ASSERT_EQ(0, sigaction(SIGUSR1, &action, NULL));
+
+	errno = 0;
+	while (ret == -1 && errno != EINVAL) {
+		ret = ptrace(PTRACE_ATTACH, tracee, NULL, 0);
+	}
+	ASSERT_EQ(0, ret) {
+		kill(tracee, SIGKILL);
+	}
+	/* Wait for attach stop */
+	wait(NULL);
+
+	ret = ptrace(PTRACE_SETOPTIONS, tracee, NULL, PTRACE_O_TRACESECCOMP);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Failed to set PTRACE_O_TRACESECCOMP");
+		kill(tracee, SIGKILL);
+	}
+	ptrace(PTRACE_CONT, tracee, NULL, 0);
+
+	/* Unblock the tracee */
+	ASSERT_EQ(1, write(fd, "A", 1));
+	ASSERT_EQ(0, close(fd));
+
+	/* Run until we're shut down. Must assert to stop execution. */
+	while (tracer_running) {
+		int status;
+		if (wait(&status) != tracee)
+			continue;
+		if (WIFSIGNALED(status) || WIFEXITED(status))
+			/* Child is dead. Time to go. */
+			return;
+
+		/* Make sure this is a seccomp event. */
+		ASSERT_EQ(true, IS_SECCOMP_EVENT(status));
+
+		tracer_func(_metadata, tracee, status, args);
+
+		ret = ptrace(PTRACE_CONT, tracee, NULL, NULL);
+		ASSERT_EQ(0, ret);
+	}
+	/* Directly report the status of our test harness results. */
+	syscall(__NR_exit, _metadata->passed ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+/* Common tracer setup/teardown functions. */
+void cont_handler(int num) {
+}
+pid_t setup_trace_fixture(struct __test_metadata *_metadata,
+			  tracer_func_t func, void *args) {
+	char sync;
+	int pipefd[2];
+	pid_t tracer_pid;
+	pid_t tracee = getpid();
+
+	/* Setup a pipe for clean synchronization. */
+	ASSERT_EQ(0, pipe(pipefd));
+
+	/* Fork a child which we'll promote to tracer */
+	tracer_pid = fork();
+	ASSERT_LE(0, tracer_pid);
+	signal(SIGALRM, cont_handler);
+	if (tracer_pid == 0) {
+		close(pipefd[0]);
+		tracer(_metadata, pipefd[1], tracee, func, args);
+		syscall(__NR_exit, 0);
+	}
+	close(pipefd[1]);
+	prctl(PR_SET_PTRACER, tracer_pid, 0, 0, 0);
+	read(pipefd[0], &sync, 1);
+	close(pipefd[0]);
+
+	return tracer_pid;
+}
+void teardown_trace_fixture(struct __test_metadata *_metadata,
+			    pid_t tracer) {
+	if (tracer) {
+		int status;
+		/*
+		 * Extract the exit code from the other process and
+		 * adopt it for ourselves in case its asserts failed.
+		 */
+		ASSERT_EQ(0, kill(tracer, SIGUSR1));
+		ASSERT_EQ(tracer, waitpid(tracer, &status, 0));
+		if (WEXITSTATUS(status))
+			_metadata->passed = 0;
+	}
+}
+
+/* "poke" tracer arguments and function. */
+struct tracer_args_poke_t {
+	unsigned long poke_addr;
+};
+
+void tracer_poke(struct __test_metadata *_metadata, pid_t tracee, int status,
+		 void *args) {
+	int ret;
+	unsigned long msg;
+	struct tracer_args_poke_t *info = (struct tracer_args_poke_t *)args;
+
+	ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
+	EXPECT_EQ(0, ret);
+	/* If this fails, don't try to recover. */
+	ASSERT_EQ(0x1001, msg) {
+		kill(tracee, SIGKILL);
+	}
+	/*
+	 * Poke in the message.
+	 * Registers are not touched to try to keep this relatively arch
+	 * agnostic.
+	 */
+	ret = ptrace(PTRACE_POKEDATA, tracee, info->poke_addr, 0x1001);
+	EXPECT_EQ(0, ret);
+}
+
+FIXTURE_DATA(TRACE_poke) {
+	struct sock_fprog prog;
+	pid_t tracer;
+	long poked;
+	struct tracer_args_poke_t tracer_args;
+};
+
+FIXTURE_SETUP(TRACE_poke) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1001),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+
+	self->poked = 0;
+	memset(&self->prog, 0, sizeof(self->prog));
+	self->prog.filter = malloc(sizeof(filter));
+	ASSERT_NE(NULL, self->prog.filter);
+	memcpy(self->prog.filter, filter, sizeof(filter));
+	self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+
+	/* Set up tracer args. */
+	self->tracer_args.poke_addr = (unsigned long)&self->poked;
+
+	/* Launch tracer. */
+	self->tracer = setup_trace_fixture(_metadata, tracer_poke,
+					   &self->tracer_args);
+}
+
+FIXTURE_TEARDOWN(TRACE_poke) {
+	teardown_trace_fixture(_metadata, self->tracer);
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+TEST_F(TRACE_poke, read_has_side_effects) {
+	ssize_t ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(0, self->poked);
+	ret = read(-1, NULL, 0);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(0x1001, self->poked);
+}
+
+TEST_F(TRACE_poke, getpid_runs_normally) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(0, self->poked);
+	EXPECT_NE(0, syscall(__NR_getpid));
+	EXPECT_EQ(0, self->poked);
+}
+
+#if defined(__x86_64__)
+# define ARCH_REGS	struct user_regs_struct
+# define SYSCALL_NUM	orig_rax
+# define SYSCALL_RET	rax
+#elif defined(__i386__)
+# define ARCH_REGS	struct user_regs_struct
+# define SYSCALL_NUM	orig_eax
+# define SYSCALL_RET	eax
+#elif defined(__arm__)
+# define ARCH_REGS	struct pt_regs
+# define SYSCALL_NUM	ARM_r7
+# define SYSCALL_RET	ARM_r0
+#elif defined(__aarch64__)
+# define ARCH_REGS	struct user_pt_regs
+# define SYSCALL_NUM	regs[8]
+# define SYSCALL_RET	regs[0]
+#else
+# error "Do not know how to find your architecture's registers and syscalls"
+#endif
+
+/* Architecture-specific syscall fetching routine. */
+int get_syscall(struct __test_metadata *_metadata, pid_t tracee) {
+	struct iovec iov;
+	ARCH_REGS regs;
+
+	iov.iov_base = &regs;
+	iov.iov_len = sizeof(regs);
+	EXPECT_EQ(0, ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov)) {
+		TH_LOG("PTRACE_GETREGSET failed");
+		return -1;
+	}
+
+	return regs.SYSCALL_NUM;
+}
+
+/* Architecture-specific syscall changing routine. */
+void change_syscall(struct __test_metadata *_metadata,
+		    pid_t tracee, int syscall) {
+	struct iovec iov;
+	int ret;
+	ARCH_REGS regs;
+
+	iov.iov_base = &regs;
+	iov.iov_len = sizeof(regs);
+	ret = ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov);
+	EXPECT_EQ(0, ret);
+
+#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__)
+	{
+		regs.SYSCALL_NUM = syscall;
+	}
+
+#elif defined(__arm__)
+# ifndef PTRACE_SET_SYSCALL
+#  define PTRACE_SET_SYSCALL   23
+# endif
+	{
+		ret = ptrace(PTRACE_SET_SYSCALL, tracee, NULL, syscall);
+		EXPECT_EQ(0, ret);
+	}
+
+#else
+	ASSERT_EQ(1, 0) {
+		TH_LOG("How is the syscall changed on this architecture?");
+	}
+#endif
+
+	/* If syscall is skipped, change return value. */
+	if (syscall == -1)
+		regs.SYSCALL_RET = 1;
+
+	ret = ptrace(PTRACE_SETREGSET, tracee, NT_PRSTATUS, &iov);
+	EXPECT_EQ(0, ret);
+}
+
+void tracer_syscall(struct __test_metadata *_metadata, pid_t tracee,
+		    int status, void *args) {
+	int ret;
+	unsigned long msg;
+
+	/* Make sure we got the right message. */
+	ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
+	EXPECT_EQ(0, ret);
+
+	switch (msg) {
+	case 0x1002:
+		/* change getpid to getppid. */
+		change_syscall(_metadata, tracee, __NR_getppid);
+		break;
+	case 0x1003:
+		/* skip gettid. */
+		change_syscall(_metadata, tracee, -1);
+		break;
+	case 0x1004:
+		/* do nothing (allow getppid) */
+		break;
+	default:
+		EXPECT_EQ(0, msg) {
+			TH_LOG("Unknown PTRACE_GETEVENTMSG: 0x%lx", msg);
+			kill(tracee, SIGKILL);
+		}
+	}
+
+}
+
+FIXTURE_DATA(TRACE_syscall) {
+	struct sock_fprog prog;
+	pid_t tracer, mytid, mypid, parent;
+};
+
+FIXTURE_SETUP(TRACE_syscall) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1002),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_gettid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1003),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1004),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+
+	memset(&self->prog, 0, sizeof(self->prog));
+	self->prog.filter = malloc(sizeof(filter));
+	ASSERT_NE(NULL, self->prog.filter);
+	memcpy(self->prog.filter, filter, sizeof(filter));
+	self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+
+	/* Prepare some testable syscall results. */
+	self->mytid = syscall(__NR_gettid);
+	ASSERT_GT(self->mytid, 0);
+	ASSERT_NE(self->mytid, 1) {
+		TH_LOG("Running this test as init is not supported. :)");
+	}
+
+	self->mypid = getpid();
+	ASSERT_GT(self->mypid, 0);
+	ASSERT_EQ(self->mytid, self->mypid);
+
+	self->parent = getppid();
+	ASSERT_GT(self->parent, 0);
+	ASSERT_NE(self->parent, self->mypid);
+
+	/* Launch tracer. */
+	self->tracer = setup_trace_fixture(_metadata, tracer_syscall, NULL);
+}
+
+FIXTURE_TEARDOWN(TRACE_syscall) {
+	teardown_trace_fixture(_metadata, self->tracer);
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+TEST_F(TRACE_syscall, syscall_allowed) {
+	long ret;
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	/* getppid works as expected (no changes). */
+	EXPECT_EQ(self->parent, syscall(__NR_getppid));
+	EXPECT_NE(self->mypid, syscall(__NR_getppid));
+}
+
+TEST_F(TRACE_syscall, syscall_redirected) {
+	long ret;
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	/* getpid has been redirected to getppid as expected. */
+	EXPECT_EQ(self->parent, syscall(__NR_getpid));
+	EXPECT_NE(self->mypid, syscall(__NR_getpid));
+}
+
+TEST_F(TRACE_syscall, syscall_dropped) {
+	long ret;
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	/* gettid has been skipped and an altered return value stored. */
+	EXPECT_EQ(1, syscall(__NR_gettid));
+	EXPECT_NE(self->mytid, syscall(__NR_gettid));
+}
+
+#ifndef __NR_seccomp
+# if defined(__i386__)
+#  define __NR_seccomp 354
+# elif defined(__x86_64__)
+#  define __NR_seccomp 317
+# elif defined(__arm__)
+#  define __NR_seccomp 383
+# elif defined(__aarch64__)
+#  define __NR_seccomp 277
+# else
+#  warning "seccomp syscall number unknown for this architecture"
+#  define __NR_seccomp 0xffff
+# endif
+#endif
+
+#ifndef SECCOMP_SET_MODE_STRICT
+#define SECCOMP_SET_MODE_STRICT 0
+#endif
+
+#ifndef SECCOMP_SET_MODE_FILTER
+#define SECCOMP_SET_MODE_FILTER 1
+#endif
+
+#ifndef SECCOMP_FLAG_FILTER_TSYNC
+#define SECCOMP_FLAG_FILTER_TSYNC 1
+#endif
+
+#ifndef seccomp
+int seccomp(unsigned int op, unsigned int flags, struct sock_fprog *filter)
+{
+	errno = 0;
+	return syscall(__NR_seccomp, op, flags, filter);
+}
+#endif
+
+TEST(seccomp_syscall) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	/* Reject insane operation. */
+	ret = seccomp(-1, 0, &prog);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Did not reject crazy op value!");
+	}
+
+	/* Reject strict with flags or pointer. */
+	ret = seccomp(SECCOMP_SET_MODE_STRICT, -1, NULL);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Did not reject mode strict with flags!");
+	}
+	ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, &prog);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Did not reject mode strict with uargs!");
+	}
+
+	/* Reject insane args for filter. */
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, -1, &prog);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Did not reject crazy filter flags!");
+	}
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, NULL);
+	EXPECT_EQ(EFAULT, errno) {
+		TH_LOG("Did not reject NULL filter!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
+	EXPECT_EQ(0, errno) {
+		TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER: %s",
+			strerror(errno));
+	}
+}
+
+TEST(seccomp_syscall_mode_lock) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
+	EXPECT_EQ(0, ret) {
+		TH_LOG("Could not install filter!");
+	}
+
+	/* Make sure neither entry point will switch to strict. */
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, 0, 0, 0);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Switched to mode strict!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, NULL);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Switched to mode strict!");
+	}
+}
+
+TEST(TSYNC_first) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &prog);
+	EXPECT_EQ(0, ret) {
+		TH_LOG("Could not install initial filter with TSYNC!");
+	}
+}
+
+#define TSYNC_SIBLINGS 2
+struct tsync_sibling {
+	pthread_t tid;
+	pid_t system_tid;
+	sem_t *started;
+	pthread_cond_t *cond;
+	pthread_mutex_t *mutex;
+	int diverge;
+	int num_waits;
+	struct sock_fprog *prog;
+	struct __test_metadata *metadata;
+};
+
+FIXTURE_DATA(TSYNC) {
+	struct sock_fprog root_prog, apply_prog;
+	struct tsync_sibling sibling[TSYNC_SIBLINGS];
+	sem_t started;
+	pthread_cond_t cond;
+	pthread_mutex_t mutex;
+	int sibling_count;
+};
+
+FIXTURE_SETUP(TSYNC) {
+	struct sock_filter root_filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_filter apply_filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	memset(&self->root_prog, 0, sizeof(self->root_prog));
+	memset(&self->apply_prog, 0, sizeof(self->apply_prog));
+	memset(&self->sibling, 0, sizeof(self->sibling));
+	self->root_prog.filter = malloc(sizeof(root_filter));
+	ASSERT_NE(NULL, self->root_prog.filter);
+	memcpy(self->root_prog.filter, &root_filter, sizeof(root_filter));
+	self->root_prog.len = (unsigned short)(sizeof(root_filter)/sizeof(root_filter[0]));
+
+	self->apply_prog.filter = malloc(sizeof(apply_filter));
+	ASSERT_NE(NULL, self->apply_prog.filter);
+	memcpy(self->apply_prog.filter, &apply_filter, sizeof(apply_filter));
+	self->apply_prog.len = (unsigned short)(sizeof(apply_filter)/sizeof(apply_filter[0]));
+
+	self->sibling_count = 0;
+	pthread_mutex_init(&self->mutex, NULL);
+	pthread_cond_init(&self->cond, NULL);
+	sem_init(&self->started, 0, 0);
+	self->sibling[0].tid = 0;
+	self->sibling[0].cond = &self->cond;
+	self->sibling[0].started = &self->started;
+	self->sibling[0].mutex = &self->mutex;
+	self->sibling[0].diverge = 0;
+	self->sibling[0].num_waits = 1;
+	self->sibling[0].prog = &self->root_prog;
+	self->sibling[0].metadata = _metadata;
+	self->sibling[1].tid = 0;
+	self->sibling[1].cond = &self->cond;
+	self->sibling[1].started = &self->started;
+	self->sibling[1].mutex = &self->mutex;
+	self->sibling[1].diverge = 0;
+	self->sibling[1].prog = &self->root_prog;
+	self->sibling[1].num_waits = 1;
+	self->sibling[1].metadata = _metadata;
+}
+
+FIXTURE_TEARDOWN(TSYNC) {
+	int sib = 0;
+	if (self->root_prog.filter)
+		free(self->root_prog.filter);
+	if (self->apply_prog.filter)
+		free(self->apply_prog.filter);
+
+	for ( ; sib < self->sibling_count; ++sib) {
+		struct tsync_sibling *s = &self->sibling[sib];
+		void *status;
+		if (!s->tid)
+			continue;
+		if (pthread_kill(s->tid, 0)) {
+			//pthread_cancel(s->tid);  // ANDROID
+			pthread_join(s->tid, &status);
+		}
+	}
+	pthread_mutex_destroy(&self->mutex);
+	pthread_cond_destroy(&self->cond);
+	sem_destroy(&self->started);
+};
+
+void *tsync_sibling(void *data)
+{
+	long ret = 0;
+	struct tsync_sibling *me = data;
+	me->system_tid = syscall(__NR_gettid);
+
+	pthread_mutex_lock(me->mutex);
+	if (me->diverge) {
+		/* Just re-apply the root prog to fork the tree */
+		ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER,
+				me->prog, 0, 0);
+	}
+	sem_post(me->started);
+	/* Return outside of started so parent notices failures. */
+	if (ret) {
+		pthread_mutex_unlock(me->mutex);
+		return (void *)SIBLING_EXIT_FAILURE;
+	}
+	do {
+		pthread_cond_wait(me->cond, me->mutex);
+		me->num_waits = me->num_waits - 1;
+	}
+	while (me->num_waits);
+	pthread_mutex_unlock(me->mutex);
+	long nnp = prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0);
+	if (!nnp)
+		return (void*)SIBLING_EXIT_NEWPRIVS;
+	read(0, NULL, 0);
+	return (void *)SIBLING_EXIT_UNKILLED;
+}
+
+void tsync_start_sibling(struct tsync_sibling *sibling)
+{
+	pthread_create(&sibling->tid, NULL, tsync_sibling, (void *)sibling);
+}
+
+TEST_F(TSYNC, siblings_fail_prctl) {
+	long ret;
+	void *status;
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | EINVAL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	/* Check prctl failure detection by requesting sib 0 diverge. */
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("setting filter failed");
+	}
+
+	self->sibling[0].diverge = 1;
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	/* Signal the threads to clean up*/
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+
+	/* Ensure diverging sibling failed to call prctl. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_FAILURE, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
+}
+
+TEST_F(TSYNC, two_siblings_with_ancestor) {
+	long ret;
+	void *status;
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
+	}
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Could install filter on all threads!");
+	}
+	/* Tell the siblings to test the policy */
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+	/* Ensure they are both killed and don't exit cleanly. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(0x0, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(0x0, (long)status);
+}
+
+TEST_F(TSYNC, two_sibling_want_nnp) {
+	void *status;
+
+	/* start siblings before any prctl() operations */
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	/* Tell the siblings to test no policy */
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+
+	/* Ensure they are both upset about lacking nnp. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status);
+}
+
+TEST_F(TSYNC, two_siblings_with_no_filter) {
+	long ret;
+	void *status;
+
+	/* start siblings before any prctl() operations */
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Could install filter on all threads!");
+	}
+
+	/* Tell the siblings to test the policy */
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+
+	/* Ensure they are both killed and don't exit cleanly. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(0x0, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(0x0, (long)status);
+}
+
+TEST_F(TSYNC, two_siblings_with_one_divergence) {
+	long ret;
+	void *status;
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
+	}
+	self->sibling[0].diverge = 1;
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(self->sibling[0].system_tid, ret) {
+		TH_LOG("Did not fail on diverged sibling.");
+	}
+
+	/* Wake the threads */
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+
+	/* Ensure they are both unkilled. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
+}
+
+TEST_F(TSYNC, two_siblings_not_under_filter) {
+	long ret, sib;
+	void *status;
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	/*
+	 * Sibling 0 will have its own seccomp policy
+	 * and Sibling 1 will not be under seccomp at
+	 * all. Sibling 1 will enter seccomp and 0
+	 * will cause failure.
+	 */
+	self->sibling[0].diverge = 1;
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(ret, self->sibling[0].system_tid) {
+		TH_LOG("Did not fail on diverged sibling.");
+	}
+	sib = 1;
+	if (ret == self->sibling[0].system_tid)
+		sib = 0;
+
+	pthread_mutex_lock(&self->mutex);
+
+	/* Increment the other siblings num_waits so we can clean up
+	 * the one we just saw.
+	 */
+	self->sibling[!sib].num_waits += 1;
+
+	/* Signal the thread to clean up*/
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+	pthread_join(self->sibling[sib].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
+	/* Poll for actual task death. pthread_join doesn't guarantee it. */
+	while (!kill(self->sibling[sib].system_tid, 0)) sleep(0.1);
+	/* Switch to the remaining sibling */
+	sib = !sib;
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Expected the remaining sibling to sync");
+	};
+
+	pthread_mutex_lock(&self->mutex);
+
+	/* If remaining sibling didn't have a chance to wake up during
+	 * the first broadcast, manually reduce the num_waits now.
+	 */
+	if (self->sibling[sib].num_waits > 1)
+		self->sibling[sib].num_waits = 1;
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+	pthread_join(self->sibling[sib].tid, &status);
+	EXPECT_EQ(0, (long)status);
+	/* Poll for actual task death. pthread_join doesn't guarantee it. */
+	while (!kill(self->sibling[sib].system_tid, 0)) sleep(0.1);
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(0, ret);  /* just us chickens */
+}
+
+/* Make sure restarted syscalls are seen directly as "restart_syscall". */
+TEST(syscall_restart) {
+	long ret;
+	unsigned long msg;
+	pid_t child_pid;
+	int pipefd[2];
+	int status;
+	siginfo_t info = { };
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			 offsetof(struct seccomp_data, nr)),
+
+#ifdef __NR_sigreturn
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_sigreturn, 6, 0),
+#endif
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 5, 0),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_exit, 4, 0),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_rt_sigreturn, 3, 0),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_poll, 4, 0),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_restart_syscall, 4, 0),
+
+		/* Allow __NR_write for easy logging. */
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_write, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x100), /* poll */
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x200), /* restart */
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	ASSERT_EQ(0, pipe(pipefd));
+
+	child_pid = fork();
+	ASSERT_LE(0, child_pid);
+	if (child_pid == 0) {
+		/* Child uses EXPECT not ASSERT to deliver status correctly. */
+		char buf = ' ';
+		struct pollfd fds = {
+			.fd = pipefd[0],
+			.events = POLLIN,
+		};
+
+		/* Attach parent as tracer and stop. */
+		EXPECT_EQ(0, ptrace(PTRACE_TRACEME));
+		EXPECT_EQ(0, raise(SIGSTOP));
+
+		EXPECT_EQ(0, close(pipefd[1]));
+
+		EXPECT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+			TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+		}
+
+		ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+		EXPECT_EQ(0, ret) {
+			TH_LOG("Failed to install filter!");
+		}
+
+		EXPECT_EQ(1, read(pipefd[0], &buf, 1)) {
+			TH_LOG("Failed to read() sync from parent");
+		}
+		EXPECT_EQ('.', buf) {
+			TH_LOG("Failed to get sync data from read()");
+		}
+
+		/* Start poll to be interrupted. */
+		errno = 0;
+		EXPECT_EQ(1, poll(&fds, 1, -1)) {
+			TH_LOG("Call to poll() failed (errno %d)", errno);
+		}
+
+		/* Read final sync from parent. */
+		EXPECT_EQ(1, read(pipefd[0], &buf, 1)) {
+			TH_LOG("Failed final read() from parent");
+		}
+		EXPECT_EQ('!', buf) {
+			TH_LOG("Failed to get final data from read()");
+		}
+
+		/* Directly report the status of our test harness results. */
+		syscall(__NR_exit, _metadata->passed ? EXIT_SUCCESS
+						     : EXIT_FAILURE);
+	}
+	EXPECT_EQ(0, close(pipefd[0]));
+
+	/* Attach to child, setup options, and release. */
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(0, ptrace(PTRACE_SETOPTIONS, child_pid, NULL,
+			    PTRACE_O_TRACESECCOMP));
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+	ASSERT_EQ(1, write(pipefd[1], ".", 1));
+
+	/* Wait for poll() to start. */
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
+	ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
+	ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
+	ASSERT_EQ(0x100, msg);
+	EXPECT_EQ(__NR_poll, get_syscall(_metadata, child_pid));
+
+	/* Might as well check siginfo for sanity while we're here. */
+	ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
+	ASSERT_EQ(SIGTRAP, info.si_signo);
+	ASSERT_EQ(SIGTRAP | (PTRACE_EVENT_SECCOMP << 8), info.si_code);
+	EXPECT_EQ(0, info.si_errno);
+	EXPECT_EQ(getuid(), info.si_uid);
+	/* Verify signal delivery came from child (seccomp-triggered). */
+	EXPECT_EQ(child_pid, info.si_pid);
+
+	/* Interrupt poll with SIGSTOP (which we'll need to handle). */
+	ASSERT_EQ(0, kill(child_pid, SIGSTOP));
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(SIGSTOP, WSTOPSIG(status));
+	/* Verify signal delivery came from parent now. */
+	ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
+	EXPECT_EQ(getpid(), info.si_pid);
+
+	/* Restart poll with SIGCONT, which triggers restart_syscall. */
+	ASSERT_EQ(0, kill(child_pid, SIGCONT));
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(SIGCONT, WSTOPSIG(status));
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+
+	/* Wait for restart_syscall() to start. */
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
+	ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
+	ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
+	ASSERT_EQ(0x200, msg);
+	ret = get_syscall(_metadata, child_pid);
+#if defined(__arm__)
+	/* FIXME: ARM does not expose true syscall in registers. */
+	EXPECT_EQ(__NR_poll, ret);
+#else
+	EXPECT_EQ(__NR_restart_syscall, ret);
+#endif
+
+	/* Write again to end poll. */
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+	ASSERT_EQ(1, write(pipefd[1], "!", 1));
+	EXPECT_EQ(0, close(pipefd[1]));
+
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	if (WIFSIGNALED(status) || WEXITSTATUS(status))
+		_metadata->passed = 0;
+}
+
+/*
+ * TODO:
+ * - add microbenchmarks
+ * - expand NNP testing
+ * - better arch-specific TRACE and TRAP handlers.
+ * - endianness checking when appropriate
+ * - 64-bit arg prodding
+ * - arch value testing (x86 modes especially)
+ * - ...
+ */
+
+// ANDROID:begin
+struct __test_metadata* get_seccomp_test_list() {
+  return __test_list;
+}
+// ANDROID:end
+
+TEST_HARNESS_MAIN
diff --git a/tests/tests/os/jni/seccomp-tests/tests/sigsegv.c b/tests/tests/os/jni/seccomp-tests/tests/sigsegv.c
new file mode 100644
index 0000000..a0d06e7
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/sigsegv.c
@@ -0,0 +1,179 @@
+/* sigsegv.c
+ * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Forces a denied system call to trigger a SIGSEGV at the instruction after
+ * the call using a SIGSYS handler.. This can be useful when debugging
+ * frameworks have trouble tracing through the SIGSYS handler.
+ * Proof of concept using amd64 registers and 'syscall'.
+ */
+
+#include <asm/siginfo.h>
+#define __have_siginfo_t 1
+#define __have_sigval_t 1
+#define __have_sigevent_t 1
+
+#include <linux/filter.h>
+#include <sys/prctl.h>
+#include <linux/prctl.h>
+#include <linux/seccomp.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <string.h>
+#include <syscall.h>
+#define __USE_GNU 1
+#include <sys/ucontext.h>
+#include <sys/mman.h>
+
+#include "test_harness.h"
+
+#ifndef PR_SET_NO_NEW_PRIVS
+#define PR_SET_NO_NEW_PRIVS 38
+#define PR_GET_NO_NEW_PRIVS 39
+#endif
+
+#if defined(__i386__)
+#define REG_IP	REG_EIP
+#define REG_SP	REG_ESP
+#define REG_RESULT	REG_EAX
+#define REG_SYSCALL	REG_EAX
+#define REG_ARG0	REG_EBX
+#define REG_ARG1	REG_ECX
+#define REG_ARG2	REG_EDX
+#define REG_ARG3	REG_ESI
+#define REG_ARG4	REG_EDI
+#define REG_ARG5	REG_EBP
+#elif defined(__x86_64__)
+#define REG_IP	REG_RIP
+#define REG_SP	REG_RSP
+#define REG_RESULT	REG_RAX
+#define REG_SYSCALL	REG_RAX
+#define REG_ARG0	REG_RDI
+#define REG_ARG1	REG_RSI
+#define REG_ARG2	REG_RDX
+#define REG_ARG3	REG_R10
+#define REG_ARG4	REG_R8
+#define REG_ARG5	REG_R9
+#endif
+
+FIXTURE_DATA(TRAP) {
+	struct sock_fprog prog;
+};
+
+FIXTURE_SETUP(TRAP) {
+	/* instruction after the syscall. Will be arch specific, of course. */
+	{
+		struct sock_filter filter[] = {
+			BPF_STMT(BPF_LD+BPF_W+BPF_ABS,
+				offsetof(struct seccomp_data, nr)),
+			/* Whitelist anything you might need in the sigaction */
+#ifdef __NR_sigreturn
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_sigreturn, 4, 0),
+#endif
+			/* TODO: only allow PROT_NONE */
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_mprotect, 3, 0),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_exit, 2, 0),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_rt_sigreturn, 1, 0),
+			/* Allow __NR_write so easy logging. */
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_write, 0, 1),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_TRAP),
+		};
+		memset(&self->prog, 0, sizeof(self->prog));
+		self->prog.filter = malloc(sizeof(filter));
+		ASSERT_NE(NULL, self->prog.filter);
+		memcpy(self->prog.filter, filter, sizeof(filter));
+		self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+	}
+}
+
+FIXTURE_TEARDOWN(TRAP) {
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+struct arch_sigsys {
+		void *_call_addr; /* calling user insn */
+		int _syscall;	/* triggering system call number */
+		unsigned int _arch;	/* AUDIT_ARCH_* of syscall */
+};
+
+#define _ALIGN(x,sz) (((x + ((sz)-1)) & ~((sz)-1)) - (sz))
+#define ALIGN(x,sz) ((typeof(x))_ALIGN((unsigned long)(x),(unsigned long)(sz)))
+static long local_mprotect(void *target, unsigned long sz)
+{
+	register unsigned long res asm ("rax") = __NR_mprotect;
+	__attribute__((unused)) register void *addr asm ("rdi") = ALIGN(target, sz);
+	__attribute__((unused)) register long len asm ("rsi") = sz;
+	__attribute__((unused)) register long num asm ("rdx") = PROT_NONE;
+	__asm__("syscall\n");
+	return res;
+}
+
+static void TRAP_action(int nr, siginfo_t *info, void *void_context)
+{
+	ucontext_t *ctx = (ucontext_t *)void_context;
+	char buf[256];
+	int len;
+	struct arch_sigsys *sys = (struct arch_sigsys *)
+#ifdef si_syscall
+		&(info->si_call_addr);
+#else
+		&(info->si_pid);
+#endif
+
+	if (info->si_code != SYS_SECCOMP)
+		return;
+	if (!ctx)
+		return;
+	len = snprintf(buf, sizeof(buf),
+			"@0x%lX:%X:%d:0x%lX:0x%lX:0x%lX:0x%lX:0x%lX:0x%lX [0x%lX]\n",
+			(unsigned long)sys->_call_addr,
+			sys->_arch,
+			sys->_syscall,
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG0],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG1],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG2],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG3],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG4],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG5],
+			(unsigned long)ALIGN(ctx->uc_mcontext.gregs[REG_IP],
+			4096));
+	/* Emit some useful logs or whatever. */
+	syscall(__NR_write, STDOUT_FILENO, buf, len);
+	/* Make the calling page non-exec */
+	/* Careful on how it is called since it may make the syscall() instructions non-exec. */
+	local_mprotect((void *)ctx->uc_mcontext.gregs[REG_IP], sysconf(_SC_PAGE_SIZE));
+}
+
+TEST_F_SIGNAL(TRAP, sigsegv, SIGSEGV) {
+	int ret;
+	struct sigaction act;
+	sigset_t mask;
+	memset(&act, 0, sizeof(act));
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGSYS);
+
+	act.sa_sigaction = &TRAP_action;
+	act.sa_flags = SA_SIGINFO;
+	ret = sigaction(SIGSYS, &act, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigaction failed");
+	}
+	ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigprocmask failed");
+	}
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+
+	/* Call anything! */
+	ret = syscall(__NR_getpid);
+}
+
+TEST_HARNESS_MAIN
diff --git a/tests/tests/os/jni/seccomp-tests/tests/test_harness.h b/tests/tests/os/jni/seccomp-tests/tests/test_harness.h
new file mode 100644
index 0000000..597e40c
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/test_harness.h
@@ -0,0 +1,521 @@
+/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * test_harness.h: simple C unit test helper.
+ *
+ * Usage:
+ *   #include "test_harness.h"
+ *   TEST(standalone_test) {
+ *     do_some_stuff;
+ *     EXPECT_GT(10, stuff) {
+ *        stuff_state_t state;
+ *        enumerate_stuff_state(&state);
+ *        TH_LOG("expectation failed with state: %s", state.msg);
+ *     }
+ *     more_stuff;
+ *     ASSERT_NE(some_stuff, NULL) TH_LOG("how did it happen?!");
+ *     last_stuff;
+ *     EXPECT_EQ(0, last_stuff);
+ *   }
+ *
+ *   FIXTURE(my_fixture) {
+ *     mytype_t *data;
+ *     int awesomeness_level;
+ *   };
+ *   FIXTURE_SETUP(my_fixture) {
+ *     self->data = mytype_new();
+ *     ASSERT_NE(NULL, self->data);
+ *   }
+ *   FIXTURE_TEARDOWN(my_fixture) {
+ *     mytype_free(self->data);
+ *   }
+ *   TEST_F(my_fixture, data_is_good) {
+ *     EXPECT_EQ(1, is_my_data_good(self->data));
+ *   }
+ *
+ *   TEST_HARNESS_MAIN
+ *
+ * API inspired by code.google.com/p/googletest
+ */
+#ifndef TEST_HARNESS_H_
+#define TEST_HARNESS_H_
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <android/log.h>  // ANDROID
+
+/* All exported functionality should be declared through this macro. */
+#define TEST_API(x) _##x
+
+/*
+ * Exported APIs
+ */
+
+/* TEST(name) { implementation }
+ * Defines a test by name.
+ * Names must be unique and tests must not be run in parallel.  The
+ * implementation containing block is a function and scoping should be treated
+ * as such.  Returning early may be performed with a bare "return;" statement.
+ *
+ * EXPECT_* and ASSERT_* are valid in a TEST() { } context.
+ */
+#define TEST TEST_API(TEST)
+
+/* TEST_SIGNAL(name, signal) { implementation }
+ * Defines a test by name and the expected term signal.
+ * Names must be unique and tests must not be run in parallel.  The
+ * implementation containing block is a function and scoping should be treated
+ * as such.  Returning early may be performed with a bare "return;" statement.
+ *
+ * EXPECT_* and ASSERT_* are valid in a TEST() { } context.
+ */
+#define TEST_SIGNAL TEST_API(TEST_SIGNAL)
+
+/* FIXTURE(datatype name) {
+ *   type property1;
+ *   ...
+ * };
+ * Defines the data provided to TEST_F()-defined tests as |self|.  It should be
+ * populated and cleaned up using FIXTURE_SETUP and FIXTURE_TEARDOWN.
+ */
+#define FIXTURE TEST_API(FIXTURE)
+
+/* FIXTURE_DATA(datatype name)
+ * This call may be used when the type of the fixture data
+ * is needed.  In general, this should not be needed unless
+ * the |self| is being passed to a helper directly.
+ */
+#define FIXTURE_DATA TEST_API(FIXTURE_DATA)
+
+/* FIXTURE_SETUP(fixture name) { implementation }
+ * Populates the required "setup" function for a fixture.  An instance of the
+ * datatype defined with _FIXTURE_DATA will be exposed as |self| for the
+ * implementation.
+ *
+ * ASSERT_* are valid for use in this context and will prempt the execution
+ * of any dependent fixture tests.
+ *
+ * A bare "return;" statement may be used to return early.
+ */
+#define FIXTURE_SETUP TEST_API(FIXTURE_SETUP)
+
+/* FIXTURE_TEARDOWN(fixture name) { implementation }
+ * Populates the required "teardown" function for a fixture.  An instance of the
+ * datatype defined with _FIXTURE_DATA will be exposed as |self| for the
+ * implementation to clean up.
+ *
+ * A bare "return;" statement may be used to return early.
+ */
+#define FIXTURE_TEARDOWN TEST_API(FIXTURE_TEARDOWN)
+
+/* TEST_F(fixture, name) { implementation }
+ * Defines a test that depends on a fixture (e.g., is part of a test case).
+ * Very similar to TEST() except that |self| is the setup instance of fixture's
+ * datatype exposed for use by the implementation.
+ */
+#define TEST_F TEST_API(TEST_F)
+
+#define TEST_F_SIGNAL TEST_API(TEST_F_SIGNAL)
+
+/* Use once to append a main() to the test file. E.g.,
+ *   TEST_HARNESS_MAIN
+ */
+#define TEST_HARNESS_MAIN TEST_API(TEST_HARNESS_MAIN)
+
+/*
+ * Operators for use in TEST and TEST_F.
+ * ASSERT_* calls will stop test execution immediately.
+ * EXPECT_* calls will emit a failure warning, note it, and continue.
+ */
+
+/* ASSERT_EQ(expected, measured): expected == measured */
+#define ASSERT_EQ TEST_API(ASSERT_EQ)
+/* ASSERT_NE(expected, measured): expected != measured */
+#define ASSERT_NE TEST_API(ASSERT_NE)
+/* ASSERT_LT(expected, measured): expected < measured */
+#define ASSERT_LT TEST_API(ASSERT_LT)
+/* ASSERT_LE(expected, measured): expected <= measured */
+#define ASSERT_LE TEST_API(ASSERT_LE)
+/* ASSERT_GT(expected, measured): expected > measured */
+#define ASSERT_GT TEST_API(ASSERT_GT)
+/* ASSERT_GE(expected, measured): expected >= measured */
+#define ASSERT_GE TEST_API(ASSERT_GE)
+/* ASSERT_NULL(measured): NULL == measured */
+#define ASSERT_NULL TEST_API(ASSERT_NULL)
+/* ASSERT_TRUE(measured): measured != 0 */
+#define ASSERT_TRUE TEST_API(ASSERT_TRUE)
+/* ASSERT_FALSE(measured): measured == 0 */
+#define ASSERT_FALSE TEST_API(ASSERT_FALSE)
+/* ASSERT_STREQ(expected, measured): !strcmp(expected, measured) */
+#define ASSERT_STREQ TEST_API(ASSERT_STREQ)
+/* ASSERT_STRNE(expected, measured): strcmp(expected, measured) */
+#define ASSERT_STRNE TEST_API(ASSERT_STRNE)
+/* EXPECT_EQ(expected, measured): expected == measured */
+#define EXPECT_EQ TEST_API(EXPECT_EQ)
+/* EXPECT_NE(expected, measured): expected != measured */
+#define EXPECT_NE TEST_API(EXPECT_NE)
+/* EXPECT_LT(expected, measured): expected < measured */
+#define EXPECT_LT TEST_API(EXPECT_LT)
+/* EXPECT_LE(expected, measured): expected <= measured */
+#define EXPECT_LE TEST_API(EXPECT_LE)
+/* EXPECT_GT(expected, measured): expected > measured */
+#define EXPECT_GT TEST_API(EXPECT_GT)
+/* EXPECT_GE(expected, measured): expected >= measured */
+#define EXPECT_GE TEST_API(EXPECT_GE)
+/* EXPECT_NULL(measured): NULL == measured */
+#define EXPECT_NULL TEST_API(EXPECT_NULL)
+/* EXPECT_TRUE(measured): 0 != measured */
+#define EXPECT_TRUE TEST_API(EXPECT_TRUE)
+/* EXPECT_FALSE(measured): 0 == measured */
+#define EXPECT_FALSE TEST_API(EXPECT_FALSE)
+/* EXPECT_STREQ(expected, measured): !strcmp(expected, measured) */
+#define EXPECT_STREQ TEST_API(EXPECT_STREQ)
+/* EXPECT_STRNE(expected, measured): strcmp(expected, measured) */
+#define EXPECT_STRNE TEST_API(EXPECT_STRNE)
+
+/* TH_LOG(format, ...)
+ * Optional debug logging function available for use in tests.
+ * Logging may be enabled or disabled by defining TH_LOG_ENABLED.
+ * E.g., #define TH_LOG_ENABLED 1
+ * If no definition is provided, logging is enabled by default.
+ */
+#define TH_LOG  TEST_API(TH_LOG)
+
+/*
+ * Internal implementation.
+ *
+ */
+
+/* Utilities exposed to the test definitions */
+#ifndef TH_LOG_STREAM
+#  define TH_LOG_STREAM stderr
+#endif
+
+#ifndef TH_LOG_ENABLED
+#  define TH_LOG_ENABLED 1
+#endif
+
+#define _TH_LOG(fmt, ...) do { \
+  if (TH_LOG_ENABLED) \
+    __TH_LOG(fmt, ##__VA_ARGS__); \
+} while (0)
+
+/* Unconditional logger for internal use. */
+// ANDROID:begin
+#define __TH_LOG(fmt, ...) \
+    __android_log_print(ANDROID_LOG_ERROR, "SeccompBpfTest-KernelUnit", "%s:%d:%s:" fmt "\n", \
+            __FILE__, __LINE__, _metadata->name, ##__VA_ARGS__)
+// ANDROID:end
+
+/* Defines the test function and creates the registration stub. */
+#define _TEST(test_name) __TEST_IMPL(test_name, -1)
+
+#define _TEST_SIGNAL(test_name, signal) __TEST_IMPL(test_name, signal)
+
+#define __TEST_IMPL(test_name, _signal) \
+  static void test_name(struct __test_metadata *_metadata); \
+  static struct __test_metadata _##test_name##_object = \
+    { name: "global." #test_name, fn: &test_name, termsig: _signal }; \
+  static void __attribute__((constructor)) _register_##test_name(void) { \
+    __register_test(&_##test_name##_object); \
+  } \
+  static void test_name( \
+    struct __test_metadata __attribute__((unused)) *_metadata)
+
+/* Wraps the struct name so we have one less argument to pass around. */
+#define _FIXTURE_DATA(fixture_name) struct _test_data_##fixture_name
+
+/* Called once per fixture to setup the data and register. */
+#define _FIXTURE(fixture_name) \
+  static void __attribute__((constructor)) \
+      _register_##fixture_name##_data(void) { \
+    __fixture_count++; \
+  } \
+  _FIXTURE_DATA(fixture_name)
+
+/* Prepares the setup function for the fixture.  |_metadata| is included
+ * so that ASSERT_* work as a convenience.
+ */
+#define _FIXTURE_SETUP(fixture_name) \
+  void fixture_name##_setup( \
+    struct __test_metadata __attribute__((unused)) *_metadata, \
+    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)
+#define _FIXTURE_TEARDOWN(fixture_name) \
+  void fixture_name##_teardown( \
+    struct __test_metadata __attribute__((unused)) *_metadata, \
+    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)
+
+/* Emits test registration and helpers for fixture-based test
+ * cases.
+ * TODO(wad) register fixtures on dedicated test lists.
+ */
+#define _TEST_F(fixture_name, test_name) \
+  __TEST_F_IMPL(fixture_name, test_name, -1)
+
+#define _TEST_F_SIGNAL(fixture_name, test_name, signal) \
+  __TEST_F_IMPL(fixture_name, test_name, signal)
+
+#define __TEST_F_IMPL(fixture_name, test_name, signal) \
+  static void fixture_name##_##test_name( \
+    struct __test_metadata *_metadata, \
+    _FIXTURE_DATA(fixture_name) *self); \
+  static inline void wrapper_##fixture_name##_##test_name( \
+    struct __test_metadata *_metadata) { \
+    /* fixture data is allocated, setup, and torn down per call. */ \
+    _FIXTURE_DATA(fixture_name) self; \
+    memset(&self, 0, sizeof(_FIXTURE_DATA(fixture_name))); \
+    fixture_name##_setup(_metadata, &self); \
+    /* Let setup failure terminate early. */ \
+    if (!_metadata->passed) return; \
+    fixture_name##_##test_name(_metadata, &self); \
+    fixture_name##_teardown(_metadata, &self); \
+  } \
+  static struct __test_metadata _##fixture_name##_##test_name##_object = { \
+    name: #fixture_name "." #test_name, \
+    fn: &wrapper_##fixture_name##_##test_name, \
+    termsig: signal, \
+   }; \
+  static void __attribute__((constructor)) \
+      _register_##fixture_name##_##test_name(void) { \
+    __register_test(&_##fixture_name##_##test_name##_object); \
+  } \
+  static void fixture_name##_##test_name( \
+    struct __test_metadata __attribute__((unused)) *_metadata, \
+    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)
+
+/* Exports a simple wrapper to run the test harness. */
+#define _TEST_HARNESS_MAIN \
+  static void __attribute__((constructor)) __constructor_order_last(void) { \
+    if (!__constructor_order) \
+      __constructor_order = _CONSTRUCTOR_ORDER_BACKWARD; \
+  } \
+  int seccomp_test_main(int argc, char **argv) { return test_harness_run(argc, argv); }  // ANDROID
+
+#define _ASSERT_EQ(_expected, _seen) \
+  __EXPECT(_expected, _seen, ==, 1)
+#define _ASSERT_NE(_expected, _seen) \
+  __EXPECT(_expected, _seen, !=, 1)
+#define _ASSERT_LT(_expected, _seen) \
+  __EXPECT(_expected, _seen, <, 1)
+#define _ASSERT_LE(_expected, _seen) \
+  __EXPECT(_expected, _seen, <=, 1)
+#define _ASSERT_GT(_expected, _seen) \
+  __EXPECT(_expected, _seen, >, 1)
+#define _ASSERT_GE(_expected, _seen) \
+  __EXPECT(_expected, _seen, >=, 1)
+#define _ASSERT_NULL(_seen) \
+  __EXPECT(NULL, _seen, ==, 1)
+
+#define _ASSERT_TRUE(_seen) \
+  _ASSERT_NE(0, _seen)
+#define _ASSERT_FALSE(_seen) \
+  _ASSERT_EQ(0, _seen)
+#define _ASSERT_STREQ(_expected, _seen) \
+  __EXPECT_STR(_expected, _seen, ==, 1)
+#define _ASSERT_STRNE(_expected, _seen) \
+  __EXPECT_STR(_expected, _seen, !=, 1)
+
+#define _EXPECT_EQ(_expected, _seen) \
+  __EXPECT(_expected, _seen, ==, 0)
+#define _EXPECT_NE(_expected, _seen) \
+  __EXPECT(_expected, _seen, !=, 0)
+#define _EXPECT_LT(_expected, _seen) \
+  __EXPECT(_expected, _seen, <, 0)
+#define _EXPECT_LE(_expected, _seen) \
+  __EXPECT(_expected, _seen, <=, 0)
+#define _EXPECT_GT(_expected, _seen) \
+  __EXPECT(_expected, _seen, >, 0)
+#define _EXPECT_GE(_expected, _seen) \
+  __EXPECT(_expected, _seen, >=, 0)
+
+#define _EXPECT_NULL(_seen) \
+  __EXPECT(NULL, _seen, ==, 0)
+#define _EXPECT_TRUE(_seen) \
+  _EXPECT_NE(0, _seen)
+#define _EXPECT_FALSE(_seen) \
+  _EXPECT_EQ(0, _seen)
+
+#define _EXPECT_STREQ(_expected, _seen) \
+  __EXPECT_STR(_expected, _seen, ==, 0)
+#define _EXPECT_STRNE(_expected, _seen) \
+  __EXPECT_STR(_expected, _seen, !=, 0)
+
+/* Support an optional handler after and ASSERT_* or EXPECT_*.  The approach is
+ * not thread-safe, but it should be fine in most sane test scenarios.
+ *
+ * Using __bail(), which optionally abort()s, is the easiest way to early
+ * return while still providing an optional block to the API consumer.
+ */
+#define OPTIONAL_HANDLER(_assert) \
+  for (; _metadata->trigger;  _metadata->trigger = __bail(_assert))
+
+#define __EXPECT(_expected, _seen, _t, _assert) do { \
+  /* Avoid multiple evaluation of the cases */ \
+  __typeof__(_expected) __exp = (_expected); \
+  __typeof__(_seen) __seen = (_seen); \
+  if (!(__exp _t __seen)) { \
+    unsigned long long __exp_print = 0; \
+    unsigned long long __seen_print = 0; \
+    /* Avoid casting complaints the scariest way we can. */ \
+    memcpy(&__exp_print, &__exp, sizeof(__exp)); \
+    memcpy(&__seen_print, &__seen, sizeof(__seen)); \
+    __TH_LOG("Expected %s (%llu) %s %s (%llu)", \
+            #_expected, __exp_print, #_t, \
+            #_seen, __seen_print); \
+    _metadata->passed = 0; \
+    /* Ensure the optional handler is triggered */ \
+    _metadata->trigger = 1; \
+  } \
+} while (0); OPTIONAL_HANDLER(_assert)
+
+#define __EXPECT_STR(_expected, _seen, _t, _assert) do { \
+  const char *__exp = (_expected); \
+  const char *__seen = (_seen); \
+  if (!(strcmp(__exp, __seen) _t 0))  { \
+    __TH_LOG("Expected '%s' %s '%s'.", __exp, #_t, __seen); \
+    _metadata->passed = 0; \
+    _metadata->trigger = 1; \
+  } \
+} while (0); OPTIONAL_HANDLER(_assert)
+
+/* Contains all the information for test execution and status checking. */
+struct __test_metadata {
+  const char *name;
+  void (*fn)(struct __test_metadata *);
+  int termsig;
+  int passed;
+  int trigger; /* extra handler after the evaluation */
+  struct __test_metadata *prev, *next;
+};
+
+/* Storage for the (global) tests to be run. */
+static struct __test_metadata *__test_list = NULL;
+static unsigned int __test_count = 0;
+static unsigned int __fixture_count = 0;
+static int __constructor_order = 0;
+
+#define _CONSTRUCTOR_ORDER_FORWARD   1
+#define _CONSTRUCTOR_ORDER_BACKWARD -1
+
+/*
+ * Since constructors are called in reverse order, reverse the test
+ * list so tests are run in source declaration order.
+ * https://gcc.gnu.org/onlinedocs/gccint/Initialization.html
+ * However, it seems not all toolchains do this correctly, so use
+ * __constructor_order to detect which direction is called first
+ * and adjust list building logic to get things running in the right
+ * direction.
+ */
+static inline void __register_test(struct __test_metadata *t) {
+  __test_count++;
+  /* Circular linked list where only prev is circular. */
+  if (__test_list == NULL) {
+    __test_list = t;
+    t->next = NULL;
+    t->prev = t;
+    return;
+  }
+  if (__constructor_order == _CONSTRUCTOR_ORDER_FORWARD) {
+    t->next = NULL;
+    t->prev = __test_list->prev;
+    t->prev->next = t;
+    __test_list->prev = t;
+  } else {
+    t->next = __test_list;
+    t->next->prev = t;
+    t->prev = t;
+    __test_list = t;
+  }
+}
+
+static inline int __bail(int for_realz) {
+  if (for_realz)
+    abort();
+  return 0;
+}
+
+void __run_test(struct __test_metadata *t) {
+  pid_t child_pid;
+  int status;
+  t->passed = 1;
+  t->trigger = 0;
+  printf("[ RUN      ] %s\n", t->name);
+  child_pid = fork();
+  if (child_pid < 0) {
+    printf("ERROR SPAWNING TEST CHILD\n");
+    t->passed = 0;
+  } else if (child_pid == 0) {
+    t->fn(t);
+    _exit(t->passed);
+  } else {
+    /* TODO(wad) add timeout support. */
+    waitpid(child_pid, &status, 0);
+    if (WIFEXITED(status)) {
+      t->passed = t->termsig == -1 ? WEXITSTATUS(status) : 0;
+      if (t->termsig != -1) {
+       fprintf(TH_LOG_STREAM,
+                "%s: Test exited normally instead of by signal (code: %d)\n",
+               t->name,
+               WEXITSTATUS(status));
+      }
+    } else if (WIFSIGNALED(status)) {
+      t->passed = 0;
+      if (WTERMSIG(status) == SIGABRT) {
+        fprintf(TH_LOG_STREAM,
+                "%s: Test terminated by assertion\n",
+               t->name);
+      } else if (WTERMSIG(status) == t->termsig) {
+        t->passed = 1;
+      } else {
+        fprintf(TH_LOG_STREAM,
+                "%s: Test terminated unexpectedly by signal %d\n",
+               t->name,
+               WTERMSIG(status));
+      }
+    } else {
+        fprintf(TH_LOG_STREAM,
+                "%s: Test ended in some other way [%u]\n",
+               t->name,
+               status);
+    }
+  }
+  printf("[     %4s ] %s\n", (t->passed ? "OK" : "FAIL"), t->name);
+}
+
+static int test_harness_run(int __attribute__((unused)) argc,
+                            char __attribute__((unused)) **argv) {
+  struct __test_metadata *t;
+  int ret = 0;
+  unsigned int count = 0;
+  unsigned int pass_count = 0;
+
+  /* TODO(wad) add optional arguments similar to gtest. */
+  printf("[==========] Running %u tests from %u test cases.\n",
+          __test_count, __fixture_count + 1);
+  for (t = __test_list; t; t = t->next) {
+    count++;
+    __run_test(t);
+    if (t->passed)
+      pass_count++;
+    else
+      ret = 1;
+  }
+  /* TODO(wad) organize by fixtures since ordering is not guaranteed now. */
+  printf("[==========] %u / %u tests passed.\n", pass_count, count);
+  printf("[  %s  ]\n", (ret ? "FAILED" : "PASSED"));
+  return ret;
+}
+
+static void __attribute__((constructor)) __constructor_order_first(void) {
+  if (!__constructor_order)
+    __constructor_order = _CONSTRUCTOR_ORDER_FORWARD;
+}
+
+#endif  /* TEST_HARNESS_H_ */
diff --git a/tests/tests/os/src/android/os/cts/LooperTest.java b/tests/tests/os/src/android/os/cts/LooperTest.java
index 79a55c6..6f7cb6d 100644
--- a/tests/tests/os/src/android/os/cts/LooperTest.java
+++ b/tests/tests/os/src/android/os/cts/LooperTest.java
@@ -78,6 +78,21 @@
         t.runTest(WAIT_TIME);
     }
 
+    public void testIsCurrentThread() throws Throwable {
+        final Looper[] looper = new Looper[1];
+        TestThread t = new TestThread(new Runnable() {
+            @Override
+            public void run() {
+                Looper.prepare();
+                assertTrue(Looper.myLooper().isCurrentThread());
+                looper[0] = Looper.myLooper();
+            }
+        });
+
+        t.runTest(WAIT_TIME);
+        assertFalse(looper[0].isCurrentThread());
+    }
+
     public void testMyQueue() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -96,6 +111,18 @@
         t.runTest(WAIT_TIME);
     }
 
+    public void testGetQueue() throws Throwable {
+        TestThread t = new TestThread(new Runnable() {
+            public void run() {
+                Looper.prepare();
+                assertNotNull(Looper.myLooper().getQueue());
+                assertEquals(Looper.myLooper().getQueue(), Looper.myQueue());
+            }
+        });
+
+        t.runTest(WAIT_TIME);
+    }
+
     public void testPrepare() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
diff --git a/tests/tests/os/src/android/os/cts/MessageQueueTest.java b/tests/tests/os/src/android/os/cts/MessageQueueTest.java
index 5b5bf5c..0c051bf 100644
--- a/tests/tests/os/src/android/os/cts/MessageQueueTest.java
+++ b/tests/tests/os/src/android/os/cts/MessageQueueTest.java
@@ -16,16 +16,25 @@
 
 package android.os.cts;
 
-
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
 import android.os.MessageQueue;
+import android.os.MessageQueue.OnFileDescriptorEventListener;
+import android.os.ParcelFileDescriptor;
+import android.os.ParcelFileDescriptor.AutoCloseInputStream;
+import android.os.ParcelFileDescriptor.AutoCloseOutputStream;
+import android.system.ErrnoException;
+import android.system.Os;
 import android.os.SystemClock;
 import android.os.MessageQueue.IdleHandler;
 import android.test.AndroidTestCase;
 
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -59,7 +68,7 @@
         }
     }
 
-    private enum Test {ADD_IDLE_HANDLER, REMOVE_IDLE_HANDLER};
+    private enum Test {ADD_IDLE_HANDLER, REMOVE_IDLE_HANDLER}
 
     /**
      * {@link HandlerThread} that adds or removes an idle handler depending on the {@link Test}
@@ -84,6 +93,7 @@
             super.onLooperPrepared();
 
             IdleHandler idleHandler = new IdleHandler() {
+                @Override
                 public boolean queueIdle() {
                     mIdleLatch.countDown();
                     return false;
@@ -113,12 +123,55 @@
         }
     }
 
+    public void testIsIdle() throws Exception {
+        HandlerThread thread = new HandlerThread("testIsIdle");
+        thread.start();
+        try {
+            // Queue should initially be idle.
+            assertTrue(thread.getLooper().getQueue().isIdle());
+
+            // Post two messages.  Block in the first one leaving the second one pending.
+            final CountDownLatch latch1 = new CountDownLatch(1);
+            final CountDownLatch latch2 = new CountDownLatch(1);
+            Handler handler = new Handler(thread.getLooper());
+            handler.post(new Runnable() {
+                @Override
+                public void run() {
+                    // Wait for latch1 released before returning.
+                    try {
+                        latch1.await(TIMEOUT, TimeUnit.MILLISECONDS);
+                    } catch (InterruptedException ex) { }
+                }
+            });
+            handler.post(new Runnable() {
+                @Override
+                public void run() {
+                    // Release latch2 when finished.
+                    latch2.countDown();
+                }
+            });
+
+            // The first message is blocked so the second should still be in the queue.
+            // At this point the queue will not be idle because there is a pending message.
+            assertFalse(thread.getLooper().getQueue().isIdle());
+
+            // Let the first message complete and wait for the second to leave the queue.
+            // At this point the queue will be idle because it is empty.
+            latch1.countDown();
+            latch2.await(TIMEOUT, TimeUnit.MILLISECONDS);
+            assertTrue(thread.getLooper().getQueue().isIdle());
+        } finally {
+            thread.quitSafely();
+        }
+    }
+
     /**
      * Use MessageQueue, send message by order
      */
     public void testMessageOrder() throws Exception {
 
         OrderTestHelper tester = new OrderTestHelper() {
+            @Override
             public void init() {
                 super.init();
                 long now = SystemClock.uptimeMillis() + 200;
@@ -142,6 +195,7 @@
 
         OrderTestHelper tester = new OrderTestHelper() {
 
+            @Override
             public void init() {
                 super.init();
                 long now = SystemClock.uptimeMillis() + 200;
@@ -151,6 +205,7 @@
                 mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(0));
             }
 
+            @Override
             public void handleMessage(Message msg) {
                 super.handleMessage(msg);
                 if (msg.what == 0) {
@@ -162,16 +217,515 @@
         tester.doTest(1000, 50);
     }
 
+    public void testRegisterFileDescriptorCallbackThrowsWhenFdIsNull() {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+        try {
+            queue.addOnFileDescriptorEventListener(null, 0,
+                    new OnFileDescriptorEventListener() {
+                @Override
+                public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                    return 0;
+                }
+            });
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    public void testRegisterFileDescriptorCallbackThrowsWhenCallbackIsNull() throws Exception {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+        ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+        try (ParcelFileDescriptor reader = pipe[0];
+                ParcelFileDescriptor writer = pipe[1]) {
+            try {
+                queue.addOnFileDescriptorEventListener(reader.getFileDescriptor(), 0, null);
+                fail("Expected IllegalArgumentException");
+            } catch (IllegalArgumentException ex) {
+                // expected
+            }
+        }
+    }
+
+    public void testUnregisterFileDescriptorCallbackThrowsWhenFdIsNull() throws Exception {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+        try {
+            queue.removeOnFileDescriptorEventListener(null);
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    public void testUnregisterFileDescriptorCallbackDoesNothingWhenFdNotRegistered()
+            throws Exception {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+        ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+        try (ParcelFileDescriptor reader = pipe[0];
+                ParcelFileDescriptor writer = pipe[1]) {
+            queue.removeOnFileDescriptorEventListener(reader.getFileDescriptor());
+        }
+    }
+
+    public void testFileDescriptorCallbacks() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            final CountDownLatch writerSawError = new CountDownLatch(1);
+            final CountDownLatch readerDone = new CountDownLatch(1);
+            final MessageQueue queue = thread.getLooper().getQueue();
+            final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                    final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                final int size = 256 * 1024;
+
+                // Prepare to write a lot of data to the pipe asynchronously.
+                // We don't actually care about the content (assume pipes work correctly)
+                // so we just write lots of zeros.
+                OnFileDescriptorEventListener writerCallback = new OnFileDescriptorEventListener() {
+                    private byte[] mBuffer = new byte[4096];
+                    private int mRemaining = size;
+                    private boolean mDone;
+
+                    @Override
+                    public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                        assertEquals(pipe[1].getFileDescriptor(), fd);
+                        if (!mDone) {
+                            // When an error happens because the reader closed its end,
+                            // signal the test, and remove the callback.
+                            if ((events & OnFileDescriptorEventListener.EVENT_ERROR) != 0) {
+                                writerSawError.countDown();
+                                mDone = true;
+                                return 0;
+                            }
+
+                            // Write all output until an error is observed.
+                            if ((events & OnFileDescriptorEventListener.EVENT_OUTPUT) != 0) {
+                                int count = Math.min(mBuffer.length, mRemaining);
+                                try {
+                                    writer.write(mBuffer, 0, count);
+                                } catch (IOException ex) {
+                                    throw new RuntimeException(ex);
+                                }
+                                mRemaining -= count;
+                                return mRemaining != 0 ? EVENT_OUTPUT : EVENT_ERROR;
+                            }
+                        }
+
+                        // Should never see anything else.
+                        fail("Saw unexpected events: " + events + ", mDone=" + mDone);
+                        return 0;
+                    }
+                };
+
+                // Prepare to read all of that data.
+                OnFileDescriptorEventListener readerCallback = new OnFileDescriptorEventListener() {
+                    private byte[] mBuffer = new byte[4096];
+                    private int mRemaining = size;
+                    private boolean mDone;
+
+                    @Override
+                    public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                        assertEquals(pipe[0].getFileDescriptor(), fd);
+                        if (!mDone) {
+                            // Errors should not happen.
+                            if ((events & OnFileDescriptorEventListener.EVENT_ERROR) != 0) {
+                                fail("Saw unexpected error.");
+                                return 0;
+                            }
+
+                            // Read until everything is read, signal the test,
+                            // and remove the callback.
+                            if ((events & OnFileDescriptorEventListener.EVENT_INPUT) != 0) {
+                                try {
+                                    int count = reader.read(mBuffer, 0, mBuffer.length);
+                                    mRemaining -= count;
+                                } catch (IOException ex) {
+                                    throw new RuntimeException(ex);
+                                }
+                                if (mRemaining != 0) {
+                                    return EVENT_INPUT;
+                                }
+                                readerDone.countDown();
+                                mDone = true;
+                                return 0;
+                            }
+                        }
+
+                        // Should never see anything else.
+                        fail("Saw unexpected events: " + events + ", mDone=" + mDone);
+                        return 0;
+                    }
+                };
+
+                // Register the callbacks.
+                queue.addOnFileDescriptorEventListener(reader.getFD(),
+                        OnFileDescriptorEventListener.EVENT_INPUT, readerCallback);
+                queue.addOnFileDescriptorEventListener(writer.getFD(),
+                        OnFileDescriptorEventListener.EVENT_OUTPUT, writerCallback);
+
+                // Wait for the reader to see all of the data that the writer
+                // is prepared to send.
+                readerDone.await(TIMEOUT, TimeUnit.MILLISECONDS);
+
+                // At this point the reader's callback should be unregistered.
+                // Close the reader's file descriptor (pretend it crashed or something).
+                reader.close();
+
+                // Because the reader is gone, the writer should observe an error (EPIPE).
+                // Wait for this to happen.
+                writerSawError.await(TIMEOUT, TimeUnit.MILLISECONDS);
+
+                // The reader and writer should already be unregistered.
+                // Try to unregistered them again to ensure nothing bad happens.
+                queue.removeOnFileDescriptorEventListener(reader.getFD());
+                queue.removeOnFileDescriptorEventListener(writer.getFD());
+            }
+        } finally {
+            thread.quitAndRethrow();
+        }
+    }
+
+    /**
+     * Since file descriptor numbers may be reused, there are some interesting
+     * edge cases around closing file descriptors within the callback and adding
+     * new ones with the same number.
+     *
+     * Register a file descriptor, close it from within the callback, then return.
+     * Later, create a new file descriptor register it.  Ensure that we start getting
+     * events for the new file descriptor.
+     *
+     * This test exercises special logic in Looper.cpp for EPOLL_CTL_DEL handling EBADF.
+     */
+    public void testPathologicalFileDescriptorReuseCallbacks1() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            final MessageQueue queue = thread.getLooper().getQueue();
+            final Handler handler = new Handler(thread.getLooper());
+
+            final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                    final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                // Register the callback.
+                final CountDownLatch awoke = new CountDownLatch(1);
+                queue.addOnFileDescriptorEventListener(reader.getFD(),
+                        OnFileDescriptorEventListener.EVENT_ERROR,
+                        new OnFileDescriptorEventListener() {
+                    @Override
+                    public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                        awoke.countDown();
+
+                        // Close the reader before we return.
+                        closeQuietly(reader);
+
+                        // Return 0 to unregister the callback.
+                        return 0;
+                    }
+                });
+
+                // Close the writer to wake up the callback (due to hangup).
+                writer.close();
+
+                // Wait for the looper to catch up and run the callback.
+                assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                syncWait(handler);
+            }
+
+            // At this point, the reader and writer are both closed.
+            // Make a new pipe and ensure that things still work as expected.
+            final ParcelFileDescriptor[] pipe2 = ParcelFileDescriptor.createPipe();
+            try (final FileInputStream reader2 = new AutoCloseInputStream(pipe2[0]);
+                    final FileOutputStream writer2 = new AutoCloseOutputStream(pipe2[1])) {
+                // Register the callback.
+                final CountDownLatch awoke = new CountDownLatch(1);
+                queue.addOnFileDescriptorEventListener(reader2.getFD(),
+                        OnFileDescriptorEventListener.EVENT_INPUT,
+                        new OnFileDescriptorEventListener() {
+                    @Override
+                    public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                        awoke.countDown();
+
+                        // Return 0 to unregister the callback.
+                        return 0;
+                    }
+                });
+
+                // Close the writer to wake up the callback (due to hangup).
+                writer2.close();
+
+                // Wait for the looper to catch up and run the callback.
+                assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                syncWait(handler);
+            }
+        } finally {
+            thread.quitAndRethrow();
+        }
+    }
+
+    /**
+     * Since file descriptor numbers may be reused, there are some interesting
+     * edge cases around closing file descriptors within the callback and adding
+     * new ones with the same number.
+     *
+     * Register a file descriptor, close it from within the callback, reassign its
+     * number to a different pipe, then return.  Later, register the same file descriptor
+     * again (now referring to a new pipe).  Ensure that we start getting
+     * events for the new file descriptor.
+     *
+     * This test exercises special logic in Looper.cpp for EPOLL_CTL_DEL handling ENOENT.
+     */
+    public void testPathologicalFileDescriptorReuseCallbacks2() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            final MessageQueue queue = thread.getLooper().getQueue();
+            final Handler handler = new Handler(thread.getLooper());
+
+            final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            final ParcelFileDescriptor[] pipe2 = ParcelFileDescriptor.createPipe();
+            try {
+                final int oldReaderFd = pipe[0].getFd();
+                try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                        final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                    // Register the callback.
+                    final CountDownLatch awoke = new CountDownLatch(1);
+                    queue.addOnFileDescriptorEventListener(reader.getFD(),
+                            OnFileDescriptorEventListener.EVENT_ERROR,
+                            new OnFileDescriptorEventListener() {
+                        @Override
+                        public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                            awoke.countDown();
+
+                            // Close the reader before we return and hijack its fd.
+                            hijackFd(pipe2, pipe);
+
+                            // Return 0 to unregister the callback.
+                            return 0;
+                        }
+                    });
+
+                    // Close the writer to wake up the callback (due to hangup).
+                    writer.close();
+
+                    // Wait for the looper to catch up and run the callback.
+                    assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                    syncWait(handler);
+                }
+
+                // Now we have a new pipe with the same file descriptor, make sure we can
+                // register it successfully.
+                assertEquals(oldReaderFd, pipe2[0].getFd());
+                try (final FileInputStream reader2 = new AutoCloseInputStream(pipe2[0]);
+                        final FileOutputStream writer2 = new AutoCloseOutputStream(pipe2[1])) {
+                    // Register the callback.
+                    final CountDownLatch awoke = new CountDownLatch(1);
+                    queue.addOnFileDescriptorEventListener(reader2.getFD(),
+                            OnFileDescriptorEventListener.EVENT_INPUT,
+                            new OnFileDescriptorEventListener() {
+                        @Override
+                        public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                            awoke.countDown();
+
+                            // Return 0 to unregister the callback.
+                            return 0;
+                        }
+                    });
+
+                    // Close the writer to wake up the callback (due to hangup).
+                    writer2.close();
+
+                    // Wait for the looper to catch up and run the callback.
+                    assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                    syncWait(handler);
+                }
+            } finally {
+                closeQuietly(pipe[0]);
+                closeQuietly(pipe[1]);
+                closeQuietly(pipe2[0]);
+                closeQuietly(pipe2[1]);
+            }
+        } finally {
+            thread.quitAndRethrow();
+        }
+    }
+
+    /**
+     * Since file descriptor numbers may be reused, there are some interesting
+     * edge cases around closing file descriptors within the callback and adding
+     * new ones with the same number.
+     *
+     * Register a file descriptor, close it from within the callback, reassign its
+     * number to a different pipe, register it, then return.
+     * Ensure that we start getting events for the new file descriptor.
+     *
+     * This test exercises special logic in Looper.cpp for EPOLL_CTL_MOD handling
+     * ENOENT and fallback to EPOLL_CTL_ADD as well as sequence number checks when removing
+     * the fd after the callback returns.
+     */
+    public void testPathologicalFileDescriptorReuseCallbacks3() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            final MessageQueue queue = thread.getLooper().getQueue();
+            final Handler handler = new Handler(thread.getLooper());
+
+            final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            final ParcelFileDescriptor[] pipe2 = ParcelFileDescriptor.createPipe();
+            try {
+                final CountDownLatch awoke2 = new CountDownLatch(1);
+                final int oldReaderFd = pipe[0].getFd();
+                try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                        final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                    // Register the callback.
+                    final CountDownLatch awoke = new CountDownLatch(1);
+                    queue.addOnFileDescriptorEventListener(reader.getFD(),
+                            OnFileDescriptorEventListener.EVENT_ERROR,
+                            new OnFileDescriptorEventListener() {
+                        @Override
+                        public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                            awoke.countDown();
+
+                            // Close the reader before we return and hijack its fd.
+                            hijackFd(pipe2, pipe);
+
+                            // Now we have a new pipe, make sure we can register it successfully.
+                            queue.addOnFileDescriptorEventListener(pipe2[0].getFileDescriptor(),
+                                    OnFileDescriptorEventListener.EVENT_INPUT,
+                                    new OnFileDescriptorEventListener() {
+                                @Override
+                                public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                                    awoke2.countDown();
+
+                                    // Return 0 to unregister the callback.
+                                    return 0;
+                                }
+                            });
+
+                            // Return 0 to unregister the callback.
+                            return 0;
+                        }
+                    });
+
+                    // Close the writer to wake up the callback (due to hangup).
+                    writer.close();
+
+                    // Wait for the looper to catch up and run the callback.
+                    assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                    syncWait(handler);
+                }
+
+                // Close the second writer to wake up the second callback (due to hangup).
+                pipe2[1].close();
+
+                // Wait for the looper to catch up and run the callback.
+                assertTrue("awoke2", awoke2.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                syncWait(handler);
+
+                // Close the second reader now that we're done with the test.
+                assertEquals(oldReaderFd, pipe2[0].getFd());
+                pipe2[0].close();
+            } finally {
+                closeQuietly(pipe[0]);
+                closeQuietly(pipe[1]);
+                closeQuietly(pipe2[0]);
+                closeQuietly(pipe2[1]);
+            }
+        } finally {
+            thread.quitAndRethrow();
+        }
+    }
+
+    /**
+     * Since file descriptor numbers may be reused, there are some interesting
+     * edge cases around closing file descriptors within the callback and adding
+     * new ones with the same number.
+     *
+     * Register a file descriptor, make a duplicate of it, close it from within the
+     * callback, then return.  Look for signs that the Looper is spinning
+     * and never getting a chance to block.
+     *
+     * This test exercises special logic in Looper.cpp for rebuilding the epoll set
+     * in case it contains a file descriptor which has been closed and cannot be removed.
+     */
+    public void testPathologicalFileDescriptorReuseCallbacks4() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        ParcelFileDescriptor dup = null;
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            try {
+                final MessageQueue queue = thread.getLooper().getQueue();
+                final Handler handler = new Handler(thread.getLooper());
+
+                final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+                dup = pipe[0].dup();
+                try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                        final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                    // Register the callback.
+                    final CountDownLatch awoke = new CountDownLatch(1);
+                    queue.addOnFileDescriptorEventListener(reader.getFD(),
+                            OnFileDescriptorEventListener.EVENT_ERROR, new OnFileDescriptorEventListener() {
+                        @Override
+                        public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                            awoke.countDown();
+
+                            // Close the file descriptor before we return.
+                            try {
+                                reader.close();
+                            } catch (IOException ex) {
+                                throw new RuntimeException(ex);
+                            }
+
+                            // Return 0 to unregister the callback.
+                            return 0;
+                        }
+                    });
+
+                    // Close the writer to wake up the callback (due to hangup).
+                    writer.close();
+
+                    // Wait for the looper to catch up and run the callback.
+                    assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                    syncWait(handler);
+                }
+
+                // Wait a little bit before we stop the thread.
+                Thread.sleep(2000);
+            } finally {
+                // Check for how long the thread was running.
+                // If the Looper behaved correctly, then it should have blocked for most of
+                // the duration of the test (including that sleep above) since not much else
+                // was happening.  If we failed to actually rebuild the epoll set then the
+                // Looper may have been spinning continuously due to an FD that was never
+                // properly removed from the epoll set so the thread runtime will be very high.
+                long runtime = thread.quitAndRethrow();
+                assertFalse("Looper thread spent most of its time spinning instead of blocked.",
+                        runtime > 1000);
+            }
+        } finally {
+            // Close the duplicate now that we are done with it.
+            if (dup != null) {
+                dup.close();
+            }
+        }
+    }
+
     public void testSyncBarriers() throws Exception {
         OrderTestHelper tester = new OrderTestHelper() {
             private int mBarrierToken1;
             private int mBarrierToken2;
 
+            @Override
             public void init() {
                 super.init();
                 mLastMessage = 10;
                 mHandler.sendEmptyMessage(0);
-                mBarrierToken1 = Looper.myLooper().postSyncBarrier();
+                mBarrierToken1 = Looper.myQueue().postSyncBarrier();
                 mHandler.sendEmptyMessage(5);
                 sendAsyncMessage(1);
                 sendAsyncMessage(2);
@@ -179,19 +733,20 @@
                 mHandler.sendEmptyMessage(6);
             }
 
+            @Override
             public void handleMessage(Message msg) {
                 super.handleMessage(msg);
                 if (msg.what == 3) {
                     mHandler.sendEmptyMessage(7);
-                    mBarrierToken2 = Looper.myLooper().postSyncBarrier();
+                    mBarrierToken2 = Looper.myQueue().postSyncBarrier();
                     sendAsyncMessage(4);
                     sendAsyncMessage(8);
                 } else if (msg.what == 4) {
-                    Looper.myLooper().removeSyncBarrier(mBarrierToken1);
+                    Looper.myQueue().removeSyncBarrier(mBarrierToken1);
                     sendAsyncMessage(9);
                     mHandler.sendEmptyMessage(10);
                 } else if (msg.what == 8) {
-                    Looper.myLooper().removeSyncBarrier(mBarrierToken2);
+                    Looper.myQueue().removeSyncBarrier(mBarrierToken2);
                 }
             }
 
@@ -206,25 +761,66 @@
     }
 
     public void testReleaseSyncBarrierThrowsIfTokenNotValid() throws Exception {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+
         // Invalid token
         try {
-            Looper.getMainLooper().removeSyncBarrier(-1);
+            queue.removeSyncBarrier(-1);
             fail("Should have thrown IllegalStateException");
         } catch (IllegalStateException ex) {
             // expected
         }
 
         // Token already removed.
-        int barrierToken = Looper.getMainLooper().postSyncBarrier();
-        Looper.getMainLooper().removeSyncBarrier(barrierToken);
+        int barrierToken = queue.postSyncBarrier();
+        queue.removeSyncBarrier(barrierToken);
         try {
-            Looper.getMainLooper().removeSyncBarrier(barrierToken);
+            queue.removeSyncBarrier(barrierToken);
             fail("Should have thrown IllegalStateException");
         } catch (IllegalStateException ex) {
             // expected
         }
     }
 
+    private void syncWait(Handler handler) throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        handler.post(new Runnable() {
+            @Override
+            public void run() {
+                latch.countDown();
+            }
+        });
+        assertTrue("Handler got stuck.", latch.await(TIMEOUT, TimeUnit.MILLISECONDS));
+    }
+
+    private static void closeQuietly(AutoCloseable c) {
+        if (c != null) {
+            try {
+                c.close();
+            } catch (RuntimeException rethrown) {
+                throw rethrown;
+            } catch (Exception ex) {
+            }
+        }
+    }
+
+    private static void hijackFd(ParcelFileDescriptor[] newPipe, ParcelFileDescriptor[] oldPipe) {
+        // Detach the old pipe's first fd and get its number.
+        int fd = oldPipe[0].detachFd();
+
+        // Assign the new pipe's first fd to the same number as the old pipe's first fd.
+        // This causes the old pipe's first fd to be closed and reassigned.
+        try {
+            Os.dup2(newPipe[0].getFileDescriptor(), fd);
+        } catch (ErrnoException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        // Fix up the new pipe's first fd object.
+        closeQuietly(newPipe[0]);
+        newPipe[0] = ParcelFileDescriptor.adoptFd(fd);
+    }
+
     /**
      * Helper class used to test sending message to message queue.
      */
@@ -239,6 +835,7 @@
 
         public void init() {
             mHandler = new Handler() {
+                @Override
                 public void handleMessage(Message msg) {
                     OrderTestHelper.this.handleMessage(msg);
                 }
@@ -288,6 +885,7 @@
                 super("MessengerLooperThread");
             }
 
+            @Override
             public void onLooperPrepared() {
                 init();
                 mLooper = getLooper();
@@ -328,4 +926,38 @@
             }
         }
     }
+
+    /**
+     * A HandlerThread that propagates exceptions out of the event loop
+     * instead of crashing the process.
+     */
+    private static class AssertableHandlerThread extends HandlerThread {
+        private Throwable mThrowable;
+        private long mRuntime;
+
+        public AssertableHandlerThread() {
+            super("AssertableHandlerThread");
+        }
+
+        @Override
+        public void run() {
+            final long startTime = SystemClock.currentThreadTimeMillis();
+            try {
+                super.run();
+            } catch (Throwable t) {
+                mThrowable = t;
+            } finally {
+                mRuntime = SystemClock.currentThreadTimeMillis() - startTime;
+            }
+        }
+
+        public long quitAndRethrow() throws Throwable {
+            quitSafely();
+            join(TIMEOUT);
+            if (mThrowable != null) {
+                throw mThrowable;
+            }
+            return mRuntime;
+        }
+    }
 }
diff --git a/tests/tests/os/src/android/os/cts/ParcelTest.java b/tests/tests/os/src/android/os/cts/ParcelTest.java
index 35e02ae..5b7b187 100644
--- a/tests/tests/os/src/android/os/cts/ParcelTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelTest.java
@@ -20,8 +20,6 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 import android.content.pm.Signature;
 import android.os.BadParcelableException;
@@ -2970,4 +2968,121 @@
             return binder;
         }
     }
+
+    private static boolean parcelableWithBadCreatorInitializerHasRun;
+    private static boolean invalidCreatorIntializerHasRun;
+
+    /**
+     * A class that would be Parcelable except that it doesn't have a CREATOR field declared to be
+     * of the correct type.
+     */
+    @SuppressWarnings("unused") // Referenced via reflection only
+    private static class ParcelableWithBadCreator implements Parcelable {
+
+        static {
+            ParcelTest.parcelableWithBadCreatorInitializerHasRun = true;
+        }
+
+        private static class InvalidCreator
+                implements Parcelable.Creator<ParcelableWithBadCreator> {
+
+            static {
+                invalidCreatorIntializerHasRun = true;
+            }
+
+            @Override
+            public ParcelableWithBadCreator createFromParcel(Parcel source) {
+                return null;
+            }
+
+            @Override
+            public ParcelableWithBadCreator[] newArray(int size) {
+                return new ParcelableWithBadCreator[0];
+            }
+
+        }
+
+        // Invalid declaration: Must be declared as Parcelable.Creator or a subclass.
+        public static Object CREATOR = new InvalidCreator();
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+
+        }
+    }
+
+    // http://b/1171613
+    public void testBadStream_invalidCreator() {
+        Parcel parcel = Parcel.obtain();
+        // Create an invalid stream by manipulating the Parcel.
+        parcel.writeString(getClass().getName() + "$ParcelableWithBadCreator");
+        byte[] badData = parcel.marshall();
+        parcel.recycle();
+
+        // Now try to read the bad data.
+        parcel = Parcel.obtain();
+        parcel.unmarshall(badData, 0, badData.length);
+        parcel.setDataPosition(0);
+        try {
+            parcel.readParcelable(getClass().getClassLoader());
+            fail();
+        } catch (BadParcelableException expected) {
+        } finally {
+            parcel.recycle();
+        }
+
+        assertFalse(invalidCreatorIntializerHasRun);
+        assertFalse(parcelableWithBadCreatorInitializerHasRun);
+    }
+
+    private static boolean doesNotImplementParcelableInitializerHasRun;
+
+    /** A class that would be Parcelable except that it does not implement Parcelable. */
+    @SuppressWarnings("unused") // Referenced via reflection only
+    private static class DoesNotImplementParcelable {
+
+        static {
+            doesNotImplementParcelableInitializerHasRun = true;
+        }
+
+        public static Parcelable.Creator<Object> CREATOR = new Parcelable.Creator<Object>() {
+            @Override
+            public Object createFromParcel(Parcel source) {
+                return new DoesNotImplementParcelable();
+            }
+
+            @Override
+            public Object[] newArray(int size) {
+                return new Object[size];
+            }
+        };
+    }
+
+    // http://b/1171613
+    public void testBadStream_objectDoesNotImplementParcelable() {
+        Parcel parcel = Parcel.obtain();
+        // Create an invalid stream by manipulating the Parcel.
+        parcel.writeString(getClass().getName() + "$DoesNotImplementParcelable");
+        byte[] badData = parcel.marshall();
+        parcel.recycle();
+
+        // Now try to read the bad data.
+        parcel = Parcel.obtain();
+        parcel.unmarshall(badData, 0, badData.length);
+        parcel.setDataPosition(0);
+        try {
+            parcel.readParcelable(getClass().getClassLoader());
+            fail();
+        } catch (BadParcelableException expected) {
+        } finally {
+            parcel.recycle();
+        }
+
+        assertFalse(doesNotImplementParcelableInitializerHasRun);
+    }
 }
diff --git a/tests/tests/os/src/android/os/cts/SeccompTest.java b/tests/tests/os/src/android/os/cts/SeccompTest.java
index 6c49337..e8de783 100644
--- a/tests/tests/os/src/android/os/cts/SeccompTest.java
+++ b/tests/tests/os/src/android/os/cts/SeccompTest.java
@@ -19,6 +19,9 @@
 import junit.framework.TestCase;
 
 public class SeccompTest extends TestCase {
+    static {
+        System.loadLibrary("ctsos_jni");
+    }
 
     public void testSeccomp() {
         if (CpuFeatures.isArm64Cpu() || CpuFeatures.isArm64CpuIn32BitMode()) {
@@ -30,4 +33,116 @@
                        OSFeatures.hasSeccompSupport());
         }
     }
+
+    public void testKernelBasicTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        final String[] tests = {
+            "global.mode_strict_support",
+            "global.mode_strict_cannot_call_prctl",
+            "global.no_new_privs_support",
+            "global.mode_filter_support",
+            /* "global.mode_filter_without_nnp", // all Android processes already have nnp */
+            "global.filter_size_limits",
+            "global.filter_chain_limits",
+            "global.mode_filter_cannot_move_to_strict",
+            "global.mode_filter_get_seccomp",
+            "global.ALLOW_all",
+            "global.empty_prog",
+            "global.unknown_ret_is_kill_inside",
+            "global.unknown_ret_is_kill_above_allow",
+            "global.KILL_all",
+            "global.KILL_one",
+            "global.KILL_one_arg_one",
+            "global.KILL_one_arg_six",
+            "global.arg_out_of_range",
+            "global.ERRNO_one",
+            "global.ERRNO_one_ok",
+        };
+        runKernelUnitTestSuite(tests);
+    }
+
+    public void testKernelTrapTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        final String[] tests = {
+            "TRAP.dfl",
+            "TRAP.ign",
+            "TRAP.handler",
+        };
+        runKernelUnitTestSuite(tests);
+    }
+
+    public void testKernelPrecedenceTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        final String[] tests = {
+            "precedence.allow_ok",
+            "precedence.kill_is_highest",
+            "precedence.kill_is_highest_in_any_order",
+            "precedence.trap_is_second",
+            "precedence.trap_is_second_in_any_order",
+            "precedence.errno_is_third",
+            "precedence.errno_is_third_in_any_order",
+            "precedence.trace_is_fourth",
+            "precedence.trace_is_fourth_in_any_order",
+        };
+        runKernelUnitTestSuite(tests);
+    }
+
+    /* // The SECCOMP_RET_TRACE does not work under Android Arm32.
+    public void testKernelTraceTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        final String[] tests = {
+            "TRACE_poke.read_has_side_effects",
+            "TRACE_poke.getpid_runs_normally",
+            "TRACE_syscall.syscall_allowed",
+            "TRACE_syscall.syscall_redirected",
+            "TRACE_syscall.syscall_dropped",
+        };
+        runKernelUnitTestSuite(tests);
+    }
+    */
+
+    public void testKernelTSYNCTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        final String[] tests = {
+            "global.seccomp_syscall",
+            "global.seccomp_syscall_mode_lock",
+            "global.TSYNC_first",
+            "TSYNC.siblings_fail_prctl",
+            "TSYNC.two_siblings_with_ancestor",
+            /* "TSYNC.two_sibling_want_nnp", // all Android processes already have nnp */
+            "TSYNC.two_siblings_with_no_filter",
+            "TSYNC.two_siblings_with_one_divergence",
+            "TSYNC.two_siblings_not_under_filter",
+            /* "global.syscall_restart", // ptrace attach fails */
+        };
+        runKernelUnitTestSuite(tests);
+    }
+
+    /**
+     * Runs a kernel unit test suite (an array of kernel test names).
+     */
+    private void runKernelUnitTestSuite(final String[] tests) {
+        for (final String test : tests) {
+            // TODO: Replace the URL with the documentation when it's finished.
+            assertTrue(test + " failed. This test requires kernel functionality to pass. "
+                       + "Please go to http://XXXXX for instructions on how to enable or "
+                       + "backport the required functionality.",
+                       runKernelUnitTest(test));
+        }
+    }
+
+    /**
+     * Runs the seccomp_bpf_unittest of the given name.
+     */
+    private native boolean runKernelUnitTest(final String name);
 }
diff --git a/tests/tests/os/src/android/os/cts/StrictModeTest.java b/tests/tests/os/src/android/os/cts/StrictModeTest.java
new file mode 100644
index 0000000..797f91f
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/StrictModeTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os.cts;
+
+import android.os.StrictMode;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import libcore.io.Streams;
+
+import java.io.ByteArrayOutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Tests for {@link StrictMode}
+ */
+public class StrictModeTest extends AndroidTestCase {
+    private static final String TAG = "StrictModeTest";
+
+    private StrictMode.VmPolicy mPolicy;
+
+    @Override
+    protected void setUp() {
+        mPolicy = StrictMode.getVmPolicy();
+    }
+
+    @Override
+    protected void tearDown() {
+        StrictMode.setVmPolicy(mPolicy);
+    }
+
+    public void testCleartextNetwork() throws Exception {
+        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
+                .detectCleartextNetwork()
+                .penaltyLog()
+                .build());
+
+        final long millis = System.currentTimeMillis();
+        final String msg = "Detected cleartext network traffic from UID "
+                + android.os.Process.myUid();
+
+        // Insecure connection should be detected
+        ((HttpURLConnection) new URL("http://android.com/").openConnection()).getResponseCode();
+
+        // Give system enough time to finish logging
+        SystemClock.sleep(5000);
+        assertTrue("Expected cleartext to be caught", readLogSince(millis).contains(msg));
+    }
+
+    public void testEncryptedNetwork() throws Exception {
+        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
+                .detectCleartextNetwork()
+                .penaltyLog()
+                .build());
+
+        final long millis = System.currentTimeMillis();
+        final String msg = "Detected cleartext network traffic from UID "
+                + android.os.Process.myUid();
+
+        // Secure connection should be ignored
+        ((HttpURLConnection) new URL("https://android.com/").openConnection()).getResponseCode();
+
+        // Give system enough time to finish logging
+        SystemClock.sleep(5000);
+        assertFalse("Expected encrypted to be ignored", readLogSince(millis).contains(msg));
+    }
+
+    private String readLogSince(long millis) throws Exception {
+        final SimpleDateFormat format = new SimpleDateFormat("MM-DD HH:mm:ss.SSS");
+        final Process proc = new ProcessBuilder("logcat", "-t", format.format(new Date(millis)))
+                .redirectErrorStream(true).start();
+
+        final ByteArrayOutputStream buf = new ByteArrayOutputStream();
+        Streams.copy(proc.getInputStream(), buf);
+        final int res = proc.waitFor();
+
+        Log.d(TAG, "Log output was " + buf.size() + " bytes, exit code " + res);
+        return new String(buf.toByteArray());
+    }
+}
diff --git a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
index 51e54df..984fd6c 100644
--- a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
+++ b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
@@ -16,12 +16,7 @@
 
 package android.permission.cts;
 
-import android.os.RemoteException;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
 import android.content.ContentValues;
-import android.database.Cursor;
-import android.provider.Contacts;
 import android.provider.ContactsContract;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -71,7 +66,7 @@
      * Verifies that query(ContactsContract.Profile.CONTENT_URI) requires
      * Permission.
      * <p>
-     * Requires Permission: {@link android.Manifest.permission#READ_PROFILE}.
+     * Requires Permission: {@link android.Manifest.permission#READ_CONTACTS}.
      */
     @SmallTest
     public void testQueryProfile() {
@@ -91,7 +86,7 @@
      * permission, but trying to do it without the permission should throw a
      * SecurityException anyway.
      * <p>
-     * Requires Permission: {@link android.Manifest.permission#WRITE_PROFILE}.
+     * Requires Permission: {@link android.Manifest.permission#WRITE_CONTACTS}.
      */
     @SmallTest
     public void testInsertProfile() {
@@ -109,7 +104,7 @@
      * Verifies that update(ContactsContract.Profile.CONTENT_URI) requires
      * Permission.
      * <p>
-     * Requires Permission: {@link android.Manifest.permission#WRITE_PROFILE}.
+     * Requires Permission: {@link android.Manifest.permission#WRITE_CONTACTS}.
      */
     @SmallTest
     public void testUpdateProfile() {
@@ -122,4 +117,41 @@
             // Expected Exception
         }
     }
+
+    /**
+    * Verifies that query(ContactsContract.CommonDataKinds.Phone.ENTERPRISE_CONTENT_URI) requires
+    * Permission.
+    * <p>
+    * Requires Permission: {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
+    */
+    @SmallTest
+    public void testQueryPhoneEnterprise() {
+        try {
+            getContext().getContentResolver().query(
+                    ContactsContract.CommonDataKinds.Phone.ENTERPRISE_CONTENT_URI,
+                    null, null, null, null);
+            fail("query(ContactsContract.CommonDataKinds.Phone.ENTERPRISE_CONTENT_URI) did not"
+                    + " throw SecurityException as expected");
+        } catch (SecurityException se) {
+            // Expected Exception
+        }
+    }
+
+    /**
+    * Verifies that query(ContactsContract.RawContactsEntity.CORP_CONTENT_URI) requires
+    * Permission.
+    * <p>
+    * Requires Permission: {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
+    */
+    @SmallTest
+    public void testRawContactsEntityCorp() {
+        try {
+            getContext().getContentResolver().query(
+                    ContactsContract.RawContactsEntity.CORP_CONTENT_URI, null, null, null, null);
+            fail("query(ContactsContract.RawContactsEntity.CORP_CONTENT_URI) did not throw"
+                    + " SecurityException as expected");
+        } catch (SecurityException se) {
+            // Expected Exception
+        }
+    }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
index b605e4d..4050f53 100644
--- a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
@@ -19,7 +19,9 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Environment;
+import android.system.Os;
 import android.system.OsConstants;
+import android.system.StructStatVfs;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.test.suitebuilder.annotation.LargeTest;
@@ -247,6 +249,22 @@
     }
 
     @MediumTest
+    public void testProcSelfOomAdjSane() {
+        File f = new File("/proc/self/oom_adj");
+        assertTrue(f.canRead());
+        assertFalse(f.canWrite());
+        assertFalse(f.canExecute());
+    }
+
+    @MediumTest
+    public void testProcSelfOomScoreAdjSane() {
+        File f = new File("/proc/self/oom_score_adj");
+        assertTrue(f.canRead());
+        assertFalse(f.canWrite());
+        assertFalse(f.canExecute());
+    }
+
+    @MediumTest
     public void testTcpDefaultRwndSane() throws Exception {
         File f = new File("/proc/sys/net/ipv4/tcp_default_init_rwnd");
         assertTrue(f.canRead());
@@ -709,17 +727,20 @@
         return retval;
     }
 
-    public void testSystemMountedRO() throws IOException {
-        ParsedMounts pm = new ParsedMounts("/proc/self/mounts");
-        String mountPoint = pm.findMountPointContaining(new File("/system"));
-        assertTrue(mountPoint + " is not mounted read-only", pm.isMountReadOnly(mountPoint));
+    public void testSystemMountedRO() throws Exception {
+        StructStatVfs vfs = Os.statvfs("/system");
+        assertTrue("/system is not mounted read-only", (vfs.f_flag & OsConstants.ST_RDONLY) != 0);
     }
 
-    public void testRootMountedRO() throws IOException {
-        ParsedMounts pm = new ParsedMounts("/proc/self/mounts");
-        String mountPoint = pm.findMountPointContaining(new File("/"));
-        assertTrue("The root directory \"" + mountPoint + "\" is not mounted read-only",
-                   pm.isMountReadOnly(mountPoint));
+    public void testRootMountedRO() throws Exception {
+        StructStatVfs vfs = Os.statvfs("/");
+        assertTrue("rootfs is not mounted read-only", (vfs.f_flag & OsConstants.ST_RDONLY) != 0);
+    }
+
+    public void testDataMountedNoSuidNoDev() throws Exception {
+        StructStatVfs vfs = Os.statvfs(getContext().getFilesDir().getAbsolutePath());
+        assertTrue("/data is not mounted NOSUID", (vfs.f_flag & OsConstants.ST_NOSUID) != 0);
+        assertTrue("/data is not mounted NODEV", (vfs.f_flag & OsConstants.ST_NODEV) != 0);
     }
 
     public void testAllBlockDevicesAreSecure() throws Exception {
@@ -1016,48 +1037,4 @@
         return !f.getAbsolutePath().equals(f.getCanonicalPath());
     }
 
-    private static class ParsedMounts {
-        private HashMap<String, Boolean> mFileReadOnlyMap = new HashMap<String, Boolean>();
-
-        private ParsedMounts(String filename) throws IOException {
-            BufferedReader br = new BufferedReader(new FileReader(filename));
-            try {
-                String line;
-                while ((line = br.readLine()) != null) {
-                    String[] fields = line.split(" ");
-                    String mountPoint = fields[1];
-                    String all_options = fields[3];
-                    String[] options = all_options.split(",");
-                    boolean foundRo = false;
-                    for (String option : options) {
-                        if ("ro".equals(option)) {
-                            foundRo = true;
-                            break;
-                        }
-                    }
-                    mFileReadOnlyMap.put(mountPoint, foundRo);
-                }
-           } finally {
-               br.close();
-           }
-        }
-
-        private boolean isMountReadOnly(String s) {
-            return mFileReadOnlyMap.get(s).booleanValue();
-        }
-
-        private String findMountPointContaining(File f) throws IOException {
-            while (f != null) {
-                f = f.getCanonicalFile();
-                String path = f.getPath();
-                if (mFileReadOnlyMap.containsKey(path)) {
-                    return path;
-                }
-                f = f.getParentFile();
-            }
-            // This should NEVER be reached, as we'll eventually hit the
-            // root directory.
-            throw new AssertionError("Unable to find mount point");
-        }
-    }
 }
diff --git a/tests/tests/permission2/AndroidManifest.xml b/tests/tests/permission2/AndroidManifest.xml
index c0b78c4..984d124 100755
--- a/tests/tests/permission2/AndroidManifest.xml
+++ b/tests/tests/permission2/AndroidManifest.xml
@@ -45,6 +45,12 @@
     <!-- need app that has RECORD_AUDIO but not CAPTURE_AUDIO_OUTPUT -->
     <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 
+    <!-- need app that has READ_CONTACTS but not READ_PROFILE -->
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+
+    <!-- need app that has WRITE_CONTACTS but not WRITE_PROFILE -->
+    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
+
     <!-- need a permission that would ordinarily be granted, but has a maxSdkVersion that
          causes it to be withheld under the current API level -->
     <uses-permission
diff --git a/tests/tests/permission2/src/android/permission2/cts/ContactsProviderTest.java b/tests/tests/permission2/src/android/permission2/cts/ContactsProviderTest.java
new file mode 100644
index 0000000..5a04079
--- /dev/null
+++ b/tests/tests/permission2/src/android/permission2/cts/ContactsProviderTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package android.permission2.cts;
+
+import android.content.ContentValues;
+import android.provider.ContactsContract;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Verify that deprecated contacts permissions are not enforced.
+ */
+public class ContactsProviderTest extends AndroidTestCase {
+
+    /**
+     * Verifies that query(ContactsContract.Contacts.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#READ_CONTACTS}.
+     */
+    @SmallTest
+    public void testQueryContacts() {
+        getContext().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
+                null, null, null, null);
+    }
+
+    /**
+     * Verifies that insert(ContactsContract.Contacts.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#WRITE_CONTACTS}.
+     */
+    @SmallTest
+    public void testInsertContacts() {
+        try {
+            getContext().getContentResolver().insert(ContactsContract.Contacts.CONTENT_URI,
+                    new ContentValues());
+        } catch (SecurityException e) {
+            fail("insert(ContactsContract.Contacts.CONTENT_URI) threw SecurityException");
+        } catch (UnsupportedOperationException e) {
+            // It is okay for this fail in this manner.
+        }
+    }
+
+    /**
+     * Verifies that query(ContactsContract.Profile.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#READ_CONTACTS}.
+     */
+    @SmallTest
+    public void testQueryProfile() {
+        getContext().getContentResolver().query(ContactsContract.Profile.CONTENT_URI,
+                null, null, null, null);
+    }
+
+    /**
+     * Verifies that insert(ContactsContract.Profile.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#WRITE_CONTACTS}. The provider won't
+     * actually let us execute this. But at least it shouldn't throw a security exception.
+     */
+    @SmallTest
+    public void testInsertProfile() {
+     try {
+         getContext().getContentResolver().insert(ContactsContract.Profile.CONTENT_URI,
+                new ContentValues(0));
+        } catch (SecurityException e) {
+            fail("insert(ContactsContract.Profile.CONTENT_URI) threw SecurityException");
+        } catch (UnsupportedOperationException e) {
+            // It is okay for this fail in this manner.
+        }
+    }
+
+    /**
+     * Verifies that update(ContactsContract.Profile.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#WRITE_CONTACTS}.
+     */
+    @SmallTest
+    public void testUpdateProfile() {
+        getContext().getContentResolver().update(ContactsContract.Profile.CONTENT_URI,
+                new ContentValues(0), null, null);
+    }
+}
diff --git a/tests/tests/print/Android.mk b/tests/tests/print/Android.mk
index 516f6a0..2ece2cf 100644
--- a/tests/tests/print/Android.mk
+++ b/tests/tests/print/Android.mk
@@ -18,15 +18,11 @@
 
 LOCAL_MODULE_TAGS := optional
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src) \
-    src/android/print/cts/IPrivilegedOperations.aidl
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsPrintTestCases
 
-LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ctstestrunner ub-uiautomator
-
-# This test runner sets up/cleans up the device before/after running the tests.
-LOCAL_CTS_TEST_RUNNER := com.android.cts.tradefed.testtype.PrintTestRunner
+LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ctstestrunner ub-uiautomator ctsdeviceutil
 
 LOCAL_SDK_VERSION := current
 
diff --git a/tests/tests/print/src/android/print/cts/BasePrintTest.java b/tests/tests/print/src/android/print/cts/BasePrintTest.java
index c73bb64..31dfb9f 100644
--- a/tests/tests/print/src/android/print/cts/BasePrintTest.java
+++ b/tests/tests/print/src/android/print/cts/BasePrintTest.java
@@ -28,6 +28,7 @@
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.cts.util.SystemUtil;
 import android.graphics.pdf.PdfDocument;
 import android.os.Bundle;
 import android.os.CancellationSignal;
@@ -73,12 +74,12 @@
 
     private static final long OPERATION_TIMEOUT = 100000000;
 
-    private static final String ARG_PRIVILEGED_OPS = "ARG_PRIVILEGED_OPS";
-
     private static final String PRINT_SPOOLER_PACKAGE_NAME = "com.android.printspooler";
 
     protected static final String PRINT_JOB_NAME = "Test";
 
+    private static final String PM_CLEAR_SUCCESS_OUTPUT = "Success";
+
     private PrintDocumentActivity mActivity;
 
     private Locale mOldLocale;
@@ -94,6 +95,7 @@
     public void setUp() throws Exception {
         // Make sure we start with a clean slate.
         clearPrintSpoolerData();
+        enablePrintServices();
 
         // Workaround for dexmaker bug: https://code.google.com/p/dexmaker/issues/detail?id=2
         // Dexmaker is used by mockito.
@@ -139,6 +141,7 @@
             resources.updateConfiguration(newConfiguration, displayMetrics);
         }
 
+        disablePrintServices();
         // Make sure the spooler is cleaned.
         clearPrintSpoolerData();
     }
@@ -272,6 +275,19 @@
         }
     }
 
+    protected void changeDuplex(String duplex) throws UiObjectNotFoundException {
+        try {
+            UiObject duplexSpinner = new UiObject(new UiSelector().resourceId(
+                    "com.android.printspooler:id/duplex_spinner"));
+            duplexSpinner.click();
+            UiObject duplexOption = new UiObject(new UiSelector().text(duplex));
+            duplexOption.click();
+        } catch (UiObjectNotFoundException e) {
+            dumpWindowHierarchy();
+            throw new UiObjectNotFoundException(e);
+        }
+    }
+
     protected void clickPrintButton() throws UiObjectNotFoundException {
         try {
             UiObject printButton = new UiObject(new UiSelector().resourceId(
@@ -306,9 +322,24 @@
     }
 
     protected void clearPrintSpoolerData() throws Exception {
-        IPrivilegedOperations privilegedOps = IPrivilegedOperations.Stub.asInterface(
-                getParams().getBinder(ARG_PRIVILEGED_OPS));
-        privilegedOps.clearApplicationUserData(PRINT_SPOOLER_PACKAGE_NAME);
+        assertTrue("failed to clear print spooler data",
+                SystemUtil.runShellCommand(getInstrumentation(),
+                        String.format("pm clear %s", PRINT_SPOOLER_PACKAGE_NAME))
+                            .contains(PM_CLEAR_SUCCESS_OUTPUT));
+    }
+
+    private void enablePrintServices() throws Exception {
+        String pkgName = getInstrumentation().getContext().getPackageName();
+        String enabledServicesValue = String.format("%s/%s:%s/%s",
+                pkgName, FirstPrintService.class.getCanonicalName(),
+                pkgName, SecondPrintService.class.getCanonicalName());
+        SystemUtil.runShellCommand(getInstrumentation(),
+                "settings put secure enabled_print_services " + enabledServicesValue);
+    }
+
+    private void disablePrintServices() throws Exception {
+        SystemUtil.runShellCommand(getInstrumentation(),
+                "settings put secure enabled_print_services \"\"");
     }
 
     protected void verifyLayoutCall(InOrder inOrder, PrintDocumentAdapter mock,
diff --git a/tests/tests/print/src/android/print/cts/IPrivilegedOperations.aidl b/tests/tests/print/src/android/print/cts/IPrivilegedOperations.aidl
deleted file mode 100644
index 93c8c3e..0000000
--- a/tests/tests/print/src/android/print/cts/IPrivilegedOperations.aidl
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.print.cts;
-
-interface IPrivilegedOperations {
-    boolean clearApplicationUserData(String packageName);
-}
diff --git a/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java b/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
index 538472e..9f1e3a5 100644
--- a/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
+++ b/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
@@ -160,6 +160,7 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -353,6 +354,12 @@
         // Wait for layout.
         waitForLayoutAdapterCallbackCount(5);
 
+        // Change the duplex.
+        changeDuplex("Short edge");
+
+        // Wait for layout.
+        waitForLayoutAdapterCallbackCount(6);
+
         // Click the print button.
         clickPrintButton();
 
@@ -394,6 +401,7 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -406,6 +414,7 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, thirdOldAttributes, thirdNewAttributes, true);
 
@@ -418,6 +427,7 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, fourthOldAttributes, fourthNewAttributes, true);
 
@@ -430,11 +440,25 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, fifthOldAttributes, fifthNewAttributes, true);
 
+        // We changed the duplex which triggers a layout. Since we passed
+        // false to the layout callback meaning that the content didn't change,
+        // there shouldn't be a next call to write.
+        PrintAttributes sixthOldAttributes = fifthNewAttributes;
+        PrintAttributes sixthNewAttributes = new PrintAttributes.Builder()
+                .setMediaSize(MediaSize.ISO_A4.asLandscape())
+                .setResolution(new Resolution("300x300", "300x300", 300, 300))
+                .setMinMargins(Margins.NO_MARGINS)
+                .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_SHORT_EDGE)
+                .build();
+        verifyLayoutCall(inOrder, adapter, sixthOldAttributes, sixthNewAttributes, true);
+
         // When print is pressed we ask for a layout which is *not* for preview.
-        verifyLayoutCall(inOrder, adapter, fifthNewAttributes, fifthNewAttributes, false);
+        verifyLayoutCall(inOrder, adapter, sixthNewAttributes, sixthNewAttributes, false);
 
         // When print is pressed we ask for all selected pages but we got
         // them when asking for the ones for a preview, and the adapter does
@@ -565,6 +589,7 @@
                 .setResolution(new Resolution("PDF resolution", "PDF resolution", 300, 300))
                 .setMinMargins(new Margins(0, 0, 0, 0))
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -575,6 +600,7 @@
                 .setResolution(new Resolution("PDF resolution", "PDF resolution", 300, 300))
                 .setMinMargins(new Margins(0, 0, 0, 0))
                 .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, thirdOldAttributes, thirdNewAttributes, true);
 
@@ -706,7 +732,9 @@
         PrintAttributes secondNewAttributes = new PrintAttributes.Builder()
                 .setMediaSize(MediaSize.ISO_A3)
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
-                .setMinMargins(Margins.NO_MARGINS).setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setMinMargins(Margins.NO_MARGINS)
+                .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -937,7 +965,9 @@
         PrintAttributes secondNewAttributes = new PrintAttributes.Builder()
                 .setMediaSize(MediaSize.ISO_A3)
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
-                .setMinMargins(Margins.NO_MARGINS).setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setMinMargins(Margins.NO_MARGINS)
+                .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -1573,8 +1603,13 @@
                         .addResolution(new Resolution("200x200", "200x200", 200, 200), true)
                         .addResolution(new Resolution("300x300", "300x300", 300, 300), false)
                         .setColorModes(PrintAttributes.COLOR_MODE_COLOR
-                                | PrintAttributes.COLOR_MODE_MONOCHROME,
-                                PrintAttributes.COLOR_MODE_MONOCHROME)
+                                        | PrintAttributes.COLOR_MODE_MONOCHROME,
+                                PrintAttributes.COLOR_MODE_MONOCHROME
+                        )
+                        .setDuplexModes(PrintAttributes.DUPLEX_MODE_LONG_EDGE
+                                        | PrintAttributes.DUPLEX_MODE_SHORT_EDGE,
+                                PrintAttributes.DUPLEX_MODE_LONG_EDGE
+                        )
                         .build();
                     PrinterInfo secondPrinter = new PrinterInfo.Builder(secondPrinterId,
                             "Second printer", PrinterInfo.STATUS_IDLE)
diff --git a/tests/tests/provider/AndroidManifest.xml b/tests/tests/provider/AndroidManifest.xml
index abda46c..855c4ce 100644
--- a/tests/tests/provider/AndroidManifest.xml
+++ b/tests/tests/provider/AndroidManifest.xml
@@ -18,6 +18,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="com.android.cts.provider">
 
+    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
+
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_AggregationSuggestionsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_AggregationSuggestionsTest.java
new file mode 100644
index 0000000..1aa2b64
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_AggregationSuggestionsTest.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.provider.cts;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Contacts.AggregationSuggestions;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
+import android.provider.cts.contacts.DatabaseAsserts;
+import android.test.AndroidTestCase;
+
+/**
+ * CTS tests for {@link android.provider.ContactsContract.Contacts.AggregationSuggestions} APIs.
+ */
+public class ContactsContract_AggregationSuggestionsTest extends AndroidTestCase {
+    private static final String[] TEST_PROJECTION
+            = new String[] {Contacts.DISPLAY_NAME, Contacts._ID};
+
+    private ContentResolver mResolver;
+    private ContactsContract_TestDataBuilder mBuilder;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
+        mBuilder = new ContactsContract_TestDataBuilder(provider);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mBuilder.cleanup();
+    }
+
+    // Copy of CP2's ContactAggregatorTest#testAggregationSuggestionsByName unit test.
+    public void testAggregationSuggestionsByNameReversed() throws Exception {
+        long [] contactIds = setupThreeContacts();
+
+        // Setup: create query with first and last name reversed.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("last1 first1")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(uri, TEST_PROJECTION, null, null, null);
+
+        // Verify: correct contact is returned.
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        ContentValues values = new ContentValues();
+        values.put(Contacts._ID, contactIds[0]);
+        values.put(Contacts.DISPLAY_NAME, "first1 last1");
+        DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        cursor.close();
+    }
+
+
+    public void testAggregationSuggestionsByName() throws Exception {
+        long [] contactIds = setupThreeContacts();
+
+        // Setup: create query with first and last name in same order as display name.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("first1 last1")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(uri, TEST_PROJECTION, null, null, null);
+
+        // Verify: correct contact is returned.
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        ContentValues values = new ContentValues();
+        values.put(Contacts._ID, contactIds[0]);
+        values.put(Contacts.DISPLAY_NAME, "first1 last1");
+        DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        cursor.close();
+    }
+
+    public void testAggregationSuggestionsByName_noMatch() throws Exception {
+        setupThreeContacts();
+
+        // Setup: query with name that is completely different than all the contacts.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("unmatched name")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(
+                uri, new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null, null, null);
+
+        // Verify: no matches.
+        assertEquals(0, cursor.getCount());
+    }
+
+    public void testAggregationSuggestionsByName_matchSecondNameParameter() throws Exception {
+        long [] contactIds = setupThreeContacts();
+
+        // Setup: query with two names. The first name is completely unlike all the contacts.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("unmatched name")
+                .addNameParameter("first2 last2")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(uri, TEST_PROJECTION, null, null, null);
+
+        // Verify: the second name parameter matches a contact.
+        assertEquals(1, cursor.getCount());
+        ContentValues values = new ContentValues();
+        values.put(Contacts._ID, contactIds[1]);
+        values.put(Contacts.DISPLAY_NAME, "first2 last2");
+        DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        cursor.close();
+    }
+
+    public void testAggregationSuggestionsByName_matchFirstNameParameter() throws Exception {
+        long [] contactIds = setupThreeContacts();
+
+        // Setup: query with two names. The second name is completely unlike all the contacts.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("first2 last2")
+                .addNameParameter("unmatched name")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(uri, TEST_PROJECTION, null, null, null);
+
+        // Verify: the first name parameter matches a contact.
+        assertEquals(1, cursor.getCount());
+        ContentValues values = new ContentValues();
+        values.put(Contacts._ID, contactIds[1]);
+        values.put(Contacts.DISPLAY_NAME, "first2 last2");
+        DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        cursor.close();
+    }
+
+    private long[] setupThreeContacts() throws Exception {
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "first1")
+                .with(StructuredName.FAMILY_NAME, "last1")
+                .insert();
+        rawContact1.load();
+
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "first2")
+                .with(StructuredName.FAMILY_NAME, "last2")
+                .insert();
+        rawContact2.load();
+
+        TestRawContact rawContact3 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact3.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "completely")
+                .with(StructuredName.FAMILY_NAME, "different")
+                .insert();
+        rawContact3.load();
+
+        return new long[] {rawContact1.getContactId(),
+                rawContact2.getContactId(), rawContact3.getContactId()};
+    }
+}
+
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
index 006f4df..f8f610a 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
@@ -27,6 +27,7 @@
 import android.net.Uri;
 import android.os.SystemClock;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.Contacts;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
@@ -101,6 +102,12 @@
         assertEquals(ContentUris.withAppendedId(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,
                 lookupKey), contactId), lookupUri);
 
+        Uri nullLookupUri = Contacts.getLookupUri(contactId, null);
+        assertNull(nullLookupUri);
+
+        Uri emptyLookupUri = Contacts.getLookupUri(contactId, "");
+        assertNull(emptyLookupUri);
+
         Uri lookupUri2 = Contacts.getLookupUri(mResolver, contactUri);
         assertEquals(lookupUri, lookupUri2);
 
@@ -161,6 +168,74 @@
         RawContactUtil.delete(mResolver, ids.mRawContactId, true);
     }
 
+    public void testProjection() throws Exception {
+        final TestRawContact rawContact = mBuilder.newRawContact().insert().load();
+        rawContact.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "xxx")
+                .insert();
+
+        final TestContact contact = rawContact.getContact().load();
+        final long contactId = contact.getId();
+        final String lookupKey = contact.getString(Contacts.LOOKUP_KEY);
+
+        final String[] PROJECTION = new String[]{
+                Contacts._ID,
+                Contacts.DISPLAY_NAME,
+                Contacts.DISPLAY_NAME_PRIMARY,
+                Contacts.DISPLAY_NAME_ALTERNATIVE,
+                Contacts.DISPLAY_NAME_SOURCE,
+                Contacts.PHONETIC_NAME,
+                Contacts.PHONETIC_NAME_STYLE,
+                Contacts.SORT_KEY_PRIMARY,
+                Contacts.SORT_KEY_ALTERNATIVE,
+                Contacts.LAST_TIME_CONTACTED,
+                Contacts.TIMES_CONTACTED,
+                Contacts.STARRED,
+                Contacts.PINNED,
+                Contacts.IN_DEFAULT_DIRECTORY,
+                Contacts.IN_VISIBLE_GROUP,
+                Contacts.PHOTO_ID,
+                Contacts.PHOTO_FILE_ID,
+                Contacts.PHOTO_URI,
+                Contacts.PHOTO_THUMBNAIL_URI,
+                Contacts.CUSTOM_RINGTONE,
+                Contacts.HAS_PHONE_NUMBER,
+                Contacts.SEND_TO_VOICEMAIL,
+                Contacts.IS_USER_PROFILE,
+                Contacts.LOOKUP_KEY,
+                Contacts.NAME_RAW_CONTACT_ID,
+                Contacts.CONTACT_PRESENCE,
+                Contacts.CONTACT_CHAT_CAPABILITY,
+                Contacts.CONTACT_STATUS,
+                Contacts.CONTACT_STATUS_TIMESTAMP,
+                Contacts.CONTACT_STATUS_RES_PACKAGE,
+                Contacts.CONTACT_STATUS_LABEL,
+                Contacts.CONTACT_STATUS_ICON,
+                Contacts.CONTACT_LAST_UPDATED_TIMESTAMP
+        };
+
+        // Contacts.CONTENT_URI
+        DatabaseAsserts.checkProjection(mResolver,
+                Contacts.CONTENT_URI,
+                PROJECTION,
+                new long[]{contact.getId()}
+        );
+
+        // Contacts.CONTENT_FILTER_URI
+        DatabaseAsserts.checkProjection(mResolver,
+                Contacts.CONTENT_FILTER_URI.buildUpon().appendEncodedPath("xxx").build(),
+                PROJECTION,
+                new long[]{contact.getId()}
+        );
+
+        // Contacts.CONTENT_LOOKUP_URI
+        DatabaseAsserts.checkProjection(mResolver,
+                Contacts.getLookupUri(contactId, lookupKey),
+                PROJECTION,
+                new long[]{contact.getId()}
+        );
+    }
+
     /**
      * Create a contact.  Delete it.  And assert that the contact record is no longer present.
      *
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_FrequentsStrequentsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_FrequentsStrequentsTest.java
index b515550..b52915c 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_FrequentsStrequentsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_FrequentsStrequentsTest.java
@@ -48,6 +48,85 @@
     private ContentResolver mResolver;
     private ContactsContract_TestDataBuilder mBuilder;
 
+    private static final String[] STREQUENT_PROJECTION = new String[]{
+            Contacts._ID,
+            Contacts.HAS_PHONE_NUMBER,
+            Contacts.NAME_RAW_CONTACT_ID,
+            Contacts.IS_USER_PROFILE,
+            Contacts.CUSTOM_RINGTONE,
+            Contacts.DISPLAY_NAME,
+            Contacts.DISPLAY_NAME_ALTERNATIVE,
+            Contacts.DISPLAY_NAME_SOURCE,
+            Contacts.IN_DEFAULT_DIRECTORY,
+            Contacts.IN_VISIBLE_GROUP,
+            Contacts.LAST_TIME_CONTACTED,
+            Contacts.LOOKUP_KEY,
+            Contacts.PHONETIC_NAME,
+            Contacts.PHONETIC_NAME_STYLE,
+            Contacts.PHOTO_ID,
+            Contacts.PHOTO_FILE_ID,
+            Contacts.PHOTO_URI,
+            Contacts.PHOTO_THUMBNAIL_URI,
+            Contacts.SEND_TO_VOICEMAIL,
+            Contacts.SORT_KEY_ALTERNATIVE,
+            Contacts.SORT_KEY_PRIMARY,
+            Contacts.STARRED,
+            Contacts.PINNED,
+            Contacts.TIMES_CONTACTED,
+            Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
+            Contacts.CONTACT_PRESENCE,
+            Contacts.CONTACT_CHAT_CAPABILITY,
+            Contacts.CONTACT_STATUS,
+            Contacts.CONTACT_STATUS_TIMESTAMP,
+            Contacts.CONTACT_STATUS_RES_PACKAGE,
+            Contacts.CONTACT_STATUS_LABEL,
+            Contacts.CONTACT_STATUS_ICON,
+            Data.TIMES_USED,
+            Data.LAST_TIME_USED,
+    };
+
+    private static final String[] STREQUENT_PHONE_ONLY_PROJECTION = new String[]{
+            Data._ID,
+            Contacts.HAS_PHONE_NUMBER,
+            Contacts.NAME_RAW_CONTACT_ID,
+            Contacts.IS_USER_PROFILE,
+            Contacts.CUSTOM_RINGTONE,
+            Contacts.DISPLAY_NAME,
+            Contacts.DISPLAY_NAME_ALTERNATIVE,
+            Contacts.DISPLAY_NAME_SOURCE,
+            Contacts.IN_DEFAULT_DIRECTORY,
+            Contacts.IN_VISIBLE_GROUP,
+            Contacts.LAST_TIME_CONTACTED,
+            Contacts.LOOKUP_KEY,
+            Contacts.PHONETIC_NAME,
+            Contacts.PHONETIC_NAME_STYLE,
+            Contacts.PHOTO_ID,
+            Contacts.PHOTO_FILE_ID,
+            Contacts.PHOTO_URI,
+            Contacts.PHOTO_THUMBNAIL_URI,
+            Contacts.SEND_TO_VOICEMAIL,
+            Contacts.SORT_KEY_ALTERNATIVE,
+            Contacts.SORT_KEY_PRIMARY,
+            Contacts.STARRED,
+            Contacts.PINNED,
+            Contacts.TIMES_CONTACTED,
+            Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
+            Contacts.CONTACT_PRESENCE,
+            Contacts.CONTACT_CHAT_CAPABILITY,
+            Contacts.CONTACT_STATUS,
+            Contacts.CONTACT_STATUS_TIMESTAMP,
+            Contacts.CONTACT_STATUS_RES_PACKAGE,
+            Contacts.CONTACT_STATUS_LABEL,
+            Contacts.CONTACT_STATUS_ICON,
+            Data.TIMES_USED,
+            Data.LAST_TIME_USED,
+            Phone.NUMBER,
+            Phone.TYPE,
+            Phone.LABEL,
+            Phone.IS_SUPER_PRIMARY,
+            Phone.CONTACT_ID,
+    };
+
     public static ContentValues[] sContentValues = new ContentValues[3];
     static {
         ContentValues cv1 = new ContentValues();
@@ -182,48 +261,18 @@
         starContact(ids[0]);
         markDataAsUsed(mDataIds[2], 1);
 
-        // Construct a uri for phone only favorites.
-        Uri uri = Contacts.CONTENT_STREQUENT_URI;
-
-        DatabaseAsserts.checkProjection(mResolver, uri,
-                new String[]{
-                        Contacts._ID,
-                        Contacts.HAS_PHONE_NUMBER,
-                        Contacts.NAME_RAW_CONTACT_ID,
-                        Contacts.IS_USER_PROFILE,
-                        Contacts.CUSTOM_RINGTONE,
-                        Contacts.DISPLAY_NAME,
-                        Contacts.DISPLAY_NAME_ALTERNATIVE,
-                        Contacts.DISPLAY_NAME_SOURCE,
-                        Contacts.IN_DEFAULT_DIRECTORY,
-                        Contacts.IN_VISIBLE_GROUP,
-                        Contacts.LAST_TIME_CONTACTED,
-                        Contacts.LOOKUP_KEY,
-                        Contacts.PHONETIC_NAME,
-                        Contacts.PHONETIC_NAME_STYLE,
-                        Contacts.PHOTO_ID,
-                        Contacts.PHOTO_FILE_ID,
-                        Contacts.PHOTO_URI,
-                        Contacts.PHOTO_THUMBNAIL_URI,
-                        Contacts.SEND_TO_VOICEMAIL,
-                        Contacts.SORT_KEY_ALTERNATIVE,
-                        Contacts.SORT_KEY_PRIMARY,
-                        Contacts.STARRED,
-                        Contacts.PINNED,
-                        Contacts.TIMES_CONTACTED,
-                        Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
-                        Contacts.CONTACT_PRESENCE,
-                        Contacts.CONTACT_CHAT_CAPABILITY,
-                        Contacts.CONTACT_STATUS,
-                        Contacts.CONTACT_STATUS_TIMESTAMP,
-                        Contacts.CONTACT_STATUS_RES_PACKAGE,
-                        Contacts.CONTACT_STATUS_LABEL,
-                        Contacts.CONTACT_STATUS_ICON,
-                        Data.TIMES_USED,
-                        Data.LAST_TIME_USED,
-                },
+        DatabaseAsserts.checkProjection(mResolver, Contacts.CONTENT_STREQUENT_URI,
+                STREQUENT_PROJECTION,
                 new long[]{ids[0], ids[2]}
         );
+
+        // Strequent filter.
+        DatabaseAsserts.checkProjection(mResolver,
+                Contacts.CONTENT_STREQUENT_FILTER_URI.buildUpon()
+                        .appendEncodedPath("Hot Tamale").build(),
+                STREQUENT_PROJECTION,
+                new long[]{ids[0]}
+        );
     }
 
     public void testStrequents_phoneOnly() throws Exception {
@@ -277,48 +326,8 @@
                 appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true").build();
 
         DatabaseAsserts.checkProjection(mResolver, uri,
-                new String[] {
-                        Data._ID,
-                        Contacts.HAS_PHONE_NUMBER,
-                        Contacts.NAME_RAW_CONTACT_ID,
-                        Contacts.IS_USER_PROFILE,
-                        Contacts.CUSTOM_RINGTONE,
-                        Contacts.DISPLAY_NAME,
-                        Contacts.DISPLAY_NAME_ALTERNATIVE,
-                        Contacts.DISPLAY_NAME_SOURCE,
-                        Contacts.IN_DEFAULT_DIRECTORY,
-                        Contacts.IN_VISIBLE_GROUP,
-                        Contacts.LAST_TIME_CONTACTED,
-                        Contacts.LOOKUP_KEY,
-                        Contacts.PHONETIC_NAME,
-                        Contacts.PHONETIC_NAME_STYLE,
-                        Contacts.PHOTO_ID,
-                        Contacts.PHOTO_FILE_ID,
-                        Contacts.PHOTO_URI,
-                        Contacts.PHOTO_THUMBNAIL_URI,
-                        Contacts.SEND_TO_VOICEMAIL,
-                        Contacts.SORT_KEY_ALTERNATIVE,
-                        Contacts.SORT_KEY_PRIMARY,
-                        Contacts.STARRED,
-                        Contacts.PINNED,
-                        Contacts.TIMES_CONTACTED,
-                        Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
-                        Contacts.CONTACT_PRESENCE,
-                        Contacts.CONTACT_CHAT_CAPABILITY,
-                        Contacts.CONTACT_STATUS,
-                        Contacts.CONTACT_STATUS_TIMESTAMP,
-                        Contacts.CONTACT_STATUS_RES_PACKAGE,
-                        Contacts.CONTACT_STATUS_LABEL,
-                        Contacts.CONTACT_STATUS_ICON,
-                        Data.TIMES_USED,
-                        Data.LAST_TIME_USED,
-                        Phone.NUMBER,
-                        Phone.TYPE,
-                        Phone.LABEL,
-                        Phone.IS_SUPER_PRIMARY,
-                        Phone.CONTACT_ID,
-                },
-                new long[] {mDataIds[0], mDataIds[2]} // Note _id from phone_only is data._id
+                STREQUENT_PHONE_ONLY_PROJECTION,
+                new long[]{mDataIds[0], mDataIds[2]} // Note _id from phone_only is data._id
         );
     }
 
@@ -345,6 +354,17 @@
                 true /* inOrder */, sContentValues[1], sContentValues[2], sContentValues[0]);
     }
 
+    public void testFrequent_projection() throws Exception {
+        long[] ids = setupTestData();
+
+        markDataAsUsed(mDataIds[0], 10);
+
+        DatabaseAsserts.checkProjection(mResolver, Contacts.CONTENT_FREQUENT_URI,
+                STREQUENT_PROJECTION,
+                new long[]{ids[0]}
+        );
+    }
+
     /**
      * Given a uri, performs a query on the contacts provider for that uri and asserts that the
      * cursor returned from the query matches the expected results.
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_IsSuperPrimaryName.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_IsSuperPrimaryName.java
new file mode 100644
index 0000000..603cb61
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_IsSuperPrimaryName.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.provider.cts;
+
+import junit.framework.Assert;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.AggregationExceptions;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestData;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
+import android.test.AndroidTestCase;
+
+/**
+ * CTS tests for the affect that {@link ContactsContract.Data#IS_SUPER_PRIMARY} has on names inside
+ * aggregated contacts. Additionally, this needs to test the affect that aggregating contacts
+ * together has on IS_SUPER_PRIMARY values in order to enforce the desired IS_SUPER_PRIMARY
+ * behavior.
+ */
+public class ContactsContract_IsSuperPrimaryName extends AndroidTestCase {
+
+    private ContentResolver mResolver;
+    private ContactsContract_TestDataBuilder mBuilder;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
+        mBuilder = new ContactsContract_TestDataBuilder(provider);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mBuilder.cleanup();
+        super.tearDown();
+    }
+
+    public void testIsSuperPrimary_name1SuperPrimary() throws Exception {
+        testInner_displayNameFromIsSuperPrimary(/* isFirstNamePrimary = */ true, "name1", "name2");
+    }
+
+    public void testIsSuperPrimary_name2SuperPrimary() throws Exception {
+        testInner_displayNameFromIsSuperPrimary(/* isFirstNamePrimary = */ false, "name2", "name1");
+    }
+
+    private void testInner_displayNameFromIsSuperPrimary(boolean isFirstNamePrimary,
+            String expectedDisplayName, String otherDisplayName) throws Exception {
+
+        // Setup: two raw contacts. One with a super primary name. One without.
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name1")
+                .with(StructuredName.IS_SUPER_PRIMARY, isFirstNamePrimary ? 1 : 0)
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name2 = rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name2")
+                .with(StructuredName.IS_SUPER_PRIMARY, !isFirstNamePrimary ? 1 : 0)
+                .insert();
+        rawContact2.load();
+        name2.load();
+
+        // Execute: aggregate the two raw contacts together
+        setAggregationException(rawContact1.getId(), rawContact2.getId());
+
+        // Sanity check: two contacts are aggregated
+        rawContact1.load();
+        rawContact2.load();
+        Assert.assertEquals(rawContact1.getContactId(), rawContact2.getContactId());
+
+        // Verify: the IS_SUPER_PRIMARY values are maintained after the merge
+        name1.assertColumn(StructuredName.IS_SUPER_PRIMARY, isFirstNamePrimary ? 1 : 0);
+        name2.assertColumn(StructuredName.IS_SUPER_PRIMARY, !isFirstNamePrimary ? 1 : 0);
+
+        // Verify: the display name is taken from the name with is_super_primary
+        TestContact contact = rawContact2.getContact().load();
+        contact.assertColumn(Contacts.DISPLAY_NAME, expectedDisplayName);
+
+        //
+        // Now test what happens when you change IS_SUPER_PRIMARY on an existing contact
+        //
+
+        // Execute: make the non primary name IS_SUPER_PRIMARY
+        TestData nonPrimaryName = !isFirstNamePrimary ? name1 : name2;
+        ContentValues values = new ContentValues();
+        values.put(StructuredName.IS_SUPER_PRIMARY, 1);
+        mResolver.update(nonPrimaryName.getUri(), values, null, null);
+
+        // Verify: the IS_SUPER_PRIMARY values swap
+        name1.load();
+        name2.load();
+        name1.assertColumn(StructuredName.IS_SUPER_PRIMARY, isFirstNamePrimary ? 0 : 1);
+        name2.assertColumn(StructuredName.IS_SUPER_PRIMARY, !isFirstNamePrimary ? 0 : 1);
+
+        // Verify: the display name is taken from the name with is_super_primary
+        contact.load();
+        contact.assertColumn(Contacts.DISPLAY_NAME, otherDisplayName);
+    }
+
+    public void testIsSuperPrimaryName_mergeBothSuperPrimary() throws Exception {
+        // Setup: two raw contacts. Both names are super primary.
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name1")
+                .with(StructuredName.IS_SUPER_PRIMARY, 1)
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name2 = rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name2")
+                .with(StructuredName.IS_SUPER_PRIMARY, 1)
+                .insert();
+        rawContact2.load();
+        name2.load();
+
+        // Execute: aggregate the two contacts together
+        setAggregationException(rawContact1.getId(), rawContact2.getId());
+
+        // Sanity check: two contacts are aggregated
+        rawContact1.load();
+        rawContact2.load();
+        Assert.assertEquals(rawContact1.getContactId(), rawContact2.getContactId());
+
+        // Verify: both names are no longer super primary.
+        name1.load();
+        name2.load();
+        name1.assertColumn(StructuredName.IS_SUPER_PRIMARY, 0);
+        name2.assertColumn(StructuredName.IS_SUPER_PRIMARY, 0);
+    }
+
+    private void setAggregationException(long rawContactId1, long rawContactId2) {
+        ContentValues values = new ContentValues();
+        values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
+        values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
+        values.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);
+        mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null);
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_ProviderStatus.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_ProviderStatus.java
new file mode 100644
index 0000000..9c38ec0
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_ProviderStatus.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.provider.cts;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.ProviderStatus;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
+import android.provider.cts.contacts.DatabaseAsserts;
+import android.test.AndroidTestCase;
+
+/**
+ * CTS tests for {@link android.provider.ContactsContract.ProviderStatus}.
+ *
+ * Unfortunately, we can't check that the value of ProviderStatus equals
+ * {@link ProviderStatus#STATUS_EMPTY} initially. Some carriers pre-install
+ * accounts. As a result, the value STATUS_EMPTY will never be achieved.
+ */
+public class ContactsContract_ProviderStatus extends AndroidTestCase {
+    private ContentResolver mResolver;
+    private ContactsContract_TestDataBuilder mBuilder;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
+        mBuilder = new ContactsContract_TestDataBuilder(provider);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mBuilder.cleanup();
+    }
+
+    public void testProviderStatus_addedContacts() throws Exception {
+        // Setup: add a contact to CP2.
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "first1")
+                .with(StructuredName.FAMILY_NAME, "last1")
+                .insert();
+
+        // Execute: fetch CP2 status
+        Cursor cursor = mResolver.query(ProviderStatus.CONTENT_URI, null, null, null, null);
+
+        // Verify: CP2 status is normal instead of STATUS_EMPTY.
+        try {
+            assertEquals(1, cursor.getCount());
+            cursor.moveToFirst();
+            ContentValues values = new ContentValues();
+            values.put(ProviderStatus.STATUS, ProviderStatus.STATUS_NORMAL);
+            DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_StructuredPhoneticName.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_StructuredPhoneticName.java
new file mode 100644
index 0000000..4efd9a7
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_StructuredPhoneticName.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.provider.cts;
+
+import junit.framework.Assert;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.AggregationExceptions;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.DisplayNameSources;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestData;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
+import android.provider.cts.contacts.ContactUtil;
+import android.test.AndroidTestCase;
+
+/**
+ * CTS tests for {@link DisplayNameSources#STRUCTURED_PHONETIC_NAME}.
+ */
+public class ContactsContract_StructuredPhoneticName extends AndroidTestCase {
+    private ContentResolver mResolver;
+    private ContactsContract_TestDataBuilder mBuilder;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
+        mBuilder = new ContactsContract_TestDataBuilder(provider);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mBuilder.cleanup();
+        super.tearDown();
+    }
+
+    public void testPhoneticStructuredName() throws Exception {
+        // Setup: contact with only phonetic name
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.PHONETIC_FAMILY_NAME, "phonetic name")
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        // Verify: DISPLAY_NAME_SOURCE notices that the StructuredName only has phonetic components
+        TestContact contact = rawContact1.getContact().load();
+        contact.assertColumn(Contacts.DISPLAY_NAME_SOURCE,
+                DisplayNameSources.STRUCTURED_PHONETIC_NAME);
+    }
+
+    public void testPhoneticStructuredName_phoneticPriority1() throws Exception {
+        // Setup: one raw contact has a complex phonetic name and the other a simple given name
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name")
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name2 = rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.PHONETIC_FAMILY_NAME, "name phonetic")
+                .insert();
+        rawContact2.load();
+        name2.load();
+
+        // Execute: aggregate the two raw contacts together
+        ContactUtil.setAggregationException(mResolver, AggregationExceptions.TYPE_KEEP_TOGETHER,
+                rawContact1.getId(), rawContact2.getId());
+
+        // Sanity check: two contacts are aggregated
+        rawContact1.load();
+        rawContact2.load();
+        Assert.assertEquals(rawContact1.getContactId(), rawContact2.getContactId());
+
+        // Verify: the display name is taken from the name with more than phonetic components
+        TestContact contact = rawContact2.getContact().load();
+        contact.assertColumn(Contacts.DISPLAY_NAME, "name");
+    }
+
+    // Same as testPhoneticStructuredName_phoneticPriority1, but with setup order reversed
+    public void testPhoneticStructuredName_phoneticPriority2() throws Exception {
+        // Setup: one raw contact has a complex phonetic name and the other a simple given name
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name2 = rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.PHONETIC_FAMILY_NAME, "name phonetic")
+                .insert();
+        rawContact2.load();
+        name2.load();
+
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name")
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        // Execute: aggregate the two raw contacts together
+        ContactUtil.setAggregationException(mResolver, AggregationExceptions.TYPE_KEEP_TOGETHER,
+                rawContact1.getId(), rawContact2.getId());
+
+        // Sanity check: two contacts are aggregated
+        rawContact1.load();
+        rawContact2.load();
+        Assert.assertEquals(rawContact1.getContactId(), rawContact2.getContactId());
+
+        // Verify: the display name is taken from the name with more than phonetic components
+        TestContact contact = rawContact2.getContact().load();
+        contact.assertColumn(Contacts.DISPLAY_NAME, "name");
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
index 9a3fc19..9febaa2 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
@@ -416,7 +416,7 @@
                 Calls.CACHED_NUMBER_LABEL, Calls.CACHED_FORMATTED_NUMBER,
                 Calls.CACHED_MATCHED_NUMBER, Calls.CACHED_NORMALIZED_NUMBER,
                 Calls.CACHED_LOOKUP_URI, Calls.CACHED_PHOTO_ID, Calls.COUNTRY_ISO,
-                Calls.GEOCODED_LOCATION};
+                Calls.GEOCODED_LOCATION, Calls.CACHED_PHOTO_URI};
         final int ID_INDEX = 0;
         final int NUMBER_INDEX = 1;
         final int DATE_INDEX = 2;
@@ -433,6 +433,7 @@
         final int CACHED_PHOTO_ID_INDEX = 13;
         final int COUNTRY_ISO_INDEX = 14;
         final int GEOCODED_LOCATION_INDEX = 15;
+        final int CACHED_PHOTO_URI_INDEX = 16;
 
         String insertCallsNumber = "0123456789";
         int insertCallsDuration = 120;
@@ -448,6 +449,7 @@
         String updateCachedNormalizedNumber = "+1987654321";
         String updateCachedLookupUri = "cached_lookup_uri_update";
         long updateCachedPhotoId = 100;
+        String updateCachedPhotoUri = "content://com.android.contacts/display_photo/1";
         String updateCountryIso = "hk";
         String updateGeocodedLocation = "Hong Kong";
 
@@ -497,6 +499,7 @@
             value.put(Calls.CACHED_MATCHED_NUMBER, updateCachedMatchedNumber);
             value.put(Calls.CACHED_NORMALIZED_NUMBER, updateCachedNormalizedNumber);
             value.put(Calls.CACHED_PHOTO_ID, updateCachedPhotoId);
+            value.put(Calls.CACHED_PHOTO_URI, updateCachedPhotoUri);
             value.put(Calls.COUNTRY_ISO, updateCountryIso);
             value.put(Calls.GEOCODED_LOCATION, updateGeocodedLocation);
             value.put(Calls.CACHED_LOOKUP_URI, updateCachedLookupUri);
@@ -519,6 +522,7 @@
             assertEquals(updateCachedNormalizedNumber,
                     cursor.getString(CACHED_NORMALIZED_NUMBER_INDEX));
             assertEquals(updateCachedPhotoId, cursor.getLong(CACHED_PHOTO_ID_INDEX));
+            assertEquals(updateCachedPhotoUri, cursor.getString(CACHED_PHOTO_URI_INDEX));
             assertEquals(updateCountryIso, cursor.getString(COUNTRY_ISO_INDEX));
             assertEquals(updateGeocodedLocation, cursor.getString(GEOCODED_LOCATION_INDEX));
             assertEquals(updateCachedLookupUri, cursor.getString(CACHED_LOOKUP_URI_INDEX));
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
index 0eae82b..fa3a70d 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
@@ -306,19 +306,25 @@
 
                 // get the real path from the file descriptor (this relies on the media provider
                 // having opened the path via the real path instead of the emulated path).
-                values = new ContentValues();
-                values.put("_data", realPathFor(pfd));
-                mResolver.update(uri, values, null, null);
+                String realPath = realPathFor(pfd);
                 pfd.close();
+                if (realPath.equals(sdfile.getCanonicalPath())) {
+                    // provider did not use real/translated path
+                    sdfile = null;
+                } else {
+                    values = new ContentValues();
+                    values.put("_data", realPath);
+                    mResolver.update(uri, values, null, null);
 
-                // we shouldn't be able to access this
-                try {
-                    pfd = mResolver.openFileDescriptor(uri, "r");
-                    fail("shouldn't have fd for " + realPathFor(pfd));
-                } catch (FileNotFoundException e) {
-                    // expected
-                } finally {
-                    pfd.close();
+                    // we shouldn't be able to access this
+                    try {
+                        pfd = mResolver.openFileDescriptor(uri, "r");
+                        fail("shouldn't have fd for " + realPath);
+                    } catch (FileNotFoundException e) {
+                        // expected
+                    } finally {
+                        pfd.close();
+                    }
                 }
             } catch (FileNotFoundException e) {
                 fail("couldn't open file");
@@ -328,7 +334,7 @@
         // clean up
         assertEquals(1, mResolver.delete(uri, null, null));
         if (sdfile != null) {
-            assertEquals(true, sdfile.delete());
+            assertEquals("couldn't delete " + sdfile.getCanonicalPath(), true, sdfile.delete());
         }
 
         // test secondary storage if present
diff --git a/tests/tests/provider/src/android/provider/cts/SettingsTest.java b/tests/tests/provider/src/android/provider/cts/SettingsTest.java
index c732305..5cf5106 100644
--- a/tests/tests/provider/src/android/provider/cts/SettingsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/SettingsTest.java
@@ -16,7 +16,6 @@
 
 package android.provider.cts;
 
-
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -35,14 +34,11 @@
         final String[] SYSTEM_PROJECTION = new String[] {
                 Settings.System._ID, Settings.System.NAME, Settings.System.VALUE
         };
-        final int ID_INDEX = 0;
         final int NAME_INDEX = 1;
         final int VALUE_INDEX = 2;
 
-        String insertName = "name_insert";
+        String name = "name";
         String insertValue = "value_insert";
-
-        String updateName = "name_update";
         String updateValue = "value_update";
 
         // get provider
@@ -54,119 +50,50 @@
         try {
             // Test: insert
             ContentValues value = new ContentValues();
-            value.put(Settings.System.NAME, insertName);
+            value.put(Settings.System.NAME, name);
             value.put(Settings.System.VALUE, insertValue);
 
             provider.insert(Settings.System.CONTENT_URI, value);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System.NAME + "=\"" + insertName + "\"", null, null, null);
+                    Settings.System.NAME + "=\"" + name + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             assertTrue(cursor.moveToFirst());
-            assertEquals(insertName, cursor.getString(NAME_INDEX));
+            assertEquals(name, cursor.getString(NAME_INDEX));
             assertEquals(insertValue, cursor.getString(VALUE_INDEX));
-            int Id = cursor.getInt(ID_INDEX);
             cursor.close();
+            cursor = null;
 
             // Test: update
             value.clear();
-            value.put(Settings.System.NAME, updateName);
+            value.put(Settings.System.NAME, name);
             value.put(Settings.System.VALUE, updateValue);
 
             provider.update(Settings.System.CONTENT_URI, value,
-                    Settings.System.NAME + "=\"" + insertName + "\"", null);
+                    Settings.System.NAME + "=\"" + name + "\"", null);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System._ID + " = " + Id, null, null, null);
+                    Settings.System.NAME + "=\"" + name + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             assertTrue(cursor.moveToFirst());
-            assertEquals(updateName, cursor.getString(NAME_INDEX));
+            assertEquals(name, cursor.getString(NAME_INDEX));
             assertEquals(updateValue, cursor.getString(VALUE_INDEX));
             cursor.close();
+            cursor = null;
 
             // Test: delete
             provider.delete(Settings.System.CONTENT_URI,
-                    Settings.System.NAME + "=\"" + updateName + "\"", null);
+                    Settings.System.NAME + "=\"" + name + "\"", null);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System._ID + " = " + Id, null, null, null);
+                    Settings.System.NAME + "=\"" + name + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(0, cursor.getCount());
-        } finally {
-            // TODO should clean up more better
-            if (cursor != null)
-                cursor.close();
-        }
-    }
-
-    public void testBluetoothDevicesTable() throws RemoteException {
-        final String[] BLUETOOTH_DEVICES_PROJECTION = new String[] {
-                "name", "addr", "channel", "type"
-        };
-        final int ID_INDEX = 0;
-        final int ADDR_INDEX = 1;
-        final int CHANNEL_INDEX = 2;
-        final int TYPE_INDEX = 3;
-
-        String insertName = "name_insert";
-        String insertAddr = "addr_insert";
-
-        String updateName = "name_update";
-        String updateAddr = "addr_update";
-
-        // get provider
-        Uri uri = Uri.parse("content://settings/bluetooth_devices");
-        ContentResolver cr = mContext.getContentResolver();
-        ContentProviderClient provider = cr.acquireContentProviderClient(uri);
-        Cursor cursor = null;
-
-        try {
-            // Test: insert
-            ContentValues value = new ContentValues();
-            value.put("name", insertName);
-            value.put("addr", insertAddr);
-            value.put("channel", 1);
-            value.put("type", 2);
-
-            provider.insert(uri, value);
-            cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION,
-                    "name=\"" + insertName + "\"", null, null, null);
-            assertNotNull(cursor);
-            assertEquals(1, cursor.getCount());
-            assertTrue(cursor.moveToFirst());
-            assertEquals(insertAddr, cursor.getString(ADDR_INDEX));
-            assertEquals(1, cursor.getInt(CHANNEL_INDEX));
-            assertEquals(2, cursor.getInt(TYPE_INDEX));
-            int Id = cursor.getInt(ID_INDEX);
             cursor.close();
-
-            // Test: update
-            value.clear();
-            value.put("name", updateName);
-            value.put("addr", updateAddr);
-            value.put("channel", 3);
-            value.put("type", 4);
-
-            provider.update(uri, value, "name=\"" + insertName + "\"", null);
-            cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION,
-                    "name=\"" + updateName + "\"", null, null, null);
-            assertNotNull(cursor);
-            assertEquals(1, cursor.getCount());
-            assertTrue(cursor.moveToFirst());
-            assertEquals(updateAddr, cursor.getString(ADDR_INDEX));
-            assertEquals(3, cursor.getInt(CHANNEL_INDEX));
-            assertEquals(4, cursor.getInt(TYPE_INDEX));
-            cursor.close();
-
-            // Test: delete
-            provider.delete(uri, "name=\"" + updateName + "\"", null);
-            cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION, "_id = " + Id,
-                    null, null, null);
-            assertNotNull(cursor);
-            assertEquals(0, cursor.getCount());
+            cursor = null;
         } finally {
-            // TODO should clean up more better
-            if (cursor != null)
+            if (cursor != null) {
                 cursor.close();
+            }
         }
     }
 
@@ -211,22 +138,24 @@
             fail("SettingsProvider didn't throw IllegalArgumentException for insert name "
                     + name + " at URI " + uri);
         } catch (IllegalArgumentException e) {
+            /* ignore */
         }
 
-
         try {
             cr.update(uri, cv, NAME_EQ_PLACEHOLDER, new String[]{name});
-            fail("SettingsProvider didn't throw IllegalArgumentException for update name "
+            fail("SettingsProvider didn't throw SecurityException for update name "
                     + name + " at URI " + uri);
         } catch (IllegalArgumentException e) {
+            /* ignore */
         }
 
         try {
-            Cursor c = cr.query(uri, SELECT_VALUE, NAME_EQ_PLACEHOLDER,
+            cr.query(uri, SELECT_VALUE, NAME_EQ_PLACEHOLDER,
                     new String[]{name}, null);
             fail("SettingsProvider didn't throw IllegalArgumentException for query name "
                     + name + " at URI " + uri);
         } catch (IllegalArgumentException e) {
+            /* ignore */
         }
 
 
@@ -235,6 +164,7 @@
             fail("SettingsProvider didn't throw IllegalArgumentException for delete name "
                     + name + " at URI " + uri);
         } catch (IllegalArgumentException e) {
+            /* ignore */
         }
 
 
@@ -259,9 +189,7 @@
 
     public void testAccessNonTable() {
         tryBadTableAccess("SYSTEM", "system", "install_non_market_apps");
-        tryBadTableAccess("BOOKMARKS", "bookmarks", "install_non_market_apps");
         tryBadTableAccess("SECURE", "secure", "install_non_market_apps");
-        tryBadTableAccess("BLUETOOTH_DEVICES", "bluetooth_devices", "install_non_market_apps");
         tryBadTableAccess(" secure", "secure", "install_non_market_apps");
         tryBadTableAccess("secure ", "secure", "install_non_market_apps");
         tryBadTableAccess(" secure ", "secure", "install_non_market_apps");
diff --git a/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java b/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
index 2052e2e..96ea1d0 100644
--- a/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
@@ -53,9 +53,6 @@
 
         selection = System.NAME + "=\"" + STRING_FIELD + "\"";
         cr.delete(System.CONTENT_URI, selection, null);
-
-        selection = System.NAME + "=\"" + System.SHOW_GTALK_SERVICE_STATUS + "\"";
-        cr.delete(System.CONTENT_URI, selection, null);
     }
 
     public void testSystemSettings() throws SettingNotFoundException {
@@ -76,16 +73,15 @@
 
             String stringValue = "cts";
 
-            // insert 5 rows, and update 1 rows
+            // insert 4 rows, and update 1 rows
             assertTrue(System.putInt(cr, INT_FIELD, 10));
             assertTrue(System.putLong(cr, LONG_FIELD, 20l));
             assertTrue(System.putFloat(cr, FLOAT_FIELD, 30.0f));
             assertTrue(System.putString(cr, STRING_FIELD, stringValue));
-            System.setShowGTalkServiceStatus(cr, true);
 
             c = cr.query(System.CONTENT_URI, null, null, null, null);
             assertNotNull(c);
-            assertEquals(origCount + 5, c.getCount());
+            assertEquals(origCount + 4, c.getCount());
             c.close();
 
             // get these rows to assert
@@ -94,7 +90,6 @@
             assertEquals(30.0f, System.getFloat(cr, FLOAT_FIELD), 0.001);
 
             assertEquals(stringValue, System.getString(cr, STRING_FIELD));
-            assertTrue(System.getShowGTalkServiceStatus(cr));
 
             // delete the tested rows again
             deleteTestedRows();
diff --git a/tests/tests/renderscript/Android.mk b/tests/tests/renderscript/Android.mk
index 245c5b9..1ea800e 100644
--- a/tests/tests/renderscript/Android.mk
+++ b/tests/tests/renderscript/Android.mk
@@ -29,11 +29,11 @@
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
-LOCAL_JNI_SHARED_LIBRARIES := libcoremathtestcpp_jni
+LOCAL_JNI_SHARED_LIBRARIES := libcoremathtestcpp_jni libbnnmdata_jni
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
 
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
-include $(LOCAL_PATH)/libcoremathtestcpp/Android.mk
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/apps/CtsVerifier/lib/Android.mk b/tests/tests/renderscript/libbnnmdata/Android.mk
similarity index 65%
copy from apps/CtsVerifier/lib/Android.mk
copy to tests/tests/renderscript/libbnnmdata/Android.mk
index 56a3fa8..471d74a 100644
--- a/apps/CtsVerifier/lib/Android.mk
+++ b/tests/tests/renderscript/libbnnmdata/Android.mk
@@ -1,5 +1,4 @@
-#
-# Copyright (C) 2011 The Android Open Source Project
+# Copyright (C) 2015 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -12,6 +11,15 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-#
 
-include $(call all-subdir-makefiles)
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+LOCAL_CLANG := true
+
+LOCAL_MODULE := libbnnmdata_jni
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := test_data.cpp
+
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/renderscript/libbnnmdata/test_data.cpp b/tests/tests/renderscript/libbnnmdata/test_data.cpp
new file mode 100644
index 0000000..91222c2
--- /dev/null
+++ b/tests/tests/renderscript/libbnnmdata/test_data.cpp
@@ -0,0 +1,56591 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <jni.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+const int m = 256;
+const int n = 192;
+const int k = 1152;
+const int a_offset = 0;
+const int b_offset = 84;
+const int c_mult_int = 3401;
+const int c_offset = 74980;
+
+const int a_count = (m * k);
+const int b_count = (n * k);
+const int c_count = (m * n);
+
+unsigned char a_data[a_count] = {
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 14, 0, 0, 0, 63, 31,
+  0, 36, 15, 0, 0, 12, 10, 93, 23, 78,
+  37, 39, 52, 0, 44, 62, 9, 23, 34, 48,
+  251, 53, 0, 0, 103, 0, 11, 0, 0, 19,
+  12, 43, 34, 0, 10, 7, 84, 61, 0, 22,
+  0, 69, 0, 28, 41, 0, 20, 0, 7, 14,
+  0, 3, 6, 7, 15, 0, 0, 16, 25, 16,
+  0, 28, 0, 14, 83, 9, 21, 62, 7, 4,
+  7, 0, 53, 0, 16, 0, 0, 1, 0, 4,
+  66, 24, 50, 9, 0, 0, 69, 27, 15, 2,
+  14, 33, 3, 0, 1, 18, 73, 0, 43, 0,
+  0, 6, 26, 16, 10, 44, 0, 0, 22, 18,
+  0, 41, 77, 0, 0, 0, 0, 0, 27, 20,
+  27, 77, 56, 1, 0, 0, 53, 33, 0, 26,
+  0, 19, 15, 40, 3, 80, 27, 70, 9, 40,
+  13, 19, 51, 56, 1, 0, 62, 39, 168, 33,
+  0, 2, 112, 0, 35, 0, 0, 8, 0, 15,
+  15, 0, 16, 4, 70, 57, 0, 21, 0, 58,
+  0, 81, 74, 0, 31, 0, 4, 0, 0, 0,
+  31, 0, 5, 36, 0, 9, 25, 0, 0, 65,
+  0, 19, 22, 10, 17, 20, 19, 22, 19, 0,
+  39, 0, 23, 18, 0, 9, 5, 21, 68, 17,
+  39, 0, 0, 0, 34, 0, 67, 16, 7, 35,
+  9, 16, 42, 18, 111, 0, 19, 7, 30, 4,
+  45, 33, 26, 6, 0, 0, 14, 0, 1, 30,
+  86, 0, 9, 0, 3, 0, 26, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 12, 21, 64, 6,
+  0, 0, 17, 8, 0, 10, 24, 0, 0, 65,
+  0, 74, 92, 76, 35, 40, 22, 3, 39, 33,
+  0, 0, 31, 58, 156, 6, 15, 0, 58, 0,
+  0, 0, 0, 18, 0, 18, 5, 27, 0, 0,
+  53, 31, 0, 18, 0, 0, 0, 47, 40, 0,
+  10, 0, 0, 9, 0, 6, 28, 0, 0, 0,
+  0, 7, 44, 0, 48, 45, 0, 16, 17, 16,
+  28, 6, 22, 3, 0, 16, 38, 0, 14, 0,
+  0, 13, 0, 23, 45, 25, 8, 25, 0, 0,
+  67, 0, 51, 0, 0, 39, 3, 0, 27, 11,
+  67, 0, 18, 0, 0, 0, 20, 21, 9, 43,
+  3, 0, 12, 0, 0, 0, 64, 0, 5, 0,
+  0, 0, 55, 0, 56, 59, 50, 27, 4, 0,
+  2, 0, 0, 0, 8, 0, 48, 60, 4, 28,
+  76, 49, 0, 0, 0, 6, 1, 61, 24, 0,
+  35, 40, 0, 0, 13, 0, 67, 0, 0, 0,
+  0, 0, 0, 1, 0, 66, 2, 0, 30, 28,
+  26, 42, 0, 12, 0, 69, 96, 0, 23, 0,
+  0, 0, 0, 0, 51, 0, 0, 65, 0, 8,
+  82, 0, 40, 45, 0, 20, 0, 33, 32, 0,
+  14, 3, 0, 16, 42, 0, 37, 0, 0, 30,
+  0, 27, 36, 9, 13, 0, 0, 22, 2, 0,
+  70, 5, 0, 64, 0, 23, 40, 0, 76, 0,
+  6, 0, 58, 8, 17, 40, 5, 0, 26, 0,
+  1, 0, 0, 0, 39, 0, 71, 0, 10, 9,
+  14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 39, 14, 0,
+  0, 0, 63, 31, 0, 36, 15, 0, 0, 12,
+  10, 93, 23, 78, 37, 39, 52, 0, 44, 62,
+  9, 23, 34, 48, 251, 53, 0, 0, 103, 0,
+  11, 0, 0, 19, 12, 43, 34, 0, 10, 7,
+  84, 61, 0, 22, 0, 69, 0, 28, 41, 0,
+  20, 0, 7, 14, 0, 3, 6, 7, 15, 0,
+  0, 16, 25, 16, 0, 28, 0, 14, 83, 9,
+  21, 62, 7, 4, 7, 0, 53, 0, 16, 0,
+  0, 1, 0, 4, 66, 24, 50, 9, 0, 0,
+  69, 27, 15, 2, 14, 33, 3, 0, 1, 18,
+  73, 0, 43, 0, 0, 6, 26, 16, 10, 44,
+  0, 0, 22, 18, 0, 41, 77, 0, 0, 0,
+  0, 0, 27, 20, 27, 77, 56, 1, 0, 0,
+  53, 33, 0, 26, 0, 19, 15, 40, 3, 80,
+  27, 70, 9, 40, 13, 19, 51, 56, 1, 0,
+  62, 39, 168, 33, 0, 2, 112, 0, 35, 0,
+  0, 8, 0, 15, 15, 0, 16, 4, 70, 57,
+  0, 21, 0, 58, 0, 81, 74, 0, 31, 0,
+  4, 0, 0, 0, 31, 0, 5, 36, 0, 9,
+  25, 0, 0, 65, 0, 19, 22, 10, 17, 20,
+  19, 22, 19, 0, 39, 0, 23, 18, 0, 9,
+  5, 21, 68, 17, 39, 0, 0, 0, 34, 0,
+  67, 16, 7, 35, 9, 16, 42, 18, 111, 0,
+  19, 7, 30, 4, 45, 33, 26, 6, 0, 0,
+  14, 0, 1, 30, 86, 0, 9, 0, 3, 0,
+  26, 19, 51, 73, 59, 31, 0, 25, 25, 27,
+  1, 0, 0, 49, 62, 54, 0, 17, 9, 31,
+  5, 0, 0, 97, 24, 47, 40, 0, 67, 36,
+  173, 0, 0, 93, 100, 0, 16, 5, 0, 0,
+  0, 8, 0, 0, 58, 12, 35, 124, 53, 23,
+  0, 49, 0, 76, 26, 0, 69, 0, 16, 0,
+  0, 0, 74, 49, 11, 40, 2, 17, 33, 10,
+  4, 69, 21, 19, 13, 0, 5, 0, 39, 35,
+  1, 0, 24, 0, 46, 72, 0, 11, 18, 1,
+  41, 28, 0, 0, 0, 0, 0, 0, 56, 0,
+  0, 45, 33, 55, 30, 39, 114, 0, 28, 15,
+  40, 0, 15, 24, 15, 0, 0, 0, 36, 0,
+  25, 27, 59, 0, 0, 0, 16, 0, 11, 50,
+  12, 21, 64, 6, 0, 0, 17, 8, 0, 10,
+  24, 0, 0, 65, 0, 74, 92, 76, 35, 40,
+  22, 3, 39, 33, 0, 0, 31, 58, 156, 6,
+  15, 0, 58, 0, 0, 0, 0, 18, 0, 18,
+  5, 27, 0, 0, 53, 31, 0, 18, 0, 0,
+  0, 47, 40, 0, 10, 0, 0, 9, 0, 6,
+  28, 0, 0, 0, 0, 7, 44, 0, 48, 45,
+  0, 16, 17, 16, 28, 6, 22, 3, 0, 16,
+  38, 0, 14, 0, 0, 13, 0, 23, 45, 25,
+  8, 25, 0, 0, 67, 0, 51, 0, 0, 39,
+  3, 0, 27, 11, 67, 0, 18, 0, 0, 0,
+  20, 21, 9, 43, 3, 0, 12, 0, 0, 0,
+  64, 0, 5, 0, 0, 0, 55, 0, 56, 59,
+  50, 27, 4, 0, 2, 0, 0, 0, 8, 0,
+  48, 60, 4, 28, 76, 49, 0, 0, 0, 6,
+  1, 61, 24, 0, 35, 40, 0, 0, 13, 0,
+  67, 0, 0, 0, 0, 0, 0, 1, 0, 66,
+  2, 0, 30, 28, 26, 42, 0, 12, 0, 69,
+  96, 0, 23, 0, 0, 0, 0, 0, 51, 0,
+  0, 65, 0, 8, 82, 0, 40, 45, 0, 20,
+  0, 33, 32, 0, 14, 3, 0, 16, 42, 0,
+  37, 0, 0, 30, 0, 27, 36, 9, 13, 0,
+  0, 22, 2, 0, 70, 5, 0, 64, 0, 23,
+  40, 0, 76, 0, 6, 0, 58, 8, 17, 40,
+  5, 0, 26, 0, 1, 0, 0, 0, 39, 0,
+  71, 0, 10, 9, 14, 0, 2, 55, 59, 38,
+  4, 35, 16, 13, 17, 0, 0, 16, 84, 0,
+  0, 22, 51, 18, 0, 0, 0, 56, 0, 33,
+  67, 0, 5, 30, 0, 0, 0, 43, 70, 0,
+  18, 0, 0, 0, 0, 41, 0, 35, 57, 2,
+  29, 80, 44, 19, 0, 21, 0, 34, 36, 10,
+  35, 0, 10, 0, 0, 0, 30, 26, 0, 32,
+  0, 0, 35, 1, 27, 0, 0, 17, 9, 19,
+  26, 0, 10, 16, 0, 22, 23, 0, 61, 69,
+  0, 5, 0, 0, 0, 42, 5, 0, 0, 31,
+  0, 24, 35, 0, 0, 65, 2, 0, 10, 12,
+  63, 0, 37, 0, 27, 0, 0, 14, 0, 0,
+  0, 0, 0, 0, 0, 0, 4, 0, 41, 0,
+  35, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 27, 77,
+  56, 1, 0, 0, 53, 33, 0, 26, 0, 19,
+  15, 40, 3, 80, 27, 70, 9, 40, 13, 19,
+  51, 56, 1, 0, 62, 39, 168, 33, 0, 2,
+  112, 0, 35, 0, 0, 8, 0, 15, 15, 0,
+  16, 4, 70, 57, 0, 21, 0, 58, 0, 81,
+  74, 0, 31, 0, 4, 0, 0, 0, 31, 0,
+  5, 36, 0, 9, 25, 0, 0, 65, 0, 19,
+  22, 10, 17, 20, 19, 22, 19, 0, 39, 0,
+  23, 18, 0, 9, 5, 21, 68, 17, 39, 0,
+  0, 0, 34, 0, 67, 16, 7, 35, 9, 16,
+  42, 18, 111, 0, 19, 7, 30, 4, 45, 33,
+  26, 6, 0, 0, 14, 0, 1, 30, 86, 0,
+  9, 0, 3, 0, 26, 19, 51, 73, 59, 31,
+  0, 25, 25, 27, 1, 0, 0, 49, 62, 54,
+  0, 17, 9, 31, 5, 0, 0, 97, 24, 47,
+  40, 0, 67, 36, 173, 0, 0, 93, 100, 0,
+  16, 5, 0, 0, 0, 8, 0, 0, 58, 12,
+  35, 124, 53, 23, 0, 49, 0, 76, 26, 0,
+  69, 0, 16, 0, 0, 0, 74, 49, 11, 40,
+  2, 17, 33, 10, 4, 69, 21, 19, 13, 0,
+  5, 0, 39, 35, 1, 0, 24, 0, 46, 72,
+  0, 11, 18, 1, 41, 28, 0, 0, 0, 0,
+  0, 0, 56, 0, 0, 45, 33, 55, 30, 39,
+  114, 0, 28, 15, 40, 0, 15, 24, 15, 0,
+  0, 0, 36, 0, 25, 27, 59, 0, 0, 0,
+  16, 0, 11, 50, 1, 0, 0, 19, 11, 92,
+  28, 0, 0, 0, 0, 57, 41, 55, 0, 0,
+  0, 21, 17, 3, 0, 71, 14, 58, 40, 0,
+  38, 15, 173, 20, 0, 66, 63, 35, 0, 0,
+  0, 0, 0, 44, 0, 0, 10, 45, 6, 158,
+  67, 62, 0, 26, 0, 54, 50, 0, 21, 0,
+  34, 0, 34, 0, 70, 66, 0, 18, 13, 4,
+  36, 35, 62, 39, 52, 9, 43, 0, 28, 0,
+  37, 0, 0, 0, 49, 0, 22, 62, 0, 0,
+  39, 14, 21, 0, 0, 25, 16, 0, 24, 37,
+  0, 0, 11, 49, 15, 31, 12, 45, 82, 9,
+  31, 0, 0, 16, 0, 14, 0, 7, 0, 44,
+  106, 21, 47, 22, 46, 0, 0, 0, 16, 0,
+  13, 16, 56, 59, 50, 27, 4, 0, 2, 0,
+  0, 0, 8, 0, 48, 60, 4, 28, 76, 49,
+  0, 0, 0, 6, 1, 61, 24, 0, 35, 40,
+  0, 0, 13, 0, 67, 0, 0, 0, 0, 0,
+  0, 1, 0, 66, 2, 0, 30, 28, 26, 42,
+  0, 12, 0, 69, 96, 0, 23, 0, 0, 0,
+  0, 0, 51, 0, 0, 65, 0, 8, 82, 0,
+  40, 45, 0, 20, 0, 33, 32, 0, 14, 3,
+  0, 16, 42, 0, 37, 0, 0, 30, 0, 27,
+  36, 9, 13, 0, 0, 22, 2, 0, 70, 5,
+  0, 64, 0, 23, 40, 0, 76, 0, 6, 0,
+  58, 8, 17, 40, 5, 0, 26, 0, 1, 0,
+  0, 0, 39, 0, 71, 0, 10, 9, 14, 0,
+  2, 55, 59, 38, 4, 35, 16, 13, 17, 0,
+  0, 16, 84, 0, 0, 22, 51, 18, 0, 0,
+  0, 56, 0, 33, 67, 0, 5, 30, 0, 0,
+  0, 43, 70, 0, 18, 0, 0, 0, 0, 41,
+  0, 35, 57, 2, 29, 80, 44, 19, 0, 21,
+  0, 34, 36, 10, 35, 0, 10, 0, 0, 0,
+  30, 26, 0, 32, 0, 0, 35, 1, 27, 0,
+  0, 17, 9, 19, 26, 0, 10, 16, 0, 22,
+  23, 0, 61, 69, 0, 5, 0, 0, 0, 42,
+  5, 0, 0, 31, 0, 24, 35, 0, 0, 65,
+  2, 0, 10, 12, 63, 0, 37, 0, 27, 0,
+  0, 14, 0, 0, 0, 0, 0, 0, 0, 0,
+  4, 0, 41, 0, 35, 0, 8, 0, 0, 0,
+  0, 18, 14, 124, 8, 0, 7, 0, 0, 29,
+  52, 11, 0, 6, 15, 0, 0, 0, 0, 77,
+  2, 24, 40, 0, 0, 9, 0, 14, 0, 31,
+  15, 32, 0, 0, 0, 21, 0, 76, 0, 37,
+  0, 65, 12, 85, 61, 31, 0, 0, 0, 31,
+  31, 4, 2, 0, 40, 0, 18, 0, 23, 69,
+  0, 16, 12, 9, 0, 29, 58, 0, 39, 20,
+  11, 0, 25, 21, 19, 0, 0, 29, 42, 0,
+  16, 44, 15, 0, 11, 0, 0, 8, 0, 6,
+  0, 0, 4, 72, 0, 0, 0, 72, 0, 0,
+  4, 12, 57, 0, 27, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 77, 0, 47, 0, 6, 3,
+  0, 0, 55, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  51, 73, 59, 31, 0, 25, 25, 27, 1, 0,
+  0, 49, 62, 54, 0, 17, 9, 31, 5, 0,
+  0, 97, 24, 47, 40, 0, 67, 36, 173, 0,
+  0, 93, 100, 0, 16, 5, 0, 0, 0, 8,
+  0, 0, 58, 12, 35, 124, 53, 23, 0, 49,
+  0, 76, 26, 0, 69, 0, 16, 0, 0, 0,
+  74, 49, 11, 40, 2, 17, 33, 10, 4, 69,
+  21, 19, 13, 0, 5, 0, 39, 35, 1, 0,
+  24, 0, 46, 72, 0, 11, 18, 1, 41, 28,
+  0, 0, 0, 0, 0, 0, 56, 0, 0, 45,
+  33, 55, 30, 39, 114, 0, 28, 15, 40, 0,
+  15, 24, 15, 0, 0, 0, 36, 0, 25, 27,
+  59, 0, 0, 0, 16, 0, 11, 50, 1, 0,
+  0, 19, 11, 92, 28, 0, 0, 0, 0, 57,
+  41, 55, 0, 0, 0, 21, 17, 3, 0, 71,
+  14, 58, 40, 0, 38, 15, 173, 20, 0, 66,
+  63, 35, 0, 0, 0, 0, 0, 44, 0, 0,
+  10, 45, 6, 158, 67, 62, 0, 26, 0, 54,
+  50, 0, 21, 0, 34, 0, 34, 0, 70, 66,
+  0, 18, 13, 4, 36, 35, 62, 39, 52, 9,
+  43, 0, 28, 0, 37, 0, 0, 0, 49, 0,
+  22, 62, 0, 0, 39, 14, 21, 0, 0, 25,
+  16, 0, 24, 37, 0, 0, 11, 49, 15, 31,
+  12, 45, 82, 9, 31, 0, 0, 16, 0, 14,
+  0, 7, 0, 44, 106, 21, 47, 22, 46, 0,
+  0, 0, 16, 0, 13, 16, 0, 38, 0, 0,
+  45, 3, 47, 0, 0, 5, 2, 35, 43, 41,
+  0, 12, 6, 26, 23, 27, 41, 0, 0, 68,
+  18, 30, 36, 25, 149, 46, 0, 0, 61, 42,
+  0, 0, 0, 0, 0, 81, 0, 0, 0, 48,
+  15, 76, 31, 35, 0, 47, 0, 53, 104, 0,
+  0, 15, 21, 0, 0, 5, 36, 26, 0, 63,
+  0, 10, 50, 5, 36, 4, 6, 13, 12, 0,
+  42, 49, 0, 0, 30, 0, 84, 0, 8, 23,
+  8, 1, 28, 38, 67, 0, 15, 10, 39, 0,
+  22, 34, 0, 0, 46, 45, 0, 15, 23, 0,
+  43, 0, 19, 15, 9, 58, 9, 7, 0, 4,
+  0, 0, 41, 21, 33, 22, 54, 6, 20, 0,
+  41, 0, 6, 0, 2, 55, 59, 38, 4, 35,
+  16, 13, 17, 0, 0, 16, 84, 0, 0, 22,
+  51, 18, 0, 0, 0, 56, 0, 33, 67, 0,
+  5, 30, 0, 0, 0, 43, 70, 0, 18, 0,
+  0, 0, 0, 41, 0, 35, 57, 2, 29, 80,
+  44, 19, 0, 21, 0, 34, 36, 10, 35, 0,
+  10, 0, 0, 0, 30, 26, 0, 32, 0, 0,
+  35, 1, 27, 0, 0, 17, 9, 19, 26, 0,
+  10, 16, 0, 22, 23, 0, 61, 69, 0, 5,
+  0, 0, 0, 42, 5, 0, 0, 31, 0, 24,
+  35, 0, 0, 65, 2, 0, 10, 12, 63, 0,
+  37, 0, 27, 0, 0, 14, 0, 0, 0, 0,
+  0, 0, 0, 0, 4, 0, 41, 0, 35, 0,
+  8, 0, 0, 0, 0, 18, 14, 124, 8, 0,
+  7, 0, 0, 29, 52, 11, 0, 6, 15, 0,
+  0, 0, 0, 77, 2, 24, 40, 0, 0, 9,
+  0, 14, 0, 31, 15, 32, 0, 0, 0, 21,
+  0, 76, 0, 37, 0, 65, 12, 85, 61, 31,
+  0, 0, 0, 31, 31, 4, 2, 0, 40, 0,
+  18, 0, 23, 69, 0, 16, 12, 9, 0, 29,
+  58, 0, 39, 20, 11, 0, 25, 21, 19, 0,
+  0, 29, 42, 0, 16, 44, 15, 0, 11, 0,
+  0, 8, 0, 6, 0, 0, 4, 72, 0, 0,
+  0, 72, 0, 0, 4, 12, 57, 0, 27, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 77, 0,
+  47, 0, 6, 3, 0, 0, 55, 0, 22, 0,
+  0, 12, 0, 0, 34, 31, 37, 0, 16, 0,
+  1, 11, 52, 11, 10, 28, 23, 12, 0, 12,
+  51, 0, 0, 50, 24, 48, 0, 15, 0, 35,
+  0, 0, 38, 48, 0, 0, 0, 6, 0, 75,
+  0, 43, 0, 59, 29, 41, 15, 15, 0, 19,
+  0, 15, 107, 18, 0, 0, 17, 0, 0, 28,
+  25, 21, 0, 41, 0, 0, 45, 6, 26, 0,
+  0, 8, 0, 14, 33, 51, 4, 0, 0, 28,
+  84, 14, 0, 6, 19, 0, 12, 21, 18, 26,
+  0, 9, 9, 21, 0, 72, 0, 4, 31, 72,
+  0, 0, 2, 0, 39, 0, 26, 7, 9, 48,
+  0, 0, 0, 3, 0, 0, 39, 24, 41, 0,
+  37, 0, 84, 0, 64, 0, 13, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 1, 0, 0, 19, 11, 92, 28, 0,
+  0, 0, 0, 57, 41, 55, 0, 0, 0, 21,
+  17, 3, 0, 71, 14, 58, 40, 0, 38, 15,
+  173, 20, 0, 66, 63, 35, 0, 0, 0, 0,
+  0, 44, 0, 0, 10, 45, 6, 158, 67, 62,
+  0, 26, 0, 54, 50, 0, 21, 0, 34, 0,
+  34, 0, 70, 66, 0, 18, 13, 4, 36, 35,
+  62, 39, 52, 9, 43, 0, 28, 0, 37, 0,
+  0, 0, 49, 0, 22, 62, 0, 0, 39, 14,
+  21, 0, 0, 25, 16, 0, 24, 37, 0, 0,
+  11, 49, 15, 31, 12, 45, 82, 9, 31, 0,
+  0, 16, 0, 14, 0, 7, 0, 44, 106, 21,
+  47, 22, 46, 0, 0, 0, 16, 0, 13, 16,
+  0, 38, 0, 0, 45, 3, 47, 0, 0, 5,
+  2, 35, 43, 41, 0, 12, 6, 26, 23, 27,
+  41, 0, 0, 68, 18, 30, 36, 25, 149, 46,
+  0, 0, 61, 42, 0, 0, 0, 0, 0, 81,
+  0, 0, 0, 48, 15, 76, 31, 35, 0, 47,
+  0, 53, 104, 0, 0, 15, 21, 0, 0, 5,
+  36, 26, 0, 63, 0, 10, 50, 5, 36, 4,
+  6, 13, 12, 0, 42, 49, 0, 0, 30, 0,
+  84, 0, 8, 23, 8, 1, 28, 38, 67, 0,
+  15, 10, 39, 0, 22, 34, 0, 0, 46, 45,
+  0, 15, 23, 0, 43, 0, 19, 15, 9, 58,
+  9, 7, 0, 4, 0, 0, 41, 21, 33, 22,
+  54, 6, 20, 0, 41, 0, 6, 0, 0, 46,
+  0, 5, 8, 0, 87, 3, 13, 14, 0, 39,
+  38, 29, 17, 42, 21, 66, 26, 57, 83, 0,
+  35, 35, 10, 13, 59, 37, 156, 43, 0, 0,
+  97, 0, 28, 0, 0, 0, 0, 60, 0, 0,
+  0, 58, 6, 89, 17, 14, 0, 43, 0, 39,
+  81, 11, 0, 0, 23, 0, 0, 26, 0, 12,
+  14, 12, 0, 0, 12, 25, 19, 1, 23, 0,
+  31, 0, 56, 15, 12, 6, 36, 0, 63, 0,
+  17, 12, 2, 0, 24, 1, 58, 22, 24, 0,
+  0, 0, 11, 31, 0, 0, 72, 22, 0, 0,
+  23, 0, 40, 0, 15, 32, 13, 36, 18, 8,
+  0, 1, 0, 0, 17, 8, 16, 23, 55, 3,
+  28, 0, 23, 0, 16, 0, 0, 0, 0, 18,
+  14, 124, 8, 0, 7, 0, 0, 29, 52, 11,
+  0, 6, 15, 0, 0, 0, 0, 77, 2, 24,
+  40, 0, 0, 9, 0, 14, 0, 31, 15, 32,
+  0, 0, 0, 21, 0, 76, 0, 37, 0, 65,
+  12, 85, 61, 31, 0, 0, 0, 31, 31, 4,
+  2, 0, 40, 0, 18, 0, 23, 69, 0, 16,
+  12, 9, 0, 29, 58, 0, 39, 20, 11, 0,
+  25, 21, 19, 0, 0, 29, 42, 0, 16, 44,
+  15, 0, 11, 0, 0, 8, 0, 6, 0, 0,
+  4, 72, 0, 0, 0, 72, 0, 0, 4, 12,
+  57, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 77, 0, 47, 0, 6, 3, 0, 0,
+  55, 0, 22, 0, 0, 12, 0, 0, 34, 31,
+  37, 0, 16, 0, 1, 11, 52, 11, 10, 28,
+  23, 12, 0, 12, 51, 0, 0, 50, 24, 48,
+  0, 15, 0, 35, 0, 0, 38, 48, 0, 0,
+  0, 6, 0, 75, 0, 43, 0, 59, 29, 41,
+  15, 15, 0, 19, 0, 15, 107, 18, 0, 0,
+  17, 0, 0, 28, 25, 21, 0, 41, 0, 0,
+  45, 6, 26, 0, 0, 8, 0, 14, 33, 51,
+  4, 0, 0, 28, 84, 14, 0, 6, 19, 0,
+  12, 21, 18, 26, 0, 9, 9, 21, 0, 72,
+  0, 4, 31, 72, 0, 0, 2, 0, 39, 0,
+  26, 7, 9, 48, 0, 0, 0, 3, 0, 0,
+  39, 24, 41, 0, 37, 0, 84, 0, 64, 0,
+  13, 0, 0, 32, 0, 0, 20, 0, 56, 0,
+  35, 0, 0, 29, 28, 20, 52, 24, 39, 50,
+  3, 36, 95, 0, 10, 21, 21, 25, 9, 34,
+  0, 29, 0, 0, 63, 0, 10, 0, 0, 0,
+  0, 48, 0, 3, 0, 63, 16, 61, 5, 1,
+  0, 6, 0, 3, 79, 33, 0, 0, 18, 0,
+  0, 7, 0, 7, 0, 0, 0, 0, 32, 20,
+  20, 0, 0, 0, 0, 0, 62, 0, 13, 2,
+  0, 6, 67, 26, 0, 0, 6, 0, 7, 0,
+  11, 49, 18, 0, 0, 4, 0, 55, 0, 6,
+  64, 36, 0, 0, 3, 0, 34, 0, 22, 9,
+  31, 35, 0, 0, 0, 0, 0, 0, 14, 2,
+  12, 0, 45, 0, 77, 0, 41, 0, 26, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 38, 0, 0, 45, 3,
+  47, 0, 0, 5, 2, 35, 43, 41, 0, 12,
+  6, 26, 23, 27, 41, 0, 0, 68, 18, 30,
+  36, 25, 149, 46, 0, 0, 61, 42, 0, 0,
+  0, 0, 0, 81, 0, 0, 0, 48, 15, 76,
+  31, 35, 0, 47, 0, 53, 104, 0, 0, 15,
+  21, 0, 0, 5, 36, 26, 0, 63, 0, 10,
+  50, 5, 36, 4, 6, 13, 12, 0, 42, 49,
+  0, 0, 30, 0, 84, 0, 8, 23, 8, 1,
+  28, 38, 67, 0, 15, 10, 39, 0, 22, 34,
+  0, 0, 46, 45, 0, 15, 23, 0, 43, 0,
+  19, 15, 9, 58, 9, 7, 0, 4, 0, 0,
+  41, 21, 33, 22, 54, 6, 20, 0, 41, 0,
+  6, 0, 0, 46, 0, 5, 8, 0, 87, 3,
+  13, 14, 0, 39, 38, 29, 17, 42, 21, 66,
+  26, 57, 83, 0, 35, 35, 10, 13, 59, 37,
+  156, 43, 0, 0, 97, 0, 28, 0, 0, 0,
+  0, 60, 0, 0, 0, 58, 6, 89, 17, 14,
+  0, 43, 0, 39, 81, 11, 0, 0, 23, 0,
+  0, 26, 0, 12, 14, 12, 0, 0, 12, 25,
+  19, 1, 23, 0, 31, 0, 56, 15, 12, 6,
+  36, 0, 63, 0, 17, 12, 2, 0, 24, 1,
+  58, 22, 24, 0, 0, 0, 11, 31, 0, 0,
+  72, 22, 0, 0, 23, 0, 40, 0, 15, 32,
+  13, 36, 18, 8, 0, 1, 0, 0, 17, 8,
+  16, 23, 55, 3, 28, 0, 23, 0, 16, 0,
+  0, 26, 0, 19, 10, 0, 77, 11, 23, 31,
+  0, 35, 23, 57, 9, 52, 22, 74, 37, 27,
+  102, 0, 0, 31, 15, 13, 55, 46, 154, 59,
+  0, 4, 97, 0, 27, 0, 0, 0, 0, 55,
+  0, 0, 0, 52, 12, 66, 15, 9, 0, 41,
+  0, 76, 57, 46, 4, 14, 7, 0, 0, 16,
+  0, 0, 24, 8, 0, 8, 10, 17, 12, 30,
+  0, 0, 27, 0, 37, 13, 12, 0, 23, 0,
+  76, 0, 17, 2, 0, 0, 21, 18, 71, 15,
+  30, 0, 0, 0, 29, 12, 20, 0, 83, 41,
+  0, 0, 20, 0, 63, 0, 2, 35, 27, 25,
+  17, 5, 25, 0, 6, 0, 30, 0, 13, 13,
+  58, 0, 47, 0, 29, 0, 20, 0, 0, 12,
+  0, 0, 34, 31, 37, 0, 16, 0, 1, 11,
+  52, 11, 10, 28, 23, 12, 0, 12, 51, 0,
+  0, 50, 24, 48, 0, 15, 0, 35, 0, 0,
+  38, 48, 0, 0, 0, 6, 0, 75, 0, 43,
+  0, 59, 29, 41, 15, 15, 0, 19, 0, 15,
+  107, 18, 0, 0, 17, 0, 0, 28, 25, 21,
+  0, 41, 0, 0, 45, 6, 26, 0, 0, 8,
+  0, 14, 33, 51, 4, 0, 0, 28, 84, 14,
+  0, 6, 19, 0, 12, 21, 18, 26, 0, 9,
+  9, 21, 0, 72, 0, 4, 31, 72, 0, 0,
+  2, 0, 39, 0, 26, 7, 9, 48, 0, 0,
+  0, 3, 0, 0, 39, 24, 41, 0, 37, 0,
+  84, 0, 64, 0, 13, 0, 0, 32, 0, 0,
+  20, 0, 56, 0, 35, 0, 0, 29, 28, 20,
+  52, 24, 39, 50, 3, 36, 95, 0, 10, 21,
+  21, 25, 9, 34, 0, 29, 0, 0, 63, 0,
+  10, 0, 0, 0, 0, 48, 0, 3, 0, 63,
+  16, 61, 5, 1, 0, 6, 0, 3, 79, 33,
+  0, 0, 18, 0, 0, 7, 0, 7, 0, 0,
+  0, 0, 32, 20, 20, 0, 0, 0, 0, 0,
+  62, 0, 13, 2, 0, 6, 67, 26, 0, 0,
+  6, 0, 7, 0, 11, 49, 18, 0, 0, 4,
+  0, 55, 0, 6, 64, 36, 0, 0, 3, 0,
+  34, 0, 22, 9, 31, 35, 0, 0, 0, 0,
+  0, 0, 14, 2, 12, 0, 45, 0, 77, 0,
+  41, 0, 26, 0, 0, 27, 0, 15, 17, 0,
+  54, 0, 26, 19, 0, 24, 19, 41, 54, 36,
+  42, 53, 0, 29, 105, 0, 0, 24, 36, 35,
+  13, 47, 0, 36, 0, 0, 67, 9, 22, 0,
+  0, 0, 0, 30, 0, 0, 0, 58, 16, 44,
+  12, 18, 0, 3, 21, 11, 61, 51, 0, 0,
+  3, 0, 0, 16, 0, 0, 0, 0, 0, 0,
+  38, 18, 25, 0, 0, 0, 0, 0, 56, 0,
+  14, 7, 0, 10, 79, 42, 2, 0, 11, 0,
+  6, 6, 16, 33, 14, 0, 0, 12, 0, 42,
+  0, 6, 83, 38, 0, 0, 5, 0, 37, 0,
+  29, 9, 43, 27, 0, 0, 1, 0, 0, 0,
+  12, 0, 2, 0, 32, 0, 100, 0, 40, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 46, 0, 5,
+  8, 0, 87, 3, 13, 14, 0, 39, 38, 29,
+  17, 42, 21, 66, 26, 57, 83, 0, 35, 35,
+  10, 13, 59, 37, 156, 43, 0, 0, 97, 0,
+  28, 0, 0, 0, 0, 60, 0, 0, 0, 58,
+  6, 89, 17, 14, 0, 43, 0, 39, 81, 11,
+  0, 0, 23, 0, 0, 26, 0, 12, 14, 12,
+  0, 0, 12, 25, 19, 1, 23, 0, 31, 0,
+  56, 15, 12, 6, 36, 0, 63, 0, 17, 12,
+  2, 0, 24, 1, 58, 22, 24, 0, 0, 0,
+  11, 31, 0, 0, 72, 22, 0, 0, 23, 0,
+  40, 0, 15, 32, 13, 36, 18, 8, 0, 1,
+  0, 0, 17, 8, 16, 23, 55, 3, 28, 0,
+  23, 0, 16, 0, 0, 26, 0, 19, 10, 0,
+  77, 11, 23, 31, 0, 35, 23, 57, 9, 52,
+  22, 74, 37, 27, 102, 0, 0, 31, 15, 13,
+  55, 46, 154, 59, 0, 4, 97, 0, 27, 0,
+  0, 0, 0, 55, 0, 0, 0, 52, 12, 66,
+  15, 9, 0, 41, 0, 76, 57, 46, 4, 14,
+  7, 0, 0, 16, 0, 0, 24, 8, 0, 8,
+  10, 17, 12, 30, 0, 0, 27, 0, 37, 13,
+  12, 0, 23, 0, 76, 0, 17, 2, 0, 0,
+  21, 18, 71, 15, 30, 0, 0, 0, 29, 12,
+  20, 0, 83, 41, 0, 0, 20, 0, 63, 0,
+  2, 35, 27, 25, 17, 5, 25, 0, 6, 0,
+  30, 0, 13, 13, 58, 0, 47, 0, 29, 0,
+  20, 0, 0, 16, 0, 14, 1, 0, 63, 29,
+  23, 32, 0, 13, 0, 45, 0, 47, 19, 68,
+  39, 6, 67, 0, 0, 42, 12, 16, 57, 47,
+  121, 62, 0, 0, 87, 0, 30, 0, 0, 0,
+  0, 41, 0, 0, 0, 17, 8, 43, 25, 0,
+  0, 37, 11, 79, 44, 41, 28, 6, 2, 20,
+  0, 16, 0, 0, 13, 18, 0, 16, 25, 5,
+  1, 40, 0, 0, 44, 0, 27, 34, 0, 0,
+  27, 0, 77, 0, 17, 14, 0, 0, 18, 24,
+  76, 0, 60, 4, 0, 4, 30, 0, 46, 0,
+  60, 49, 0, 0, 9, 0, 57, 0, 0, 18,
+  38, 31, 23, 17, 38, 0, 21, 0, 27, 0,
+  7, 10, 58, 0, 64, 0, 40, 0, 0, 0,
+  0, 32, 0, 0, 20, 0, 56, 0, 35, 0,
+  0, 29, 28, 20, 52, 24, 39, 50, 3, 36,
+  95, 0, 10, 21, 21, 25, 9, 34, 0, 29,
+  0, 0, 63, 0, 10, 0, 0, 0, 0, 48,
+  0, 3, 0, 63, 16, 61, 5, 1, 0, 6,
+  0, 3, 79, 33, 0, 0, 18, 0, 0, 7,
+  0, 7, 0, 0, 0, 0, 32, 20, 20, 0,
+  0, 0, 0, 0, 62, 0, 13, 2, 0, 6,
+  67, 26, 0, 0, 6, 0, 7, 0, 11, 49,
+  18, 0, 0, 4, 0, 55, 0, 6, 64, 36,
+  0, 0, 3, 0, 34, 0, 22, 9, 31, 35,
+  0, 0, 0, 0, 0, 0, 14, 2, 12, 0,
+  45, 0, 77, 0, 41, 0, 26, 0, 0, 27,
+  0, 15, 17, 0, 54, 0, 26, 19, 0, 24,
+  19, 41, 54, 36, 42, 53, 0, 29, 105, 0,
+  0, 24, 36, 35, 13, 47, 0, 36, 0, 0,
+  67, 9, 22, 0, 0, 0, 0, 30, 0, 0,
+  0, 58, 16, 44, 12, 18, 0, 3, 21, 11,
+  61, 51, 0, 0, 3, 0, 0, 16, 0, 0,
+  0, 0, 0, 0, 38, 18, 25, 0, 0, 0,
+  0, 0, 56, 0, 14, 7, 0, 10, 79, 42,
+  2, 0, 11, 0, 6, 6, 16, 33, 14, 0,
+  0, 12, 0, 42, 0, 6, 83, 38, 0, 0,
+  5, 0, 37, 0, 29, 9, 43, 27, 0, 0,
+  1, 0, 0, 0, 12, 0, 2, 0, 32, 0,
+  100, 0, 40, 0, 22, 0, 0, 22, 0, 0,
+  8, 0, 32, 0, 33, 28, 0, 1, 0, 29,
+  40, 48, 56, 56, 12, 13, 56, 0, 0, 29,
+  28, 42, 16, 56, 0, 19, 0, 0, 57, 2,
+  6, 0, 0, 0, 0, 24, 0, 0, 0, 16,
+  1, 14, 21, 10, 0, 5, 37, 5, 41, 38,
+  0, 11, 0, 24, 0, 42, 0, 0, 0, 0,
+  0, 0, 70, 24, 23, 0, 0, 0, 11, 21,
+  44, 0, 8, 0, 0, 12, 70, 39, 7, 8,
+  19, 29, 0, 28, 16, 3, 38, 30, 0, 36,
+  4, 7, 0, 4, 60, 56, 0, 0, 5, 0,
+  33, 0, 12, 9, 35, 35, 0, 12, 2, 0,
+  10, 0, 0, 0, 0, 0, 6, 0, 111, 0,
+  30, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
+  0, 19, 10, 0, 77, 11, 23, 31, 0, 35,
+  23, 57, 9, 52, 22, 74, 37, 27, 102, 0,
+  0, 31, 15, 13, 55, 46, 154, 59, 0, 4,
+  97, 0, 27, 0, 0, 0, 0, 55, 0, 0,
+  0, 52, 12, 66, 15, 9, 0, 41, 0, 76,
+  57, 46, 4, 14, 7, 0, 0, 16, 0, 0,
+  24, 8, 0, 8, 10, 17, 12, 30, 0, 0,
+  27, 0, 37, 13, 12, 0, 23, 0, 76, 0,
+  17, 2, 0, 0, 21, 18, 71, 15, 30, 0,
+  0, 0, 29, 12, 20, 0, 83, 41, 0, 0,
+  20, 0, 63, 0, 2, 35, 27, 25, 17, 5,
+  25, 0, 6, 0, 30, 0, 13, 13, 58, 0,
+  47, 0, 29, 0, 20, 0, 0, 16, 0, 14,
+  1, 0, 63, 29, 23, 32, 0, 13, 0, 45,
+  0, 47, 19, 68, 39, 6, 67, 0, 0, 42,
+  12, 16, 57, 47, 121, 62, 0, 0, 87, 0,
+  30, 0, 0, 0, 0, 41, 0, 0, 0, 17,
+  8, 43, 25, 0, 0, 37, 11, 79, 44, 41,
+  28, 6, 2, 20, 0, 16, 0, 0, 13, 18,
+  0, 16, 25, 5, 1, 40, 0, 0, 44, 0,
+  27, 34, 0, 0, 27, 0, 77, 0, 17, 14,
+  0, 0, 18, 24, 76, 0, 60, 4, 0, 4,
+  30, 0, 46, 0, 60, 49, 0, 0, 9, 0,
+  57, 0, 0, 18, 38, 31, 23, 17, 38, 0,
+  21, 0, 27, 0, 7, 10, 58, 0, 64, 0,
+  40, 0, 0, 0, 0, 26, 0, 7, 2, 0,
+  63, 38, 23, 37, 2, 6, 0, 40, 0, 45,
+  6, 67, 46, 14, 38, 0, 0, 48, 16, 24,
+  55, 58, 112, 45, 0, 0, 68, 0, 26, 0,
+  0, 0, 0, 44, 0, 0, 0, 2, 1, 25,
+  39, 0, 0, 36, 14, 72, 25, 35, 35, 0,
+  0, 49, 0, 21, 0, 0, 16, 34, 0, 26,
+  35, 0, 2, 44, 0, 0, 64, 0, 29, 35,
+  0, 1, 39, 0, 66, 5, 11, 30, 0, 6,
+  14, 27, 89, 0, 74, 5, 0, 3, 35, 0,
+  49, 0, 45, 48, 0, 0, 10, 0, 56, 0,
+  0, 23, 42, 24, 30, 23, 39, 0, 31, 0,
+  11, 0, 7, 13, 40, 0, 62, 0, 52, 0,
+  0, 2, 0, 27, 0, 15, 17, 0, 54, 0,
+  26, 19, 0, 24, 19, 41, 54, 36, 42, 53,
+  0, 29, 105, 0, 0, 24, 36, 35, 13, 47,
+  0, 36, 0, 0, 67, 9, 22, 0, 0, 0,
+  0, 30, 0, 0, 0, 58, 16, 44, 12, 18,
+  0, 3, 21, 11, 61, 51, 0, 0, 3, 0,
+  0, 16, 0, 0, 0, 0, 0, 0, 38, 18,
+  25, 0, 0, 0, 0, 0, 56, 0, 14, 7,
+  0, 10, 79, 42, 2, 0, 11, 0, 6, 6,
+  16, 33, 14, 0, 0, 12, 0, 42, 0, 6,
+  83, 38, 0, 0, 5, 0, 37, 0, 29, 9,
+  43, 27, 0, 0, 1, 0, 0, 0, 12, 0,
+  2, 0, 32, 0, 100, 0, 40, 0, 22, 0,
+  0, 22, 0, 0, 8, 0, 32, 0, 33, 28,
+  0, 1, 0, 29, 40, 48, 56, 56, 12, 13,
+  56, 0, 0, 29, 28, 42, 16, 56, 0, 19,
+  0, 0, 57, 2, 6, 0, 0, 0, 0, 24,
+  0, 0, 0, 16, 1, 14, 21, 10, 0, 5,
+  37, 5, 41, 38, 0, 11, 0, 24, 0, 42,
+  0, 0, 0, 0, 0, 0, 70, 24, 23, 0,
+  0, 0, 11, 21, 44, 0, 8, 0, 0, 12,
+  70, 39, 7, 8, 19, 29, 0, 28, 16, 3,
+  38, 30, 0, 36, 4, 7, 0, 4, 60, 56,
+  0, 0, 5, 0, 33, 0, 12, 9, 35, 35,
+  0, 12, 2, 0, 10, 0, 0, 0, 0, 0,
+  6, 0, 111, 0, 30, 0, 9, 0, 0, 40,
+  0, 0, 15, 0, 26, 0, 40, 45, 1, 0,
+  0, 24, 16, 54, 51, 59, 27, 8, 15, 0,
+  0, 41, 35, 63, 9, 78, 0, 0, 8, 0,
+  21, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  0, 0, 0, 0, 38, 0, 0, 5, 22, 8,
+  24, 27, 0, 0, 0, 65, 0, 36, 0, 0,
+  0, 33, 0, 2, 97, 14, 35, 0, 0, 0,
+  20, 36, 43, 5, 0, 0, 0, 9, 52, 53,
+  0, 20, 31, 37, 0, 46, 33, 0, 42, 41,
+  0, 48, 0, 0, 2, 16, 45, 62, 0, 0,
+  12, 0, 34, 0, 0, 17, 24, 34, 0, 27,
+  0, 0, 25, 0, 0, 14, 10, 0, 0, 8,
+  110, 0, 42, 0, 17, 9, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 16, 0, 14, 1, 0, 63, 29, 23, 32,
+  0, 13, 0, 45, 0, 47, 19, 68, 39, 6,
+  67, 0, 0, 42, 12, 16, 57, 47, 121, 62,
+  0, 0, 87, 0, 30, 0, 0, 0, 0, 41,
+  0, 0, 0, 17, 8, 43, 25, 0, 0, 37,
+  11, 79, 44, 41, 28, 6, 2, 20, 0, 16,
+  0, 0, 13, 18, 0, 16, 25, 5, 1, 40,
+  0, 0, 44, 0, 27, 34, 0, 0, 27, 0,
+  77, 0, 17, 14, 0, 0, 18, 24, 76, 0,
+  60, 4, 0, 4, 30, 0, 46, 0, 60, 49,
+  0, 0, 9, 0, 57, 0, 0, 18, 38, 31,
+  23, 17, 38, 0, 21, 0, 27, 0, 7, 10,
+  58, 0, 64, 0, 40, 0, 0, 0, 0, 26,
+  0, 7, 2, 0, 63, 38, 23, 37, 2, 6,
+  0, 40, 0, 45, 6, 67, 46, 14, 38, 0,
+  0, 48, 16, 24, 55, 58, 112, 45, 0, 0,
+  68, 0, 26, 0, 0, 0, 0, 44, 0, 0,
+  0, 2, 1, 25, 39, 0, 0, 36, 14, 72,
+  25, 35, 35, 0, 0, 49, 0, 21, 0, 0,
+  16, 34, 0, 26, 35, 0, 2, 44, 0, 0,
+  64, 0, 29, 35, 0, 1, 39, 0, 66, 5,
+  11, 30, 0, 6, 14, 27, 89, 0, 74, 5,
+  0, 3, 35, 0, 49, 0, 45, 48, 0, 0,
+  10, 0, 56, 0, 0, 23, 42, 24, 30, 23,
+  39, 0, 31, 0, 11, 0, 7, 13, 40, 0,
+  62, 0, 52, 0, 0, 2, 0, 45, 0, 0,
+  0, 0, 62, 43, 22, 57, 2, 15, 0, 41,
+  7, 47, 6, 61, 60, 24, 15, 0, 0, 43,
+  26, 39, 53, 69, 110, 31, 0, 0, 54, 0,
+  28, 0, 0, 0, 0, 53, 0, 0, 0, 0,
+  3, 7, 35, 0, 0, 41, 15, 67, 26, 42,
+  26, 0, 0, 57, 0, 32, 0, 0, 14, 45,
+  0, 35, 43, 0, 0, 32, 0, 1, 56, 0,
+  32, 31, 0, 8, 48, 0, 66, 25, 6, 25,
+  12, 12, 17, 31, 106, 0, 60, 5, 0, 7,
+  27, 0, 51, 1, 26, 50, 0, 0, 24, 0,
+  67, 0, 2, 18, 45, 33, 35, 9, 30, 0,
+  39, 0, 0, 6, 16, 9, 41, 0, 67, 0,
+  44, 0, 11, 14, 0, 22, 0, 0, 8, 0,
+  32, 0, 33, 28, 0, 1, 0, 29, 40, 48,
+  56, 56, 12, 13, 56, 0, 0, 29, 28, 42,
+  16, 56, 0, 19, 0, 0, 57, 2, 6, 0,
+  0, 0, 0, 24, 0, 0, 0, 16, 1, 14,
+  21, 10, 0, 5, 37, 5, 41, 38, 0, 11,
+  0, 24, 0, 42, 0, 0, 0, 0, 0, 0,
+  70, 24, 23, 0, 0, 0, 11, 21, 44, 0,
+  8, 0, 0, 12, 70, 39, 7, 8, 19, 29,
+  0, 28, 16, 3, 38, 30, 0, 36, 4, 7,
+  0, 4, 60, 56, 0, 0, 5, 0, 33, 0,
+  12, 9, 35, 35, 0, 12, 2, 0, 10, 0,
+  0, 0, 0, 0, 6, 0, 111, 0, 30, 0,
+  9, 0, 0, 40, 0, 0, 15, 0, 26, 0,
+  40, 45, 1, 0, 0, 24, 16, 54, 51, 59,
+  27, 8, 15, 0, 0, 41, 35, 63, 9, 78,
+  0, 0, 8, 0, 21, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 0, 0, 0, 0, 38, 0,
+  0, 5, 22, 8, 24, 27, 0, 0, 0, 65,
+  0, 36, 0, 0, 0, 33, 0, 2, 97, 14,
+  35, 0, 0, 0, 20, 36, 43, 5, 0, 0,
+  0, 9, 52, 53, 0, 20, 31, 37, 0, 46,
+  33, 0, 42, 41, 0, 48, 0, 0, 2, 16,
+  45, 62, 0, 0, 12, 0, 34, 0, 0, 17,
+  24, 34, 0, 27, 0, 0, 25, 0, 0, 14,
+  10, 0, 0, 8, 110, 0, 42, 0, 17, 9,
+  0, 44, 12, 0, 11, 0, 23, 0, 54, 79,
+  0, 0, 0, 0, 3, 53, 49, 60, 36, 23,
+  0, 0, 0, 42, 29, 49, 27, 93, 0, 0,
+  15, 0, 15, 0, 0, 0, 0, 32, 0, 20,
+  0, 0, 0, 0, 0, 7, 42, 0, 0, 5,
+  12, 12, 37, 19, 0, 0, 0, 60, 0, 25,
+  1, 12, 0, 29, 0, 0, 86, 0, 36, 9,
+  0, 0, 13, 38, 43, 13, 0, 16, 0, 0,
+  60, 35, 0, 10, 27, 23, 0, 45, 43, 0,
+  17, 49, 0, 42, 0, 0, 4, 7, 24, 57,
+  0, 0, 23, 0, 36, 0, 0, 1, 19, 59,
+  0, 22, 0, 0, 36, 0, 0, 24, 28, 0,
+  1, 18, 93, 0, 22, 0, 42, 20, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 26, 0, 7, 2, 0, 63, 38,
+  23, 37, 2, 6, 0, 40, 0, 45, 6, 67,
+  46, 14, 38, 0, 0, 48, 16, 24, 55, 58,
+  112, 45, 0, 0, 68, 0, 26, 0, 0, 0,
+  0, 44, 0, 0, 0, 2, 1, 25, 39, 0,
+  0, 36, 14, 72, 25, 35, 35, 0, 0, 49,
+  0, 21, 0, 0, 16, 34, 0, 26, 35, 0,
+  2, 44, 0, 0, 64, 0, 29, 35, 0, 1,
+  39, 0, 66, 5, 11, 30, 0, 6, 14, 27,
+  89, 0, 74, 5, 0, 3, 35, 0, 49, 0,
+  45, 48, 0, 0, 10, 0, 56, 0, 0, 23,
+  42, 24, 30, 23, 39, 0, 31, 0, 11, 0,
+  7, 13, 40, 0, 62, 0, 52, 0, 0, 2,
+  0, 45, 0, 0, 0, 0, 62, 43, 22, 57,
+  2, 15, 0, 41, 7, 47, 6, 61, 60, 24,
+  15, 0, 0, 43, 26, 39, 53, 69, 110, 31,
+  0, 0, 54, 0, 28, 0, 0, 0, 0, 53,
+  0, 0, 0, 0, 3, 7, 35, 0, 0, 41,
+  15, 67, 26, 42, 26, 0, 0, 57, 0, 32,
+  0, 0, 14, 45, 0, 35, 43, 0, 0, 32,
+  0, 1, 56, 0, 32, 31, 0, 8, 48, 0,
+  66, 25, 6, 25, 12, 12, 17, 31, 106, 0,
+  60, 5, 0, 7, 27, 0, 51, 1, 26, 50,
+  0, 0, 24, 0, 67, 0, 2, 18, 45, 33,
+  35, 9, 30, 0, 39, 0, 0, 6, 16, 9,
+  41, 0, 67, 0, 44, 0, 11, 14, 0, 50,
+  11, 0, 0, 0, 74, 36, 26, 54, 0, 25,
+  0, 0, 19, 41, 32, 80, 62, 25, 0, 0,
+  0, 42, 46, 46, 53, 65, 120, 31, 0, 0,
+  44, 0, 29, 0, 0, 0, 0, 45, 0, 0,
+  34, 0, 9, 14, 37, 0, 0, 29, 26, 40,
+  42, 29, 11, 0, 0, 42, 0, 48, 0, 0,
+  13, 56, 0, 27, 47, 0, 0, 21, 0, 6,
+  37, 0, 32, 21, 1, 6, 34, 0, 57, 25,
+  7, 31, 24, 9, 22, 28, 77, 0, 42, 0,
+  0, 21, 17, 0, 36, 22, 1, 31, 0, 0,
+  35, 0, 70, 0, 6, 12, 44, 44, 51, 12,
+  23, 0, 31, 0, 0, 14, 39, 0, 40, 13,
+  69, 0, 18, 0, 49, 15, 0, 40, 0, 0,
+  15, 0, 26, 0, 40, 45, 1, 0, 0, 24,
+  16, 54, 51, 59, 27, 8, 15, 0, 0, 41,
+  35, 63, 9, 78, 0, 0, 8, 0, 21, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+  0, 0, 38, 0, 0, 5, 22, 8, 24, 27,
+  0, 0, 0, 65, 0, 36, 0, 0, 0, 33,
+  0, 2, 97, 14, 35, 0, 0, 0, 20, 36,
+  43, 5, 0, 0, 0, 9, 52, 53, 0, 20,
+  31, 37, 0, 46, 33, 0, 42, 41, 0, 48,
+  0, 0, 2, 16, 45, 62, 0, 0, 12, 0,
+  34, 0, 0, 17, 24, 34, 0, 27, 0, 0,
+  25, 0, 0, 14, 10, 0, 0, 8, 110, 0,
+  42, 0, 17, 9, 0, 44, 12, 0, 11, 0,
+  23, 0, 54, 79, 0, 0, 0, 0, 3, 53,
+  49, 60, 36, 23, 0, 0, 0, 42, 29, 49,
+  27, 93, 0, 0, 15, 0, 15, 0, 0, 0,
+  0, 32, 0, 20, 0, 0, 0, 0, 0, 7,
+  42, 0, 0, 5, 12, 12, 37, 19, 0, 0,
+  0, 60, 0, 25, 1, 12, 0, 29, 0, 0,
+  86, 0, 36, 9, 0, 0, 13, 38, 43, 13,
+  0, 16, 0, 0, 60, 35, 0, 10, 27, 23,
+  0, 45, 43, 0, 17, 49, 0, 42, 0, 0,
+  4, 7, 24, 57, 0, 0, 23, 0, 36, 0,
+  0, 1, 19, 59, 0, 22, 0, 0, 36, 0,
+  0, 24, 28, 0, 1, 18, 93, 0, 22, 0,
+  42, 20, 0, 38, 33, 0, 0, 0, 27, 0,
+  63, 89, 0, 12, 0, 0, 14, 41, 49, 72,
+  30, 11, 0, 0, 0, 57, 37, 23, 43, 98,
+  0, 0, 23, 0, 9, 0, 0, 0, 0, 70,
+  0, 0, 14, 15, 16, 0, 0, 17, 24, 0,
+  0, 0, 12, 0, 48, 0, 0, 0, 0, 33,
+  0, 3, 10, 18, 0, 50, 0, 0, 81, 0,
+  15, 42, 0, 0, 7, 44, 23, 12, 4, 28,
+  0, 0, 63, 33, 2, 27, 31, 25, 2, 25,
+  25, 0, 0, 46, 0, 33, 0, 0, 0, 14,
+  0, 51, 3, 0, 8, 0, 41, 0, 0, 18,
+  2, 64, 10, 19, 0, 0, 55, 0, 0, 23,
+  45, 0, 7, 3, 63, 0, 0, 0, 78, 18,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 45, 0, 0, 0, 0,
+  62, 43, 22, 57, 2, 15, 0, 41, 7, 47,
+  6, 61, 60, 24, 15, 0, 0, 43, 26, 39,
+  53, 69, 110, 31, 0, 0, 54, 0, 28, 0,
+  0, 0, 0, 53, 0, 0, 0, 0, 3, 7,
+  35, 0, 0, 41, 15, 67, 26, 42, 26, 0,
+  0, 57, 0, 32, 0, 0, 14, 45, 0, 35,
+  43, 0, 0, 32, 0, 1, 56, 0, 32, 31,
+  0, 8, 48, 0, 66, 25, 6, 25, 12, 12,
+  17, 31, 106, 0, 60, 5, 0, 7, 27, 0,
+  51, 1, 26, 50, 0, 0, 24, 0, 67, 0,
+  2, 18, 45, 33, 35, 9, 30, 0, 39, 0,
+  0, 6, 16, 9, 41, 0, 67, 0, 44, 0,
+  11, 14, 0, 50, 11, 0, 0, 0, 74, 36,
+  26, 54, 0, 25, 0, 0, 19, 41, 32, 80,
+  62, 25, 0, 0, 0, 42, 46, 46, 53, 65,
+  120, 31, 0, 0, 44, 0, 29, 0, 0, 0,
+  0, 45, 0, 0, 34, 0, 9, 14, 37, 0,
+  0, 29, 26, 40, 42, 29, 11, 0, 0, 42,
+  0, 48, 0, 0, 13, 56, 0, 27, 47, 0,
+  0, 21, 0, 6, 37, 0, 32, 21, 1, 6,
+  34, 0, 57, 25, 7, 31, 24, 9, 22, 28,
+  77, 0, 42, 0, 0, 21, 17, 0, 36, 22,
+  1, 31, 0, 0, 35, 0, 70, 0, 6, 12,
+  44, 44, 51, 12, 23, 0, 31, 0, 0, 14,
+  39, 0, 40, 13, 69, 0, 18, 0, 49, 15,
+  0, 53, 6, 0, 0, 0, 108, 18, 35, 62,
+  0, 10, 0, 0, 14, 70, 19, 66, 42, 16,
+  0, 0, 0, 59, 58, 43, 47, 64, 123, 32,
+  0, 0, 54, 0, 29, 0, 0, 0, 9, 45,
+  0, 0, 26, 16, 0, 23, 56, 0, 0, 30,
+  14, 43, 57, 13, 7, 3, 3, 60, 0, 52,
+  0, 9, 11, 62, 0, 31, 41, 10, 20, 3,
+  0, 13, 31, 0, 45, 36, 0, 0, 32, 0,
+  56, 38, 10, 21, 24, 0, 26, 22, 84, 1,
+  35, 0, 0, 34, 0, 0, 6, 15, 19, 40,
+  0, 0, 26, 0, 74, 0, 0, 29, 37, 36,
+  50, 12, 2, 0, 29, 0, 0, 35, 51, 0,
+  32, 0, 64, 0, 33, 0, 43, 1, 0, 44,
+  12, 0, 11, 0, 23, 0, 54, 79, 0, 0,
+  0, 0, 3, 53, 49, 60, 36, 23, 0, 0,
+  0, 42, 29, 49, 27, 93, 0, 0, 15, 0,
+  15, 0, 0, 0, 0, 32, 0, 20, 0, 0,
+  0, 0, 0, 7, 42, 0, 0, 5, 12, 12,
+  37, 19, 0, 0, 0, 60, 0, 25, 1, 12,
+  0, 29, 0, 0, 86, 0, 36, 9, 0, 0,
+  13, 38, 43, 13, 0, 16, 0, 0, 60, 35,
+  0, 10, 27, 23, 0, 45, 43, 0, 17, 49,
+  0, 42, 0, 0, 4, 7, 24, 57, 0, 0,
+  23, 0, 36, 0, 0, 1, 19, 59, 0, 22,
+  0, 0, 36, 0, 0, 24, 28, 0, 1, 18,
+  93, 0, 22, 0, 42, 20, 0, 38, 33, 0,
+  0, 0, 27, 0, 63, 89, 0, 12, 0, 0,
+  14, 41, 49, 72, 30, 11, 0, 0, 0, 57,
+  37, 23, 43, 98, 0, 0, 23, 0, 9, 0,
+  0, 0, 0, 70, 0, 0, 14, 15, 16, 0,
+  0, 17, 24, 0, 0, 0, 12, 0, 48, 0,
+  0, 0, 0, 33, 0, 3, 10, 18, 0, 50,
+  0, 0, 81, 0, 15, 42, 0, 0, 7, 44,
+  23, 12, 4, 28, 0, 0, 63, 33, 2, 27,
+  31, 25, 2, 25, 25, 0, 0, 46, 0, 33,
+  0, 0, 0, 14, 0, 51, 3, 0, 8, 0,
+  41, 0, 0, 18, 2, 64, 10, 19, 0, 0,
+  55, 0, 0, 23, 45, 0, 7, 3, 63, 0,
+  0, 0, 78, 18, 0, 39, 39, 0, 0, 0,
+  25, 0, 78, 78, 0, 0, 0, 3, 0, 17,
+  3, 41, 11, 0, 0, 0, 16, 61, 36, 0,
+  50, 80, 0, 0, 9, 0, 0, 0, 0, 0,
+  16, 73, 0, 0, 40, 8, 4, 0, 0, 14,
+  31, 0, 0, 0, 18, 0, 26, 0, 2, 0,
+  24, 52, 0, 0, 0, 48, 0, 57, 2, 2,
+  88, 0, 14, 69, 0, 0, 2, 41, 6, 46,
+  1, 15, 0, 0, 48, 46, 0, 40, 32, 26,
+  15, 28, 27, 0, 0, 65, 0, 8, 0, 0,
+  0, 0, 0, 52, 25, 0, 0, 0, 32, 0,
+  0, 39, 0, 43, 11, 0, 0, 0, 70, 0,
+  0, 25, 54, 0, 0, 0, 11, 0, 0, 0,
+  64, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 50, 11, 0,
+  0, 0, 74, 36, 26, 54, 0, 25, 0, 0,
+  19, 41, 32, 80, 62, 25, 0, 0, 0, 42,
+  46, 46, 53, 65, 120, 31, 0, 0, 44, 0,
+  29, 0, 0, 0, 0, 45, 0, 0, 34, 0,
+  9, 14, 37, 0, 0, 29, 26, 40, 42, 29,
+  11, 0, 0, 42, 0, 48, 0, 0, 13, 56,
+  0, 27, 47, 0, 0, 21, 0, 6, 37, 0,
+  32, 21, 1, 6, 34, 0, 57, 25, 7, 31,
+  24, 9, 22, 28, 77, 0, 42, 0, 0, 21,
+  17, 0, 36, 22, 1, 31, 0, 0, 35, 0,
+  70, 0, 6, 12, 44, 44, 51, 12, 23, 0,
+  31, 0, 0, 14, 39, 0, 40, 13, 69, 0,
+  18, 0, 49, 15, 0, 53, 6, 0, 0, 0,
+  108, 18, 35, 62, 0, 10, 0, 0, 14, 70,
+  19, 66, 42, 16, 0, 0, 0, 59, 58, 43,
+  47, 64, 123, 32, 0, 0, 54, 0, 29, 0,
+  0, 0, 9, 45, 0, 0, 26, 16, 0, 23,
+  56, 0, 0, 30, 14, 43, 57, 13, 7, 3,
+  3, 60, 0, 52, 0, 9, 11, 62, 0, 31,
+  41, 10, 20, 3, 0, 13, 31, 0, 45, 36,
+  0, 0, 32, 0, 56, 38, 10, 21, 24, 0,
+  26, 22, 84, 1, 35, 0, 0, 34, 0, 0,
+  6, 15, 19, 40, 0, 0, 26, 0, 74, 0,
+  0, 29, 37, 36, 50, 12, 2, 0, 29, 0,
+  0, 35, 51, 0, 32, 0, 64, 0, 33, 0,
+  43, 1, 0, 47, 0, 0, 0, 0, 99, 35,
+  39, 50, 0, 17, 0, 0, 7, 70, 34, 67,
+  46, 6, 16, 0, 0, 47, 51, 51, 43, 68,
+  129, 40, 9, 0, 53, 0, 19, 0, 0, 3,
+  0, 46, 0, 0, 4, 18, 0, 21, 43, 0,
+  0, 29, 3, 44, 51, 16, 0, 0, 8, 61,
+  0, 57, 0, 8, 10, 70, 0, 30, 41, 15,
+  26, 0, 0, 5, 28, 0, 43, 38, 0, 0,
+  35, 0, 53, 27, 7, 21, 30, 0, 31, 28,
+  62, 0, 36, 0, 0, 42, 1, 0, 11, 10,
+  39, 35, 0, 0, 24, 0, 67, 0, 0, 27,
+  42, 50, 46, 18, 14, 0, 25, 0, 0, 33,
+  56, 0, 33, 24, 74, 0, 21, 0, 46, 9,
+  0, 38, 33, 0, 0, 0, 27, 0, 63, 89,
+  0, 12, 0, 0, 14, 41, 49, 72, 30, 11,
+  0, 0, 0, 57, 37, 23, 43, 98, 0, 0,
+  23, 0, 9, 0, 0, 0, 0, 70, 0, 0,
+  14, 15, 16, 0, 0, 17, 24, 0, 0, 0,
+  12, 0, 48, 0, 0, 0, 0, 33, 0, 3,
+  10, 18, 0, 50, 0, 0, 81, 0, 15, 42,
+  0, 0, 7, 44, 23, 12, 4, 28, 0, 0,
+  63, 33, 2, 27, 31, 25, 2, 25, 25, 0,
+  0, 46, 0, 33, 0, 0, 0, 14, 0, 51,
+  3, 0, 8, 0, 41, 0, 0, 18, 2, 64,
+  10, 19, 0, 0, 55, 0, 0, 23, 45, 0,
+  7, 3, 63, 0, 0, 0, 78, 18, 0, 39,
+  39, 0, 0, 0, 25, 0, 78, 78, 0, 0,
+  0, 3, 0, 17, 3, 41, 11, 0, 0, 0,
+  16, 61, 36, 0, 50, 80, 0, 0, 9, 0,
+  0, 0, 0, 0, 16, 73, 0, 0, 40, 8,
+  4, 0, 0, 14, 31, 0, 0, 0, 18, 0,
+  26, 0, 2, 0, 24, 52, 0, 0, 0, 48,
+  0, 57, 2, 2, 88, 0, 14, 69, 0, 0,
+  2, 41, 6, 46, 1, 15, 0, 0, 48, 46,
+  0, 40, 32, 26, 15, 28, 27, 0, 0, 65,
+  0, 8, 0, 0, 0, 0, 0, 52, 25, 0,
+  0, 0, 32, 0, 0, 39, 0, 43, 11, 0,
+  0, 0, 70, 0, 0, 25, 54, 0, 0, 0,
+  11, 0, 0, 0, 64, 2, 0, 29, 0, 0,
+  0, 0, 15, 0, 80, 38, 0, 0, 0, 0,
+  0, 0, 0, 35, 26, 0, 14, 0, 0, 45,
+  31, 0, 42, 64, 0, 0, 16, 0, 0, 5,
+  0, 0, 32, 60, 1, 0, 52, 0, 0, 0,
+  0, 15, 40, 0, 0, 0, 0, 2, 11, 0,
+  19, 50, 26, 49, 0, 0, 6, 43, 3, 66,
+  19, 0, 76, 0, 18, 84, 0, 0, 2, 19,
+  0, 39, 0, 5, 14, 0, 39, 27, 3, 12,
+  27, 17, 21, 31, 23, 0, 0, 98, 2, 0,
+  0, 0, 0, 0, 39, 39, 30, 37, 0, 0,
+  15, 0, 0, 33, 0, 44, 1, 9, 0, 0,
+  55, 0, 0, 24, 71, 0, 0, 0, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 53,
+  6, 0, 0, 0, 108, 18, 35, 62, 0, 10,
+  0, 0, 14, 70, 19, 66, 42, 16, 0, 0,
+  0, 59, 58, 43, 47, 64, 123, 32, 0, 0,
+  54, 0, 29, 0, 0, 0, 9, 45, 0, 0,
+  26, 16, 0, 23, 56, 0, 0, 30, 14, 43,
+  57, 13, 7, 3, 3, 60, 0, 52, 0, 9,
+  11, 62, 0, 31, 41, 10, 20, 3, 0, 13,
+  31, 0, 45, 36, 0, 0, 32, 0, 56, 38,
+  10, 21, 24, 0, 26, 22, 84, 1, 35, 0,
+  0, 34, 0, 0, 6, 15, 19, 40, 0, 0,
+  26, 0, 74, 0, 0, 29, 37, 36, 50, 12,
+  2, 0, 29, 0, 0, 35, 51, 0, 32, 0,
+  64, 0, 33, 0, 43, 1, 0, 47, 0, 0,
+  0, 0, 99, 35, 39, 50, 0, 17, 0, 0,
+  7, 70, 34, 67, 46, 6, 16, 0, 0, 47,
+  51, 51, 43, 68, 129, 40, 9, 0, 53, 0,
+  19, 0, 0, 3, 0, 46, 0, 0, 4, 18,
+  0, 21, 43, 0, 0, 29, 3, 44, 51, 16,
+  0, 0, 8, 61, 0, 57, 0, 8, 10, 70,
+  0, 30, 41, 15, 26, 0, 0, 5, 28, 0,
+  43, 38, 0, 0, 35, 0, 53, 27, 7, 21,
+  30, 0, 31, 28, 62, 0, 36, 0, 0, 42,
+  1, 0, 11, 10, 39, 35, 0, 0, 24, 0,
+  67, 0, 0, 27, 42, 50, 46, 18, 14, 0,
+  25, 0, 0, 33, 56, 0, 33, 24, 74, 0,
+  21, 0, 46, 9, 0, 40, 0, 0, 5, 0,
+  79, 51, 29, 30, 0, 28, 9, 0, 6, 57,
+  44, 75, 60, 18, 9, 0, 0, 32, 53, 70,
+  33, 61, 135, 47, 36, 0, 45, 8, 29, 0,
+  0, 4, 0, 55, 0, 0, 25, 9, 0, 4,
+  34, 0, 0, 18, 21, 51, 44, 48, 0, 10,
+  3, 61, 0, 58, 0, 0, 12, 61, 0, 22,
+  46, 13, 15, 0, 0, 2, 14, 0, 34, 33,
+  0, 3, 31, 0, 57, 9, 0, 22, 46, 0,
+  23, 34, 53, 5, 53, 2, 0, 39, 29, 0,
+  36, 10, 25, 36, 0, 0, 19, 0, 58, 0,
+  0, 20, 53, 51, 44, 24, 38, 2, 31, 0,
+  0, 13, 50, 0, 40, 53, 98, 0, 37, 0,
+  54, 1, 0, 39, 39, 0, 0, 0, 25, 0,
+  78, 78, 0, 0, 0, 3, 0, 17, 3, 41,
+  11, 0, 0, 0, 16, 61, 36, 0, 50, 80,
+  0, 0, 9, 0, 0, 0, 0, 0, 16, 73,
+  0, 0, 40, 8, 4, 0, 0, 14, 31, 0,
+  0, 0, 18, 0, 26, 0, 2, 0, 24, 52,
+  0, 0, 0, 48, 0, 57, 2, 2, 88, 0,
+  14, 69, 0, 0, 2, 41, 6, 46, 1, 15,
+  0, 0, 48, 46, 0, 40, 32, 26, 15, 28,
+  27, 0, 0, 65, 0, 8, 0, 0, 0, 0,
+  0, 52, 25, 0, 0, 0, 32, 0, 0, 39,
+  0, 43, 11, 0, 0, 0, 70, 0, 0, 25,
+  54, 0, 0, 0, 11, 0, 0, 0, 64, 2,
+  0, 29, 0, 0, 0, 0, 15, 0, 80, 38,
+  0, 0, 0, 0, 0, 0, 0, 35, 26, 0,
+  14, 0, 0, 45, 31, 0, 42, 64, 0, 0,
+  16, 0, 0, 5, 0, 0, 32, 60, 1, 0,
+  52, 0, 0, 0, 0, 15, 40, 0, 0, 0,
+  0, 2, 11, 0, 19, 50, 26, 49, 0, 0,
+  6, 43, 3, 66, 19, 0, 76, 0, 18, 84,
+  0, 0, 2, 19, 0, 39, 0, 5, 14, 0,
+  39, 27, 3, 12, 27, 17, 21, 31, 23, 0,
+  0, 98, 2, 0, 0, 0, 0, 0, 39, 39,
+  30, 37, 0, 0, 15, 0, 0, 33, 0, 44,
+  1, 9, 0, 0, 55, 0, 0, 24, 71, 0,
+  0, 0, 0, 0, 0, 0, 42, 0, 0, 21,
+  0, 0, 2, 0, 15, 0, 74, 29, 0, 18,
+  0, 12, 0, 34, 16, 63, 31, 0, 0, 0,
+  0, 43, 15, 0, 18, 55, 0, 0, 44, 0,
+  0, 15, 0, 0, 19, 53, 0, 0, 37, 0,
+  0, 0, 0, 6, 28, 0, 0, 0, 0, 19,
+  26, 0, 3, 71, 33, 50, 0, 0, 10, 18,
+  0, 54, 2, 0, 62, 0, 20, 53, 0, 0,
+  0, 10, 0, 34, 0, 0, 19, 0, 50, 13,
+  6, 0, 30, 11, 7, 22, 34, 0, 0, 109,
+  0, 6, 0, 0, 0, 0, 36, 46, 17, 32,
+  7, 0, 17, 0, 0, 18, 0, 40, 0, 25,
+  0, 9, 51, 0, 0, 9, 68, 0, 0, 9,
+  34, 0, 14, 0, 50, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 47, 0, 0, 0, 0, 99, 35, 39, 50,
+  0, 17, 0, 0, 7, 70, 34, 67, 46, 6,
+  16, 0, 0, 47, 51, 51, 43, 68, 129, 40,
+  9, 0, 53, 0, 19, 0, 0, 3, 0, 46,
+  0, 0, 4, 18, 0, 21, 43, 0, 0, 29,
+  3, 44, 51, 16, 0, 0, 8, 61, 0, 57,
+  0, 8, 10, 70, 0, 30, 41, 15, 26, 0,
+  0, 5, 28, 0, 43, 38, 0, 0, 35, 0,
+  53, 27, 7, 21, 30, 0, 31, 28, 62, 0,
+  36, 0, 0, 42, 1, 0, 11, 10, 39, 35,
+  0, 0, 24, 0, 67, 0, 0, 27, 42, 50,
+  46, 18, 14, 0, 25, 0, 0, 33, 56, 0,
+  33, 24, 74, 0, 21, 0, 46, 9, 0, 40,
+  0, 0, 5, 0, 79, 51, 29, 30, 0, 28,
+  9, 0, 6, 57, 44, 75, 60, 18, 9, 0,
+  0, 32, 53, 70, 33, 61, 135, 47, 36, 0,
+  45, 8, 29, 0, 0, 4, 0, 55, 0, 0,
+  25, 9, 0, 4, 34, 0, 0, 18, 21, 51,
+  44, 48, 0, 10, 3, 61, 0, 58, 0, 0,
+  12, 61, 0, 22, 46, 13, 15, 0, 0, 2,
+  14, 0, 34, 33, 0, 3, 31, 0, 57, 9,
+  0, 22, 46, 0, 23, 34, 53, 5, 53, 2,
+  0, 39, 29, 0, 36, 10, 25, 36, 0, 0,
+  19, 0, 58, 0, 0, 20, 53, 51, 44, 24,
+  38, 2, 31, 0, 0, 13, 50, 0, 40, 53,
+  98, 0, 37, 0, 54, 1, 0, 57, 0, 0,
+  7, 0, 75, 49, 21, 35, 0, 26, 12, 9,
+  20, 56, 23, 65, 41, 43, 0, 0, 0, 51,
+  49, 70, 25, 60, 128, 38, 16, 1, 47, 0,
+  34, 0, 0, 0, 0, 68, 0, 0, 51, 15,
+  10, 0, 33, 0, 0, 22, 41, 66, 39, 66,
+  0, 5, 0, 59, 0, 43, 0, 0, 13, 40,
+  0, 20, 49, 2, 9, 0, 0, 5, 40, 0,
+  43, 31, 0, 19, 43, 2, 80, 35, 0, 14,
+  27, 0, 17, 32, 100, 3, 76, 2, 0, 16,
+  24, 9, 46, 5, 10, 44, 0, 0, 7, 0,
+  65, 0, 4, 31, 54, 32, 37, 0, 31, 0,
+  29, 0, 0, 0, 10, 17, 45, 22, 97, 0,
+  76, 0, 23, 0, 0, 29, 0, 0, 0, 0,
+  15, 0, 80, 38, 0, 0, 0, 0, 0, 0,
+  0, 35, 26, 0, 14, 0, 0, 45, 31, 0,
+  42, 64, 0, 0, 16, 0, 0, 5, 0, 0,
+  32, 60, 1, 0, 52, 0, 0, 0, 0, 15,
+  40, 0, 0, 0, 0, 2, 11, 0, 19, 50,
+  26, 49, 0, 0, 6, 43, 3, 66, 19, 0,
+  76, 0, 18, 84, 0, 0, 2, 19, 0, 39,
+  0, 5, 14, 0, 39, 27, 3, 12, 27, 17,
+  21, 31, 23, 0, 0, 98, 2, 0, 0, 0,
+  0, 0, 39, 39, 30, 37, 0, 0, 15, 0,
+  0, 33, 0, 44, 1, 9, 0, 0, 55, 0,
+  0, 24, 71, 0, 0, 0, 0, 0, 0, 0,
+  42, 0, 0, 21, 0, 0, 2, 0, 15, 0,
+  74, 29, 0, 18, 0, 12, 0, 34, 16, 63,
+  31, 0, 0, 0, 0, 43, 15, 0, 18, 55,
+  0, 0, 44, 0, 0, 15, 0, 0, 19, 53,
+  0, 0, 37, 0, 0, 0, 0, 6, 28, 0,
+  0, 0, 0, 19, 26, 0, 3, 71, 33, 50,
+  0, 0, 10, 18, 0, 54, 2, 0, 62, 0,
+  20, 53, 0, 0, 0, 10, 0, 34, 0, 0,
+  19, 0, 50, 13, 6, 0, 30, 11, 7, 22,
+  34, 0, 0, 109, 0, 6, 0, 0, 0, 0,
+  36, 46, 17, 32, 7, 0, 17, 0, 0, 18,
+  0, 40, 0, 25, 0, 9, 51, 0, 0, 9,
+  68, 0, 0, 9, 34, 0, 14, 0, 50, 0,
+  0, 44, 0, 0, 11, 0, 30, 0, 44, 53,
+  0, 11, 18, 12, 0, 82, 51, 71, 16, 19,
+  0, 0, 0, 63, 28, 37, 0, 67, 2, 0,
+  45, 0, 33, 25, 0, 0, 0, 52, 0, 0,
+  18, 0, 13, 17, 0, 3, 20, 20, 0, 7,
+  2, 12, 49, 14, 0, 32, 19, 44, 0, 21,
+  12, 0, 0, 24, 0, 0, 80, 1, 40, 3,
+  0, 0, 8, 26, 18, 45, 0, 0, 0, 0,
+  87, 25, 0, 0, 27, 11, 0, 26, 28, 6,
+  18, 90, 0, 29, 0, 0, 0, 0, 0, 71,
+  9, 2, 14, 0, 37, 0, 0, 24, 1, 42,
+  0, 27, 0, 6, 32, 0, 0, 6, 43, 0,
+  9, 0, 103, 0, 43, 0, 51, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 40, 0, 0, 5, 0, 79, 51,
+  29, 30, 0, 28, 9, 0, 6, 57, 44, 75,
+  60, 18, 9, 0, 0, 32, 53, 70, 33, 61,
+  135, 47, 36, 0, 45, 8, 29, 0, 0, 4,
+  0, 55, 0, 0, 25, 9, 0, 4, 34, 0,
+  0, 18, 21, 51, 44, 48, 0, 10, 3, 61,
+  0, 58, 0, 0, 12, 61, 0, 22, 46, 13,
+  15, 0, 0, 2, 14, 0, 34, 33, 0, 3,
+  31, 0, 57, 9, 0, 22, 46, 0, 23, 34,
+  53, 5, 53, 2, 0, 39, 29, 0, 36, 10,
+  25, 36, 0, 0, 19, 0, 58, 0, 0, 20,
+  53, 51, 44, 24, 38, 2, 31, 0, 0, 13,
+  50, 0, 40, 53, 98, 0, 37, 0, 54, 1,
+  0, 57, 0, 0, 7, 0, 75, 49, 21, 35,
+  0, 26, 12, 9, 20, 56, 23, 65, 41, 43,
+  0, 0, 0, 51, 49, 70, 25, 60, 128, 38,
+  16, 1, 47, 0, 34, 0, 0, 0, 0, 68,
+  0, 0, 51, 15, 10, 0, 33, 0, 0, 22,
+  41, 66, 39, 66, 0, 5, 0, 59, 0, 43,
+  0, 0, 13, 40, 0, 20, 49, 2, 9, 0,
+  0, 5, 40, 0, 43, 31, 0, 19, 43, 2,
+  80, 35, 0, 14, 27, 0, 17, 32, 100, 3,
+  76, 2, 0, 16, 24, 9, 46, 5, 10, 44,
+  0, 0, 7, 0, 65, 0, 4, 31, 54, 32,
+  37, 0, 31, 0, 29, 0, 0, 0, 10, 17,
+  45, 22, 97, 0, 76, 0, 23, 0, 0, 100,
+  25, 10, 0, 0, 70, 30, 19, 50, 0, 57,
+  14, 13, 11, 54, 10, 51, 32, 74, 0, 0,
+  0, 42, 41, 47, 55, 47, 140, 28, 0, 6,
+  69, 0, 51, 0, 0, 0, 0, 61, 0, 0,
+  55, 28, 10, 25, 39, 0, 0, 40, 29, 63,
+  62, 56, 3, 0, 0, 4, 0, 42, 0, 0,
+  18, 10, 0, 13, 27, 0, 4, 2, 3, 7,
+  57, 0, 55, 33, 0, 39, 43, 0, 86, 34,
+  0, 21, 5, 0, 34, 32, 104, 0, 59, 5,
+  0, 0, 22, 8, 33, 0, 3, 36, 0, 11,
+  27, 0, 66, 0, 37, 39, 34, 16, 38, 0,
+  27, 2, 5, 0, 0, 0, 0, 19, 44, 4,
+  64, 0, 73, 0, 11, 0, 0, 21, 0, 0,
+  2, 0, 15, 0, 74, 29, 0, 18, 0, 12,
+  0, 34, 16, 63, 31, 0, 0, 0, 0, 43,
+  15, 0, 18, 55, 0, 0, 44, 0, 0, 15,
+  0, 0, 19, 53, 0, 0, 37, 0, 0, 0,
+  0, 6, 28, 0, 0, 0, 0, 19, 26, 0,
+  3, 71, 33, 50, 0, 0, 10, 18, 0, 54,
+  2, 0, 62, 0, 20, 53, 0, 0, 0, 10,
+  0, 34, 0, 0, 19, 0, 50, 13, 6, 0,
+  30, 11, 7, 22, 34, 0, 0, 109, 0, 6,
+  0, 0, 0, 0, 36, 46, 17, 32, 7, 0,
+  17, 0, 0, 18, 0, 40, 0, 25, 0, 9,
+  51, 0, 0, 9, 68, 0, 0, 9, 34, 0,
+  14, 0, 50, 0, 0, 44, 0, 0, 11, 0,
+  30, 0, 44, 53, 0, 11, 18, 12, 0, 82,
+  51, 71, 16, 19, 0, 0, 0, 63, 28, 37,
+  0, 67, 2, 0, 45, 0, 33, 25, 0, 0,
+  0, 52, 0, 0, 18, 0, 13, 17, 0, 3,
+  20, 20, 0, 7, 2, 12, 49, 14, 0, 32,
+  19, 44, 0, 21, 12, 0, 0, 24, 0, 0,
+  80, 1, 40, 3, 0, 0, 8, 26, 18, 45,
+  0, 0, 0, 0, 87, 25, 0, 0, 27, 11,
+  0, 26, 28, 6, 18, 90, 0, 29, 0, 0,
+  0, 0, 0, 71, 9, 2, 14, 0, 37, 0,
+  0, 24, 1, 42, 0, 27, 0, 6, 32, 0,
+  0, 6, 43, 0, 9, 0, 103, 0, 43, 0,
+  51, 0, 0, 102, 14, 0, 4, 0, 39, 0,
+  27, 51, 8, 13, 23, 3, 26, 91, 67, 61,
+  21, 56, 0, 0, 0, 56, 53, 69, 6, 74,
+  0, 0, 14, 0, 81, 1, 0, 0, 0, 25,
+  0, 38, 0, 16, 42, 22, 1, 7, 22, 19,
+  0, 49, 2, 1, 68, 52, 0, 0, 0, 9,
+  0, 50, 0, 0, 0, 0, 0, 0, 91, 11,
+  34, 0, 0, 0, 15, 26, 42, 23, 0, 6,
+  0, 4, 107, 11, 0, 0, 11, 8, 10, 15,
+  30, 12, 42, 45, 0, 41, 0, 10, 0, 0,
+  0, 81, 0, 0, 14, 0, 46, 0, 23, 15,
+  32, 37, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 30, 11, 149, 0, 76, 0, 46, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 57, 0, 0, 7, 0,
+  75, 49, 21, 35, 0, 26, 12, 9, 20, 56,
+  23, 65, 41, 43, 0, 0, 0, 51, 49, 70,
+  25, 60, 128, 38, 16, 1, 47, 0, 34, 0,
+  0, 0, 0, 68, 0, 0, 51, 15, 10, 0,
+  33, 0, 0, 22, 41, 66, 39, 66, 0, 5,
+  0, 59, 0, 43, 0, 0, 13, 40, 0, 20,
+  49, 2, 9, 0, 0, 5, 40, 0, 43, 31,
+  0, 19, 43, 2, 80, 35, 0, 14, 27, 0,
+  17, 32, 100, 3, 76, 2, 0, 16, 24, 9,
+  46, 5, 10, 44, 0, 0, 7, 0, 65, 0,
+  4, 31, 54, 32, 37, 0, 31, 0, 29, 0,
+  0, 0, 10, 17, 45, 22, 97, 0, 76, 0,
+  23, 0, 0, 100, 25, 10, 0, 0, 70, 30,
+  19, 50, 0, 57, 14, 13, 11, 54, 10, 51,
+  32, 74, 0, 0, 0, 42, 41, 47, 55, 47,
+  140, 28, 0, 6, 69, 0, 51, 0, 0, 0,
+  0, 61, 0, 0, 55, 28, 10, 25, 39, 0,
+  0, 40, 29, 63, 62, 56, 3, 0, 0, 4,
+  0, 42, 0, 0, 18, 10, 0, 13, 27, 0,
+  4, 2, 3, 7, 57, 0, 55, 33, 0, 39,
+  43, 0, 86, 34, 0, 21, 5, 0, 34, 32,
+  104, 0, 59, 5, 0, 0, 22, 8, 33, 0,
+  3, 36, 0, 11, 27, 0, 66, 0, 37, 39,
+  34, 16, 38, 0, 27, 2, 5, 0, 0, 0,
+  0, 19, 44, 4, 64, 0, 73, 0, 11, 0,
+  0, 123, 31, 8, 0, 0, 58, 2, 5, 19,
+  0, 61, 49, 0, 0, 22, 6, 34, 22, 59,
+  0, 0, 47, 46, 38, 9, 61, 16, 179, 16,
+  0, 0, 76, 0, 51, 37, 0, 0, 40, 47,
+  0, 0, 71, 33, 17, 78, 26, 17, 0, 47,
+  0, 63, 77, 0, 7, 0, 7, 0, 0, 10,
+  13, 30, 0, 26, 0, 3, 14, 0, 1, 0,
+  72, 10, 34, 0, 44, 21, 8, 54, 16, 0,
+  64, 0, 25, 21, 0, 5, 39, 21, 53, 0,
+  0, 0, 23, 0, 9, 12, 0, 0, 0, 25,
+  0, 51, 27, 5, 41, 0, 55, 0, 0, 34,
+  30, 0, 0, 7, 0, 0, 0, 10, 31, 34,
+  58, 5, 0, 0, 20, 0, 0, 0, 0, 44,
+  0, 0, 11, 0, 30, 0, 44, 53, 0, 11,
+  18, 12, 0, 82, 51, 71, 16, 19, 0, 0,
+  0, 63, 28, 37, 0, 67, 2, 0, 45, 0,
+  33, 25, 0, 0, 0, 52, 0, 0, 18, 0,
+  13, 17, 0, 3, 20, 20, 0, 7, 2, 12,
+  49, 14, 0, 32, 19, 44, 0, 21, 12, 0,
+  0, 24, 0, 0, 80, 1, 40, 3, 0, 0,
+  8, 26, 18, 45, 0, 0, 0, 0, 87, 25,
+  0, 0, 27, 11, 0, 26, 28, 6, 18, 90,
+  0, 29, 0, 0, 0, 0, 0, 71, 9, 2,
+  14, 0, 37, 0, 0, 24, 1, 42, 0, 27,
+  0, 6, 32, 0, 0, 6, 43, 0, 9, 0,
+  103, 0, 43, 0, 51, 0, 0, 102, 14, 0,
+  4, 0, 39, 0, 27, 51, 8, 13, 23, 3,
+  26, 91, 67, 61, 21, 56, 0, 0, 0, 56,
+  53, 69, 6, 74, 0, 0, 14, 0, 81, 1,
+  0, 0, 0, 25, 0, 38, 0, 16, 42, 22,
+  1, 7, 22, 19, 0, 49, 2, 1, 68, 52,
+  0, 0, 0, 9, 0, 50, 0, 0, 0, 0,
+  0, 0, 91, 11, 34, 0, 0, 0, 15, 26,
+  42, 23, 0, 6, 0, 4, 107, 11, 0, 0,
+  11, 8, 10, 15, 30, 12, 42, 45, 0, 41,
+  0, 10, 0, 0, 0, 81, 0, 0, 14, 0,
+  46, 0, 23, 15, 32, 37, 0, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 30, 11, 149, 0,
+  76, 0, 46, 0, 0, 131, 52, 5, 17, 0,
+  45, 0, 11, 44, 5, 23, 60, 0, 17, 55,
+  55, 49, 15, 72, 0, 0, 12, 32, 54, 53,
+  11, 54, 0, 20, 0, 0, 76, 0, 17, 0,
+  0, 0, 0, 41, 0, 25, 68, 41, 28, 22,
+  40, 0, 0, 52, 0, 3, 85, 24, 0, 0,
+  0, 0, 0, 44, 4, 0, 0, 5, 0, 0,
+  29, 13, 13, 0, 0, 0, 8, 16, 74, 5,
+  15, 32, 0, 0, 97, 0, 0, 0, 14, 0,
+  30, 16, 22, 9, 0, 0, 0, 20, 0, 26,
+  0, 0, 0, 38, 5, 16, 9, 0, 39, 0,
+  48, 8, 25, 53, 0, 0, 0, 5, 0, 0,
+  0, 24, 33, 0, 34, 5, 77, 0, 62, 0,
+  29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 100, 25, 10,
+  0, 0, 70, 30, 19, 50, 0, 57, 14, 13,
+  11, 54, 10, 51, 32, 74, 0, 0, 0, 42,
+  41, 47, 55, 47, 140, 28, 0, 6, 69, 0,
+  51, 0, 0, 0, 0, 61, 0, 0, 55, 28,
+  10, 25, 39, 0, 0, 40, 29, 63, 62, 56,
+  3, 0, 0, 4, 0, 42, 0, 0, 18, 10,
+  0, 13, 27, 0, 4, 2, 3, 7, 57, 0,
+  55, 33, 0, 39, 43, 0, 86, 34, 0, 21,
+  5, 0, 34, 32, 104, 0, 59, 5, 0, 0,
+  22, 8, 33, 0, 3, 36, 0, 11, 27, 0,
+  66, 0, 37, 39, 34, 16, 38, 0, 27, 2,
+  5, 0, 0, 0, 0, 19, 44, 4, 64, 0,
+  73, 0, 11, 0, 0, 123, 31, 8, 0, 0,
+  58, 2, 5, 19, 0, 61, 49, 0, 0, 22,
+  6, 34, 22, 59, 0, 0, 47, 46, 38, 9,
+  61, 16, 179, 16, 0, 0, 76, 0, 51, 37,
+  0, 0, 40, 47, 0, 0, 71, 33, 17, 78,
+  26, 17, 0, 47, 0, 63, 77, 0, 7, 0,
+  7, 0, 0, 10, 13, 30, 0, 26, 0, 3,
+  14, 0, 1, 0, 72, 10, 34, 0, 44, 21,
+  8, 54, 16, 0, 64, 0, 25, 21, 0, 5,
+  39, 21, 53, 0, 0, 0, 23, 0, 9, 12,
+  0, 0, 0, 25, 0, 51, 27, 5, 41, 0,
+  55, 0, 0, 34, 30, 0, 0, 7, 0, 0,
+  0, 10, 31, 34, 58, 5, 0, 0, 20, 0,
+  0, 0, 5, 63, 0, 6, 0, 6, 70, 9,
+  0, 0, 0, 80, 68, 0, 0, 0, 4, 24,
+  17, 28, 10, 34, 89, 45, 45, 0, 53, 4,
+  206, 0, 0, 11, 57, 5, 17, 54, 0, 0,
+  60, 39, 0, 0, 1, 61, 12, 128, 21, 26,
+  0, 14, 0, 73, 56, 0, 20, 6, 28, 0,
+  28, 0, 56, 44, 0, 46, 15, 2, 13, 32,
+  46, 0, 134, 11, 24, 0, 54, 0, 56, 54,
+  12, 0, 36, 0, 34, 0, 0, 7, 35, 1,
+  23, 0, 0, 0, 35, 0, 0, 29, 0, 0,
+  59, 43, 6, 53, 7, 33, 53, 18, 22, 0,
+  0, 36, 0, 23, 0, 10, 0, 29, 0, 20,
+  61, 20, 68, 0, 0, 0, 0, 0, 0, 0,
+  0, 102, 14, 0, 4, 0, 39, 0, 27, 51,
+  8, 13, 23, 3, 26, 91, 67, 61, 21, 56,
+  0, 0, 0, 56, 53, 69, 6, 74, 0, 0,
+  14, 0, 81, 1, 0, 0, 0, 25, 0, 38,
+  0, 16, 42, 22, 1, 7, 22, 19, 0, 49,
+  2, 1, 68, 52, 0, 0, 0, 9, 0, 50,
+  0, 0, 0, 0, 0, 0, 91, 11, 34, 0,
+  0, 0, 15, 26, 42, 23, 0, 6, 0, 4,
+  107, 11, 0, 0, 11, 8, 10, 15, 30, 12,
+  42, 45, 0, 41, 0, 10, 0, 0, 0, 81,
+  0, 0, 14, 0, 46, 0, 23, 15, 32, 37,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  30, 11, 149, 0, 76, 0, 46, 0, 0, 131,
+  52, 5, 17, 0, 45, 0, 11, 44, 5, 23,
+  60, 0, 17, 55, 55, 49, 15, 72, 0, 0,
+  12, 32, 54, 53, 11, 54, 0, 20, 0, 0,
+  76, 0, 17, 0, 0, 0, 0, 41, 0, 25,
+  68, 41, 28, 22, 40, 0, 0, 52, 0, 3,
+  85, 24, 0, 0, 0, 0, 0, 44, 4, 0,
+  0, 5, 0, 0, 29, 13, 13, 0, 0, 0,
+  8, 16, 74, 5, 15, 32, 0, 0, 97, 0,
+  0, 0, 14, 0, 30, 16, 22, 9, 0, 0,
+  0, 20, 0, 26, 0, 0, 0, 38, 5, 16,
+  9, 0, 39, 0, 48, 8, 25, 53, 0, 0,
+  0, 5, 0, 0, 0, 24, 33, 0, 34, 5,
+  77, 0, 62, 0, 29, 0, 0, 75, 0, 0,
+  5, 14, 48, 1, 0, 0, 0, 56, 51, 0,
+  0, 4, 32, 10, 13, 41, 0, 10, 71, 13,
+  29, 0, 10, 14, 0, 17, 0, 0, 42, 0,
+  5, 27, 0, 0, 9, 20, 0, 26, 0, 66,
+  11, 74, 35, 26, 0, 2, 0, 16, 68, 0,
+  0, 0, 30, 0, 1, 5, 28, 45, 0, 49,
+  0, 0, 0, 37, 29, 0, 51, 0, 22, 9,
+  83, 12, 47, 23, 0, 0, 69, 0, 4, 0,
+  38, 0, 23, 2, 0, 0, 0, 0, 0, 6,
+  0, 38, 0, 0, 22, 49, 15, 29, 19, 13,
+  22, 0, 31, 11, 0, 28, 0, 0, 0, 0,
+  0, 0, 0, 19, 71, 6, 22, 4, 0, 0,
+  22, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 123,
+  31, 8, 0, 0, 58, 2, 5, 19, 0, 61,
+  49, 0, 0, 22, 6, 34, 22, 59, 0, 0,
+  47, 46, 38, 9, 61, 16, 179, 16, 0, 0,
+  76, 0, 51, 37, 0, 0, 40, 47, 0, 0,
+  71, 33, 17, 78, 26, 17, 0, 47, 0, 63,
+  77, 0, 7, 0, 7, 0, 0, 10, 13, 30,
+  0, 26, 0, 3, 14, 0, 1, 0, 72, 10,
+  34, 0, 44, 21, 8, 54, 16, 0, 64, 0,
+  25, 21, 0, 5, 39, 21, 53, 0, 0, 0,
+  23, 0, 9, 12, 0, 0, 0, 25, 0, 51,
+  27, 5, 41, 0, 55, 0, 0, 34, 30, 0,
+  0, 7, 0, 0, 0, 10, 31, 34, 58, 5,
+  0, 0, 20, 0, 0, 0, 5, 63, 0, 6,
+  0, 6, 70, 9, 0, 0, 0, 80, 68, 0,
+  0, 0, 4, 24, 17, 28, 10, 34, 89, 45,
+  45, 0, 53, 4, 206, 0, 0, 11, 57, 5,
+  17, 54, 0, 0, 60, 39, 0, 0, 1, 61,
+  12, 128, 21, 26, 0, 14, 0, 73, 56, 0,
+  20, 6, 28, 0, 28, 0, 56, 44, 0, 46,
+  15, 2, 13, 32, 46, 0, 134, 11, 24, 0,
+  54, 0, 56, 54, 12, 0, 36, 0, 34, 0,
+  0, 7, 35, 1, 23, 0, 0, 0, 35, 0,
+  0, 29, 0, 0, 59, 43, 6, 53, 7, 33,
+  53, 18, 22, 0, 0, 36, 0, 23, 0, 10,
+  0, 29, 0, 20, 61, 20, 68, 0, 0, 0,
+  0, 0, 0, 0, 23, 19, 0, 34, 10, 9,
+  83, 40, 0, 0, 0, 24, 57, 8, 0, 49,
+  29, 55, 14, 27, 77, 6, 23, 33, 54, 0,
+  58, 20, 192, 4, 0, 22, 109, 15, 46, 0,
+  0, 37, 38, 5, 0, 0, 0, 70, 41, 137,
+  1, 46, 0, 13, 0, 79, 54, 2, 11, 54,
+  16, 0, 0, 0, 37, 0, 13, 6, 0, 0,
+  18, 17, 31, 11, 84, 0, 5, 0, 13, 0,
+  66, 45, 13, 0, 58, 0, 30, 0, 0, 0,
+  28, 0, 31, 38, 0, 18, 0, 18, 32, 25,
+  25, 0, 48, 37, 18, 2, 0, 55, 81, 0,
+  12, 13, 23, 14, 0, 32, 10, 37, 0, 0,
+  29, 0, 19, 21, 86, 0, 13, 0, 0, 0,
+  37, 12, 0, 131, 52, 5, 17, 0, 45, 0,
+  11, 44, 5, 23, 60, 0, 17, 55, 55, 49,
+  15, 72, 0, 0, 12, 32, 54, 53, 11, 54,
+  0, 20, 0, 0, 76, 0, 17, 0, 0, 0,
+  0, 41, 0, 25, 68, 41, 28, 22, 40, 0,
+  0, 52, 0, 3, 85, 24, 0, 0, 0, 0,
+  0, 44, 4, 0, 0, 5, 0, 0, 29, 13,
+  13, 0, 0, 0, 8, 16, 74, 5, 15, 32,
+  0, 0, 97, 0, 0, 0, 14, 0, 30, 16,
+  22, 9, 0, 0, 0, 20, 0, 26, 0, 0,
+  0, 38, 5, 16, 9, 0, 39, 0, 48, 8,
+  25, 53, 0, 0, 0, 5, 0, 0, 0, 24,
+  33, 0, 34, 5, 77, 0, 62, 0, 29, 0,
+  0, 75, 0, 0, 5, 14, 48, 1, 0, 0,
+  0, 56, 51, 0, 0, 4, 32, 10, 13, 41,
+  0, 10, 71, 13, 29, 0, 10, 14, 0, 17,
+  0, 0, 42, 0, 5, 27, 0, 0, 9, 20,
+  0, 26, 0, 66, 11, 74, 35, 26, 0, 2,
+  0, 16, 68, 0, 0, 0, 30, 0, 1, 5,
+  28, 45, 0, 49, 0, 0, 0, 37, 29, 0,
+  51, 0, 22, 9, 83, 12, 47, 23, 0, 0,
+  69, 0, 4, 0, 38, 0, 23, 2, 0, 0,
+  0, 0, 0, 6, 0, 38, 0, 0, 22, 49,
+  15, 29, 19, 13, 22, 0, 31, 11, 0, 28,
+  0, 0, 0, 0, 0, 0, 0, 19, 71, 6,
+  22, 4, 0, 0, 22, 0, 10, 0, 7, 18,
+  0, 16, 0, 21, 57, 17, 0, 0, 0, 41,
+  57, 2, 0, 6, 60, 44, 5, 5, 45, 0,
+  15, 0, 37, 0, 27, 0, 0, 35, 0, 0,
+  85, 0, 0, 0, 0, 5, 0, 0, 0, 23,
+  0, 64, 4, 113, 25, 79, 0, 0, 0, 41,
+  66, 0, 0, 22, 11, 0, 0, 0, 15, 0,
+  0, 2, 0, 0, 0, 36, 38, 0, 60, 0,
+  2, 0, 50, 0, 47, 0, 0, 0, 62, 0,
+  47, 0, 7, 0, 20, 0, 0, 8, 0, 4,
+  0, 8, 0, 7, 0, 0, 51, 44, 26, 26,
+  0, 37, 18, 0, 29, 6, 9, 13, 0, 18,
+  0, 17, 0, 0, 6, 0, 36, 0, 37, 0,
+  37, 0, 0, 0, 38, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  5, 63, 0, 6, 0, 6, 70, 9, 0, 0,
+  0, 80, 68, 0, 0, 0, 4, 24, 17, 28,
+  10, 34, 89, 45, 45, 0, 53, 4, 206, 0,
+  0, 11, 57, 5, 17, 54, 0, 0, 60, 39,
+  0, 0, 1, 61, 12, 128, 21, 26, 0, 14,
+  0, 73, 56, 0, 20, 6, 28, 0, 28, 0,
+  56, 44, 0, 46, 15, 2, 13, 32, 46, 0,
+  134, 11, 24, 0, 54, 0, 56, 54, 12, 0,
+  36, 0, 34, 0, 0, 7, 35, 1, 23, 0,
+  0, 0, 35, 0, 0, 29, 0, 0, 59, 43,
+  6, 53, 7, 33, 53, 18, 22, 0, 0, 36,
+  0, 23, 0, 10, 0, 29, 0, 20, 61, 20,
+  68, 0, 0, 0, 0, 0, 0, 0, 23, 19,
+  0, 34, 10, 9, 83, 40, 0, 0, 0, 24,
+  57, 8, 0, 49, 29, 55, 14, 27, 77, 6,
+  23, 33, 54, 0, 58, 20, 192, 4, 0, 22,
+  109, 15, 46, 0, 0, 37, 38, 5, 0, 0,
+  0, 70, 41, 137, 1, 46, 0, 13, 0, 79,
+  54, 2, 11, 54, 16, 0, 0, 0, 37, 0,
+  13, 6, 0, 0, 18, 17, 31, 11, 84, 0,
+  5, 0, 13, 0, 66, 45, 13, 0, 58, 0,
+  30, 0, 0, 0, 28, 0, 31, 38, 0, 18,
+  0, 18, 32, 25, 25, 0, 48, 37, 18, 2,
+  0, 55, 81, 0, 12, 13, 23, 14, 0, 32,
+  10, 37, 0, 0, 29, 0, 19, 21, 86, 0,
+  13, 0, 0, 0, 37, 12, 0, 33, 0, 8,
+  0, 0, 88, 51, 0, 25, 4, 29, 23, 1,
+  15, 91, 42, 50, 0, 22, 30, 0, 0, 49,
+  47, 30, 47, 45, 143, 63, 23, 6, 105, 25,
+  47, 0, 0, 39, 4, 30, 0, 3, 39, 25,
+  43, 65, 2, 47, 0, 56, 16, 77, 68, 39,
+  2, 24, 5, 0, 0, 43, 0, 0, 0, 26,
+  0, 4, 28, 0, 0, 0, 1, 21, 0, 0,
+  4, 46, 30, 14, 4, 0, 94, 0, 0, 19,
+  0, 0, 9, 3, 54, 33, 28, 12, 0, 25,
+  28, 16, 54, 0, 16, 44, 0, 0, 10, 24,
+  96, 0, 13, 21, 39, 36, 23, 10, 46, 34,
+  8, 0, 13, 0, 3, 31, 63, 19, 94, 0,
+  15, 0, 17, 0, 0, 75, 0, 0, 5, 14,
+  48, 1, 0, 0, 0, 56, 51, 0, 0, 4,
+  32, 10, 13, 41, 0, 10, 71, 13, 29, 0,
+  10, 14, 0, 17, 0, 0, 42, 0, 5, 27,
+  0, 0, 9, 20, 0, 26, 0, 66, 11, 74,
+  35, 26, 0, 2, 0, 16, 68, 0, 0, 0,
+  30, 0, 1, 5, 28, 45, 0, 49, 0, 0,
+  0, 37, 29, 0, 51, 0, 22, 9, 83, 12,
+  47, 23, 0, 0, 69, 0, 4, 0, 38, 0,
+  23, 2, 0, 0, 0, 0, 0, 6, 0, 38,
+  0, 0, 22, 49, 15, 29, 19, 13, 22, 0,
+  31, 11, 0, 28, 0, 0, 0, 0, 0, 0,
+  0, 19, 71, 6, 22, 4, 0, 0, 22, 0,
+  10, 0, 7, 18, 0, 16, 0, 21, 57, 17,
+  0, 0, 0, 41, 57, 2, 0, 6, 60, 44,
+  5, 5, 45, 0, 15, 0, 37, 0, 27, 0,
+  0, 35, 0, 0, 85, 0, 0, 0, 0, 5,
+  0, 0, 0, 23, 0, 64, 4, 113, 25, 79,
+  0, 0, 0, 41, 66, 0, 0, 22, 11, 0,
+  0, 0, 15, 0, 0, 2, 0, 0, 0, 36,
+  38, 0, 60, 0, 2, 0, 50, 0, 47, 0,
+  0, 0, 62, 0, 47, 0, 7, 0, 20, 0,
+  0, 8, 0, 4, 0, 8, 0, 7, 0, 0,
+  51, 44, 26, 26, 0, 37, 18, 0, 29, 6,
+  9, 13, 0, 18, 0, 17, 0, 0, 6, 0,
+  36, 0, 37, 0, 37, 0, 0, 0, 38, 0,
+  0, 12, 0, 42, 6, 15, 37, 28, 4, 4,
+  6, 14, 22, 0, 5, 59, 66, 39, 0, 24,
+  0, 0, 0, 20, 47, 15, 29, 33, 0, 35,
+  0, 0, 91, 34, 6, 0, 0, 11, 0, 10,
+  0, 18, 0, 22, 0, 58, 46, 78, 0, 43,
+  0, 62, 86, 46, 0, 56, 0, 0, 0, 20,
+  4, 0, 0, 0, 0, 0, 39, 0, 35, 6,
+  23, 0, 0, 0, 28, 23, 8, 0, 0, 0,
+  113, 0, 11, 9, 0, 0, 7, 22, 0, 0,
+  22, 29, 0, 8, 36, 0, 36, 0, 26, 59,
+  19, 7, 14, 19, 16, 0, 26, 17, 35, 32,
+  0, 9, 19, 42, 0, 0, 5, 0, 0, 0,
+  14, 11, 125, 0, 35, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 23, 19, 0, 34, 10, 9, 83, 40,
+  0, 0, 0, 24, 57, 8, 0, 49, 29, 55,
+  14, 27, 77, 6, 23, 33, 54, 0, 58, 20,
+  192, 4, 0, 22, 109, 15, 46, 0, 0, 37,
+  38, 5, 0, 0, 0, 70, 41, 137, 1, 46,
+  0, 13, 0, 79, 54, 2, 11, 54, 16, 0,
+  0, 0, 37, 0, 13, 6, 0, 0, 18, 17,
+  31, 11, 84, 0, 5, 0, 13, 0, 66, 45,
+  13, 0, 58, 0, 30, 0, 0, 0, 28, 0,
+  31, 38, 0, 18, 0, 18, 32, 25, 25, 0,
+  48, 37, 18, 2, 0, 55, 81, 0, 12, 13,
+  23, 14, 0, 32, 10, 37, 0, 0, 29, 0,
+  19, 21, 86, 0, 13, 0, 0, 0, 37, 12,
+  0, 33, 0, 8, 0, 0, 88, 51, 0, 25,
+  4, 29, 23, 1, 15, 91, 42, 50, 0, 22,
+  30, 0, 0, 49, 47, 30, 47, 45, 143, 63,
+  23, 6, 105, 25, 47, 0, 0, 39, 4, 30,
+  0, 3, 39, 25, 43, 65, 2, 47, 0, 56,
+  16, 77, 68, 39, 2, 24, 5, 0, 0, 43,
+  0, 0, 0, 26, 0, 4, 28, 0, 0, 0,
+  1, 21, 0, 0, 4, 46, 30, 14, 4, 0,
+  94, 0, 0, 19, 0, 0, 9, 3, 54, 33,
+  28, 12, 0, 25, 28, 16, 54, 0, 16, 44,
+  0, 0, 10, 24, 96, 0, 13, 21, 39, 36,
+  23, 10, 46, 34, 8, 0, 13, 0, 3, 31,
+  63, 19, 94, 0, 15, 0, 17, 0, 0, 98,
+  1, 0, 0, 0, 70, 26, 1, 40, 0, 18,
+  8, 0, 0, 55, 20, 56, 0, 28, 0, 0,
+  9, 77, 37, 43, 56, 51, 165, 33, 18, 0,
+  85, 0, 49, 0, 0, 7, 13, 31, 0, 0,
+  65, 0, 42, 42, 0, 0, 0, 51, 14, 68,
+  75, 5, 23, 0, 0, 0, 0, 38, 0, 3,
+  1, 24, 0, 20, 44, 0, 0, 18, 0, 29,
+  38, 5, 30, 64, 3, 48, 31, 0, 73, 0,
+  0, 22, 0, 9, 14, 16, 72, 24, 54, 0,
+  0, 3, 10, 1, 31, 0, 4, 29, 0, 13,
+  27, 0, 87, 0, 38, 9, 40, 53, 46, 4,
+  16, 15, 5, 0, 5, 0, 11, 52, 56, 10,
+  49, 0, 36, 0, 7, 0, 7, 18, 0, 16,
+  0, 21, 57, 17, 0, 0, 0, 41, 57, 2,
+  0, 6, 60, 44, 5, 5, 45, 0, 15, 0,
+  37, 0, 27, 0, 0, 35, 0, 0, 85, 0,
+  0, 0, 0, 5, 0, 0, 0, 23, 0, 64,
+  4, 113, 25, 79, 0, 0, 0, 41, 66, 0,
+  0, 22, 11, 0, 0, 0, 15, 0, 0, 2,
+  0, 0, 0, 36, 38, 0, 60, 0, 2, 0,
+  50, 0, 47, 0, 0, 0, 62, 0, 47, 0,
+  7, 0, 20, 0, 0, 8, 0, 4, 0, 8,
+  0, 7, 0, 0, 51, 44, 26, 26, 0, 37,
+  18, 0, 29, 6, 9, 13, 0, 18, 0, 17,
+  0, 0, 6, 0, 36, 0, 37, 0, 37, 0,
+  0, 0, 38, 0, 0, 12, 0, 42, 6, 15,
+  37, 28, 4, 4, 6, 14, 22, 0, 5, 59,
+  66, 39, 0, 24, 0, 0, 0, 20, 47, 15,
+  29, 33, 0, 35, 0, 0, 91, 34, 6, 0,
+  0, 11, 0, 10, 0, 18, 0, 22, 0, 58,
+  46, 78, 0, 43, 0, 62, 86, 46, 0, 56,
+  0, 0, 0, 20, 4, 0, 0, 0, 0, 0,
+  39, 0, 35, 6, 23, 0, 0, 0, 28, 23,
+  8, 0, 0, 0, 113, 0, 11, 9, 0, 0,
+  7, 22, 0, 0, 22, 29, 0, 8, 36, 0,
+  36, 0, 26, 59, 19, 7, 14, 19, 16, 0,
+  26, 17, 35, 32, 0, 9, 19, 42, 0, 0,
+  5, 0, 0, 0, 14, 11, 125, 0, 35, 0,
+  0, 0, 0, 93, 5, 24, 14, 0, 37, 16,
+  19, 24, 15, 1, 7, 0, 45, 74, 66, 43,
+  0, 20, 0, 0, 0, 49, 65, 69, 6, 62,
+  0, 1, 5, 0, 69, 27, 8, 0, 0, 8,
+  0, 34, 0, 35, 41, 0, 16, 0, 40, 0,
+  0, 56, 0, 37, 99, 45, 0, 4, 0, 17,
+  0, 45, 12, 0, 0, 33, 0, 12, 78, 0,
+  23, 0, 0, 0, 0, 6, 46, 35, 1, 18,
+  0, 2, 119, 0, 0, 1, 0, 16, 0, 27,
+  17, 29, 59, 0, 0, 26, 0, 8, 27, 0,
+  0, 42, 0, 0, 29, 0, 16, 0, 32, 10,
+  52, 56, 0, 0, 9, 11, 0, 0, 0, 0,
+  0, 0, 4, 23, 137, 0, 66, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 33, 0, 8, 0, 0,
+  88, 51, 0, 25, 4, 29, 23, 1, 15, 91,
+  42, 50, 0, 22, 30, 0, 0, 49, 47, 30,
+  47, 45, 143, 63, 23, 6, 105, 25, 47, 0,
+  0, 39, 4, 30, 0, 3, 39, 25, 43, 65,
+  2, 47, 0, 56, 16, 77, 68, 39, 2, 24,
+  5, 0, 0, 43, 0, 0, 0, 26, 0, 4,
+  28, 0, 0, 0, 1, 21, 0, 0, 4, 46,
+  30, 14, 4, 0, 94, 0, 0, 19, 0, 0,
+  9, 3, 54, 33, 28, 12, 0, 25, 28, 16,
+  54, 0, 16, 44, 0, 0, 10, 24, 96, 0,
+  13, 21, 39, 36, 23, 10, 46, 34, 8, 0,
+  13, 0, 3, 31, 63, 19, 94, 0, 15, 0,
+  17, 0, 0, 98, 1, 0, 0, 0, 70, 26,
+  1, 40, 0, 18, 8, 0, 0, 55, 20, 56,
+  0, 28, 0, 0, 9, 77, 37, 43, 56, 51,
+  165, 33, 18, 0, 85, 0, 49, 0, 0, 7,
+  13, 31, 0, 0, 65, 0, 42, 42, 0, 0,
+  0, 51, 14, 68, 75, 5, 23, 0, 0, 0,
+  0, 38, 0, 3, 1, 24, 0, 20, 44, 0,
+  0, 18, 0, 29, 38, 5, 30, 64, 3, 48,
+  31, 0, 73, 0, 0, 22, 0, 9, 14, 16,
+  72, 24, 54, 0, 0, 3, 10, 1, 31, 0,
+  4, 29, 0, 13, 27, 0, 87, 0, 38, 9,
+  40, 53, 46, 4, 16, 15, 5, 0, 5, 0,
+  11, 52, 56, 10, 49, 0, 36, 0, 7, 0,
+  21, 87, 0, 17, 0, 0, 7, 0, 27, 18,
+  0, 30, 39, 0, 0, 11, 9, 43, 15, 26,
+  0, 36, 93, 68, 12, 0, 68, 46, 209, 0,
+  0, 0, 54, 0, 48, 43, 0, 0, 65, 3,
+  0, 0, 39, 14, 18, 96, 0, 0, 0, 10,
+  0, 107, 61, 0, 69, 0, 19, 0, 17, 0,
+  20, 40, 0, 0, 35, 25, 0, 0, 0, 58,
+  134, 10, 46, 0, 8, 33, 3, 95, 34, 0,
+  24, 0, 8, 20, 0, 5, 21, 22, 59, 0,
+  30, 0, 0, 0, 54, 0, 27, 0, 10, 43,
+  26, 72, 29, 15, 69, 18, 47, 0, 13, 38,
+  8, 8, 0, 1, 0, 0, 3, 0, 8, 49,
+  53, 0, 0, 0, 36, 0, 0, 0, 0, 12,
+  0, 42, 6, 15, 37, 28, 4, 4, 6, 14,
+  22, 0, 5, 59, 66, 39, 0, 24, 0, 0,
+  0, 20, 47, 15, 29, 33, 0, 35, 0, 0,
+  91, 34, 6, 0, 0, 11, 0, 10, 0, 18,
+  0, 22, 0, 58, 46, 78, 0, 43, 0, 62,
+  86, 46, 0, 56, 0, 0, 0, 20, 4, 0,
+  0, 0, 0, 0, 39, 0, 35, 6, 23, 0,
+  0, 0, 28, 23, 8, 0, 0, 0, 113, 0,
+  11, 9, 0, 0, 7, 22, 0, 0, 22, 29,
+  0, 8, 36, 0, 36, 0, 26, 59, 19, 7,
+  14, 19, 16, 0, 26, 17, 35, 32, 0, 9,
+  19, 42, 0, 0, 5, 0, 0, 0, 14, 11,
+  125, 0, 35, 0, 0, 0, 0, 93, 5, 24,
+  14, 0, 37, 16, 19, 24, 15, 1, 7, 0,
+  45, 74, 66, 43, 0, 20, 0, 0, 0, 49,
+  65, 69, 6, 62, 0, 1, 5, 0, 69, 27,
+  8, 0, 0, 8, 0, 34, 0, 35, 41, 0,
+  16, 0, 40, 0, 0, 56, 0, 37, 99, 45,
+  0, 4, 0, 17, 0, 45, 12, 0, 0, 33,
+  0, 12, 78, 0, 23, 0, 0, 0, 0, 6,
+  46, 35, 1, 18, 0, 2, 119, 0, 0, 1,
+  0, 16, 0, 27, 17, 29, 59, 0, 0, 26,
+  0, 8, 27, 0, 0, 42, 0, 0, 29, 0,
+  16, 0, 32, 10, 52, 56, 0, 0, 9, 11,
+  0, 0, 0, 0, 0, 0, 4, 23, 137, 0,
+  66, 0, 0, 0, 0, 115, 36, 17, 6, 0,
+  3, 0, 44, 17, 0, 0, 3, 0, 0, 24,
+  36, 38, 6, 35, 0, 0, 67, 53, 19, 0,
+  40, 54, 0, 0, 0, 0, 68, 0, 53, 8,
+  0, 0, 28, 2, 0, 0, 37, 25, 0, 67,
+  27, 0, 0, 2, 0, 53, 88, 0, 20, 0,
+  26, 0, 0, 0, 0, 27, 0, 0, 0, 0,
+  0, 0, 0, 14, 53, 0, 37, 17, 61, 42,
+  0, 74, 24, 0, 64, 0, 4, 21, 0, 0,
+  6, 36, 25, 20, 74, 0, 0, 0, 24, 0,
+  0, 0, 0, 53, 38, 17, 0, 0, 21, 4,
+  62, 0, 41, 58, 0, 16, 0, 3, 0, 0,
+  0, 0, 0, 6, 0, 0, 35, 0, 53, 1,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 98, 1, 0,
+  0, 0, 70, 26, 1, 40, 0, 18, 8, 0,
+  0, 55, 20, 56, 0, 28, 0, 0, 9, 77,
+  37, 43, 56, 51, 165, 33, 18, 0, 85, 0,
+  49, 0, 0, 7, 13, 31, 0, 0, 65, 0,
+  42, 42, 0, 0, 0, 51, 14, 68, 75, 5,
+  23, 0, 0, 0, 0, 38, 0, 3, 1, 24,
+  0, 20, 44, 0, 0, 18, 0, 29, 38, 5,
+  30, 64, 3, 48, 31, 0, 73, 0, 0, 22,
+  0, 9, 14, 16, 72, 24, 54, 0, 0, 3,
+  10, 1, 31, 0, 4, 29, 0, 13, 27, 0,
+  87, 0, 38, 9, 40, 53, 46, 4, 16, 15,
+  5, 0, 5, 0, 11, 52, 56, 10, 49, 0,
+  36, 0, 7, 0, 21, 87, 0, 17, 0, 0,
+  7, 0, 27, 18, 0, 30, 39, 0, 0, 11,
+  9, 43, 15, 26, 0, 36, 93, 68, 12, 0,
+  68, 46, 209, 0, 0, 0, 54, 0, 48, 43,
+  0, 0, 65, 3, 0, 0, 39, 14, 18, 96,
+  0, 0, 0, 10, 0, 107, 61, 0, 69, 0,
+  19, 0, 17, 0, 20, 40, 0, 0, 35, 25,
+  0, 0, 0, 58, 134, 10, 46, 0, 8, 33,
+  3, 95, 34, 0, 24, 0, 8, 20, 0, 5,
+  21, 22, 59, 0, 30, 0, 0, 0, 54, 0,
+  27, 0, 10, 43, 26, 72, 29, 15, 69, 18,
+  47, 0, 13, 38, 8, 8, 0, 1, 0, 0,
+  3, 0, 8, 49, 53, 0, 0, 0, 36, 0,
+  0, 0, 121, 68, 0, 69, 37, 0, 10, 0,
+  13, 0, 0, 24, 109, 0, 0, 19, 14, 0,
+  23, 0, 0, 116, 51, 34, 64, 0, 36, 36,
+  222, 0, 6, 97, 40, 17, 23, 41, 0, 0,
+  124, 6, 0, 0, 30, 56, 59, 90, 15, 0,
+  0, 12, 0, 135, 15, 0, 103, 17, 27, 22,
+  53, 0, 58, 43, 30, 87, 0, 83, 14, 0,
+  21, 25, 137, 20, 29, 0, 0, 0, 51, 86,
+  41, 0, 7, 0, 17, 24, 0, 13, 21, 0,
+  55, 9, 0, 0, 0, 0, 22, 16, 63, 0,
+  40, 42, 4, 62, 32, 21, 74, 29, 0, 42,
+  54, 0, 12, 14, 0, 0, 0, 27, 4, 0,
+  11, 38, 71, 25, 0, 34, 62, 0, 9, 24,
+  0, 93, 5, 24, 14, 0, 37, 16, 19, 24,
+  15, 1, 7, 0, 45, 74, 66, 43, 0, 20,
+  0, 0, 0, 49, 65, 69, 6, 62, 0, 1,
+  5, 0, 69, 27, 8, 0, 0, 8, 0, 34,
+  0, 35, 41, 0, 16, 0, 40, 0, 0, 56,
+  0, 37, 99, 45, 0, 4, 0, 17, 0, 45,
+  12, 0, 0, 33, 0, 12, 78, 0, 23, 0,
+  0, 0, 0, 6, 46, 35, 1, 18, 0, 2,
+  119, 0, 0, 1, 0, 16, 0, 27, 17, 29,
+  59, 0, 0, 26, 0, 8, 27, 0, 0, 42,
+  0, 0, 29, 0, 16, 0, 32, 10, 52, 56,
+  0, 0, 9, 11, 0, 0, 0, 0, 0, 0,
+  4, 23, 137, 0, 66, 0, 0, 0, 0, 115,
+  36, 17, 6, 0, 3, 0, 44, 17, 0, 0,
+  3, 0, 0, 24, 36, 38, 6, 35, 0, 0,
+  67, 53, 19, 0, 40, 54, 0, 0, 0, 0,
+  68, 0, 53, 8, 0, 0, 28, 2, 0, 0,
+  37, 25, 0, 67, 27, 0, 0, 2, 0, 53,
+  88, 0, 20, 0, 26, 0, 0, 0, 0, 27,
+  0, 0, 0, 0, 0, 0, 0, 14, 53, 0,
+  37, 17, 61, 42, 0, 74, 24, 0, 64, 0,
+  4, 21, 0, 0, 6, 36, 25, 20, 74, 0,
+  0, 0, 24, 0, 0, 0, 0, 53, 38, 17,
+  0, 0, 21, 4, 62, 0, 41, 58, 0, 16,
+  0, 3, 0, 0, 0, 0, 0, 6, 0, 0,
+  35, 0, 53, 1, 0, 0, 55, 68, 5, 59,
+  7, 0, 0, 0, 39, 0, 0, 18, 78, 0,
+  0, 0, 25, 2, 0, 0, 0, 34, 65, 19,
+  34, 0, 18, 36, 0, 0, 0, 6, 13, 0,
+  31, 16, 0, 0, 71, 0, 0, 16, 19, 37,
+  0, 40, 14, 0, 0, 0, 0, 107, 29, 0,
+  61, 0, 36, 0, 0, 0, 0, 19, 0, 10,
+  41, 34, 0, 0, 22, 0, 133, 0, 33, 13,
+  17, 0, 9, 54, 28, 7, 16, 0, 14, 15,
+  15, 0, 15, 0, 48, 0, 1, 0, 0, 0,
+  0, 0, 10, 0, 0, 40, 0, 1, 9, 0,
+  35, 68, 7, 20, 38, 3, 0, 13, 0, 0,
+  0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
+  53, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 21, 87,
+  0, 17, 0, 0, 7, 0, 27, 18, 0, 30,
+  39, 0, 0, 11, 9, 43, 15, 26, 0, 36,
+  93, 68, 12, 0, 68, 46, 209, 0, 0, 0,
+  54, 0, 48, 43, 0, 0, 65, 3, 0, 0,
+  39, 14, 18, 96, 0, 0, 0, 10, 0, 107,
+  61, 0, 69, 0, 19, 0, 17, 0, 20, 40,
+  0, 0, 35, 25, 0, 0, 0, 58, 134, 10,
+  46, 0, 8, 33, 3, 95, 34, 0, 24, 0,
+  8, 20, 0, 5, 21, 22, 59, 0, 30, 0,
+  0, 0, 54, 0, 27, 0, 10, 43, 26, 72,
+  29, 15, 69, 18, 47, 0, 13, 38, 8, 8,
+  0, 1, 0, 0, 3, 0, 8, 49, 53, 0,
+  0, 0, 36, 0, 0, 0, 121, 68, 0, 69,
+  37, 0, 10, 0, 13, 0, 0, 24, 109, 0,
+  0, 19, 14, 0, 23, 0, 0, 116, 51, 34,
+  64, 0, 36, 36, 222, 0, 6, 97, 40, 17,
+  23, 41, 0, 0, 124, 6, 0, 0, 30, 56,
+  59, 90, 15, 0, 0, 12, 0, 135, 15, 0,
+  103, 17, 27, 22, 53, 0, 58, 43, 30, 87,
+  0, 83, 14, 0, 21, 25, 137, 20, 29, 0,
+  0, 0, 51, 86, 41, 0, 7, 0, 17, 24,
+  0, 13, 21, 0, 55, 9, 0, 0, 0, 0,
+  22, 16, 63, 0, 40, 42, 4, 62, 32, 21,
+  74, 29, 0, 42, 54, 0, 12, 14, 0, 0,
+  0, 27, 4, 0, 11, 38, 71, 25, 0, 34,
+  62, 0, 9, 24, 66, 10, 0, 31, 29, 110,
+  12, 0, 20, 0, 0, 9, 85, 0, 0, 46,
+  16, 30, 0, 0, 33, 111, 0, 60, 48, 0,
+  3, 44, 255, 0, 0, 72, 42, 37, 17, 24,
+  0, 22, 96, 20, 32, 0, 17, 61, 85, 122,
+  14, 0, 0, 23, 0, 130, 26, 0, 91, 47,
+  26, 11, 67, 0, 34, 60, 32, 28, 0, 46,
+  0, 4, 12, 28, 143, 0, 41, 3, 0, 22,
+  11, 56, 20, 0, 23, 0, 1, 24, 0, 0,
+  19, 5, 50, 28, 0, 55, 8, 0, 61, 18,
+  20, 0, 39, 55, 9, 30, 21, 7, 86, 7,
+  1, 22, 0, 7, 0, 16, 0, 0, 0, 31,
+  20, 0, 35, 34, 69, 0, 0, 44, 59, 0,
+  6, 4, 0, 115, 36, 17, 6, 0, 3, 0,
+  44, 17, 0, 0, 3, 0, 0, 24, 36, 38,
+  6, 35, 0, 0, 67, 53, 19, 0, 40, 54,
+  0, 0, 0, 0, 68, 0, 53, 8, 0, 0,
+  28, 2, 0, 0, 37, 25, 0, 67, 27, 0,
+  0, 2, 0, 53, 88, 0, 20, 0, 26, 0,
+  0, 0, 0, 27, 0, 0, 0, 0, 0, 0,
+  0, 14, 53, 0, 37, 17, 61, 42, 0, 74,
+  24, 0, 64, 0, 4, 21, 0, 0, 6, 36,
+  25, 20, 74, 0, 0, 0, 24, 0, 0, 0,
+  0, 53, 38, 17, 0, 0, 21, 4, 62, 0,
+  41, 58, 0, 16, 0, 3, 0, 0, 0, 0,
+  0, 6, 0, 0, 35, 0, 53, 1, 0, 0,
+  55, 68, 5, 59, 7, 0, 0, 0, 39, 0,
+  0, 18, 78, 0, 0, 0, 25, 2, 0, 0,
+  0, 34, 65, 19, 34, 0, 18, 36, 0, 0,
+  0, 6, 13, 0, 31, 16, 0, 0, 71, 0,
+  0, 16, 19, 37, 0, 40, 14, 0, 0, 0,
+  0, 107, 29, 0, 61, 0, 36, 0, 0, 0,
+  0, 19, 0, 10, 41, 34, 0, 0, 22, 0,
+  133, 0, 33, 13, 17, 0, 9, 54, 28, 7,
+  16, 0, 14, 15, 15, 0, 15, 0, 48, 0,
+  1, 0, 0, 0, 0, 0, 10, 0, 0, 40,
+  0, 1, 9, 0, 35, 68, 7, 20, 38, 3,
+  0, 13, 0, 0, 0, 0, 0, 0, 0, 9,
+  0, 0, 0, 0, 53, 0, 0, 0, 104, 21,
+  0, 47, 20, 66, 0, 0, 53, 0, 0, 0,
+  116, 0, 0, 40, 62, 0, 2, 0, 11, 68,
+  0, 8, 23, 0, 0, 43, 3, 1, 13, 72,
+  0, 27, 24, 0, 0, 21, 96, 5, 13, 87,
+  14, 47, 59, 16, 0, 0, 0, 0, 0, 111,
+  0, 0, 107, 59, 25, 17, 19, 0, 0, 13,
+  9, 35, 0, 93, 0, 0, 13, 0, 155, 30,
+  22, 32, 0, 0, 34, 19, 0, 47, 0, 0,
+  15, 14, 42, 14, 8, 0, 73, 0, 0, 0,
+  0, 2, 0, 0, 31, 0, 21, 50, 0, 0,
+  5, 0, 30, 31, 0, 67, 22, 0, 17, 0,
+  0, 0, 0, 0, 0, 0, 0, 1, 0, 3,
+  0, 16, 53, 0, 3, 16, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  121, 68, 0, 69, 37, 0, 10, 0, 13, 0,
+  0, 24, 109, 0, 0, 19, 14, 0, 23, 0,
+  0, 116, 51, 34, 64, 0, 36, 36, 222, 0,
+  6, 97, 40, 17, 23, 41, 0, 0, 124, 6,
+  0, 0, 30, 56, 59, 90, 15, 0, 0, 12,
+  0, 135, 15, 0, 103, 17, 27, 22, 53, 0,
+  58, 43, 30, 87, 0, 83, 14, 0, 21, 25,
+  137, 20, 29, 0, 0, 0, 51, 86, 41, 0,
+  7, 0, 17, 24, 0, 13, 21, 0, 55, 9,
+  0, 0, 0, 0, 22, 16, 63, 0, 40, 42,
+  4, 62, 32, 21, 74, 29, 0, 42, 54, 0,
+  12, 14, 0, 0, 0, 27, 4, 0, 11, 38,
+  71, 25, 0, 34, 62, 0, 9, 24, 66, 10,
+  0, 31, 29, 110, 12, 0, 20, 0, 0, 9,
+  85, 0, 0, 46, 16, 30, 0, 0, 33, 111,
+  0, 60, 48, 0, 3, 44, 255, 0, 0, 72,
+  42, 37, 17, 24, 0, 22, 96, 20, 32, 0,
+  17, 61, 85, 122, 14, 0, 0, 23, 0, 130,
+  26, 0, 91, 47, 26, 11, 67, 0, 34, 60,
+  32, 28, 0, 46, 0, 4, 12, 28, 143, 0,
+  41, 3, 0, 22, 11, 56, 20, 0, 23, 0,
+  1, 24, 0, 0, 19, 5, 50, 28, 0, 55,
+  8, 0, 61, 18, 20, 0, 39, 55, 9, 30,
+  21, 7, 86, 7, 1, 22, 0, 7, 0, 16,
+  0, 0, 0, 31, 20, 0, 35, 34, 69, 0,
+  0, 44, 59, 0, 6, 4, 0, 38, 0, 0,
+  7, 72, 57, 6, 59, 17, 0, 6, 46, 16,
+  0, 163, 49, 58, 0, 0, 76, 0, 0, 90,
+  29, 28, 5, 40, 214, 33, 0, 0, 89, 29,
+  32, 0, 0, 53, 10, 75, 12, 0, 0, 45,
+  49, 87, 5, 9, 0, 73, 3, 65, 107, 1,
+  7, 49, 22, 23, 0, 54, 0, 5, 0, 32,
+  0, 1, 11, 0, 25, 0, 29, 0, 39, 11,
+  0, 97, 0, 37, 0, 1, 62, 0, 14, 26,
+  0, 4, 35, 12, 60, 53, 62, 78, 0, 3,
+  68, 5, 0, 0, 50, 64, 14, 0, 0, 0,
+  76, 0, 29, 16, 1, 58, 17, 0, 0, 22,
+  0, 0, 0, 12, 39, 12, 66, 4, 74, 0,
+  59, 0, 32, 0, 55, 68, 5, 59, 7, 0,
+  0, 0, 39, 0, 0, 18, 78, 0, 0, 0,
+  25, 2, 0, 0, 0, 34, 65, 19, 34, 0,
+  18, 36, 0, 0, 0, 6, 13, 0, 31, 16,
+  0, 0, 71, 0, 0, 16, 19, 37, 0, 40,
+  14, 0, 0, 0, 0, 107, 29, 0, 61, 0,
+  36, 0, 0, 0, 0, 19, 0, 10, 41, 34,
+  0, 0, 22, 0, 133, 0, 33, 13, 17, 0,
+  9, 54, 28, 7, 16, 0, 14, 15, 15, 0,
+  15, 0, 48, 0, 1, 0, 0, 0, 0, 0,
+  10, 0, 0, 40, 0, 1, 9, 0, 35, 68,
+  7, 20, 38, 3, 0, 13, 0, 0, 0, 0,
+  0, 0, 0, 9, 0, 0, 0, 0, 53, 0,
+  0, 0, 104, 21, 0, 47, 20, 66, 0, 0,
+  53, 0, 0, 0, 116, 0, 0, 40, 62, 0,
+  2, 0, 11, 68, 0, 8, 23, 0, 0, 43,
+  3, 1, 13, 72, 0, 27, 24, 0, 0, 21,
+  96, 5, 13, 87, 14, 47, 59, 16, 0, 0,
+  0, 0, 0, 111, 0, 0, 107, 59, 25, 17,
+  19, 0, 0, 13, 9, 35, 0, 93, 0, 0,
+  13, 0, 155, 30, 22, 32, 0, 0, 34, 19,
+  0, 47, 0, 0, 15, 14, 42, 14, 8, 0,
+  73, 0, 0, 0, 0, 2, 0, 0, 31, 0,
+  21, 50, 0, 0, 5, 0, 30, 31, 0, 67,
+  22, 0, 17, 0, 0, 0, 0, 0, 0, 0,
+  0, 1, 0, 3, 0, 16, 53, 0, 3, 16,
+  0, 0, 0, 0, 0, 145, 0, 0, 46, 0,
+  0, 0, 34, 21, 0, 109, 67, 48, 0, 0,
+  39, 1, 0, 58, 0, 0, 0, 56, 1, 0,
+  0, 0, 49, 0, 0, 0, 22, 71, 0, 0,
+  22, 0, 0, 3, 13, 87, 0, 0, 0, 14,
+  12, 53, 23, 0, 62, 19, 29, 0, 0, 0,
+  0, 48, 0, 0, 12, 0, 16, 0, 17, 13,
+  58, 0, 50, 76, 0, 66, 0, 52, 0, 0,
+  8, 0, 17, 64, 0, 25, 19, 0, 22, 2,
+  35, 128, 0, 0, 75, 0, 0, 0, 0, 93,
+  86, 0, 0, 0, 15, 0, 0, 38, 0, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 4, 15, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 66, 10, 0, 31, 29, 110, 12, 0,
+  20, 0, 0, 9, 85, 0, 0, 46, 16, 30,
+  0, 0, 33, 111, 0, 60, 48, 0, 3, 44,
+  255, 0, 0, 72, 42, 37, 17, 24, 0, 22,
+  96, 20, 32, 0, 17, 61, 85, 122, 14, 0,
+  0, 23, 0, 130, 26, 0, 91, 47, 26, 11,
+  67, 0, 34, 60, 32, 28, 0, 46, 0, 4,
+  12, 28, 143, 0, 41, 3, 0, 22, 11, 56,
+  20, 0, 23, 0, 1, 24, 0, 0, 19, 5,
+  50, 28, 0, 55, 8, 0, 61, 18, 20, 0,
+  39, 55, 9, 30, 21, 7, 86, 7, 1, 22,
+  0, 7, 0, 16, 0, 0, 0, 31, 20, 0,
+  35, 34, 69, 0, 0, 44, 59, 0, 6, 4,
+  0, 38, 0, 0, 7, 72, 57, 6, 59, 17,
+  0, 6, 46, 16, 0, 163, 49, 58, 0, 0,
+  76, 0, 0, 90, 29, 28, 5, 40, 214, 33,
+  0, 0, 89, 29, 32, 0, 0, 53, 10, 75,
+  12, 0, 0, 45, 49, 87, 5, 9, 0, 73,
+  3, 65, 107, 1, 7, 49, 22, 23, 0, 54,
+  0, 5, 0, 32, 0, 1, 11, 0, 25, 0,
+  29, 0, 39, 11, 0, 97, 0, 37, 0, 1,
+  62, 0, 14, 26, 0, 4, 35, 12, 60, 53,
+  62, 78, 0, 3, 68, 5, 0, 0, 50, 64,
+  14, 0, 0, 0, 76, 0, 29, 16, 1, 58,
+  17, 0, 0, 22, 0, 0, 0, 12, 39, 12,
+  66, 4, 74, 0, 59, 0, 32, 0, 0, 58,
+  63, 0, 7, 0, 21, 41, 98, 32, 26, 34,
+  16, 64, 0, 150, 62, 63, 48, 14, 52, 0,
+  0, 72, 12, 0, 54, 79, 175, 35, 0, 0,
+  104, 0, 8, 0, 3, 53, 0, 34, 0, 0,
+  0, 32, 8, 71, 0, 0, 0, 50, 34, 80,
+  101, 18, 30, 0, 24, 14, 0, 49, 0, 0,
+  0, 16, 0, 0, 47, 0, 11, 29, 0, 0,
+  63, 28, 0, 75, 0, 60, 0, 1, 62, 4,
+  40, 45, 0, 23, 18, 40, 92, 24, 106, 1,
+  0, 0, 68, 0, 17, 0, 31, 98, 42, 0,
+  7, 0, 83, 0, 3, 51, 27, 30, 31, 0,
+  16, 5, 20, 0, 0, 18, 0, 32, 51, 0,
+  76, 0, 65, 0, 38, 22, 104, 21, 0, 47,
+  20, 66, 0, 0, 53, 0, 0, 0, 116, 0,
+  0, 40, 62, 0, 2, 0, 11, 68, 0, 8,
+  23, 0, 0, 43, 3, 1, 13, 72, 0, 27,
+  24, 0, 0, 21, 96, 5, 13, 87, 14, 47,
+  59, 16, 0, 0, 0, 0, 0, 111, 0, 0,
+  107, 59, 25, 17, 19, 0, 0, 13, 9, 35,
+  0, 93, 0, 0, 13, 0, 155, 30, 22, 32,
+  0, 0, 34, 19, 0, 47, 0, 0, 15, 14,
+  42, 14, 8, 0, 73, 0, 0, 0, 0, 2,
+  0, 0, 31, 0, 21, 50, 0, 0, 5, 0,
+  30, 31, 0, 67, 22, 0, 17, 0, 0, 0,
+  0, 0, 0, 0, 0, 1, 0, 3, 0, 16,
+  53, 0, 3, 16, 0, 0, 0, 0, 0, 145,
+  0, 0, 46, 0, 0, 0, 34, 21, 0, 109,
+  67, 48, 0, 0, 39, 1, 0, 58, 0, 0,
+  0, 56, 1, 0, 0, 0, 49, 0, 0, 0,
+  22, 71, 0, 0, 22, 0, 0, 3, 13, 87,
+  0, 0, 0, 14, 12, 53, 23, 0, 62, 19,
+  29, 0, 0, 0, 0, 48, 0, 0, 12, 0,
+  16, 0, 17, 13, 58, 0, 50, 76, 0, 66,
+  0, 52, 0, 0, 8, 0, 17, 64, 0, 25,
+  19, 0, 22, 2, 35, 128, 0, 0, 75, 0,
+  0, 0, 0, 93, 86, 0, 0, 0, 15, 0,
+  0, 38, 0, 19, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  4, 15, 0, 0, 92, 0, 0, 76, 0, 0,
+  44, 0, 0, 15, 13, 93, 0, 13, 41, 74,
+  27, 0, 22, 35, 4, 32, 0, 0, 0, 34,
+  0, 0, 18, 4, 5, 0, 0, 0, 14, 65,
+  0, 0, 0, 14, 0, 0, 0, 18, 0, 0,
+  0, 0, 19, 112, 26, 0, 66, 0, 49, 0,
+  1, 0, 0, 12, 0, 0, 37, 7, 27, 10,
+  26, 96, 0, 0, 36, 15, 0, 30, 0, 21,
+  0, 0, 0, 0, 33, 83, 0, 28, 14, 34,
+  42, 0, 16, 32, 0, 0, 39, 0, 0, 0,
+  13, 107, 45, 0, 0, 0, 3, 18, 0, 20,
+  0, 5, 17, 0, 0, 0, 49, 0, 46, 44,
+  22, 4, 0, 0, 0, 0, 20, 0, 0, 18,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 38, 0, 0, 7, 72,
+  57, 6, 59, 17, 0, 6, 46, 16, 0, 163,
+  49, 58, 0, 0, 76, 0, 0, 90, 29, 28,
+  5, 40, 214, 33, 0, 0, 89, 29, 32, 0,
+  0, 53, 10, 75, 12, 0, 0, 45, 49, 87,
+  5, 9, 0, 73, 3, 65, 107, 1, 7, 49,
+  22, 23, 0, 54, 0, 5, 0, 32, 0, 1,
+  11, 0, 25, 0, 29, 0, 39, 11, 0, 97,
+  0, 37, 0, 1, 62, 0, 14, 26, 0, 4,
+  35, 12, 60, 53, 62, 78, 0, 3, 68, 5,
+  0, 0, 50, 64, 14, 0, 0, 0, 76, 0,
+  29, 16, 1, 58, 17, 0, 0, 22, 0, 0,
+  0, 12, 39, 12, 66, 4, 74, 0, 59, 0,
+  32, 0, 0, 58, 63, 0, 7, 0, 21, 41,
+  98, 32, 26, 34, 16, 64, 0, 150, 62, 63,
+  48, 14, 52, 0, 0, 72, 12, 0, 54, 79,
+  175, 35, 0, 0, 104, 0, 8, 0, 3, 53,
+  0, 34, 0, 0, 0, 32, 8, 71, 0, 0,
+  0, 50, 34, 80, 101, 18, 30, 0, 24, 14,
+  0, 49, 0, 0, 0, 16, 0, 0, 47, 0,
+  11, 29, 0, 0, 63, 28, 0, 75, 0, 60,
+  0, 1, 62, 4, 40, 45, 0, 23, 18, 40,
+  92, 24, 106, 1, 0, 0, 68, 0, 17, 0,
+  31, 98, 42, 0, 7, 0, 83, 0, 3, 51,
+  27, 30, 31, 0, 16, 5, 20, 0, 0, 18,
+  0, 32, 51, 0, 76, 0, 65, 0, 38, 22,
+  50, 21, 117, 0, 0, 33, 0, 34, 48, 0,
+  0, 21, 0, 97, 0, 11, 24, 76, 56, 29,
+  7, 79, 14, 26, 0, 0, 21, 72, 178, 23,
+  2, 77, 15, 0, 0, 17, 0, 58, 0, 0,
+  0, 0, 23, 6, 0, 52, 0, 0, 0, 0,
+  17, 138, 16, 0, 76, 0, 43, 0, 26, 0,
+  0, 0, 10, 14, 41, 10, 2, 8, 11, 125,
+  0, 0, 81, 0, 0, 29, 11, 26, 12, 0,
+  0, 0, 1, 82, 0, 0, 46, 37, 66, 0,
+  39, 0, 0, 0, 91, 0, 6, 0, 15, 66,
+  24, 0, 23, 6, 85, 90, 0, 23, 0, 0,
+  42, 20, 11, 6, 52, 0, 44, 28, 0, 49,
+  48, 0, 0, 0, 21, 0, 24, 28, 0, 0,
+  0, 0, 0, 145, 0, 0, 46, 0, 0, 0,
+  34, 21, 0, 109, 67, 48, 0, 0, 39, 1,
+  0, 58, 0, 0, 0, 56, 1, 0, 0, 0,
+  49, 0, 0, 0, 22, 71, 0, 0, 22, 0,
+  0, 3, 13, 87, 0, 0, 0, 14, 12, 53,
+  23, 0, 62, 19, 29, 0, 0, 0, 0, 48,
+  0, 0, 12, 0, 16, 0, 17, 13, 58, 0,
+  50, 76, 0, 66, 0, 52, 0, 0, 8, 0,
+  17, 64, 0, 25, 19, 0, 22, 2, 35, 128,
+  0, 0, 75, 0, 0, 0, 0, 93, 86, 0,
+  0, 0, 15, 0, 0, 38, 0, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 4, 15, 0, 0, 92, 0,
+  0, 76, 0, 0, 44, 0, 0, 15, 13, 93,
+  0, 13, 41, 74, 27, 0, 22, 35, 4, 32,
+  0, 0, 0, 34, 0, 0, 18, 4, 5, 0,
+  0, 0, 14, 65, 0, 0, 0, 14, 0, 0,
+  0, 18, 0, 0, 0, 0, 19, 112, 26, 0,
+  66, 0, 49, 0, 1, 0, 0, 12, 0, 0,
+  37, 7, 27, 10, 26, 96, 0, 0, 36, 15,
+  0, 30, 0, 21, 0, 0, 0, 0, 33, 83,
+  0, 28, 14, 34, 42, 0, 16, 32, 0, 0,
+  39, 0, 0, 0, 13, 107, 45, 0, 0, 0,
+  3, 18, 0, 20, 0, 5, 17, 0, 0, 0,
+  49, 0, 46, 44, 22, 4, 0, 0, 0, 0,
+  20, 0, 0, 18, 0, 0, 91, 0, 0, 56,
+  0, 0, 0, 0, 0, 21, 6, 68, 0, 0,
+  3, 66, 22, 26, 0, 44, 1, 12, 25, 0,
+  0, 0, 0, 0, 35, 19, 0, 0, 0, 0,
+  0, 41, 0, 0, 0, 9, 0, 13, 0, 4,
+  17, 0, 0, 0, 11, 90, 12, 0, 37, 0,
+  34, 0, 44, 0, 0, 20, 0, 0, 71, 0,
+  0, 58, 0, 66, 0, 22, 34, 0, 4, 12,
+  0, 0, 14, 0, 0, 0, 11, 67, 48, 0,
+  47, 25, 46, 0, 0, 0, 0, 0, 2, 0,
+  0, 5, 16, 47, 0, 0, 0, 1, 0, 93,
+  0, 9, 0, 23, 27, 12, 0, 4, 70, 6,
+  57, 62, 45, 37, 28, 1, 0, 0, 18, 8,
+  3, 27, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 58, 63, 0,
+  7, 0, 21, 41, 98, 32, 26, 34, 16, 64,
+  0, 150, 62, 63, 48, 14, 52, 0, 0, 72,
+  12, 0, 54, 79, 175, 35, 0, 0, 104, 0,
+  8, 0, 3, 53, 0, 34, 0, 0, 0, 32,
+  8, 71, 0, 0, 0, 50, 34, 80, 101, 18,
+  30, 0, 24, 14, 0, 49, 0, 0, 0, 16,
+  0, 0, 47, 0, 11, 29, 0, 0, 63, 28,
+  0, 75, 0, 60, 0, 1, 62, 4, 40, 45,
+  0, 23, 18, 40, 92, 24, 106, 1, 0, 0,
+  68, 0, 17, 0, 31, 98, 42, 0, 7, 0,
+  83, 0, 3, 51, 27, 30, 31, 0, 16, 5,
+  20, 0, 0, 18, 0, 32, 51, 0, 76, 0,
+  65, 0, 38, 22, 50, 21, 117, 0, 0, 33,
+  0, 34, 48, 0, 0, 21, 0, 97, 0, 11,
+  24, 76, 56, 29, 7, 79, 14, 26, 0, 0,
+  21, 72, 178, 23, 2, 77, 15, 0, 0, 17,
+  0, 58, 0, 0, 0, 0, 23, 6, 0, 52,
+  0, 0, 0, 0, 17, 138, 16, 0, 76, 0,
+  43, 0, 26, 0, 0, 0, 10, 14, 41, 10,
+  2, 8, 11, 125, 0, 0, 81, 0, 0, 29,
+  11, 26, 12, 0, 0, 0, 1, 82, 0, 0,
+  46, 37, 66, 0, 39, 0, 0, 0, 91, 0,
+  6, 0, 15, 66, 24, 0, 23, 6, 85, 90,
+  0, 23, 0, 0, 42, 20, 11, 6, 52, 0,
+  44, 28, 0, 49, 48, 0, 0, 0, 21, 0,
+  24, 28, 37, 2, 61, 0, 0, 73, 0, 0,
+  0, 0, 0, 0, 0, 114, 0, 0, 5, 58,
+  36, 11, 0, 72, 12, 49, 0, 0, 26, 41,
+  217, 0, 0, 48, 0, 41, 0, 0, 6, 3,
+  0, 0, 0, 0, 13, 0, 0, 63, 19, 55,
+  0, 0, 20, 92, 0, 0, 70, 0, 42, 0,
+  39, 0, 25, 1, 0, 0, 74, 12, 10, 4,
+  28, 139, 25, 13, 70, 0, 0, 6, 18, 0,
+  2, 4, 0, 0, 4, 80, 0, 0, 46, 48,
+  69, 0, 0, 0, 12, 0, 60, 0, 0, 0,
+  11, 29, 28, 90, 42, 8, 49, 129, 4, 0,
+  0, 1, 4, 23, 0, 0, 30, 66, 51, 23,
+  16, 39, 2, 0, 0, 0, 0, 0, 0, 44,
+  0, 0, 92, 0, 0, 76, 0, 0, 44, 0,
+  0, 15, 13, 93, 0, 13, 41, 74, 27, 0,
+  22, 35, 4, 32, 0, 0, 0, 34, 0, 0,
+  18, 4, 5, 0, 0, 0, 14, 65, 0, 0,
+  0, 14, 0, 0, 0, 18, 0, 0, 0, 0,
+  19, 112, 26, 0, 66, 0, 49, 0, 1, 0,
+  0, 12, 0, 0, 37, 7, 27, 10, 26, 96,
+  0, 0, 36, 15, 0, 30, 0, 21, 0, 0,
+  0, 0, 33, 83, 0, 28, 14, 34, 42, 0,
+  16, 32, 0, 0, 39, 0, 0, 0, 13, 107,
+  45, 0, 0, 0, 3, 18, 0, 20, 0, 5,
+  17, 0, 0, 0, 49, 0, 46, 44, 22, 4,
+  0, 0, 0, 0, 20, 0, 0, 18, 0, 0,
+  91, 0, 0, 56, 0, 0, 0, 0, 0, 21,
+  6, 68, 0, 0, 3, 66, 22, 26, 0, 44,
+  1, 12, 25, 0, 0, 0, 0, 0, 35, 19,
+  0, 0, 0, 0, 0, 41, 0, 0, 0, 9,
+  0, 13, 0, 4, 17, 0, 0, 0, 11, 90,
+  12, 0, 37, 0, 34, 0, 44, 0, 0, 20,
+  0, 0, 71, 0, 0, 58, 0, 66, 0, 22,
+  34, 0, 4, 12, 0, 0, 14, 0, 0, 0,
+  11, 67, 48, 0, 47, 25, 46, 0, 0, 0,
+  0, 0, 2, 0, 0, 5, 16, 47, 0, 0,
+  0, 1, 0, 93, 0, 9, 0, 23, 27, 12,
+  0, 4, 70, 6, 57, 62, 45, 37, 28, 1,
+  0, 0, 18, 8, 3, 27, 0, 16, 49, 0,
+  0, 5, 31, 0, 1, 0, 0, 6, 0, 41,
+  0, 0, 0, 25, 35, 4, 0, 0, 0, 52,
+  24, 0, 16, 5, 179, 11, 21, 0, 23, 0,
+  0, 0, 0, 11, 0, 43, 0, 24, 1, 8,
+  2, 65, 31, 0, 0, 0, 0, 37, 49, 0,
+  7, 0, 6, 0, 40, 14, 28, 28, 0, 0,
+  0, 18, 44, 18, 0, 7, 0, 39, 35, 0,
+  13, 18, 0, 0, 20, 0, 17, 2, 0, 51,
+  0, 0, 32, 30, 78, 35, 0, 0, 40, 0,
+  0, 22, 0, 0, 33, 23, 14, 18, 8, 0,
+  15, 74, 44, 16, 21, 36, 0, 12, 0, 0,
+  6, 34, 56, 40, 46, 34, 33, 8, 0, 0,
+  18, 0, 14, 30, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 50, 21,
+  117, 0, 0, 33, 0, 34, 48, 0, 0, 21,
+  0, 97, 0, 11, 24, 76, 56, 29, 7, 79,
+  14, 26, 0, 0, 21, 72, 178, 23, 2, 77,
+  15, 0, 0, 17, 0, 58, 0, 0, 0, 0,
+  23, 6, 0, 52, 0, 0, 0, 0, 17, 138,
+  16, 0, 76, 0, 43, 0, 26, 0, 0, 0,
+  10, 14, 41, 10, 2, 8, 11, 125, 0, 0,
+  81, 0, 0, 29, 11, 26, 12, 0, 0, 0,
+  1, 82, 0, 0, 46, 37, 66, 0, 39, 0,
+  0, 0, 91, 0, 6, 0, 15, 66, 24, 0,
+  23, 6, 85, 90, 0, 23, 0, 0, 42, 20,
+  11, 6, 52, 0, 44, 28, 0, 49, 48, 0,
+  0, 0, 21, 0, 24, 28, 37, 2, 61, 0,
+  0, 73, 0, 0, 0, 0, 0, 0, 0, 114,
+  0, 0, 5, 58, 36, 11, 0, 72, 12, 49,
+  0, 0, 26, 41, 217, 0, 0, 48, 0, 41,
+  0, 0, 6, 3, 0, 0, 0, 0, 13, 0,
+  0, 63, 19, 55, 0, 0, 20, 92, 0, 0,
+  70, 0, 42, 0, 39, 0, 25, 1, 0, 0,
+  74, 12, 10, 4, 28, 139, 25, 13, 70, 0,
+  0, 6, 18, 0, 2, 4, 0, 0, 4, 80,
+  0, 0, 46, 48, 69, 0, 0, 0, 12, 0,
+  60, 0, 0, 0, 11, 29, 28, 90, 42, 8,
+  49, 129, 4, 0, 0, 1, 4, 23, 0, 0,
+  30, 66, 51, 23, 16, 39, 2, 0, 0, 0,
+  0, 0, 0, 44, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 91, 0, 0, 56, 0, 0,
+  0, 0, 0, 21, 6, 68, 0, 0, 3, 66,
+  22, 26, 0, 44, 1, 12, 25, 0, 0, 0,
+  0, 0, 35, 19, 0, 0, 0, 0, 0, 41,
+  0, 0, 0, 9, 0, 13, 0, 4, 17, 0,
+  0, 0, 11, 90, 12, 0, 37, 0, 34, 0,
+  44, 0, 0, 20, 0, 0, 71, 0, 0, 58,
+  0, 66, 0, 22, 34, 0, 4, 12, 0, 0,
+  14, 0, 0, 0, 11, 67, 48, 0, 47, 25,
+  46, 0, 0, 0, 0, 0, 2, 0, 0, 5,
+  16, 47, 0, 0, 0, 1, 0, 93, 0, 9,
+  0, 23, 27, 12, 0, 4, 70, 6, 57, 62,
+  45, 37, 28, 1, 0, 0, 18, 8, 3, 27,
+  0, 16, 49, 0, 0, 5, 31, 0, 1, 0,
+  0, 6, 0, 41, 0, 0, 0, 25, 35, 4,
+  0, 0, 0, 52, 24, 0, 16, 5, 179, 11,
+  21, 0, 23, 0, 0, 0, 0, 11, 0, 43,
+  0, 24, 1, 8, 2, 65, 31, 0, 0, 0,
+  0, 37, 49, 0, 7, 0, 6, 0, 40, 14,
+  28, 28, 0, 0, 0, 18, 44, 18, 0, 7,
+  0, 39, 35, 0, 13, 18, 0, 0, 20, 0,
+  17, 2, 0, 51, 0, 0, 32, 30, 78, 35,
+  0, 0, 40, 0, 0, 22, 0, 0, 33, 23,
+  14, 18, 8, 0, 15, 74, 44, 16, 21, 36,
+  0, 12, 0, 0, 6, 34, 56, 40, 46, 34,
+  33, 8, 0, 0, 18, 0, 14, 30, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 14, 0, 0, 0,
+  63, 31, 0, 36, 15, 0, 0, 12, 10, 93,
+  23, 78, 37, 39, 52, 0, 44, 62, 9, 23,
+  34, 48, 251, 53, 0, 0, 103, 0, 11, 0,
+  0, 19, 12, 43, 34, 0, 10, 7, 84, 61,
+  0, 22, 0, 69, 0, 28, 41, 0, 20, 0,
+  7, 14, 0, 3, 6, 7, 15, 0, 0, 16,
+  25, 16, 0, 28, 0, 14, 83, 9, 21, 62,
+  7, 4, 7, 0, 53, 0, 16, 0, 0, 1,
+  0, 4, 66, 24, 50, 9, 0, 0, 69, 27,
+  15, 2, 14, 33, 3, 0, 1, 18, 73, 0,
+  43, 0, 0, 6, 26, 16, 10, 44, 0, 0,
+  22, 18, 0, 41, 77, 0, 0, 0, 0, 0,
+  27, 20, 27, 77, 56, 1, 0, 0, 53, 33,
+  0, 26, 0, 19, 15, 40, 3, 80, 27, 70,
+  9, 40, 13, 19, 51, 56, 1, 0, 62, 39,
+  168, 33, 0, 2, 112, 0, 35, 0, 0, 8,
+  0, 15, 15, 0, 16, 4, 70, 57, 0, 21,
+  0, 58, 0, 81, 74, 0, 31, 0, 4, 0,
+  0, 0, 31, 0, 5, 36, 0, 9, 25, 0,
+  0, 65, 0, 19, 22, 10, 17, 20, 19, 22,
+  19, 0, 39, 0, 23, 18, 0, 9, 5, 21,
+  68, 17, 39, 0, 0, 0, 34, 0, 67, 16,
+  7, 35, 9, 16, 42, 18, 111, 0, 19, 7,
+  30, 4, 45, 33, 26, 6, 0, 0, 14, 0,
+  1, 30, 86, 0, 9, 0, 3, 0, 26, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 21,
+  64, 6, 0, 0, 17, 8, 0, 10, 24, 0,
+  0, 65, 0, 74, 92, 76, 35, 40, 22, 3,
+  39, 33, 0, 0, 31, 58, 156, 6, 15, 0,
+  58, 0, 0, 0, 0, 18, 0, 18, 5, 27,
+  0, 0, 53, 31, 0, 18, 0, 0, 0, 47,
+  40, 0, 10, 0, 0, 9, 0, 6, 28, 0,
+  0, 0, 0, 7, 44, 0, 48, 45, 0, 16,
+  17, 16, 28, 6, 22, 3, 0, 16, 38, 0,
+  14, 0, 0, 13, 0, 23, 45, 25, 8, 25,
+  0, 0, 67, 0, 51, 0, 0, 39, 3, 0,
+  27, 11, 67, 0, 18, 0, 0, 0, 20, 21,
+  9, 43, 3, 0, 12, 0, 0, 0, 64, 0,
+  5, 0, 0, 0, 55, 0, 56, 59, 50, 27,
+  4, 0, 2, 0, 0, 0, 8, 0, 48, 60,
+  4, 28, 76, 49, 0, 0, 0, 6, 1, 61,
+  24, 0, 35, 40, 0, 0, 13, 0, 67, 0,
+  0, 0, 0, 0, 0, 1, 0, 66, 2, 0,
+  30, 28, 26, 42, 0, 12, 0, 69, 96, 0,
+  23, 0, 0, 0, 0, 0, 51, 0, 0, 65,
+  0, 8, 82, 0, 40, 45, 0, 20, 0, 33,
+  32, 0, 14, 3, 0, 16, 42, 0, 37, 0,
+  0, 30, 0, 27, 36, 9, 13, 0, 0, 22,
+  2, 0, 70, 5, 0, 64, 0, 23, 40, 0,
+  76, 0, 6, 0, 58, 8, 17, 40, 5, 0,
+  26, 0, 1, 0, 0, 0, 39, 0, 71, 0,
+  10, 9, 14, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 47, 23, 86, 28, 0, 0, 29, 6,
+  18, 0, 12, 0, 0, 94, 0, 55, 94, 25,
+  14, 29, 7, 39, 13, 18, 25, 0, 29, 32,
+  164, 9, 5, 45, 79, 0, 0, 0, 0, 37,
+  0, 0, 0, 4, 0, 10, 7, 71, 53, 0,
+  0, 0, 0, 40, 22, 15, 17, 0, 13, 0,
+  0, 3, 39, 29, 0, 0, 0, 0, 72, 0,
+  119, 51, 0, 0, 21, 0, 24, 0, 65, 11,
+  0, 23, 14, 0, 42, 0, 0, 26, 0, 0,
+  59, 5, 0, 16, 0, 5, 15, 0, 38, 1,
+  14, 93, 25, 0, 14, 51, 54, 47, 12, 0,
+  25, 0, 4, 10, 0, 41, 10, 0, 18, 0,
+  17, 0, 59, 0, 0, 0, 0, 24, 48, 21,
+  43, 69, 0, 8, 5, 11, 0, 0, 0, 0,
+  0, 0, 16, 73, 0, 0, 82, 18, 0, 0,
+  0, 41, 0, 50, 15, 0, 5, 16, 0, 0,
+  0, 19, 83, 23, 0, 0, 0, 9, 0, 0,
+  0, 6, 0, 0, 9, 74, 35, 102, 0, 0,
+  0, 29, 56, 0, 22, 0, 18, 0, 0, 0,
+  78, 24, 0, 51, 0, 0, 97, 0, 107, 49,
+  0, 0, 4, 13, 45, 0, 27, 0, 0, 5,
+  25, 0, 35, 12, 0, 12, 0, 6, 0, 6,
+  0, 26, 0, 19, 1, 0, 34, 0, 12, 95,
+  20, 81, 35, 21, 44, 44, 10, 0, 51, 0,
+  0, 63, 0, 7, 0, 0, 0, 0, 11, 0,
+  22, 0, 33, 0, 0, 27, 27, 0, 0, 39,
+  14, 0, 0, 0, 63, 31, 0, 36, 15, 0,
+  0, 12, 10, 93, 23, 78, 37, 39, 52, 0,
+  44, 62, 9, 23, 34, 48, 251, 53, 0, 0,
+  103, 0, 11, 0, 0, 19, 12, 43, 34, 0,
+  10, 7, 84, 61, 0, 22, 0, 69, 0, 28,
+  41, 0, 20, 0, 7, 14, 0, 3, 6, 7,
+  15, 0, 0, 16, 25, 16, 0, 28, 0, 14,
+  83, 9, 21, 62, 7, 4, 7, 0, 53, 0,
+  16, 0, 0, 1, 0, 4, 66, 24, 50, 9,
+  0, 0, 69, 27, 15, 2, 14, 33, 3, 0,
+  1, 18, 73, 0, 43, 0, 0, 6, 26, 16,
+  10, 44, 0, 0, 22, 18, 0, 41, 77, 0,
+  0, 0, 0, 0, 27, 20, 27, 77, 56, 1,
+  0, 0, 53, 33, 0, 26, 0, 19, 15, 40,
+  3, 80, 27, 70, 9, 40, 13, 19, 51, 56,
+  1, 0, 62, 39, 168, 33, 0, 2, 112, 0,
+  35, 0, 0, 8, 0, 15, 15, 0, 16, 4,
+  70, 57, 0, 21, 0, 58, 0, 81, 74, 0,
+  31, 0, 4, 0, 0, 0, 31, 0, 5, 36,
+  0, 9, 25, 0, 0, 65, 0, 19, 22, 10,
+  17, 20, 19, 22, 19, 0, 39, 0, 23, 18,
+  0, 9, 5, 21, 68, 17, 39, 0, 0, 0,
+  34, 0, 67, 16, 7, 35, 9, 16, 42, 18,
+  111, 0, 19, 7, 30, 4, 45, 33, 26, 6,
+  0, 0, 14, 0, 1, 30, 86, 0, 9, 0,
+  3, 0, 26, 19, 51, 73, 59, 31, 0, 25,
+  25, 27, 1, 0, 0, 49, 62, 54, 0, 17,
+  9, 31, 5, 0, 0, 97, 24, 47, 40, 0,
+  67, 36, 173, 0, 0, 93, 100, 0, 16, 5,
+  0, 0, 0, 8, 0, 0, 58, 12, 35, 124,
+  53, 23, 0, 49, 0, 76, 26, 0, 69, 0,
+  16, 0, 0, 0, 74, 49, 11, 40, 2, 17,
+  33, 10, 4, 69, 21, 19, 13, 0, 5, 0,
+  39, 35, 1, 0, 24, 0, 46, 72, 0, 11,
+  18, 1, 41, 28, 0, 0, 0, 0, 0, 0,
+  56, 0, 0, 45, 33, 55, 30, 39, 114, 0,
+  28, 15, 40, 0, 15, 24, 15, 0, 0, 0,
+  36, 0, 25, 27, 59, 0, 0, 0, 16, 0,
+  11, 50, 12, 21, 64, 6, 0, 0, 17, 8,
+  0, 10, 24, 0, 0, 65, 0, 74, 92, 76,
+  35, 40, 22, 3, 39, 33, 0, 0, 31, 58,
+  156, 6, 15, 0, 58, 0, 0, 0, 0, 18,
+  0, 18, 5, 27, 0, 0, 53, 31, 0, 18,
+  0, 0, 0, 47, 40, 0, 10, 0, 0, 9,
+  0, 6, 28, 0, 0, 0, 0, 7, 44, 0,
+  48, 45, 0, 16, 17, 16, 28, 6, 22, 3,
+  0, 16, 38, 0, 14, 0, 0, 13, 0, 23,
+  45, 25, 8, 25, 0, 0, 67, 0, 51, 0,
+  0, 39, 3, 0, 27, 11, 67, 0, 18, 0,
+  0, 0, 20, 21, 9, 43, 3, 0, 12, 0,
+  0, 0, 64, 0, 5, 0, 0, 0, 55, 0,
+  56, 59, 50, 27, 4, 0, 2, 0, 0, 0,
+  8, 0, 48, 60, 4, 28, 76, 49, 0, 0,
+  0, 6, 1, 61, 24, 0, 35, 40, 0, 0,
+  13, 0, 67, 0, 0, 0, 0, 0, 0, 1,
+  0, 66, 2, 0, 30, 28, 26, 42, 0, 12,
+  0, 69, 96, 0, 23, 0, 0, 0, 0, 0,
+  51, 0, 0, 65, 0, 8, 82, 0, 40, 45,
+  0, 20, 0, 33, 32, 0, 14, 3, 0, 16,
+  42, 0, 37, 0, 0, 30, 0, 27, 36, 9,
+  13, 0, 0, 22, 2, 0, 70, 5, 0, 64,
+  0, 23, 40, 0, 76, 0, 6, 0, 58, 8,
+  17, 40, 5, 0, 26, 0, 1, 0, 0, 0,
+  39, 0, 71, 0, 10, 9, 14, 0, 2, 55,
+  59, 38, 4, 35, 16, 13, 17, 0, 0, 16,
+  84, 0, 0, 22, 51, 18, 0, 0, 0, 56,
+  0, 33, 67, 0, 5, 30, 0, 0, 0, 43,
+  70, 0, 18, 0, 0, 0, 0, 41, 0, 35,
+  57, 2, 29, 80, 44, 19, 0, 21, 0, 34,
+  36, 10, 35, 0, 10, 0, 0, 0, 30, 26,
+  0, 32, 0, 0, 35, 1, 27, 0, 0, 17,
+  9, 19, 26, 0, 10, 16, 0, 22, 23, 0,
+  61, 69, 0, 5, 0, 0, 0, 42, 5, 0,
+  0, 31, 0, 24, 35, 0, 0, 65, 2, 0,
+  10, 12, 63, 0, 37, 0, 27, 0, 0, 14,
+  0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
+  41, 0, 35, 0, 8, 0, 47, 23, 86, 28,
+  0, 0, 29, 6, 18, 0, 12, 0, 0, 94,
+  0, 55, 94, 25, 14, 29, 7, 39, 13, 18,
+  25, 0, 29, 32, 164, 9, 5, 45, 79, 0,
+  0, 0, 0, 37, 0, 0, 0, 4, 0, 10,
+  7, 71, 53, 0, 0, 0, 0, 40, 22, 15,
+  17, 0, 13, 0, 0, 3, 39, 29, 0, 0,
+  0, 0, 72, 0, 119, 51, 0, 0, 21, 0,
+  24, 0, 65, 11, 0, 23, 14, 0, 42, 0,
+  0, 26, 0, 0, 59, 5, 0, 16, 0, 5,
+  15, 0, 38, 1, 14, 93, 25, 0, 14, 51,
+  54, 47, 12, 0, 25, 0, 4, 10, 0, 41,
+  10, 0, 18, 0, 17, 0, 59, 0, 0, 0,
+  0, 24, 48, 21, 43, 69, 0, 8, 5, 11,
+  0, 0, 0, 0, 0, 0, 16, 73, 0, 0,
+  82, 18, 0, 0, 0, 41, 0, 50, 15, 0,
+  5, 16, 0, 0, 0, 19, 83, 23, 0, 0,
+  0, 9, 0, 0, 0, 6, 0, 0, 9, 74,
+  35, 102, 0, 0, 0, 29, 56, 0, 22, 0,
+  18, 0, 0, 0, 78, 24, 0, 51, 0, 0,
+  97, 0, 107, 49, 0, 0, 4, 13, 45, 0,
+  27, 0, 0, 5, 25, 0, 35, 12, 0, 12,
+  0, 6, 0, 6, 0, 26, 0, 19, 1, 0,
+  34, 0, 12, 95, 20, 81, 35, 21, 44, 44,
+  10, 0, 51, 0, 0, 63, 0, 7, 0, 0,
+  0, 0, 11, 0, 22, 0, 33, 0, 0, 27,
+  27, 0, 0, 39, 39, 29, 0, 48, 7, 15,
+  23, 0, 0, 11, 81, 0, 0, 23, 58, 7,
+  0, 0, 0, 63, 0, 21, 41, 0, 0, 12,
+  0, 0, 0, 32, 67, 3, 1, 0, 0, 13,
+  0, 47, 0, 18, 41, 13, 22, 69, 25, 53,
+  0, 12, 0, 37, 21, 7, 22, 0, 22, 0,
+  0, 0, 16, 31, 0, 29, 0, 0, 7, 0,
+  37, 0, 18, 0, 9, 21, 4, 0, 5, 11,
+  0, 39, 27, 0, 62, 62, 0, 0, 0, 0,
+  0, 18, 1, 0, 0, 19, 0, 19, 32, 0,
+  0, 78, 11, 0, 0, 10, 15, 0, 33, 0,
+  0, 0, 0, 8, 0, 0, 0, 0, 7, 0,
+  0, 0, 0, 0, 38, 0, 39, 0, 9, 0,
+  27, 77, 56, 1, 0, 0, 53, 33, 0, 26,
+  0, 19, 15, 40, 3, 80, 27, 70, 9, 40,
+  13, 19, 51, 56, 1, 0, 62, 39, 168, 33,
+  0, 2, 112, 0, 35, 0, 0, 8, 0, 15,
+  15, 0, 16, 4, 70, 57, 0, 21, 0, 58,
+  0, 81, 74, 0, 31, 0, 4, 0, 0, 0,
+  31, 0, 5, 36, 0, 9, 25, 0, 0, 65,
+  0, 19, 22, 10, 17, 20, 19, 22, 19, 0,
+  39, 0, 23, 18, 0, 9, 5, 21, 68, 17,
+  39, 0, 0, 0, 34, 0, 67, 16, 7, 35,
+  9, 16, 42, 18, 111, 0, 19, 7, 30, 4,
+  45, 33, 26, 6, 0, 0, 14, 0, 1, 30,
+  86, 0, 9, 0, 3, 0, 26, 19, 51, 73,
+  59, 31, 0, 25, 25, 27, 1, 0, 0, 49,
+  62, 54, 0, 17, 9, 31, 5, 0, 0, 97,
+  24, 47, 40, 0, 67, 36, 173, 0, 0, 93,
+  100, 0, 16, 5, 0, 0, 0, 8, 0, 0,
+  58, 12, 35, 124, 53, 23, 0, 49, 0, 76,
+  26, 0, 69, 0, 16, 0, 0, 0, 74, 49,
+  11, 40, 2, 17, 33, 10, 4, 69, 21, 19,
+  13, 0, 5, 0, 39, 35, 1, 0, 24, 0,
+  46, 72, 0, 11, 18, 1, 41, 28, 0, 0,
+  0, 0, 0, 0, 56, 0, 0, 45, 33, 55,
+  30, 39, 114, 0, 28, 15, 40, 0, 15, 24,
+  15, 0, 0, 0, 36, 0, 25, 27, 59, 0,
+  0, 0, 16, 0, 11, 50, 1, 0, 0, 19,
+  11, 92, 28, 0, 0, 0, 0, 57, 41, 55,
+  0, 0, 0, 21, 17, 3, 0, 71, 14, 58,
+  40, 0, 38, 15, 173, 20, 0, 66, 63, 35,
+  0, 0, 0, 0, 0, 44, 0, 0, 10, 45,
+  6, 158, 67, 62, 0, 26, 0, 54, 50, 0,
+  21, 0, 34, 0, 34, 0, 70, 66, 0, 18,
+  13, 4, 36, 35, 62, 39, 52, 9, 43, 0,
+  28, 0, 37, 0, 0, 0, 49, 0, 22, 62,
+  0, 0, 39, 14, 21, 0, 0, 25, 16, 0,
+  24, 37, 0, 0, 11, 49, 15, 31, 12, 45,
+  82, 9, 31, 0, 0, 16, 0, 14, 0, 7,
+  0, 44, 106, 21, 47, 22, 46, 0, 0, 0,
+  16, 0, 13, 16, 56, 59, 50, 27, 4, 0,
+  2, 0, 0, 0, 8, 0, 48, 60, 4, 28,
+  76, 49, 0, 0, 0, 6, 1, 61, 24, 0,
+  35, 40, 0, 0, 13, 0, 67, 0, 0, 0,
+  0, 0, 0, 1, 0, 66, 2, 0, 30, 28,
+  26, 42, 0, 12, 0, 69, 96, 0, 23, 0,
+  0, 0, 0, 0, 51, 0, 0, 65, 0, 8,
+  82, 0, 40, 45, 0, 20, 0, 33, 32, 0,
+  14, 3, 0, 16, 42, 0, 37, 0, 0, 30,
+  0, 27, 36, 9, 13, 0, 0, 22, 2, 0,
+  70, 5, 0, 64, 0, 23, 40, 0, 76, 0,
+  6, 0, 58, 8, 17, 40, 5, 0, 26, 0,
+  1, 0, 0, 0, 39, 0, 71, 0, 10, 9,
+  14, 0, 2, 55, 59, 38, 4, 35, 16, 13,
+  17, 0, 0, 16, 84, 0, 0, 22, 51, 18,
+  0, 0, 0, 56, 0, 33, 67, 0, 5, 30,
+  0, 0, 0, 43, 70, 0, 18, 0, 0, 0,
+  0, 41, 0, 35, 57, 2, 29, 80, 44, 19,
+  0, 21, 0, 34, 36, 10, 35, 0, 10, 0,
+  0, 0, 30, 26, 0, 32, 0, 0, 35, 1,
+  27, 0, 0, 17, 9, 19, 26, 0, 10, 16,
+  0, 22, 23, 0, 61, 69, 0, 5, 0, 0,
+  0, 42, 5, 0, 0, 31, 0, 24, 35, 0,
+  0, 65, 2, 0, 10, 12, 63, 0, 37, 0,
+  27, 0, 0, 14, 0, 0, 0, 0, 0, 0,
+  0, 0, 4, 0, 41, 0, 35, 0, 8, 0,
+  0, 0, 0, 18, 14, 124, 8, 0, 7, 0,
+  0, 29, 52, 11, 0, 6, 15, 0, 0, 0,
+  0, 77, 2, 24, 40, 0, 0, 9, 0, 14,
+  0, 31, 15, 32, 0, 0, 0, 21, 0, 76,
+  0, 37, 0, 65, 12, 85, 61, 31, 0, 0,
+  0, 31, 31, 4, 2, 0, 40, 0, 18, 0,
+  23, 69, 0, 16, 12, 9, 0, 29, 58, 0,
+  39, 20, 11, 0, 25, 21, 19, 0, 0, 29,
+  42, 0, 16, 44, 15, 0, 11, 0, 0, 8,
+  0, 6, 0, 0, 4, 72, 0, 0, 0, 72,
+  0, 0, 4, 12, 57, 0, 27, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 77, 0, 47, 0,
+  6, 3, 0, 0, 55, 0, 22, 0, 43, 69,
+  0, 8, 5, 11, 0, 0, 0, 0, 0, 0,
+  16, 73, 0, 0, 82, 18, 0, 0, 0, 41,
+  0, 50, 15, 0, 5, 16, 0, 0, 0, 19,
+  83, 23, 0, 0, 0, 9, 0, 0, 0, 6,
+  0, 0, 9, 74, 35, 102, 0, 0, 0, 29,
+  56, 0, 22, 0, 18, 0, 0, 0, 78, 24,
+  0, 51, 0, 0, 97, 0, 107, 49, 0, 0,
+  4, 13, 45, 0, 27, 0, 0, 5, 25, 0,
+  35, 12, 0, 12, 0, 6, 0, 6, 0, 26,
+  0, 19, 1, 0, 34, 0, 12, 95, 20, 81,
+  35, 21, 44, 44, 10, 0, 51, 0, 0, 63,
+  0, 7, 0, 0, 0, 0, 11, 0, 22, 0,
+  33, 0, 0, 27, 27, 0, 0, 39, 39, 29,
+  0, 48, 7, 15, 23, 0, 0, 11, 81, 0,
+  0, 23, 58, 7, 0, 0, 0, 63, 0, 21,
+  41, 0, 0, 12, 0, 0, 0, 32, 67, 3,
+  1, 0, 0, 13, 0, 47, 0, 18, 41, 13,
+  22, 69, 25, 53, 0, 12, 0, 37, 21, 7,
+  22, 0, 22, 0, 0, 0, 16, 31, 0, 29,
+  0, 0, 7, 0, 37, 0, 18, 0, 9, 21,
+  4, 0, 5, 11, 0, 39, 27, 0, 62, 62,
+  0, 0, 0, 0, 0, 18, 1, 0, 0, 19,
+  0, 19, 32, 0, 0, 78, 11, 0, 0, 10,
+  15, 0, 33, 0, 0, 0, 0, 8, 0, 0,
+  0, 0, 7, 0, 0, 0, 0, 0, 38, 0,
+  39, 0, 9, 0, 0, 0, 0, 12, 0, 128,
+  4, 0, 24, 0, 0, 24, 44, 0, 0, 3,
+  15, 0, 0, 0, 17, 87, 14, 19, 11, 0,
+  0, 0, 0, 0, 0, 22, 19, 26, 0, 6,
+  0, 37, 0, 56, 0, 21, 0, 56, 0, 77,
+  54, 47, 0, 0, 0, 41, 15, 0, 2, 0,
+  67, 0, 29, 0, 3, 66, 0, 12, 54, 5,
+  0, 16, 73, 0, 77, 17, 14, 1, 0, 19,
+  20, 20, 0, 39, 27, 0, 45, 41, 10, 0,
+  5, 0, 0, 0, 0, 17, 0, 0, 0, 33,
+  0, 0, 7, 75, 14, 0, 0, 3, 5, 0,
+  19, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+  93, 0, 37, 0, 0, 0, 0, 0, 36, 0,
+  0, 0, 51, 73, 59, 31, 0, 25, 25, 27,
+  1, 0, 0, 49, 62, 54, 0, 17, 9, 31,
+  5, 0, 0, 97, 24, 47, 40, 0, 67, 36,
+  173, 0, 0, 93, 100, 0, 16, 5, 0, 0,
+  0, 8, 0, 0, 58, 12, 35, 124, 53, 23,
+  0, 49, 0, 76, 26, 0, 69, 0, 16, 0,
+  0, 0, 74, 49, 11, 40, 2, 17, 33, 10,
+  4, 69, 21, 19, 13, 0, 5, 0, 39, 35,
+  1, 0, 24, 0, 46, 72, 0, 11, 18, 1,
+  41, 28, 0, 0, 0, 0, 0, 0, 56, 0,
+  0, 45, 33, 55, 30, 39, 114, 0, 28, 15,
+  40, 0, 15, 24, 15, 0, 0, 0, 36, 0,
+  25, 27, 59, 0, 0, 0, 16, 0, 11, 50,
+  1, 0, 0, 19, 11, 92, 28, 0, 0, 0,
+  0, 57, 41, 55, 0, 0, 0, 21, 17, 3,
+  0, 71, 14, 58, 40, 0, 38, 15, 173, 20,
+  0, 66, 63, 35, 0, 0, 0, 0, 0, 44,
+  0, 0, 10, 45, 6, 158, 67, 62, 0, 26,
+  0, 54, 50, 0, 21, 0, 34, 0, 34, 0,
+  70, 66, 0, 18, 13, 4, 36, 35, 62, 39,
+  52, 9, 43, 0, 28, 0, 37, 0, 0, 0,
+  49, 0, 22, 62, 0, 0, 39, 14, 21, 0,
+  0, 25, 16, 0, 24, 37, 0, 0, 11, 49,
+  15, 31, 12, 45, 82, 9, 31, 0, 0, 16,
+  0, 14, 0, 7, 0, 44, 106, 21, 47, 22,
+  46, 0, 0, 0, 16, 0, 13, 16, 0, 38,
+  0, 0, 45, 3, 47, 0, 0, 5, 2, 35,
+  43, 41, 0, 12, 6, 26, 23, 27, 41, 0,
+  0, 68, 18, 30, 36, 25, 149, 46, 0, 0,
+  61, 42, 0, 0, 0, 0, 0, 81, 0, 0,
+  0, 48, 15, 76, 31, 35, 0, 47, 0, 53,
+  104, 0, 0, 15, 21, 0, 0, 5, 36, 26,
+  0, 63, 0, 10, 50, 5, 36, 4, 6, 13,
+  12, 0, 42, 49, 0, 0, 30, 0, 84, 0,
+  8, 23, 8, 1, 28, 38, 67, 0, 15, 10,
+  39, 0, 22, 34, 0, 0, 46, 45, 0, 15,
+  23, 0, 43, 0, 19, 15, 9, 58, 9, 7,
+  0, 4, 0, 0, 41, 21, 33, 22, 54, 6,
+  20, 0, 41, 0, 6, 0, 2, 55, 59, 38,
+  4, 35, 16, 13, 17, 0, 0, 16, 84, 0,
+  0, 22, 51, 18, 0, 0, 0, 56, 0, 33,
+  67, 0, 5, 30, 0, 0, 0, 43, 70, 0,
+  18, 0, 0, 0, 0, 41, 0, 35, 57, 2,
+  29, 80, 44, 19, 0, 21, 0, 34, 36, 10,
+  35, 0, 10, 0, 0, 0, 30, 26, 0, 32,
+  0, 0, 35, 1, 27, 0, 0, 17, 9, 19,
+  26, 0, 10, 16, 0, 22, 23, 0, 61, 69,
+  0, 5, 0, 0, 0, 42, 5, 0, 0, 31,
+  0, 24, 35, 0, 0, 65, 2, 0, 10, 12,
+  63, 0, 37, 0, 27, 0, 0, 14, 0, 0,
+  0, 0, 0, 0, 0, 0, 4, 0, 41, 0,
+  35, 0, 8, 0, 0, 0, 0, 18, 14, 124,
+  8, 0, 7, 0, 0, 29, 52, 11, 0, 6,
+  15, 0, 0, 0, 0, 77, 2, 24, 40, 0,
+  0, 9, 0, 14, 0, 31, 15, 32, 0, 0,
+  0, 21, 0, 76, 0, 37, 0, 65, 12, 85,
+  61, 31, 0, 0, 0, 31, 31, 4, 2, 0,
+  40, 0, 18, 0, 23, 69, 0, 16, 12, 9,
+  0, 29, 58, 0, 39, 20, 11, 0, 25, 21,
+  19, 0, 0, 29, 42, 0, 16, 44, 15, 0,
+  11, 0, 0, 8, 0, 6, 0, 0, 4, 72,
+  0, 0, 0, 72, 0, 0, 4, 12, 57, 0,
+  27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  77, 0, 47, 0, 6, 3, 0, 0, 55, 0,
+  22, 0, 0, 12, 0, 0, 34, 31, 37, 0,
+  16, 0, 1, 11, 52, 11, 10, 28, 23, 12,
+  0, 12, 51, 0, 0, 50, 24, 48, 0, 15,
+  0, 35, 0, 0, 38, 48, 0, 0, 0, 6,
+  0, 75, 0, 43, 0, 59, 29, 41, 15, 15,
+  0, 19, 0, 15, 107, 18, 0, 0, 17, 0,
+  0, 28, 25, 21, 0, 41, 0, 0, 45, 6,
+  26, 0, 0, 8, 0, 14, 33, 51, 4, 0,
+  0, 28, 84, 14, 0, 6, 19, 0, 12, 21,
+  18, 26, 0, 9, 9, 21, 0, 72, 0, 4,
+  31, 72, 0, 0, 2, 0, 39, 0, 26, 7,
+  9, 48, 0, 0, 0, 3, 0, 0, 39, 24,
+  41, 0, 37, 0, 84, 0, 64, 0, 13, 0,
+  0, 39, 39, 29, 0, 48, 7, 15, 23, 0,
+  0, 11, 81, 0, 0, 23, 58, 7, 0, 0,
+  0, 63, 0, 21, 41, 0, 0, 12, 0, 0,
+  0, 32, 67, 3, 1, 0, 0, 13, 0, 47,
+  0, 18, 41, 13, 22, 69, 25, 53, 0, 12,
+  0, 37, 21, 7, 22, 0, 22, 0, 0, 0,
+  16, 31, 0, 29, 0, 0, 7, 0, 37, 0,
+  18, 0, 9, 21, 4, 0, 5, 11, 0, 39,
+  27, 0, 62, 62, 0, 0, 0, 0, 0, 18,
+  1, 0, 0, 19, 0, 19, 32, 0, 0, 78,
+  11, 0, 0, 10, 15, 0, 33, 0, 0, 0,
+  0, 8, 0, 0, 0, 0, 7, 0, 0, 0,
+  0, 0, 38, 0, 39, 0, 9, 0, 0, 0,
+  0, 12, 0, 128, 4, 0, 24, 0, 0, 24,
+  44, 0, 0, 3, 15, 0, 0, 0, 17, 87,
+  14, 19, 11, 0, 0, 0, 0, 0, 0, 22,
+  19, 26, 0, 6, 0, 37, 0, 56, 0, 21,
+  0, 56, 0, 77, 54, 47, 0, 0, 0, 41,
+  15, 0, 2, 0, 67, 0, 29, 0, 3, 66,
+  0, 12, 54, 5, 0, 16, 73, 0, 77, 17,
+  14, 1, 0, 19, 20, 20, 0, 39, 27, 0,
+  45, 41, 10, 0, 5, 0, 0, 0, 0, 17,
+  0, 0, 0, 33, 0, 0, 7, 75, 14, 0,
+  0, 3, 5, 0, 19, 0, 0, 0, 0, 0,
+  0, 14, 0, 0, 93, 0, 37, 0, 0, 0,
+  0, 0, 36, 0, 0, 0, 0, 0, 0, 0,
+  0, 48, 47, 0, 22, 0, 0, 0, 38, 0,
+  10, 49, 31, 17, 0, 15, 62, 0, 0, 40,
+  0, 20, 12, 0, 0, 26, 0, 0, 64, 55,
+  8, 0, 0, 16, 0, 41, 0, 28, 0, 56,
+  0, 45, 21, 45, 0, 12, 2, 10, 93, 9,
+  0, 9, 48, 0, 0, 35, 16, 4, 0, 1,
+  0, 0, 17, 7, 42, 0, 2, 3, 0, 21,
+  13, 42, 3, 0, 0, 26, 69, 0, 18, 2,
+  18, 0, 12, 0, 9, 8, 0, 31, 0, 8,
+  5, 29, 0, 0, 36, 54, 18, 0, 0, 0,
+  1, 0, 24, 4, 0, 31, 0, 1, 0, 19,
+  0, 0, 51, 3, 32, 0, 21, 0, 83, 0,
+  35, 0, 4, 0, 1, 0, 0, 19, 11, 92,
+  28, 0, 0, 0, 0, 57, 41, 55, 0, 0,
+  0, 21, 17, 3, 0, 71, 14, 58, 40, 0,
+  38, 15, 173, 20, 0, 66, 63, 35, 0, 0,
+  0, 0, 0, 44, 0, 0, 10, 45, 6, 158,
+  67, 62, 0, 26, 0, 54, 50, 0, 21, 0,
+  34, 0, 34, 0, 70, 66, 0, 18, 13, 4,
+  36, 35, 62, 39, 52, 9, 43, 0, 28, 0,
+  37, 0, 0, 0, 49, 0, 22, 62, 0, 0,
+  39, 14, 21, 0, 0, 25, 16, 0, 24, 37,
+  0, 0, 11, 49, 15, 31, 12, 45, 82, 9,
+  31, 0, 0, 16, 0, 14, 0, 7, 0, 44,
+  106, 21, 47, 22, 46, 0, 0, 0, 16, 0,
+  13, 16, 0, 38, 0, 0, 45, 3, 47, 0,
+  0, 5, 2, 35, 43, 41, 0, 12, 6, 26,
+  23, 27, 41, 0, 0, 68, 18, 30, 36, 25,
+  149, 46, 0, 0, 61, 42, 0, 0, 0, 0,
+  0, 81, 0, 0, 0, 48, 15, 76, 31, 35,
+  0, 47, 0, 53, 104, 0, 0, 15, 21, 0,
+  0, 5, 36, 26, 0, 63, 0, 10, 50, 5,
+  36, 4, 6, 13, 12, 0, 42, 49, 0, 0,
+  30, 0, 84, 0, 8, 23, 8, 1, 28, 38,
+  67, 0, 15, 10, 39, 0, 22, 34, 0, 0,
+  46, 45, 0, 15, 23, 0, 43, 0, 19, 15,
+  9, 58, 9, 7, 0, 4, 0, 0, 41, 21,
+  33, 22, 54, 6, 20, 0, 41, 0, 6, 0,
+  0, 46, 0, 5, 8, 0, 87, 3, 13, 14,
+  0, 39, 38, 29, 17, 42, 21, 66, 26, 57,
+  83, 0, 35, 35, 10, 13, 59, 37, 156, 43,
+  0, 0, 97, 0, 28, 0, 0, 0, 0, 60,
+  0, 0, 0, 58, 6, 89, 17, 14, 0, 43,
+  0, 39, 81, 11, 0, 0, 23, 0, 0, 26,
+  0, 12, 14, 12, 0, 0, 12, 25, 19, 1,
+  23, 0, 31, 0, 56, 15, 12, 6, 36, 0,
+  63, 0, 17, 12, 2, 0, 24, 1, 58, 22,
+  24, 0, 0, 0, 11, 31, 0, 0, 72, 22,
+  0, 0, 23, 0, 40, 0, 15, 32, 13, 36,
+  18, 8, 0, 1, 0, 0, 17, 8, 16, 23,
+  55, 3, 28, 0, 23, 0, 16, 0, 0, 0,
+  0, 18, 14, 124, 8, 0, 7, 0, 0, 29,
+  52, 11, 0, 6, 15, 0, 0, 0, 0, 77,
+  2, 24, 40, 0, 0, 9, 0, 14, 0, 31,
+  15, 32, 0, 0, 0, 21, 0, 76, 0, 37,
+  0, 65, 12, 85, 61, 31, 0, 0, 0, 31,
+  31, 4, 2, 0, 40, 0, 18, 0, 23, 69,
+  0, 16, 12, 9, 0, 29, 58, 0, 39, 20,
+  11, 0, 25, 21, 19, 0, 0, 29, 42, 0,
+  16, 44, 15, 0, 11, 0, 0, 8, 0, 6,
+  0, 0, 4, 72, 0, 0, 0, 72, 0, 0,
+  4, 12, 57, 0, 27, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 77, 0, 47, 0, 6, 3,
+  0, 0, 55, 0, 22, 0, 0, 12, 0, 0,
+  34, 31, 37, 0, 16, 0, 1, 11, 52, 11,
+  10, 28, 23, 12, 0, 12, 51, 0, 0, 50,
+  24, 48, 0, 15, 0, 35, 0, 0, 38, 48,
+  0, 0, 0, 6, 0, 75, 0, 43, 0, 59,
+  29, 41, 15, 15, 0, 19, 0, 15, 107, 18,
+  0, 0, 17, 0, 0, 28, 25, 21, 0, 41,
+  0, 0, 45, 6, 26, 0, 0, 8, 0, 14,
+  33, 51, 4, 0, 0, 28, 84, 14, 0, 6,
+  19, 0, 12, 21, 18, 26, 0, 9, 9, 21,
+  0, 72, 0, 4, 31, 72, 0, 0, 2, 0,
+  39, 0, 26, 7, 9, 48, 0, 0, 0, 3,
+  0, 0, 39, 24, 41, 0, 37, 0, 84, 0,
+  64, 0, 13, 0, 0, 32, 0, 0, 20, 0,
+  56, 0, 35, 0, 0, 29, 28, 20, 52, 24,
+  39, 50, 3, 36, 95, 0, 10, 21, 21, 25,
+  9, 34, 0, 29, 0, 0, 63, 0, 10, 0,
+  0, 0, 0, 48, 0, 3, 0, 63, 16, 61,
+  5, 1, 0, 6, 0, 3, 79, 33, 0, 0,
+  18, 0, 0, 7, 0, 7, 0, 0, 0, 0,
+  32, 20, 20, 0, 0, 0, 0, 0, 62, 0,
+  13, 2, 0, 6, 67, 26, 0, 0, 6, 0,
+  7, 0, 11, 49, 18, 0, 0, 4, 0, 55,
+  0, 6, 64, 36, 0, 0, 3, 0, 34, 0,
+  22, 9, 31, 35, 0, 0, 0, 0, 0, 0,
+  14, 2, 12, 0, 45, 0, 77, 0, 41, 0,
+  26, 0, 0, 0, 0, 12, 0, 128, 4, 0,
+  24, 0, 0, 24, 44, 0, 0, 3, 15, 0,
+  0, 0, 17, 87, 14, 19, 11, 0, 0, 0,
+  0, 0, 0, 22, 19, 26, 0, 6, 0, 37,
+  0, 56, 0, 21, 0, 56, 0, 77, 54, 47,
+  0, 0, 0, 41, 15, 0, 2, 0, 67, 0,
+  29, 0, 3, 66, 0, 12, 54, 5, 0, 16,
+  73, 0, 77, 17, 14, 1, 0, 19, 20, 20,
+  0, 39, 27, 0, 45, 41, 10, 0, 5, 0,
+  0, 0, 0, 17, 0, 0, 0, 33, 0, 0,
+  7, 75, 14, 0, 0, 3, 5, 0, 19, 0,
+  0, 0, 0, 0, 0, 14, 0, 0, 93, 0,
+  37, 0, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 0, 0, 0, 0, 48, 47, 0, 22, 0,
+  0, 0, 38, 0, 10, 49, 31, 17, 0, 15,
+  62, 0, 0, 40, 0, 20, 12, 0, 0, 26,
+  0, 0, 64, 55, 8, 0, 0, 16, 0, 41,
+  0, 28, 0, 56, 0, 45, 21, 45, 0, 12,
+  2, 10, 93, 9, 0, 9, 48, 0, 0, 35,
+  16, 4, 0, 1, 0, 0, 17, 7, 42, 0,
+  2, 3, 0, 21, 13, 42, 3, 0, 0, 26,
+  69, 0, 18, 2, 18, 0, 12, 0, 9, 8,
+  0, 31, 0, 8, 5, 29, 0, 0, 36, 54,
+  18, 0, 0, 0, 1, 0, 24, 4, 0, 31,
+  0, 1, 0, 19, 0, 0, 51, 3, 32, 0,
+  21, 0, 83, 0, 35, 0, 4, 0, 0, 9,
+  0, 0, 15, 0, 57, 0, 37, 0, 0, 0,
+  30, 12, 51, 40, 45, 47, 0, 28, 101, 0,
+  0, 27, 0, 9, 25, 8, 0, 23, 0, 0,
+  52, 4, 22, 0, 0, 12, 0, 35, 0, 7,
+  0, 70, 5, 54, 4, 16, 0, 0, 13, 8,
+  68, 27, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 23, 1, 27, 0, 0, 0,
+  0, 10, 48, 0, 7, 9, 0, 11, 57, 13,
+  9, 0, 13, 0, 0, 0, 22, 29, 9, 0,
+  0, 15, 0, 34, 0, 0, 59, 37, 0, 0,
+  0, 0, 12, 0, 17, 14, 11, 27, 0, 0,
+  0, 5, 0, 0, 24, 0, 14, 0, 27, 0,
+  77, 0, 21, 0, 13, 0, 0, 38, 0, 0,
+  45, 3, 47, 0, 0, 5, 2, 35, 43, 41,
+  0, 12, 6, 26, 23, 27, 41, 0, 0, 68,
+  18, 30, 36, 25, 149, 46, 0, 0, 61, 42,
+  0, 0, 0, 0, 0, 81, 0, 0, 0, 48,
+  15, 76, 31, 35, 0, 47, 0, 53, 104, 0,
+  0, 15, 21, 0, 0, 5, 36, 26, 0, 63,
+  0, 10, 50, 5, 36, 4, 6, 13, 12, 0,
+  42, 49, 0, 0, 30, 0, 84, 0, 8, 23,
+  8, 1, 28, 38, 67, 0, 15, 10, 39, 0,
+  22, 34, 0, 0, 46, 45, 0, 15, 23, 0,
+  43, 0, 19, 15, 9, 58, 9, 7, 0, 4,
+  0, 0, 41, 21, 33, 22, 54, 6, 20, 0,
+  41, 0, 6, 0, 0, 46, 0, 5, 8, 0,
+  87, 3, 13, 14, 0, 39, 38, 29, 17, 42,
+  21, 66, 26, 57, 83, 0, 35, 35, 10, 13,
+  59, 37, 156, 43, 0, 0, 97, 0, 28, 0,
+  0, 0, 0, 60, 0, 0, 0, 58, 6, 89,
+  17, 14, 0, 43, 0, 39, 81, 11, 0, 0,
+  23, 0, 0, 26, 0, 12, 14, 12, 0, 0,
+  12, 25, 19, 1, 23, 0, 31, 0, 56, 15,
+  12, 6, 36, 0, 63, 0, 17, 12, 2, 0,
+  24, 1, 58, 22, 24, 0, 0, 0, 11, 31,
+  0, 0, 72, 22, 0, 0, 23, 0, 40, 0,
+  15, 32, 13, 36, 18, 8, 0, 1, 0, 0,
+  17, 8, 16, 23, 55, 3, 28, 0, 23, 0,
+  16, 0, 0, 26, 0, 19, 10, 0, 77, 11,
+  23, 31, 0, 35, 23, 57, 9, 52, 22, 74,
+  37, 27, 102, 0, 0, 31, 15, 13, 55, 46,
+  154, 59, 0, 4, 97, 0, 27, 0, 0, 0,
+  0, 55, 0, 0, 0, 52, 12, 66, 15, 9,
+  0, 41, 0, 76, 57, 46, 4, 14, 7, 0,
+  0, 16, 0, 0, 24, 8, 0, 8, 10, 17,
+  12, 30, 0, 0, 27, 0, 37, 13, 12, 0,
+  23, 0, 76, 0, 17, 2, 0, 0, 21, 18,
+  71, 15, 30, 0, 0, 0, 29, 12, 20, 0,
+  83, 41, 0, 0, 20, 0, 63, 0, 2, 35,
+  27, 25, 17, 5, 25, 0, 6, 0, 30, 0,
+  13, 13, 58, 0, 47, 0, 29, 0, 20, 0,
+  0, 12, 0, 0, 34, 31, 37, 0, 16, 0,
+  1, 11, 52, 11, 10, 28, 23, 12, 0, 12,
+  51, 0, 0, 50, 24, 48, 0, 15, 0, 35,
+  0, 0, 38, 48, 0, 0, 0, 6, 0, 75,
+  0, 43, 0, 59, 29, 41, 15, 15, 0, 19,
+  0, 15, 107, 18, 0, 0, 17, 0, 0, 28,
+  25, 21, 0, 41, 0, 0, 45, 6, 26, 0,
+  0, 8, 0, 14, 33, 51, 4, 0, 0, 28,
+  84, 14, 0, 6, 19, 0, 12, 21, 18, 26,
+  0, 9, 9, 21, 0, 72, 0, 4, 31, 72,
+  0, 0, 2, 0, 39, 0, 26, 7, 9, 48,
+  0, 0, 0, 3, 0, 0, 39, 24, 41, 0,
+  37, 0, 84, 0, 64, 0, 13, 0, 0, 32,
+  0, 0, 20, 0, 56, 0, 35, 0, 0, 29,
+  28, 20, 52, 24, 39, 50, 3, 36, 95, 0,
+  10, 21, 21, 25, 9, 34, 0, 29, 0, 0,
+  63, 0, 10, 0, 0, 0, 0, 48, 0, 3,
+  0, 63, 16, 61, 5, 1, 0, 6, 0, 3,
+  79, 33, 0, 0, 18, 0, 0, 7, 0, 7,
+  0, 0, 0, 0, 32, 20, 20, 0, 0, 0,
+  0, 0, 62, 0, 13, 2, 0, 6, 67, 26,
+  0, 0, 6, 0, 7, 0, 11, 49, 18, 0,
+  0, 4, 0, 55, 0, 6, 64, 36, 0, 0,
+  3, 0, 34, 0, 22, 9, 31, 35, 0, 0,
+  0, 0, 0, 0, 14, 2, 12, 0, 45, 0,
+  77, 0, 41, 0, 26, 0, 0, 27, 0, 15,
+  17, 0, 54, 0, 26, 19, 0, 24, 19, 41,
+  54, 36, 42, 53, 0, 29, 105, 0, 0, 24,
+  36, 35, 13, 47, 0, 36, 0, 0, 67, 9,
+  22, 0, 0, 0, 0, 30, 0, 0, 0, 58,
+  16, 44, 12, 18, 0, 3, 21, 11, 61, 51,
+  0, 0, 3, 0, 0, 16, 0, 0, 0, 0,
+  0, 0, 38, 18, 25, 0, 0, 0, 0, 0,
+  56, 0, 14, 7, 0, 10, 79, 42, 2, 0,
+  11, 0, 6, 6, 16, 33, 14, 0, 0, 12,
+  0, 42, 0, 6, 83, 38, 0, 0, 5, 0,
+  37, 0, 29, 9, 43, 27, 0, 0, 1, 0,
+  0, 0, 12, 0, 2, 0, 32, 0, 100, 0,
+  40, 0, 22, 0, 0, 0, 0, 0, 0, 48,
+  47, 0, 22, 0, 0, 0, 38, 0, 10, 49,
+  31, 17, 0, 15, 62, 0, 0, 40, 0, 20,
+  12, 0, 0, 26, 0, 0, 64, 55, 8, 0,
+  0, 16, 0, 41, 0, 28, 0, 56, 0, 45,
+  21, 45, 0, 12, 2, 10, 93, 9, 0, 9,
+  48, 0, 0, 35, 16, 4, 0, 1, 0, 0,
+  17, 7, 42, 0, 2, 3, 0, 21, 13, 42,
+  3, 0, 0, 26, 69, 0, 18, 2, 18, 0,
+  12, 0, 9, 8, 0, 31, 0, 8, 5, 29,
+  0, 0, 36, 54, 18, 0, 0, 0, 1, 0,
+  24, 4, 0, 31, 0, 1, 0, 19, 0, 0,
+  51, 3, 32, 0, 21, 0, 83, 0, 35, 0,
+  4, 0, 0, 9, 0, 0, 15, 0, 57, 0,
+  37, 0, 0, 0, 30, 12, 51, 40, 45, 47,
+  0, 28, 101, 0, 0, 27, 0, 9, 25, 8,
+  0, 23, 0, 0, 52, 4, 22, 0, 0, 12,
+  0, 35, 0, 7, 0, 70, 5, 54, 4, 16,
+  0, 0, 13, 8, 68, 27, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 23, 1,
+  27, 0, 0, 0, 0, 10, 48, 0, 7, 9,
+  0, 11, 57, 13, 9, 0, 13, 0, 0, 0,
+  22, 29, 9, 0, 0, 15, 0, 34, 0, 0,
+  59, 37, 0, 0, 0, 0, 12, 0, 17, 14,
+  11, 27, 0, 0, 0, 5, 0, 0, 24, 0,
+  14, 0, 27, 0, 77, 0, 21, 0, 13, 0,
+  0, 33, 0, 0, 27, 0, 41, 0, 45, 22,
+  0, 7, 22, 44, 69, 48, 60, 49, 0, 17,
+  100, 0, 0, 26, 19, 29, 19, 25, 0, 21,
+  0, 0, 29, 10, 19, 0, 0, 21, 0, 35,
+  0, 0, 0, 56, 7, 31, 16, 4, 0, 0,
+  48, 0, 33, 46, 0, 2, 16, 0, 0, 12,
+  0, 0, 0, 0, 0, 0, 48, 0, 33, 0,
+  0, 0, 0, 6, 51, 0, 15, 23, 0, 30,
+  42, 35, 0, 0, 24, 0, 0, 0, 26, 42,
+  0, 0, 0, 46, 0, 27, 0, 13, 75, 38,
+  0, 0, 0, 0, 17, 0, 16, 5, 28, 44,
+  0, 0, 0, 5, 8, 0, 2, 0, 24, 0,
+  4, 0, 105, 0, 27, 6, 32, 0, 0, 46,
+  0, 5, 8, 0, 87, 3, 13, 14, 0, 39,
+  38, 29, 17, 42, 21, 66, 26, 57, 83, 0,
+  35, 35, 10, 13, 59, 37, 156, 43, 0, 0,
+  97, 0, 28, 0, 0, 0, 0, 60, 0, 0,
+  0, 58, 6, 89, 17, 14, 0, 43, 0, 39,
+  81, 11, 0, 0, 23, 0, 0, 26, 0, 12,
+  14, 12, 0, 0, 12, 25, 19, 1, 23, 0,
+  31, 0, 56, 15, 12, 6, 36, 0, 63, 0,
+  17, 12, 2, 0, 24, 1, 58, 22, 24, 0,
+  0, 0, 11, 31, 0, 0, 72, 22, 0, 0,
+  23, 0, 40, 0, 15, 32, 13, 36, 18, 8,
+  0, 1, 0, 0, 17, 8, 16, 23, 55, 3,
+  28, 0, 23, 0, 16, 0, 0, 26, 0, 19,
+  10, 0, 77, 11, 23, 31, 0, 35, 23, 57,
+  9, 52, 22, 74, 37, 27, 102, 0, 0, 31,
+  15, 13, 55, 46, 154, 59, 0, 4, 97, 0,
+  27, 0, 0, 0, 0, 55, 0, 0, 0, 52,
+  12, 66, 15, 9, 0, 41, 0, 76, 57, 46,
+  4, 14, 7, 0, 0, 16, 0, 0, 24, 8,
+  0, 8, 10, 17, 12, 30, 0, 0, 27, 0,
+  37, 13, 12, 0, 23, 0, 76, 0, 17, 2,
+  0, 0, 21, 18, 71, 15, 30, 0, 0, 0,
+  29, 12, 20, 0, 83, 41, 0, 0, 20, 0,
+  63, 0, 2, 35, 27, 25, 17, 5, 25, 0,
+  6, 0, 30, 0, 13, 13, 58, 0, 47, 0,
+  29, 0, 20, 0, 0, 16, 0, 14, 1, 0,
+  63, 29, 23, 32, 0, 13, 0, 45, 0, 47,
+  19, 68, 39, 6, 67, 0, 0, 42, 12, 16,
+  57, 47, 121, 62, 0, 0, 87, 0, 30, 0,
+  0, 0, 0, 41, 0, 0, 0, 17, 8, 43,
+  25, 0, 0, 37, 11, 79, 44, 41, 28, 6,
+  2, 20, 0, 16, 0, 0, 13, 18, 0, 16,
+  25, 5, 1, 40, 0, 0, 44, 0, 27, 34,
+  0, 0, 27, 0, 77, 0, 17, 14, 0, 0,
+  18, 24, 76, 0, 60, 4, 0, 4, 30, 0,
+  46, 0, 60, 49, 0, 0, 9, 0, 57, 0,
+  0, 18, 38, 31, 23, 17, 38, 0, 21, 0,
+  27, 0, 7, 10, 58, 0, 64, 0, 40, 0,
+  0, 0, 0, 32, 0, 0, 20, 0, 56, 0,
+  35, 0, 0, 29, 28, 20, 52, 24, 39, 50,
+  3, 36, 95, 0, 10, 21, 21, 25, 9, 34,
+  0, 29, 0, 0, 63, 0, 10, 0, 0, 0,
+  0, 48, 0, 3, 0, 63, 16, 61, 5, 1,
+  0, 6, 0, 3, 79, 33, 0, 0, 18, 0,
+  0, 7, 0, 7, 0, 0, 0, 0, 32, 20,
+  20, 0, 0, 0, 0, 0, 62, 0, 13, 2,
+  0, 6, 67, 26, 0, 0, 6, 0, 7, 0,
+  11, 49, 18, 0, 0, 4, 0, 55, 0, 6,
+  64, 36, 0, 0, 3, 0, 34, 0, 22, 9,
+  31, 35, 0, 0, 0, 0, 0, 0, 14, 2,
+  12, 0, 45, 0, 77, 0, 41, 0, 26, 0,
+  0, 27, 0, 15, 17, 0, 54, 0, 26, 19,
+  0, 24, 19, 41, 54, 36, 42, 53, 0, 29,
+  105, 0, 0, 24, 36, 35, 13, 47, 0, 36,
+  0, 0, 67, 9, 22, 0, 0, 0, 0, 30,
+  0, 0, 0, 58, 16, 44, 12, 18, 0, 3,
+  21, 11, 61, 51, 0, 0, 3, 0, 0, 16,
+  0, 0, 0, 0, 0, 0, 38, 18, 25, 0,
+  0, 0, 0, 0, 56, 0, 14, 7, 0, 10,
+  79, 42, 2, 0, 11, 0, 6, 6, 16, 33,
+  14, 0, 0, 12, 0, 42, 0, 6, 83, 38,
+  0, 0, 5, 0, 37, 0, 29, 9, 43, 27,
+  0, 0, 1, 0, 0, 0, 12, 0, 2, 0,
+  32, 0, 100, 0, 40, 0, 22, 0, 0, 22,
+  0, 0, 8, 0, 32, 0, 33, 28, 0, 1,
+  0, 29, 40, 48, 56, 56, 12, 13, 56, 0,
+  0, 29, 28, 42, 16, 56, 0, 19, 0, 0,
+  57, 2, 6, 0, 0, 0, 0, 24, 0, 0,
+  0, 16, 1, 14, 21, 10, 0, 5, 37, 5,
+  41, 38, 0, 11, 0, 24, 0, 42, 0, 0,
+  0, 0, 0, 0, 70, 24, 23, 0, 0, 0,
+  11, 21, 44, 0, 8, 0, 0, 12, 70, 39,
+  7, 8, 19, 29, 0, 28, 16, 3, 38, 30,
+  0, 36, 4, 7, 0, 4, 60, 56, 0, 0,
+  5, 0, 33, 0, 12, 9, 35, 35, 0, 12,
+  2, 0, 10, 0, 0, 0, 0, 0, 6, 0,
+  111, 0, 30, 0, 9, 0, 0, 9, 0, 0,
+  15, 0, 57, 0, 37, 0, 0, 0, 30, 12,
+  51, 40, 45, 47, 0, 28, 101, 0, 0, 27,
+  0, 9, 25, 8, 0, 23, 0, 0, 52, 4,
+  22, 0, 0, 12, 0, 35, 0, 7, 0, 70,
+  5, 54, 4, 16, 0, 0, 13, 8, 68, 27,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 23, 1, 27, 0, 0, 0, 0, 10,
+  48, 0, 7, 9, 0, 11, 57, 13, 9, 0,
+  13, 0, 0, 0, 22, 29, 9, 0, 0, 15,
+  0, 34, 0, 0, 59, 37, 0, 0, 0, 0,
+  12, 0, 17, 14, 11, 27, 0, 0, 0, 5,
+  0, 0, 24, 0, 14, 0, 27, 0, 77, 0,
+  21, 0, 13, 0, 0, 33, 0, 0, 27, 0,
+  41, 0, 45, 22, 0, 7, 22, 44, 69, 48,
+  60, 49, 0, 17, 100, 0, 0, 26, 19, 29,
+  19, 25, 0, 21, 0, 0, 29, 10, 19, 0,
+  0, 21, 0, 35, 0, 0, 0, 56, 7, 31,
+  16, 4, 0, 0, 48, 0, 33, 46, 0, 2,
+  16, 0, 0, 12, 0, 0, 0, 0, 0, 0,
+  48, 0, 33, 0, 0, 0, 0, 6, 51, 0,
+  15, 23, 0, 30, 42, 35, 0, 0, 24, 0,
+  0, 0, 26, 42, 0, 0, 0, 46, 0, 27,
+  0, 13, 75, 38, 0, 0, 0, 0, 17, 0,
+  16, 5, 28, 44, 0, 0, 0, 5, 8, 0,
+  2, 0, 24, 0, 4, 0, 105, 0, 27, 6,
+  32, 0, 0, 33, 0, 0, 36, 0, 0, 3,
+  48, 28, 0, 0, 10, 59, 39, 46, 67, 44,
+  12, 0, 51, 0, 0, 36, 0, 22, 41, 60,
+  0, 0, 0, 0, 19, 0, 7, 0, 0, 22,
+  0, 24, 0, 0, 0, 4, 0, 17, 23, 0,
+  0, 0, 55, 0, 1, 17, 0, 0, 18, 15,
+  0, 17, 0, 0, 0, 0, 0, 0, 102, 0,
+  17, 0, 0, 0, 5, 41, 35, 0, 3, 53,
+  0, 13, 18, 38, 12, 42, 10, 28, 0, 30,
+  22, 26, 21, 17, 0, 42, 0, 0, 0, 2,
+  49, 55, 1, 0, 0, 0, 16, 0, 14, 19,
+  32, 69, 0, 3, 0, 0, 21, 0, 0, 0,
+  17, 0, 0, 13, 100, 0, 0, 0, 30, 37,
+  0, 26, 0, 19, 10, 0, 77, 11, 23, 31,
+  0, 35, 23, 57, 9, 52, 22, 74, 37, 27,
+  102, 0, 0, 31, 15, 13, 55, 46, 154, 59,
+  0, 4, 97, 0, 27, 0, 0, 0, 0, 55,
+  0, 0, 0, 52, 12, 66, 15, 9, 0, 41,
+  0, 76, 57, 46, 4, 14, 7, 0, 0, 16,
+  0, 0, 24, 8, 0, 8, 10, 17, 12, 30,
+  0, 0, 27, 0, 37, 13, 12, 0, 23, 0,
+  76, 0, 17, 2, 0, 0, 21, 18, 71, 15,
+  30, 0, 0, 0, 29, 12, 20, 0, 83, 41,
+  0, 0, 20, 0, 63, 0, 2, 35, 27, 25,
+  17, 5, 25, 0, 6, 0, 30, 0, 13, 13,
+  58, 0, 47, 0, 29, 0, 20, 0, 0, 16,
+  0, 14, 1, 0, 63, 29, 23, 32, 0, 13,
+  0, 45, 0, 47, 19, 68, 39, 6, 67, 0,
+  0, 42, 12, 16, 57, 47, 121, 62, 0, 0,
+  87, 0, 30, 0, 0, 0, 0, 41, 0, 0,
+  0, 17, 8, 43, 25, 0, 0, 37, 11, 79,
+  44, 41, 28, 6, 2, 20, 0, 16, 0, 0,
+  13, 18, 0, 16, 25, 5, 1, 40, 0, 0,
+  44, 0, 27, 34, 0, 0, 27, 0, 77, 0,
+  17, 14, 0, 0, 18, 24, 76, 0, 60, 4,
+  0, 4, 30, 0, 46, 0, 60, 49, 0, 0,
+  9, 0, 57, 0, 0, 18, 38, 31, 23, 17,
+  38, 0, 21, 0, 27, 0, 7, 10, 58, 0,
+  64, 0, 40, 0, 0, 0, 0, 26, 0, 7,
+  2, 0, 63, 38, 23, 37, 2, 6, 0, 40,
+  0, 45, 6, 67, 46, 14, 38, 0, 0, 48,
+  16, 24, 55, 58, 112, 45, 0, 0, 68, 0,
+  26, 0, 0, 0, 0, 44, 0, 0, 0, 2,
+  1, 25, 39, 0, 0, 36, 14, 72, 25, 35,
+  35, 0, 0, 49, 0, 21, 0, 0, 16, 34,
+  0, 26, 35, 0, 2, 44, 0, 0, 64, 0,
+  29, 35, 0, 1, 39, 0, 66, 5, 11, 30,
+  0, 6, 14, 27, 89, 0, 74, 5, 0, 3,
+  35, 0, 49, 0, 45, 48, 0, 0, 10, 0,
+  56, 0, 0, 23, 42, 24, 30, 23, 39, 0,
+  31, 0, 11, 0, 7, 13, 40, 0, 62, 0,
+  52, 0, 0, 2, 0, 27, 0, 15, 17, 0,
+  54, 0, 26, 19, 0, 24, 19, 41, 54, 36,
+  42, 53, 0, 29, 105, 0, 0, 24, 36, 35,
+  13, 47, 0, 36, 0, 0, 67, 9, 22, 0,
+  0, 0, 0, 30, 0, 0, 0, 58, 16, 44,
+  12, 18, 0, 3, 21, 11, 61, 51, 0, 0,
+  3, 0, 0, 16, 0, 0, 0, 0, 0, 0,
+  38, 18, 25, 0, 0, 0, 0, 0, 56, 0,
+  14, 7, 0, 10, 79, 42, 2, 0, 11, 0,
+  6, 6, 16, 33, 14, 0, 0, 12, 0, 42,
+  0, 6, 83, 38, 0, 0, 5, 0, 37, 0,
+  29, 9, 43, 27, 0, 0, 1, 0, 0, 0,
+  12, 0, 2, 0, 32, 0, 100, 0, 40, 0,
+  22, 0, 0, 22, 0, 0, 8, 0, 32, 0,
+  33, 28, 0, 1, 0, 29, 40, 48, 56, 56,
+  12, 13, 56, 0, 0, 29, 28, 42, 16, 56,
+  0, 19, 0, 0, 57, 2, 6, 0, 0, 0,
+  0, 24, 0, 0, 0, 16, 1, 14, 21, 10,
+  0, 5, 37, 5, 41, 38, 0, 11, 0, 24,
+  0, 42, 0, 0, 0, 0, 0, 0, 70, 24,
+  23, 0, 0, 0, 11, 21, 44, 0, 8, 0,
+  0, 12, 70, 39, 7, 8, 19, 29, 0, 28,
+  16, 3, 38, 30, 0, 36, 4, 7, 0, 4,
+  60, 56, 0, 0, 5, 0, 33, 0, 12, 9,
+  35, 35, 0, 12, 2, 0, 10, 0, 0, 0,
+  0, 0, 6, 0, 111, 0, 30, 0, 9, 0,
+  0, 40, 0, 0, 15, 0, 26, 0, 40, 45,
+  1, 0, 0, 24, 16, 54, 51, 59, 27, 8,
+  15, 0, 0, 41, 35, 63, 9, 78, 0, 0,
+  8, 0, 21, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 0, 0, 0, 0, 38, 0, 0, 5,
+  22, 8, 24, 27, 0, 0, 0, 65, 0, 36,
+  0, 0, 0, 33, 0, 2, 97, 14, 35, 0,
+  0, 0, 20, 36, 43, 5, 0, 0, 0, 9,
+  52, 53, 0, 20, 31, 37, 0, 46, 33, 0,
+  42, 41, 0, 48, 0, 0, 2, 16, 45, 62,
+  0, 0, 12, 0, 34, 0, 0, 17, 24, 34,
+  0, 27, 0, 0, 25, 0, 0, 14, 10, 0,
+  0, 8, 110, 0, 42, 0, 17, 9, 0, 33,
+  0, 0, 27, 0, 41, 0, 45, 22, 0, 7,
+  22, 44, 69, 48, 60, 49, 0, 17, 100, 0,
+  0, 26, 19, 29, 19, 25, 0, 21, 0, 0,
+  29, 10, 19, 0, 0, 21, 0, 35, 0, 0,
+  0, 56, 7, 31, 16, 4, 0, 0, 48, 0,
+  33, 46, 0, 2, 16, 0, 0, 12, 0, 0,
+  0, 0, 0, 0, 48, 0, 33, 0, 0, 0,
+  0, 6, 51, 0, 15, 23, 0, 30, 42, 35,
+  0, 0, 24, 0, 0, 0, 26, 42, 0, 0,
+  0, 46, 0, 27, 0, 13, 75, 38, 0, 0,
+  0, 0, 17, 0, 16, 5, 28, 44, 0, 0,
+  0, 5, 8, 0, 2, 0, 24, 0, 4, 0,
+  105, 0, 27, 6, 32, 0, 0, 33, 0, 0,
+  36, 0, 0, 3, 48, 28, 0, 0, 10, 59,
+  39, 46, 67, 44, 12, 0, 51, 0, 0, 36,
+  0, 22, 41, 60, 0, 0, 0, 0, 19, 0,
+  7, 0, 0, 22, 0, 24, 0, 0, 0, 4,
+  0, 17, 23, 0, 0, 0, 55, 0, 1, 17,
+  0, 0, 18, 15, 0, 17, 0, 0, 0, 0,
+  0, 0, 102, 0, 17, 0, 0, 0, 5, 41,
+  35, 0, 3, 53, 0, 13, 18, 38, 12, 42,
+  10, 28, 0, 30, 22, 26, 21, 17, 0, 42,
+  0, 0, 0, 2, 49, 55, 1, 0, 0, 0,
+  16, 0, 14, 19, 32, 69, 0, 3, 0, 0,
+  21, 0, 0, 0, 17, 0, 0, 13, 100, 0,
+  0, 0, 30, 37, 12, 0, 30, 0, 18, 0,
+  0, 0, 37, 30, 0, 0, 4, 71, 11, 0,
+  44, 48, 26, 0, 25, 1, 22, 8, 0, 6,
+  34, 49, 0, 0, 16, 0, 0, 5, 0, 0,
+  40, 32, 0, 1, 1, 0, 0, 0, 0, 0,
+  9, 0, 0, 0, 31, 0, 0, 10, 0, 0,
+  0, 51, 0, 0, 2, 6, 23, 5, 0, 0,
+  106, 5, 12, 82, 0, 0, 6, 39, 0, 0,
+  0, 50, 1, 0, 0, 34, 0, 54, 42, 31,
+  0, 69, 0, 0, 0, 56, 0, 0, 20, 0,
+  0, 15, 19, 45, 10, 6, 0, 0, 0, 0,
+  0, 21, 1, 57, 6, 0, 0, 0, 53, 11,
+  0, 0, 15, 0, 0, 26, 8, 0, 0, 12,
+  42, 48, 0, 16, 0, 14, 1, 0, 63, 29,
+  23, 32, 0, 13, 0, 45, 0, 47, 19, 68,
+  39, 6, 67, 0, 0, 42, 12, 16, 57, 47,
+  121, 62, 0, 0, 87, 0, 30, 0, 0, 0,
+  0, 41, 0, 0, 0, 17, 8, 43, 25, 0,
+  0, 37, 11, 79, 44, 41, 28, 6, 2, 20,
+  0, 16, 0, 0, 13, 18, 0, 16, 25, 5,
+  1, 40, 0, 0, 44, 0, 27, 34, 0, 0,
+  27, 0, 77, 0, 17, 14, 0, 0, 18, 24,
+  76, 0, 60, 4, 0, 4, 30, 0, 46, 0,
+  60, 49, 0, 0, 9, 0, 57, 0, 0, 18,
+  38, 31, 23, 17, 38, 0, 21, 0, 27, 0,
+  7, 10, 58, 0, 64, 0, 40, 0, 0, 0,
+  0, 26, 0, 7, 2, 0, 63, 38, 23, 37,
+  2, 6, 0, 40, 0, 45, 6, 67, 46, 14,
+  38, 0, 0, 48, 16, 24, 55, 58, 112, 45,
+  0, 0, 68, 0, 26, 0, 0, 0, 0, 44,
+  0, 0, 0, 2, 1, 25, 39, 0, 0, 36,
+  14, 72, 25, 35, 35, 0, 0, 49, 0, 21,
+  0, 0, 16, 34, 0, 26, 35, 0, 2, 44,
+  0, 0, 64, 0, 29, 35, 0, 1, 39, 0,
+  66, 5, 11, 30, 0, 6, 14, 27, 89, 0,
+  74, 5, 0, 3, 35, 0, 49, 0, 45, 48,
+  0, 0, 10, 0, 56, 0, 0, 23, 42, 24,
+  30, 23, 39, 0, 31, 0, 11, 0, 7, 13,
+  40, 0, 62, 0, 52, 0, 0, 2, 0, 45,
+  0, 0, 0, 0, 62, 43, 22, 57, 2, 15,
+  0, 41, 7, 47, 6, 61, 60, 24, 15, 0,
+  0, 43, 26, 39, 53, 69, 110, 31, 0, 0,
+  54, 0, 28, 0, 0, 0, 0, 53, 0, 0,
+  0, 0, 3, 7, 35, 0, 0, 41, 15, 67,
+  26, 42, 26, 0, 0, 57, 0, 32, 0, 0,
+  14, 45, 0, 35, 43, 0, 0, 32, 0, 1,
+  56, 0, 32, 31, 0, 8, 48, 0, 66, 25,
+  6, 25, 12, 12, 17, 31, 106, 0, 60, 5,
+  0, 7, 27, 0, 51, 1, 26, 50, 0, 0,
+  24, 0, 67, 0, 2, 18, 45, 33, 35, 9,
+  30, 0, 39, 0, 0, 6, 16, 9, 41, 0,
+  67, 0, 44, 0, 11, 14, 0, 22, 0, 0,
+  8, 0, 32, 0, 33, 28, 0, 1, 0, 29,
+  40, 48, 56, 56, 12, 13, 56, 0, 0, 29,
+  28, 42, 16, 56, 0, 19, 0, 0, 57, 2,
+  6, 0, 0, 0, 0, 24, 0, 0, 0, 16,
+  1, 14, 21, 10, 0, 5, 37, 5, 41, 38,
+  0, 11, 0, 24, 0, 42, 0, 0, 0, 0,
+  0, 0, 70, 24, 23, 0, 0, 0, 11, 21,
+  44, 0, 8, 0, 0, 12, 70, 39, 7, 8,
+  19, 29, 0, 28, 16, 3, 38, 30, 0, 36,
+  4, 7, 0, 4, 60, 56, 0, 0, 5, 0,
+  33, 0, 12, 9, 35, 35, 0, 12, 2, 0,
+  10, 0, 0, 0, 0, 0, 6, 0, 111, 0,
+  30, 0, 9, 0, 0, 40, 0, 0, 15, 0,
+  26, 0, 40, 45, 1, 0, 0, 24, 16, 54,
+  51, 59, 27, 8, 15, 0, 0, 41, 35, 63,
+  9, 78, 0, 0, 8, 0, 21, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 0, 0, 0, 0,
+  38, 0, 0, 5, 22, 8, 24, 27, 0, 0,
+  0, 65, 0, 36, 0, 0, 0, 33, 0, 2,
+  97, 14, 35, 0, 0, 0, 20, 36, 43, 5,
+  0, 0, 0, 9, 52, 53, 0, 20, 31, 37,
+  0, 46, 33, 0, 42, 41, 0, 48, 0, 0,
+  2, 16, 45, 62, 0, 0, 12, 0, 34, 0,
+  0, 17, 24, 34, 0, 27, 0, 0, 25, 0,
+  0, 14, 10, 0, 0, 8, 110, 0, 42, 0,
+  17, 9, 0, 44, 12, 0, 11, 0, 23, 0,
+  54, 79, 0, 0, 0, 0, 3, 53, 49, 60,
+  36, 23, 0, 0, 0, 42, 29, 49, 27, 93,
+  0, 0, 15, 0, 15, 0, 0, 0, 0, 32,
+  0, 20, 0, 0, 0, 0, 0, 7, 42, 0,
+  0, 5, 12, 12, 37, 19, 0, 0, 0, 60,
+  0, 25, 1, 12, 0, 29, 0, 0, 86, 0,
+  36, 9, 0, 0, 13, 38, 43, 13, 0, 16,
+  0, 0, 60, 35, 0, 10, 27, 23, 0, 45,
+  43, 0, 17, 49, 0, 42, 0, 0, 4, 7,
+  24, 57, 0, 0, 23, 0, 36, 0, 0, 1,
+  19, 59, 0, 22, 0, 0, 36, 0, 0, 24,
+  28, 0, 1, 18, 93, 0, 22, 0, 42, 20,
+  0, 33, 0, 0, 36, 0, 0, 3, 48, 28,
+  0, 0, 10, 59, 39, 46, 67, 44, 12, 0,
+  51, 0, 0, 36, 0, 22, 41, 60, 0, 0,
+  0, 0, 19, 0, 7, 0, 0, 22, 0, 24,
+  0, 0, 0, 4, 0, 17, 23, 0, 0, 0,
+  55, 0, 1, 17, 0, 0, 18, 15, 0, 17,
+  0, 0, 0, 0, 0, 0, 102, 0, 17, 0,
+  0, 0, 5, 41, 35, 0, 3, 53, 0, 13,
+  18, 38, 12, 42, 10, 28, 0, 30, 22, 26,
+  21, 17, 0, 42, 0, 0, 0, 2, 49, 55,
+  1, 0, 0, 0, 16, 0, 14, 19, 32, 69,
+  0, 3, 0, 0, 21, 0, 0, 0, 17, 0,
+  0, 13, 100, 0, 0, 0, 30, 37, 12, 0,
+  30, 0, 18, 0, 0, 0, 37, 30, 0, 0,
+  4, 71, 11, 0, 44, 48, 26, 0, 25, 1,
+  22, 8, 0, 6, 34, 49, 0, 0, 16, 0,
+  0, 5, 0, 0, 40, 32, 0, 1, 1, 0,
+  0, 0, 0, 0, 9, 0, 0, 0, 31, 0,
+  0, 10, 0, 0, 0, 51, 0, 0, 2, 6,
+  23, 5, 0, 0, 106, 5, 12, 82, 0, 0,
+  6, 39, 0, 0, 0, 50, 1, 0, 0, 34,
+  0, 54, 42, 31, 0, 69, 0, 0, 0, 56,
+  0, 0, 20, 0, 0, 15, 19, 45, 10, 6,
+  0, 0, 0, 0, 0, 21, 1, 57, 6, 0,
+  0, 0, 53, 11, 0, 0, 15, 0, 0, 26,
+  8, 0, 0, 12, 42, 48, 16, 0, 43, 0,
+  0, 0, 0, 0, 40, 54, 0, 16, 0, 59,
+  14, 0, 21, 57, 23, 17, 21, 14, 54, 0,
+  0, 0, 42, 21, 0, 0, 0, 0, 0, 0,
+  0, 0, 54, 47, 0, 0, 9, 0, 0, 0,
+  0, 0, 9, 0, 0, 0, 23, 0, 0, 0,
+  10, 0, 8, 40, 0, 0, 0, 25, 50, 0,
+  59, 21, 36, 7, 0, 114, 0, 9, 8, 6,
+  0, 0, 4, 34, 0, 0, 0, 19, 0, 29,
+  42, 2, 22, 44, 6, 0, 0, 57, 0, 0,
+  19, 0, 0, 0, 14, 17, 24, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 0, 0, 0, 0,
+  81, 4, 14, 0, 20, 0, 0, 18, 0, 0,
+  0, 19, 37, 4, 0, 26, 0, 7, 2, 0,
+  63, 38, 23, 37, 2, 6, 0, 40, 0, 45,
+  6, 67, 46, 14, 38, 0, 0, 48, 16, 24,
+  55, 58, 112, 45, 0, 0, 68, 0, 26, 0,
+  0, 0, 0, 44, 0, 0, 0, 2, 1, 25,
+  39, 0, 0, 36, 14, 72, 25, 35, 35, 0,
+  0, 49, 0, 21, 0, 0, 16, 34, 0, 26,
+  35, 0, 2, 44, 0, 0, 64, 0, 29, 35,
+  0, 1, 39, 0, 66, 5, 11, 30, 0, 6,
+  14, 27, 89, 0, 74, 5, 0, 3, 35, 0,
+  49, 0, 45, 48, 0, 0, 10, 0, 56, 0,
+  0, 23, 42, 24, 30, 23, 39, 0, 31, 0,
+  11, 0, 7, 13, 40, 0, 62, 0, 52, 0,
+  0, 2, 0, 45, 0, 0, 0, 0, 62, 43,
+  22, 57, 2, 15, 0, 41, 7, 47, 6, 61,
+  60, 24, 15, 0, 0, 43, 26, 39, 53, 69,
+  110, 31, 0, 0, 54, 0, 28, 0, 0, 0,
+  0, 53, 0, 0, 0, 0, 3, 7, 35, 0,
+  0, 41, 15, 67, 26, 42, 26, 0, 0, 57,
+  0, 32, 0, 0, 14, 45, 0, 35, 43, 0,
+  0, 32, 0, 1, 56, 0, 32, 31, 0, 8,
+  48, 0, 66, 25, 6, 25, 12, 12, 17, 31,
+  106, 0, 60, 5, 0, 7, 27, 0, 51, 1,
+  26, 50, 0, 0, 24, 0, 67, 0, 2, 18,
+  45, 33, 35, 9, 30, 0, 39, 0, 0, 6,
+  16, 9, 41, 0, 67, 0, 44, 0, 11, 14,
+  0, 50, 11, 0, 0, 0, 74, 36, 26, 54,
+  0, 25, 0, 0, 19, 41, 32, 80, 62, 25,
+  0, 0, 0, 42, 46, 46, 53, 65, 120, 31,
+  0, 0, 44, 0, 29, 0, 0, 0, 0, 45,
+  0, 0, 34, 0, 9, 14, 37, 0, 0, 29,
+  26, 40, 42, 29, 11, 0, 0, 42, 0, 48,
+  0, 0, 13, 56, 0, 27, 47, 0, 0, 21,
+  0, 6, 37, 0, 32, 21, 1, 6, 34, 0,
+  57, 25, 7, 31, 24, 9, 22, 28, 77, 0,
+  42, 0, 0, 21, 17, 0, 36, 22, 1, 31,
+  0, 0, 35, 0, 70, 0, 6, 12, 44, 44,
+  51, 12, 23, 0, 31, 0, 0, 14, 39, 0,
+  40, 13, 69, 0, 18, 0, 49, 15, 0, 40,
+  0, 0, 15, 0, 26, 0, 40, 45, 1, 0,
+  0, 24, 16, 54, 51, 59, 27, 8, 15, 0,
+  0, 41, 35, 63, 9, 78, 0, 0, 8, 0,
+  21, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  0, 0, 0, 0, 38, 0, 0, 5, 22, 8,
+  24, 27, 0, 0, 0, 65, 0, 36, 0, 0,
+  0, 33, 0, 2, 97, 14, 35, 0, 0, 0,
+  20, 36, 43, 5, 0, 0, 0, 9, 52, 53,
+  0, 20, 31, 37, 0, 46, 33, 0, 42, 41,
+  0, 48, 0, 0, 2, 16, 45, 62, 0, 0,
+  12, 0, 34, 0, 0, 17, 24, 34, 0, 27,
+  0, 0, 25, 0, 0, 14, 10, 0, 0, 8,
+  110, 0, 42, 0, 17, 9, 0, 44, 12, 0,
+  11, 0, 23, 0, 54, 79, 0, 0, 0, 0,
+  3, 53, 49, 60, 36, 23, 0, 0, 0, 42,
+  29, 49, 27, 93, 0, 0, 15, 0, 15, 0,
+  0, 0, 0, 32, 0, 20, 0, 0, 0, 0,
+  0, 7, 42, 0, 0, 5, 12, 12, 37, 19,
+  0, 0, 0, 60, 0, 25, 1, 12, 0, 29,
+  0, 0, 86, 0, 36, 9, 0, 0, 13, 38,
+  43, 13, 0, 16, 0, 0, 60, 35, 0, 10,
+  27, 23, 0, 45, 43, 0, 17, 49, 0, 42,
+  0, 0, 4, 7, 24, 57, 0, 0, 23, 0,
+  36, 0, 0, 1, 19, 59, 0, 22, 0, 0,
+  36, 0, 0, 24, 28, 0, 1, 18, 93, 0,
+  22, 0, 42, 20, 0, 38, 33, 0, 0, 0,
+  27, 0, 63, 89, 0, 12, 0, 0, 14, 41,
+  49, 72, 30, 11, 0, 0, 0, 57, 37, 23,
+  43, 98, 0, 0, 23, 0, 9, 0, 0, 0,
+  0, 70, 0, 0, 14, 15, 16, 0, 0, 17,
+  24, 0, 0, 0, 12, 0, 48, 0, 0, 0,
+  0, 33, 0, 3, 10, 18, 0, 50, 0, 0,
+  81, 0, 15, 42, 0, 0, 7, 44, 23, 12,
+  4, 28, 0, 0, 63, 33, 2, 27, 31, 25,
+  2, 25, 25, 0, 0, 46, 0, 33, 0, 0,
+  0, 14, 0, 51, 3, 0, 8, 0, 41, 0,
+  0, 18, 2, 64, 10, 19, 0, 0, 55, 0,
+  0, 23, 45, 0, 7, 3, 63, 0, 0, 0,
+  78, 18, 12, 0, 30, 0, 18, 0, 0, 0,
+  37, 30, 0, 0, 4, 71, 11, 0, 44, 48,
+  26, 0, 25, 1, 22, 8, 0, 6, 34, 49,
+  0, 0, 16, 0, 0, 5, 0, 0, 40, 32,
+  0, 1, 1, 0, 0, 0, 0, 0, 9, 0,
+  0, 0, 31, 0, 0, 10, 0, 0, 0, 51,
+  0, 0, 2, 6, 23, 5, 0, 0, 106, 5,
+  12, 82, 0, 0, 6, 39, 0, 0, 0, 50,
+  1, 0, 0, 34, 0, 54, 42, 31, 0, 69,
+  0, 0, 0, 56, 0, 0, 20, 0, 0, 15,
+  19, 45, 10, 6, 0, 0, 0, 0, 0, 21,
+  1, 57, 6, 0, 0, 0, 53, 11, 0, 0,
+  15, 0, 0, 26, 8, 0, 0, 12, 42, 48,
+  16, 0, 43, 0, 0, 0, 0, 0, 40, 54,
+  0, 16, 0, 59, 14, 0, 21, 57, 23, 17,
+  21, 14, 54, 0, 0, 0, 42, 21, 0, 0,
+  0, 0, 0, 0, 0, 0, 54, 47, 0, 0,
+  9, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+  23, 0, 0, 0, 10, 0, 8, 40, 0, 0,
+  0, 25, 50, 0, 59, 21, 36, 7, 0, 114,
+  0, 9, 8, 6, 0, 0, 4, 34, 0, 0,
+  0, 19, 0, 29, 42, 2, 22, 44, 6, 0,
+  0, 57, 0, 0, 19, 0, 0, 0, 14, 17,
+  24, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+  0, 0, 0, 0, 81, 4, 14, 0, 20, 0,
+  0, 18, 0, 0, 0, 19, 37, 4, 30, 0,
+  21, 8, 18, 0, 0, 0, 23, 36, 0, 0,
+  0, 54, 7, 0, 0, 65, 15, 16, 55, 1,
+  62, 10, 0, 0, 52, 0, 0, 0, 14, 0,
+  0, 0, 0, 0, 9, 33, 0, 0, 29, 0,
+  0, 9, 0, 0, 15, 0, 0, 0, 30, 30,
+  0, 0, 29, 0, 20, 15, 0, 0, 0, 14,
+  64, 0, 89, 22, 8, 0, 0, 130, 0, 14,
+  8, 0, 2, 0, 14, 22, 0, 0, 24, 0,
+  8, 22, 41, 0, 39, 0, 26, 0, 0, 30,
+  15, 0, 0, 0, 0, 0, 23, 0, 15, 0,
+  0, 0, 0, 0, 0, 32, 0, 10, 0, 9,
+  0, 0, 99, 17, 35, 0, 24, 0, 6, 0,
+  0, 0, 0, 31, 25, 0, 0, 45, 0, 0,
+  0, 0, 62, 43, 22, 57, 2, 15, 0, 41,
+  7, 47, 6, 61, 60, 24, 15, 0, 0, 43,
+  26, 39, 53, 69, 110, 31, 0, 0, 54, 0,
+  28, 0, 0, 0, 0, 53, 0, 0, 0, 0,
+  3, 7, 35, 0, 0, 41, 15, 67, 26, 42,
+  26, 0, 0, 57, 0, 32, 0, 0, 14, 45,
+  0, 35, 43, 0, 0, 32, 0, 1, 56, 0,
+  32, 31, 0, 8, 48, 0, 66, 25, 6, 25,
+  12, 12, 17, 31, 106, 0, 60, 5, 0, 7,
+  27, 0, 51, 1, 26, 50, 0, 0, 24, 0,
+  67, 0, 2, 18, 45, 33, 35, 9, 30, 0,
+  39, 0, 0, 6, 16, 9, 41, 0, 67, 0,
+  44, 0, 11, 14, 0, 50, 11, 0, 0, 0,
+  74, 36, 26, 54, 0, 25, 0, 0, 19, 41,
+  32, 80, 62, 25, 0, 0, 0, 42, 46, 46,
+  53, 65, 120, 31, 0, 0, 44, 0, 29, 0,
+  0, 0, 0, 45, 0, 0, 34, 0, 9, 14,
+  37, 0, 0, 29, 26, 40, 42, 29, 11, 0,
+  0, 42, 0, 48, 0, 0, 13, 56, 0, 27,
+  47, 0, 0, 21, 0, 6, 37, 0, 32, 21,
+  1, 6, 34, 0, 57, 25, 7, 31, 24, 9,
+  22, 28, 77, 0, 42, 0, 0, 21, 17, 0,
+  36, 22, 1, 31, 0, 0, 35, 0, 70, 0,
+  6, 12, 44, 44, 51, 12, 23, 0, 31, 0,
+  0, 14, 39, 0, 40, 13, 69, 0, 18, 0,
+  49, 15, 0, 53, 6, 0, 0, 0, 108, 18,
+  35, 62, 0, 10, 0, 0, 14, 70, 19, 66,
+  42, 16, 0, 0, 0, 59, 58, 43, 47, 64,
+  123, 32, 0, 0, 54, 0, 29, 0, 0, 0,
+  9, 45, 0, 0, 26, 16, 0, 23, 56, 0,
+  0, 30, 14, 43, 57, 13, 7, 3, 3, 60,
+  0, 52, 0, 9, 11, 62, 0, 31, 41, 10,
+  20, 3, 0, 13, 31, 0, 45, 36, 0, 0,
+  32, 0, 56, 38, 10, 21, 24, 0, 26, 22,
+  84, 1, 35, 0, 0, 34, 0, 0, 6, 15,
+  19, 40, 0, 0, 26, 0, 74, 0, 0, 29,
+  37, 36, 50, 12, 2, 0, 29, 0, 0, 35,
+  51, 0, 32, 0, 64, 0, 33, 0, 43, 1,
+  0, 44, 12, 0, 11, 0, 23, 0, 54, 79,
+  0, 0, 0, 0, 3, 53, 49, 60, 36, 23,
+  0, 0, 0, 42, 29, 49, 27, 93, 0, 0,
+  15, 0, 15, 0, 0, 0, 0, 32, 0, 20,
+  0, 0, 0, 0, 0, 7, 42, 0, 0, 5,
+  12, 12, 37, 19, 0, 0, 0, 60, 0, 25,
+  1, 12, 0, 29, 0, 0, 86, 0, 36, 9,
+  0, 0, 13, 38, 43, 13, 0, 16, 0, 0,
+  60, 35, 0, 10, 27, 23, 0, 45, 43, 0,
+  17, 49, 0, 42, 0, 0, 4, 7, 24, 57,
+  0, 0, 23, 0, 36, 0, 0, 1, 19, 59,
+  0, 22, 0, 0, 36, 0, 0, 24, 28, 0,
+  1, 18, 93, 0, 22, 0, 42, 20, 0, 38,
+  33, 0, 0, 0, 27, 0, 63, 89, 0, 12,
+  0, 0, 14, 41, 49, 72, 30, 11, 0, 0,
+  0, 57, 37, 23, 43, 98, 0, 0, 23, 0,
+  9, 0, 0, 0, 0, 70, 0, 0, 14, 15,
+  16, 0, 0, 17, 24, 0, 0, 0, 12, 0,
+  48, 0, 0, 0, 0, 33, 0, 3, 10, 18,
+  0, 50, 0, 0, 81, 0, 15, 42, 0, 0,
+  7, 44, 23, 12, 4, 28, 0, 0, 63, 33,
+  2, 27, 31, 25, 2, 25, 25, 0, 0, 46,
+  0, 33, 0, 0, 0, 14, 0, 51, 3, 0,
+  8, 0, 41, 0, 0, 18, 2, 64, 10, 19,
+  0, 0, 55, 0, 0, 23, 45, 0, 7, 3,
+  63, 0, 0, 0, 78, 18, 0, 39, 39, 0,
+  0, 0, 25, 0, 78, 78, 0, 0, 0, 3,
+  0, 17, 3, 41, 11, 0, 0, 0, 16, 61,
+  36, 0, 50, 80, 0, 0, 9, 0, 0, 0,
+  0, 0, 16, 73, 0, 0, 40, 8, 4, 0,
+  0, 14, 31, 0, 0, 0, 18, 0, 26, 0,
+  2, 0, 24, 52, 0, 0, 0, 48, 0, 57,
+  2, 2, 88, 0, 14, 69, 0, 0, 2, 41,
+  6, 46, 1, 15, 0, 0, 48, 46, 0, 40,
+  32, 26, 15, 28, 27, 0, 0, 65, 0, 8,
+  0, 0, 0, 0, 0, 52, 25, 0, 0, 0,
+  32, 0, 0, 39, 0, 43, 11, 0, 0, 0,
+  70, 0, 0, 25, 54, 0, 0, 0, 11, 0,
+  0, 0, 64, 2, 16, 0, 43, 0, 0, 0,
+  0, 0, 40, 54, 0, 16, 0, 59, 14, 0,
+  21, 57, 23, 17, 21, 14, 54, 0, 0, 0,
+  42, 21, 0, 0, 0, 0, 0, 0, 0, 0,
+  54, 47, 0, 0, 9, 0, 0, 0, 0, 0,
+  9, 0, 0, 0, 23, 0, 0, 0, 10, 0,
+  8, 40, 0, 0, 0, 25, 50, 0, 59, 21,
+  36, 7, 0, 114, 0, 9, 8, 6, 0, 0,
+  4, 34, 0, 0, 0, 19, 0, 29, 42, 2,
+  22, 44, 6, 0, 0, 57, 0, 0, 19, 0,
+  0, 0, 14, 17, 24, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 0, 0, 0, 0, 81, 4,
+  14, 0, 20, 0, 0, 18, 0, 0, 0, 19,
+  37, 4, 30, 0, 21, 8, 18, 0, 0, 0,
+  23, 36, 0, 0, 0, 54, 7, 0, 0, 65,
+  15, 16, 55, 1, 62, 10, 0, 0, 52, 0,
+  0, 0, 14, 0, 0, 0, 0, 0, 9, 33,
+  0, 0, 29, 0, 0, 9, 0, 0, 15, 0,
+  0, 0, 30, 30, 0, 0, 29, 0, 20, 15,
+  0, 0, 0, 14, 64, 0, 89, 22, 8, 0,
+  0, 130, 0, 14, 8, 0, 2, 0, 14, 22,
+  0, 0, 24, 0, 8, 22, 41, 0, 39, 0,
+  26, 0, 0, 30, 15, 0, 0, 0, 0, 0,
+  23, 0, 15, 0, 0, 0, 0, 0, 0, 32,
+  0, 10, 0, 9, 0, 0, 99, 17, 35, 0,
+  24, 0, 6, 0, 0, 0, 0, 31, 25, 0,
+  5, 13, 0, 32, 19, 0, 8, 0, 42, 4,
+  0, 13, 0, 36, 0, 0, 0, 57, 0, 20,
+  78, 0, 62, 17, 0, 0, 48, 0, 0, 0,
+  23, 0, 0, 0, 0, 0, 0, 22, 0, 0,
+  41, 0, 0, 33, 9, 0, 6, 0, 0, 0,
+  32, 6, 0, 0, 33, 0, 37, 0, 4, 0,
+  0, 39, 62, 0, 84, 8, 32, 22, 0, 130,
+  0, 9, 16, 0, 0, 9, 33, 13, 0, 0,
+  29, 13, 0, 22, 32, 0, 33, 0, 24, 0,
+  0, 28, 10, 0, 0, 0, 8, 0, 32, 0,
+  10, 12, 0, 0, 0, 0, 0, 83, 0, 0,
+  2, 0, 0, 0, 98, 36, 46, 0, 18, 0,
+  8, 0, 0, 0, 0, 28, 8, 0, 0, 50,
+  11, 0, 0, 0, 74, 36, 26, 54, 0, 25,
+  0, 0, 19, 41, 32, 80, 62, 25, 0, 0,
+  0, 42, 46, 46, 53, 65, 120, 31, 0, 0,
+  44, 0, 29, 0, 0, 0, 0, 45, 0, 0,
+  34, 0, 9, 14, 37, 0, 0, 29, 26, 40,
+  42, 29, 11, 0, 0, 42, 0, 48, 0, 0,
+  13, 56, 0, 27, 47, 0, 0, 21, 0, 6,
+  37, 0, 32, 21, 1, 6, 34, 0, 57, 25,
+  7, 31, 24, 9, 22, 28, 77, 0, 42, 0,
+  0, 21, 17, 0, 36, 22, 1, 31, 0, 0,
+  35, 0, 70, 0, 6, 12, 44, 44, 51, 12,
+  23, 0, 31, 0, 0, 14, 39, 0, 40, 13,
+  69, 0, 18, 0, 49, 15, 0, 53, 6, 0,
+  0, 0, 108, 18, 35, 62, 0, 10, 0, 0,
+  14, 70, 19, 66, 42, 16, 0, 0, 0, 59,
+  58, 43, 47, 64, 123, 32, 0, 0, 54, 0,
+  29, 0, 0, 0, 9, 45, 0, 0, 26, 16,
+  0, 23, 56, 0, 0, 30, 14, 43, 57, 13,
+  7, 3, 3, 60, 0, 52, 0, 9, 11, 62,
+  0, 31, 41, 10, 20, 3, 0, 13, 31, 0,
+  45, 36, 0, 0, 32, 0, 56, 38, 10, 21,
+  24, 0, 26, 22, 84, 1, 35, 0, 0, 34,
+  0, 0, 6, 15, 19, 40, 0, 0, 26, 0,
+  74, 0, 0, 29, 37, 36, 50, 12, 2, 0,
+  29, 0, 0, 35, 51, 0, 32, 0, 64, 0,
+  33, 0, 43, 1, 0, 47, 0, 0, 0, 0,
+  99, 35, 39, 50, 0, 17, 0, 0, 7, 70,
+  34, 67, 46, 6, 16, 0, 0, 47, 51, 51,
+  43, 68, 129, 40, 9, 0, 53, 0, 19, 0,
+  0, 3, 0, 46, 0, 0, 4, 18, 0, 21,
+  43, 0, 0, 29, 3, 44, 51, 16, 0, 0,
+  8, 61, 0, 57, 0, 8, 10, 70, 0, 30,
+  41, 15, 26, 0, 0, 5, 28, 0, 43, 38,
+  0, 0, 35, 0, 53, 27, 7, 21, 30, 0,
+  31, 28, 62, 0, 36, 0, 0, 42, 1, 0,
+  11, 10, 39, 35, 0, 0, 24, 0, 67, 0,
+  0, 27, 42, 50, 46, 18, 14, 0, 25, 0,
+  0, 33, 56, 0, 33, 24, 74, 0, 21, 0,
+  46, 9, 0, 38, 33, 0, 0, 0, 27, 0,
+  63, 89, 0, 12, 0, 0, 14, 41, 49, 72,
+  30, 11, 0, 0, 0, 57, 37, 23, 43, 98,
+  0, 0, 23, 0, 9, 0, 0, 0, 0, 70,
+  0, 0, 14, 15, 16, 0, 0, 17, 24, 0,
+  0, 0, 12, 0, 48, 0, 0, 0, 0, 33,
+  0, 3, 10, 18, 0, 50, 0, 0, 81, 0,
+  15, 42, 0, 0, 7, 44, 23, 12, 4, 28,
+  0, 0, 63, 33, 2, 27, 31, 25, 2, 25,
+  25, 0, 0, 46, 0, 33, 0, 0, 0, 14,
+  0, 51, 3, 0, 8, 0, 41, 0, 0, 18,
+  2, 64, 10, 19, 0, 0, 55, 0, 0, 23,
+  45, 0, 7, 3, 63, 0, 0, 0, 78, 18,
+  0, 39, 39, 0, 0, 0, 25, 0, 78, 78,
+  0, 0, 0, 3, 0, 17, 3, 41, 11, 0,
+  0, 0, 16, 61, 36, 0, 50, 80, 0, 0,
+  9, 0, 0, 0, 0, 0, 16, 73, 0, 0,
+  40, 8, 4, 0, 0, 14, 31, 0, 0, 0,
+  18, 0, 26, 0, 2, 0, 24, 52, 0, 0,
+  0, 48, 0, 57, 2, 2, 88, 0, 14, 69,
+  0, 0, 2, 41, 6, 46, 1, 15, 0, 0,
+  48, 46, 0, 40, 32, 26, 15, 28, 27, 0,
+  0, 65, 0, 8, 0, 0, 0, 0, 0, 52,
+  25, 0, 0, 0, 32, 0, 0, 39, 0, 43,
+  11, 0, 0, 0, 70, 0, 0, 25, 54, 0,
+  0, 0, 11, 0, 0, 0, 64, 2, 0, 29,
+  0, 0, 0, 0, 15, 0, 80, 38, 0, 0,
+  0, 0, 0, 0, 0, 35, 26, 0, 14, 0,
+  0, 45, 31, 0, 42, 64, 0, 0, 16, 0,
+  0, 5, 0, 0, 32, 60, 1, 0, 52, 0,
+  0, 0, 0, 15, 40, 0, 0, 0, 0, 2,
+  11, 0, 19, 50, 26, 49, 0, 0, 6, 43,
+  3, 66, 19, 0, 76, 0, 18, 84, 0, 0,
+  2, 19, 0, 39, 0, 5, 14, 0, 39, 27,
+  3, 12, 27, 17, 21, 31, 23, 0, 0, 98,
+  2, 0, 0, 0, 0, 0, 39, 39, 30, 37,
+  0, 0, 15, 0, 0, 33, 0, 44, 1, 9,
+  0, 0, 55, 0, 0, 24, 71, 0, 0, 0,
+  0, 0, 0, 0, 42, 0, 30, 0, 21, 8,
+  18, 0, 0, 0, 23, 36, 0, 0, 0, 54,
+  7, 0, 0, 65, 15, 16, 55, 1, 62, 10,
+  0, 0, 52, 0, 0, 0, 14, 0, 0, 0,
+  0, 0, 9, 33, 0, 0, 29, 0, 0, 9,
+  0, 0, 15, 0, 0, 0, 30, 30, 0, 0,
+  29, 0, 20, 15, 0, 0, 0, 14, 64, 0,
+  89, 22, 8, 0, 0, 130, 0, 14, 8, 0,
+  2, 0, 14, 22, 0, 0, 24, 0, 8, 22,
+  41, 0, 39, 0, 26, 0, 0, 30, 15, 0,
+  0, 0, 0, 0, 23, 0, 15, 0, 0, 0,
+  0, 0, 0, 32, 0, 10, 0, 9, 0, 0,
+  99, 17, 35, 0, 24, 0, 6, 0, 0, 0,
+  0, 31, 25, 0, 5, 13, 0, 32, 19, 0,
+  8, 0, 42, 4, 0, 13, 0, 36, 0, 0,
+  0, 57, 0, 20, 78, 0, 62, 17, 0, 0,
+  48, 0, 0, 0, 23, 0, 0, 0, 0, 0,
+  0, 22, 0, 0, 41, 0, 0, 33, 9, 0,
+  6, 0, 0, 0, 32, 6, 0, 0, 33, 0,
+  37, 0, 4, 0, 0, 39, 62, 0, 84, 8,
+  32, 22, 0, 130, 0, 9, 16, 0, 0, 9,
+  33, 13, 0, 0, 29, 13, 0, 22, 32, 0,
+  33, 0, 24, 0, 0, 28, 10, 0, 0, 0,
+  8, 0, 32, 0, 10, 12, 0, 0, 0, 0,
+  0, 83, 0, 0, 2, 0, 0, 0, 98, 36,
+  46, 0, 18, 0, 8, 0, 0, 0, 0, 28,
+  8, 0, 11, 29, 0, 45, 2, 0, 17, 0,
+  59, 0, 0, 24, 0, 0, 0, 0, 0, 40,
+  1, 11, 70, 0, 8, 10, 0, 0, 32, 0,
+  0, 0, 26, 22, 0, 7, 0, 0, 17, 26,
+  2, 0, 47, 0, 0, 21, 13, 9, 8, 0,
+  0, 0, 39, 2, 0, 18, 67, 54, 46, 0,
+  21, 0, 0, 41, 60, 20, 72, 13, 27, 31,
+  0, 123, 0, 13, 17, 0, 0, 28, 28, 13,
+  17, 0, 23, 19, 0, 3, 26, 0, 27, 0,
+  23, 0, 0, 39, 0, 0, 0, 3, 33, 0,
+  52, 9, 4, 75, 0, 0, 0, 0, 0, 100,
+  0, 0, 2, 0, 0, 11, 51, 34, 23, 0,
+  31, 0, 14, 0, 0, 0, 3, 31, 7, 0,
+  0, 53, 6, 0, 0, 0, 108, 18, 35, 62,
+  0, 10, 0, 0, 14, 70, 19, 66, 42, 16,
+  0, 0, 0, 59, 58, 43, 47, 64, 123, 32,
+  0, 0, 54, 0, 29, 0, 0, 0, 9, 45,
+  0, 0, 26, 16, 0, 23, 56, 0, 0, 30,
+  14, 43, 57, 13, 7, 3, 3, 60, 0, 52,
+  0, 9, 11, 62, 0, 31, 41, 10, 20, 3,
+  0, 13, 31, 0, 45, 36, 0, 0, 32, 0,
+  56, 38, 10, 21, 24, 0, 26, 22, 84, 1,
+  35, 0, 0, 34, 0, 0, 6, 15, 19, 40,
+  0, 0, 26, 0, 74, 0, 0, 29, 37, 36,
+  50, 12, 2, 0, 29, 0, 0, 35, 51, 0,
+  32, 0, 64, 0, 33, 0, 43, 1, 0, 47,
+  0, 0, 0, 0, 99, 35, 39, 50, 0, 17,
+  0, 0, 7, 70, 34, 67, 46, 6, 16, 0,
+  0, 47, 51, 51, 43, 68, 129, 40, 9, 0,
+  53, 0, 19, 0, 0, 3, 0, 46, 0, 0,
+  4, 18, 0, 21, 43, 0, 0, 29, 3, 44,
+  51, 16, 0, 0, 8, 61, 0, 57, 0, 8,
+  10, 70, 0, 30, 41, 15, 26, 0, 0, 5,
+  28, 0, 43, 38, 0, 0, 35, 0, 53, 27,
+  7, 21, 30, 0, 31, 28, 62, 0, 36, 0,
+  0, 42, 1, 0, 11, 10, 39, 35, 0, 0,
+  24, 0, 67, 0, 0, 27, 42, 50, 46, 18,
+  14, 0, 25, 0, 0, 33, 56, 0, 33, 24,
+  74, 0, 21, 0, 46, 9, 0, 40, 0, 0,
+  5, 0, 79, 51, 29, 30, 0, 28, 9, 0,
+  6, 57, 44, 75, 60, 18, 9, 0, 0, 32,
+  53, 70, 33, 61, 135, 47, 36, 0, 45, 8,
+  29, 0, 0, 4, 0, 55, 0, 0, 25, 9,
+  0, 4, 34, 0, 0, 18, 21, 51, 44, 48,
+  0, 10, 3, 61, 0, 58, 0, 0, 12, 61,
+  0, 22, 46, 13, 15, 0, 0, 2, 14, 0,
+  34, 33, 0, 3, 31, 0, 57, 9, 0, 22,
+  46, 0, 23, 34, 53, 5, 53, 2, 0, 39,
+  29, 0, 36, 10, 25, 36, 0, 0, 19, 0,
+  58, 0, 0, 20, 53, 51, 44, 24, 38, 2,
+  31, 0, 0, 13, 50, 0, 40, 53, 98, 0,
+  37, 0, 54, 1, 0, 39, 39, 0, 0, 0,
+  25, 0, 78, 78, 0, 0, 0, 3, 0, 17,
+  3, 41, 11, 0, 0, 0, 16, 61, 36, 0,
+  50, 80, 0, 0, 9, 0, 0, 0, 0, 0,
+  16, 73, 0, 0, 40, 8, 4, 0, 0, 14,
+  31, 0, 0, 0, 18, 0, 26, 0, 2, 0,
+  24, 52, 0, 0, 0, 48, 0, 57, 2, 2,
+  88, 0, 14, 69, 0, 0, 2, 41, 6, 46,
+  1, 15, 0, 0, 48, 46, 0, 40, 32, 26,
+  15, 28, 27, 0, 0, 65, 0, 8, 0, 0,
+  0, 0, 0, 52, 25, 0, 0, 0, 32, 0,
+  0, 39, 0, 43, 11, 0, 0, 0, 70, 0,
+  0, 25, 54, 0, 0, 0, 11, 0, 0, 0,
+  64, 2, 0, 29, 0, 0, 0, 0, 15, 0,
+  80, 38, 0, 0, 0, 0, 0, 0, 0, 35,
+  26, 0, 14, 0, 0, 45, 31, 0, 42, 64,
+  0, 0, 16, 0, 0, 5, 0, 0, 32, 60,
+  1, 0, 52, 0, 0, 0, 0, 15, 40, 0,
+  0, 0, 0, 2, 11, 0, 19, 50, 26, 49,
+  0, 0, 6, 43, 3, 66, 19, 0, 76, 0,
+  18, 84, 0, 0, 2, 19, 0, 39, 0, 5,
+  14, 0, 39, 27, 3, 12, 27, 17, 21, 31,
+  23, 0, 0, 98, 2, 0, 0, 0, 0, 0,
+  39, 39, 30, 37, 0, 0, 15, 0, 0, 33,
+  0, 44, 1, 9, 0, 0, 55, 0, 0, 24,
+  71, 0, 0, 0, 0, 0, 0, 0, 42, 0,
+  0, 21, 0, 0, 2, 0, 15, 0, 74, 29,
+  0, 18, 0, 12, 0, 34, 16, 63, 31, 0,
+  0, 0, 0, 43, 15, 0, 18, 55, 0, 0,
+  44, 0, 0, 15, 0, 0, 19, 53, 0, 0,
+  37, 0, 0, 0, 0, 6, 28, 0, 0, 0,
+  0, 19, 26, 0, 3, 71, 33, 50, 0, 0,
+  10, 18, 0, 54, 2, 0, 62, 0, 20, 53,
+  0, 0, 0, 10, 0, 34, 0, 0, 19, 0,
+  50, 13, 6, 0, 30, 11, 7, 22, 34, 0,
+  0, 109, 0, 6, 0, 0, 0, 0, 36, 46,
+  17, 32, 7, 0, 17, 0, 0, 18, 0, 40,
+  0, 25, 0, 9, 51, 0, 0, 9, 68, 0,
+  0, 9, 34, 0, 14, 0, 50, 0, 5, 13,
+  0, 32, 19, 0, 8, 0, 42, 4, 0, 13,
+  0, 36, 0, 0, 0, 57, 0, 20, 78, 0,
+  62, 17, 0, 0, 48, 0, 0, 0, 23, 0,
+  0, 0, 0, 0, 0, 22, 0, 0, 41, 0,
+  0, 33, 9, 0, 6, 0, 0, 0, 32, 6,
+  0, 0, 33, 0, 37, 0, 4, 0, 0, 39,
+  62, 0, 84, 8, 32, 22, 0, 130, 0, 9,
+  16, 0, 0, 9, 33, 13, 0, 0, 29, 13,
+  0, 22, 32, 0, 33, 0, 24, 0, 0, 28,
+  10, 0, 0, 0, 8, 0, 32, 0, 10, 12,
+  0, 0, 0, 0, 0, 83, 0, 0, 2, 0,
+  0, 0, 98, 36, 46, 0, 18, 0, 8, 0,
+  0, 0, 0, 28, 8, 0, 11, 29, 0, 45,
+  2, 0, 17, 0, 59, 0, 0, 24, 0, 0,
+  0, 0, 0, 40, 1, 11, 70, 0, 8, 10,
+  0, 0, 32, 0, 0, 0, 26, 22, 0, 7,
+  0, 0, 17, 26, 2, 0, 47, 0, 0, 21,
+  13, 9, 8, 0, 0, 0, 39, 2, 0, 18,
+  67, 54, 46, 0, 21, 0, 0, 41, 60, 20,
+  72, 13, 27, 31, 0, 123, 0, 13, 17, 0,
+  0, 28, 28, 13, 17, 0, 23, 19, 0, 3,
+  26, 0, 27, 0, 23, 0, 0, 39, 0, 0,
+  0, 3, 33, 0, 52, 9, 4, 75, 0, 0,
+  0, 0, 0, 100, 0, 0, 2, 0, 0, 11,
+  51, 34, 23, 0, 31, 0, 14, 0, 0, 0,
+  3, 31, 7, 0, 11, 24, 0, 20, 0, 8,
+  0, 0, 72, 0, 0, 35, 0, 0, 0, 0,
+  0, 45, 6, 0, 35, 11, 0, 11, 0, 0,
+  13, 0, 0, 0, 2, 13, 0, 0, 0, 0,
+  29, 44, 34, 0, 50, 0, 0, 11, 0, 7,
+  0, 0, 0, 0, 8, 60, 0, 0, 108, 136,
+  34, 5, 37, 0, 0, 24, 71, 27, 134, 39,
+  0, 0, 0, 158, 66, 0, 9, 0, 0, 10,
+  0, 0, 39, 0, 9, 0, 13, 5, 9, 0,
+  4, 0, 70, 0, 0, 80, 0, 0, 27, 0,
+  26, 0, 39, 45, 33, 130, 0, 0, 0, 0,
+  0, 84, 0, 0, 0, 0, 0, 24, 23, 13,
+  0, 0, 36, 0, 0, 0, 0, 0, 23, 31,
+  12, 0, 0, 47, 0, 0, 0, 0, 99, 35,
+  39, 50, 0, 17, 0, 0, 7, 70, 34, 67,
+  46, 6, 16, 0, 0, 47, 51, 51, 43, 68,
+  129, 40, 9, 0, 53, 0, 19, 0, 0, 3,
+  0, 46, 0, 0, 4, 18, 0, 21, 43, 0,
+  0, 29, 3, 44, 51, 16, 0, 0, 8, 61,
+  0, 57, 0, 8, 10, 70, 0, 30, 41, 15,
+  26, 0, 0, 5, 28, 0, 43, 38, 0, 0,
+  35, 0, 53, 27, 7, 21, 30, 0, 31, 28,
+  62, 0, 36, 0, 0, 42, 1, 0, 11, 10,
+  39, 35, 0, 0, 24, 0, 67, 0, 0, 27,
+  42, 50, 46, 18, 14, 0, 25, 0, 0, 33,
+  56, 0, 33, 24, 74, 0, 21, 0, 46, 9,
+  0, 40, 0, 0, 5, 0, 79, 51, 29, 30,
+  0, 28, 9, 0, 6, 57, 44, 75, 60, 18,
+  9, 0, 0, 32, 53, 70, 33, 61, 135, 47,
+  36, 0, 45, 8, 29, 0, 0, 4, 0, 55,
+  0, 0, 25, 9, 0, 4, 34, 0, 0, 18,
+  21, 51, 44, 48, 0, 10, 3, 61, 0, 58,
+  0, 0, 12, 61, 0, 22, 46, 13, 15, 0,
+  0, 2, 14, 0, 34, 33, 0, 3, 31, 0,
+  57, 9, 0, 22, 46, 0, 23, 34, 53, 5,
+  53, 2, 0, 39, 29, 0, 36, 10, 25, 36,
+  0, 0, 19, 0, 58, 0, 0, 20, 53, 51,
+  44, 24, 38, 2, 31, 0, 0, 13, 50, 0,
+  40, 53, 98, 0, 37, 0, 54, 1, 0, 57,
+  0, 0, 7, 0, 75, 49, 21, 35, 0, 26,
+  12, 9, 20, 56, 23, 65, 41, 43, 0, 0,
+  0, 51, 49, 70, 25, 60, 128, 38, 16, 1,
+  47, 0, 34, 0, 0, 0, 0, 68, 0, 0,
+  51, 15, 10, 0, 33, 0, 0, 22, 41, 66,
+  39, 66, 0, 5, 0, 59, 0, 43, 0, 0,
+  13, 40, 0, 20, 49, 2, 9, 0, 0, 5,
+  40, 0, 43, 31, 0, 19, 43, 2, 80, 35,
+  0, 14, 27, 0, 17, 32, 100, 3, 76, 2,
+  0, 16, 24, 9, 46, 5, 10, 44, 0, 0,
+  7, 0, 65, 0, 4, 31, 54, 32, 37, 0,
+  31, 0, 29, 0, 0, 0, 10, 17, 45, 22,
+  97, 0, 76, 0, 23, 0, 0, 29, 0, 0,
+  0, 0, 15, 0, 80, 38, 0, 0, 0, 0,
+  0, 0, 0, 35, 26, 0, 14, 0, 0, 45,
+  31, 0, 42, 64, 0, 0, 16, 0, 0, 5,
+  0, 0, 32, 60, 1, 0, 52, 0, 0, 0,
+  0, 15, 40, 0, 0, 0, 0, 2, 11, 0,
+  19, 50, 26, 49, 0, 0, 6, 43, 3, 66,
+  19, 0, 76, 0, 18, 84, 0, 0, 2, 19,
+  0, 39, 0, 5, 14, 0, 39, 27, 3, 12,
+  27, 17, 21, 31, 23, 0, 0, 98, 2, 0,
+  0, 0, 0, 0, 39, 39, 30, 37, 0, 0,
+  15, 0, 0, 33, 0, 44, 1, 9, 0, 0,
+  55, 0, 0, 24, 71, 0, 0, 0, 0, 0,
+  0, 0, 42, 0, 0, 21, 0, 0, 2, 0,
+  15, 0, 74, 29, 0, 18, 0, 12, 0, 34,
+  16, 63, 31, 0, 0, 0, 0, 43, 15, 0,
+  18, 55, 0, 0, 44, 0, 0, 15, 0, 0,
+  19, 53, 0, 0, 37, 0, 0, 0, 0, 6,
+  28, 0, 0, 0, 0, 19, 26, 0, 3, 71,
+  33, 50, 0, 0, 10, 18, 0, 54, 2, 0,
+  62, 0, 20, 53, 0, 0, 0, 10, 0, 34,
+  0, 0, 19, 0, 50, 13, 6, 0, 30, 11,
+  7, 22, 34, 0, 0, 109, 0, 6, 0, 0,
+  0, 0, 36, 46, 17, 32, 7, 0, 17, 0,
+  0, 18, 0, 40, 0, 25, 0, 9, 51, 0,
+  0, 9, 68, 0, 0, 9, 34, 0, 14, 0,
+  50, 0, 0, 44, 0, 0, 11, 0, 30, 0,
+  44, 53, 0, 11, 18, 12, 0, 82, 51, 71,
+  16, 19, 0, 0, 0, 63, 28, 37, 0, 67,
+  2, 0, 45, 0, 33, 25, 0, 0, 0, 52,
+  0, 0, 18, 0, 13, 17, 0, 3, 20, 20,
+  0, 7, 2, 12, 49, 14, 0, 32, 19, 44,
+  0, 21, 12, 0, 0, 24, 0, 0, 80, 1,
+  40, 3, 0, 0, 8, 26, 18, 45, 0, 0,
+  0, 0, 87, 25, 0, 0, 27, 11, 0, 26,
+  28, 6, 18, 90, 0, 29, 0, 0, 0, 0,
+  0, 71, 9, 2, 14, 0, 37, 0, 0, 24,
+  1, 42, 0, 27, 0, 6, 32, 0, 0, 6,
+  43, 0, 9, 0, 103, 0, 43, 0, 51, 0,
+  11, 29, 0, 45, 2, 0, 17, 0, 59, 0,
+  0, 24, 0, 0, 0, 0, 0, 40, 1, 11,
+  70, 0, 8, 10, 0, 0, 32, 0, 0, 0,
+  26, 22, 0, 7, 0, 0, 17, 26, 2, 0,
+  47, 0, 0, 21, 13, 9, 8, 0, 0, 0,
+  39, 2, 0, 18, 67, 54, 46, 0, 21, 0,
+  0, 41, 60, 20, 72, 13, 27, 31, 0, 123,
+  0, 13, 17, 0, 0, 28, 28, 13, 17, 0,
+  23, 19, 0, 3, 26, 0, 27, 0, 23, 0,
+  0, 39, 0, 0, 0, 3, 33, 0, 52, 9,
+  4, 75, 0, 0, 0, 0, 0, 100, 0, 0,
+  2, 0, 0, 11, 51, 34, 23, 0, 31, 0,
+  14, 0, 0, 0, 3, 31, 7, 0, 11, 24,
+  0, 20, 0, 8, 0, 0, 72, 0, 0, 35,
+  0, 0, 0, 0, 0, 45, 6, 0, 35, 11,
+  0, 11, 0, 0, 13, 0, 0, 0, 2, 13,
+  0, 0, 0, 0, 29, 44, 34, 0, 50, 0,
+  0, 11, 0, 7, 0, 0, 0, 0, 8, 60,
+  0, 0, 108, 136, 34, 5, 37, 0, 0, 24,
+  71, 27, 134, 39, 0, 0, 0, 158, 66, 0,
+  9, 0, 0, 10, 0, 0, 39, 0, 9, 0,
+  13, 5, 9, 0, 4, 0, 70, 0, 0, 80,
+  0, 0, 27, 0, 26, 0, 39, 45, 33, 130,
+  0, 0, 0, 0, 0, 84, 0, 0, 0, 0,
+  0, 24, 23, 13, 0, 0, 36, 0, 0, 0,
+  0, 0, 23, 31, 12, 0, 0, 15, 0, 0,
+  0, 50, 0, 0, 53, 14, 0, 2, 0, 0,
+  0, 0, 0, 48, 12, 0, 0, 0, 0, 19,
+  0, 0, 0, 3, 0, 0, 3, 11, 0, 0,
+  0, 9, 43, 82, 35, 0, 70, 0, 5, 16,
+  0, 7, 7, 0, 0, 0, 0, 63, 0, 0,
+  57, 160, 47, 9, 35, 0, 0, 29, 57, 0,
+  153, 4, 0, 0, 0, 121, 122, 0, 14, 27,
+  0, 33, 0, 0, 46, 0, 6, 0, 5, 13,
+  16, 0, 0, 10, 64, 0, 0, 128, 0, 0,
+  35, 0, 0, 0, 10, 76, 58, 96, 0, 0,
+  0, 0, 0, 62, 0, 0, 0, 3, 0, 35,
+  0, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+  18, 28, 29, 0, 0, 40, 0, 0, 5, 0,
+  79, 51, 29, 30, 0, 28, 9, 0, 6, 57,
+  44, 75, 60, 18, 9, 0, 0, 32, 53, 70,
+  33, 61, 135, 47, 36, 0, 45, 8, 29, 0,
+  0, 4, 0, 55, 0, 0, 25, 9, 0, 4,
+  34, 0, 0, 18, 21, 51, 44, 48, 0, 10,
+  3, 61, 0, 58, 0, 0, 12, 61, 0, 22,
+  46, 13, 15, 0, 0, 2, 14, 0, 34, 33,
+  0, 3, 31, 0, 57, 9, 0, 22, 46, 0,
+  23, 34, 53, 5, 53, 2, 0, 39, 29, 0,
+  36, 10, 25, 36, 0, 0, 19, 0, 58, 0,
+  0, 20, 53, 51, 44, 24, 38, 2, 31, 0,
+  0, 13, 50, 0, 40, 53, 98, 0, 37, 0,
+  54, 1, 0, 57, 0, 0, 7, 0, 75, 49,
+  21, 35, 0, 26, 12, 9, 20, 56, 23, 65,
+  41, 43, 0, 0, 0, 51, 49, 70, 25, 60,
+  128, 38, 16, 1, 47, 0, 34, 0, 0, 0,
+  0, 68, 0, 0, 51, 15, 10, 0, 33, 0,
+  0, 22, 41, 66, 39, 66, 0, 5, 0, 59,
+  0, 43, 0, 0, 13, 40, 0, 20, 49, 2,
+  9, 0, 0, 5, 40, 0, 43, 31, 0, 19,
+  43, 2, 80, 35, 0, 14, 27, 0, 17, 32,
+  100, 3, 76, 2, 0, 16, 24, 9, 46, 5,
+  10, 44, 0, 0, 7, 0, 65, 0, 4, 31,
+  54, 32, 37, 0, 31, 0, 29, 0, 0, 0,
+  10, 17, 45, 22, 97, 0, 76, 0, 23, 0,
+  0, 100, 25, 10, 0, 0, 70, 30, 19, 50,
+  0, 57, 14, 13, 11, 54, 10, 51, 32, 74,
+  0, 0, 0, 42, 41, 47, 55, 47, 140, 28,
+  0, 6, 69, 0, 51, 0, 0, 0, 0, 61,
+  0, 0, 55, 28, 10, 25, 39, 0, 0, 40,
+  29, 63, 62, 56, 3, 0, 0, 4, 0, 42,
+  0, 0, 18, 10, 0, 13, 27, 0, 4, 2,
+  3, 7, 57, 0, 55, 33, 0, 39, 43, 0,
+  86, 34, 0, 21, 5, 0, 34, 32, 104, 0,
+  59, 5, 0, 0, 22, 8, 33, 0, 3, 36,
+  0, 11, 27, 0, 66, 0, 37, 39, 34, 16,
+  38, 0, 27, 2, 5, 0, 0, 0, 0, 19,
+  44, 4, 64, 0, 73, 0, 11, 0, 0, 21,
+  0, 0, 2, 0, 15, 0, 74, 29, 0, 18,
+  0, 12, 0, 34, 16, 63, 31, 0, 0, 0,
+  0, 43, 15, 0, 18, 55, 0, 0, 44, 0,
+  0, 15, 0, 0, 19, 53, 0, 0, 37, 0,
+  0, 0, 0, 6, 28, 0, 0, 0, 0, 19,
+  26, 0, 3, 71, 33, 50, 0, 0, 10, 18,
+  0, 54, 2, 0, 62, 0, 20, 53, 0, 0,
+  0, 10, 0, 34, 0, 0, 19, 0, 50, 13,
+  6, 0, 30, 11, 7, 22, 34, 0, 0, 109,
+  0, 6, 0, 0, 0, 0, 36, 46, 17, 32,
+  7, 0, 17, 0, 0, 18, 0, 40, 0, 25,
+  0, 9, 51, 0, 0, 9, 68, 0, 0, 9,
+  34, 0, 14, 0, 50, 0, 0, 44, 0, 0,
+  11, 0, 30, 0, 44, 53, 0, 11, 18, 12,
+  0, 82, 51, 71, 16, 19, 0, 0, 0, 63,
+  28, 37, 0, 67, 2, 0, 45, 0, 33, 25,
+  0, 0, 0, 52, 0, 0, 18, 0, 13, 17,
+  0, 3, 20, 20, 0, 7, 2, 12, 49, 14,
+  0, 32, 19, 44, 0, 21, 12, 0, 0, 24,
+  0, 0, 80, 1, 40, 3, 0, 0, 8, 26,
+  18, 45, 0, 0, 0, 0, 87, 25, 0, 0,
+  27, 11, 0, 26, 28, 6, 18, 90, 0, 29,
+  0, 0, 0, 0, 0, 71, 9, 2, 14, 0,
+  37, 0, 0, 24, 1, 42, 0, 27, 0, 6,
+  32, 0, 0, 6, 43, 0, 9, 0, 103, 0,
+  43, 0, 51, 0, 0, 102, 14, 0, 4, 0,
+  39, 0, 27, 51, 8, 13, 23, 3, 26, 91,
+  67, 61, 21, 56, 0, 0, 0, 56, 53, 69,
+  6, 74, 0, 0, 14, 0, 81, 1, 0, 0,
+  0, 25, 0, 38, 0, 16, 42, 22, 1, 7,
+  22, 19, 0, 49, 2, 1, 68, 52, 0, 0,
+  0, 9, 0, 50, 0, 0, 0, 0, 0, 0,
+  91, 11, 34, 0, 0, 0, 15, 26, 42, 23,
+  0, 6, 0, 4, 107, 11, 0, 0, 11, 8,
+  10, 15, 30, 12, 42, 45, 0, 41, 0, 10,
+  0, 0, 0, 81, 0, 0, 14, 0, 46, 0,
+  23, 15, 32, 37, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 30, 11, 149, 0, 76, 0,
+  46, 0, 11, 24, 0, 20, 0, 8, 0, 0,
+  72, 0, 0, 35, 0, 0, 0, 0, 0, 45,
+  6, 0, 35, 11, 0, 11, 0, 0, 13, 0,
+  0, 0, 2, 13, 0, 0, 0, 0, 29, 44,
+  34, 0, 50, 0, 0, 11, 0, 7, 0, 0,
+  0, 0, 8, 60, 0, 0, 108, 136, 34, 5,
+  37, 0, 0, 24, 71, 27, 134, 39, 0, 0,
+  0, 158, 66, 0, 9, 0, 0, 10, 0, 0,
+  39, 0, 9, 0, 13, 5, 9, 0, 4, 0,
+  70, 0, 0, 80, 0, 0, 27, 0, 26, 0,
+  39, 45, 33, 130, 0, 0, 0, 0, 0, 84,
+  0, 0, 0, 0, 0, 24, 23, 13, 0, 0,
+  36, 0, 0, 0, 0, 0, 23, 31, 12, 0,
+  0, 15, 0, 0, 0, 50, 0, 0, 53, 14,
+  0, 2, 0, 0, 0, 0, 0, 48, 12, 0,
+  0, 0, 0, 19, 0, 0, 0, 3, 0, 0,
+  3, 11, 0, 0, 0, 9, 43, 82, 35, 0,
+  70, 0, 5, 16, 0, 7, 7, 0, 0, 0,
+  0, 63, 0, 0, 57, 160, 47, 9, 35, 0,
+  0, 29, 57, 0, 153, 4, 0, 0, 0, 121,
+  122, 0, 14, 27, 0, 33, 0, 0, 46, 0,
+  6, 0, 5, 13, 16, 0, 0, 10, 64, 0,
+  0, 128, 0, 0, 35, 0, 0, 0, 10, 76,
+  58, 96, 0, 0, 0, 0, 0, 62, 0, 0,
+  0, 3, 0, 35, 0, 0, 0, 0, 53, 0,
+  0, 0, 0, 0, 18, 28, 29, 0, 0, 39,
+  0, 0, 0, 29, 0, 0, 78, 47, 0, 0,
+  30, 0, 0, 88, 39, 61, 6, 17, 0, 0,
+  0, 41, 0, 0, 7, 53, 6, 0, 17, 0,
+  36, 0, 0, 0, 35, 96, 0, 0, 48, 0,
+  9, 30, 0, 28, 42, 19, 0, 0, 0, 32,
+  2, 0, 4, 101, 46, 8, 0, 0, 0, 0,
+  0, 0, 66, 0, 6, 4, 24, 53, 52, 0,
+  17, 37, 0, 49, 0, 0, 5, 0, 39, 0,
+  0, 0, 0, 1, 0, 30, 51, 0, 0, 131,
+  0, 0, 11, 0, 0, 0, 0, 86, 87, 31,
+  0, 0, 0, 0, 0, 48, 0, 13, 0, 11,
+  0, 8, 2, 0, 0, 2, 51, 0, 25, 0,
+  41, 0, 28, 12, 43, 0, 0, 57, 0, 0,
+  7, 0, 75, 49, 21, 35, 0, 26, 12, 9,
+  20, 56, 23, 65, 41, 43, 0, 0, 0, 51,
+  49, 70, 25, 60, 128, 38, 16, 1, 47, 0,
+  34, 0, 0, 0, 0, 68, 0, 0, 51, 15,
+  10, 0, 33, 0, 0, 22, 41, 66, 39, 66,
+  0, 5, 0, 59, 0, 43, 0, 0, 13, 40,
+  0, 20, 49, 2, 9, 0, 0, 5, 40, 0,
+  43, 31, 0, 19, 43, 2, 80, 35, 0, 14,
+  27, 0, 17, 32, 100, 3, 76, 2, 0, 16,
+  24, 9, 46, 5, 10, 44, 0, 0, 7, 0,
+  65, 0, 4, 31, 54, 32, 37, 0, 31, 0,
+  29, 0, 0, 0, 10, 17, 45, 22, 97, 0,
+  76, 0, 23, 0, 0, 100, 25, 10, 0, 0,
+  70, 30, 19, 50, 0, 57, 14, 13, 11, 54,
+  10, 51, 32, 74, 0, 0, 0, 42, 41, 47,
+  55, 47, 140, 28, 0, 6, 69, 0, 51, 0,
+  0, 0, 0, 61, 0, 0, 55, 28, 10, 25,
+  39, 0, 0, 40, 29, 63, 62, 56, 3, 0,
+  0, 4, 0, 42, 0, 0, 18, 10, 0, 13,
+  27, 0, 4, 2, 3, 7, 57, 0, 55, 33,
+  0, 39, 43, 0, 86, 34, 0, 21, 5, 0,
+  34, 32, 104, 0, 59, 5, 0, 0, 22, 8,
+  33, 0, 3, 36, 0, 11, 27, 0, 66, 0,
+  37, 39, 34, 16, 38, 0, 27, 2, 5, 0,
+  0, 0, 0, 19, 44, 4, 64, 0, 73, 0,
+  11, 0, 0, 123, 31, 8, 0, 0, 58, 2,
+  5, 19, 0, 61, 49, 0, 0, 22, 6, 34,
+  22, 59, 0, 0, 47, 46, 38, 9, 61, 16,
+  179, 16, 0, 0, 76, 0, 51, 37, 0, 0,
+  40, 47, 0, 0, 71, 33, 17, 78, 26, 17,
+  0, 47, 0, 63, 77, 0, 7, 0, 7, 0,
+  0, 10, 13, 30, 0, 26, 0, 3, 14, 0,
+  1, 0, 72, 10, 34, 0, 44, 21, 8, 54,
+  16, 0, 64, 0, 25, 21, 0, 5, 39, 21,
+  53, 0, 0, 0, 23, 0, 9, 12, 0, 0,
+  0, 25, 0, 51, 27, 5, 41, 0, 55, 0,
+  0, 34, 30, 0, 0, 7, 0, 0, 0, 10,
+  31, 34, 58, 5, 0, 0, 20, 0, 0, 0,
+  0, 44, 0, 0, 11, 0, 30, 0, 44, 53,
+  0, 11, 18, 12, 0, 82, 51, 71, 16, 19,
+  0, 0, 0, 63, 28, 37, 0, 67, 2, 0,
+  45, 0, 33, 25, 0, 0, 0, 52, 0, 0,
+  18, 0, 13, 17, 0, 3, 20, 20, 0, 7,
+  2, 12, 49, 14, 0, 32, 19, 44, 0, 21,
+  12, 0, 0, 24, 0, 0, 80, 1, 40, 3,
+  0, 0, 8, 26, 18, 45, 0, 0, 0, 0,
+  87, 25, 0, 0, 27, 11, 0, 26, 28, 6,
+  18, 90, 0, 29, 0, 0, 0, 0, 0, 71,
+  9, 2, 14, 0, 37, 0, 0, 24, 1, 42,
+  0, 27, 0, 6, 32, 0, 0, 6, 43, 0,
+  9, 0, 103, 0, 43, 0, 51, 0, 0, 102,
+  14, 0, 4, 0, 39, 0, 27, 51, 8, 13,
+  23, 3, 26, 91, 67, 61, 21, 56, 0, 0,
+  0, 56, 53, 69, 6, 74, 0, 0, 14, 0,
+  81, 1, 0, 0, 0, 25, 0, 38, 0, 16,
+  42, 22, 1, 7, 22, 19, 0, 49, 2, 1,
+  68, 52, 0, 0, 0, 9, 0, 50, 0, 0,
+  0, 0, 0, 0, 91, 11, 34, 0, 0, 0,
+  15, 26, 42, 23, 0, 6, 0, 4, 107, 11,
+  0, 0, 11, 8, 10, 15, 30, 12, 42, 45,
+  0, 41, 0, 10, 0, 0, 0, 81, 0, 0,
+  14, 0, 46, 0, 23, 15, 32, 37, 0, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 30, 11,
+  149, 0, 76, 0, 46, 0, 0, 131, 52, 5,
+  17, 0, 45, 0, 11, 44, 5, 23, 60, 0,
+  17, 55, 55, 49, 15, 72, 0, 0, 12, 32,
+  54, 53, 11, 54, 0, 20, 0, 0, 76, 0,
+  17, 0, 0, 0, 0, 41, 0, 25, 68, 41,
+  28, 22, 40, 0, 0, 52, 0, 3, 85, 24,
+  0, 0, 0, 0, 0, 44, 4, 0, 0, 5,
+  0, 0, 29, 13, 13, 0, 0, 0, 8, 16,
+  74, 5, 15, 32, 0, 0, 97, 0, 0, 0,
+  14, 0, 30, 16, 22, 9, 0, 0, 0, 20,
+  0, 26, 0, 0, 0, 38, 5, 16, 9, 0,
+  39, 0, 48, 8, 25, 53, 0, 0, 0, 5,
+  0, 0, 0, 24, 33, 0, 34, 5, 77, 0,
+  62, 0, 29, 0, 0, 15, 0, 0, 0, 50,
+  0, 0, 53, 14, 0, 2, 0, 0, 0, 0,
+  0, 48, 12, 0, 0, 0, 0, 19, 0, 0,
+  0, 3, 0, 0, 3, 11, 0, 0, 0, 9,
+  43, 82, 35, 0, 70, 0, 5, 16, 0, 7,
+  7, 0, 0, 0, 0, 63, 0, 0, 57, 160,
+  47, 9, 35, 0, 0, 29, 57, 0, 153, 4,
+  0, 0, 0, 121, 122, 0, 14, 27, 0, 33,
+  0, 0, 46, 0, 6, 0, 5, 13, 16, 0,
+  0, 10, 64, 0, 0, 128, 0, 0, 35, 0,
+  0, 0, 10, 76, 58, 96, 0, 0, 0, 0,
+  0, 62, 0, 0, 0, 3, 0, 35, 0, 0,
+  0, 0, 53, 0, 0, 0, 0, 0, 18, 28,
+  29, 0, 0, 39, 0, 0, 0, 29, 0, 0,
+  78, 47, 0, 0, 30, 0, 0, 88, 39, 61,
+  6, 17, 0, 0, 0, 41, 0, 0, 7, 53,
+  6, 0, 17, 0, 36, 0, 0, 0, 35, 96,
+  0, 0, 48, 0, 9, 30, 0, 28, 42, 19,
+  0, 0, 0, 32, 2, 0, 4, 101, 46, 8,
+  0, 0, 0, 0, 0, 0, 66, 0, 6, 4,
+  24, 53, 52, 0, 17, 37, 0, 49, 0, 0,
+  5, 0, 39, 0, 0, 0, 0, 1, 0, 30,
+  51, 0, 0, 131, 0, 0, 11, 0, 0, 0,
+  0, 86, 87, 31, 0, 0, 0, 0, 0, 48,
+  0, 13, 0, 11, 0, 8, 2, 0, 0, 2,
+  51, 0, 25, 0, 41, 0, 28, 12, 43, 0,
+  0, 93, 41, 0, 7, 0, 52, 3, 86, 40,
+  12, 0, 76, 3, 0, 125, 70, 39, 2, 33,
+  0, 0, 0, 54, 36, 13, 16, 61, 3, 0,
+  21, 0, 90, 1, 0, 0, 0, 58, 0, 29,
+  9, 0, 26, 52, 0, 59, 72, 36, 0, 44,
+  0, 0, 84, 12, 0, 0, 22, 0, 0, 42,
+  0, 0, 0, 0, 0, 0, 47, 0, 62, 0,
+  0, 0, 2, 50, 38, 28, 0, 0, 0, 0,
+  77, 11, 8, 0, 0, 21, 0, 22, 43, 0,
+  0, 57, 0, 32, 0, 0, 0, 0, 0, 79,
+  66, 0, 0, 0, 15, 0, 10, 29, 0, 69,
+  0, 1, 0, 0, 0, 0, 0, 36, 65, 0,
+  62, 0, 139, 0, 57, 16, 25, 0, 0, 100,
+  25, 10, 0, 0, 70, 30, 19, 50, 0, 57,
+  14, 13, 11, 54, 10, 51, 32, 74, 0, 0,
+  0, 42, 41, 47, 55, 47, 140, 28, 0, 6,
+  69, 0, 51, 0, 0, 0, 0, 61, 0, 0,
+  55, 28, 10, 25, 39, 0, 0, 40, 29, 63,
+  62, 56, 3, 0, 0, 4, 0, 42, 0, 0,
+  18, 10, 0, 13, 27, 0, 4, 2, 3, 7,
+  57, 0, 55, 33, 0, 39, 43, 0, 86, 34,
+  0, 21, 5, 0, 34, 32, 104, 0, 59, 5,
+  0, 0, 22, 8, 33, 0, 3, 36, 0, 11,
+  27, 0, 66, 0, 37, 39, 34, 16, 38, 0,
+  27, 2, 5, 0, 0, 0, 0, 19, 44, 4,
+  64, 0, 73, 0, 11, 0, 0, 123, 31, 8,
+  0, 0, 58, 2, 5, 19, 0, 61, 49, 0,
+  0, 22, 6, 34, 22, 59, 0, 0, 47, 46,
+  38, 9, 61, 16, 179, 16, 0, 0, 76, 0,
+  51, 37, 0, 0, 40, 47, 0, 0, 71, 33,
+  17, 78, 26, 17, 0, 47, 0, 63, 77, 0,
+  7, 0, 7, 0, 0, 10, 13, 30, 0, 26,
+  0, 3, 14, 0, 1, 0, 72, 10, 34, 0,
+  44, 21, 8, 54, 16, 0, 64, 0, 25, 21,
+  0, 5, 39, 21, 53, 0, 0, 0, 23, 0,
+  9, 12, 0, 0, 0, 25, 0, 51, 27, 5,
+  41, 0, 55, 0, 0, 34, 30, 0, 0, 7,
+  0, 0, 0, 10, 31, 34, 58, 5, 0, 0,
+  20, 0, 0, 0, 5, 63, 0, 6, 0, 6,
+  70, 9, 0, 0, 0, 80, 68, 0, 0, 0,
+  4, 24, 17, 28, 10, 34, 89, 45, 45, 0,
+  53, 4, 206, 0, 0, 11, 57, 5, 17, 54,
+  0, 0, 60, 39, 0, 0, 1, 61, 12, 128,
+  21, 26, 0, 14, 0, 73, 56, 0, 20, 6,
+  28, 0, 28, 0, 56, 44, 0, 46, 15, 2,
+  13, 32, 46, 0, 134, 11, 24, 0, 54, 0,
+  56, 54, 12, 0, 36, 0, 34, 0, 0, 7,
+  35, 1, 23, 0, 0, 0, 35, 0, 0, 29,
+  0, 0, 59, 43, 6, 53, 7, 33, 53, 18,
+  22, 0, 0, 36, 0, 23, 0, 10, 0, 29,
+  0, 20, 61, 20, 68, 0, 0, 0, 0, 0,
+  0, 0, 0, 102, 14, 0, 4, 0, 39, 0,
+  27, 51, 8, 13, 23, 3, 26, 91, 67, 61,
+  21, 56, 0, 0, 0, 56, 53, 69, 6, 74,
+  0, 0, 14, 0, 81, 1, 0, 0, 0, 25,
+  0, 38, 0, 16, 42, 22, 1, 7, 22, 19,
+  0, 49, 2, 1, 68, 52, 0, 0, 0, 9,
+  0, 50, 0, 0, 0, 0, 0, 0, 91, 11,
+  34, 0, 0, 0, 15, 26, 42, 23, 0, 6,
+  0, 4, 107, 11, 0, 0, 11, 8, 10, 15,
+  30, 12, 42, 45, 0, 41, 0, 10, 0, 0,
+  0, 81, 0, 0, 14, 0, 46, 0, 23, 15,
+  32, 37, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 30, 11, 149, 0, 76, 0, 46, 0,
+  0, 131, 52, 5, 17, 0, 45, 0, 11, 44,
+  5, 23, 60, 0, 17, 55, 55, 49, 15, 72,
+  0, 0, 12, 32, 54, 53, 11, 54, 0, 20,
+  0, 0, 76, 0, 17, 0, 0, 0, 0, 41,
+  0, 25, 68, 41, 28, 22, 40, 0, 0, 52,
+  0, 3, 85, 24, 0, 0, 0, 0, 0, 44,
+  4, 0, 0, 5, 0, 0, 29, 13, 13, 0,
+  0, 0, 8, 16, 74, 5, 15, 32, 0, 0,
+  97, 0, 0, 0, 14, 0, 30, 16, 22, 9,
+  0, 0, 0, 20, 0, 26, 0, 0, 0, 38,
+  5, 16, 9, 0, 39, 0, 48, 8, 25, 53,
+  0, 0, 0, 5, 0, 0, 0, 24, 33, 0,
+  34, 5, 77, 0, 62, 0, 29, 0, 0, 75,
+  0, 0, 5, 14, 48, 1, 0, 0, 0, 56,
+  51, 0, 0, 4, 32, 10, 13, 41, 0, 10,
+  71, 13, 29, 0, 10, 14, 0, 17, 0, 0,
+  42, 0, 5, 27, 0, 0, 9, 20, 0, 26,
+  0, 66, 11, 74, 35, 26, 0, 2, 0, 16,
+  68, 0, 0, 0, 30, 0, 1, 5, 28, 45,
+  0, 49, 0, 0, 0, 37, 29, 0, 51, 0,
+  22, 9, 83, 12, 47, 23, 0, 0, 69, 0,
+  4, 0, 38, 0, 23, 2, 0, 0, 0, 0,
+  0, 6, 0, 38, 0, 0, 22, 49, 15, 29,
+  19, 13, 22, 0, 31, 11, 0, 28, 0, 0,
+  0, 0, 0, 0, 0, 19, 71, 6, 22, 4,
+  0, 0, 22, 0, 10, 0, 0, 39, 0, 0,
+  0, 29, 0, 0, 78, 47, 0, 0, 30, 0,
+  0, 88, 39, 61, 6, 17, 0, 0, 0, 41,
+  0, 0, 7, 53, 6, 0, 17, 0, 36, 0,
+  0, 0, 35, 96, 0, 0, 48, 0, 9, 30,
+  0, 28, 42, 19, 0, 0, 0, 32, 2, 0,
+  4, 101, 46, 8, 0, 0, 0, 0, 0, 0,
+  66, 0, 6, 4, 24, 53, 52, 0, 17, 37,
+  0, 49, 0, 0, 5, 0, 39, 0, 0, 0,
+  0, 1, 0, 30, 51, 0, 0, 131, 0, 0,
+  11, 0, 0, 0, 0, 86, 87, 31, 0, 0,
+  0, 0, 0, 48, 0, 13, 0, 11, 0, 8,
+  2, 0, 0, 2, 51, 0, 25, 0, 41, 0,
+  28, 12, 43, 0, 0, 93, 41, 0, 7, 0,
+  52, 3, 86, 40, 12, 0, 76, 3, 0, 125,
+  70, 39, 2, 33, 0, 0, 0, 54, 36, 13,
+  16, 61, 3, 0, 21, 0, 90, 1, 0, 0,
+  0, 58, 0, 29, 9, 0, 26, 52, 0, 59,
+  72, 36, 0, 44, 0, 0, 84, 12, 0, 0,
+  22, 0, 0, 42, 0, 0, 0, 0, 0, 0,
+  47, 0, 62, 0, 0, 0, 2, 50, 38, 28,
+  0, 0, 0, 0, 77, 11, 8, 0, 0, 21,
+  0, 22, 43, 0, 0, 57, 0, 32, 0, 0,
+  0, 0, 0, 79, 66, 0, 0, 0, 15, 0,
+  10, 29, 0, 69, 0, 1, 0, 0, 0, 0,
+  0, 36, 65, 0, 62, 0, 139, 0, 57, 16,
+  25, 0, 0, 58, 49, 0, 14, 0, 50, 16,
+  63, 8, 3, 26, 61, 1, 7, 53, 52, 0,
+  0, 15, 0, 27, 43, 19, 23, 0, 0, 13,
+  0, 0, 0, 0, 41, 0, 0, 6, 0, 16,
+  0, 79, 0, 24, 0, 55, 1, 70, 61, 46,
+  0, 21, 0, 20, 72, 1, 0, 0, 29, 0,
+  0, 0, 15, 36, 0, 43, 0, 14, 0, 0,
+  79, 0, 0, 0, 7, 27, 66, 15, 34, 28,
+  0, 0, 79, 0, 29, 0, 25, 0, 16, 0,
+  0, 0, 0, 0, 0, 17, 0, 26, 0, 0,
+  5, 71, 31, 0, 0, 0, 26, 0, 28, 0,
+  0, 38, 0, 0, 0, 2, 0, 0, 2, 14,
+  69, 0, 27, 0, 63, 0, 43, 7, 17, 0,
+  0, 123, 31, 8, 0, 0, 58, 2, 5, 19,
+  0, 61, 49, 0, 0, 22, 6, 34, 22, 59,
+  0, 0, 47, 46, 38, 9, 61, 16, 179, 16,
+  0, 0, 76, 0, 51, 37, 0, 0, 40, 47,
+  0, 0, 71, 33, 17, 78, 26, 17, 0, 47,
+  0, 63, 77, 0, 7, 0, 7, 0, 0, 10,
+  13, 30, 0, 26, 0, 3, 14, 0, 1, 0,
+  72, 10, 34, 0, 44, 21, 8, 54, 16, 0,
+  64, 0, 25, 21, 0, 5, 39, 21, 53, 0,
+  0, 0, 23, 0, 9, 12, 0, 0, 0, 25,
+  0, 51, 27, 5, 41, 0, 55, 0, 0, 34,
+  30, 0, 0, 7, 0, 0, 0, 10, 31, 34,
+  58, 5, 0, 0, 20, 0, 0, 0, 5, 63,
+  0, 6, 0, 6, 70, 9, 0, 0, 0, 80,
+  68, 0, 0, 0, 4, 24, 17, 28, 10, 34,
+  89, 45, 45, 0, 53, 4, 206, 0, 0, 11,
+  57, 5, 17, 54, 0, 0, 60, 39, 0, 0,
+  1, 61, 12, 128, 21, 26, 0, 14, 0, 73,
+  56, 0, 20, 6, 28, 0, 28, 0, 56, 44,
+  0, 46, 15, 2, 13, 32, 46, 0, 134, 11,
+  24, 0, 54, 0, 56, 54, 12, 0, 36, 0,
+  34, 0, 0, 7, 35, 1, 23, 0, 0, 0,
+  35, 0, 0, 29, 0, 0, 59, 43, 6, 53,
+  7, 33, 53, 18, 22, 0, 0, 36, 0, 23,
+  0, 10, 0, 29, 0, 20, 61, 20, 68, 0,
+  0, 0, 0, 0, 0, 0, 23, 19, 0, 34,
+  10, 9, 83, 40, 0, 0, 0, 24, 57, 8,
+  0, 49, 29, 55, 14, 27, 77, 6, 23, 33,
+  54, 0, 58, 20, 192, 4, 0, 22, 109, 15,
+  46, 0, 0, 37, 38, 5, 0, 0, 0, 70,
+  41, 137, 1, 46, 0, 13, 0, 79, 54, 2,
+  11, 54, 16, 0, 0, 0, 37, 0, 13, 6,
+  0, 0, 18, 17, 31, 11, 84, 0, 5, 0,
+  13, 0, 66, 45, 13, 0, 58, 0, 30, 0,
+  0, 0, 28, 0, 31, 38, 0, 18, 0, 18,
+  32, 25, 25, 0, 48, 37, 18, 2, 0, 55,
+  81, 0, 12, 13, 23, 14, 0, 32, 10, 37,
+  0, 0, 29, 0, 19, 21, 86, 0, 13, 0,
+  0, 0, 37, 12, 0, 131, 52, 5, 17, 0,
+  45, 0, 11, 44, 5, 23, 60, 0, 17, 55,
+  55, 49, 15, 72, 0, 0, 12, 32, 54, 53,
+  11, 54, 0, 20, 0, 0, 76, 0, 17, 0,
+  0, 0, 0, 41, 0, 25, 68, 41, 28, 22,
+  40, 0, 0, 52, 0, 3, 85, 24, 0, 0,
+  0, 0, 0, 44, 4, 0, 0, 5, 0, 0,
+  29, 13, 13, 0, 0, 0, 8, 16, 74, 5,
+  15, 32, 0, 0, 97, 0, 0, 0, 14, 0,
+  30, 16, 22, 9, 0, 0, 0, 20, 0, 26,
+  0, 0, 0, 38, 5, 16, 9, 0, 39, 0,
+  48, 8, 25, 53, 0, 0, 0, 5, 0, 0,
+  0, 24, 33, 0, 34, 5, 77, 0, 62, 0,
+  29, 0, 0, 75, 0, 0, 5, 14, 48, 1,
+  0, 0, 0, 56, 51, 0, 0, 4, 32, 10,
+  13, 41, 0, 10, 71, 13, 29, 0, 10, 14,
+  0, 17, 0, 0, 42, 0, 5, 27, 0, 0,
+  9, 20, 0, 26, 0, 66, 11, 74, 35, 26,
+  0, 2, 0, 16, 68, 0, 0, 0, 30, 0,
+  1, 5, 28, 45, 0, 49, 0, 0, 0, 37,
+  29, 0, 51, 0, 22, 9, 83, 12, 47, 23,
+  0, 0, 69, 0, 4, 0, 38, 0, 23, 2,
+  0, 0, 0, 0, 0, 6, 0, 38, 0, 0,
+  22, 49, 15, 29, 19, 13, 22, 0, 31, 11,
+  0, 28, 0, 0, 0, 0, 0, 0, 0, 19,
+  71, 6, 22, 4, 0, 0, 22, 0, 10, 0,
+  7, 18, 0, 16, 0, 21, 57, 17, 0, 0,
+  0, 41, 57, 2, 0, 6, 60, 44, 5, 5,
+  45, 0, 15, 0, 37, 0, 27, 0, 0, 35,
+  0, 0, 85, 0, 0, 0, 0, 5, 0, 0,
+  0, 23, 0, 64, 4, 113, 25, 79, 0, 0,
+  0, 41, 66, 0, 0, 22, 11, 0, 0, 0,
+  15, 0, 0, 2, 0, 0, 0, 36, 38, 0,
+  60, 0, 2, 0, 50, 0, 47, 0, 0, 0,
+  62, 0, 47, 0, 7, 0, 20, 0, 0, 8,
+  0, 4, 0, 8, 0, 7, 0, 0, 51, 44,
+  26, 26, 0, 37, 18, 0, 29, 6, 9, 13,
+  0, 18, 0, 17, 0, 0, 6, 0, 36, 0,
+  37, 0, 37, 0, 0, 0, 38, 0, 0, 93,
+  41, 0, 7, 0, 52, 3, 86, 40, 12, 0,
+  76, 3, 0, 125, 70, 39, 2, 33, 0, 0,
+  0, 54, 36, 13, 16, 61, 3, 0, 21, 0,
+  90, 1, 0, 0, 0, 58, 0, 29, 9, 0,
+  26, 52, 0, 59, 72, 36, 0, 44, 0, 0,
+  84, 12, 0, 0, 22, 0, 0, 42, 0, 0,
+  0, 0, 0, 0, 47, 0, 62, 0, 0, 0,
+  2, 50, 38, 28, 0, 0, 0, 0, 77, 11,
+  8, 0, 0, 21, 0, 22, 43, 0, 0, 57,
+  0, 32, 0, 0, 0, 0, 0, 79, 66, 0,
+  0, 0, 15, 0, 10, 29, 0, 69, 0, 1,
+  0, 0, 0, 0, 0, 36, 65, 0, 62, 0,
+  139, 0, 57, 16, 25, 0, 0, 58, 49, 0,
+  14, 0, 50, 16, 63, 8, 3, 26, 61, 1,
+  7, 53, 52, 0, 0, 15, 0, 27, 43, 19,
+  23, 0, 0, 13, 0, 0, 0, 0, 41, 0,
+  0, 6, 0, 16, 0, 79, 0, 24, 0, 55,
+  1, 70, 61, 46, 0, 21, 0, 20, 72, 1,
+  0, 0, 29, 0, 0, 0, 15, 36, 0, 43,
+  0, 14, 0, 0, 79, 0, 0, 0, 7, 27,
+  66, 15, 34, 28, 0, 0, 79, 0, 29, 0,
+  25, 0, 16, 0, 0, 0, 0, 0, 0, 17,
+  0, 26, 0, 0, 5, 71, 31, 0, 0, 0,
+  26, 0, 28, 0, 0, 38, 0, 0, 0, 2,
+  0, 0, 2, 14, 69, 0, 27, 0, 63, 0,
+  43, 7, 17, 0, 0, 6, 0, 0, 0, 1,
+  30, 12, 26, 0, 0, 25, 43, 0, 8, 23,
+  56, 23, 0, 0, 32, 29, 18, 2, 25, 0,
+  0, 0, 0, 0, 0, 0, 36, 17, 0, 0,
+  0, 0, 0, 34, 0, 11, 0, 58, 21, 87,
+  29, 59, 0, 1, 0, 52, 63, 0, 3, 0,
+  12, 0, 0, 0, 25, 4, 0, 38, 0, 10,
+  4, 0, 42, 0, 34, 0, 0, 17, 34, 0,
+  45, 41, 0, 0, 77, 0, 55, 0, 5, 0,
+  14, 0, 0, 0, 0, 31, 0, 0, 0, 22,
+  0, 0, 32, 57, 30, 0, 0, 9, 8, 0,
+  15, 0, 0, 13, 0, 14, 0, 2, 0, 0,
+  29, 0, 33, 0, 14, 0, 33, 0, 13, 6,
+  20, 0, 5, 63, 0, 6, 0, 6, 70, 9,
+  0, 0, 0, 80, 68, 0, 0, 0, 4, 24,
+  17, 28, 10, 34, 89, 45, 45, 0, 53, 4,
+  206, 0, 0, 11, 57, 5, 17, 54, 0, 0,
+  60, 39, 0, 0, 1, 61, 12, 128, 21, 26,
+  0, 14, 0, 73, 56, 0, 20, 6, 28, 0,
+  28, 0, 56, 44, 0, 46, 15, 2, 13, 32,
+  46, 0, 134, 11, 24, 0, 54, 0, 56, 54,
+  12, 0, 36, 0, 34, 0, 0, 7, 35, 1,
+  23, 0, 0, 0, 35, 0, 0, 29, 0, 0,
+  59, 43, 6, 53, 7, 33, 53, 18, 22, 0,
+  0, 36, 0, 23, 0, 10, 0, 29, 0, 20,
+  61, 20, 68, 0, 0, 0, 0, 0, 0, 0,
+  23, 19, 0, 34, 10, 9, 83, 40, 0, 0,
+  0, 24, 57, 8, 0, 49, 29, 55, 14, 27,
+  77, 6, 23, 33, 54, 0, 58, 20, 192, 4,
+  0, 22, 109, 15, 46, 0, 0, 37, 38, 5,
+  0, 0, 0, 70, 41, 137, 1, 46, 0, 13,
+  0, 79, 54, 2, 11, 54, 16, 0, 0, 0,
+  37, 0, 13, 6, 0, 0, 18, 17, 31, 11,
+  84, 0, 5, 0, 13, 0, 66, 45, 13, 0,
+  58, 0, 30, 0, 0, 0, 28, 0, 31, 38,
+  0, 18, 0, 18, 32, 25, 25, 0, 48, 37,
+  18, 2, 0, 55, 81, 0, 12, 13, 23, 14,
+  0, 32, 10, 37, 0, 0, 29, 0, 19, 21,
+  86, 0, 13, 0, 0, 0, 37, 12, 0, 33,
+  0, 8, 0, 0, 88, 51, 0, 25, 4, 29,
+  23, 1, 15, 91, 42, 50, 0, 22, 30, 0,
+  0, 49, 47, 30, 47, 45, 143, 63, 23, 6,
+  105, 25, 47, 0, 0, 39, 4, 30, 0, 3,
+  39, 25, 43, 65, 2, 47, 0, 56, 16, 77,
+  68, 39, 2, 24, 5, 0, 0, 43, 0, 0,
+  0, 26, 0, 4, 28, 0, 0, 0, 1, 21,
+  0, 0, 4, 46, 30, 14, 4, 0, 94, 0,
+  0, 19, 0, 0, 9, 3, 54, 33, 28, 12,
+  0, 25, 28, 16, 54, 0, 16, 44, 0, 0,
+  10, 24, 96, 0, 13, 21, 39, 36, 23, 10,
+  46, 34, 8, 0, 13, 0, 3, 31, 63, 19,
+  94, 0, 15, 0, 17, 0, 0, 75, 0, 0,
+  5, 14, 48, 1, 0, 0, 0, 56, 51, 0,
+  0, 4, 32, 10, 13, 41, 0, 10, 71, 13,
+  29, 0, 10, 14, 0, 17, 0, 0, 42, 0,
+  5, 27, 0, 0, 9, 20, 0, 26, 0, 66,
+  11, 74, 35, 26, 0, 2, 0, 16, 68, 0,
+  0, 0, 30, 0, 1, 5, 28, 45, 0, 49,
+  0, 0, 0, 37, 29, 0, 51, 0, 22, 9,
+  83, 12, 47, 23, 0, 0, 69, 0, 4, 0,
+  38, 0, 23, 2, 0, 0, 0, 0, 0, 6,
+  0, 38, 0, 0, 22, 49, 15, 29, 19, 13,
+  22, 0, 31, 11, 0, 28, 0, 0, 0, 0,
+  0, 0, 0, 19, 71, 6, 22, 4, 0, 0,
+  22, 0, 10, 0, 7, 18, 0, 16, 0, 21,
+  57, 17, 0, 0, 0, 41, 57, 2, 0, 6,
+  60, 44, 5, 5, 45, 0, 15, 0, 37, 0,
+  27, 0, 0, 35, 0, 0, 85, 0, 0, 0,
+  0, 5, 0, 0, 0, 23, 0, 64, 4, 113,
+  25, 79, 0, 0, 0, 41, 66, 0, 0, 22,
+  11, 0, 0, 0, 15, 0, 0, 2, 0, 0,
+  0, 36, 38, 0, 60, 0, 2, 0, 50, 0,
+  47, 0, 0, 0, 62, 0, 47, 0, 7, 0,
+  20, 0, 0, 8, 0, 4, 0, 8, 0, 7,
+  0, 0, 51, 44, 26, 26, 0, 37, 18, 0,
+  29, 6, 9, 13, 0, 18, 0, 17, 0, 0,
+  6, 0, 36, 0, 37, 0, 37, 0, 0, 0,
+  38, 0, 0, 12, 0, 42, 6, 15, 37, 28,
+  4, 4, 6, 14, 22, 0, 5, 59, 66, 39,
+  0, 24, 0, 0, 0, 20, 47, 15, 29, 33,
+  0, 35, 0, 0, 91, 34, 6, 0, 0, 11,
+  0, 10, 0, 18, 0, 22, 0, 58, 46, 78,
+  0, 43, 0, 62, 86, 46, 0, 56, 0, 0,
+  0, 20, 4, 0, 0, 0, 0, 0, 39, 0,
+  35, 6, 23, 0, 0, 0, 28, 23, 8, 0,
+  0, 0, 113, 0, 11, 9, 0, 0, 7, 22,
+  0, 0, 22, 29, 0, 8, 36, 0, 36, 0,
+  26, 59, 19, 7, 14, 19, 16, 0, 26, 17,
+  35, 32, 0, 9, 19, 42, 0, 0, 5, 0,
+  0, 0, 14, 11, 125, 0, 35, 0, 0, 0,
+  0, 58, 49, 0, 14, 0, 50, 16, 63, 8,
+  3, 26, 61, 1, 7, 53, 52, 0, 0, 15,
+  0, 27, 43, 19, 23, 0, 0, 13, 0, 0,
+  0, 0, 41, 0, 0, 6, 0, 16, 0, 79,
+  0, 24, 0, 55, 1, 70, 61, 46, 0, 21,
+  0, 20, 72, 1, 0, 0, 29, 0, 0, 0,
+  15, 36, 0, 43, 0, 14, 0, 0, 79, 0,
+  0, 0, 7, 27, 66, 15, 34, 28, 0, 0,
+  79, 0, 29, 0, 25, 0, 16, 0, 0, 0,
+  0, 0, 0, 17, 0, 26, 0, 0, 5, 71,
+  31, 0, 0, 0, 26, 0, 28, 0, 0, 38,
+  0, 0, 0, 2, 0, 0, 2, 14, 69, 0,
+  27, 0, 63, 0, 43, 7, 17, 0, 0, 6,
+  0, 0, 0, 1, 30, 12, 26, 0, 0, 25,
+  43, 0, 8, 23, 56, 23, 0, 0, 32, 29,
+  18, 2, 25, 0, 0, 0, 0, 0, 0, 0,
+  36, 17, 0, 0, 0, 0, 0, 34, 0, 11,
+  0, 58, 21, 87, 29, 59, 0, 1, 0, 52,
+  63, 0, 3, 0, 12, 0, 0, 0, 25, 4,
+  0, 38, 0, 10, 4, 0, 42, 0, 34, 0,
+  0, 17, 34, 0, 45, 41, 0, 0, 77, 0,
+  55, 0, 5, 0, 14, 0, 0, 0, 0, 31,
+  0, 0, 0, 22, 0, 0, 32, 57, 30, 0,
+  0, 9, 8, 0, 15, 0, 0, 13, 0, 14,
+  0, 2, 0, 0, 29, 0, 33, 0, 14, 0,
+  33, 0, 13, 6, 20, 0, 0, 5, 0, 30,
+  11, 9, 0, 0, 16, 0, 14, 0, 28, 0,
+  0, 43, 62, 17, 0, 4, 0, 0, 0, 14,
+  39, 0, 19, 14, 0, 0, 0, 0, 39, 51,
+  0, 0, 0, 0, 8, 0, 0, 0, 0, 26,
+  0, 76, 41, 64, 0, 17, 0, 73, 78, 15,
+  1, 58, 0, 0, 0, 0, 35, 0, 0, 26,
+  0, 0, 54, 0, 52, 39, 59, 0, 0, 16,
+  4, 0, 13, 36, 0, 0, 89, 0, 49, 0,
+  0, 20, 1, 30, 0, 0, 0, 79, 0, 0,
+  39, 0, 21, 0, 17, 79, 53, 5, 0, 14,
+  0, 0, 0, 9, 0, 17, 0, 33, 0, 25,
+  0, 0, 3, 0, 0, 0, 0, 0, 77, 0,
+  14, 5, 4, 0, 23, 19, 0, 34, 10, 9,
+  83, 40, 0, 0, 0, 24, 57, 8, 0, 49,
+  29, 55, 14, 27, 77, 6, 23, 33, 54, 0,
+  58, 20, 192, 4, 0, 22, 109, 15, 46, 0,
+  0, 37, 38, 5, 0, 0, 0, 70, 41, 137,
+  1, 46, 0, 13, 0, 79, 54, 2, 11, 54,
+  16, 0, 0, 0, 37, 0, 13, 6, 0, 0,
+  18, 17, 31, 11, 84, 0, 5, 0, 13, 0,
+  66, 45, 13, 0, 58, 0, 30, 0, 0, 0,
+  28, 0, 31, 38, 0, 18, 0, 18, 32, 25,
+  25, 0, 48, 37, 18, 2, 0, 55, 81, 0,
+  12, 13, 23, 14, 0, 32, 10, 37, 0, 0,
+  29, 0, 19, 21, 86, 0, 13, 0, 0, 0,
+  37, 12, 0, 33, 0, 8, 0, 0, 88, 51,
+  0, 25, 4, 29, 23, 1, 15, 91, 42, 50,
+  0, 22, 30, 0, 0, 49, 47, 30, 47, 45,
+  143, 63, 23, 6, 105, 25, 47, 0, 0, 39,
+  4, 30, 0, 3, 39, 25, 43, 65, 2, 47,
+  0, 56, 16, 77, 68, 39, 2, 24, 5, 0,
+  0, 43, 0, 0, 0, 26, 0, 4, 28, 0,
+  0, 0, 1, 21, 0, 0, 4, 46, 30, 14,
+  4, 0, 94, 0, 0, 19, 0, 0, 9, 3,
+  54, 33, 28, 12, 0, 25, 28, 16, 54, 0,
+  16, 44, 0, 0, 10, 24, 96, 0, 13, 21,
+  39, 36, 23, 10, 46, 34, 8, 0, 13, 0,
+  3, 31, 63, 19, 94, 0, 15, 0, 17, 0,
+  0, 98, 1, 0, 0, 0, 70, 26, 1, 40,
+  0, 18, 8, 0, 0, 55, 20, 56, 0, 28,
+  0, 0, 9, 77, 37, 43, 56, 51, 165, 33,
+  18, 0, 85, 0, 49, 0, 0, 7, 13, 31,
+  0, 0, 65, 0, 42, 42, 0, 0, 0, 51,
+  14, 68, 75, 5, 23, 0, 0, 0, 0, 38,
+  0, 3, 1, 24, 0, 20, 44, 0, 0, 18,
+  0, 29, 38, 5, 30, 64, 3, 48, 31, 0,
+  73, 0, 0, 22, 0, 9, 14, 16, 72, 24,
+  54, 0, 0, 3, 10, 1, 31, 0, 4, 29,
+  0, 13, 27, 0, 87, 0, 38, 9, 40, 53,
+  46, 4, 16, 15, 5, 0, 5, 0, 11, 52,
+  56, 10, 49, 0, 36, 0, 7, 0, 7, 18,
+  0, 16, 0, 21, 57, 17, 0, 0, 0, 41,
+  57, 2, 0, 6, 60, 44, 5, 5, 45, 0,
+  15, 0, 37, 0, 27, 0, 0, 35, 0, 0,
+  85, 0, 0, 0, 0, 5, 0, 0, 0, 23,
+  0, 64, 4, 113, 25, 79, 0, 0, 0, 41,
+  66, 0, 0, 22, 11, 0, 0, 0, 15, 0,
+  0, 2, 0, 0, 0, 36, 38, 0, 60, 0,
+  2, 0, 50, 0, 47, 0, 0, 0, 62, 0,
+  47, 0, 7, 0, 20, 0, 0, 8, 0, 4,
+  0, 8, 0, 7, 0, 0, 51, 44, 26, 26,
+  0, 37, 18, 0, 29, 6, 9, 13, 0, 18,
+  0, 17, 0, 0, 6, 0, 36, 0, 37, 0,
+  37, 0, 0, 0, 38, 0, 0, 12, 0, 42,
+  6, 15, 37, 28, 4, 4, 6, 14, 22, 0,
+  5, 59, 66, 39, 0, 24, 0, 0, 0, 20,
+  47, 15, 29, 33, 0, 35, 0, 0, 91, 34,
+  6, 0, 0, 11, 0, 10, 0, 18, 0, 22,
+  0, 58, 46, 78, 0, 43, 0, 62, 86, 46,
+  0, 56, 0, 0, 0, 20, 4, 0, 0, 0,
+  0, 0, 39, 0, 35, 6, 23, 0, 0, 0,
+  28, 23, 8, 0, 0, 0, 113, 0, 11, 9,
+  0, 0, 7, 22, 0, 0, 22, 29, 0, 8,
+  36, 0, 36, 0, 26, 59, 19, 7, 14, 19,
+  16, 0, 26, 17, 35, 32, 0, 9, 19, 42,
+  0, 0, 5, 0, 0, 0, 14, 11, 125, 0,
+  35, 0, 0, 0, 0, 93, 5, 24, 14, 0,
+  37, 16, 19, 24, 15, 1, 7, 0, 45, 74,
+  66, 43, 0, 20, 0, 0, 0, 49, 65, 69,
+  6, 62, 0, 1, 5, 0, 69, 27, 8, 0,
+  0, 8, 0, 34, 0, 35, 41, 0, 16, 0,
+  40, 0, 0, 56, 0, 37, 99, 45, 0, 4,
+  0, 17, 0, 45, 12, 0, 0, 33, 0, 12,
+  78, 0, 23, 0, 0, 0, 0, 6, 46, 35,
+  1, 18, 0, 2, 119, 0, 0, 1, 0, 16,
+  0, 27, 17, 29, 59, 0, 0, 26, 0, 8,
+  27, 0, 0, 42, 0, 0, 29, 0, 16, 0,
+  32, 10, 52, 56, 0, 0, 9, 11, 0, 0,
+  0, 0, 0, 0, 4, 23, 137, 0, 66, 0,
+  0, 0, 0, 6, 0, 0, 0, 1, 30, 12,
+  26, 0, 0, 25, 43, 0, 8, 23, 56, 23,
+  0, 0, 32, 29, 18, 2, 25, 0, 0, 0,
+  0, 0, 0, 0, 36, 17, 0, 0, 0, 0,
+  0, 34, 0, 11, 0, 58, 21, 87, 29, 59,
+  0, 1, 0, 52, 63, 0, 3, 0, 12, 0,
+  0, 0, 25, 4, 0, 38, 0, 10, 4, 0,
+  42, 0, 34, 0, 0, 17, 34, 0, 45, 41,
+  0, 0, 77, 0, 55, 0, 5, 0, 14, 0,
+  0, 0, 0, 31, 0, 0, 0, 22, 0, 0,
+  32, 57, 30, 0, 0, 9, 8, 0, 15, 0,
+  0, 13, 0, 14, 0, 2, 0, 0, 29, 0,
+  33, 0, 14, 0, 33, 0, 13, 6, 20, 0,
+  0, 5, 0, 30, 11, 9, 0, 0, 16, 0,
+  14, 0, 28, 0, 0, 43, 62, 17, 0, 4,
+  0, 0, 0, 14, 39, 0, 19, 14, 0, 0,
+  0, 0, 39, 51, 0, 0, 0, 0, 8, 0,
+  0, 0, 0, 26, 0, 76, 41, 64, 0, 17,
+  0, 73, 78, 15, 1, 58, 0, 0, 0, 0,
+  35, 0, 0, 26, 0, 0, 54, 0, 52, 39,
+  59, 0, 0, 16, 4, 0, 13, 36, 0, 0,
+  89, 0, 49, 0, 0, 20, 1, 30, 0, 0,
+  0, 79, 0, 0, 39, 0, 21, 0, 17, 79,
+  53, 5, 0, 14, 0, 0, 0, 9, 0, 17,
+  0, 33, 0, 25, 0, 0, 3, 0, 0, 0,
+  0, 0, 77, 0, 14, 5, 4, 0, 0, 37,
+  0, 30, 19, 0, 8, 0, 29, 1, 5, 0,
+  23, 0, 24, 68, 78, 31, 0, 2, 0, 0,
+  0, 40, 45, 0, 20, 28, 0, 0, 7, 0,
+  46, 69, 0, 0, 0, 8, 7, 0, 0, 0,
+  0, 16, 0, 35, 63, 39, 0, 11, 0, 42,
+  72, 27, 0, 30, 0, 4, 0, 3, 38, 0,
+  0, 31, 0, 0, 79, 0, 75, 41, 0, 0,
+  0, 12, 16, 0, 14, 1, 0, 0, 85, 0,
+  26, 0, 0, 32, 0, 18, 6, 0, 14, 72,
+  0, 6, 28, 0, 15, 0, 0, 80, 18, 0,
+  0, 7, 0, 0, 0, 0, 2, 22, 0, 30,
+  8, 22, 3, 0, 0, 0, 0, 0, 0, 0,
+  101, 0, 9, 26, 7, 0, 0, 33, 0, 8,
+  0, 0, 88, 51, 0, 25, 4, 29, 23, 1,
+  15, 91, 42, 50, 0, 22, 30, 0, 0, 49,
+  47, 30, 47, 45, 143, 63, 23, 6, 105, 25,
+  47, 0, 0, 39, 4, 30, 0, 3, 39, 25,
+  43, 65, 2, 47, 0, 56, 16, 77, 68, 39,
+  2, 24, 5, 0, 0, 43, 0, 0, 0, 26,
+  0, 4, 28, 0, 0, 0, 1, 21, 0, 0,
+  4, 46, 30, 14, 4, 0, 94, 0, 0, 19,
+  0, 0, 9, 3, 54, 33, 28, 12, 0, 25,
+  28, 16, 54, 0, 16, 44, 0, 0, 10, 24,
+  96, 0, 13, 21, 39, 36, 23, 10, 46, 34,
+  8, 0, 13, 0, 3, 31, 63, 19, 94, 0,
+  15, 0, 17, 0, 0, 98, 1, 0, 0, 0,
+  70, 26, 1, 40, 0, 18, 8, 0, 0, 55,
+  20, 56, 0, 28, 0, 0, 9, 77, 37, 43,
+  56, 51, 165, 33, 18, 0, 85, 0, 49, 0,
+  0, 7, 13, 31, 0, 0, 65, 0, 42, 42,
+  0, 0, 0, 51, 14, 68, 75, 5, 23, 0,
+  0, 0, 0, 38, 0, 3, 1, 24, 0, 20,
+  44, 0, 0, 18, 0, 29, 38, 5, 30, 64,
+  3, 48, 31, 0, 73, 0, 0, 22, 0, 9,
+  14, 16, 72, 24, 54, 0, 0, 3, 10, 1,
+  31, 0, 4, 29, 0, 13, 27, 0, 87, 0,
+  38, 9, 40, 53, 46, 4, 16, 15, 5, 0,
+  5, 0, 11, 52, 56, 10, 49, 0, 36, 0,
+  7, 0, 21, 87, 0, 17, 0, 0, 7, 0,
+  27, 18, 0, 30, 39, 0, 0, 11, 9, 43,
+  15, 26, 0, 36, 93, 68, 12, 0, 68, 46,
+  209, 0, 0, 0, 54, 0, 48, 43, 0, 0,
+  65, 3, 0, 0, 39, 14, 18, 96, 0, 0,
+  0, 10, 0, 107, 61, 0, 69, 0, 19, 0,
+  17, 0, 20, 40, 0, 0, 35, 25, 0, 0,
+  0, 58, 134, 10, 46, 0, 8, 33, 3, 95,
+  34, 0, 24, 0, 8, 20, 0, 5, 21, 22,
+  59, 0, 30, 0, 0, 0, 54, 0, 27, 0,
+  10, 43, 26, 72, 29, 15, 69, 18, 47, 0,
+  13, 38, 8, 8, 0, 1, 0, 0, 3, 0,
+  8, 49, 53, 0, 0, 0, 36, 0, 0, 0,
+  0, 12, 0, 42, 6, 15, 37, 28, 4, 4,
+  6, 14, 22, 0, 5, 59, 66, 39, 0, 24,
+  0, 0, 0, 20, 47, 15, 29, 33, 0, 35,
+  0, 0, 91, 34, 6, 0, 0, 11, 0, 10,
+  0, 18, 0, 22, 0, 58, 46, 78, 0, 43,
+  0, 62, 86, 46, 0, 56, 0, 0, 0, 20,
+  4, 0, 0, 0, 0, 0, 39, 0, 35, 6,
+  23, 0, 0, 0, 28, 23, 8, 0, 0, 0,
+  113, 0, 11, 9, 0, 0, 7, 22, 0, 0,
+  22, 29, 0, 8, 36, 0, 36, 0, 26, 59,
+  19, 7, 14, 19, 16, 0, 26, 17, 35, 32,
+  0, 9, 19, 42, 0, 0, 5, 0, 0, 0,
+  14, 11, 125, 0, 35, 0, 0, 0, 0, 93,
+  5, 24, 14, 0, 37, 16, 19, 24, 15, 1,
+  7, 0, 45, 74, 66, 43, 0, 20, 0, 0,
+  0, 49, 65, 69, 6, 62, 0, 1, 5, 0,
+  69, 27, 8, 0, 0, 8, 0, 34, 0, 35,
+  41, 0, 16, 0, 40, 0, 0, 56, 0, 37,
+  99, 45, 0, 4, 0, 17, 0, 45, 12, 0,
+  0, 33, 0, 12, 78, 0, 23, 0, 0, 0,
+  0, 6, 46, 35, 1, 18, 0, 2, 119, 0,
+  0, 1, 0, 16, 0, 27, 17, 29, 59, 0,
+  0, 26, 0, 8, 27, 0, 0, 42, 0, 0,
+  29, 0, 16, 0, 32, 10, 52, 56, 0, 0,
+  9, 11, 0, 0, 0, 0, 0, 0, 4, 23,
+  137, 0, 66, 0, 0, 0, 0, 115, 36, 17,
+  6, 0, 3, 0, 44, 17, 0, 0, 3, 0,
+  0, 24, 36, 38, 6, 35, 0, 0, 67, 53,
+  19, 0, 40, 54, 0, 0, 0, 0, 68, 0,
+  53, 8, 0, 0, 28, 2, 0, 0, 37, 25,
+  0, 67, 27, 0, 0, 2, 0, 53, 88, 0,
+  20, 0, 26, 0, 0, 0, 0, 27, 0, 0,
+  0, 0, 0, 0, 0, 14, 53, 0, 37, 17,
+  61, 42, 0, 74, 24, 0, 64, 0, 4, 21,
+  0, 0, 6, 36, 25, 20, 74, 0, 0, 0,
+  24, 0, 0, 0, 0, 53, 38, 17, 0, 0,
+  21, 4, 62, 0, 41, 58, 0, 16, 0, 3,
+  0, 0, 0, 0, 0, 6, 0, 0, 35, 0,
+  53, 1, 0, 0, 0, 5, 0, 30, 11, 9,
+  0, 0, 16, 0, 14, 0, 28, 0, 0, 43,
+  62, 17, 0, 4, 0, 0, 0, 14, 39, 0,
+  19, 14, 0, 0, 0, 0, 39, 51, 0, 0,
+  0, 0, 8, 0, 0, 0, 0, 26, 0, 76,
+  41, 64, 0, 17, 0, 73, 78, 15, 1, 58,
+  0, 0, 0, 0, 35, 0, 0, 26, 0, 0,
+  54, 0, 52, 39, 59, 0, 0, 16, 4, 0,
+  13, 36, 0, 0, 89, 0, 49, 0, 0, 20,
+  1, 30, 0, 0, 0, 79, 0, 0, 39, 0,
+  21, 0, 17, 79, 53, 5, 0, 14, 0, 0,
+  0, 9, 0, 17, 0, 33, 0, 25, 0, 0,
+  3, 0, 0, 0, 0, 0, 77, 0, 14, 5,
+  4, 0, 0, 37, 0, 30, 19, 0, 8, 0,
+  29, 1, 5, 0, 23, 0, 24, 68, 78, 31,
+  0, 2, 0, 0, 0, 40, 45, 0, 20, 28,
+  0, 0, 7, 0, 46, 69, 0, 0, 0, 8,
+  7, 0, 0, 0, 0, 16, 0, 35, 63, 39,
+  0, 11, 0, 42, 72, 27, 0, 30, 0, 4,
+  0, 3, 38, 0, 0, 31, 0, 0, 79, 0,
+  75, 41, 0, 0, 0, 12, 16, 0, 14, 1,
+  0, 0, 85, 0, 26, 0, 0, 32, 0, 18,
+  6, 0, 14, 72, 0, 6, 28, 0, 15, 0,
+  0, 80, 18, 0, 0, 7, 0, 0, 0, 0,
+  2, 22, 0, 30, 8, 22, 3, 0, 0, 0,
+  0, 0, 0, 0, 101, 0, 9, 26, 7, 0,
+  0, 119, 31, 10, 0, 0, 55, 0, 33, 18,
+  0, 0, 0, 0, 46, 39, 65, 38, 5, 18,
+  0, 0, 0, 46, 49, 6, 24, 40, 0, 0,
+  0, 0, 84, 26, 0, 0, 0, 16, 0, 3,
+  0, 0, 24, 17, 0, 45, 64, 6, 0, 10,
+  0, 0, 73, 0, 0, 0, 32, 0, 0, 35,
+  7, 5, 0, 0, 0, 0, 63, 0, 26, 11,
+  0, 0, 0, 15, 64, 26, 8, 27, 5, 0,
+  67, 3, 18, 28, 0, 6, 0, 0, 1, 26,
+  36, 0, 0, 22, 0, 0, 0, 0, 0, 60,
+  6, 0, 0, 0, 2, 0, 43, 0, 35, 36,
+  0, 21, 0, 19, 0, 0, 0, 0, 13, 0,
+  0, 0, 95, 0, 24, 41, 20, 0, 0, 98,
+  1, 0, 0, 0, 70, 26, 1, 40, 0, 18,
+  8, 0, 0, 55, 20, 56, 0, 28, 0, 0,
+  9, 77, 37, 43, 56, 51, 165, 33, 18, 0,
+  85, 0, 49, 0, 0, 7, 13, 31, 0, 0,
+  65, 0, 42, 42, 0, 0, 0, 51, 14, 68,
+  75, 5, 23, 0, 0, 0, 0, 38, 0, 3,
+  1, 24, 0, 20, 44, 0, 0, 18, 0, 29,
+  38, 5, 30, 64, 3, 48, 31, 0, 73, 0,
+  0, 22, 0, 9, 14, 16, 72, 24, 54, 0,
+  0, 3, 10, 1, 31, 0, 4, 29, 0, 13,
+  27, 0, 87, 0, 38, 9, 40, 53, 46, 4,
+  16, 15, 5, 0, 5, 0, 11, 52, 56, 10,
+  49, 0, 36, 0, 7, 0, 21, 87, 0, 17,
+  0, 0, 7, 0, 27, 18, 0, 30, 39, 0,
+  0, 11, 9, 43, 15, 26, 0, 36, 93, 68,
+  12, 0, 68, 46, 209, 0, 0, 0, 54, 0,
+  48, 43, 0, 0, 65, 3, 0, 0, 39, 14,
+  18, 96, 0, 0, 0, 10, 0, 107, 61, 0,
+  69, 0, 19, 0, 17, 0, 20, 40, 0, 0,
+  35, 25, 0, 0, 0, 58, 134, 10, 46, 0,
+  8, 33, 3, 95, 34, 0, 24, 0, 8, 20,
+  0, 5, 21, 22, 59, 0, 30, 0, 0, 0,
+  54, 0, 27, 0, 10, 43, 26, 72, 29, 15,
+  69, 18, 47, 0, 13, 38, 8, 8, 0, 1,
+  0, 0, 3, 0, 8, 49, 53, 0, 0, 0,
+  36, 0, 0, 0, 121, 68, 0, 69, 37, 0,
+  10, 0, 13, 0, 0, 24, 109, 0, 0, 19,
+  14, 0, 23, 0, 0, 116, 51, 34, 64, 0,
+  36, 36, 222, 0, 6, 97, 40, 17, 23, 41,
+  0, 0, 124, 6, 0, 0, 30, 56, 59, 90,
+  15, 0, 0, 12, 0, 135, 15, 0, 103, 17,
+  27, 22, 53, 0, 58, 43, 30, 87, 0, 83,
+  14, 0, 21, 25, 137, 20, 29, 0, 0, 0,
+  51, 86, 41, 0, 7, 0, 17, 24, 0, 13,
+  21, 0, 55, 9, 0, 0, 0, 0, 22, 16,
+  63, 0, 40, 42, 4, 62, 32, 21, 74, 29,
+  0, 42, 54, 0, 12, 14, 0, 0, 0, 27,
+  4, 0, 11, 38, 71, 25, 0, 34, 62, 0,
+  9, 24, 0, 93, 5, 24, 14, 0, 37, 16,
+  19, 24, 15, 1, 7, 0, 45, 74, 66, 43,
+  0, 20, 0, 0, 0, 49, 65, 69, 6, 62,
+  0, 1, 5, 0, 69, 27, 8, 0, 0, 8,
+  0, 34, 0, 35, 41, 0, 16, 0, 40, 0,
+  0, 56, 0, 37, 99, 45, 0, 4, 0, 17,
+  0, 45, 12, 0, 0, 33, 0, 12, 78, 0,
+  23, 0, 0, 0, 0, 6, 46, 35, 1, 18,
+  0, 2, 119, 0, 0, 1, 0, 16, 0, 27,
+  17, 29, 59, 0, 0, 26, 0, 8, 27, 0,
+  0, 42, 0, 0, 29, 0, 16, 0, 32, 10,
+  52, 56, 0, 0, 9, 11, 0, 0, 0, 0,
+  0, 0, 4, 23, 137, 0, 66, 0, 0, 0,
+  0, 115, 36, 17, 6, 0, 3, 0, 44, 17,
+  0, 0, 3, 0, 0, 24, 36, 38, 6, 35,
+  0, 0, 67, 53, 19, 0, 40, 54, 0, 0,
+  0, 0, 68, 0, 53, 8, 0, 0, 28, 2,
+  0, 0, 37, 25, 0, 67, 27, 0, 0, 2,
+  0, 53, 88, 0, 20, 0, 26, 0, 0, 0,
+  0, 27, 0, 0, 0, 0, 0, 0, 0, 14,
+  53, 0, 37, 17, 61, 42, 0, 74, 24, 0,
+  64, 0, 4, 21, 0, 0, 6, 36, 25, 20,
+  74, 0, 0, 0, 24, 0, 0, 0, 0, 53,
+  38, 17, 0, 0, 21, 4, 62, 0, 41, 58,
+  0, 16, 0, 3, 0, 0, 0, 0, 0, 6,
+  0, 0, 35, 0, 53, 1, 0, 0, 55, 68,
+  5, 59, 7, 0, 0, 0, 39, 0, 0, 18,
+  78, 0, 0, 0, 25, 2, 0, 0, 0, 34,
+  65, 19, 34, 0, 18, 36, 0, 0, 0, 6,
+  13, 0, 31, 16, 0, 0, 71, 0, 0, 16,
+  19, 37, 0, 40, 14, 0, 0, 0, 0, 107,
+  29, 0, 61, 0, 36, 0, 0, 0, 0, 19,
+  0, 10, 41, 34, 0, 0, 22, 0, 133, 0,
+  33, 13, 17, 0, 9, 54, 28, 7, 16, 0,
+  14, 15, 15, 0, 15, 0, 48, 0, 1, 0,
+  0, 0, 0, 0, 10, 0, 0, 40, 0, 1,
+  9, 0, 35, 68, 7, 20, 38, 3, 0, 13,
+  0, 0, 0, 0, 0, 0, 0, 9, 0, 0,
+  0, 0, 53, 0, 0, 0, 0, 37, 0, 30,
+  19, 0, 8, 0, 29, 1, 5, 0, 23, 0,
+  24, 68, 78, 31, 0, 2, 0, 0, 0, 40,
+  45, 0, 20, 28, 0, 0, 7, 0, 46, 69,
+  0, 0, 0, 8, 7, 0, 0, 0, 0, 16,
+  0, 35, 63, 39, 0, 11, 0, 42, 72, 27,
+  0, 30, 0, 4, 0, 3, 38, 0, 0, 31,
+  0, 0, 79, 0, 75, 41, 0, 0, 0, 12,
+  16, 0, 14, 1, 0, 0, 85, 0, 26, 0,
+  0, 32, 0, 18, 6, 0, 14, 72, 0, 6,
+  28, 0, 15, 0, 0, 80, 18, 0, 0, 7,
+  0, 0, 0, 0, 2, 22, 0, 30, 8, 22,
+  3, 0, 0, 0, 0, 0, 0, 0, 101, 0,
+  9, 26, 7, 0, 0, 119, 31, 10, 0, 0,
+  55, 0, 33, 18, 0, 0, 0, 0, 46, 39,
+  65, 38, 5, 18, 0, 0, 0, 46, 49, 6,
+  24, 40, 0, 0, 0, 0, 84, 26, 0, 0,
+  0, 16, 0, 3, 0, 0, 24, 17, 0, 45,
+  64, 6, 0, 10, 0, 0, 73, 0, 0, 0,
+  32, 0, 0, 35, 7, 5, 0, 0, 0, 0,
+  63, 0, 26, 11, 0, 0, 0, 15, 64, 26,
+  8, 27, 5, 0, 67, 3, 18, 28, 0, 6,
+  0, 0, 1, 26, 36, 0, 0, 22, 0, 0,
+  0, 0, 0, 60, 6, 0, 0, 0, 2, 0,
+  43, 0, 35, 36, 0, 21, 0, 19, 0, 0,
+  0, 0, 13, 0, 0, 0, 95, 0, 24, 41,
+  20, 0, 0, 104, 16, 18, 0, 0, 0, 0,
+  47, 19, 0, 0, 6, 0, 7, 17, 36, 23,
+  0, 2, 0, 0, 72, 39, 0, 0, 14, 29,
+  0, 0, 0, 0, 40, 0, 36, 14, 0, 1,
+  11, 0, 0, 0, 22, 32, 0, 52, 25, 0,
+  0, 0, 0, 42, 40, 0, 22, 0, 44, 0,
+  3, 0, 0, 33, 0, 0, 52, 0, 0, 0,
+  0, 10, 106, 0, 39, 32, 46, 45, 0, 59,
+  28, 0, 21, 0, 1, 31, 0, 0, 5, 21,
+  26, 0, 31, 0, 0, 0, 5, 0, 0, 0,
+  0, 52, 28, 23, 1, 0, 7, 59, 48, 1,
+  0, 29, 0, 28, 0, 8, 0, 0, 0, 0,
+  0, 12, 0, 0, 0, 0, 49, 26, 5, 0,
+  21, 87, 0, 17, 0, 0, 7, 0, 27, 18,
+  0, 30, 39, 0, 0, 11, 9, 43, 15, 26,
+  0, 36, 93, 68, 12, 0, 68, 46, 209, 0,
+  0, 0, 54, 0, 48, 43, 0, 0, 65, 3,
+  0, 0, 39, 14, 18, 96, 0, 0, 0, 10,
+  0, 107, 61, 0, 69, 0, 19, 0, 17, 0,
+  20, 40, 0, 0, 35, 25, 0, 0, 0, 58,
+  134, 10, 46, 0, 8, 33, 3, 95, 34, 0,
+  24, 0, 8, 20, 0, 5, 21, 22, 59, 0,
+  30, 0, 0, 0, 54, 0, 27, 0, 10, 43,
+  26, 72, 29, 15, 69, 18, 47, 0, 13, 38,
+  8, 8, 0, 1, 0, 0, 3, 0, 8, 49,
+  53, 0, 0, 0, 36, 0, 0, 0, 121, 68,
+  0, 69, 37, 0, 10, 0, 13, 0, 0, 24,
+  109, 0, 0, 19, 14, 0, 23, 0, 0, 116,
+  51, 34, 64, 0, 36, 36, 222, 0, 6, 97,
+  40, 17, 23, 41, 0, 0, 124, 6, 0, 0,
+  30, 56, 59, 90, 15, 0, 0, 12, 0, 135,
+  15, 0, 103, 17, 27, 22, 53, 0, 58, 43,
+  30, 87, 0, 83, 14, 0, 21, 25, 137, 20,
+  29, 0, 0, 0, 51, 86, 41, 0, 7, 0,
+  17, 24, 0, 13, 21, 0, 55, 9, 0, 0,
+  0, 0, 22, 16, 63, 0, 40, 42, 4, 62,
+  32, 21, 74, 29, 0, 42, 54, 0, 12, 14,
+  0, 0, 0, 27, 4, 0, 11, 38, 71, 25,
+  0, 34, 62, 0, 9, 24, 66, 10, 0, 31,
+  29, 110, 12, 0, 20, 0, 0, 9, 85, 0,
+  0, 46, 16, 30, 0, 0, 33, 111, 0, 60,
+  48, 0, 3, 44, 255, 0, 0, 72, 42, 37,
+  17, 24, 0, 22, 96, 20, 32, 0, 17, 61,
+  85, 122, 14, 0, 0, 23, 0, 130, 26, 0,
+  91, 47, 26, 11, 67, 0, 34, 60, 32, 28,
+  0, 46, 0, 4, 12, 28, 143, 0, 41, 3,
+  0, 22, 11, 56, 20, 0, 23, 0, 1, 24,
+  0, 0, 19, 5, 50, 28, 0, 55, 8, 0,
+  61, 18, 20, 0, 39, 55, 9, 30, 21, 7,
+  86, 7, 1, 22, 0, 7, 0, 16, 0, 0,
+  0, 31, 20, 0, 35, 34, 69, 0, 0, 44,
+  59, 0, 6, 4, 0, 115, 36, 17, 6, 0,
+  3, 0, 44, 17, 0, 0, 3, 0, 0, 24,
+  36, 38, 6, 35, 0, 0, 67, 53, 19, 0,
+  40, 54, 0, 0, 0, 0, 68, 0, 53, 8,
+  0, 0, 28, 2, 0, 0, 37, 25, 0, 67,
+  27, 0, 0, 2, 0, 53, 88, 0, 20, 0,
+  26, 0, 0, 0, 0, 27, 0, 0, 0, 0,
+  0, 0, 0, 14, 53, 0, 37, 17, 61, 42,
+  0, 74, 24, 0, 64, 0, 4, 21, 0, 0,
+  6, 36, 25, 20, 74, 0, 0, 0, 24, 0,
+  0, 0, 0, 53, 38, 17, 0, 0, 21, 4,
+  62, 0, 41, 58, 0, 16, 0, 3, 0, 0,
+  0, 0, 0, 6, 0, 0, 35, 0, 53, 1,
+  0, 0, 55, 68, 5, 59, 7, 0, 0, 0,
+  39, 0, 0, 18, 78, 0, 0, 0, 25, 2,
+  0, 0, 0, 34, 65, 19, 34, 0, 18, 36,
+  0, 0, 0, 6, 13, 0, 31, 16, 0, 0,
+  71, 0, 0, 16, 19, 37, 0, 40, 14, 0,
+  0, 0, 0, 107, 29, 0, 61, 0, 36, 0,
+  0, 0, 0, 19, 0, 10, 41, 34, 0, 0,
+  22, 0, 133, 0, 33, 13, 17, 0, 9, 54,
+  28, 7, 16, 0, 14, 15, 15, 0, 15, 0,
+  48, 0, 1, 0, 0, 0, 0, 0, 10, 0,
+  0, 40, 0, 1, 9, 0, 35, 68, 7, 20,
+  38, 3, 0, 13, 0, 0, 0, 0, 0, 0,
+  0, 9, 0, 0, 0, 0, 53, 0, 0, 0,
+  104, 21, 0, 47, 20, 66, 0, 0, 53, 0,
+  0, 0, 116, 0, 0, 40, 62, 0, 2, 0,
+  11, 68, 0, 8, 23, 0, 0, 43, 3, 1,
+  13, 72, 0, 27, 24, 0, 0, 21, 96, 5,
+  13, 87, 14, 47, 59, 16, 0, 0, 0, 0,
+  0, 111, 0, 0, 107, 59, 25, 17, 19, 0,
+  0, 13, 9, 35, 0, 93, 0, 0, 13, 0,
+  155, 30, 22, 32, 0, 0, 34, 19, 0, 47,
+  0, 0, 15, 14, 42, 14, 8, 0, 73, 0,
+  0, 0, 0, 2, 0, 0, 31, 0, 21, 50,
+  0, 0, 5, 0, 30, 31, 0, 67, 22, 0,
+  17, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+  0, 3, 0, 16, 53, 0, 3, 16, 0, 119,
+  31, 10, 0, 0, 55, 0, 33, 18, 0, 0,
+  0, 0, 46, 39, 65, 38, 5, 18, 0, 0,
+  0, 46, 49, 6, 24, 40, 0, 0, 0, 0,
+  84, 26, 0, 0, 0, 16, 0, 3, 0, 0,
+  24, 17, 0, 45, 64, 6, 0, 10, 0, 0,
+  73, 0, 0, 0, 32, 0, 0, 35, 7, 5,
+  0, 0, 0, 0, 63, 0, 26, 11, 0, 0,
+  0, 15, 64, 26, 8, 27, 5, 0, 67, 3,
+  18, 28, 0, 6, 0, 0, 1, 26, 36, 0,
+  0, 22, 0, 0, 0, 0, 0, 60, 6, 0,
+  0, 0, 2, 0, 43, 0, 35, 36, 0, 21,
+  0, 19, 0, 0, 0, 0, 13, 0, 0, 0,
+  95, 0, 24, 41, 20, 0, 0, 104, 16, 18,
+  0, 0, 0, 0, 47, 19, 0, 0, 6, 0,
+  7, 17, 36, 23, 0, 2, 0, 0, 72, 39,
+  0, 0, 14, 29, 0, 0, 0, 0, 40, 0,
+  36, 14, 0, 1, 11, 0, 0, 0, 22, 32,
+  0, 52, 25, 0, 0, 0, 0, 42, 40, 0,
+  22, 0, 44, 0, 3, 0, 0, 33, 0, 0,
+  52, 0, 0, 0, 0, 10, 106, 0, 39, 32,
+  46, 45, 0, 59, 28, 0, 21, 0, 1, 31,
+  0, 0, 5, 21, 26, 0, 31, 0, 0, 0,
+  5, 0, 0, 0, 0, 52, 28, 23, 1, 0,
+  7, 59, 48, 1, 0, 29, 0, 28, 0, 8,
+  0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+  49, 26, 5, 0, 107, 66, 16, 65, 30, 0,
+  0, 17, 71, 14, 28, 0, 85, 0, 0, 80,
+  60, 0, 13, 0, 0, 32, 32, 6, 0, 0,
+  0, 61, 0, 37, 19, 69, 10, 6, 18, 5,
+  0, 44, 103, 0, 0, 23, 0, 23, 18, 0,
+  0, 0, 0, 0, 0, 86, 0, 0, 83, 13,
+  32, 36, 9, 0, 0, 0, 0, 0, 15, 55,
+  0, 0, 11, 0, 91, 19, 43, 55, 0, 39,
+  28, 49, 0, 26, 0, 0, 19, 64, 28, 26,
+  14, 0, 86, 0, 32, 0, 0, 14, 0, 0,
+  66, 0, 5, 67, 43, 0, 9, 0, 0, 58,
+  0, 60, 9, 0, 6, 0, 0, 0, 0, 0,
+  0, 0, 0, 15, 0, 4, 0, 18, 46, 15,
+  12, 30, 121, 68, 0, 69, 37, 0, 10, 0,
+  13, 0, 0, 24, 109, 0, 0, 19, 14, 0,
+  23, 0, 0, 116, 51, 34, 64, 0, 36, 36,
+  222, 0, 6, 97, 40, 17, 23, 41, 0, 0,
+  124, 6, 0, 0, 30, 56, 59, 90, 15, 0,
+  0, 12, 0, 135, 15, 0, 103, 17, 27, 22,
+  53, 0, 58, 43, 30, 87, 0, 83, 14, 0,
+  21, 25, 137, 20, 29, 0, 0, 0, 51, 86,
+  41, 0, 7, 0, 17, 24, 0, 13, 21, 0,
+  55, 9, 0, 0, 0, 0, 22, 16, 63, 0,
+  40, 42, 4, 62, 32, 21, 74, 29, 0, 42,
+  54, 0, 12, 14, 0, 0, 0, 27, 4, 0,
+  11, 38, 71, 25, 0, 34, 62, 0, 9, 24,
+  66, 10, 0, 31, 29, 110, 12, 0, 20, 0,
+  0, 9, 85, 0, 0, 46, 16, 30, 0, 0,
+  33, 111, 0, 60, 48, 0, 3, 44, 255, 0,
+  0, 72, 42, 37, 17, 24, 0, 22, 96, 20,
+  32, 0, 17, 61, 85, 122, 14, 0, 0, 23,
+  0, 130, 26, 0, 91, 47, 26, 11, 67, 0,
+  34, 60, 32, 28, 0, 46, 0, 4, 12, 28,
+  143, 0, 41, 3, 0, 22, 11, 56, 20, 0,
+  23, 0, 1, 24, 0, 0, 19, 5, 50, 28,
+  0, 55, 8, 0, 61, 18, 20, 0, 39, 55,
+  9, 30, 21, 7, 86, 7, 1, 22, 0, 7,
+  0, 16, 0, 0, 0, 31, 20, 0, 35, 34,
+  69, 0, 0, 44, 59, 0, 6, 4, 0, 38,
+  0, 0, 7, 72, 57, 6, 59, 17, 0, 6,
+  46, 16, 0, 163, 49, 58, 0, 0, 76, 0,
+  0, 90, 29, 28, 5, 40, 214, 33, 0, 0,
+  89, 29, 32, 0, 0, 53, 10, 75, 12, 0,
+  0, 45, 49, 87, 5, 9, 0, 73, 3, 65,
+  107, 1, 7, 49, 22, 23, 0, 54, 0, 5,
+  0, 32, 0, 1, 11, 0, 25, 0, 29, 0,
+  39, 11, 0, 97, 0, 37, 0, 1, 62, 0,
+  14, 26, 0, 4, 35, 12, 60, 53, 62, 78,
+  0, 3, 68, 5, 0, 0, 50, 64, 14, 0,
+  0, 0, 76, 0, 29, 16, 1, 58, 17, 0,
+  0, 22, 0, 0, 0, 12, 39, 12, 66, 4,
+  74, 0, 59, 0, 32, 0, 55, 68, 5, 59,
+  7, 0, 0, 0, 39, 0, 0, 18, 78, 0,
+  0, 0, 25, 2, 0, 0, 0, 34, 65, 19,
+  34, 0, 18, 36, 0, 0, 0, 6, 13, 0,
+  31, 16, 0, 0, 71, 0, 0, 16, 19, 37,
+  0, 40, 14, 0, 0, 0, 0, 107, 29, 0,
+  61, 0, 36, 0, 0, 0, 0, 19, 0, 10,
+  41, 34, 0, 0, 22, 0, 133, 0, 33, 13,
+  17, 0, 9, 54, 28, 7, 16, 0, 14, 15,
+  15, 0, 15, 0, 48, 0, 1, 0, 0, 0,
+  0, 0, 10, 0, 0, 40, 0, 1, 9, 0,
+  35, 68, 7, 20, 38, 3, 0, 13, 0, 0,
+  0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
+  53, 0, 0, 0, 104, 21, 0, 47, 20, 66,
+  0, 0, 53, 0, 0, 0, 116, 0, 0, 40,
+  62, 0, 2, 0, 11, 68, 0, 8, 23, 0,
+  0, 43, 3, 1, 13, 72, 0, 27, 24, 0,
+  0, 21, 96, 5, 13, 87, 14, 47, 59, 16,
+  0, 0, 0, 0, 0, 111, 0, 0, 107, 59,
+  25, 17, 19, 0, 0, 13, 9, 35, 0, 93,
+  0, 0, 13, 0, 155, 30, 22, 32, 0, 0,
+  34, 19, 0, 47, 0, 0, 15, 14, 42, 14,
+  8, 0, 73, 0, 0, 0, 0, 2, 0, 0,
+  31, 0, 21, 50, 0, 0, 5, 0, 30, 31,
+  0, 67, 22, 0, 17, 0, 0, 0, 0, 0,
+  0, 0, 0, 1, 0, 3, 0, 16, 53, 0,
+  3, 16, 0, 0, 0, 0, 0, 145, 0, 0,
+  46, 0, 0, 0, 34, 21, 0, 109, 67, 48,
+  0, 0, 39, 1, 0, 58, 0, 0, 0, 56,
+  1, 0, 0, 0, 49, 0, 0, 0, 22, 71,
+  0, 0, 22, 0, 0, 3, 13, 87, 0, 0,
+  0, 14, 12, 53, 23, 0, 62, 19, 29, 0,
+  0, 0, 0, 48, 0, 0, 12, 0, 16, 0,
+  17, 13, 58, 0, 50, 76, 0, 66, 0, 52,
+  0, 0, 8, 0, 17, 64, 0, 25, 19, 0,
+  22, 2, 35, 128, 0, 0, 75, 0, 0, 0,
+  0, 93, 86, 0, 0, 0, 15, 0, 0, 38,
+  0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 4, 15,
+  0, 104, 16, 18, 0, 0, 0, 0, 47, 19,
+  0, 0, 6, 0, 7, 17, 36, 23, 0, 2,
+  0, 0, 72, 39, 0, 0, 14, 29, 0, 0,
+  0, 0, 40, 0, 36, 14, 0, 1, 11, 0,
+  0, 0, 22, 32, 0, 52, 25, 0, 0, 0,
+  0, 42, 40, 0, 22, 0, 44, 0, 3, 0,
+  0, 33, 0, 0, 52, 0, 0, 0, 0, 10,
+  106, 0, 39, 32, 46, 45, 0, 59, 28, 0,
+  21, 0, 1, 31, 0, 0, 5, 21, 26, 0,
+  31, 0, 0, 0, 5, 0, 0, 0, 0, 52,
+  28, 23, 1, 0, 7, 59, 48, 1, 0, 29,
+  0, 28, 0, 8, 0, 0, 0, 0, 0, 12,
+  0, 0, 0, 0, 49, 26, 5, 0, 107, 66,
+  16, 65, 30, 0, 0, 17, 71, 14, 28, 0,
+  85, 0, 0, 80, 60, 0, 13, 0, 0, 32,
+  32, 6, 0, 0, 0, 61, 0, 37, 19, 69,
+  10, 6, 18, 5, 0, 44, 103, 0, 0, 23,
+  0, 23, 18, 0, 0, 0, 0, 0, 0, 86,
+  0, 0, 83, 13, 32, 36, 9, 0, 0, 0,
+  0, 0, 15, 55, 0, 0, 11, 0, 91, 19,
+  43, 55, 0, 39, 28, 49, 0, 26, 0, 0,
+  19, 64, 28, 26, 14, 0, 86, 0, 32, 0,
+  0, 14, 0, 0, 66, 0, 5, 67, 43, 0,
+  9, 0, 0, 58, 0, 60, 9, 0, 6, 0,
+  0, 0, 0, 0, 0, 0, 0, 15, 0, 4,
+  0, 18, 46, 15, 12, 30, 14, 0, 60, 29,
+  0, 164, 0, 0, 18, 0, 0, 0, 3, 20,
+  0, 48, 30, 38, 0, 0, 13, 76, 24, 1,
+  0, 0, 0, 35, 0, 48, 0, 88, 0, 0,
+  0, 20, 63, 58, 24, 0, 0, 0, 0, 0,
+  0, 11, 0, 0, 13, 0, 0, 83, 0, 0,
+  99, 0, 57, 0, 22, 0, 0, 57, 14, 0,
+  110, 0, 0, 29, 2, 76, 21, 14, 67, 27,
+  0, 44, 44, 26, 0, 0, 0, 0, 32, 108,
+  0, 10, 10, 0, 11, 0, 10, 13, 0, 0,
+  58, 0, 30, 0, 0, 71, 79, 0, 0, 0,
+  0, 18, 0, 26, 0, 0, 0, 0, 0, 0,
+  4, 4, 54, 0, 0, 35, 0, 18, 0, 0,
+  0, 17, 0, 23, 66, 10, 0, 31, 29, 110,
+  12, 0, 20, 0, 0, 9, 85, 0, 0, 46,
+  16, 30, 0, 0, 33, 111, 0, 60, 48, 0,
+  3, 44, 255, 0, 0, 72, 42, 37, 17, 24,
+  0, 22, 96, 20, 32, 0, 17, 61, 85, 122,
+  14, 0, 0, 23, 0, 130, 26, 0, 91, 47,
+  26, 11, 67, 0, 34, 60, 32, 28, 0, 46,
+  0, 4, 12, 28, 143, 0, 41, 3, 0, 22,
+  11, 56, 20, 0, 23, 0, 1, 24, 0, 0,
+  19, 5, 50, 28, 0, 55, 8, 0, 61, 18,
+  20, 0, 39, 55, 9, 30, 21, 7, 86, 7,
+  1, 22, 0, 7, 0, 16, 0, 0, 0, 31,
+  20, 0, 35, 34, 69, 0, 0, 44, 59, 0,
+  6, 4, 0, 38, 0, 0, 7, 72, 57, 6,
+  59, 17, 0, 6, 46, 16, 0, 163, 49, 58,
+  0, 0, 76, 0, 0, 90, 29, 28, 5, 40,
+  214, 33, 0, 0, 89, 29, 32, 0, 0, 53,
+  10, 75, 12, 0, 0, 45, 49, 87, 5, 9,
+  0, 73, 3, 65, 107, 1, 7, 49, 22, 23,
+  0, 54, 0, 5, 0, 32, 0, 1, 11, 0,
+  25, 0, 29, 0, 39, 11, 0, 97, 0, 37,
+  0, 1, 62, 0, 14, 26, 0, 4, 35, 12,
+  60, 53, 62, 78, 0, 3, 68, 5, 0, 0,
+  50, 64, 14, 0, 0, 0, 76, 0, 29, 16,
+  1, 58, 17, 0, 0, 22, 0, 0, 0, 12,
+  39, 12, 66, 4, 74, 0, 59, 0, 32, 0,
+  0, 58, 63, 0, 7, 0, 21, 41, 98, 32,
+  26, 34, 16, 64, 0, 150, 62, 63, 48, 14,
+  52, 0, 0, 72, 12, 0, 54, 79, 175, 35,
+  0, 0, 104, 0, 8, 0, 3, 53, 0, 34,
+  0, 0, 0, 32, 8, 71, 0, 0, 0, 50,
+  34, 80, 101, 18, 30, 0, 24, 14, 0, 49,
+  0, 0, 0, 16, 0, 0, 47, 0, 11, 29,
+  0, 0, 63, 28, 0, 75, 0, 60, 0, 1,
+  62, 4, 40, 45, 0, 23, 18, 40, 92, 24,
+  106, 1, 0, 0, 68, 0, 17, 0, 31, 98,
+  42, 0, 7, 0, 83, 0, 3, 51, 27, 30,
+  31, 0, 16, 5, 20, 0, 0, 18, 0, 32,
+  51, 0, 76, 0, 65, 0, 38, 22, 104, 21,
+  0, 47, 20, 66, 0, 0, 53, 0, 0, 0,
+  116, 0, 0, 40, 62, 0, 2, 0, 11, 68,
+  0, 8, 23, 0, 0, 43, 3, 1, 13, 72,
+  0, 27, 24, 0, 0, 21, 96, 5, 13, 87,
+  14, 47, 59, 16, 0, 0, 0, 0, 0, 111,
+  0, 0, 107, 59, 25, 17, 19, 0, 0, 13,
+  9, 35, 0, 93, 0, 0, 13, 0, 155, 30,
+  22, 32, 0, 0, 34, 19, 0, 47, 0, 0,
+  15, 14, 42, 14, 8, 0, 73, 0, 0, 0,
+  0, 2, 0, 0, 31, 0, 21, 50, 0, 0,
+  5, 0, 30, 31, 0, 67, 22, 0, 17, 0,
+  0, 0, 0, 0, 0, 0, 0, 1, 0, 3,
+  0, 16, 53, 0, 3, 16, 0, 0, 0, 0,
+  0, 145, 0, 0, 46, 0, 0, 0, 34, 21,
+  0, 109, 67, 48, 0, 0, 39, 1, 0, 58,
+  0, 0, 0, 56, 1, 0, 0, 0, 49, 0,
+  0, 0, 22, 71, 0, 0, 22, 0, 0, 3,
+  13, 87, 0, 0, 0, 14, 12, 53, 23, 0,
+  62, 19, 29, 0, 0, 0, 0, 48, 0, 0,
+  12, 0, 16, 0, 17, 13, 58, 0, 50, 76,
+  0, 66, 0, 52, 0, 0, 8, 0, 17, 64,
+  0, 25, 19, 0, 22, 2, 35, 128, 0, 0,
+  75, 0, 0, 0, 0, 93, 86, 0, 0, 0,
+  15, 0, 0, 38, 0, 19, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  13, 0, 4, 15, 0, 0, 92, 0, 0, 76,
+  0, 0, 44, 0, 0, 15, 13, 93, 0, 13,
+  41, 74, 27, 0, 22, 35, 4, 32, 0, 0,
+  0, 34, 0, 0, 18, 4, 5, 0, 0, 0,
+  14, 65, 0, 0, 0, 14, 0, 0, 0, 18,
+  0, 0, 0, 0, 19, 112, 26, 0, 66, 0,
+  49, 0, 1, 0, 0, 12, 0, 0, 37, 7,
+  27, 10, 26, 96, 0, 0, 36, 15, 0, 30,
+  0, 21, 0, 0, 0, 0, 33, 83, 0, 28,
+  14, 34, 42, 0, 16, 32, 0, 0, 39, 0,
+  0, 0, 13, 107, 45, 0, 0, 0, 3, 18,
+  0, 20, 0, 5, 17, 0, 0, 0, 49, 0,
+  46, 44, 22, 4, 0, 0, 0, 0, 20, 0,
+  0, 18, 107, 66, 16, 65, 30, 0, 0, 17,
+  71, 14, 28, 0, 85, 0, 0, 80, 60, 0,
+  13, 0, 0, 32, 32, 6, 0, 0, 0, 61,
+  0, 37, 19, 69, 10, 6, 18, 5, 0, 44,
+  103, 0, 0, 23, 0, 23, 18, 0, 0, 0,
+  0, 0, 0, 86, 0, 0, 83, 13, 32, 36,
+  9, 0, 0, 0, 0, 0, 15, 55, 0, 0,
+  11, 0, 91, 19, 43, 55, 0, 39, 28, 49,
+  0, 26, 0, 0, 19, 64, 28, 26, 14, 0,
+  86, 0, 32, 0, 0, 14, 0, 0, 66, 0,
+  5, 67, 43, 0, 9, 0, 0, 58, 0, 60,
+  9, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+  0, 15, 0, 4, 0, 18, 46, 15, 12, 30,
+  14, 0, 60, 29, 0, 164, 0, 0, 18, 0,
+  0, 0, 3, 20, 0, 48, 30, 38, 0, 0,
+  13, 76, 24, 1, 0, 0, 0, 35, 0, 48,
+  0, 88, 0, 0, 0, 20, 63, 58, 24, 0,
+  0, 0, 0, 0, 0, 11, 0, 0, 13, 0,
+  0, 83, 0, 0, 99, 0, 57, 0, 22, 0,
+  0, 57, 14, 0, 110, 0, 0, 29, 2, 76,
+  21, 14, 67, 27, 0, 44, 44, 26, 0, 0,
+  0, 0, 32, 108, 0, 10, 10, 0, 11, 0,
+  10, 13, 0, 0, 58, 0, 30, 0, 0, 71,
+  79, 0, 0, 0, 0, 18, 0, 26, 0, 0,
+  0, 0, 0, 0, 4, 4, 54, 0, 0, 35,
+  0, 18, 0, 0, 0, 17, 0, 23, 0, 0,
+  70, 0, 4, 150, 0, 0, 0, 0, 0, 1,
+  23, 94, 0, 0, 0, 44, 0, 0, 21, 54,
+  0, 39, 0, 0, 0, 0, 0, 45, 16, 26,
+  0, 7, 0, 0, 0, 50, 0, 0, 0, 11,
+  0, 27, 0, 8, 1, 0, 0, 0, 12, 123,
+  0, 0, 39, 0, 39, 0, 42, 0, 0, 32,
+  0, 0, 97, 0, 0, 31, 0, 64, 0, 26,
+  51, 0, 0, 17, 0, 0, 0, 0, 0, 0,
+  27, 70, 21, 0, 16, 15, 54, 0, 0, 0,
+  24, 0, 2, 0, 0, 0, 0, 60, 12, 0,
+  0, 0, 0, 79, 0, 14, 0, 5, 25, 0,
+  0, 14, 51, 41, 105, 41, 29, 52, 23, 0,
+  0, 0, 17, 23, 0, 13, 0, 38, 0, 0,
+  7, 72, 57, 6, 59, 17, 0, 6, 46, 16,
+  0, 163, 49, 58, 0, 0, 76, 0, 0, 90,
+  29, 28, 5, 40, 214, 33, 0, 0, 89, 29,
+  32, 0, 0, 53, 10, 75, 12, 0, 0, 45,
+  49, 87, 5, 9, 0, 73, 3, 65, 107, 1,
+  7, 49, 22, 23, 0, 54, 0, 5, 0, 32,
+  0, 1, 11, 0, 25, 0, 29, 0, 39, 11,
+  0, 97, 0, 37, 0, 1, 62, 0, 14, 26,
+  0, 4, 35, 12, 60, 53, 62, 78, 0, 3,
+  68, 5, 0, 0, 50, 64, 14, 0, 0, 0,
+  76, 0, 29, 16, 1, 58, 17, 0, 0, 22,
+  0, 0, 0, 12, 39, 12, 66, 4, 74, 0,
+  59, 0, 32, 0, 0, 58, 63, 0, 7, 0,
+  21, 41, 98, 32, 26, 34, 16, 64, 0, 150,
+  62, 63, 48, 14, 52, 0, 0, 72, 12, 0,
+  54, 79, 175, 35, 0, 0, 104, 0, 8, 0,
+  3, 53, 0, 34, 0, 0, 0, 32, 8, 71,
+  0, 0, 0, 50, 34, 80, 101, 18, 30, 0,
+  24, 14, 0, 49, 0, 0, 0, 16, 0, 0,
+  47, 0, 11, 29, 0, 0, 63, 28, 0, 75,
+  0, 60, 0, 1, 62, 4, 40, 45, 0, 23,
+  18, 40, 92, 24, 106, 1, 0, 0, 68, 0,
+  17, 0, 31, 98, 42, 0, 7, 0, 83, 0,
+  3, 51, 27, 30, 31, 0, 16, 5, 20, 0,
+  0, 18, 0, 32, 51, 0, 76, 0, 65, 0,
+  38, 22, 50, 21, 117, 0, 0, 33, 0, 34,
+  48, 0, 0, 21, 0, 97, 0, 11, 24, 76,
+  56, 29, 7, 79, 14, 26, 0, 0, 21, 72,
+  178, 23, 2, 77, 15, 0, 0, 17, 0, 58,
+  0, 0, 0, 0, 23, 6, 0, 52, 0, 0,
+  0, 0, 17, 138, 16, 0, 76, 0, 43, 0,
+  26, 0, 0, 0, 10, 14, 41, 10, 2, 8,
+  11, 125, 0, 0, 81, 0, 0, 29, 11, 26,
+  12, 0, 0, 0, 1, 82, 0, 0, 46, 37,
+  66, 0, 39, 0, 0, 0, 91, 0, 6, 0,
+  15, 66, 24, 0, 23, 6, 85, 90, 0, 23,
+  0, 0, 42, 20, 11, 6, 52, 0, 44, 28,
+  0, 49, 48, 0, 0, 0, 21, 0, 24, 28,
+  0, 0, 0, 0, 0, 145, 0, 0, 46, 0,
+  0, 0, 34, 21, 0, 109, 67, 48, 0, 0,
+  39, 1, 0, 58, 0, 0, 0, 56, 1, 0,
+  0, 0, 49, 0, 0, 0, 22, 71, 0, 0,
+  22, 0, 0, 3, 13, 87, 0, 0, 0, 14,
+  12, 53, 23, 0, 62, 19, 29, 0, 0, 0,
+  0, 48, 0, 0, 12, 0, 16, 0, 17, 13,
+  58, 0, 50, 76, 0, 66, 0, 52, 0, 0,
+  8, 0, 17, 64, 0, 25, 19, 0, 22, 2,
+  35, 128, 0, 0, 75, 0, 0, 0, 0, 93,
+  86, 0, 0, 0, 15, 0, 0, 38, 0, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 4, 15, 0, 0,
+  92, 0, 0, 76, 0, 0, 44, 0, 0, 15,
+  13, 93, 0, 13, 41, 74, 27, 0, 22, 35,
+  4, 32, 0, 0, 0, 34, 0, 0, 18, 4,
+  5, 0, 0, 0, 14, 65, 0, 0, 0, 14,
+  0, 0, 0, 18, 0, 0, 0, 0, 19, 112,
+  26, 0, 66, 0, 49, 0, 1, 0, 0, 12,
+  0, 0, 37, 7, 27, 10, 26, 96, 0, 0,
+  36, 15, 0, 30, 0, 21, 0, 0, 0, 0,
+  33, 83, 0, 28, 14, 34, 42, 0, 16, 32,
+  0, 0, 39, 0, 0, 0, 13, 107, 45, 0,
+  0, 0, 3, 18, 0, 20, 0, 5, 17, 0,
+  0, 0, 49, 0, 46, 44, 22, 4, 0, 0,
+  0, 0, 20, 0, 0, 18, 0, 0, 91, 0,
+  0, 56, 0, 0, 0, 0, 0, 21, 6, 68,
+  0, 0, 3, 66, 22, 26, 0, 44, 1, 12,
+  25, 0, 0, 0, 0, 0, 35, 19, 0, 0,
+  0, 0, 0, 41, 0, 0, 0, 9, 0, 13,
+  0, 4, 17, 0, 0, 0, 11, 90, 12, 0,
+  37, 0, 34, 0, 44, 0, 0, 20, 0, 0,
+  71, 0, 0, 58, 0, 66, 0, 22, 34, 0,
+  4, 12, 0, 0, 14, 0, 0, 0, 11, 67,
+  48, 0, 47, 25, 46, 0, 0, 0, 0, 0,
+  2, 0, 0, 5, 16, 47, 0, 0, 0, 1,
+  0, 93, 0, 9, 0, 23, 27, 12, 0, 4,
+  70, 6, 57, 62, 45, 37, 28, 1, 0, 0,
+  18, 8, 3, 27, 14, 0, 60, 29, 0, 164,
+  0, 0, 18, 0, 0, 0, 3, 20, 0, 48,
+  30, 38, 0, 0, 13, 76, 24, 1, 0, 0,
+  0, 35, 0, 48, 0, 88, 0, 0, 0, 20,
+  63, 58, 24, 0, 0, 0, 0, 0, 0, 11,
+  0, 0, 13, 0, 0, 83, 0, 0, 99, 0,
+  57, 0, 22, 0, 0, 57, 14, 0, 110, 0,
+  0, 29, 2, 76, 21, 14, 67, 27, 0, 44,
+  44, 26, 0, 0, 0, 0, 32, 108, 0, 10,
+  10, 0, 11, 0, 10, 13, 0, 0, 58, 0,
+  30, 0, 0, 71, 79, 0, 0, 0, 0, 18,
+  0, 26, 0, 0, 0, 0, 0, 0, 4, 4,
+  54, 0, 0, 35, 0, 18, 0, 0, 0, 17,
+  0, 23, 0, 0, 70, 0, 4, 150, 0, 0,
+  0, 0, 0, 1, 23, 94, 0, 0, 0, 44,
+  0, 0, 21, 54, 0, 39, 0, 0, 0, 0,
+  0, 45, 16, 26, 0, 7, 0, 0, 0, 50,
+  0, 0, 0, 11, 0, 27, 0, 8, 1, 0,
+  0, 0, 12, 123, 0, 0, 39, 0, 39, 0,
+  42, 0, 0, 32, 0, 0, 97, 0, 0, 31,
+  0, 64, 0, 26, 51, 0, 0, 17, 0, 0,
+  0, 0, 0, 0, 27, 70, 21, 0, 16, 15,
+  54, 0, 0, 0, 24, 0, 2, 0, 0, 0,
+  0, 60, 12, 0, 0, 0, 0, 79, 0, 14,
+  0, 5, 25, 0, 0, 14, 51, 41, 105, 41,
+  29, 52, 23, 0, 0, 0, 17, 23, 0, 13,
+  0, 43, 48, 0, 24, 32, 13, 0, 8, 0,
+  0, 0, 63, 49, 0, 0, 3, 17, 8, 10,
+  0, 0, 0, 37, 41, 35, 6, 0, 0, 48,
+  48, 0, 0, 14, 0, 0, 0, 2, 0, 39,
+  0, 40, 0, 41, 21, 0, 3, 0, 0, 0,
+  0, 40, 61, 0, 0, 0, 14, 6, 2, 35,
+  0, 6, 0, 21, 0, 0, 0, 27, 0, 0,
+  0, 32, 20, 0, 21, 28, 0, 0, 0, 25,
+  16, 25, 21, 40, 63, 0, 39, 18, 50, 13,
+  0, 0, 32, 28, 0, 22, 0, 38, 15, 31,
+  0, 0, 0, 0, 0, 28, 14, 0, 53, 57,
+  40, 0, 0, 20, 46, 0, 33, 38, 62, 29,
+  61, 16, 47, 0, 46, 37, 0, 1, 0, 58,
+  63, 0, 7, 0, 21, 41, 98, 32, 26, 34,
+  16, 64, 0, 150, 62, 63, 48, 14, 52, 0,
+  0, 72, 12, 0, 54, 79, 175, 35, 0, 0,
+  104, 0, 8, 0, 3, 53, 0, 34, 0, 0,
+  0, 32, 8, 71, 0, 0, 0, 50, 34, 80,
+  101, 18, 30, 0, 24, 14, 0, 49, 0, 0,
+  0, 16, 0, 0, 47, 0, 11, 29, 0, 0,
+  63, 28, 0, 75, 0, 60, 0, 1, 62, 4,
+  40, 45, 0, 23, 18, 40, 92, 24, 106, 1,
+  0, 0, 68, 0, 17, 0, 31, 98, 42, 0,
+  7, 0, 83, 0, 3, 51, 27, 30, 31, 0,
+  16, 5, 20, 0, 0, 18, 0, 32, 51, 0,
+  76, 0, 65, 0, 38, 22, 50, 21, 117, 0,
+  0, 33, 0, 34, 48, 0, 0, 21, 0, 97,
+  0, 11, 24, 76, 56, 29, 7, 79, 14, 26,
+  0, 0, 21, 72, 178, 23, 2, 77, 15, 0,
+  0, 17, 0, 58, 0, 0, 0, 0, 23, 6,
+  0, 52, 0, 0, 0, 0, 17, 138, 16, 0,
+  76, 0, 43, 0, 26, 0, 0, 0, 10, 14,
+  41, 10, 2, 8, 11, 125, 0, 0, 81, 0,
+  0, 29, 11, 26, 12, 0, 0, 0, 1, 82,
+  0, 0, 46, 37, 66, 0, 39, 0, 0, 0,
+  91, 0, 6, 0, 15, 66, 24, 0, 23, 6,
+  85, 90, 0, 23, 0, 0, 42, 20, 11, 6,
+  52, 0, 44, 28, 0, 49, 48, 0, 0, 0,
+  21, 0, 24, 28, 37, 2, 61, 0, 0, 73,
+  0, 0, 0, 0, 0, 0, 0, 114, 0, 0,
+  5, 58, 36, 11, 0, 72, 12, 49, 0, 0,
+  26, 41, 217, 0, 0, 48, 0, 41, 0, 0,
+  6, 3, 0, 0, 0, 0, 13, 0, 0, 63,
+  19, 55, 0, 0, 20, 92, 0, 0, 70, 0,
+  42, 0, 39, 0, 25, 1, 0, 0, 74, 12,
+  10, 4, 28, 139, 25, 13, 70, 0, 0, 6,
+  18, 0, 2, 4, 0, 0, 4, 80, 0, 0,
+  46, 48, 69, 0, 0, 0, 12, 0, 60, 0,
+  0, 0, 11, 29, 28, 90, 42, 8, 49, 129,
+  4, 0, 0, 1, 4, 23, 0, 0, 30, 66,
+  51, 23, 16, 39, 2, 0, 0, 0, 0, 0,
+  0, 44, 0, 0, 92, 0, 0, 76, 0, 0,
+  44, 0, 0, 15, 13, 93, 0, 13, 41, 74,
+  27, 0, 22, 35, 4, 32, 0, 0, 0, 34,
+  0, 0, 18, 4, 5, 0, 0, 0, 14, 65,
+  0, 0, 0, 14, 0, 0, 0, 18, 0, 0,
+  0, 0, 19, 112, 26, 0, 66, 0, 49, 0,
+  1, 0, 0, 12, 0, 0, 37, 7, 27, 10,
+  26, 96, 0, 0, 36, 15, 0, 30, 0, 21,
+  0, 0, 0, 0, 33, 83, 0, 28, 14, 34,
+  42, 0, 16, 32, 0, 0, 39, 0, 0, 0,
+  13, 107, 45, 0, 0, 0, 3, 18, 0, 20,
+  0, 5, 17, 0, 0, 0, 49, 0, 46, 44,
+  22, 4, 0, 0, 0, 0, 20, 0, 0, 18,
+  0, 0, 91, 0, 0, 56, 0, 0, 0, 0,
+  0, 21, 6, 68, 0, 0, 3, 66, 22, 26,
+  0, 44, 1, 12, 25, 0, 0, 0, 0, 0,
+  35, 19, 0, 0, 0, 0, 0, 41, 0, 0,
+  0, 9, 0, 13, 0, 4, 17, 0, 0, 0,
+  11, 90, 12, 0, 37, 0, 34, 0, 44, 0,
+  0, 20, 0, 0, 71, 0, 0, 58, 0, 66,
+  0, 22, 34, 0, 4, 12, 0, 0, 14, 0,
+  0, 0, 11, 67, 48, 0, 47, 25, 46, 0,
+  0, 0, 0, 0, 2, 0, 0, 5, 16, 47,
+  0, 0, 0, 1, 0, 93, 0, 9, 0, 23,
+  27, 12, 0, 4, 70, 6, 57, 62, 45, 37,
+  28, 1, 0, 0, 18, 8, 3, 27, 0, 16,
+  49, 0, 0, 5, 31, 0, 1, 0, 0, 6,
+  0, 41, 0, 0, 0, 25, 35, 4, 0, 0,
+  0, 52, 24, 0, 16, 5, 179, 11, 21, 0,
+  23, 0, 0, 0, 0, 11, 0, 43, 0, 24,
+  1, 8, 2, 65, 31, 0, 0, 0, 0, 37,
+  49, 0, 7, 0, 6, 0, 40, 14, 28, 28,
+  0, 0, 0, 18, 44, 18, 0, 7, 0, 39,
+  35, 0, 13, 18, 0, 0, 20, 0, 17, 2,
+  0, 51, 0, 0, 32, 30, 78, 35, 0, 0,
+  40, 0, 0, 22, 0, 0, 33, 23, 14, 18,
+  8, 0, 15, 74, 44, 16, 21, 36, 0, 12,
+  0, 0, 6, 34, 56, 40, 46, 34, 33, 8,
+  0, 0, 18, 0, 14, 30, 0, 0, 70, 0,
+  4, 150, 0, 0, 0, 0, 0, 1, 23, 94,
+  0, 0, 0, 44, 0, 0, 21, 54, 0, 39,
+  0, 0, 0, 0, 0, 45, 16, 26, 0, 7,
+  0, 0, 0, 50, 0, 0, 0, 11, 0, 27,
+  0, 8, 1, 0, 0, 0, 12, 123, 0, 0,
+  39, 0, 39, 0, 42, 0, 0, 32, 0, 0,
+  97, 0, 0, 31, 0, 64, 0, 26, 51, 0,
+  0, 17, 0, 0, 0, 0, 0, 0, 27, 70,
+  21, 0, 16, 15, 54, 0, 0, 0, 24, 0,
+  2, 0, 0, 0, 0, 60, 12, 0, 0, 0,
+  0, 79, 0, 14, 0, 5, 25, 0, 0, 14,
+  51, 41, 105, 41, 29, 52, 23, 0, 0, 0,
+  17, 23, 0, 13, 0, 43, 48, 0, 24, 32,
+  13, 0, 8, 0, 0, 0, 63, 49, 0, 0,
+  3, 17, 8, 10, 0, 0, 0, 37, 41, 35,
+  6, 0, 0, 48, 48, 0, 0, 14, 0, 0,
+  0, 2, 0, 39, 0, 40, 0, 41, 21, 0,
+  3, 0, 0, 0, 0, 40, 61, 0, 0, 0,
+  14, 6, 2, 35, 0, 6, 0, 21, 0, 0,
+  0, 27, 0, 0, 0, 32, 20, 0, 21, 28,
+  0, 0, 0, 25, 16, 25, 21, 40, 63, 0,
+  39, 18, 50, 13, 0, 0, 32, 28, 0, 22,
+  0, 38, 15, 31, 0, 0, 0, 0, 0, 28,
+  14, 0, 53, 57, 40, 0, 0, 20, 46, 0,
+  33, 38, 62, 29, 61, 16, 47, 0, 46, 37,
+  0, 1, 0, 41, 74, 0, 7, 0, 37, 0,
+  26, 0, 0, 0, 8, 45, 0, 15, 14, 0,
+  13, 0, 0, 0, 20, 55, 23, 53, 16, 0,
+  159, 1, 19, 0, 8, 19, 20, 0, 0, 0,
+  0, 81, 7, 52, 28, 35, 49, 21, 9, 3,
+  0, 0, 0, 24, 50, 0, 0, 0, 1, 33,
+  4, 24, 7, 14, 0, 0, 0, 27, 51, 0,
+  10, 0, 0, 31, 38, 26, 32, 14, 0, 0,
+  0, 32, 48, 29, 26, 13, 31, 0, 3, 25,
+  74, 17, 4, 0, 45, 17, 0, 32, 0, 0,
+  21, 15, 0, 0, 0, 0, 6, 22, 50, 8,
+  38, 32, 47, 0, 0, 0, 1, 0, 13, 0,
+  30, 2, 0, 0, 24, 0, 46, 24, 32, 0,
+  50, 21, 117, 0, 0, 33, 0, 34, 48, 0,
+  0, 21, 0, 97, 0, 11, 24, 76, 56, 29,
+  7, 79, 14, 26, 0, 0, 21, 72, 178, 23,
+  2, 77, 15, 0, 0, 17, 0, 58, 0, 0,
+  0, 0, 23, 6, 0, 52, 0, 0, 0, 0,
+  17, 138, 16, 0, 76, 0, 43, 0, 26, 0,
+  0, 0, 10, 14, 41, 10, 2, 8, 11, 125,
+  0, 0, 81, 0, 0, 29, 11, 26, 12, 0,
+  0, 0, 1, 82, 0, 0, 46, 37, 66, 0,
+  39, 0, 0, 0, 91, 0, 6, 0, 15, 66,
+  24, 0, 23, 6, 85, 90, 0, 23, 0, 0,
+  42, 20, 11, 6, 52, 0, 44, 28, 0, 49,
+  48, 0, 0, 0, 21, 0, 24, 28, 37, 2,
+  61, 0, 0, 73, 0, 0, 0, 0, 0, 0,
+  0, 114, 0, 0, 5, 58, 36, 11, 0, 72,
+  12, 49, 0, 0, 26, 41, 217, 0, 0, 48,
+  0, 41, 0, 0, 6, 3, 0, 0, 0, 0,
+  13, 0, 0, 63, 19, 55, 0, 0, 20, 92,
+  0, 0, 70, 0, 42, 0, 39, 0, 25, 1,
+  0, 0, 74, 12, 10, 4, 28, 139, 25, 13,
+  70, 0, 0, 6, 18, 0, 2, 4, 0, 0,
+  4, 80, 0, 0, 46, 48, 69, 0, 0, 0,
+  12, 0, 60, 0, 0, 0, 11, 29, 28, 90,
+  42, 8, 49, 129, 4, 0, 0, 1, 4, 23,
+  0, 0, 30, 66, 51, 23, 16, 39, 2, 0,
+  0, 0, 0, 0, 0, 44, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 91, 0, 0, 56,
+  0, 0, 0, 0, 0, 21, 6, 68, 0, 0,
+  3, 66, 22, 26, 0, 44, 1, 12, 25, 0,
+  0, 0, 0, 0, 35, 19, 0, 0, 0, 0,
+  0, 41, 0, 0, 0, 9, 0, 13, 0, 4,
+  17, 0, 0, 0, 11, 90, 12, 0, 37, 0,
+  34, 0, 44, 0, 0, 20, 0, 0, 71, 0,
+  0, 58, 0, 66, 0, 22, 34, 0, 4, 12,
+  0, 0, 14, 0, 0, 0, 11, 67, 48, 0,
+  47, 25, 46, 0, 0, 0, 0, 0, 2, 0,
+  0, 5, 16, 47, 0, 0, 0, 1, 0, 93,
+  0, 9, 0, 23, 27, 12, 0, 4, 70, 6,
+  57, 62, 45, 37, 28, 1, 0, 0, 18, 8,
+  3, 27, 0, 16, 49, 0, 0, 5, 31, 0,
+  1, 0, 0, 6, 0, 41, 0, 0, 0, 25,
+  35, 4, 0, 0, 0, 52, 24, 0, 16, 5,
+  179, 11, 21, 0, 23, 0, 0, 0, 0, 11,
+  0, 43, 0, 24, 1, 8, 2, 65, 31, 0,
+  0, 0, 0, 37, 49, 0, 7, 0, 6, 0,
+  40, 14, 28, 28, 0, 0, 0, 18, 44, 18,
+  0, 7, 0, 39, 35, 0, 13, 18, 0, 0,
+  20, 0, 17, 2, 0, 51, 0, 0, 32, 30,
+  78, 35, 0, 0, 40, 0, 0, 22, 0, 0,
+  33, 23, 14, 18, 8, 0, 15, 74, 44, 16,
+  21, 36, 0, 12, 0, 0, 6, 34, 56, 40,
+  46, 34, 33, 8, 0, 0, 18, 0, 14, 30,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 43,
+  48, 0, 24, 32, 13, 0, 8, 0, 0, 0,
+  63, 49, 0, 0, 3, 17, 8, 10, 0, 0,
+  0, 37, 41, 35, 6, 0, 0, 48, 48, 0,
+  0, 14, 0, 0, 0, 2, 0, 39, 0, 40,
+  0, 41, 21, 0, 3, 0, 0, 0, 0, 40,
+  61, 0, 0, 0, 14, 6, 2, 35, 0, 6,
+  0, 21, 0, 0, 0, 27, 0, 0, 0, 32,
+  20, 0, 21, 28, 0, 0, 0, 25, 16, 25,
+  21, 40, 63, 0, 39, 18, 50, 13, 0, 0,
+  32, 28, 0, 22, 0, 38, 15, 31, 0, 0,
+  0, 0, 0, 28, 14, 0, 53, 57, 40, 0,
+  0, 20, 46, 0, 33, 38, 62, 29, 61, 16,
+  47, 0, 46, 37, 0, 1, 0, 41, 74, 0,
+  7, 0, 37, 0, 26, 0, 0, 0, 8, 45,
+  0, 15, 14, 0, 13, 0, 0, 0, 20, 55,
+  23, 53, 16, 0, 159, 1, 19, 0, 8, 19,
+  20, 0, 0, 0, 0, 81, 7, 52, 28, 35,
+  49, 21, 9, 3, 0, 0, 0, 24, 50, 0,
+  0, 0, 1, 33, 4, 24, 7, 14, 0, 0,
+  0, 27, 51, 0, 10, 0, 0, 31, 38, 26,
+  32, 14, 0, 0, 0, 32, 48, 29, 26, 13,
+  31, 0, 3, 25, 74, 17, 4, 0, 45, 17,
+  0, 32, 0, 0, 21, 15, 0, 0, 0, 0,
+  6, 22, 50, 8, 38, 32, 47, 0, 0, 0,
+  1, 0, 13, 0, 30, 2, 0, 0, 24, 0,
+  46, 24, 32, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 21, 64, 6, 0, 0, 17, 8, 0, 10,
+  24, 0, 0, 65, 0, 74, 92, 76, 35, 40,
+  22, 3, 39, 33, 0, 0, 31, 58, 156, 6,
+  15, 0, 58, 0, 0, 0, 0, 18, 0, 18,
+  5, 27, 0, 0, 53, 31, 0, 18, 0, 0,
+  0, 47, 40, 0, 10, 0, 0, 9, 0, 6,
+  28, 0, 0, 0, 0, 7, 44, 0, 48, 45,
+  0, 16, 17, 16, 28, 6, 22, 3, 0, 16,
+  38, 0, 14, 0, 0, 13, 0, 23, 45, 25,
+  8, 25, 0, 0, 67, 0, 51, 0, 0, 39,
+  3, 0, 27, 11, 67, 0, 18, 0, 0, 0,
+  20, 21, 9, 43, 3, 0, 12, 0, 0, 0,
+  64, 0, 5, 0, 0, 0, 55, 0, 56, 59,
+  50, 27, 4, 0, 2, 0, 0, 0, 8, 0,
+  48, 60, 4, 28, 76, 49, 0, 0, 0, 6,
+  1, 61, 24, 0, 35, 40, 0, 0, 13, 0,
+  67, 0, 0, 0, 0, 0, 0, 1, 0, 66,
+  2, 0, 30, 28, 26, 42, 0, 12, 0, 69,
+  96, 0, 23, 0, 0, 0, 0, 0, 51, 0,
+  0, 65, 0, 8, 82, 0, 40, 45, 0, 20,
+  0, 33, 32, 0, 14, 3, 0, 16, 42, 0,
+  37, 0, 0, 30, 0, 27, 36, 9, 13, 0,
+  0, 22, 2, 0, 70, 5, 0, 64, 0, 23,
+  40, 0, 76, 0, 6, 0, 58, 8, 17, 40,
+  5, 0, 26, 0, 1, 0, 0, 0, 39, 0,
+  71, 0, 10, 9, 14, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 47, 23, 86, 28, 0, 0,
+  29, 6, 18, 0, 12, 0, 0, 94, 0, 55,
+  94, 25, 14, 29, 7, 39, 13, 18, 25, 0,
+  29, 32, 164, 9, 5, 45, 79, 0, 0, 0,
+  0, 37, 0, 0, 0, 4, 0, 10, 7, 71,
+  53, 0, 0, 0, 0, 40, 22, 15, 17, 0,
+  13, 0, 0, 3, 39, 29, 0, 0, 0, 0,
+  72, 0, 119, 51, 0, 0, 21, 0, 24, 0,
+  65, 11, 0, 23, 14, 0, 42, 0, 0, 26,
+  0, 0, 59, 5, 0, 16, 0, 5, 15, 0,
+  38, 1, 14, 93, 25, 0, 14, 51, 54, 47,
+  12, 0, 25, 0, 4, 10, 0, 41, 10, 0,
+  18, 0, 17, 0, 59, 0, 0, 0, 0, 24,
+  48, 21, 43, 69, 0, 8, 5, 11, 0, 0,
+  0, 0, 0, 0, 16, 73, 0, 0, 82, 18,
+  0, 0, 0, 41, 0, 50, 15, 0, 5, 16,
+  0, 0, 0, 19, 83, 23, 0, 0, 0, 9,
+  0, 0, 0, 6, 0, 0, 9, 74, 35, 102,
+  0, 0, 0, 29, 56, 0, 22, 0, 18, 0,
+  0, 0, 78, 24, 0, 51, 0, 0, 97, 0,
+  107, 49, 0, 0, 4, 13, 45, 0, 27, 0,
+  0, 5, 25, 0, 35, 12, 0, 12, 0, 6,
+  0, 6, 0, 26, 0, 19, 1, 0, 34, 0,
+  12, 95, 20, 81, 35, 21, 44, 44, 10, 0,
+  51, 0, 0, 63, 0, 7, 0, 0, 0, 0,
+  11, 0, 22, 0, 33, 0, 0, 27, 27, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 23, 32,
+  93, 27, 1, 9, 26, 5, 18, 0, 0, 0,
+  0, 103, 0, 30, 67, 4, 0, 16, 13, 75,
+  10, 41, 20, 0, 6, 20, 201, 42, 3, 62,
+  71, 0, 24, 0, 0, 56, 0, 4, 5, 32,
+  0, 22, 9, 88, 48, 0, 0, 0, 0, 51,
+  21, 3, 55, 0, 44, 0, 32, 0, 31, 72,
+  0, 0, 0, 0, 48, 9, 120, 30, 0, 10,
+  58, 0, 32, 0, 53, 0, 0, 37, 0, 0,
+  36, 11, 0, 15, 0, 0, 58, 5, 0, 0,
+  0, 3, 0, 36, 0, 0, 40, 101, 17, 0,
+  0, 52, 55, 89, 20, 0, 9, 0, 2, 9,
+  0, 33, 6, 2, 40, 0, 19, 12, 51, 0,
+  0, 0, 3, 0, 39, 30, 0, 67, 0, 11,
+  0, 33, 2, 0, 0, 0, 0, 17, 28, 49,
+  0, 0, 52, 3, 0, 0, 28, 58, 0, 42,
+  19, 0, 0, 8, 0, 9, 0, 26, 82, 21,
+  0, 0, 0, 27, 0, 8, 0, 40, 0, 22,
+  24, 91, 9, 110, 0, 0, 0, 27, 50, 0,
+  37, 0, 28, 0, 14, 0, 55, 50, 0, 43,
+  0, 0, 49, 11, 81, 0, 4, 0, 22, 7,
+  42, 0, 12, 0, 0, 26, 21, 0, 21, 24,
+  0, 0, 0, 0, 0, 9, 0, 0, 0, 9,
+  0, 20, 0, 0, 47, 83, 0, 52, 17, 21,
+  41, 51, 25, 0, 40, 5, 0, 40, 0, 11,
+  0, 0, 21, 0, 13, 13, 31, 0, 15, 0,
+  35, 1, 15, 0, 12, 21, 64, 6, 0, 0,
+  17, 8, 0, 10, 24, 0, 0, 65, 0, 74,
+  92, 76, 35, 40, 22, 3, 39, 33, 0, 0,
+  31, 58, 156, 6, 15, 0, 58, 0, 0, 0,
+  0, 18, 0, 18, 5, 27, 0, 0, 53, 31,
+  0, 18, 0, 0, 0, 47, 40, 0, 10, 0,
+  0, 9, 0, 6, 28, 0, 0, 0, 0, 7,
+  44, 0, 48, 45, 0, 16, 17, 16, 28, 6,
+  22, 3, 0, 16, 38, 0, 14, 0, 0, 13,
+  0, 23, 45, 25, 8, 25, 0, 0, 67, 0,
+  51, 0, 0, 39, 3, 0, 27, 11, 67, 0,
+  18, 0, 0, 0, 20, 21, 9, 43, 3, 0,
+  12, 0, 0, 0, 64, 0, 5, 0, 0, 0,
+  55, 0, 56, 59, 50, 27, 4, 0, 2, 0,
+  0, 0, 8, 0, 48, 60, 4, 28, 76, 49,
+  0, 0, 0, 6, 1, 61, 24, 0, 35, 40,
+  0, 0, 13, 0, 67, 0, 0, 0, 0, 0,
+  0, 1, 0, 66, 2, 0, 30, 28, 26, 42,
+  0, 12, 0, 69, 96, 0, 23, 0, 0, 0,
+  0, 0, 51, 0, 0, 65, 0, 8, 82, 0,
+  40, 45, 0, 20, 0, 33, 32, 0, 14, 3,
+  0, 16, 42, 0, 37, 0, 0, 30, 0, 27,
+  36, 9, 13, 0, 0, 22, 2, 0, 70, 5,
+  0, 64, 0, 23, 40, 0, 76, 0, 6, 0,
+  58, 8, 17, 40, 5, 0, 26, 0, 1, 0,
+  0, 0, 39, 0, 71, 0, 10, 9, 14, 0,
+  2, 55, 59, 38, 4, 35, 16, 13, 17, 0,
+  0, 16, 84, 0, 0, 22, 51, 18, 0, 0,
+  0, 56, 0, 33, 67, 0, 5, 30, 0, 0,
+  0, 43, 70, 0, 18, 0, 0, 0, 0, 41,
+  0, 35, 57, 2, 29, 80, 44, 19, 0, 21,
+  0, 34, 36, 10, 35, 0, 10, 0, 0, 0,
+  30, 26, 0, 32, 0, 0, 35, 1, 27, 0,
+  0, 17, 9, 19, 26, 0, 10, 16, 0, 22,
+  23, 0, 61, 69, 0, 5, 0, 0, 0, 42,
+  5, 0, 0, 31, 0, 24, 35, 0, 0, 65,
+  2, 0, 10, 12, 63, 0, 37, 0, 27, 0,
+  0, 14, 0, 0, 0, 0, 0, 0, 0, 0,
+  4, 0, 41, 0, 35, 0, 8, 0, 47, 23,
+  86, 28, 0, 0, 29, 6, 18, 0, 12, 0,
+  0, 94, 0, 55, 94, 25, 14, 29, 7, 39,
+  13, 18, 25, 0, 29, 32, 164, 9, 5, 45,
+  79, 0, 0, 0, 0, 37, 0, 0, 0, 4,
+  0, 10, 7, 71, 53, 0, 0, 0, 0, 40,
+  22, 15, 17, 0, 13, 0, 0, 3, 39, 29,
+  0, 0, 0, 0, 72, 0, 119, 51, 0, 0,
+  21, 0, 24, 0, 65, 11, 0, 23, 14, 0,
+  42, 0, 0, 26, 0, 0, 59, 5, 0, 16,
+  0, 5, 15, 0, 38, 1, 14, 93, 25, 0,
+  14, 51, 54, 47, 12, 0, 25, 0, 4, 10,
+  0, 41, 10, 0, 18, 0, 17, 0, 59, 0,
+  0, 0, 0, 24, 48, 21, 43, 69, 0, 8,
+  5, 11, 0, 0, 0, 0, 0, 0, 16, 73,
+  0, 0, 82, 18, 0, 0, 0, 41, 0, 50,
+  15, 0, 5, 16, 0, 0, 0, 19, 83, 23,
+  0, 0, 0, 9, 0, 0, 0, 6, 0, 0,
+  9, 74, 35, 102, 0, 0, 0, 29, 56, 0,
+  22, 0, 18, 0, 0, 0, 78, 24, 0, 51,
+  0, 0, 97, 0, 107, 49, 0, 0, 4, 13,
+  45, 0, 27, 0, 0, 5, 25, 0, 35, 12,
+  0, 12, 0, 6, 0, 6, 0, 26, 0, 19,
+  1, 0, 34, 0, 12, 95, 20, 81, 35, 21,
+  44, 44, 10, 0, 51, 0, 0, 63, 0, 7,
+  0, 0, 0, 0, 11, 0, 22, 0, 33, 0,
+  0, 27, 27, 0, 0, 39, 39, 29, 0, 48,
+  7, 15, 23, 0, 0, 11, 81, 0, 0, 23,
+  58, 7, 0, 0, 0, 63, 0, 21, 41, 0,
+  0, 12, 0, 0, 0, 32, 67, 3, 1, 0,
+  0, 13, 0, 47, 0, 18, 41, 13, 22, 69,
+  25, 53, 0, 12, 0, 37, 21, 7, 22, 0,
+  22, 0, 0, 0, 16, 31, 0, 29, 0, 0,
+  7, 0, 37, 0, 18, 0, 9, 21, 4, 0,
+  5, 11, 0, 39, 27, 0, 62, 62, 0, 0,
+  0, 0, 0, 18, 1, 0, 0, 19, 0, 19,
+  32, 0, 0, 78, 11, 0, 0, 10, 15, 0,
+  33, 0, 0, 0, 0, 8, 0, 0, 0, 0,
+  7, 0, 0, 0, 0, 0, 38, 0, 39, 0,
+  9, 0, 23, 32, 93, 27, 1, 9, 26, 5,
+  18, 0, 0, 0, 0, 103, 0, 30, 67, 4,
+  0, 16, 13, 75, 10, 41, 20, 0, 6, 20,
+  201, 42, 3, 62, 71, 0, 24, 0, 0, 56,
+  0, 4, 5, 32, 0, 22, 9, 88, 48, 0,
+  0, 0, 0, 51, 21, 3, 55, 0, 44, 0,
+  32, 0, 31, 72, 0, 0, 0, 0, 48, 9,
+  120, 30, 0, 10, 58, 0, 32, 0, 53, 0,
+  0, 37, 0, 0, 36, 11, 0, 15, 0, 0,
+  58, 5, 0, 0, 0, 3, 0, 36, 0, 0,
+  40, 101, 17, 0, 0, 52, 55, 89, 20, 0,
+  9, 0, 2, 9, 0, 33, 6, 2, 40, 0,
+  19, 12, 51, 0, 0, 0, 3, 0, 39, 30,
+  0, 67, 0, 11, 0, 33, 2, 0, 0, 0,
+  0, 17, 28, 49, 0, 0, 52, 3, 0, 0,
+  28, 58, 0, 42, 19, 0, 0, 8, 0, 9,
+  0, 26, 82, 21, 0, 0, 0, 27, 0, 8,
+  0, 40, 0, 22, 24, 91, 9, 110, 0, 0,
+  0, 27, 50, 0, 37, 0, 28, 0, 14, 0,
+  55, 50, 0, 43, 0, 0, 49, 11, 81, 0,
+  4, 0, 22, 7, 42, 0, 12, 0, 0, 26,
+  21, 0, 21, 24, 0, 0, 0, 0, 0, 9,
+  0, 0, 0, 9, 0, 20, 0, 0, 47, 83,
+  0, 52, 17, 21, 41, 51, 25, 0, 40, 5,
+  0, 40, 0, 11, 0, 0, 21, 0, 13, 13,
+  31, 0, 15, 0, 35, 1, 15, 0, 0, 27,
+  36, 37, 0, 42, 17, 9, 15, 0, 0, 22,
+  97, 0, 7, 27, 55, 8, 0, 0, 0, 69,
+  0, 8, 46, 0, 0, 20, 0, 2, 0, 37,
+  78, 0, 3, 0, 0, 24, 0, 73, 0, 34,
+  30, 29, 29, 57, 25, 42, 0, 28, 0, 43,
+  34, 9, 17, 0, 10, 0, 0, 0, 6, 14,
+  0, 16, 0, 0, 0, 0, 28, 0, 23, 6,
+  0, 10, 7, 0, 0, 23, 0, 35, 38, 0,
+  52, 56, 0, 0, 11, 0, 0, 18, 0, 0,
+  0, 4, 0, 16, 29, 0, 0, 66, 6, 0,
+  0, 10, 18, 0, 38, 0, 0, 6, 0, 7,
+  0, 1, 0, 0, 17, 0, 0, 0, 5, 0,
+  43, 0, 63, 0, 11, 0, 56, 59, 50, 27,
+  4, 0, 2, 0, 0, 0, 8, 0, 48, 60,
+  4, 28, 76, 49, 0, 0, 0, 6, 1, 61,
+  24, 0, 35, 40, 0, 0, 13, 0, 67, 0,
+  0, 0, 0, 0, 0, 1, 0, 66, 2, 0,
+  30, 28, 26, 42, 0, 12, 0, 69, 96, 0,
+  23, 0, 0, 0, 0, 0, 51, 0, 0, 65,
+  0, 8, 82, 0, 40, 45, 0, 20, 0, 33,
+  32, 0, 14, 3, 0, 16, 42, 0, 37, 0,
+  0, 30, 0, 27, 36, 9, 13, 0, 0, 22,
+  2, 0, 70, 5, 0, 64, 0, 23, 40, 0,
+  76, 0, 6, 0, 58, 8, 17, 40, 5, 0,
+  26, 0, 1, 0, 0, 0, 39, 0, 71, 0,
+  10, 9, 14, 0, 2, 55, 59, 38, 4, 35,
+  16, 13, 17, 0, 0, 16, 84, 0, 0, 22,
+  51, 18, 0, 0, 0, 56, 0, 33, 67, 0,
+  5, 30, 0, 0, 0, 43, 70, 0, 18, 0,
+  0, 0, 0, 41, 0, 35, 57, 2, 29, 80,
+  44, 19, 0, 21, 0, 34, 36, 10, 35, 0,
+  10, 0, 0, 0, 30, 26, 0, 32, 0, 0,
+  35, 1, 27, 0, 0, 17, 9, 19, 26, 0,
+  10, 16, 0, 22, 23, 0, 61, 69, 0, 5,
+  0, 0, 0, 42, 5, 0, 0, 31, 0, 24,
+  35, 0, 0, 65, 2, 0, 10, 12, 63, 0,
+  37, 0, 27, 0, 0, 14, 0, 0, 0, 0,
+  0, 0, 0, 0, 4, 0, 41, 0, 35, 0,
+  8, 0, 0, 0, 0, 18, 14, 124, 8, 0,
+  7, 0, 0, 29, 52, 11, 0, 6, 15, 0,
+  0, 0, 0, 77, 2, 24, 40, 0, 0, 9,
+  0, 14, 0, 31, 15, 32, 0, 0, 0, 21,
+  0, 76, 0, 37, 0, 65, 12, 85, 61, 31,
+  0, 0, 0, 31, 31, 4, 2, 0, 40, 0,
+  18, 0, 23, 69, 0, 16, 12, 9, 0, 29,
+  58, 0, 39, 20, 11, 0, 25, 21, 19, 0,
+  0, 29, 42, 0, 16, 44, 15, 0, 11, 0,
+  0, 8, 0, 6, 0, 0, 4, 72, 0, 0,
+  0, 72, 0, 0, 4, 12, 57, 0, 27, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 77, 0,
+  47, 0, 6, 3, 0, 0, 55, 0, 22, 0,
+  43, 69, 0, 8, 5, 11, 0, 0, 0, 0,
+  0, 0, 16, 73, 0, 0, 82, 18, 0, 0,
+  0, 41, 0, 50, 15, 0, 5, 16, 0, 0,
+  0, 19, 83, 23, 0, 0, 0, 9, 0, 0,
+  0, 6, 0, 0, 9, 74, 35, 102, 0, 0,
+  0, 29, 56, 0, 22, 0, 18, 0, 0, 0,
+  78, 24, 0, 51, 0, 0, 97, 0, 107, 49,
+  0, 0, 4, 13, 45, 0, 27, 0, 0, 5,
+  25, 0, 35, 12, 0, 12, 0, 6, 0, 6,
+  0, 26, 0, 19, 1, 0, 34, 0, 12, 95,
+  20, 81, 35, 21, 44, 44, 10, 0, 51, 0,
+  0, 63, 0, 7, 0, 0, 0, 0, 11, 0,
+  22, 0, 33, 0, 0, 27, 27, 0, 0, 39,
+  39, 29, 0, 48, 7, 15, 23, 0, 0, 11,
+  81, 0, 0, 23, 58, 7, 0, 0, 0, 63,
+  0, 21, 41, 0, 0, 12, 0, 0, 0, 32,
+  67, 3, 1, 0, 0, 13, 0, 47, 0, 18,
+  41, 13, 22, 69, 25, 53, 0, 12, 0, 37,
+  21, 7, 22, 0, 22, 0, 0, 0, 16, 31,
+  0, 29, 0, 0, 7, 0, 37, 0, 18, 0,
+  9, 21, 4, 0, 5, 11, 0, 39, 27, 0,
+  62, 62, 0, 0, 0, 0, 0, 18, 1, 0,
+  0, 19, 0, 19, 32, 0, 0, 78, 11, 0,
+  0, 10, 15, 0, 33, 0, 0, 0, 0, 8,
+  0, 0, 0, 0, 7, 0, 0, 0, 0, 0,
+  38, 0, 39, 0, 9, 0, 0, 0, 0, 12,
+  0, 128, 4, 0, 24, 0, 0, 24, 44, 0,
+  0, 3, 15, 0, 0, 0, 17, 87, 14, 19,
+  11, 0, 0, 0, 0, 0, 0, 22, 19, 26,
+  0, 6, 0, 37, 0, 56, 0, 21, 0, 56,
+  0, 77, 54, 47, 0, 0, 0, 41, 15, 0,
+  2, 0, 67, 0, 29, 0, 3, 66, 0, 12,
+  54, 5, 0, 16, 73, 0, 77, 17, 14, 1,
+  0, 19, 20, 20, 0, 39, 27, 0, 45, 41,
+  10, 0, 5, 0, 0, 0, 0, 17, 0, 0,
+  0, 33, 0, 0, 7, 75, 14, 0, 0, 3,
+  5, 0, 19, 0, 0, 0, 0, 0, 0, 14,
+  0, 0, 93, 0, 37, 0, 0, 0, 0, 0,
+  36, 0, 0, 0, 0, 67, 0, 11, 0, 33,
+  2, 0, 0, 0, 0, 17, 28, 49, 0, 0,
+  52, 3, 0, 0, 28, 58, 0, 42, 19, 0,
+  0, 8, 0, 9, 0, 26, 82, 21, 0, 0,
+  0, 27, 0, 8, 0, 40, 0, 22, 24, 91,
+  9, 110, 0, 0, 0, 27, 50, 0, 37, 0,
+  28, 0, 14, 0, 55, 50, 0, 43, 0, 0,
+  49, 11, 81, 0, 4, 0, 22, 7, 42, 0,
+  12, 0, 0, 26, 21, 0, 21, 24, 0, 0,
+  0, 0, 0, 9, 0, 0, 0, 9, 0, 20,
+  0, 0, 47, 83, 0, 52, 17, 21, 41, 51,
+  25, 0, 40, 5, 0, 40, 0, 11, 0, 0,
+  21, 0, 13, 13, 31, 0, 15, 0, 35, 1,
+  15, 0, 0, 27, 36, 37, 0, 42, 17, 9,
+  15, 0, 0, 22, 97, 0, 7, 27, 55, 8,
+  0, 0, 0, 69, 0, 8, 46, 0, 0, 20,
+  0, 2, 0, 37, 78, 0, 3, 0, 0, 24,
+  0, 73, 0, 34, 30, 29, 29, 57, 25, 42,
+  0, 28, 0, 43, 34, 9, 17, 0, 10, 0,
+  0, 0, 6, 14, 0, 16, 0, 0, 0, 0,
+  28, 0, 23, 6, 0, 10, 7, 0, 0, 23,
+  0, 35, 38, 0, 52, 56, 0, 0, 11, 0,
+  0, 18, 0, 0, 0, 4, 0, 16, 29, 0,
+  0, 66, 6, 0, 0, 10, 18, 0, 38, 0,
+  0, 6, 0, 7, 0, 1, 0, 0, 17, 0,
+  0, 0, 5, 0, 43, 0, 63, 0, 11, 0,
+  0, 0, 0, 15, 0, 142, 5, 0, 3, 0,
+  0, 27, 43, 0, 0, 0, 6, 0, 0, 0,
+  37, 88, 23, 15, 8, 0, 0, 0, 0, 13,
+  0, 22, 26, 24, 0, 2, 0, 36, 0, 50,
+  0, 35, 0, 56, 1, 71, 43, 43, 0, 0,
+  0, 38, 8, 0, 4, 0, 67, 0, 33, 0,
+  0, 57, 0, 0, 64, 0, 0, 26, 62, 0,
+  74, 26, 27, 3, 4, 32, 9, 25, 0, 31,
+  35, 0, 37, 52, 8, 0, 19, 0, 0, 0,
+  0, 11, 7, 0, 1, 26, 0, 0, 10, 66,
+  18, 0, 0, 7, 8, 0, 31, 0, 0, 0,
+  0, 0, 0, 15, 0, 0, 111, 2, 35, 3,
+  0, 0, 0, 0, 41, 0, 0, 0, 2, 55,
+  59, 38, 4, 35, 16, 13, 17, 0, 0, 16,
+  84, 0, 0, 22, 51, 18, 0, 0, 0, 56,
+  0, 33, 67, 0, 5, 30, 0, 0, 0, 43,
+  70, 0, 18, 0, 0, 0, 0, 41, 0, 35,
+  57, 2, 29, 80, 44, 19, 0, 21, 0, 34,
+  36, 10, 35, 0, 10, 0, 0, 0, 30, 26,
+  0, 32, 0, 0, 35, 1, 27, 0, 0, 17,
+  9, 19, 26, 0, 10, 16, 0, 22, 23, 0,
+  61, 69, 0, 5, 0, 0, 0, 42, 5, 0,
+  0, 31, 0, 24, 35, 0, 0, 65, 2, 0,
+  10, 12, 63, 0, 37, 0, 27, 0, 0, 14,
+  0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
+  41, 0, 35, 0, 8, 0, 0, 0, 0, 18,
+  14, 124, 8, 0, 7, 0, 0, 29, 52, 11,
+  0, 6, 15, 0, 0, 0, 0, 77, 2, 24,
+  40, 0, 0, 9, 0, 14, 0, 31, 15, 32,
+  0, 0, 0, 21, 0, 76, 0, 37, 0, 65,
+  12, 85, 61, 31, 0, 0, 0, 31, 31, 4,
+  2, 0, 40, 0, 18, 0, 23, 69, 0, 16,
+  12, 9, 0, 29, 58, 0, 39, 20, 11, 0,
+  25, 21, 19, 0, 0, 29, 42, 0, 16, 44,
+  15, 0, 11, 0, 0, 8, 0, 6, 0, 0,
+  4, 72, 0, 0, 0, 72, 0, 0, 4, 12,
+  57, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 77, 0, 47, 0, 6, 3, 0, 0,
+  55, 0, 22, 0, 0, 12, 0, 0, 34, 31,
+  37, 0, 16, 0, 1, 11, 52, 11, 10, 28,
+  23, 12, 0, 12, 51, 0, 0, 50, 24, 48,
+  0, 15, 0, 35, 0, 0, 38, 48, 0, 0,
+  0, 6, 0, 75, 0, 43, 0, 59, 29, 41,
+  15, 15, 0, 19, 0, 15, 107, 18, 0, 0,
+  17, 0, 0, 28, 25, 21, 0, 41, 0, 0,
+  45, 6, 26, 0, 0, 8, 0, 14, 33, 51,
+  4, 0, 0, 28, 84, 14, 0, 6, 19, 0,
+  12, 21, 18, 26, 0, 9, 9, 21, 0, 72,
+  0, 4, 31, 72, 0, 0, 2, 0, 39, 0,
+  26, 7, 9, 48, 0, 0, 0, 3, 0, 0,
+  39, 24, 41, 0, 37, 0, 84, 0, 64, 0,
+  13, 0, 0, 39, 39, 29, 0, 48, 7, 15,
+  23, 0, 0, 11, 81, 0, 0, 23, 58, 7,
+  0, 0, 0, 63, 0, 21, 41, 0, 0, 12,
+  0, 0, 0, 32, 67, 3, 1, 0, 0, 13,
+  0, 47, 0, 18, 41, 13, 22, 69, 25, 53,
+  0, 12, 0, 37, 21, 7, 22, 0, 22, 0,
+  0, 0, 16, 31, 0, 29, 0, 0, 7, 0,
+  37, 0, 18, 0, 9, 21, 4, 0, 5, 11,
+  0, 39, 27, 0, 62, 62, 0, 0, 0, 0,
+  0, 18, 1, 0, 0, 19, 0, 19, 32, 0,
+  0, 78, 11, 0, 0, 10, 15, 0, 33, 0,
+  0, 0, 0, 8, 0, 0, 0, 0, 7, 0,
+  0, 0, 0, 0, 38, 0, 39, 0, 9, 0,
+  0, 0, 0, 12, 0, 128, 4, 0, 24, 0,
+  0, 24, 44, 0, 0, 3, 15, 0, 0, 0,
+  17, 87, 14, 19, 11, 0, 0, 0, 0, 0,
+  0, 22, 19, 26, 0, 6, 0, 37, 0, 56,
+  0, 21, 0, 56, 0, 77, 54, 47, 0, 0,
+  0, 41, 15, 0, 2, 0, 67, 0, 29, 0,
+  3, 66, 0, 12, 54, 5, 0, 16, 73, 0,
+  77, 17, 14, 1, 0, 19, 20, 20, 0, 39,
+  27, 0, 45, 41, 10, 0, 5, 0, 0, 0,
+  0, 17, 0, 0, 0, 33, 0, 0, 7, 75,
+  14, 0, 0, 3, 5, 0, 19, 0, 0, 0,
+  0, 0, 0, 14, 0, 0, 93, 0, 37, 0,
+  0, 0, 0, 0, 36, 0, 0, 0, 0, 0,
+  0, 0, 0, 48, 47, 0, 22, 0, 0, 0,
+  38, 0, 10, 49, 31, 17, 0, 15, 62, 0,
+  0, 40, 0, 20, 12, 0, 0, 26, 0, 0,
+  64, 55, 8, 0, 0, 16, 0, 41, 0, 28,
+  0, 56, 0, 45, 21, 45, 0, 12, 2, 10,
+  93, 9, 0, 9, 48, 0, 0, 35, 16, 4,
+  0, 1, 0, 0, 17, 7, 42, 0, 2, 3,
+  0, 21, 13, 42, 3, 0, 0, 26, 69, 0,
+  18, 2, 18, 0, 12, 0, 9, 8, 0, 31,
+  0, 8, 5, 29, 0, 0, 36, 54, 18, 0,
+  0, 0, 1, 0, 24, 4, 0, 31, 0, 1,
+  0, 19, 0, 0, 51, 3, 32, 0, 21, 0,
+  83, 0, 35, 0, 4, 0, 0, 27, 36, 37,
+  0, 42, 17, 9, 15, 0, 0, 22, 97, 0,
+  7, 27, 55, 8, 0, 0, 0, 69, 0, 8,
+  46, 0, 0, 20, 0, 2, 0, 37, 78, 0,
+  3, 0, 0, 24, 0, 73, 0, 34, 30, 29,
+  29, 57, 25, 42, 0, 28, 0, 43, 34, 9,
+  17, 0, 10, 0, 0, 0, 6, 14, 0, 16,
+  0, 0, 0, 0, 28, 0, 23, 6, 0, 10,
+  7, 0, 0, 23, 0, 35, 38, 0, 52, 56,
+  0, 0, 11, 0, 0, 18, 0, 0, 0, 4,
+  0, 16, 29, 0, 0, 66, 6, 0, 0, 10,
+  18, 0, 38, 0, 0, 6, 0, 7, 0, 1,
+  0, 0, 17, 0, 0, 0, 5, 0, 43, 0,
+  63, 0, 11, 0, 0, 0, 0, 15, 0, 142,
+  5, 0, 3, 0, 0, 27, 43, 0, 0, 0,
+  6, 0, 0, 0, 37, 88, 23, 15, 8, 0,
+  0, 0, 0, 13, 0, 22, 26, 24, 0, 2,
+  0, 36, 0, 50, 0, 35, 0, 56, 1, 71,
+  43, 43, 0, 0, 0, 38, 8, 0, 4, 0,
+  67, 0, 33, 0, 0, 57, 0, 0, 64, 0,
+  0, 26, 62, 0, 74, 26, 27, 3, 4, 32,
+  9, 25, 0, 31, 35, 0, 37, 52, 8, 0,
+  19, 0, 0, 0, 0, 11, 7, 0, 1, 26,
+  0, 0, 10, 66, 18, 0, 0, 7, 8, 0,
+  31, 0, 0, 0, 0, 0, 0, 15, 0, 0,
+  111, 2, 35, 3, 0, 0, 0, 0, 41, 0,
+  0, 0, 0, 0, 0, 0, 0, 51, 48, 0,
+  17, 0, 0, 1, 56, 0, 12, 28, 33, 20,
+  5, 18, 77, 0, 0, 29, 0, 42, 17, 0,
+  0, 38, 0, 0, 71, 57, 0, 0, 0, 12,
+  0, 39, 0, 43, 0, 51, 0, 34, 20, 45,
+  0, 31, 15, 0, 71, 13, 0, 6, 44, 0,
+  0, 54, 15, 0, 0, 0, 0, 0, 23, 28,
+  33, 0, 0, 13, 0, 22, 15, 54, 0, 0,
+  0, 29, 69, 6, 16, 0, 25, 0, 11, 13,
+  3, 2, 0, 26, 5, 14, 0, 26, 0, 0,
+  43, 47, 11, 6, 0, 0, 0, 0, 43, 0,
+  0, 46, 1, 0, 0, 11, 0, 0, 48, 15,
+  46, 0, 23, 0, 104, 0, 47, 0, 0, 0,
+  0, 0, 0, 18, 14, 124, 8, 0, 7, 0,
+  0, 29, 52, 11, 0, 6, 15, 0, 0, 0,
+  0, 77, 2, 24, 40, 0, 0, 9, 0, 14,
+  0, 31, 15, 32, 0, 0, 0, 21, 0, 76,
+  0, 37, 0, 65, 12, 85, 61, 31, 0, 0,
+  0, 31, 31, 4, 2, 0, 40, 0, 18, 0,
+  23, 69, 0, 16, 12, 9, 0, 29, 58, 0,
+  39, 20, 11, 0, 25, 21, 19, 0, 0, 29,
+  42, 0, 16, 44, 15, 0, 11, 0, 0, 8,
+  0, 6, 0, 0, 4, 72, 0, 0, 0, 72,
+  0, 0, 4, 12, 57, 0, 27, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 77, 0, 47, 0,
+  6, 3, 0, 0, 55, 0, 22, 0, 0, 12,
+  0, 0, 34, 31, 37, 0, 16, 0, 1, 11,
+  52, 11, 10, 28, 23, 12, 0, 12, 51, 0,
+  0, 50, 24, 48, 0, 15, 0, 35, 0, 0,
+  38, 48, 0, 0, 0, 6, 0, 75, 0, 43,
+  0, 59, 29, 41, 15, 15, 0, 19, 0, 15,
+  107, 18, 0, 0, 17, 0, 0, 28, 25, 21,
+  0, 41, 0, 0, 45, 6, 26, 0, 0, 8,
+  0, 14, 33, 51, 4, 0, 0, 28, 84, 14,
+  0, 6, 19, 0, 12, 21, 18, 26, 0, 9,
+  9, 21, 0, 72, 0, 4, 31, 72, 0, 0,
+  2, 0, 39, 0, 26, 7, 9, 48, 0, 0,
+  0, 3, 0, 0, 39, 24, 41, 0, 37, 0,
+  84, 0, 64, 0, 13, 0, 0, 32, 0, 0,
+  20, 0, 56, 0, 35, 0, 0, 29, 28, 20,
+  52, 24, 39, 50, 3, 36, 95, 0, 10, 21,
+  21, 25, 9, 34, 0, 29, 0, 0, 63, 0,
+  10, 0, 0, 0, 0, 48, 0, 3, 0, 63,
+  16, 61, 5, 1, 0, 6, 0, 3, 79, 33,
+  0, 0, 18, 0, 0, 7, 0, 7, 0, 0,
+  0, 0, 32, 20, 20, 0, 0, 0, 0, 0,
+  62, 0, 13, 2, 0, 6, 67, 26, 0, 0,
+  6, 0, 7, 0, 11, 49, 18, 0, 0, 4,
+  0, 55, 0, 6, 64, 36, 0, 0, 3, 0,
+  34, 0, 22, 9, 31, 35, 0, 0, 0, 0,
+  0, 0, 14, 2, 12, 0, 45, 0, 77, 0,
+  41, 0, 26, 0, 0, 0, 0, 12, 0, 128,
+  4, 0, 24, 0, 0, 24, 44, 0, 0, 3,
+  15, 0, 0, 0, 17, 87, 14, 19, 11, 0,
+  0, 0, 0, 0, 0, 22, 19, 26, 0, 6,
+  0, 37, 0, 56, 0, 21, 0, 56, 0, 77,
+  54, 47, 0, 0, 0, 41, 15, 0, 2, 0,
+  67, 0, 29, 0, 3, 66, 0, 12, 54, 5,
+  0, 16, 73, 0, 77, 17, 14, 1, 0, 19,
+  20, 20, 0, 39, 27, 0, 45, 41, 10, 0,
+  5, 0, 0, 0, 0, 17, 0, 0, 0, 33,
+  0, 0, 7, 75, 14, 0, 0, 3, 5, 0,
+  19, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+  93, 0, 37, 0, 0, 0, 0, 0, 36, 0,
+  0, 0, 0, 0, 0, 0, 0, 48, 47, 0,
+  22, 0, 0, 0, 38, 0, 10, 49, 31, 17,
+  0, 15, 62, 0, 0, 40, 0, 20, 12, 0,
+  0, 26, 0, 0, 64, 55, 8, 0, 0, 16,
+  0, 41, 0, 28, 0, 56, 0, 45, 21, 45,
+  0, 12, 2, 10, 93, 9, 0, 9, 48, 0,
+  0, 35, 16, 4, 0, 1, 0, 0, 17, 7,
+  42, 0, 2, 3, 0, 21, 13, 42, 3, 0,
+  0, 26, 69, 0, 18, 2, 18, 0, 12, 0,
+  9, 8, 0, 31, 0, 8, 5, 29, 0, 0,
+  36, 54, 18, 0, 0, 0, 1, 0, 24, 4,
+  0, 31, 0, 1, 0, 19, 0, 0, 51, 3,
+  32, 0, 21, 0, 83, 0, 35, 0, 4, 0,
+  0, 9, 0, 0, 15, 0, 57, 0, 37, 0,
+  0, 0, 30, 12, 51, 40, 45, 47, 0, 28,
+  101, 0, 0, 27, 0, 9, 25, 8, 0, 23,
+  0, 0, 52, 4, 22, 0, 0, 12, 0, 35,
+  0, 7, 0, 70, 5, 54, 4, 16, 0, 0,
+  13, 8, 68, 27, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 23, 1, 27, 0,
+  0, 0, 0, 10, 48, 0, 7, 9, 0, 11,
+  57, 13, 9, 0, 13, 0, 0, 0, 22, 29,
+  9, 0, 0, 15, 0, 34, 0, 0, 59, 37,
+  0, 0, 0, 0, 12, 0, 17, 14, 11, 27,
+  0, 0, 0, 5, 0, 0, 24, 0, 14, 0,
+  27, 0, 77, 0, 21, 0, 13, 0, 0, 0,
+  0, 15, 0, 142, 5, 0, 3, 0, 0, 27,
+  43, 0, 0, 0, 6, 0, 0, 0, 37, 88,
+  23, 15, 8, 0, 0, 0, 0, 13, 0, 22,
+  26, 24, 0, 2, 0, 36, 0, 50, 0, 35,
+  0, 56, 1, 71, 43, 43, 0, 0, 0, 38,
+  8, 0, 4, 0, 67, 0, 33, 0, 0, 57,
+  0, 0, 64, 0, 0, 26, 62, 0, 74, 26,
+  27, 3, 4, 32, 9, 25, 0, 31, 35, 0,
+  37, 52, 8, 0, 19, 0, 0, 0, 0, 11,
+  7, 0, 1, 26, 0, 0, 10, 66, 18, 0,
+  0, 7, 8, 0, 31, 0, 0, 0, 0, 0,
+  0, 15, 0, 0, 111, 2, 35, 3, 0, 0,
+  0, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+  0, 51, 48, 0, 17, 0, 0, 1, 56, 0,
+  12, 28, 33, 20, 5, 18, 77, 0, 0, 29,
+  0, 42, 17, 0, 0, 38, 0, 0, 71, 57,
+  0, 0, 0, 12, 0, 39, 0, 43, 0, 51,
+  0, 34, 20, 45, 0, 31, 15, 0, 71, 13,
+  0, 6, 44, 0, 0, 54, 15, 0, 0, 0,
+  0, 0, 23, 28, 33, 0, 0, 13, 0, 22,
+  15, 54, 0, 0, 0, 29, 69, 6, 16, 0,
+  25, 0, 11, 13, 3, 2, 0, 26, 5, 14,
+  0, 26, 0, 0, 43, 47, 11, 6, 0, 0,
+  0, 0, 43, 0, 0, 46, 1, 0, 0, 11,
+  0, 0, 48, 15, 46, 0, 23, 0, 104, 0,
+  47, 0, 0, 0, 0, 29, 0, 0, 20, 0,
+  45, 0, 38, 0, 0, 2, 26, 28, 73, 29,
+  52, 53, 0, 24, 91, 0, 0, 24, 16, 39,
+  26, 0, 0, 20, 0, 0, 40, 12, 3, 0,
+  0, 8, 0, 47, 0, 9, 0, 58, 0, 33,
+  12, 19, 0, 0, 17, 3, 66, 44, 0, 0,
+  7, 0, 0, 3, 7, 0, 0, 0, 0, 0,
+  42, 7, 32, 0, 0, 0, 0, 10, 51, 0,
+  4, 0, 0, 8, 61, 18, 25, 0, 32, 0,
+  8, 4, 12, 12, 2, 0, 0, 26, 0, 31,
+  0, 0, 56, 29, 0, 2, 0, 0, 0, 0,
+  30, 0, 7, 37, 0, 0, 0, 21, 0, 0,
+  7, 6, 14, 0, 16, 0, 90, 0, 25, 0,
+  12, 0, 0, 12, 0, 0, 34, 31, 37, 0,
+  16, 0, 1, 11, 52, 11, 10, 28, 23, 12,
+  0, 12, 51, 0, 0, 50, 24, 48, 0, 15,
+  0, 35, 0, 0, 38, 48, 0, 0, 0, 6,
+  0, 75, 0, 43, 0, 59, 29, 41, 15, 15,
+  0, 19, 0, 15, 107, 18, 0, 0, 17, 0,
+  0, 28, 25, 21, 0, 41, 0, 0, 45, 6,
+  26, 0, 0, 8, 0, 14, 33, 51, 4, 0,
+  0, 28, 84, 14, 0, 6, 19, 0, 12, 21,
+  18, 26, 0, 9, 9, 21, 0, 72, 0, 4,
+  31, 72, 0, 0, 2, 0, 39, 0, 26, 7,
+  9, 48, 0, 0, 0, 3, 0, 0, 39, 24,
+  41, 0, 37, 0, 84, 0, 64, 0, 13, 0,
+  0, 32, 0, 0, 20, 0, 56, 0, 35, 0,
+  0, 29, 28, 20, 52, 24, 39, 50, 3, 36,
+  95, 0, 10, 21, 21, 25, 9, 34, 0, 29,
+  0, 0, 63, 0, 10, 0, 0, 0, 0, 48,
+  0, 3, 0, 63, 16, 61, 5, 1, 0, 6,
+  0, 3, 79, 33, 0, 0, 18, 0, 0, 7,
+  0, 7, 0, 0, 0, 0, 32, 20, 20, 0,
+  0, 0, 0, 0, 62, 0, 13, 2, 0, 6,
+  67, 26, 0, 0, 6, 0, 7, 0, 11, 49,
+  18, 0, 0, 4, 0, 55, 0, 6, 64, 36,
+  0, 0, 3, 0, 34, 0, 22, 9, 31, 35,
+  0, 0, 0, 0, 0, 0, 14, 2, 12, 0,
+  45, 0, 77, 0, 41, 0, 26, 0, 0, 27,
+  0, 15, 17, 0, 54, 0, 26, 19, 0, 24,
+  19, 41, 54, 36, 42, 53, 0, 29, 105, 0,
+  0, 24, 36, 35, 13, 47, 0, 36, 0, 0,
+  67, 9, 22, 0, 0, 0, 0, 30, 0, 0,
+  0, 58, 16, 44, 12, 18, 0, 3, 21, 11,
+  61, 51, 0, 0, 3, 0, 0, 16, 0, 0,
+  0, 0, 0, 0, 38, 18, 25, 0, 0, 0,
+  0, 0, 56, 0, 14, 7, 0, 10, 79, 42,
+  2, 0, 11, 0, 6, 6, 16, 33, 14, 0,
+  0, 12, 0, 42, 0, 6, 83, 38, 0, 0,
+  5, 0, 37, 0, 29, 9, 43, 27, 0, 0,
+  1, 0, 0, 0, 12, 0, 2, 0, 32, 0,
+  100, 0, 40, 0, 22, 0, 0, 0, 0, 0,
+  0, 48, 47, 0, 22, 0, 0, 0, 38, 0,
+  10, 49, 31, 17, 0, 15, 62, 0, 0, 40,
+  0, 20, 12, 0, 0, 26, 0, 0, 64, 55,
+  8, 0, 0, 16, 0, 41, 0, 28, 0, 56,
+  0, 45, 21, 45, 0, 12, 2, 10, 93, 9,
+  0, 9, 48, 0, 0, 35, 16, 4, 0, 1,
+  0, 0, 17, 7, 42, 0, 2, 3, 0, 21,
+  13, 42, 3, 0, 0, 26, 69, 0, 18, 2,
+  18, 0, 12, 0, 9, 8, 0, 31, 0, 8,
+  5, 29, 0, 0, 36, 54, 18, 0, 0, 0,
+  1, 0, 24, 4, 0, 31, 0, 1, 0, 19,
+  0, 0, 51, 3, 32, 0, 21, 0, 83, 0,
+  35, 0, 4, 0, 0, 9, 0, 0, 15, 0,
+  57, 0, 37, 0, 0, 0, 30, 12, 51, 40,
+  45, 47, 0, 28, 101, 0, 0, 27, 0, 9,
+  25, 8, 0, 23, 0, 0, 52, 4, 22, 0,
+  0, 12, 0, 35, 0, 7, 0, 70, 5, 54,
+  4, 16, 0, 0, 13, 8, 68, 27, 0, 0,
+  28, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  23, 1, 27, 0, 0, 0, 0, 10, 48, 0,
+  7, 9, 0, 11, 57, 13, 9, 0, 13, 0,
+  0, 0, 22, 29, 9, 0, 0, 15, 0, 34,
+  0, 0, 59, 37, 0, 0, 0, 0, 12, 0,
+  17, 14, 11, 27, 0, 0, 0, 5, 0, 0,
+  24, 0, 14, 0, 27, 0, 77, 0, 21, 0,
+  13, 0, 0, 33, 0, 0, 27, 0, 41, 0,
+  45, 22, 0, 7, 22, 44, 69, 48, 60, 49,
+  0, 17, 100, 0, 0, 26, 19, 29, 19, 25,
+  0, 21, 0, 0, 29, 10, 19, 0, 0, 21,
+  0, 35, 0, 0, 0, 56, 7, 31, 16, 4,
+  0, 0, 48, 0, 33, 46, 0, 2, 16, 0,
+  0, 12, 0, 0, 0, 0, 0, 0, 48, 0,
+  33, 0, 0, 0, 0, 6, 51, 0, 15, 23,
+  0, 30, 42, 35, 0, 0, 24, 0, 0, 0,
+  26, 42, 0, 0, 0, 46, 0, 27, 0, 13,
+  75, 38, 0, 0, 0, 0, 17, 0, 16, 5,
+  28, 44, 0, 0, 0, 5, 8, 0, 2, 0,
+  24, 0, 4, 0, 105, 0, 27, 6, 32, 0,
+  0, 0, 0, 0, 0, 51, 48, 0, 17, 0,
+  0, 1, 56, 0, 12, 28, 33, 20, 5, 18,
+  77, 0, 0, 29, 0, 42, 17, 0, 0, 38,
+  0, 0, 71, 57, 0, 0, 0, 12, 0, 39,
+  0, 43, 0, 51, 0, 34, 20, 45, 0, 31,
+  15, 0, 71, 13, 0, 6, 44, 0, 0, 54,
+  15, 0, 0, 0, 0, 0, 23, 28, 33, 0,
+  0, 13, 0, 22, 15, 54, 0, 0, 0, 29,
+  69, 6, 16, 0, 25, 0, 11, 13, 3, 2,
+  0, 26, 5, 14, 0, 26, 0, 0, 43, 47,
+  11, 6, 0, 0, 0, 0, 43, 0, 0, 46,
+  1, 0, 0, 11, 0, 0, 48, 15, 46, 0,
+  23, 0, 104, 0, 47, 0, 0, 0, 0, 29,
+  0, 0, 20, 0, 45, 0, 38, 0, 0, 2,
+  26, 28, 73, 29, 52, 53, 0, 24, 91, 0,
+  0, 24, 16, 39, 26, 0, 0, 20, 0, 0,
+  40, 12, 3, 0, 0, 8, 0, 47, 0, 9,
+  0, 58, 0, 33, 12, 19, 0, 0, 17, 3,
+  66, 44, 0, 0, 7, 0, 0, 3, 7, 0,
+  0, 0, 0, 0, 42, 7, 32, 0, 0, 0,
+  0, 10, 51, 0, 4, 0, 0, 8, 61, 18,
+  25, 0, 32, 0, 8, 4, 12, 12, 2, 0,
+  0, 26, 0, 31, 0, 0, 56, 29, 0, 2,
+  0, 0, 0, 0, 30, 0, 7, 37, 0, 0,
+  0, 21, 0, 0, 7, 6, 14, 0, 16, 0,
+  90, 0, 25, 0, 12, 0, 0, 65, 0, 0,
+  34, 0, 36, 0, 61, 12, 0, 5, 44, 54,
+  61, 74, 64, 45, 0, 12, 72, 0, 0, 33,
+  31, 57, 17, 27, 0, 12, 0, 0, 29, 8,
+  17, 0, 0, 37, 0, 58, 0, 3, 0, 54,
+  0, 29, 24, 4, 0, 0, 35, 0, 43, 56,
+  0, 0, 7, 0, 0, 32, 0, 0, 0, 0,
+  0, 0, 70, 9, 41, 0, 0, 0, 0, 18,
+  51, 0, 0, 21, 0, 27, 40, 52, 13, 20,
+  40, 15, 0, 9, 25, 57, 3, 0, 0, 59,
+  0, 27, 0, 5, 69, 44, 0, 0, 0, 0,
+  2, 0, 12, 20, 36, 60, 0, 0, 0, 21,
+  0, 0, 0, 18, 24, 0, 0, 1, 134, 0,
+  38, 0, 44, 0, 0, 32, 0, 0, 20, 0,
+  56, 0, 35, 0, 0, 29, 28, 20, 52, 24,
+  39, 50, 3, 36, 95, 0, 10, 21, 21, 25,
+  9, 34, 0, 29, 0, 0, 63, 0, 10, 0,
+  0, 0, 0, 48, 0, 3, 0, 63, 16, 61,
+  5, 1, 0, 6, 0, 3, 79, 33, 0, 0,
+  18, 0, 0, 7, 0, 7, 0, 0, 0, 0,
+  32, 20, 20, 0, 0, 0, 0, 0, 62, 0,
+  13, 2, 0, 6, 67, 26, 0, 0, 6, 0,
+  7, 0, 11, 49, 18, 0, 0, 4, 0, 55,
+  0, 6, 64, 36, 0, 0, 3, 0, 34, 0,
+  22, 9, 31, 35, 0, 0, 0, 0, 0, 0,
+  14, 2, 12, 0, 45, 0, 77, 0, 41, 0,
+  26, 0, 0, 27, 0, 15, 17, 0, 54, 0,
+  26, 19, 0, 24, 19, 41, 54, 36, 42, 53,
+  0, 29, 105, 0, 0, 24, 36, 35, 13, 47,
+  0, 36, 0, 0, 67, 9, 22, 0, 0, 0,
+  0, 30, 0, 0, 0, 58, 16, 44, 12, 18,
+  0, 3, 21, 11, 61, 51, 0, 0, 3, 0,
+  0, 16, 0, 0, 0, 0, 0, 0, 38, 18,
+  25, 0, 0, 0, 0, 0, 56, 0, 14, 7,
+  0, 10, 79, 42, 2, 0, 11, 0, 6, 6,
+  16, 33, 14, 0, 0, 12, 0, 42, 0, 6,
+  83, 38, 0, 0, 5, 0, 37, 0, 29, 9,
+  43, 27, 0, 0, 1, 0, 0, 0, 12, 0,
+  2, 0, 32, 0, 100, 0, 40, 0, 22, 0,
+  0, 22, 0, 0, 8, 0, 32, 0, 33, 28,
+  0, 1, 0, 29, 40, 48, 56, 56, 12, 13,
+  56, 0, 0, 29, 28, 42, 16, 56, 0, 19,
+  0, 0, 57, 2, 6, 0, 0, 0, 0, 24,
+  0, 0, 0, 16, 1, 14, 21, 10, 0, 5,
+  37, 5, 41, 38, 0, 11, 0, 24, 0, 42,
+  0, 0, 0, 0, 0, 0, 70, 24, 23, 0,
+  0, 0, 11, 21, 44, 0, 8, 0, 0, 12,
+  70, 39, 7, 8, 19, 29, 0, 28, 16, 3,
+  38, 30, 0, 36, 4, 7, 0, 4, 60, 56,
+  0, 0, 5, 0, 33, 0, 12, 9, 35, 35,
+  0, 12, 2, 0, 10, 0, 0, 0, 0, 0,
+  6, 0, 111, 0, 30, 0, 9, 0, 0, 9,
+  0, 0, 15, 0, 57, 0, 37, 0, 0, 0,
+  30, 12, 51, 40, 45, 47, 0, 28, 101, 0,
+  0, 27, 0, 9, 25, 8, 0, 23, 0, 0,
+  52, 4, 22, 0, 0, 12, 0, 35, 0, 7,
+  0, 70, 5, 54, 4, 16, 0, 0, 13, 8,
+  68, 27, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 23, 1, 27, 0, 0, 0,
+  0, 10, 48, 0, 7, 9, 0, 11, 57, 13,
+  9, 0, 13, 0, 0, 0, 22, 29, 9, 0,
+  0, 15, 0, 34, 0, 0, 59, 37, 0, 0,
+  0, 0, 12, 0, 17, 14, 11, 27, 0, 0,
+  0, 5, 0, 0, 24, 0, 14, 0, 27, 0,
+  77, 0, 21, 0, 13, 0, 0, 33, 0, 0,
+  27, 0, 41, 0, 45, 22, 0, 7, 22, 44,
+  69, 48, 60, 49, 0, 17, 100, 0, 0, 26,
+  19, 29, 19, 25, 0, 21, 0, 0, 29, 10,
+  19, 0, 0, 21, 0, 35, 0, 0, 0, 56,
+  7, 31, 16, 4, 0, 0, 48, 0, 33, 46,
+  0, 2, 16, 0, 0, 12, 0, 0, 0, 0,
+  0, 0, 48, 0, 33, 0, 0, 0, 0, 6,
+  51, 0, 15, 23, 0, 30, 42, 35, 0, 0,
+  24, 0, 0, 0, 26, 42, 0, 0, 0, 46,
+  0, 27, 0, 13, 75, 38, 0, 0, 0, 0,
+  17, 0, 16, 5, 28, 44, 0, 0, 0, 5,
+  8, 0, 2, 0, 24, 0, 4, 0, 105, 0,
+  27, 6, 32, 0, 0, 33, 0, 0, 36, 0,
+  0, 3, 48, 28, 0, 0, 10, 59, 39, 46,
+  67, 44, 12, 0, 51, 0, 0, 36, 0, 22,
+  41, 60, 0, 0, 0, 0, 19, 0, 7, 0,
+  0, 22, 0, 24, 0, 0, 0, 4, 0, 17,
+  23, 0, 0, 0, 55, 0, 1, 17, 0, 0,
+  18, 15, 0, 17, 0, 0, 0, 0, 0, 0,
+  102, 0, 17, 0, 0, 0, 5, 41, 35, 0,
+  3, 53, 0, 13, 18, 38, 12, 42, 10, 28,
+  0, 30, 22, 26, 21, 17, 0, 42, 0, 0,
+  0, 2, 49, 55, 1, 0, 0, 0, 16, 0,
+  14, 19, 32, 69, 0, 3, 0, 0, 21, 0,
+  0, 0, 17, 0, 0, 13, 100, 0, 0, 0,
+  30, 37, 0, 29, 0, 0, 20, 0, 45, 0,
+  38, 0, 0, 2, 26, 28, 73, 29, 52, 53,
+  0, 24, 91, 0, 0, 24, 16, 39, 26, 0,
+  0, 20, 0, 0, 40, 12, 3, 0, 0, 8,
+  0, 47, 0, 9, 0, 58, 0, 33, 12, 19,
+  0, 0, 17, 3, 66, 44, 0, 0, 7, 0,
+  0, 3, 7, 0, 0, 0, 0, 0, 42, 7,
+  32, 0, 0, 0, 0, 10, 51, 0, 4, 0,
+  0, 8, 61, 18, 25, 0, 32, 0, 8, 4,
+  12, 12, 2, 0, 0, 26, 0, 31, 0, 0,
+  56, 29, 0, 2, 0, 0, 0, 0, 30, 0,
+  7, 37, 0, 0, 0, 21, 0, 0, 7, 6,
+  14, 0, 16, 0, 90, 0, 25, 0, 12, 0,
+  0, 65, 0, 0, 34, 0, 36, 0, 61, 12,
+  0, 5, 44, 54, 61, 74, 64, 45, 0, 12,
+  72, 0, 0, 33, 31, 57, 17, 27, 0, 12,
+  0, 0, 29, 8, 17, 0, 0, 37, 0, 58,
+  0, 3, 0, 54, 0, 29, 24, 4, 0, 0,
+  35, 0, 43, 56, 0, 0, 7, 0, 0, 32,
+  0, 0, 0, 0, 0, 0, 70, 9, 41, 0,
+  0, 0, 0, 18, 51, 0, 0, 21, 0, 27,
+  40, 52, 13, 20, 40, 15, 0, 9, 25, 57,
+  3, 0, 0, 59, 0, 27, 0, 5, 69, 44,
+  0, 0, 0, 0, 2, 0, 12, 20, 36, 60,
+  0, 0, 0, 21, 0, 0, 0, 18, 24, 0,
+  0, 1, 134, 0, 38, 0, 44, 0, 0, 26,
+  42, 0, 40, 0, 0, 0, 68, 7, 0, 5,
+  43, 69, 21, 36, 59, 16, 3, 0, 30, 7,
+  16, 33, 0, 0, 32, 69, 0, 5, 0, 0,
+  0, 0, 0, 0, 0, 55, 0, 45, 0, 4,
+  0, 0, 0, 8, 12, 0, 0, 16, 23, 16,
+  0, 8, 0, 0, 24, 20, 0, 0, 0, 0,
+  0, 0, 0, 0, 70, 10, 16, 0, 0, 0,
+  0, 27, 24, 0, 0, 57, 0, 13, 0, 13,
+  15, 76, 12, 31, 0, 45, 9, 26, 24, 0,
+  0, 11, 0, 0, 0, 0, 52, 56, 16, 0,
+  0, 0, 1, 0, 7, 24, 39, 91, 4, 0,
+  0, 0, 0, 0, 11, 0, 10, 0, 0, 35,
+  51, 0, 0, 0, 24, 66, 0, 27, 0, 15,
+  17, 0, 54, 0, 26, 19, 0, 24, 19, 41,
+  54, 36, 42, 53, 0, 29, 105, 0, 0, 24,
+  36, 35, 13, 47, 0, 36, 0, 0, 67, 9,
+  22, 0, 0, 0, 0, 30, 0, 0, 0, 58,
+  16, 44, 12, 18, 0, 3, 21, 11, 61, 51,
+  0, 0, 3, 0, 0, 16, 0, 0, 0, 0,
+  0, 0, 38, 18, 25, 0, 0, 0, 0, 0,
+  56, 0, 14, 7, 0, 10, 79, 42, 2, 0,
+  11, 0, 6, 6, 16, 33, 14, 0, 0, 12,
+  0, 42, 0, 6, 83, 38, 0, 0, 5, 0,
+  37, 0, 29, 9, 43, 27, 0, 0, 1, 0,
+  0, 0, 12, 0, 2, 0, 32, 0, 100, 0,
+  40, 0, 22, 0, 0, 22, 0, 0, 8, 0,
+  32, 0, 33, 28, 0, 1, 0, 29, 40, 48,
+  56, 56, 12, 13, 56, 0, 0, 29, 28, 42,
+  16, 56, 0, 19, 0, 0, 57, 2, 6, 0,
+  0, 0, 0, 24, 0, 0, 0, 16, 1, 14,
+  21, 10, 0, 5, 37, 5, 41, 38, 0, 11,
+  0, 24, 0, 42, 0, 0, 0, 0, 0, 0,
+  70, 24, 23, 0, 0, 0, 11, 21, 44, 0,
+  8, 0, 0, 12, 70, 39, 7, 8, 19, 29,
+  0, 28, 16, 3, 38, 30, 0, 36, 4, 7,
+  0, 4, 60, 56, 0, 0, 5, 0, 33, 0,
+  12, 9, 35, 35, 0, 12, 2, 0, 10, 0,
+  0, 0, 0, 0, 6, 0, 111, 0, 30, 0,
+  9, 0, 0, 40, 0, 0, 15, 0, 26, 0,
+  40, 45, 1, 0, 0, 24, 16, 54, 51, 59,
+  27, 8, 15, 0, 0, 41, 35, 63, 9, 78,
+  0, 0, 8, 0, 21, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 0, 0, 0, 0, 38, 0,
+  0, 5, 22, 8, 24, 27, 0, 0, 0, 65,
+  0, 36, 0, 0, 0, 33, 0, 2, 97, 14,
+  35, 0, 0, 0, 20, 36, 43, 5, 0, 0,
+  0, 9, 52, 53, 0, 20, 31, 37, 0, 46,
+  33, 0, 42, 41, 0, 48, 0, 0, 2, 16,
+  45, 62, 0, 0, 12, 0, 34, 0, 0, 17,
+  24, 34, 0, 27, 0, 0, 25, 0, 0, 14,
+  10, 0, 0, 8, 110, 0, 42, 0, 17, 9,
+  0, 33, 0, 0, 27, 0, 41, 0, 45, 22,
+  0, 7, 22, 44, 69, 48, 60, 49, 0, 17,
+  100, 0, 0, 26, 19, 29, 19, 25, 0, 21,
+  0, 0, 29, 10, 19, 0, 0, 21, 0, 35,
+  0, 0, 0, 56, 7, 31, 16, 4, 0, 0,
+  48, 0, 33, 46, 0, 2, 16, 0, 0, 12,
+  0, 0, 0, 0, 0, 0, 48, 0, 33, 0,
+  0, 0, 0, 6, 51, 0, 15, 23, 0, 30,
+  42, 35, 0, 0, 24, 0, 0, 0, 26, 42,
+  0, 0, 0, 46, 0, 27, 0, 13, 75, 38,
+  0, 0, 0, 0, 17, 0, 16, 5, 28, 44,
+  0, 0, 0, 5, 8, 0, 2, 0, 24, 0,
+  4, 0, 105, 0, 27, 6, 32, 0, 0, 33,
+  0, 0, 36, 0, 0, 3, 48, 28, 0, 0,
+  10, 59, 39, 46, 67, 44, 12, 0, 51, 0,
+  0, 36, 0, 22, 41, 60, 0, 0, 0, 0,
+  19, 0, 7, 0, 0, 22, 0, 24, 0, 0,
+  0, 4, 0, 17, 23, 0, 0, 0, 55, 0,
+  1, 17, 0, 0, 18, 15, 0, 17, 0, 0,
+  0, 0, 0, 0, 102, 0, 17, 0, 0, 0,
+  5, 41, 35, 0, 3, 53, 0, 13, 18, 38,
+  12, 42, 10, 28, 0, 30, 22, 26, 21, 17,
+  0, 42, 0, 0, 0, 2, 49, 55, 1, 0,
+  0, 0, 16, 0, 14, 19, 32, 69, 0, 3,
+  0, 0, 21, 0, 0, 0, 17, 0, 0, 13,
+  100, 0, 0, 0, 30, 37, 12, 0, 30, 0,
+  18, 0, 0, 0, 37, 30, 0, 0, 4, 71,
+  11, 0, 44, 48, 26, 0, 25, 1, 22, 8,
+  0, 6, 34, 49, 0, 0, 16, 0, 0, 5,
+  0, 0, 40, 32, 0, 1, 1, 0, 0, 0,
+  0, 0, 9, 0, 0, 0, 31, 0, 0, 10,
+  0, 0, 0, 51, 0, 0, 2, 6, 23, 5,
+  0, 0, 106, 5, 12, 82, 0, 0, 6, 39,
+  0, 0, 0, 50, 1, 0, 0, 34, 0, 54,
+  42, 31, 0, 69, 0, 0, 0, 56, 0, 0,
+  20, 0, 0, 15, 19, 45, 10, 6, 0, 0,
+  0, 0, 0, 21, 1, 57, 6, 0, 0, 0,
+  53, 11, 0, 0, 15, 0, 0, 26, 8, 0,
+  0, 12, 42, 48, 0, 65, 0, 0, 34, 0,
+  36, 0, 61, 12, 0, 5, 44, 54, 61, 74,
+  64, 45, 0, 12, 72, 0, 0, 33, 31, 57,
+  17, 27, 0, 12, 0, 0, 29, 8, 17, 0,
+  0, 37, 0, 58, 0, 3, 0, 54, 0, 29,
+  24, 4, 0, 0, 35, 0, 43, 56, 0, 0,
+  7, 0, 0, 32, 0, 0, 0, 0, 0, 0,
+  70, 9, 41, 0, 0, 0, 0, 18, 51, 0,
+  0, 21, 0, 27, 40, 52, 13, 20, 40, 15,
+  0, 9, 25, 57, 3, 0, 0, 59, 0, 27,
+  0, 5, 69, 44, 0, 0, 0, 0, 2, 0,
+  12, 20, 36, 60, 0, 0, 0, 21, 0, 0,
+  0, 18, 24, 0, 0, 1, 134, 0, 38, 0,
+  44, 0, 0, 26, 42, 0, 40, 0, 0, 0,
+  68, 7, 0, 5, 43, 69, 21, 36, 59, 16,
+  3, 0, 30, 7, 16, 33, 0, 0, 32, 69,
+  0, 5, 0, 0, 0, 0, 0, 0, 0, 55,
+  0, 45, 0, 4, 0, 0, 0, 8, 12, 0,
+  0, 16, 23, 16, 0, 8, 0, 0, 24, 20,
+  0, 0, 0, 0, 0, 0, 0, 0, 70, 10,
+  16, 0, 0, 0, 0, 27, 24, 0, 0, 57,
+  0, 13, 0, 13, 15, 76, 12, 31, 0, 45,
+  9, 26, 24, 0, 0, 11, 0, 0, 0, 0,
+  52, 56, 16, 0, 0, 0, 1, 0, 7, 24,
+  39, 91, 4, 0, 0, 0, 0, 0, 11, 0,
+  10, 0, 0, 35, 51, 0, 0, 0, 24, 66,
+  70, 0, 17, 0, 20, 30, 0, 0, 12, 0,
+  0, 0, 2, 79, 18, 0, 26, 23, 6, 5,
+  29, 52, 17, 15, 0, 0, 8, 29, 0, 0,
+  0, 9, 0, 47, 0, 0, 7, 43, 0, 12,
+  0, 10, 0, 0, 5, 0, 16, 5, 10, 0,
+  24, 4, 0, 0, 15, 0, 23, 37, 5, 0,
+  30, 16, 31, 0, 0, 12, 69, 32, 32, 66,
+  0, 18, 10, 0, 25, 0, 0, 55, 11, 6,
+  0, 12, 0, 37, 48, 12, 31, 65, 0, 0,
+  0, 0, 0, 0, 29, 0, 0, 17, 57, 30,
+  0, 27, 0, 0, 0, 60, 0, 14, 29, 64,
+  0, 0, 0, 1, 7, 52, 58, 0, 0, 0,
+  0, 32, 0, 0, 0, 19, 23, 49, 0, 22,
+  0, 0, 8, 0, 32, 0, 33, 28, 0, 1,
+  0, 29, 40, 48, 56, 56, 12, 13, 56, 0,
+  0, 29, 28, 42, 16, 56, 0, 19, 0, 0,
+  57, 2, 6, 0, 0, 0, 0, 24, 0, 0,
+  0, 16, 1, 14, 21, 10, 0, 5, 37, 5,
+  41, 38, 0, 11, 0, 24, 0, 42, 0, 0,
+  0, 0, 0, 0, 70, 24, 23, 0, 0, 0,
+  11, 21, 44, 0, 8, 0, 0, 12, 70, 39,
+  7, 8, 19, 29, 0, 28, 16, 3, 38, 30,
+  0, 36, 4, 7, 0, 4, 60, 56, 0, 0,
+  5, 0, 33, 0, 12, 9, 35, 35, 0, 12,
+  2, 0, 10, 0, 0, 0, 0, 0, 6, 0,
+  111, 0, 30, 0, 9, 0, 0, 40, 0, 0,
+  15, 0, 26, 0, 40, 45, 1, 0, 0, 24,
+  16, 54, 51, 59, 27, 8, 15, 0, 0, 41,
+  35, 63, 9, 78, 0, 0, 8, 0, 21, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+  0, 0, 38, 0, 0, 5, 22, 8, 24, 27,
+  0, 0, 0, 65, 0, 36, 0, 0, 0, 33,
+  0, 2, 97, 14, 35, 0, 0, 0, 20, 36,
+  43, 5, 0, 0, 0, 9, 52, 53, 0, 20,
+  31, 37, 0, 46, 33, 0, 42, 41, 0, 48,
+  0, 0, 2, 16, 45, 62, 0, 0, 12, 0,
+  34, 0, 0, 17, 24, 34, 0, 27, 0, 0,
+  25, 0, 0, 14, 10, 0, 0, 8, 110, 0,
+  42, 0, 17, 9, 0, 44, 12, 0, 11, 0,
+  23, 0, 54, 79, 0, 0, 0, 0, 3, 53,
+  49, 60, 36, 23, 0, 0, 0, 42, 29, 49,
+  27, 93, 0, 0, 15, 0, 15, 0, 0, 0,
+  0, 32, 0, 20, 0, 0, 0, 0, 0, 7,
+  42, 0, 0, 5, 12, 12, 37, 19, 0, 0,
+  0, 60, 0, 25, 1, 12, 0, 29, 0, 0,
+  86, 0, 36, 9, 0, 0, 13, 38, 43, 13,
+  0, 16, 0, 0, 60, 35, 0, 10, 27, 23,
+  0, 45, 43, 0, 17, 49, 0, 42, 0, 0,
+  4, 7, 24, 57, 0, 0, 23, 0, 36, 0,
+  0, 1, 19, 59, 0, 22, 0, 0, 36, 0,
+  0, 24, 28, 0, 1, 18, 93, 0, 22, 0,
+  42, 20, 0, 33, 0, 0, 36, 0, 0, 3,
+  48, 28, 0, 0, 10, 59, 39, 46, 67, 44,
+  12, 0, 51, 0, 0, 36, 0, 22, 41, 60,
+  0, 0, 0, 0, 19, 0, 7, 0, 0, 22,
+  0, 24, 0, 0, 0, 4, 0, 17, 23, 0,
+  0, 0, 55, 0, 1, 17, 0, 0, 18, 15,
+  0, 17, 0, 0, 0, 0, 0, 0, 102, 0,
+  17, 0, 0, 0, 5, 41, 35, 0, 3, 53,
+  0, 13, 18, 38, 12, 42, 10, 28, 0, 30,
+  22, 26, 21, 17, 0, 42, 0, 0, 0, 2,
+  49, 55, 1, 0, 0, 0, 16, 0, 14, 19,
+  32, 69, 0, 3, 0, 0, 21, 0, 0, 0,
+  17, 0, 0, 13, 100, 0, 0, 0, 30, 37,
+  12, 0, 30, 0, 18, 0, 0, 0, 37, 30,
+  0, 0, 4, 71, 11, 0, 44, 48, 26, 0,
+  25, 1, 22, 8, 0, 6, 34, 49, 0, 0,
+  16, 0, 0, 5, 0, 0, 40, 32, 0, 1,
+  1, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+  31, 0, 0, 10, 0, 0, 0, 51, 0, 0,
+  2, 6, 23, 5, 0, 0, 106, 5, 12, 82,
+  0, 0, 6, 39, 0, 0, 0, 50, 1, 0,
+  0, 34, 0, 54, 42, 31, 0, 69, 0, 0,
+  0, 56, 0, 0, 20, 0, 0, 15, 19, 45,
+  10, 6, 0, 0, 0, 0, 0, 21, 1, 57,
+  6, 0, 0, 0, 53, 11, 0, 0, 15, 0,
+  0, 26, 8, 0, 0, 12, 42, 48, 16, 0,
+  43, 0, 0, 0, 0, 0, 40, 54, 0, 16,
+  0, 59, 14, 0, 21, 57, 23, 17, 21, 14,
+  54, 0, 0, 0, 42, 21, 0, 0, 0, 0,
+  0, 0, 0, 0, 54, 47, 0, 0, 9, 0,
+  0, 0, 0, 0, 9, 0, 0, 0, 23, 0,
+  0, 0, 10, 0, 8, 40, 0, 0, 0, 25,
+  50, 0, 59, 21, 36, 7, 0, 114, 0, 9,
+  8, 6, 0, 0, 4, 34, 0, 0, 0, 19,
+  0, 29, 42, 2, 22, 44, 6, 0, 0, 57,
+  0, 0, 19, 0, 0, 0, 14, 17, 24, 0,
+  0, 0, 0, 0, 0, 0, 0, 39, 0, 0,
+  0, 0, 81, 4, 14, 0, 20, 0, 0, 18,
+  0, 0, 0, 19, 37, 4, 0, 26, 42, 0,
+  40, 0, 0, 0, 68, 7, 0, 5, 43, 69,
+  21, 36, 59, 16, 3, 0, 30, 7, 16, 33,
+  0, 0, 32, 69, 0, 5, 0, 0, 0, 0,
+  0, 0, 0, 55, 0, 45, 0, 4, 0, 0,
+  0, 8, 12, 0, 0, 16, 23, 16, 0, 8,
+  0, 0, 24, 20, 0, 0, 0, 0, 0, 0,
+  0, 0, 70, 10, 16, 0, 0, 0, 0, 27,
+  24, 0, 0, 57, 0, 13, 0, 13, 15, 76,
+  12, 31, 0, 45, 9, 26, 24, 0, 0, 11,
+  0, 0, 0, 0, 52, 56, 16, 0, 0, 0,
+  1, 0, 7, 24, 39, 91, 4, 0, 0, 0,
+  0, 0, 11, 0, 10, 0, 0, 35, 51, 0,
+  0, 0, 24, 66, 70, 0, 17, 0, 20, 30,
+  0, 0, 12, 0, 0, 0, 2, 79, 18, 0,
+  26, 23, 6, 5, 29, 52, 17, 15, 0, 0,
+  8, 29, 0, 0, 0, 9, 0, 47, 0, 0,
+  7, 43, 0, 12, 0, 10, 0, 0, 5, 0,
+  16, 5, 10, 0, 24, 4, 0, 0, 15, 0,
+  23, 37, 5, 0, 30, 16, 31, 0, 0, 12,
+  69, 32, 32, 66, 0, 18, 10, 0, 25, 0,
+  0, 55, 11, 6, 0, 12, 0, 37, 48, 12,
+  31, 65, 0, 0, 0, 0, 0, 0, 29, 0,
+  0, 17, 57, 30, 0, 27, 0, 0, 0, 60,
+  0, 14, 29, 64, 0, 0, 0, 1, 7, 52,
+  58, 0, 0, 0, 0, 32, 0, 0, 0, 19,
+  23, 49, 22, 3, 0, 0, 24, 14, 0, 0,
+  31, 13, 0, 23, 0, 61, 30, 0, 16, 46,
+  7, 38, 53, 0, 0, 0, 7, 20, 37, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 9, 0,
+  0, 0, 0, 3, 0, 3, 12, 0, 13, 5,
+  0, 0, 57, 0, 3, 0, 0, 0, 27, 17,
+  0, 0, 5, 8, 37, 0, 0, 0, 19, 60,
+  0, 39, 0, 33, 30, 0, 37, 12, 0, 30,
+  0, 10, 5, 30, 0, 0, 41, 0, 71, 36,
+  0, 13, 0, 0, 4, 0, 18, 0, 0, 16,
+  44, 2, 0, 26, 0, 0, 0, 38, 5, 6,
+  19, 51, 0, 0, 0, 14, 43, 20, 37, 0,
+  0, 0, 39, 13, 0, 0, 0, 39, 17, 0,
+  0, 40, 0, 0, 15, 0, 26, 0, 40, 45,
+  1, 0, 0, 24, 16, 54, 51, 59, 27, 8,
+  15, 0, 0, 41, 35, 63, 9, 78, 0, 0,
+  8, 0, 21, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 0, 0, 0, 0, 38, 0, 0, 5,
+  22, 8, 24, 27, 0, 0, 0, 65, 0, 36,
+  0, 0, 0, 33, 0, 2, 97, 14, 35, 0,
+  0, 0, 20, 36, 43, 5, 0, 0, 0, 9,
+  52, 53, 0, 20, 31, 37, 0, 46, 33, 0,
+  42, 41, 0, 48, 0, 0, 2, 16, 45, 62,
+  0, 0, 12, 0, 34, 0, 0, 17, 24, 34,
+  0, 27, 0, 0, 25, 0, 0, 14, 10, 0,
+  0, 8, 110, 0, 42, 0, 17, 9, 0, 44,
+  12, 0, 11, 0, 23, 0, 54, 79, 0, 0,
+  0, 0, 3, 53, 49, 60, 36, 23, 0, 0,
+  0, 42, 29, 49, 27, 93, 0, 0, 15, 0,
+  15, 0, 0, 0, 0, 32, 0, 20, 0, 0,
+  0, 0, 0, 7, 42, 0, 0, 5, 12, 12,
+  37, 19, 0, 0, 0, 60, 0, 25, 1, 12,
+  0, 29, 0, 0, 86, 0, 36, 9, 0, 0,
+  13, 38, 43, 13, 0, 16, 0, 0, 60, 35,
+  0, 10, 27, 23, 0, 45, 43, 0, 17, 49,
+  0, 42, 0, 0, 4, 7, 24, 57, 0, 0,
+  23, 0, 36, 0, 0, 1, 19, 59, 0, 22,
+  0, 0, 36, 0, 0, 24, 28, 0, 1, 18,
+  93, 0, 22, 0, 42, 20, 0, 38, 33, 0,
+  0, 0, 27, 0, 63, 89, 0, 12, 0, 0,
+  14, 41, 49, 72, 30, 11, 0, 0, 0, 57,
+  37, 23, 43, 98, 0, 0, 23, 0, 9, 0,
+  0, 0, 0, 70, 0, 0, 14, 15, 16, 0,
+  0, 17, 24, 0, 0, 0, 12, 0, 48, 0,
+  0, 0, 0, 33, 0, 3, 10, 18, 0, 50,
+  0, 0, 81, 0, 15, 42, 0, 0, 7, 44,
+  23, 12, 4, 28, 0, 0, 63, 33, 2, 27,
+  31, 25, 2, 25, 25, 0, 0, 46, 0, 33,
+  0, 0, 0, 14, 0, 51, 3, 0, 8, 0,
+  41, 0, 0, 18, 2, 64, 10, 19, 0, 0,
+  55, 0, 0, 23, 45, 0, 7, 3, 63, 0,
+  0, 0, 78, 18, 12, 0, 30, 0, 18, 0,
+  0, 0, 37, 30, 0, 0, 4, 71, 11, 0,
+  44, 48, 26, 0, 25, 1, 22, 8, 0, 6,
+  34, 49, 0, 0, 16, 0, 0, 5, 0, 0,
+  40, 32, 0, 1, 1, 0, 0, 0, 0, 0,
+  9, 0, 0, 0, 31, 0, 0, 10, 0, 0,
+  0, 51, 0, 0, 2, 6, 23, 5, 0, 0,
+  106, 5, 12, 82, 0, 0, 6, 39, 0, 0,
+  0, 50, 1, 0, 0, 34, 0, 54, 42, 31,
+  0, 69, 0, 0, 0, 56, 0, 0, 20, 0,
+  0, 15, 19, 45, 10, 6, 0, 0, 0, 0,
+  0, 21, 1, 57, 6, 0, 0, 0, 53, 11,
+  0, 0, 15, 0, 0, 26, 8, 0, 0, 12,
+  42, 48, 16, 0, 43, 0, 0, 0, 0, 0,
+  40, 54, 0, 16, 0, 59, 14, 0, 21, 57,
+  23, 17, 21, 14, 54, 0, 0, 0, 42, 21,
+  0, 0, 0, 0, 0, 0, 0, 0, 54, 47,
+  0, 0, 9, 0, 0, 0, 0, 0, 9, 0,
+  0, 0, 23, 0, 0, 0, 10, 0, 8, 40,
+  0, 0, 0, 25, 50, 0, 59, 21, 36, 7,
+  0, 114, 0, 9, 8, 6, 0, 0, 4, 34,
+  0, 0, 0, 19, 0, 29, 42, 2, 22, 44,
+  6, 0, 0, 57, 0, 0, 19, 0, 0, 0,
+  14, 17, 24, 0, 0, 0, 0, 0, 0, 0,
+  0, 39, 0, 0, 0, 0, 81, 4, 14, 0,
+  20, 0, 0, 18, 0, 0, 0, 19, 37, 4,
+  30, 0, 21, 8, 18, 0, 0, 0, 23, 36,
+  0, 0, 0, 54, 7, 0, 0, 65, 15, 16,
+  55, 1, 62, 10, 0, 0, 52, 0, 0, 0,
+  14, 0, 0, 0, 0, 0, 9, 33, 0, 0,
+  29, 0, 0, 9, 0, 0, 15, 0, 0, 0,
+  30, 30, 0, 0, 29, 0, 20, 15, 0, 0,
+  0, 14, 64, 0, 89, 22, 8, 0, 0, 130,
+  0, 14, 8, 0, 2, 0, 14, 22, 0, 0,
+  24, 0, 8, 22, 41, 0, 39, 0, 26, 0,
+  0, 30, 15, 0, 0, 0, 0, 0, 23, 0,
+  15, 0, 0, 0, 0, 0, 0, 32, 0, 10,
+  0, 9, 0, 0, 99, 17, 35, 0, 24, 0,
+  6, 0, 0, 0, 0, 31, 25, 0, 70, 0,
+  17, 0, 20, 30, 0, 0, 12, 0, 0, 0,
+  2, 79, 18, 0, 26, 23, 6, 5, 29, 52,
+  17, 15, 0, 0, 8, 29, 0, 0, 0, 9,
+  0, 47, 0, 0, 7, 43, 0, 12, 0, 10,
+  0, 0, 5, 0, 16, 5, 10, 0, 24, 4,
+  0, 0, 15, 0, 23, 37, 5, 0, 30, 16,
+  31, 0, 0, 12, 69, 32, 32, 66, 0, 18,
+  10, 0, 25, 0, 0, 55, 11, 6, 0, 12,
+  0, 37, 48, 12, 31, 65, 0, 0, 0, 0,
+  0, 0, 29, 0, 0, 17, 57, 30, 0, 27,
+  0, 0, 0, 60, 0, 14, 29, 64, 0, 0,
+  0, 1, 7, 52, 58, 0, 0, 0, 0, 32,
+  0, 0, 0, 19, 23, 49, 22, 3, 0, 0,
+  24, 14, 0, 0, 31, 13, 0, 23, 0, 61,
+  30, 0, 16, 46, 7, 38, 53, 0, 0, 0,
+  7, 20, 37, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 9, 0, 0, 0, 0, 3, 0, 3,
+  12, 0, 13, 5, 0, 0, 57, 0, 3, 0,
+  0, 0, 27, 17, 0, 0, 5, 8, 37, 0,
+  0, 0, 19, 60, 0, 39, 0, 33, 30, 0,
+  37, 12, 0, 30, 0, 10, 5, 30, 0, 0,
+  41, 0, 71, 36, 0, 13, 0, 0, 4, 0,
+  18, 0, 0, 16, 44, 2, 0, 26, 0, 0,
+  0, 38, 5, 6, 19, 51, 0, 0, 0, 14,
+  43, 20, 37, 0, 0, 0, 39, 13, 0, 0,
+  0, 39, 17, 0, 19, 51, 0, 11, 63, 0,
+  36, 0, 33, 2, 0, 24, 2, 46, 28, 0,
+  6, 25, 11, 52, 60, 0, 0, 15, 21, 37,
+  39, 0, 0, 21, 42, 0, 0, 33, 0, 0,
+  0, 0, 0, 0, 0, 29, 0, 51, 23, 0,
+  7, 28, 0, 0, 51, 0, 37, 15, 0, 12,
+  5, 0, 0, 22, 16, 2, 15, 0, 0, 0,
+  4, 57, 0, 0, 0, 41, 5, 0, 60, 0,
+  19, 1, 4, 1, 52, 31, 4, 0, 58, 0,
+  51, 26, 21, 39, 0, 0, 0, 32, 0, 23,
+  0, 0, 55, 8, 0, 36, 1, 0, 0, 0,
+  14, 29, 63, 36, 0, 0, 0, 0, 46, 0,
+  12, 0, 4, 0, 35, 1, 40, 0, 0, 33,
+  0, 0, 0, 44, 12, 0, 11, 0, 23, 0,
+  54, 79, 0, 0, 0, 0, 3, 53, 49, 60,
+  36, 23, 0, 0, 0, 42, 29, 49, 27, 93,
+  0, 0, 15, 0, 15, 0, 0, 0, 0, 32,
+  0, 20, 0, 0, 0, 0, 0, 7, 42, 0,
+  0, 5, 12, 12, 37, 19, 0, 0, 0, 60,
+  0, 25, 1, 12, 0, 29, 0, 0, 86, 0,
+  36, 9, 0, 0, 13, 38, 43, 13, 0, 16,
+  0, 0, 60, 35, 0, 10, 27, 23, 0, 45,
+  43, 0, 17, 49, 0, 42, 0, 0, 4, 7,
+  24, 57, 0, 0, 23, 0, 36, 0, 0, 1,
+  19, 59, 0, 22, 0, 0, 36, 0, 0, 24,
+  28, 0, 1, 18, 93, 0, 22, 0, 42, 20,
+  0, 38, 33, 0, 0, 0, 27, 0, 63, 89,
+  0, 12, 0, 0, 14, 41, 49, 72, 30, 11,
+  0, 0, 0, 57, 37, 23, 43, 98, 0, 0,
+  23, 0, 9, 0, 0, 0, 0, 70, 0, 0,
+  14, 15, 16, 0, 0, 17, 24, 0, 0, 0,
+  12, 0, 48, 0, 0, 0, 0, 33, 0, 3,
+  10, 18, 0, 50, 0, 0, 81, 0, 15, 42,
+  0, 0, 7, 44, 23, 12, 4, 28, 0, 0,
+  63, 33, 2, 27, 31, 25, 2, 25, 25, 0,
+  0, 46, 0, 33, 0, 0, 0, 14, 0, 51,
+  3, 0, 8, 0, 41, 0, 0, 18, 2, 64,
+  10, 19, 0, 0, 55, 0, 0, 23, 45, 0,
+  7, 3, 63, 0, 0, 0, 78, 18, 0, 39,
+  39, 0, 0, 0, 25, 0, 78, 78, 0, 0,
+  0, 3, 0, 17, 3, 41, 11, 0, 0, 0,
+  16, 61, 36, 0, 50, 80, 0, 0, 9, 0,
+  0, 0, 0, 0, 16, 73, 0, 0, 40, 8,
+  4, 0, 0, 14, 31, 0, 0, 0, 18, 0,
+  26, 0, 2, 0, 24, 52, 0, 0, 0, 48,
+  0, 57, 2, 2, 88, 0, 14, 69, 0, 0,
+  2, 41, 6, 46, 1, 15, 0, 0, 48, 46,
+  0, 40, 32, 26, 15, 28, 27, 0, 0, 65,
+  0, 8, 0, 0, 0, 0, 0, 52, 25, 0,
+  0, 0, 32, 0, 0, 39, 0, 43, 11, 0,
+  0, 0, 70, 0, 0, 25, 54, 0, 0, 0,
+  11, 0, 0, 0, 64, 2, 16, 0, 43, 0,
+  0, 0, 0, 0, 40, 54, 0, 16, 0, 59,
+  14, 0, 21, 57, 23, 17, 21, 14, 54, 0,
+  0, 0, 42, 21, 0, 0, 0, 0, 0, 0,
+  0, 0, 54, 47, 0, 0, 9, 0, 0, 0,
+  0, 0, 9, 0, 0, 0, 23, 0, 0, 0,
+  10, 0, 8, 40, 0, 0, 0, 25, 50, 0,
+  59, 21, 36, 7, 0, 114, 0, 9, 8, 6,
+  0, 0, 4, 34, 0, 0, 0, 19, 0, 29,
+  42, 2, 22, 44, 6, 0, 0, 57, 0, 0,
+  19, 0, 0, 0, 14, 17, 24, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 0, 0, 0, 0,
+  81, 4, 14, 0, 20, 0, 0, 18, 0, 0,
+  0, 19, 37, 4, 30, 0, 21, 8, 18, 0,
+  0, 0, 23, 36, 0, 0, 0, 54, 7, 0,
+  0, 65, 15, 16, 55, 1, 62, 10, 0, 0,
+  52, 0, 0, 0, 14, 0, 0, 0, 0, 0,
+  9, 33, 0, 0, 29, 0, 0, 9, 0, 0,
+  15, 0, 0, 0, 30, 30, 0, 0, 29, 0,
+  20, 15, 0, 0, 0, 14, 64, 0, 89, 22,
+  8, 0, 0, 130, 0, 14, 8, 0, 2, 0,
+  14, 22, 0, 0, 24, 0, 8, 22, 41, 0,
+  39, 0, 26, 0, 0, 30, 15, 0, 0, 0,
+  0, 0, 23, 0, 15, 0, 0, 0, 0, 0,
+  0, 32, 0, 10, 0, 9, 0, 0, 99, 17,
+  35, 0, 24, 0, 6, 0, 0, 0, 0, 31,
+  25, 0, 5, 13, 0, 32, 19, 0, 8, 0,
+  42, 4, 0, 13, 0, 36, 0, 0, 0, 57,
+  0, 20, 78, 0, 62, 17, 0, 0, 48, 0,
+  0, 0, 23, 0, 0, 0, 0, 0, 0, 22,
+  0, 0, 41, 0, 0, 33, 9, 0, 6, 0,
+  0, 0, 32, 6, 0, 0, 33, 0, 37, 0,
+  4, 0, 0, 39, 62, 0, 84, 8, 32, 22,
+  0, 130, 0, 9, 16, 0, 0, 9, 33, 13,
+  0, 0, 29, 13, 0, 22, 32, 0, 33, 0,
+  24, 0, 0, 28, 10, 0, 0, 0, 8, 0,
+  32, 0, 10, 12, 0, 0, 0, 0, 0, 83,
+  0, 0, 2, 0, 0, 0, 98, 36, 46, 0,
+  18, 0, 8, 0, 0, 0, 0, 28, 8, 0,
+  22, 3, 0, 0, 24, 14, 0, 0, 31, 13,
+  0, 23, 0, 61, 30, 0, 16, 46, 7, 38,
+  53, 0, 0, 0, 7, 20, 37, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 9, 0, 0, 0,
+  0, 3, 0, 3, 12, 0, 13, 5, 0, 0,
+  57, 0, 3, 0, 0, 0, 27, 17, 0, 0,
+  5, 8, 37, 0, 0, 0, 19, 60, 0, 39,
+  0, 33, 30, 0, 37, 12, 0, 30, 0, 10,
+  5, 30, 0, 0, 41, 0, 71, 36, 0, 13,
+  0, 0, 4, 0, 18, 0, 0, 16, 44, 2,
+  0, 26, 0, 0, 0, 38, 5, 6, 19, 51,
+  0, 0, 0, 14, 43, 20, 37, 0, 0, 0,
+  39, 13, 0, 0, 0, 39, 17, 0, 19, 51,
+  0, 11, 63, 0, 36, 0, 33, 2, 0, 24,
+  2, 46, 28, 0, 6, 25, 11, 52, 60, 0,
+  0, 15, 21, 37, 39, 0, 0, 21, 42, 0,
+  0, 33, 0, 0, 0, 0, 0, 0, 0, 29,
+  0, 51, 23, 0, 7, 28, 0, 0, 51, 0,
+  37, 15, 0, 12, 5, 0, 0, 22, 16, 2,
+  15, 0, 0, 0, 4, 57, 0, 0, 0, 41,
+  5, 0, 60, 0, 19, 1, 4, 1, 52, 31,
+  4, 0, 58, 0, 51, 26, 21, 39, 0, 0,
+  0, 32, 0, 23, 0, 0, 55, 8, 0, 36,
+  1, 0, 0, 0, 14, 29, 63, 36, 0, 0,
+  0, 0, 46, 0, 12, 0, 4, 0, 35, 1,
+  40, 0, 0, 33, 0, 0, 0, 99, 0, 38,
+  55, 0, 74, 0, 47, 0, 0, 55, 43, 30,
+  27, 0, 3, 36, 0, 59, 80, 0, 0, 26,
+  36, 49, 32, 1, 0, 12, 51, 0, 22, 17,
+  3, 0, 0, 0, 0, 0, 0, 20, 0, 83,
+  20, 23, 0, 15, 0, 0, 26, 0, 67, 45,
+  0, 11, 23, 0, 0, 37, 22, 0, 0, 0,
+  0, 0, 14, 67, 0, 0, 0, 11, 0, 0,
+  67, 0, 16, 0, 7, 0, 80, 54, 0, 0,
+  42, 0, 37, 1, 24, 67, 6, 0, 0, 40,
+  0, 45, 0, 0, 77, 8, 0, 34, 3, 0,
+  0, 0, 25, 58, 103, 36, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 0, 21, 22, 80, 0,
+  38, 25, 8, 0, 0, 38, 33, 0, 0, 0,
+  27, 0, 63, 89, 0, 12, 0, 0, 14, 41,
+  49, 72, 30, 11, 0, 0, 0, 57, 37, 23,
+  43, 98, 0, 0, 23, 0, 9, 0, 0, 0,
+  0, 70, 0, 0, 14, 15, 16, 0, 0, 17,
+  24, 0, 0, 0, 12, 0, 48, 0, 0, 0,
+  0, 33, 0, 3, 10, 18, 0, 50, 0, 0,
+  81, 0, 15, 42, 0, 0, 7, 44, 23, 12,
+  4, 28, 0, 0, 63, 33, 2, 27, 31, 25,
+  2, 25, 25, 0, 0, 46, 0, 33, 0, 0,
+  0, 14, 0, 51, 3, 0, 8, 0, 41, 0,
+  0, 18, 2, 64, 10, 19, 0, 0, 55, 0,
+  0, 23, 45, 0, 7, 3, 63, 0, 0, 0,
+  78, 18, 0, 39, 39, 0, 0, 0, 25, 0,
+  78, 78, 0, 0, 0, 3, 0, 17, 3, 41,
+  11, 0, 0, 0, 16, 61, 36, 0, 50, 80,
+  0, 0, 9, 0, 0, 0, 0, 0, 16, 73,
+  0, 0, 40, 8, 4, 0, 0, 14, 31, 0,
+  0, 0, 18, 0, 26, 0, 2, 0, 24, 52,
+  0, 0, 0, 48, 0, 57, 2, 2, 88, 0,
+  14, 69, 0, 0, 2, 41, 6, 46, 1, 15,
+  0, 0, 48, 46, 0, 40, 32, 26, 15, 28,
+  27, 0, 0, 65, 0, 8, 0, 0, 0, 0,
+  0, 52, 25, 0, 0, 0, 32, 0, 0, 39,
+  0, 43, 11, 0, 0, 0, 70, 0, 0, 25,
+  54, 0, 0, 0, 11, 0, 0, 0, 64, 2,
+  0, 29, 0, 0, 0, 0, 15, 0, 80, 38,
+  0, 0, 0, 0, 0, 0, 0, 35, 26, 0,
+  14, 0, 0, 45, 31, 0, 42, 64, 0, 0,
+  16, 0, 0, 5, 0, 0, 32, 60, 1, 0,
+  52, 0, 0, 0, 0, 15, 40, 0, 0, 0,
+  0, 2, 11, 0, 19, 50, 26, 49, 0, 0,
+  6, 43, 3, 66, 19, 0, 76, 0, 18, 84,
+  0, 0, 2, 19, 0, 39, 0, 5, 14, 0,
+  39, 27, 3, 12, 27, 17, 21, 31, 23, 0,
+  0, 98, 2, 0, 0, 0, 0, 0, 39, 39,
+  30, 37, 0, 0, 15, 0, 0, 33, 0, 44,
+  1, 9, 0, 0, 55, 0, 0, 24, 71, 0,
+  0, 0, 0, 0, 0, 0, 42, 0, 30, 0,
+  21, 8, 18, 0, 0, 0, 23, 36, 0, 0,
+  0, 54, 7, 0, 0, 65, 15, 16, 55, 1,
+  62, 10, 0, 0, 52, 0, 0, 0, 14, 0,
+  0, 0, 0, 0, 9, 33, 0, 0, 29, 0,
+  0, 9, 0, 0, 15, 0, 0, 0, 30, 30,
+  0, 0, 29, 0, 20, 15, 0, 0, 0, 14,
+  64, 0, 89, 22, 8, 0, 0, 130, 0, 14,
+  8, 0, 2, 0, 14, 22, 0, 0, 24, 0,
+  8, 22, 41, 0, 39, 0, 26, 0, 0, 30,
+  15, 0, 0, 0, 0, 0, 23, 0, 15, 0,
+  0, 0, 0, 0, 0, 32, 0, 10, 0, 9,
+  0, 0, 99, 17, 35, 0, 24, 0, 6, 0,
+  0, 0, 0, 31, 25, 0, 5, 13, 0, 32,
+  19, 0, 8, 0, 42, 4, 0, 13, 0, 36,
+  0, 0, 0, 57, 0, 20, 78, 0, 62, 17,
+  0, 0, 48, 0, 0, 0, 23, 0, 0, 0,
+  0, 0, 0, 22, 0, 0, 41, 0, 0, 33,
+  9, 0, 6, 0, 0, 0, 32, 6, 0, 0,
+  33, 0, 37, 0, 4, 0, 0, 39, 62, 0,
+  84, 8, 32, 22, 0, 130, 0, 9, 16, 0,
+  0, 9, 33, 13, 0, 0, 29, 13, 0, 22,
+  32, 0, 33, 0, 24, 0, 0, 28, 10, 0,
+  0, 0, 8, 0, 32, 0, 10, 12, 0, 0,
+  0, 0, 0, 83, 0, 0, 2, 0, 0, 0,
+  98, 36, 46, 0, 18, 0, 8, 0, 0, 0,
+  0, 28, 8, 0, 11, 29, 0, 45, 2, 0,
+  17, 0, 59, 0, 0, 24, 0, 0, 0, 0,
+  0, 40, 1, 11, 70, 0, 8, 10, 0, 0,
+  32, 0, 0, 0, 26, 22, 0, 7, 0, 0,
+  17, 26, 2, 0, 47, 0, 0, 21, 13, 9,
+  8, 0, 0, 0, 39, 2, 0, 18, 67, 54,
+  46, 0, 21, 0, 0, 41, 60, 20, 72, 13,
+  27, 31, 0, 123, 0, 13, 17, 0, 0, 28,
+  28, 13, 17, 0, 23, 19, 0, 3, 26, 0,
+  27, 0, 23, 0, 0, 39, 0, 0, 0, 3,
+  33, 0, 52, 9, 4, 75, 0, 0, 0, 0,
+  0, 100, 0, 0, 2, 0, 0, 11, 51, 34,
+  23, 0, 31, 0, 14, 0, 0, 0, 3, 31,
+  7, 0, 19, 51, 0, 11, 63, 0, 36, 0,
+  33, 2, 0, 24, 2, 46, 28, 0, 6, 25,
+  11, 52, 60, 0, 0, 15, 21, 37, 39, 0,
+  0, 21, 42, 0, 0, 33, 0, 0, 0, 0,
+  0, 0, 0, 29, 0, 51, 23, 0, 7, 28,
+  0, 0, 51, 0, 37, 15, 0, 12, 5, 0,
+  0, 22, 16, 2, 15, 0, 0, 0, 4, 57,
+  0, 0, 0, 41, 5, 0, 60, 0, 19, 1,
+  4, 1, 52, 31, 4, 0, 58, 0, 51, 26,
+  21, 39, 0, 0, 0, 32, 0, 23, 0, 0,
+  55, 8, 0, 36, 1, 0, 0, 0, 14, 29,
+  63, 36, 0, 0, 0, 0, 46, 0, 12, 0,
+  4, 0, 35, 1, 40, 0, 0, 33, 0, 0,
+  0, 99, 0, 38, 55, 0, 74, 0, 47, 0,
+  0, 55, 43, 30, 27, 0, 3, 36, 0, 59,
+  80, 0, 0, 26, 36, 49, 32, 1, 0, 12,
+  51, 0, 22, 17, 3, 0, 0, 0, 0, 0,
+  0, 20, 0, 83, 20, 23, 0, 15, 0, 0,
+  26, 0, 67, 45, 0, 11, 23, 0, 0, 37,
+  22, 0, 0, 0, 0, 0, 14, 67, 0, 0,
+  0, 11, 0, 0, 67, 0, 16, 0, 7, 0,
+  80, 54, 0, 0, 42, 0, 37, 1, 24, 67,
+  6, 0, 0, 40, 0, 45, 0, 0, 77, 8,
+  0, 34, 3, 0, 0, 0, 25, 58, 103, 36,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 0,
+  21, 22, 80, 0, 38, 25, 8, 0, 0, 129,
+  0, 59, 30, 0, 80, 0, 63, 0, 2, 62,
+  41, 13, 24, 8, 0, 36, 0, 50, 73, 0,
+  0, 34, 40, 69, 39, 5, 0, 13, 44, 0,
+  63, 0, 17, 0, 0, 0, 0, 0, 0, 30,
+  0, 55, 31, 26, 0, 15, 0, 0, 34, 0,
+  63, 66, 0, 6, 53, 0, 0, 76, 13, 0,
+  0, 0, 0, 0, 32, 81, 0, 0, 0, 20,
+  0, 0, 48, 49, 0, 0, 0, 0, 65, 72,
+  1, 0, 21, 0, 34, 0, 17, 106, 73, 0,
+  0, 66, 0, 33, 16, 0, 73, 22, 0, 27,
+  0, 0, 0, 0, 17, 70, 123, 31, 8, 0,
+  18, 0, 19, 0, 0, 0, 0, 0, 16, 21,
+  113, 10, 49, 16, 11, 0, 0, 39, 39, 0,
+  0, 0, 25, 0, 78, 78, 0, 0, 0, 3,
+  0, 17, 3, 41, 11, 0, 0, 0, 16, 61,
+  36, 0, 50, 80, 0, 0, 9, 0, 0, 0,
+  0, 0, 16, 73, 0, 0, 40, 8, 4, 0,
+  0, 14, 31, 0, 0, 0, 18, 0, 26, 0,
+  2, 0, 24, 52, 0, 0, 0, 48, 0, 57,
+  2, 2, 88, 0, 14, 69, 0, 0, 2, 41,
+  6, 46, 1, 15, 0, 0, 48, 46, 0, 40,
+  32, 26, 15, 28, 27, 0, 0, 65, 0, 8,
+  0, 0, 0, 0, 0, 52, 25, 0, 0, 0,
+  32, 0, 0, 39, 0, 43, 11, 0, 0, 0,
+  70, 0, 0, 25, 54, 0, 0, 0, 11, 0,
+  0, 0, 64, 2, 0, 29, 0, 0, 0, 0,
+  15, 0, 80, 38, 0, 0, 0, 0, 0, 0,
+  0, 35, 26, 0, 14, 0, 0, 45, 31, 0,
+  42, 64, 0, 0, 16, 0, 0, 5, 0, 0,
+  32, 60, 1, 0, 52, 0, 0, 0, 0, 15,
+  40, 0, 0, 0, 0, 2, 11, 0, 19, 50,
+  26, 49, 0, 0, 6, 43, 3, 66, 19, 0,
+  76, 0, 18, 84, 0, 0, 2, 19, 0, 39,
+  0, 5, 14, 0, 39, 27, 3, 12, 27, 17,
+  21, 31, 23, 0, 0, 98, 2, 0, 0, 0,
+  0, 0, 39, 39, 30, 37, 0, 0, 15, 0,
+  0, 33, 0, 44, 1, 9, 0, 0, 55, 0,
+  0, 24, 71, 0, 0, 0, 0, 0, 0, 0,
+  42, 0, 0, 21, 0, 0, 2, 0, 15, 0,
+  74, 29, 0, 18, 0, 12, 0, 34, 16, 63,
+  31, 0, 0, 0, 0, 43, 15, 0, 18, 55,
+  0, 0, 44, 0, 0, 15, 0, 0, 19, 53,
+  0, 0, 37, 0, 0, 0, 0, 6, 28, 0,
+  0, 0, 0, 19, 26, 0, 3, 71, 33, 50,
+  0, 0, 10, 18, 0, 54, 2, 0, 62, 0,
+  20, 53, 0, 0, 0, 10, 0, 34, 0, 0,
+  19, 0, 50, 13, 6, 0, 30, 11, 7, 22,
+  34, 0, 0, 109, 0, 6, 0, 0, 0, 0,
+  36, 46, 17, 32, 7, 0, 17, 0, 0, 18,
+  0, 40, 0, 25, 0, 9, 51, 0, 0, 9,
+  68, 0, 0, 9, 34, 0, 14, 0, 50, 0,
+  5, 13, 0, 32, 19, 0, 8, 0, 42, 4,
+  0, 13, 0, 36, 0, 0, 0, 57, 0, 20,
+  78, 0, 62, 17, 0, 0, 48, 0, 0, 0,
+  23, 0, 0, 0, 0, 0, 0, 22, 0, 0,
+  41, 0, 0, 33, 9, 0, 6, 0, 0, 0,
+  32, 6, 0, 0, 33, 0, 37, 0, 4, 0,
+  0, 39, 62, 0, 84, 8, 32, 22, 0, 130,
+  0, 9, 16, 0, 0, 9, 33, 13, 0, 0,
+  29, 13, 0, 22, 32, 0, 33, 0, 24, 0,
+  0, 28, 10, 0, 0, 0, 8, 0, 32, 0,
+  10, 12, 0, 0, 0, 0, 0, 83, 0, 0,
+  2, 0, 0, 0, 98, 36, 46, 0, 18, 0,
+  8, 0, 0, 0, 0, 28, 8, 0, 11, 29,
+  0, 45, 2, 0, 17, 0, 59, 0, 0, 24,
+  0, 0, 0, 0, 0, 40, 1, 11, 70, 0,
+  8, 10, 0, 0, 32, 0, 0, 0, 26, 22,
+  0, 7, 0, 0, 17, 26, 2, 0, 47, 0,
+  0, 21, 13, 9, 8, 0, 0, 0, 39, 2,
+  0, 18, 67, 54, 46, 0, 21, 0, 0, 41,
+  60, 20, 72, 13, 27, 31, 0, 123, 0, 13,
+  17, 0, 0, 28, 28, 13, 17, 0, 23, 19,
+  0, 3, 26, 0, 27, 0, 23, 0, 0, 39,
+  0, 0, 0, 3, 33, 0, 52, 9, 4, 75,
+  0, 0, 0, 0, 0, 100, 0, 0, 2, 0,
+  0, 11, 51, 34, 23, 0, 31, 0, 14, 0,
+  0, 0, 3, 31, 7, 0, 11, 24, 0, 20,
+  0, 8, 0, 0, 72, 0, 0, 35, 0, 0,
+  0, 0, 0, 45, 6, 0, 35, 11, 0, 11,
+  0, 0, 13, 0, 0, 0, 2, 13, 0, 0,
+  0, 0, 29, 44, 34, 0, 50, 0, 0, 11,
+  0, 7, 0, 0, 0, 0, 8, 60, 0, 0,
+  108, 136, 34, 5, 37, 0, 0, 24, 71, 27,
+  134, 39, 0, 0, 0, 158, 66, 0, 9, 0,
+  0, 10, 0, 0, 39, 0, 9, 0, 13, 5,
+  9, 0, 4, 0, 70, 0, 0, 80, 0, 0,
+  27, 0, 26, 0, 39, 45, 33, 130, 0, 0,
+  0, 0, 0, 84, 0, 0, 0, 0, 0, 24,
+  23, 13, 0, 0, 36, 0, 0, 0, 0, 0,
+  23, 31, 12, 0, 0, 99, 0, 38, 55, 0,
+  74, 0, 47, 0, 0, 55, 43, 30, 27, 0,
+  3, 36, 0, 59, 80, 0, 0, 26, 36, 49,
+  32, 1, 0, 12, 51, 0, 22, 17, 3, 0,
+  0, 0, 0, 0, 0, 20, 0, 83, 20, 23,
+  0, 15, 0, 0, 26, 0, 67, 45, 0, 11,
+  23, 0, 0, 37, 22, 0, 0, 0, 0, 0,
+  14, 67, 0, 0, 0, 11, 0, 0, 67, 0,
+  16, 0, 7, 0, 80, 54, 0, 0, 42, 0,
+  37, 1, 24, 67, 6, 0, 0, 40, 0, 45,
+  0, 0, 77, 8, 0, 34, 3, 0, 0, 0,
+  25, 58, 103, 36, 0, 0, 0, 0, 32, 0,
+  0, 0, 0, 0, 21, 22, 80, 0, 38, 25,
+  8, 0, 0, 129, 0, 59, 30, 0, 80, 0,
+  63, 0, 2, 62, 41, 13, 24, 8, 0, 36,
+  0, 50, 73, 0, 0, 34, 40, 69, 39, 5,
+  0, 13, 44, 0, 63, 0, 17, 0, 0, 0,
+  0, 0, 0, 30, 0, 55, 31, 26, 0, 15,
+  0, 0, 34, 0, 63, 66, 0, 6, 53, 0,
+  0, 76, 13, 0, 0, 0, 0, 0, 32, 81,
+  0, 0, 0, 20, 0, 0, 48, 49, 0, 0,
+  0, 0, 65, 72, 1, 0, 21, 0, 34, 0,
+  17, 106, 73, 0, 0, 66, 0, 33, 16, 0,
+  73, 22, 0, 27, 0, 0, 0, 0, 17, 70,
+  123, 31, 8, 0, 18, 0, 19, 0, 0, 0,
+  0, 0, 16, 21, 113, 10, 49, 16, 11, 0,
+  4, 112, 0, 54, 23, 0, 15, 0, 85, 7,
+  0, 53, 5, 3, 0, 0, 0, 18, 0, 13,
+  49, 0, 0, 31, 10, 11, 45, 17, 0, 0,
+  0, 9, 32, 0, 23, 0, 0, 18, 0, 0,
+  0, 0, 0, 18, 25, 27, 0, 0, 0, 0,
+  33, 14, 7, 64, 44, 38, 45, 0, 0, 10,
+  0, 11, 7, 12, 0, 7, 17, 45, 0, 29,
+  0, 13, 26, 0, 1, 55, 0, 8, 5, 0,
+  20, 44, 16, 23, 0, 0, 15, 29, 38, 55,
+  93, 0, 0, 17, 0, 0, 52, 0, 35, 52,
+  0, 80, 0, 0, 0, 0, 0, 84, 112, 0,
+  31, 0, 15, 3, 1, 0, 0, 0, 0, 0,
+  3, 0, 28, 0, 45, 32, 0, 0, 0, 29,
+  0, 0, 0, 0, 15, 0, 80, 38, 0, 0,
+  0, 0, 0, 0, 0, 35, 26, 0, 14, 0,
+  0, 45, 31, 0, 42, 64, 0, 0, 16, 0,
+  0, 5, 0, 0, 32, 60, 1, 0, 52, 0,
+  0, 0, 0, 15, 40, 0, 0, 0, 0, 2,
+  11, 0, 19, 50, 26, 49, 0, 0, 6, 43,
+  3, 66, 19, 0, 76, 0, 18, 84, 0, 0,
+  2, 19, 0, 39, 0, 5, 14, 0, 39, 27,
+  3, 12, 27, 17, 21, 31, 23, 0, 0, 98,
+  2, 0, 0, 0, 0, 0, 39, 39, 30, 37,
+  0, 0, 15, 0, 0, 33, 0, 44, 1, 9,
+  0, 0, 55, 0, 0, 24, 71, 0, 0, 0,
+  0, 0, 0, 0, 42, 0, 0, 21, 0, 0,
+  2, 0, 15, 0, 74, 29, 0, 18, 0, 12,
+  0, 34, 16, 63, 31, 0, 0, 0, 0, 43,
+  15, 0, 18, 55, 0, 0, 44, 0, 0, 15,
+  0, 0, 19, 53, 0, 0, 37, 0, 0, 0,
+  0, 6, 28, 0, 0, 0, 0, 19, 26, 0,
+  3, 71, 33, 50, 0, 0, 10, 18, 0, 54,
+  2, 0, 62, 0, 20, 53, 0, 0, 0, 10,
+  0, 34, 0, 0, 19, 0, 50, 13, 6, 0,
+  30, 11, 7, 22, 34, 0, 0, 109, 0, 6,
+  0, 0, 0, 0, 36, 46, 17, 32, 7, 0,
+  17, 0, 0, 18, 0, 40, 0, 25, 0, 9,
+  51, 0, 0, 9, 68, 0, 0, 9, 34, 0,
+  14, 0, 50, 0, 0, 44, 0, 0, 11, 0,
+  30, 0, 44, 53, 0, 11, 18, 12, 0, 82,
+  51, 71, 16, 19, 0, 0, 0, 63, 28, 37,
+  0, 67, 2, 0, 45, 0, 33, 25, 0, 0,
+  0, 52, 0, 0, 18, 0, 13, 17, 0, 3,
+  20, 20, 0, 7, 2, 12, 49, 14, 0, 32,
+  19, 44, 0, 21, 12, 0, 0, 24, 0, 0,
+  80, 1, 40, 3, 0, 0, 8, 26, 18, 45,
+  0, 0, 0, 0, 87, 25, 0, 0, 27, 11,
+  0, 26, 28, 6, 18, 90, 0, 29, 0, 0,
+  0, 0, 0, 71, 9, 2, 14, 0, 37, 0,
+  0, 24, 1, 42, 0, 27, 0, 6, 32, 0,
+  0, 6, 43, 0, 9, 0, 103, 0, 43, 0,
+  51, 0, 11, 29, 0, 45, 2, 0, 17, 0,
+  59, 0, 0, 24, 0, 0, 0, 0, 0, 40,
+  1, 11, 70, 0, 8, 10, 0, 0, 32, 0,
+  0, 0, 26, 22, 0, 7, 0, 0, 17, 26,
+  2, 0, 47, 0, 0, 21, 13, 9, 8, 0,
+  0, 0, 39, 2, 0, 18, 67, 54, 46, 0,
+  21, 0, 0, 41, 60, 20, 72, 13, 27, 31,
+  0, 123, 0, 13, 17, 0, 0, 28, 28, 13,
+  17, 0, 23, 19, 0, 3, 26, 0, 27, 0,
+  23, 0, 0, 39, 0, 0, 0, 3, 33, 0,
+  52, 9, 4, 75, 0, 0, 0, 0, 0, 100,
+  0, 0, 2, 0, 0, 11, 51, 34, 23, 0,
+  31, 0, 14, 0, 0, 0, 3, 31, 7, 0,
+  11, 24, 0, 20, 0, 8, 0, 0, 72, 0,
+  0, 35, 0, 0, 0, 0, 0, 45, 6, 0,
+  35, 11, 0, 11, 0, 0, 13, 0, 0, 0,
+  2, 13, 0, 0, 0, 0, 29, 44, 34, 0,
+  50, 0, 0, 11, 0, 7, 0, 0, 0, 0,
+  8, 60, 0, 0, 108, 136, 34, 5, 37, 0,
+  0, 24, 71, 27, 134, 39, 0, 0, 0, 158,
+  66, 0, 9, 0, 0, 10, 0, 0, 39, 0,
+  9, 0, 13, 5, 9, 0, 4, 0, 70, 0,
+  0, 80, 0, 0, 27, 0, 26, 0, 39, 45,
+  33, 130, 0, 0, 0, 0, 0, 84, 0, 0,
+  0, 0, 0, 24, 23, 13, 0, 0, 36, 0,
+  0, 0, 0, 0, 23, 31, 12, 0, 0, 15,
+  0, 0, 0, 50, 0, 0, 53, 14, 0, 2,
+  0, 0, 0, 0, 0, 48, 12, 0, 0, 0,
+  0, 19, 0, 0, 0, 3, 0, 0, 3, 11,
+  0, 0, 0, 9, 43, 82, 35, 0, 70, 0,
+  5, 16, 0, 7, 7, 0, 0, 0, 0, 63,
+  0, 0, 57, 160, 47, 9, 35, 0, 0, 29,
+  57, 0, 153, 4, 0, 0, 0, 121, 122, 0,
+  14, 27, 0, 33, 0, 0, 46, 0, 6, 0,
+  5, 13, 16, 0, 0, 10, 64, 0, 0, 128,
+  0, 0, 35, 0, 0, 0, 10, 76, 58, 96,
+  0, 0, 0, 0, 0, 62, 0, 0, 0, 3,
+  0, 35, 0, 0, 0, 0, 53, 0, 0, 0,
+  0, 0, 18, 28, 29, 0, 0, 129, 0, 59,
+  30, 0, 80, 0, 63, 0, 2, 62, 41, 13,
+  24, 8, 0, 36, 0, 50, 73, 0, 0, 34,
+  40, 69, 39, 5, 0, 13, 44, 0, 63, 0,
+  17, 0, 0, 0, 0, 0, 0, 30, 0, 55,
+  31, 26, 0, 15, 0, 0, 34, 0, 63, 66,
+  0, 6, 53, 0, 0, 76, 13, 0, 0, 0,
+  0, 0, 32, 81, 0, 0, 0, 20, 0, 0,
+  48, 49, 0, 0, 0, 0, 65, 72, 1, 0,
+  21, 0, 34, 0, 17, 106, 73, 0, 0, 66,
+  0, 33, 16, 0, 73, 22, 0, 27, 0, 0,
+  0, 0, 17, 70, 123, 31, 8, 0, 18, 0,
+  19, 0, 0, 0, 0, 0, 16, 21, 113, 10,
+  49, 16, 11, 0, 4, 112, 0, 54, 23, 0,
+  15, 0, 85, 7, 0, 53, 5, 3, 0, 0,
+  0, 18, 0, 13, 49, 0, 0, 31, 10, 11,
+  45, 17, 0, 0, 0, 9, 32, 0, 23, 0,
+  0, 18, 0, 0, 0, 0, 0, 18, 25, 27,
+  0, 0, 0, 0, 33, 14, 7, 64, 44, 38,
+  45, 0, 0, 10, 0, 11, 7, 12, 0, 7,
+  17, 45, 0, 29, 0, 13, 26, 0, 1, 55,
+  0, 8, 5, 0, 20, 44, 16, 23, 0, 0,
+  15, 29, 38, 55, 93, 0, 0, 17, 0, 0,
+  52, 0, 35, 52, 0, 80, 0, 0, 0, 0,
+  0, 84, 112, 0, 31, 0, 15, 3, 1, 0,
+  0, 0, 0, 0, 3, 0, 28, 0, 45, 32,
+  0, 0, 29, 57, 0, 24, 0, 27, 0, 0,
+  42, 0, 0, 31, 0, 13, 0, 0, 0, 38,
+  15, 0, 3, 20, 0, 0, 0, 0, 2, 0,
+  0, 0, 0, 33, 0, 0, 0, 22, 12, 36,
+  5, 0, 22, 0, 25, 16, 5, 0, 6, 0,
+  0, 0, 0, 74, 0, 26, 125, 100, 30, 22,
+  18, 0, 0, 43, 75, 37, 102, 36, 0, 20,
+  0, 109, 123, 3, 27, 0, 0, 17, 0, 0,
+  34, 0, 0, 1, 35, 33, 3, 0, 0, 8,
+  62, 0, 21, 30, 0, 0, 38, 0, 43, 0,
+  9, 59, 0, 117, 0, 0, 0, 0, 0, 80,
+  21, 0, 14, 0, 0, 24, 0, 0, 0, 0,
+  10, 0, 0, 0, 0, 0, 32, 35, 0, 0,
+  0, 21, 0, 0, 2, 0, 15, 0, 74, 29,
+  0, 18, 0, 12, 0, 34, 16, 63, 31, 0,
+  0, 0, 0, 43, 15, 0, 18, 55, 0, 0,
+  44, 0, 0, 15, 0, 0, 19, 53, 0, 0,
+  37, 0, 0, 0, 0, 6, 28, 0, 0, 0,
+  0, 19, 26, 0, 3, 71, 33, 50, 0, 0,
+  10, 18, 0, 54, 2, 0, 62, 0, 20, 53,
+  0, 0, 0, 10, 0, 34, 0, 0, 19, 0,
+  50, 13, 6, 0, 30, 11, 7, 22, 34, 0,
+  0, 109, 0, 6, 0, 0, 0, 0, 36, 46,
+  17, 32, 7, 0, 17, 0, 0, 18, 0, 40,
+  0, 25, 0, 9, 51, 0, 0, 9, 68, 0,
+  0, 9, 34, 0, 14, 0, 50, 0, 0, 44,
+  0, 0, 11, 0, 30, 0, 44, 53, 0, 11,
+  18, 12, 0, 82, 51, 71, 16, 19, 0, 0,
+  0, 63, 28, 37, 0, 67, 2, 0, 45, 0,
+  33, 25, 0, 0, 0, 52, 0, 0, 18, 0,
+  13, 17, 0, 3, 20, 20, 0, 7, 2, 12,
+  49, 14, 0, 32, 19, 44, 0, 21, 12, 0,
+  0, 24, 0, 0, 80, 1, 40, 3, 0, 0,
+  8, 26, 18, 45, 0, 0, 0, 0, 87, 25,
+  0, 0, 27, 11, 0, 26, 28, 6, 18, 90,
+  0, 29, 0, 0, 0, 0, 0, 71, 9, 2,
+  14, 0, 37, 0, 0, 24, 1, 42, 0, 27,
+  0, 6, 32, 0, 0, 6, 43, 0, 9, 0,
+  103, 0, 43, 0, 51, 0, 0, 102, 14, 0,
+  4, 0, 39, 0, 27, 51, 8, 13, 23, 3,
+  26, 91, 67, 61, 21, 56, 0, 0, 0, 56,
+  53, 69, 6, 74, 0, 0, 14, 0, 81, 1,
+  0, 0, 0, 25, 0, 38, 0, 16, 42, 22,
+  1, 7, 22, 19, 0, 49, 2, 1, 68, 52,
+  0, 0, 0, 9, 0, 50, 0, 0, 0, 0,
+  0, 0, 91, 11, 34, 0, 0, 0, 15, 26,
+  42, 23, 0, 6, 0, 4, 107, 11, 0, 0,
+  11, 8, 10, 15, 30, 12, 42, 45, 0, 41,
+  0, 10, 0, 0, 0, 81, 0, 0, 14, 0,
+  46, 0, 23, 15, 32, 37, 0, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 30, 11, 149, 0,
+  76, 0, 46, 0, 11, 24, 0, 20, 0, 8,
+  0, 0, 72, 0, 0, 35, 0, 0, 0, 0,
+  0, 45, 6, 0, 35, 11, 0, 11, 0, 0,
+  13, 0, 0, 0, 2, 13, 0, 0, 0, 0,
+  29, 44, 34, 0, 50, 0, 0, 11, 0, 7,
+  0, 0, 0, 0, 8, 60, 0, 0, 108, 136,
+  34, 5, 37, 0, 0, 24, 71, 27, 134, 39,
+  0, 0, 0, 158, 66, 0, 9, 0, 0, 10,
+  0, 0, 39, 0, 9, 0, 13, 5, 9, 0,
+  4, 0, 70, 0, 0, 80, 0, 0, 27, 0,
+  26, 0, 39, 45, 33, 130, 0, 0, 0, 0,
+  0, 84, 0, 0, 0, 0, 0, 24, 23, 13,
+  0, 0, 36, 0, 0, 0, 0, 0, 23, 31,
+  12, 0, 0, 15, 0, 0, 0, 50, 0, 0,
+  53, 14, 0, 2, 0, 0, 0, 0, 0, 48,
+  12, 0, 0, 0, 0, 19, 0, 0, 0, 3,
+  0, 0, 3, 11, 0, 0, 0, 9, 43, 82,
+  35, 0, 70, 0, 5, 16, 0, 7, 7, 0,
+  0, 0, 0, 63, 0, 0, 57, 160, 47, 9,
+  35, 0, 0, 29, 57, 0, 153, 4, 0, 0,
+  0, 121, 122, 0, 14, 27, 0, 33, 0, 0,
+  46, 0, 6, 0, 5, 13, 16, 0, 0, 10,
+  64, 0, 0, 128, 0, 0, 35, 0, 0, 0,
+  10, 76, 58, 96, 0, 0, 0, 0, 0, 62,
+  0, 0, 0, 3, 0, 35, 0, 0, 0, 0,
+  53, 0, 0, 0, 0, 0, 18, 28, 29, 0,
+  0, 39, 0, 0, 0, 29, 0, 0, 78, 47,
+  0, 0, 30, 0, 0, 88, 39, 61, 6, 17,
+  0, 0, 0, 41, 0, 0, 7, 53, 6, 0,
+  17, 0, 36, 0, 0, 0, 35, 96, 0, 0,
+  48, 0, 9, 30, 0, 28, 42, 19, 0, 0,
+  0, 32, 2, 0, 4, 101, 46, 8, 0, 0,
+  0, 0, 0, 0, 66, 0, 6, 4, 24, 53,
+  52, 0, 17, 37, 0, 49, 0, 0, 5, 0,
+  39, 0, 0, 0, 0, 1, 0, 30, 51, 0,
+  0, 131, 0, 0, 11, 0, 0, 0, 0, 86,
+  87, 31, 0, 0, 0, 0, 0, 48, 0, 13,
+  0, 11, 0, 8, 2, 0, 0, 2, 51, 0,
+  25, 0, 41, 0, 28, 12, 43, 0, 4, 112,
+  0, 54, 23, 0, 15, 0, 85, 7, 0, 53,
+  5, 3, 0, 0, 0, 18, 0, 13, 49, 0,
+  0, 31, 10, 11, 45, 17, 0, 0, 0, 9,
+  32, 0, 23, 0, 0, 18, 0, 0, 0, 0,
+  0, 18, 25, 27, 0, 0, 0, 0, 33, 14,
+  7, 64, 44, 38, 45, 0, 0, 10, 0, 11,
+  7, 12, 0, 7, 17, 45, 0, 29, 0, 13,
+  26, 0, 1, 55, 0, 8, 5, 0, 20, 44,
+  16, 23, 0, 0, 15, 29, 38, 55, 93, 0,
+  0, 17, 0, 0, 52, 0, 35, 52, 0, 80,
+  0, 0, 0, 0, 0, 84, 112, 0, 31, 0,
+  15, 3, 1, 0, 0, 0, 0, 0, 3, 0,
+  28, 0, 45, 32, 0, 0, 29, 57, 0, 24,
+  0, 27, 0, 0, 42, 0, 0, 31, 0, 13,
+  0, 0, 0, 38, 15, 0, 3, 20, 0, 0,
+  0, 0, 2, 0, 0, 0, 0, 33, 0, 0,
+  0, 22, 12, 36, 5, 0, 22, 0, 25, 16,
+  5, 0, 6, 0, 0, 0, 0, 74, 0, 26,
+  125, 100, 30, 22, 18, 0, 0, 43, 75, 37,
+  102, 36, 0, 20, 0, 109, 123, 3, 27, 0,
+  0, 17, 0, 0, 34, 0, 0, 1, 35, 33,
+  3, 0, 0, 8, 62, 0, 21, 30, 0, 0,
+  38, 0, 43, 0, 9, 59, 0, 117, 0, 0,
+  0, 0, 0, 80, 21, 0, 14, 0, 0, 24,
+  0, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  32, 35, 0, 0, 10, 25, 0, 0, 0, 85,
+  0, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+  0, 39, 3, 8, 0, 40, 0, 0, 0, 0,
+  8, 3, 0, 0, 0, 38, 0, 0, 0, 43,
+  47, 68, 23, 0, 46, 0, 22, 15, 0, 13,
+  59, 13, 0, 0, 0, 55, 0, 0, 112, 118,
+  34, 26, 48, 0, 0, 57, 67, 0, 179, 5,
+  0, 32, 0, 139, 175, 0, 10, 15, 0, 0,
+  0, 0, 42, 0, 0, 0, 28, 19, 31, 0,
+  0, 11, 42, 0, 0, 116, 13, 0, 34, 0,
+  0, 0, 6, 54, 43, 142, 0, 0, 0, 0,
+  0, 58, 0, 0, 0, 29, 0, 30, 0, 10,
+  0, 0, 53, 0, 0, 0, 0, 0, 1, 29,
+  1, 6, 0, 44, 0, 0, 11, 0, 30, 0,
+  44, 53, 0, 11, 18, 12, 0, 82, 51, 71,
+  16, 19, 0, 0, 0, 63, 28, 37, 0, 67,
+  2, 0, 45, 0, 33, 25, 0, 0, 0, 52,
+  0, 0, 18, 0, 13, 17, 0, 3, 20, 20,
+  0, 7, 2, 12, 49, 14, 0, 32, 19, 44,
+  0, 21, 12, 0, 0, 24, 0, 0, 80, 1,
+  40, 3, 0, 0, 8, 26, 18, 45, 0, 0,
+  0, 0, 87, 25, 0, 0, 27, 11, 0, 26,
+  28, 6, 18, 90, 0, 29, 0, 0, 0, 0,
+  0, 71, 9, 2, 14, 0, 37, 0, 0, 24,
+  1, 42, 0, 27, 0, 6, 32, 0, 0, 6,
+  43, 0, 9, 0, 103, 0, 43, 0, 51, 0,
+  0, 102, 14, 0, 4, 0, 39, 0, 27, 51,
+  8, 13, 23, 3, 26, 91, 67, 61, 21, 56,
+  0, 0, 0, 56, 53, 69, 6, 74, 0, 0,
+  14, 0, 81, 1, 0, 0, 0, 25, 0, 38,
+  0, 16, 42, 22, 1, 7, 22, 19, 0, 49,
+  2, 1, 68, 52, 0, 0, 0, 9, 0, 50,
+  0, 0, 0, 0, 0, 0, 91, 11, 34, 0,
+  0, 0, 15, 26, 42, 23, 0, 6, 0, 4,
+  107, 11, 0, 0, 11, 8, 10, 15, 30, 12,
+  42, 45, 0, 41, 0, 10, 0, 0, 0, 81,
+  0, 0, 14, 0, 46, 0, 23, 15, 32, 37,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  30, 11, 149, 0, 76, 0, 46, 0, 0, 131,
+  52, 5, 17, 0, 45, 0, 11, 44, 5, 23,
+  60, 0, 17, 55, 55, 49, 15, 72, 0, 0,
+  12, 32, 54, 53, 11, 54, 0, 20, 0, 0,
+  76, 0, 17, 0, 0, 0, 0, 41, 0, 25,
+  68, 41, 28, 22, 40, 0, 0, 52, 0, 3,
+  85, 24, 0, 0, 0, 0, 0, 44, 4, 0,
+  0, 5, 0, 0, 29, 13, 13, 0, 0, 0,
+  8, 16, 74, 5, 15, 32, 0, 0, 97, 0,
+  0, 0, 14, 0, 30, 16, 22, 9, 0, 0,
+  0, 20, 0, 26, 0, 0, 0, 38, 5, 16,
+  9, 0, 39, 0, 48, 8, 25, 53, 0, 0,
+  0, 5, 0, 0, 0, 24, 33, 0, 34, 5,
+  77, 0, 62, 0, 29, 0, 0, 15, 0, 0,
+  0, 50, 0, 0, 53, 14, 0, 2, 0, 0,
+  0, 0, 0, 48, 12, 0, 0, 0, 0, 19,
+  0, 0, 0, 3, 0, 0, 3, 11, 0, 0,
+  0, 9, 43, 82, 35, 0, 70, 0, 5, 16,
+  0, 7, 7, 0, 0, 0, 0, 63, 0, 0,
+  57, 160, 47, 9, 35, 0, 0, 29, 57, 0,
+  153, 4, 0, 0, 0, 121, 122, 0, 14, 27,
+  0, 33, 0, 0, 46, 0, 6, 0, 5, 13,
+  16, 0, 0, 10, 64, 0, 0, 128, 0, 0,
+  35, 0, 0, 0, 10, 76, 58, 96, 0, 0,
+  0, 0, 0, 62, 0, 0, 0, 3, 0, 35,
+  0, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+  18, 28, 29, 0, 0, 39, 0, 0, 0, 29,
+  0, 0, 78, 47, 0, 0, 30, 0, 0, 88,
+  39, 61, 6, 17, 0, 0, 0, 41, 0, 0,
+  7, 53, 6, 0, 17, 0, 36, 0, 0, 0,
+  35, 96, 0, 0, 48, 0, 9, 30, 0, 28,
+  42, 19, 0, 0, 0, 32, 2, 0, 4, 101,
+  46, 8, 0, 0, 0, 0, 0, 0, 66, 0,
+  6, 4, 24, 53, 52, 0, 17, 37, 0, 49,
+  0, 0, 5, 0, 39, 0, 0, 0, 0, 1,
+  0, 30, 51, 0, 0, 131, 0, 0, 11, 0,
+  0, 0, 0, 86, 87, 31, 0, 0, 0, 0,
+  0, 48, 0, 13, 0, 11, 0, 8, 2, 0,
+  0, 2, 51, 0, 25, 0, 41, 0, 28, 12,
+  43, 0, 0, 93, 41, 0, 7, 0, 52, 3,
+  86, 40, 12, 0, 76, 3, 0, 125, 70, 39,
+  2, 33, 0, 0, 0, 54, 36, 13, 16, 61,
+  3, 0, 21, 0, 90, 1, 0, 0, 0, 58,
+  0, 29, 9, 0, 26, 52, 0, 59, 72, 36,
+  0, 44, 0, 0, 84, 12, 0, 0, 22, 0,
+  0, 42, 0, 0, 0, 0, 0, 0, 47, 0,
+  62, 0, 0, 0, 2, 50, 38, 28, 0, 0,
+  0, 0, 77, 11, 8, 0, 0, 21, 0, 22,
+  43, 0, 0, 57, 0, 32, 0, 0, 0, 0,
+  0, 79, 66, 0, 0, 0, 15, 0, 10, 29,
+  0, 69, 0, 1, 0, 0, 0, 0, 0, 36,
+  65, 0, 62, 0, 139, 0, 57, 16, 25, 0,
+  29, 57, 0, 24, 0, 27, 0, 0, 42, 0,
+  0, 31, 0, 13, 0, 0, 0, 38, 15, 0,
+  3, 20, 0, 0, 0, 0, 2, 0, 0, 0,
+  0, 33, 0, 0, 0, 22, 12, 36, 5, 0,
+  22, 0, 25, 16, 5, 0, 6, 0, 0, 0,
+  0, 74, 0, 26, 125, 100, 30, 22, 18, 0,
+  0, 43, 75, 37, 102, 36, 0, 20, 0, 109,
+  123, 3, 27, 0, 0, 17, 0, 0, 34, 0,
+  0, 1, 35, 33, 3, 0, 0, 8, 62, 0,
+  21, 30, 0, 0, 38, 0, 43, 0, 9, 59,
+  0, 117, 0, 0, 0, 0, 0, 80, 21, 0,
+  14, 0, 0, 24, 0, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 32, 35, 0, 0, 10, 25,
+  0, 0, 0, 85, 0, 0, 22, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 3, 8, 0, 40,
+  0, 0, 0, 0, 8, 3, 0, 0, 0, 38,
+  0, 0, 0, 43, 47, 68, 23, 0, 46, 0,
+  22, 15, 0, 13, 59, 13, 0, 0, 0, 55,
+  0, 0, 112, 118, 34, 26, 48, 0, 0, 57,
+  67, 0, 179, 5, 0, 32, 0, 139, 175, 0,
+  10, 15, 0, 0, 0, 0, 42, 0, 0, 0,
+  28, 19, 31, 0, 0, 11, 42, 0, 0, 116,
+  13, 0, 34, 0, 0, 0, 6, 54, 43, 142,
+  0, 0, 0, 0, 0, 58, 0, 0, 0, 29,
+  0, 30, 0, 10, 0, 0, 53, 0, 0, 0,
+  0, 0, 1, 29, 1, 6, 0, 37, 0, 0,
+  0, 81, 0, 0, 83, 32, 0, 0, 0, 9,
+  0, 42, 6, 26, 0, 10, 0, 0, 0, 25,
+  0, 0, 22, 40, 7, 0, 0, 0, 67, 0,
+  0, 20, 33, 86, 0, 0, 32, 0, 0, 10,
+  0, 67, 54, 81, 0, 26, 0, 6, 0, 0,
+  25, 36, 58, 0, 32, 0, 0, 65, 0, 0,
+  102, 0, 0, 34, 25, 57, 85, 0, 33, 59,
+  0, 79, 0, 0, 3, 0, 3, 0, 2, 0,
+  0, 0, 0, 49, 15, 0, 0, 173, 0, 0,
+  0, 0, 0, 0, 0, 64, 113, 110, 0, 0,
+  0, 0, 0, 29, 0, 22, 0, 30, 0, 19,
+  0, 0, 0, 29, 61, 0, 40, 0, 0, 0,
+  0, 15, 1, 35, 0, 102, 14, 0, 4, 0,
+  39, 0, 27, 51, 8, 13, 23, 3, 26, 91,
+  67, 61, 21, 56, 0, 0, 0, 56, 53, 69,
+  6, 74, 0, 0, 14, 0, 81, 1, 0, 0,
+  0, 25, 0, 38, 0, 16, 42, 22, 1, 7,
+  22, 19, 0, 49, 2, 1, 68, 52, 0, 0,
+  0, 9, 0, 50, 0, 0, 0, 0, 0, 0,
+  91, 11, 34, 0, 0, 0, 15, 26, 42, 23,
+  0, 6, 0, 4, 107, 11, 0, 0, 11, 8,
+  10, 15, 30, 12, 42, 45, 0, 41, 0, 10,
+  0, 0, 0, 81, 0, 0, 14, 0, 46, 0,
+  23, 15, 32, 37, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 30, 11, 149, 0, 76, 0,
+  46, 0, 0, 131, 52, 5, 17, 0, 45, 0,
+  11, 44, 5, 23, 60, 0, 17, 55, 55, 49,
+  15, 72, 0, 0, 12, 32, 54, 53, 11, 54,
+  0, 20, 0, 0, 76, 0, 17, 0, 0, 0,
+  0, 41, 0, 25, 68, 41, 28, 22, 40, 0,
+  0, 52, 0, 3, 85, 24, 0, 0, 0, 0,
+  0, 44, 4, 0, 0, 5, 0, 0, 29, 13,
+  13, 0, 0, 0, 8, 16, 74, 5, 15, 32,
+  0, 0, 97, 0, 0, 0, 14, 0, 30, 16,
+  22, 9, 0, 0, 0, 20, 0, 26, 0, 0,
+  0, 38, 5, 16, 9, 0, 39, 0, 48, 8,
+  25, 53, 0, 0, 0, 5, 0, 0, 0, 24,
+  33, 0, 34, 5, 77, 0, 62, 0, 29, 0,
+  0, 75, 0, 0, 5, 14, 48, 1, 0, 0,
+  0, 56, 51, 0, 0, 4, 32, 10, 13, 41,
+  0, 10, 71, 13, 29, 0, 10, 14, 0, 17,
+  0, 0, 42, 0, 5, 27, 0, 0, 9, 20,
+  0, 26, 0, 66, 11, 74, 35, 26, 0, 2,
+  0, 16, 68, 0, 0, 0, 30, 0, 1, 5,
+  28, 45, 0, 49, 0, 0, 0, 37, 29, 0,
+  51, 0, 22, 9, 83, 12, 47, 23, 0, 0,
+  69, 0, 4, 0, 38, 0, 23, 2, 0, 0,
+  0, 0, 0, 6, 0, 38, 0, 0, 22, 49,
+  15, 29, 19, 13, 22, 0, 31, 11, 0, 28,
+  0, 0, 0, 0, 0, 0, 0, 19, 71, 6,
+  22, 4, 0, 0, 22, 0, 10, 0, 0, 39,
+  0, 0, 0, 29, 0, 0, 78, 47, 0, 0,
+  30, 0, 0, 88, 39, 61, 6, 17, 0, 0,
+  0, 41, 0, 0, 7, 53, 6, 0, 17, 0,
+  36, 0, 0, 0, 35, 96, 0, 0, 48, 0,
+  9, 30, 0, 28, 42, 19, 0, 0, 0, 32,
+  2, 0, 4, 101, 46, 8, 0, 0, 0, 0,
+  0, 0, 66, 0, 6, 4, 24, 53, 52, 0,
+  17, 37, 0, 49, 0, 0, 5, 0, 39, 0,
+  0, 0, 0, 1, 0, 30, 51, 0, 0, 131,
+  0, 0, 11, 0, 0, 0, 0, 86, 87, 31,
+  0, 0, 0, 0, 0, 48, 0, 13, 0, 11,
+  0, 8, 2, 0, 0, 2, 51, 0, 25, 0,
+  41, 0, 28, 12, 43, 0, 0, 93, 41, 0,
+  7, 0, 52, 3, 86, 40, 12, 0, 76, 3,
+  0, 125, 70, 39, 2, 33, 0, 0, 0, 54,
+  36, 13, 16, 61, 3, 0, 21, 0, 90, 1,
+  0, 0, 0, 58, 0, 29, 9, 0, 26, 52,
+  0, 59, 72, 36, 0, 44, 0, 0, 84, 12,
+  0, 0, 22, 0, 0, 42, 0, 0, 0, 0,
+  0, 0, 47, 0, 62, 0, 0, 0, 2, 50,
+  38, 28, 0, 0, 0, 0, 77, 11, 8, 0,
+  0, 21, 0, 22, 43, 0, 0, 57, 0, 32,
+  0, 0, 0, 0, 0, 79, 66, 0, 0, 0,
+  15, 0, 10, 29, 0, 69, 0, 1, 0, 0,
+  0, 0, 0, 36, 65, 0, 62, 0, 139, 0,
+  57, 16, 25, 0, 0, 58, 49, 0, 14, 0,
+  50, 16, 63, 8, 3, 26, 61, 1, 7, 53,
+  52, 0, 0, 15, 0, 27, 43, 19, 23, 0,
+  0, 13, 0, 0, 0, 0, 41, 0, 0, 6,
+  0, 16, 0, 79, 0, 24, 0, 55, 1, 70,
+  61, 46, 0, 21, 0, 20, 72, 1, 0, 0,
+  29, 0, 0, 0, 15, 36, 0, 43, 0, 14,
+  0, 0, 79, 0, 0, 0, 7, 27, 66, 15,
+  34, 28, 0, 0, 79, 0, 29, 0, 25, 0,
+  16, 0, 0, 0, 0, 0, 0, 17, 0, 26,
+  0, 0, 5, 71, 31, 0, 0, 0, 26, 0,
+  28, 0, 0, 38, 0, 0, 0, 2, 0, 0,
+  2, 14, 69, 0, 27, 0, 63, 0, 43, 7,
+  17, 0, 10, 25, 0, 0, 0, 85, 0, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+  3, 8, 0, 40, 0, 0, 0, 0, 8, 3,
+  0, 0, 0, 38, 0, 0, 0, 43, 47, 68,
+  23, 0, 46, 0, 22, 15, 0, 13, 59, 13,
+  0, 0, 0, 55, 0, 0, 112, 118, 34, 26,
+  48, 0, 0, 57, 67, 0, 179, 5, 0, 32,
+  0, 139, 175, 0, 10, 15, 0, 0, 0, 0,
+  42, 0, 0, 0, 28, 19, 31, 0, 0, 11,
+  42, 0, 0, 116, 13, 0, 34, 0, 0, 0,
+  6, 54, 43, 142, 0, 0, 0, 0, 0, 58,
+  0, 0, 0, 29, 0, 30, 0, 10, 0, 0,
+  53, 0, 0, 0, 0, 0, 1, 29, 1, 6,
+  0, 37, 0, 0, 0, 81, 0, 0, 83, 32,
+  0, 0, 0, 9, 0, 42, 6, 26, 0, 10,
+  0, 0, 0, 25, 0, 0, 22, 40, 7, 0,
+  0, 0, 67, 0, 0, 20, 33, 86, 0, 0,
+  32, 0, 0, 10, 0, 67, 54, 81, 0, 26,
+  0, 6, 0, 0, 25, 36, 58, 0, 32, 0,
+  0, 65, 0, 0, 102, 0, 0, 34, 25, 57,
+  85, 0, 33, 59, 0, 79, 0, 0, 3, 0,
+  3, 0, 2, 0, 0, 0, 0, 49, 15, 0,
+  0, 173, 0, 0, 0, 0, 0, 0, 0, 64,
+  113, 110, 0, 0, 0, 0, 0, 29, 0, 22,
+  0, 30, 0, 19, 0, 0, 0, 29, 61, 0,
+  40, 0, 0, 0, 0, 15, 1, 35, 0, 34,
+  21, 0, 0, 0, 48, 33, 91, 15, 14, 16,
+  57, 1, 0, 81, 49, 0, 0, 0, 6, 20,
+  26, 30, 1, 0, 0, 23, 0, 0, 0, 0,
+  60, 0, 3, 0, 0, 56, 0, 42, 4, 5,
+  0, 43, 0, 101, 57, 64, 0, 36, 0, 14,
+  67, 0, 0, 0, 60, 0, 18, 0, 6, 36,
+  0, 46, 0, 0, 0, 0, 80, 0, 0, 0,
+  27, 50, 26, 48, 16, 11, 0, 0, 59, 0,
+  25, 0, 0, 9, 9, 3, 5, 0, 0, 63,
+  0, 14, 0, 0, 0, 0, 4, 79, 88, 0,
+  0, 0, 17, 0, 30, 2, 0, 51, 0, 7,
+  0, 20, 0, 0, 0, 31, 77, 0, 50, 0,
+  85, 0, 42, 0, 14, 0, 0, 131, 52, 5,
+  17, 0, 45, 0, 11, 44, 5, 23, 60, 0,
+  17, 55, 55, 49, 15, 72, 0, 0, 12, 32,
+  54, 53, 11, 54, 0, 20, 0, 0, 76, 0,
+  17, 0, 0, 0, 0, 41, 0, 25, 68, 41,
+  28, 22, 40, 0, 0, 52, 0, 3, 85, 24,
+  0, 0, 0, 0, 0, 44, 4, 0, 0, 5,
+  0, 0, 29, 13, 13, 0, 0, 0, 8, 16,
+  74, 5, 15, 32, 0, 0, 97, 0, 0, 0,
+  14, 0, 30, 16, 22, 9, 0, 0, 0, 20,
+  0, 26, 0, 0, 0, 38, 5, 16, 9, 0,
+  39, 0, 48, 8, 25, 53, 0, 0, 0, 5,
+  0, 0, 0, 24, 33, 0, 34, 5, 77, 0,
+  62, 0, 29, 0, 0, 75, 0, 0, 5, 14,
+  48, 1, 0, 0, 0, 56, 51, 0, 0, 4,
+  32, 10, 13, 41, 0, 10, 71, 13, 29, 0,
+  10, 14, 0, 17, 0, 0, 42, 0, 5, 27,
+  0, 0, 9, 20, 0, 26, 0, 66, 11, 74,
+  35, 26, 0, 2, 0, 16, 68, 0, 0, 0,
+  30, 0, 1, 5, 28, 45, 0, 49, 0, 0,
+  0, 37, 29, 0, 51, 0, 22, 9, 83, 12,
+  47, 23, 0, 0, 69, 0, 4, 0, 38, 0,
+  23, 2, 0, 0, 0, 0, 0, 6, 0, 38,
+  0, 0, 22, 49, 15, 29, 19, 13, 22, 0,
+  31, 11, 0, 28, 0, 0, 0, 0, 0, 0,
+  0, 19, 71, 6, 22, 4, 0, 0, 22, 0,
+  10, 0, 7, 18, 0, 16, 0, 21, 57, 17,
+  0, 0, 0, 41, 57, 2, 0, 6, 60, 44,
+  5, 5, 45, 0, 15, 0, 37, 0, 27, 0,
+  0, 35, 0, 0, 85, 0, 0, 0, 0, 5,
+  0, 0, 0, 23, 0, 64, 4, 113, 25, 79,
+  0, 0, 0, 41, 66, 0, 0, 22, 11, 0,
+  0, 0, 15, 0, 0, 2, 0, 0, 0, 36,
+  38, 0, 60, 0, 2, 0, 50, 0, 47, 0,
+  0, 0, 62, 0, 47, 0, 7, 0, 20, 0,
+  0, 8, 0, 4, 0, 8, 0, 7, 0, 0,
+  51, 44, 26, 26, 0, 37, 18, 0, 29, 6,
+  9, 13, 0, 18, 0, 17, 0, 0, 6, 0,
+  36, 0, 37, 0, 37, 0, 0, 0, 38, 0,
+  0, 93, 41, 0, 7, 0, 52, 3, 86, 40,
+  12, 0, 76, 3, 0, 125, 70, 39, 2, 33,
+  0, 0, 0, 54, 36, 13, 16, 61, 3, 0,
+  21, 0, 90, 1, 0, 0, 0, 58, 0, 29,
+  9, 0, 26, 52, 0, 59, 72, 36, 0, 44,
+  0, 0, 84, 12, 0, 0, 22, 0, 0, 42,
+  0, 0, 0, 0, 0, 0, 47, 0, 62, 0,
+  0, 0, 2, 50, 38, 28, 0, 0, 0, 0,
+  77, 11, 8, 0, 0, 21, 0, 22, 43, 0,
+  0, 57, 0, 32, 0, 0, 0, 0, 0, 79,
+  66, 0, 0, 0, 15, 0, 10, 29, 0, 69,
+  0, 1, 0, 0, 0, 0, 0, 36, 65, 0,
+  62, 0, 139, 0, 57, 16, 25, 0, 0, 58,
+  49, 0, 14, 0, 50, 16, 63, 8, 3, 26,
+  61, 1, 7, 53, 52, 0, 0, 15, 0, 27,
+  43, 19, 23, 0, 0, 13, 0, 0, 0, 0,
+  41, 0, 0, 6, 0, 16, 0, 79, 0, 24,
+  0, 55, 1, 70, 61, 46, 0, 21, 0, 20,
+  72, 1, 0, 0, 29, 0, 0, 0, 15, 36,
+  0, 43, 0, 14, 0, 0, 79, 0, 0, 0,
+  7, 27, 66, 15, 34, 28, 0, 0, 79, 0,
+  29, 0, 25, 0, 16, 0, 0, 0, 0, 0,
+  0, 17, 0, 26, 0, 0, 5, 71, 31, 0,
+  0, 0, 26, 0, 28, 0, 0, 38, 0, 0,
+  0, 2, 0, 0, 2, 14, 69, 0, 27, 0,
+  63, 0, 43, 7, 17, 0, 0, 6, 0, 0,
+  0, 1, 30, 12, 26, 0, 0, 25, 43, 0,
+  8, 23, 56, 23, 0, 0, 32, 29, 18, 2,
+  25, 0, 0, 0, 0, 0, 0, 0, 36, 17,
+  0, 0, 0, 0, 0, 34, 0, 11, 0, 58,
+  21, 87, 29, 59, 0, 1, 0, 52, 63, 0,
+  3, 0, 12, 0, 0, 0, 25, 4, 0, 38,
+  0, 10, 4, 0, 42, 0, 34, 0, 0, 17,
+  34, 0, 45, 41, 0, 0, 77, 0, 55, 0,
+  5, 0, 14, 0, 0, 0, 0, 31, 0, 0,
+  0, 22, 0, 0, 32, 57, 30, 0, 0, 9,
+  8, 0, 15, 0, 0, 13, 0, 14, 0, 2,
+  0, 0, 29, 0, 33, 0, 14, 0, 33, 0,
+  13, 6, 20, 0, 0, 37, 0, 0, 0, 81,
+  0, 0, 83, 32, 0, 0, 0, 9, 0, 42,
+  6, 26, 0, 10, 0, 0, 0, 25, 0, 0,
+  22, 40, 7, 0, 0, 0, 67, 0, 0, 20,
+  33, 86, 0, 0, 32, 0, 0, 10, 0, 67,
+  54, 81, 0, 26, 0, 6, 0, 0, 25, 36,
+  58, 0, 32, 0, 0, 65, 0, 0, 102, 0,
+  0, 34, 25, 57, 85, 0, 33, 59, 0, 79,
+  0, 0, 3, 0, 3, 0, 2, 0, 0, 0,
+  0, 49, 15, 0, 0, 173, 0, 0, 0, 0,
+  0, 0, 0, 64, 113, 110, 0, 0, 0, 0,
+  0, 29, 0, 22, 0, 30, 0, 19, 0, 0,
+  0, 29, 61, 0, 40, 0, 0, 0, 0, 15,
+  1, 35, 0, 34, 21, 0, 0, 0, 48, 33,
+  91, 15, 14, 16, 57, 1, 0, 81, 49, 0,
+  0, 0, 6, 20, 26, 30, 1, 0, 0, 23,
+  0, 0, 0, 0, 60, 0, 3, 0, 0, 56,
+  0, 42, 4, 5, 0, 43, 0, 101, 57, 64,
+  0, 36, 0, 14, 67, 0, 0, 0, 60, 0,
+  18, 0, 6, 36, 0, 46, 0, 0, 0, 0,
+  80, 0, 0, 0, 27, 50, 26, 48, 16, 11,
+  0, 0, 59, 0, 25, 0, 0, 9, 9, 3,
+  5, 0, 0, 63, 0, 14, 0, 0, 0, 0,
+  4, 79, 88, 0, 0, 0, 17, 0, 30, 2,
+  0, 51, 0, 7, 0, 20, 0, 0, 0, 31,
+  77, 0, 50, 0, 85, 0, 42, 0, 14, 0,
+  0, 27, 0, 6, 0, 0, 33, 17, 40, 0,
+  12, 29, 62, 0, 14, 33, 65, 28, 0, 0,
+  26, 32, 26, 12, 42, 0, 0, 27, 0, 0,
+  0, 0, 69, 0, 0, 0, 0, 14, 0, 40,
+  0, 14, 0, 40, 23, 88, 0, 29, 0, 18,
+  0, 24, 66, 1, 4, 0, 0, 0, 0, 0,
+  30, 14, 0, 50, 0, 7, 42, 0, 37, 0,
+  0, 0, 0, 48, 16, 0, 58, 78, 0, 0,
+  60, 0, 43, 4, 0, 14, 12, 0, 0, 2,
+  0, 24, 0, 6, 0, 25, 4, 0, 5, 84,
+  38, 0, 0, 3, 48, 0, 12, 5, 0, 1,
+  0, 12, 0, 2, 0, 0, 15, 0, 12, 0,
+  16, 0, 60, 0, 26, 0, 25, 0, 0, 75,
+  0, 0, 5, 14, 48, 1, 0, 0, 0, 56,
+  51, 0, 0, 4, 32, 10, 13, 41, 0, 10,
+  71, 13, 29, 0, 10, 14, 0, 17, 0, 0,
+  42, 0, 5, 27, 0, 0, 9, 20, 0, 26,
+  0, 66, 11, 74, 35, 26, 0, 2, 0, 16,
+  68, 0, 0, 0, 30, 0, 1, 5, 28, 45,
+  0, 49, 0, 0, 0, 37, 29, 0, 51, 0,
+  22, 9, 83, 12, 47, 23, 0, 0, 69, 0,
+  4, 0, 38, 0, 23, 2, 0, 0, 0, 0,
+  0, 6, 0, 38, 0, 0, 22, 49, 15, 29,
+  19, 13, 22, 0, 31, 11, 0, 28, 0, 0,
+  0, 0, 0, 0, 0, 19, 71, 6, 22, 4,
+  0, 0, 22, 0, 10, 0, 7, 18, 0, 16,
+  0, 21, 57, 17, 0, 0, 0, 41, 57, 2,
+  0, 6, 60, 44, 5, 5, 45, 0, 15, 0,
+  37, 0, 27, 0, 0, 35, 0, 0, 85, 0,
+  0, 0, 0, 5, 0, 0, 0, 23, 0, 64,
+  4, 113, 25, 79, 0, 0, 0, 41, 66, 0,
+  0, 22, 11, 0, 0, 0, 15, 0, 0, 2,
+  0, 0, 0, 36, 38, 0, 60, 0, 2, 0,
+  50, 0, 47, 0, 0, 0, 62, 0, 47, 0,
+  7, 0, 20, 0, 0, 8, 0, 4, 0, 8,
+  0, 7, 0, 0, 51, 44, 26, 26, 0, 37,
+  18, 0, 29, 6, 9, 13, 0, 18, 0, 17,
+  0, 0, 6, 0, 36, 0, 37, 0, 37, 0,
+  0, 0, 38, 0, 0, 12, 0, 42, 6, 15,
+  37, 28, 4, 4, 6, 14, 22, 0, 5, 59,
+  66, 39, 0, 24, 0, 0, 0, 20, 47, 15,
+  29, 33, 0, 35, 0, 0, 91, 34, 6, 0,
+  0, 11, 0, 10, 0, 18, 0, 22, 0, 58,
+  46, 78, 0, 43, 0, 62, 86, 46, 0, 56,
+  0, 0, 0, 20, 4, 0, 0, 0, 0, 0,
+  39, 0, 35, 6, 23, 0, 0, 0, 28, 23,
+  8, 0, 0, 0, 113, 0, 11, 9, 0, 0,
+  7, 22, 0, 0, 22, 29, 0, 8, 36, 0,
+  36, 0, 26, 59, 19, 7, 14, 19, 16, 0,
+  26, 17, 35, 32, 0, 9, 19, 42, 0, 0,
+  5, 0, 0, 0, 14, 11, 125, 0, 35, 0,
+  0, 0, 0, 58, 49, 0, 14, 0, 50, 16,
+  63, 8, 3, 26, 61, 1, 7, 53, 52, 0,
+  0, 15, 0, 27, 43, 19, 23, 0, 0, 13,
+  0, 0, 0, 0, 41, 0, 0, 6, 0, 16,
+  0, 79, 0, 24, 0, 55, 1, 70, 61, 46,
+  0, 21, 0, 20, 72, 1, 0, 0, 29, 0,
+  0, 0, 15, 36, 0, 43, 0, 14, 0, 0,
+  79, 0, 0, 0, 7, 27, 66, 15, 34, 28,
+  0, 0, 79, 0, 29, 0, 25, 0, 16, 0,
+  0, 0, 0, 0, 0, 17, 0, 26, 0, 0,
+  5, 71, 31, 0, 0, 0, 26, 0, 28, 0,
+  0, 38, 0, 0, 0, 2, 0, 0, 2, 14,
+  69, 0, 27, 0, 63, 0, 43, 7, 17, 0,
+  0, 6, 0, 0, 0, 1, 30, 12, 26, 0,
+  0, 25, 43, 0, 8, 23, 56, 23, 0, 0,
+  32, 29, 18, 2, 25, 0, 0, 0, 0, 0,
+  0, 0, 36, 17, 0, 0, 0, 0, 0, 34,
+  0, 11, 0, 58, 21, 87, 29, 59, 0, 1,
+  0, 52, 63, 0, 3, 0, 12, 0, 0, 0,
+  25, 4, 0, 38, 0, 10, 4, 0, 42, 0,
+  34, 0, 0, 17, 34, 0, 45, 41, 0, 0,
+  77, 0, 55, 0, 5, 0, 14, 0, 0, 0,
+  0, 31, 0, 0, 0, 22, 0, 0, 32, 57,
+  30, 0, 0, 9, 8, 0, 15, 0, 0, 13,
+  0, 14, 0, 2, 0, 0, 29, 0, 33, 0,
+  14, 0, 33, 0, 13, 6, 20, 0, 0, 5,
+  0, 30, 11, 9, 0, 0, 16, 0, 14, 0,
+  28, 0, 0, 43, 62, 17, 0, 4, 0, 0,
+  0, 14, 39, 0, 19, 14, 0, 0, 0, 0,
+  39, 51, 0, 0, 0, 0, 8, 0, 0, 0,
+  0, 26, 0, 76, 41, 64, 0, 17, 0, 73,
+  78, 15, 1, 58, 0, 0, 0, 0, 35, 0,
+  0, 26, 0, 0, 54, 0, 52, 39, 59, 0,
+  0, 16, 4, 0, 13, 36, 0, 0, 89, 0,
+  49, 0, 0, 20, 1, 30, 0, 0, 0, 79,
+  0, 0, 39, 0, 21, 0, 17, 79, 53, 5,
+  0, 14, 0, 0, 0, 9, 0, 17, 0, 33,
+  0, 25, 0, 0, 3, 0, 0, 0, 0, 0,
+  77, 0, 14, 5, 4, 0, 0, 34, 21, 0,
+  0, 0, 48, 33, 91, 15, 14, 16, 57, 1,
+  0, 81, 49, 0, 0, 0, 6, 20, 26, 30,
+  1, 0, 0, 23, 0, 0, 0, 0, 60, 0,
+  3, 0, 0, 56, 0, 42, 4, 5, 0, 43,
+  0, 101, 57, 64, 0, 36, 0, 14, 67, 0,
+  0, 0, 60, 0, 18, 0, 6, 36, 0, 46,
+  0, 0, 0, 0, 80, 0, 0, 0, 27, 50,
+  26, 48, 16, 11, 0, 0, 59, 0, 25, 0,
+  0, 9, 9, 3, 5, 0, 0, 63, 0, 14,
+  0, 0, 0, 0, 4, 79, 88, 0, 0, 0,
+  17, 0, 30, 2, 0, 51, 0, 7, 0, 20,
+  0, 0, 0, 31, 77, 0, 50, 0, 85, 0,
+  42, 0, 14, 0, 0, 27, 0, 6, 0, 0,
+  33, 17, 40, 0, 12, 29, 62, 0, 14, 33,
+  65, 28, 0, 0, 26, 32, 26, 12, 42, 0,
+  0, 27, 0, 0, 0, 0, 69, 0, 0, 0,
+  0, 14, 0, 40, 0, 14, 0, 40, 23, 88,
+  0, 29, 0, 18, 0, 24, 66, 1, 4, 0,
+  0, 0, 0, 0, 30, 14, 0, 50, 0, 7,
+  42, 0, 37, 0, 0, 0, 0, 48, 16, 0,
+  58, 78, 0, 0, 60, 0, 43, 4, 0, 14,
+  12, 0, 0, 2, 0, 24, 0, 6, 0, 25,
+  4, 0, 5, 84, 38, 0, 0, 3, 48, 0,
+  12, 5, 0, 1, 0, 12, 0, 2, 0, 0,
+  15, 0, 12, 0, 16, 0, 60, 0, 26, 0,
+  25, 0, 32, 14, 0, 17, 0, 0, 0, 0,
+  0, 0, 1, 1, 16, 0, 0, 0, 49, 11,
+  3, 0, 0, 29, 0, 16, 72, 0, 37, 30,
+  0, 0, 0, 15, 79, 12, 0, 0, 0, 13,
+  41, 0, 0, 0, 0, 11, 0, 105, 32, 28,
+  0, 0, 0, 8, 36, 0, 22, 20, 3, 0,
+  0, 0, 87, 22, 0, 54, 0, 0, 130, 30,
+  67, 49, 31, 0, 0, 36, 0, 0, 48, 46,
+  0, 0, 36, 0, 58, 28, 0, 42, 0, 0,
+  0, 0, 0, 73, 0, 0, 0, 0, 0, 0,
+  0, 113, 49, 57, 10, 33, 35, 37, 0, 0,
+  24, 0, 0, 52, 0, 0, 0, 0, 4, 0,
+  10, 0, 8, 0, 23, 0, 0, 0, 31, 19,
+  7, 18, 0, 16, 0, 21, 57, 17, 0, 0,
+  0, 41, 57, 2, 0, 6, 60, 44, 5, 5,
+  45, 0, 15, 0, 37, 0, 27, 0, 0, 35,
+  0, 0, 85, 0, 0, 0, 0, 5, 0, 0,
+  0, 23, 0, 64, 4, 113, 25, 79, 0, 0,
+  0, 41, 66, 0, 0, 22, 11, 0, 0, 0,
+  15, 0, 0, 2, 0, 0, 0, 36, 38, 0,
+  60, 0, 2, 0, 50, 0, 47, 0, 0, 0,
+  62, 0, 47, 0, 7, 0, 20, 0, 0, 8,
+  0, 4, 0, 8, 0, 7, 0, 0, 51, 44,
+  26, 26, 0, 37, 18, 0, 29, 6, 9, 13,
+  0, 18, 0, 17, 0, 0, 6, 0, 36, 0,
+  37, 0, 37, 0, 0, 0, 38, 0, 0, 12,
+  0, 42, 6, 15, 37, 28, 4, 4, 6, 14,
+  22, 0, 5, 59, 66, 39, 0, 24, 0, 0,
+  0, 20, 47, 15, 29, 33, 0, 35, 0, 0,
+  91, 34, 6, 0, 0, 11, 0, 10, 0, 18,
+  0, 22, 0, 58, 46, 78, 0, 43, 0, 62,
+  86, 46, 0, 56, 0, 0, 0, 20, 4, 0,
+  0, 0, 0, 0, 39, 0, 35, 6, 23, 0,
+  0, 0, 28, 23, 8, 0, 0, 0, 113, 0,
+  11, 9, 0, 0, 7, 22, 0, 0, 22, 29,
+  0, 8, 36, 0, 36, 0, 26, 59, 19, 7,
+  14, 19, 16, 0, 26, 17, 35, 32, 0, 9,
+  19, 42, 0, 0, 5, 0, 0, 0, 14, 11,
+  125, 0, 35, 0, 0, 0, 0, 93, 5, 24,
+  14, 0, 37, 16, 19, 24, 15, 1, 7, 0,
+  45, 74, 66, 43, 0, 20, 0, 0, 0, 49,
+  65, 69, 6, 62, 0, 1, 5, 0, 69, 27,
+  8, 0, 0, 8, 0, 34, 0, 35, 41, 0,
+  16, 0, 40, 0, 0, 56, 0, 37, 99, 45,
+  0, 4, 0, 17, 0, 45, 12, 0, 0, 33,
+  0, 12, 78, 0, 23, 0, 0, 0, 0, 6,
+  46, 35, 1, 18, 0, 2, 119, 0, 0, 1,
+  0, 16, 0, 27, 17, 29, 59, 0, 0, 26,
+  0, 8, 27, 0, 0, 42, 0, 0, 29, 0,
+  16, 0, 32, 10, 52, 56, 0, 0, 9, 11,
+  0, 0, 0, 0, 0, 0, 4, 23, 137, 0,
+  66, 0, 0, 0, 0, 6, 0, 0, 0, 1,
+  30, 12, 26, 0, 0, 25, 43, 0, 8, 23,
+  56, 23, 0, 0, 32, 29, 18, 2, 25, 0,
+  0, 0, 0, 0, 0, 0, 36, 17, 0, 0,
+  0, 0, 0, 34, 0, 11, 0, 58, 21, 87,
+  29, 59, 0, 1, 0, 52, 63, 0, 3, 0,
+  12, 0, 0, 0, 25, 4, 0, 38, 0, 10,
+  4, 0, 42, 0, 34, 0, 0, 17, 34, 0,
+  45, 41, 0, 0, 77, 0, 55, 0, 5, 0,
+  14, 0, 0, 0, 0, 31, 0, 0, 0, 22,
+  0, 0, 32, 57, 30, 0, 0, 9, 8, 0,
+  15, 0, 0, 13, 0, 14, 0, 2, 0, 0,
+  29, 0, 33, 0, 14, 0, 33, 0, 13, 6,
+  20, 0, 0, 5, 0, 30, 11, 9, 0, 0,
+  16, 0, 14, 0, 28, 0, 0, 43, 62, 17,
+  0, 4, 0, 0, 0, 14, 39, 0, 19, 14,
+  0, 0, 0, 0, 39, 51, 0, 0, 0, 0,
+  8, 0, 0, 0, 0, 26, 0, 76, 41, 64,
+  0, 17, 0, 73, 78, 15, 1, 58, 0, 0,
+  0, 0, 35, 0, 0, 26, 0, 0, 54, 0,
+  52, 39, 59, 0, 0, 16, 4, 0, 13, 36,
+  0, 0, 89, 0, 49, 0, 0, 20, 1, 30,
+  0, 0, 0, 79, 0, 0, 39, 0, 21, 0,
+  17, 79, 53, 5, 0, 14, 0, 0, 0, 9,
+  0, 17, 0, 33, 0, 25, 0, 0, 3, 0,
+  0, 0, 0, 0, 77, 0, 14, 5, 4, 0,
+  0, 37, 0, 30, 19, 0, 8, 0, 29, 1,
+  5, 0, 23, 0, 24, 68, 78, 31, 0, 2,
+  0, 0, 0, 40, 45, 0, 20, 28, 0, 0,
+  7, 0, 46, 69, 0, 0, 0, 8, 7, 0,
+  0, 0, 0, 16, 0, 35, 63, 39, 0, 11,
+  0, 42, 72, 27, 0, 30, 0, 4, 0, 3,
+  38, 0, 0, 31, 0, 0, 79, 0, 75, 41,
+  0, 0, 0, 12, 16, 0, 14, 1, 0, 0,
+  85, 0, 26, 0, 0, 32, 0, 18, 6, 0,
+  14, 72, 0, 6, 28, 0, 15, 0, 0, 80,
+  18, 0, 0, 7, 0, 0, 0, 0, 2, 22,
+  0, 30, 8, 22, 3, 0, 0, 0, 0, 0,
+  0, 0, 101, 0, 9, 26, 7, 0, 0, 27,
+  0, 6, 0, 0, 33, 17, 40, 0, 12, 29,
+  62, 0, 14, 33, 65, 28, 0, 0, 26, 32,
+  26, 12, 42, 0, 0, 27, 0, 0, 0, 0,
+  69, 0, 0, 0, 0, 14, 0, 40, 0, 14,
+  0, 40, 23, 88, 0, 29, 0, 18, 0, 24,
+  66, 1, 4, 0, 0, 0, 0, 0, 30, 14,
+  0, 50, 0, 7, 42, 0, 37, 0, 0, 0,
+  0, 48, 16, 0, 58, 78, 0, 0, 60, 0,
+  43, 4, 0, 14, 12, 0, 0, 2, 0, 24,
+  0, 6, 0, 25, 4, 0, 5, 84, 38, 0,
+  0, 3, 48, 0, 12, 5, 0, 1, 0, 12,
+  0, 2, 0, 0, 15, 0, 12, 0, 16, 0,
+  60, 0, 26, 0, 25, 0, 32, 14, 0, 17,
+  0, 0, 0, 0, 0, 0, 1, 1, 16, 0,
+  0, 0, 49, 11, 3, 0, 0, 29, 0, 16,
+  72, 0, 37, 30, 0, 0, 0, 15, 79, 12,
+  0, 0, 0, 13, 41, 0, 0, 0, 0, 11,
+  0, 105, 32, 28, 0, 0, 0, 8, 36, 0,
+  22, 20, 3, 0, 0, 0, 87, 22, 0, 54,
+  0, 0, 130, 30, 67, 49, 31, 0, 0, 36,
+  0, 0, 48, 46, 0, 0, 36, 0, 58, 28,
+  0, 42, 0, 0, 0, 0, 0, 73, 0, 0,
+  0, 0, 0, 0, 0, 113, 49, 57, 10, 33,
+  35, 37, 0, 0, 24, 0, 0, 52, 0, 0,
+  0, 0, 4, 0, 10, 0, 8, 0, 23, 0,
+  0, 0, 31, 19, 12, 13, 0, 21, 6, 5,
+  0, 0, 11, 0, 0, 0, 48, 0, 0, 18,
+  58, 12, 0, 0, 0, 8, 0, 28, 33, 0,
+  31, 20, 0, 0, 0, 2, 67, 50, 0, 0,
+  0, 26, 49, 0, 0, 0, 0, 31, 0, 97,
+  52, 74, 0, 0, 0, 36, 26, 0, 0, 44,
+  0, 0, 0, 0, 64, 9, 0, 12, 0, 0,
+  87, 26, 88, 48, 67, 0, 0, 16, 0, 0,
+  28, 0, 0, 0, 33, 0, 46, 22, 0, 32,
+  0, 0, 2, 0, 0, 84, 0, 0, 12, 0,
+  0, 0, 1, 115, 49, 54, 0, 40, 17, 26,
+  0, 0, 9, 0, 0, 49, 0, 16, 0, 0,
+  0, 0, 29, 0, 1, 0, 46, 0, 0, 0,
+  33, 16, 0, 12, 0, 42, 6, 15, 37, 28,
+  4, 4, 6, 14, 22, 0, 5, 59, 66, 39,
+  0, 24, 0, 0, 0, 20, 47, 15, 29, 33,
+  0, 35, 0, 0, 91, 34, 6, 0, 0, 11,
+  0, 10, 0, 18, 0, 22, 0, 58, 46, 78,
+  0, 43, 0, 62, 86, 46, 0, 56, 0, 0,
+  0, 20, 4, 0, 0, 0, 0, 0, 39, 0,
+  35, 6, 23, 0, 0, 0, 28, 23, 8, 0,
+  0, 0, 113, 0, 11, 9, 0, 0, 7, 22,
+  0, 0, 22, 29, 0, 8, 36, 0, 36, 0,
+  26, 59, 19, 7, 14, 19, 16, 0, 26, 17,
+  35, 32, 0, 9, 19, 42, 0, 0, 5, 0,
+  0, 0, 14, 11, 125, 0, 35, 0, 0, 0,
+  0, 93, 5, 24, 14, 0, 37, 16, 19, 24,
+  15, 1, 7, 0, 45, 74, 66, 43, 0, 20,
+  0, 0, 0, 49, 65, 69, 6, 62, 0, 1,
+  5, 0, 69, 27, 8, 0, 0, 8, 0, 34,
+  0, 35, 41, 0, 16, 0, 40, 0, 0, 56,
+  0, 37, 99, 45, 0, 4, 0, 17, 0, 45,
+  12, 0, 0, 33, 0, 12, 78, 0, 23, 0,
+  0, 0, 0, 6, 46, 35, 1, 18, 0, 2,
+  119, 0, 0, 1, 0, 16, 0, 27, 17, 29,
+  59, 0, 0, 26, 0, 8, 27, 0, 0, 42,
+  0, 0, 29, 0, 16, 0, 32, 10, 52, 56,
+  0, 0, 9, 11, 0, 0, 0, 0, 0, 0,
+  4, 23, 137, 0, 66, 0, 0, 0, 0, 115,
+  36, 17, 6, 0, 3, 0, 44, 17, 0, 0,
+  3, 0, 0, 24, 36, 38, 6, 35, 0, 0,
+  67, 53, 19, 0, 40, 54, 0, 0, 0, 0,
+  68, 0, 53, 8, 0, 0, 28, 2, 0, 0,
+  37, 25, 0, 67, 27, 0, 0, 2, 0, 53,
+  88, 0, 20, 0, 26, 0, 0, 0, 0, 27,
+  0, 0, 0, 0, 0, 0, 0, 14, 53, 0,
+  37, 17, 61, 42, 0, 74, 24, 0, 64, 0,
+  4, 21, 0, 0, 6, 36, 25, 20, 74, 0,
+  0, 0, 24, 0, 0, 0, 0, 53, 38, 17,
+  0, 0, 21, 4, 62, 0, 41, 58, 0, 16,
+  0, 3, 0, 0, 0, 0, 0, 6, 0, 0,
+  35, 0, 53, 1, 0, 0, 0, 5, 0, 30,
+  11, 9, 0, 0, 16, 0, 14, 0, 28, 0,
+  0, 43, 62, 17, 0, 4, 0, 0, 0, 14,
+  39, 0, 19, 14, 0, 0, 0, 0, 39, 51,
+  0, 0, 0, 0, 8, 0, 0, 0, 0, 26,
+  0, 76, 41, 64, 0, 17, 0, 73, 78, 15,
+  1, 58, 0, 0, 0, 0, 35, 0, 0, 26,
+  0, 0, 54, 0, 52, 39, 59, 0, 0, 16,
+  4, 0, 13, 36, 0, 0, 89, 0, 49, 0,
+  0, 20, 1, 30, 0, 0, 0, 79, 0, 0,
+  39, 0, 21, 0, 17, 79, 53, 5, 0, 14,
+  0, 0, 0, 9, 0, 17, 0, 33, 0, 25,
+  0, 0, 3, 0, 0, 0, 0, 0, 77, 0,
+  14, 5, 4, 0, 0, 37, 0, 30, 19, 0,
+  8, 0, 29, 1, 5, 0, 23, 0, 24, 68,
+  78, 31, 0, 2, 0, 0, 0, 40, 45, 0,
+  20, 28, 0, 0, 7, 0, 46, 69, 0, 0,
+  0, 8, 7, 0, 0, 0, 0, 16, 0, 35,
+  63, 39, 0, 11, 0, 42, 72, 27, 0, 30,
+  0, 4, 0, 3, 38, 0, 0, 31, 0, 0,
+  79, 0, 75, 41, 0, 0, 0, 12, 16, 0,
+  14, 1, 0, 0, 85, 0, 26, 0, 0, 32,
+  0, 18, 6, 0, 14, 72, 0, 6, 28, 0,
+  15, 0, 0, 80, 18, 0, 0, 7, 0, 0,
+  0, 0, 2, 22, 0, 30, 8, 22, 3, 0,
+  0, 0, 0, 0, 0, 0, 101, 0, 9, 26,
+  7, 0, 0, 119, 31, 10, 0, 0, 55, 0,
+  33, 18, 0, 0, 0, 0, 46, 39, 65, 38,
+  5, 18, 0, 0, 0, 46, 49, 6, 24, 40,
+  0, 0, 0, 0, 84, 26, 0, 0, 0, 16,
+  0, 3, 0, 0, 24, 17, 0, 45, 64, 6,
+  0, 10, 0, 0, 73, 0, 0, 0, 32, 0,
+  0, 35, 7, 5, 0, 0, 0, 0, 63, 0,
+  26, 11, 0, 0, 0, 15, 64, 26, 8, 27,
+  5, 0, 67, 3, 18, 28, 0, 6, 0, 0,
+  1, 26, 36, 0, 0, 22, 0, 0, 0, 0,
+  0, 60, 6, 0, 0, 0, 2, 0, 43, 0,
+  35, 36, 0, 21, 0, 19, 0, 0, 0, 0,
+  13, 0, 0, 0, 95, 0, 24, 41, 20, 0,
+  32, 14, 0, 17, 0, 0, 0, 0, 0, 0,
+  1, 1, 16, 0, 0, 0, 49, 11, 3, 0,
+  0, 29, 0, 16, 72, 0, 37, 30, 0, 0,
+  0, 15, 79, 12, 0, 0, 0, 13, 41, 0,
+  0, 0, 0, 11, 0, 105, 32, 28, 0, 0,
+  0, 8, 36, 0, 22, 20, 3, 0, 0, 0,
+  87, 22, 0, 54, 0, 0, 130, 30, 67, 49,
+  31, 0, 0, 36, 0, 0, 48, 46, 0, 0,
+  36, 0, 58, 28, 0, 42, 0, 0, 0, 0,
+  0, 73, 0, 0, 0, 0, 0, 0, 0, 113,
+  49, 57, 10, 33, 35, 37, 0, 0, 24, 0,
+  0, 52, 0, 0, 0, 0, 4, 0, 10, 0,
+  8, 0, 23, 0, 0, 0, 31, 19, 12, 13,
+  0, 21, 6, 5, 0, 0, 11, 0, 0, 0,
+  48, 0, 0, 18, 58, 12, 0, 0, 0, 8,
+  0, 28, 33, 0, 31, 20, 0, 0, 0, 2,
+  67, 50, 0, 0, 0, 26, 49, 0, 0, 0,
+  0, 31, 0, 97, 52, 74, 0, 0, 0, 36,
+  26, 0, 0, 44, 0, 0, 0, 0, 64, 9,
+  0, 12, 0, 0, 87, 26, 88, 48, 67, 0,
+  0, 16, 0, 0, 28, 0, 0, 0, 33, 0,
+  46, 22, 0, 32, 0, 0, 2, 0, 0, 84,
+  0, 0, 12, 0, 0, 0, 1, 115, 49, 54,
+  0, 40, 17, 26, 0, 0, 9, 0, 0, 49,
+  0, 16, 0, 0, 0, 0, 29, 0, 1, 0,
+  46, 0, 0, 0, 33, 16, 0, 98, 0, 20,
+  14, 0, 60, 12, 44, 16, 32, 0, 54, 0,
+  44, 107, 104, 30, 6, 0, 0, 0, 0, 40,
+  41, 45, 0, 53, 0, 0, 0, 0, 87, 64,
+  0, 0, 0, 27, 0, 41, 0, 0, 16, 28,
+  30, 44, 24, 53, 0, 28, 0, 0, 87, 10,
+  0, 0, 0, 14, 0, 58, 10, 0, 0, 24,
+  0, 0, 75, 0, 41, 0, 0, 0, 0, 48,
+  17, 40, 0, 0, 0, 12, 73, 0, 9, 26,
+  0, 32, 2, 2, 0, 43, 49, 36, 0, 65,
+  0, 26, 0, 0, 0, 86, 27, 0, 0, 0,
+  9, 0, 28, 10, 24, 30, 0, 17, 0, 27,
+  0, 0, 0, 0, 2, 0, 8, 0, 164, 0,
+  52, 9, 40, 0, 0, 93, 5, 24, 14, 0,
+  37, 16, 19, 24, 15, 1, 7, 0, 45, 74,
+  66, 43, 0, 20, 0, 0, 0, 49, 65, 69,
+  6, 62, 0, 1, 5, 0, 69, 27, 8, 0,
+  0, 8, 0, 34, 0, 35, 41, 0, 16, 0,
+  40, 0, 0, 56, 0, 37, 99, 45, 0, 4,
+  0, 17, 0, 45, 12, 0, 0, 33, 0, 12,
+  78, 0, 23, 0, 0, 0, 0, 6, 46, 35,
+  1, 18, 0, 2, 119, 0, 0, 1, 0, 16,
+  0, 27, 17, 29, 59, 0, 0, 26, 0, 8,
+  27, 0, 0, 42, 0, 0, 29, 0, 16, 0,
+  32, 10, 52, 56, 0, 0, 9, 11, 0, 0,
+  0, 0, 0, 0, 4, 23, 137, 0, 66, 0,
+  0, 0, 0, 115, 36, 17, 6, 0, 3, 0,
+  44, 17, 0, 0, 3, 0, 0, 24, 36, 38,
+  6, 35, 0, 0, 67, 53, 19, 0, 40, 54,
+  0, 0, 0, 0, 68, 0, 53, 8, 0, 0,
+  28, 2, 0, 0, 37, 25, 0, 67, 27, 0,
+  0, 2, 0, 53, 88, 0, 20, 0, 26, 0,
+  0, 0, 0, 27, 0, 0, 0, 0, 0, 0,
+  0, 14, 53, 0, 37, 17, 61, 42, 0, 74,
+  24, 0, 64, 0, 4, 21, 0, 0, 6, 36,
+  25, 20, 74, 0, 0, 0, 24, 0, 0, 0,
+  0, 53, 38, 17, 0, 0, 21, 4, 62, 0,
+  41, 58, 0, 16, 0, 3, 0, 0, 0, 0,
+  0, 6, 0, 0, 35, 0, 53, 1, 0, 0,
+  55, 68, 5, 59, 7, 0, 0, 0, 39, 0,
+  0, 18, 78, 0, 0, 0, 25, 2, 0, 0,
+  0, 34, 65, 19, 34, 0, 18, 36, 0, 0,
+  0, 6, 13, 0, 31, 16, 0, 0, 71, 0,
+  0, 16, 19, 37, 0, 40, 14, 0, 0, 0,
+  0, 107, 29, 0, 61, 0, 36, 0, 0, 0,
+  0, 19, 0, 10, 41, 34, 0, 0, 22, 0,
+  133, 0, 33, 13, 17, 0, 9, 54, 28, 7,
+  16, 0, 14, 15, 15, 0, 15, 0, 48, 0,
+  1, 0, 0, 0, 0, 0, 10, 0, 0, 40,
+  0, 1, 9, 0, 35, 68, 7, 20, 38, 3,
+  0, 13, 0, 0, 0, 0, 0, 0, 0, 9,
+  0, 0, 0, 0, 53, 0, 0, 0, 0, 37,
+  0, 30, 19, 0, 8, 0, 29, 1, 5, 0,
+  23, 0, 24, 68, 78, 31, 0, 2, 0, 0,
+  0, 40, 45, 0, 20, 28, 0, 0, 7, 0,
+  46, 69, 0, 0, 0, 8, 7, 0, 0, 0,
+  0, 16, 0, 35, 63, 39, 0, 11, 0, 42,
+  72, 27, 0, 30, 0, 4, 0, 3, 38, 0,
+  0, 31, 0, 0, 79, 0, 75, 41, 0, 0,
+  0, 12, 16, 0, 14, 1, 0, 0, 85, 0,
+  26, 0, 0, 32, 0, 18, 6, 0, 14, 72,
+  0, 6, 28, 0, 15, 0, 0, 80, 18, 0,
+  0, 7, 0, 0, 0, 0, 2, 22, 0, 30,
+  8, 22, 3, 0, 0, 0, 0, 0, 0, 0,
+  101, 0, 9, 26, 7, 0, 0, 119, 31, 10,
+  0, 0, 55, 0, 33, 18, 0, 0, 0, 0,
+  46, 39, 65, 38, 5, 18, 0, 0, 0, 46,
+  49, 6, 24, 40, 0, 0, 0, 0, 84, 26,
+  0, 0, 0, 16, 0, 3, 0, 0, 24, 17,
+  0, 45, 64, 6, 0, 10, 0, 0, 73, 0,
+  0, 0, 32, 0, 0, 35, 7, 5, 0, 0,
+  0, 0, 63, 0, 26, 11, 0, 0, 0, 15,
+  64, 26, 8, 27, 5, 0, 67, 3, 18, 28,
+  0, 6, 0, 0, 1, 26, 36, 0, 0, 22,
+  0, 0, 0, 0, 0, 60, 6, 0, 0, 0,
+  2, 0, 43, 0, 35, 36, 0, 21, 0, 19,
+  0, 0, 0, 0, 13, 0, 0, 0, 95, 0,
+  24, 41, 20, 0, 0, 104, 16, 18, 0, 0,
+  0, 0, 47, 19, 0, 0, 6, 0, 7, 17,
+  36, 23, 0, 2, 0, 0, 72, 39, 0, 0,
+  14, 29, 0, 0, 0, 0, 40, 0, 36, 14,
+  0, 1, 11, 0, 0, 0, 22, 32, 0, 52,
+  25, 0, 0, 0, 0, 42, 40, 0, 22, 0,
+  44, 0, 3, 0, 0, 33, 0, 0, 52, 0,
+  0, 0, 0, 10, 106, 0, 39, 32, 46, 45,
+  0, 59, 28, 0, 21, 0, 1, 31, 0, 0,
+  5, 21, 26, 0, 31, 0, 0, 0, 5, 0,
+  0, 0, 0, 52, 28, 23, 1, 0, 7, 59,
+  48, 1, 0, 29, 0, 28, 0, 8, 0, 0,
+  0, 0, 0, 12, 0, 0, 0, 0, 49, 26,
+  5, 0, 12, 13, 0, 21, 6, 5, 0, 0,
+  11, 0, 0, 0, 48, 0, 0, 18, 58, 12,
+  0, 0, 0, 8, 0, 28, 33, 0, 31, 20,
+  0, 0, 0, 2, 67, 50, 0, 0, 0, 26,
+  49, 0, 0, 0, 0, 31, 0, 97, 52, 74,
+  0, 0, 0, 36, 26, 0, 0, 44, 0, 0,
+  0, 0, 64, 9, 0, 12, 0, 0, 87, 26,
+  88, 48, 67, 0, 0, 16, 0, 0, 28, 0,
+  0, 0, 33, 0, 46, 22, 0, 32, 0, 0,
+  2, 0, 0, 84, 0, 0, 12, 0, 0, 0,
+  1, 115, 49, 54, 0, 40, 17, 26, 0, 0,
+  9, 0, 0, 49, 0, 16, 0, 0, 0, 0,
+  29, 0, 1, 0, 46, 0, 0, 0, 33, 16,
+  0, 98, 0, 20, 14, 0, 60, 12, 44, 16,
+  32, 0, 54, 0, 44, 107, 104, 30, 6, 0,
+  0, 0, 0, 40, 41, 45, 0, 53, 0, 0,
+  0, 0, 87, 64, 0, 0, 0, 27, 0, 41,
+  0, 0, 16, 28, 30, 44, 24, 53, 0, 28,
+  0, 0, 87, 10, 0, 0, 0, 14, 0, 58,
+  10, 0, 0, 24, 0, 0, 75, 0, 41, 0,
+  0, 0, 0, 48, 17, 40, 0, 0, 0, 12,
+  73, 0, 9, 26, 0, 32, 2, 2, 0, 43,
+  49, 36, 0, 65, 0, 26, 0, 0, 0, 86,
+  27, 0, 0, 0, 9, 0, 28, 10, 24, 30,
+  0, 17, 0, 27, 0, 0, 0, 0, 2, 0,
+  8, 0, 164, 0, 52, 9, 40, 0, 0, 111,
+  49, 4, 4, 0, 0, 13, 78, 36, 24, 0,
+  20, 0, 0, 97, 83, 24, 24, 5, 0, 0,
+  48, 50, 0, 0, 1, 78, 1, 0, 0, 0,
+  68, 0, 12, 0, 0, 28, 0, 3, 0, 0,
+  11, 19, 11, 36, 0, 0, 0, 29, 0, 18,
+  44, 0, 0, 0, 1, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 29, 0, 0, 0, 0, 0,
+  32, 72, 9, 90, 0, 112, 2, 20, 35, 0,
+  0, 53, 0, 31, 6, 61, 21, 24, 117, 0,
+  0, 0, 26, 0, 0, 0, 0, 100, 90, 0,
+  0, 0, 7, 0, 54, 21, 0, 21, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 21, 0, 0,
+  73, 0, 76, 10, 35, 0, 0, 115, 36, 17,
+  6, 0, 3, 0, 44, 17, 0, 0, 3, 0,
+  0, 24, 36, 38, 6, 35, 0, 0, 67, 53,
+  19, 0, 40, 54, 0, 0, 0, 0, 68, 0,
+  53, 8, 0, 0, 28, 2, 0, 0, 37, 25,
+  0, 67, 27, 0, 0, 2, 0, 53, 88, 0,
+  20, 0, 26, 0, 0, 0, 0, 27, 0, 0,
+  0, 0, 0, 0, 0, 14, 53, 0, 37, 17,
+  61, 42, 0, 74, 24, 0, 64, 0, 4, 21,
+  0, 0, 6, 36, 25, 20, 74, 0, 0, 0,
+  24, 0, 0, 0, 0, 53, 38, 17, 0, 0,
+  21, 4, 62, 0, 41, 58, 0, 16, 0, 3,
+  0, 0, 0, 0, 0, 6, 0, 0, 35, 0,
+  53, 1, 0, 0, 55, 68, 5, 59, 7, 0,
+  0, 0, 39, 0, 0, 18, 78, 0, 0, 0,
+  25, 2, 0, 0, 0, 34, 65, 19, 34, 0,
+  18, 36, 0, 0, 0, 6, 13, 0, 31, 16,
+  0, 0, 71, 0, 0, 16, 19, 37, 0, 40,
+  14, 0, 0, 0, 0, 107, 29, 0, 61, 0,
+  36, 0, 0, 0, 0, 19, 0, 10, 41, 34,
+  0, 0, 22, 0, 133, 0, 33, 13, 17, 0,
+  9, 54, 28, 7, 16, 0, 14, 15, 15, 0,
+  15, 0, 48, 0, 1, 0, 0, 0, 0, 0,
+  10, 0, 0, 40, 0, 1, 9, 0, 35, 68,
+  7, 20, 38, 3, 0, 13, 0, 0, 0, 0,
+  0, 0, 0, 9, 0, 0, 0, 0, 53, 0,
+  0, 0, 104, 21, 0, 47, 20, 66, 0, 0,
+  53, 0, 0, 0, 116, 0, 0, 40, 62, 0,
+  2, 0, 11, 68, 0, 8, 23, 0, 0, 43,
+  3, 1, 13, 72, 0, 27, 24, 0, 0, 21,
+  96, 5, 13, 87, 14, 47, 59, 16, 0, 0,
+  0, 0, 0, 111, 0, 0, 107, 59, 25, 17,
+  19, 0, 0, 13, 9, 35, 0, 93, 0, 0,
+  13, 0, 155, 30, 22, 32, 0, 0, 34, 19,
+  0, 47, 0, 0, 15, 14, 42, 14, 8, 0,
+  73, 0, 0, 0, 0, 2, 0, 0, 31, 0,
+  21, 50, 0, 0, 5, 0, 30, 31, 0, 67,
+  22, 0, 17, 0, 0, 0, 0, 0, 0, 0,
+  0, 1, 0, 3, 0, 16, 53, 0, 3, 16,
+  0, 119, 31, 10, 0, 0, 55, 0, 33, 18,
+  0, 0, 0, 0, 46, 39, 65, 38, 5, 18,
+  0, 0, 0, 46, 49, 6, 24, 40, 0, 0,
+  0, 0, 84, 26, 0, 0, 0, 16, 0, 3,
+  0, 0, 24, 17, 0, 45, 64, 6, 0, 10,
+  0, 0, 73, 0, 0, 0, 32, 0, 0, 35,
+  7, 5, 0, 0, 0, 0, 63, 0, 26, 11,
+  0, 0, 0, 15, 64, 26, 8, 27, 5, 0,
+  67, 3, 18, 28, 0, 6, 0, 0, 1, 26,
+  36, 0, 0, 22, 0, 0, 0, 0, 0, 60,
+  6, 0, 0, 0, 2, 0, 43, 0, 35, 36,
+  0, 21, 0, 19, 0, 0, 0, 0, 13, 0,
+  0, 0, 95, 0, 24, 41, 20, 0, 0, 104,
+  16, 18, 0, 0, 0, 0, 47, 19, 0, 0,
+  6, 0, 7, 17, 36, 23, 0, 2, 0, 0,
+  72, 39, 0, 0, 14, 29, 0, 0, 0, 0,
+  40, 0, 36, 14, 0, 1, 11, 0, 0, 0,
+  22, 32, 0, 52, 25, 0, 0, 0, 0, 42,
+  40, 0, 22, 0, 44, 0, 3, 0, 0, 33,
+  0, 0, 52, 0, 0, 0, 0, 10, 106, 0,
+  39, 32, 46, 45, 0, 59, 28, 0, 21, 0,
+  1, 31, 0, 0, 5, 21, 26, 0, 31, 0,
+  0, 0, 5, 0, 0, 0, 0, 52, 28, 23,
+  1, 0, 7, 59, 48, 1, 0, 29, 0, 28,
+  0, 8, 0, 0, 0, 0, 0, 12, 0, 0,
+  0, 0, 49, 26, 5, 0, 107, 66, 16, 65,
+  30, 0, 0, 17, 71, 14, 28, 0, 85, 0,
+  0, 80, 60, 0, 13, 0, 0, 32, 32, 6,
+  0, 0, 0, 61, 0, 37, 19, 69, 10, 6,
+  18, 5, 0, 44, 103, 0, 0, 23, 0, 23,
+  18, 0, 0, 0, 0, 0, 0, 86, 0, 0,
+  83, 13, 32, 36, 9, 0, 0, 0, 0, 0,
+  15, 55, 0, 0, 11, 0, 91, 19, 43, 55,
+  0, 39, 28, 49, 0, 26, 0, 0, 19, 64,
+  28, 26, 14, 0, 86, 0, 32, 0, 0, 14,
+  0, 0, 66, 0, 5, 67, 43, 0, 9, 0,
+  0, 58, 0, 60, 9, 0, 6, 0, 0, 0,
+  0, 0, 0, 0, 0, 15, 0, 4, 0, 18,
+  46, 15, 12, 30, 0, 98, 0, 20, 14, 0,
+  60, 12, 44, 16, 32, 0, 54, 0, 44, 107,
+  104, 30, 6, 0, 0, 0, 0, 40, 41, 45,
+  0, 53, 0, 0, 0, 0, 87, 64, 0, 0,
+  0, 27, 0, 41, 0, 0, 16, 28, 30, 44,
+  24, 53, 0, 28, 0, 0, 87, 10, 0, 0,
+  0, 14, 0, 58, 10, 0, 0, 24, 0, 0,
+  75, 0, 41, 0, 0, 0, 0, 48, 17, 40,
+  0, 0, 0, 12, 73, 0, 9, 26, 0, 32,
+  2, 2, 0, 43, 49, 36, 0, 65, 0, 26,
+  0, 0, 0, 86, 27, 0, 0, 0, 9, 0,
+  28, 10, 24, 30, 0, 17, 0, 27, 0, 0,
+  0, 0, 2, 0, 8, 0, 164, 0, 52, 9,
+  40, 0, 0, 111, 49, 4, 4, 0, 0, 13,
+  78, 36, 24, 0, 20, 0, 0, 97, 83, 24,
+  24, 5, 0, 0, 48, 50, 0, 0, 1, 78,
+  1, 0, 0, 0, 68, 0, 12, 0, 0, 28,
+  0, 3, 0, 0, 11, 19, 11, 36, 0, 0,
+  0, 29, 0, 18, 44, 0, 0, 0, 1, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 29, 0,
+  0, 0, 0, 0, 32, 72, 9, 90, 0, 112,
+  2, 20, 35, 0, 0, 53, 0, 31, 6, 61,
+  21, 24, 117, 0, 0, 0, 26, 0, 0, 0,
+  0, 100, 90, 0, 0, 0, 7, 0, 54, 21,
+  0, 21, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 21, 0, 0, 73, 0, 76, 10, 35, 0,
+  59, 1, 72, 42, 0, 0, 0, 22, 38, 13,
+  13, 6, 0, 7, 0, 21, 38, 13, 14, 0,
+  0, 64, 43, 11, 0, 0, 1, 54, 0, 38,
+  0, 39, 17, 0, 12, 19, 36, 29, 3, 0,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 0,
+  0, 70, 0, 0, 91, 0, 38, 0, 8, 0,
+  0, 4, 0, 0, 64, 10, 0, 0, 0, 114,
+  20, 0, 74, 27, 0, 45, 12, 51, 27, 0,
+  0, 0, 15, 101, 0, 21, 22, 36, 22, 0,
+  57, 0, 0, 0, 62, 0, 29, 0, 0, 72,
+  95, 0, 0, 0, 0, 80, 0, 16, 0, 0,
+  0, 13, 0, 0, 0, 0, 0, 0, 0, 33,
+  0, 3, 0, 0, 0, 0, 4, 22, 55, 68,
+  5, 59, 7, 0, 0, 0, 39, 0, 0, 18,
+  78, 0, 0, 0, 25, 2, 0, 0, 0, 34,
+  65, 19, 34, 0, 18, 36, 0, 0, 0, 6,
+  13, 0, 31, 16, 0, 0, 71, 0, 0, 16,
+  19, 37, 0, 40, 14, 0, 0, 0, 0, 107,
+  29, 0, 61, 0, 36, 0, 0, 0, 0, 19,
+  0, 10, 41, 34, 0, 0, 22, 0, 133, 0,
+  33, 13, 17, 0, 9, 54, 28, 7, 16, 0,
+  14, 15, 15, 0, 15, 0, 48, 0, 1, 0,
+  0, 0, 0, 0, 10, 0, 0, 40, 0, 1,
+  9, 0, 35, 68, 7, 20, 38, 3, 0, 13,
+  0, 0, 0, 0, 0, 0, 0, 9, 0, 0,
+  0, 0, 53, 0, 0, 0, 104, 21, 0, 47,
+  20, 66, 0, 0, 53, 0, 0, 0, 116, 0,
+  0, 40, 62, 0, 2, 0, 11, 68, 0, 8,
+  23, 0, 0, 43, 3, 1, 13, 72, 0, 27,
+  24, 0, 0, 21, 96, 5, 13, 87, 14, 47,
+  59, 16, 0, 0, 0, 0, 0, 111, 0, 0,
+  107, 59, 25, 17, 19, 0, 0, 13, 9, 35,
+  0, 93, 0, 0, 13, 0, 155, 30, 22, 32,
+  0, 0, 34, 19, 0, 47, 0, 0, 15, 14,
+  42, 14, 8, 0, 73, 0, 0, 0, 0, 2,
+  0, 0, 31, 0, 21, 50, 0, 0, 5, 0,
+  30, 31, 0, 67, 22, 0, 17, 0, 0, 0,
+  0, 0, 0, 0, 0, 1, 0, 3, 0, 16,
+  53, 0, 3, 16, 0, 0, 0, 0, 0, 145,
+  0, 0, 46, 0, 0, 0, 34, 21, 0, 109,
+  67, 48, 0, 0, 39, 1, 0, 58, 0, 0,
+  0, 56, 1, 0, 0, 0, 49, 0, 0, 0,
+  22, 71, 0, 0, 22, 0, 0, 3, 13, 87,
+  0, 0, 0, 14, 12, 53, 23, 0, 62, 19,
+  29, 0, 0, 0, 0, 48, 0, 0, 12, 0,
+  16, 0, 17, 13, 58, 0, 50, 76, 0, 66,
+  0, 52, 0, 0, 8, 0, 17, 64, 0, 25,
+  19, 0, 22, 2, 35, 128, 0, 0, 75, 0,
+  0, 0, 0, 93, 86, 0, 0, 0, 15, 0,
+  0, 38, 0, 19, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  4, 15, 0, 104, 16, 18, 0, 0, 0, 0,
+  47, 19, 0, 0, 6, 0, 7, 17, 36, 23,
+  0, 2, 0, 0, 72, 39, 0, 0, 14, 29,
+  0, 0, 0, 0, 40, 0, 36, 14, 0, 1,
+  11, 0, 0, 0, 22, 32, 0, 52, 25, 0,
+  0, 0, 0, 42, 40, 0, 22, 0, 44, 0,
+  3, 0, 0, 33, 0, 0, 52, 0, 0, 0,
+  0, 10, 106, 0, 39, 32, 46, 45, 0, 59,
+  28, 0, 21, 0, 1, 31, 0, 0, 5, 21,
+  26, 0, 31, 0, 0, 0, 5, 0, 0, 0,
+  0, 52, 28, 23, 1, 0, 7, 59, 48, 1,
+  0, 29, 0, 28, 0, 8, 0, 0, 0, 0,
+  0, 12, 0, 0, 0, 0, 49, 26, 5, 0,
+  107, 66, 16, 65, 30, 0, 0, 17, 71, 14,
+  28, 0, 85, 0, 0, 80, 60, 0, 13, 0,
+  0, 32, 32, 6, 0, 0, 0, 61, 0, 37,
+  19, 69, 10, 6, 18, 5, 0, 44, 103, 0,
+  0, 23, 0, 23, 18, 0, 0, 0, 0, 0,
+  0, 86, 0, 0, 83, 13, 32, 36, 9, 0,
+  0, 0, 0, 0, 15, 55, 0, 0, 11, 0,
+  91, 19, 43, 55, 0, 39, 28, 49, 0, 26,
+  0, 0, 19, 64, 28, 26, 14, 0, 86, 0,
+  32, 0, 0, 14, 0, 0, 66, 0, 5, 67,
+  43, 0, 9, 0, 0, 58, 0, 60, 9, 0,
+  6, 0, 0, 0, 0, 0, 0, 0, 0, 15,
+  0, 4, 0, 18, 46, 15, 12, 30, 14, 0,
+  60, 29, 0, 164, 0, 0, 18, 0, 0, 0,
+  3, 20, 0, 48, 30, 38, 0, 0, 13, 76,
+  24, 1, 0, 0, 0, 35, 0, 48, 0, 88,
+  0, 0, 0, 20, 63, 58, 24, 0, 0, 0,
+  0, 0, 0, 11, 0, 0, 13, 0, 0, 83,
+  0, 0, 99, 0, 57, 0, 22, 0, 0, 57,
+  14, 0, 110, 0, 0, 29, 2, 76, 21, 14,
+  67, 27, 0, 44, 44, 26, 0, 0, 0, 0,
+  32, 108, 0, 10, 10, 0, 11, 0, 10, 13,
+  0, 0, 58, 0, 30, 0, 0, 71, 79, 0,
+  0, 0, 0, 18, 0, 26, 0, 0, 0, 0,
+  0, 0, 4, 4, 54, 0, 0, 35, 0, 18,
+  0, 0, 0, 17, 0, 23, 0, 111, 49, 4,
+  4, 0, 0, 13, 78, 36, 24, 0, 20, 0,
+  0, 97, 83, 24, 24, 5, 0, 0, 48, 50,
+  0, 0, 1, 78, 1, 0, 0, 0, 68, 0,
+  12, 0, 0, 28, 0, 3, 0, 0, 11, 19,
+  11, 36, 0, 0, 0, 29, 0, 18, 44, 0,
+  0, 0, 1, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 29, 0, 0, 0, 0, 0, 32, 72,
+  9, 90, 0, 112, 2, 20, 35, 0, 0, 53,
+  0, 31, 6, 61, 21, 24, 117, 0, 0, 0,
+  26, 0, 0, 0, 0, 100, 90, 0, 0, 0,
+  7, 0, 54, 21, 0, 21, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 21, 0, 0, 73, 0,
+  76, 10, 35, 0, 59, 1, 72, 42, 0, 0,
+  0, 22, 38, 13, 13, 6, 0, 7, 0, 21,
+  38, 13, 14, 0, 0, 64, 43, 11, 0, 0,
+  1, 54, 0, 38, 0, 39, 17, 0, 12, 19,
+  36, 29, 3, 0, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 0, 0, 70, 0, 0, 91, 0,
+  38, 0, 8, 0, 0, 4, 0, 0, 64, 10,
+  0, 0, 0, 114, 20, 0, 74, 27, 0, 45,
+  12, 51, 27, 0, 0, 0, 15, 101, 0, 21,
+  22, 36, 22, 0, 57, 0, 0, 0, 62, 0,
+  29, 0, 0, 72, 95, 0, 0, 0, 0, 80,
+  0, 16, 0, 0, 0, 13, 0, 0, 0, 0,
+  0, 0, 0, 33, 0, 3, 0, 0, 0, 0,
+  4, 22, 21, 0, 99, 34, 0, 157, 0, 0,
+  0, 0, 0, 17, 14, 49, 0, 0, 14, 40,
+  0, 1, 5, 82, 30, 0, 0, 0, 0, 0,
+  0, 147, 4, 78, 0, 24, 0, 23, 87, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+  42, 0, 0, 78, 0, 0, 59, 0, 56, 0,
+  27, 0, 0, 28, 13, 0, 118, 0, 0, 48,
+  0, 113, 0, 36, 68, 0, 0, 7, 28, 0,
+  17, 0, 0, 0, 10, 108, 35, 0, 27, 10,
+  7, 0, 0, 0, 13, 0, 52, 0, 0, 0,
+  0, 5, 41, 0, 0, 0, 0, 82, 0, 16,
+  0, 8, 18, 0, 0, 0, 39, 10, 84, 0,
+  0, 54, 5, 43, 0, 6, 0, 3, 0, 26,
+  104, 21, 0, 47, 20, 66, 0, 0, 53, 0,
+  0, 0, 116, 0, 0, 40, 62, 0, 2, 0,
+  11, 68, 0, 8, 23, 0, 0, 43, 3, 1,
+  13, 72, 0, 27, 24, 0, 0, 21, 96, 5,
+  13, 87, 14, 47, 59, 16, 0, 0, 0, 0,
+  0, 111, 0, 0, 107, 59, 25, 17, 19, 0,
+  0, 13, 9, 35, 0, 93, 0, 0, 13, 0,
+  155, 30, 22, 32, 0, 0, 34, 19, 0, 47,
+  0, 0, 15, 14, 42, 14, 8, 0, 73, 0,
+  0, 0, 0, 2, 0, 0, 31, 0, 21, 50,
+  0, 0, 5, 0, 30, 31, 0, 67, 22, 0,
+  17, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+  0, 3, 0, 16, 53, 0, 3, 16, 0, 0,
+  0, 0, 0, 145, 0, 0, 46, 0, 0, 0,
+  34, 21, 0, 109, 67, 48, 0, 0, 39, 1,
+  0, 58, 0, 0, 0, 56, 1, 0, 0, 0,
+  49, 0, 0, 0, 22, 71, 0, 0, 22, 0,
+  0, 3, 13, 87, 0, 0, 0, 14, 12, 53,
+  23, 0, 62, 19, 29, 0, 0, 0, 0, 48,
+  0, 0, 12, 0, 16, 0, 17, 13, 58, 0,
+  50, 76, 0, 66, 0, 52, 0, 0, 8, 0,
+  17, 64, 0, 25, 19, 0, 22, 2, 35, 128,
+  0, 0, 75, 0, 0, 0, 0, 93, 86, 0,
+  0, 0, 15, 0, 0, 38, 0, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 4, 15, 0, 0, 92, 0,
+  0, 76, 0, 0, 44, 0, 0, 15, 13, 93,
+  0, 13, 41, 74, 27, 0, 22, 35, 4, 32,
+  0, 0, 0, 34, 0, 0, 18, 4, 5, 0,
+  0, 0, 14, 65, 0, 0, 0, 14, 0, 0,
+  0, 18, 0, 0, 0, 0, 19, 112, 26, 0,
+  66, 0, 49, 0, 1, 0, 0, 12, 0, 0,
+  37, 7, 27, 10, 26, 96, 0, 0, 36, 15,
+  0, 30, 0, 21, 0, 0, 0, 0, 33, 83,
+  0, 28, 14, 34, 42, 0, 16, 32, 0, 0,
+  39, 0, 0, 0, 13, 107, 45, 0, 0, 0,
+  3, 18, 0, 20, 0, 5, 17, 0, 0, 0,
+  49, 0, 46, 44, 22, 4, 0, 0, 0, 0,
+  20, 0, 0, 18, 107, 66, 16, 65, 30, 0,
+  0, 17, 71, 14, 28, 0, 85, 0, 0, 80,
+  60, 0, 13, 0, 0, 32, 32, 6, 0, 0,
+  0, 61, 0, 37, 19, 69, 10, 6, 18, 5,
+  0, 44, 103, 0, 0, 23, 0, 23, 18, 0,
+  0, 0, 0, 0, 0, 86, 0, 0, 83, 13,
+  32, 36, 9, 0, 0, 0, 0, 0, 15, 55,
+  0, 0, 11, 0, 91, 19, 43, 55, 0, 39,
+  28, 49, 0, 26, 0, 0, 19, 64, 28, 26,
+  14, 0, 86, 0, 32, 0, 0, 14, 0, 0,
+  66, 0, 5, 67, 43, 0, 9, 0, 0, 58,
+  0, 60, 9, 0, 6, 0, 0, 0, 0, 0,
+  0, 0, 0, 15, 0, 4, 0, 18, 46, 15,
+  12, 30, 14, 0, 60, 29, 0, 164, 0, 0,
+  18, 0, 0, 0, 3, 20, 0, 48, 30, 38,
+  0, 0, 13, 76, 24, 1, 0, 0, 0, 35,
+  0, 48, 0, 88, 0, 0, 0, 20, 63, 58,
+  24, 0, 0, 0, 0, 0, 0, 11, 0, 0,
+  13, 0, 0, 83, 0, 0, 99, 0, 57, 0,
+  22, 0, 0, 57, 14, 0, 110, 0, 0, 29,
+  2, 76, 21, 14, 67, 27, 0, 44, 44, 26,
+  0, 0, 0, 0, 32, 108, 0, 10, 10, 0,
+  11, 0, 10, 13, 0, 0, 58, 0, 30, 0,
+  0, 71, 79, 0, 0, 0, 0, 18, 0, 26,
+  0, 0, 0, 0, 0, 0, 4, 4, 54, 0,
+  0, 35, 0, 18, 0, 0, 0, 17, 0, 23,
+  0, 0, 70, 0, 4, 150, 0, 0, 0, 0,
+  0, 1, 23, 94, 0, 0, 0, 44, 0, 0,
+  21, 54, 0, 39, 0, 0, 0, 0, 0, 45,
+  16, 26, 0, 7, 0, 0, 0, 50, 0, 0,
+  0, 11, 0, 27, 0, 8, 1, 0, 0, 0,
+  12, 123, 0, 0, 39, 0, 39, 0, 42, 0,
+  0, 32, 0, 0, 97, 0, 0, 31, 0, 64,
+  0, 26, 51, 0, 0, 17, 0, 0, 0, 0,
+  0, 0, 27, 70, 21, 0, 16, 15, 54, 0,
+  0, 0, 24, 0, 2, 0, 0, 0, 0, 60,
+  12, 0, 0, 0, 0, 79, 0, 14, 0, 5,
+  25, 0, 0, 14, 51, 41, 105, 41, 29, 52,
+  23, 0, 0, 0, 17, 23, 0, 13, 59, 1,
+  72, 42, 0, 0, 0, 22, 38, 13, 13, 6,
+  0, 7, 0, 21, 38, 13, 14, 0, 0, 64,
+  43, 11, 0, 0, 1, 54, 0, 38, 0, 39,
+  17, 0, 12, 19, 36, 29, 3, 0, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 0, 0, 70,
+  0, 0, 91, 0, 38, 0, 8, 0, 0, 4,
+  0, 0, 64, 10, 0, 0, 0, 114, 20, 0,
+  74, 27, 0, 45, 12, 51, 27, 0, 0, 0,
+  15, 101, 0, 21, 22, 36, 22, 0, 57, 0,
+  0, 0, 62, 0, 29, 0, 0, 72, 95, 0,
+  0, 0, 0, 80, 0, 16, 0, 0, 0, 13,
+  0, 0, 0, 0, 0, 0, 0, 33, 0, 3,
+  0, 0, 0, 0, 4, 22, 21, 0, 99, 34,
+  0, 157, 0, 0, 0, 0, 0, 17, 14, 49,
+  0, 0, 14, 40, 0, 1, 5, 82, 30, 0,
+  0, 0, 0, 0, 0, 147, 4, 78, 0, 24,
+  0, 23, 87, 19, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 3, 42, 0, 0, 78, 0, 0,
+  59, 0, 56, 0, 27, 0, 0, 28, 13, 0,
+  118, 0, 0, 48, 0, 113, 0, 36, 68, 0,
+  0, 7, 28, 0, 17, 0, 0, 0, 10, 108,
+  35, 0, 27, 10, 7, 0, 0, 0, 13, 0,
+  52, 0, 0, 0, 0, 5, 41, 0, 0, 0,
+  0, 82, 0, 16, 0, 8, 18, 0, 0, 0,
+  39, 10, 84, 0, 0, 54, 5, 43, 0, 6,
+  0, 3, 0, 26, 0, 9, 38, 0, 15, 120,
+  0, 0, 0, 0, 0, 3, 58, 72, 0, 0,
+  0, 18, 0, 18, 44, 0, 0, 51, 0, 3,
+  0, 0, 0, 91, 41, 0, 0, 22, 0, 0,
+  0, 22, 0, 25, 0, 45, 0, 53, 1, 0,
+  0, 32, 0, 0, 0, 70, 11, 0, 0, 0,
+  19, 0, 13, 14, 0, 9, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 58, 10, 0, 0, 20,
+  0, 0, 2, 19, 0, 27, 10, 28, 51, 0,
+  32, 5, 54, 4, 0, 0, 52, 5, 0, 37,
+  0, 0, 0, 30, 0, 0, 0, 0, 3, 4,
+  0, 16, 10, 25, 57, 0, 0, 17, 37, 0,
+  63, 43, 24, 47, 55, 1, 2, 0, 25, 2,
+  0, 0, 0, 0, 0, 0, 0, 145, 0, 0,
+  46, 0, 0, 0, 34, 21, 0, 109, 67, 48,
+  0, 0, 39, 1, 0, 58, 0, 0, 0, 56,
+  1, 0, 0, 0, 49, 0, 0, 0, 22, 71,
+  0, 0, 22, 0, 0, 3, 13, 87, 0, 0,
+  0, 14, 12, 53, 23, 0, 62, 19, 29, 0,
+  0, 0, 0, 48, 0, 0, 12, 0, 16, 0,
+  17, 13, 58, 0, 50, 76, 0, 66, 0, 52,
+  0, 0, 8, 0, 17, 64, 0, 25, 19, 0,
+  22, 2, 35, 128, 0, 0, 75, 0, 0, 0,
+  0, 93, 86, 0, 0, 0, 15, 0, 0, 38,
+  0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 4, 15,
+  0, 0, 92, 0, 0, 76, 0, 0, 44, 0,
+  0, 15, 13, 93, 0, 13, 41, 74, 27, 0,
+  22, 35, 4, 32, 0, 0, 0, 34, 0, 0,
+  18, 4, 5, 0, 0, 0, 14, 65, 0, 0,
+  0, 14, 0, 0, 0, 18, 0, 0, 0, 0,
+  19, 112, 26, 0, 66, 0, 49, 0, 1, 0,
+  0, 12, 0, 0, 37, 7, 27, 10, 26, 96,
+  0, 0, 36, 15, 0, 30, 0, 21, 0, 0,
+  0, 0, 33, 83, 0, 28, 14, 34, 42, 0,
+  16, 32, 0, 0, 39, 0, 0, 0, 13, 107,
+  45, 0, 0, 0, 3, 18, 0, 20, 0, 5,
+  17, 0, 0, 0, 49, 0, 46, 44, 22, 4,
+  0, 0, 0, 0, 20, 0, 0, 18, 0, 0,
+  91, 0, 0, 56, 0, 0, 0, 0, 0, 21,
+  6, 68, 0, 0, 3, 66, 22, 26, 0, 44,
+  1, 12, 25, 0, 0, 0, 0, 0, 35, 19,
+  0, 0, 0, 0, 0, 41, 0, 0, 0, 9,
+  0, 13, 0, 4, 17, 0, 0, 0, 11, 90,
+  12, 0, 37, 0, 34, 0, 44, 0, 0, 20,
+  0, 0, 71, 0, 0, 58, 0, 66, 0, 22,
+  34, 0, 4, 12, 0, 0, 14, 0, 0, 0,
+  11, 67, 48, 0, 47, 25, 46, 0, 0, 0,
+  0, 0, 2, 0, 0, 5, 16, 47, 0, 0,
+  0, 1, 0, 93, 0, 9, 0, 23, 27, 12,
+  0, 4, 70, 6, 57, 62, 45, 37, 28, 1,
+  0, 0, 18, 8, 3, 27, 14, 0, 60, 29,
+  0, 164, 0, 0, 18, 0, 0, 0, 3, 20,
+  0, 48, 30, 38, 0, 0, 13, 76, 24, 1,
+  0, 0, 0, 35, 0, 48, 0, 88, 0, 0,
+  0, 20, 63, 58, 24, 0, 0, 0, 0, 0,
+  0, 11, 0, 0, 13, 0, 0, 83, 0, 0,
+  99, 0, 57, 0, 22, 0, 0, 57, 14, 0,
+  110, 0, 0, 29, 2, 76, 21, 14, 67, 27,
+  0, 44, 44, 26, 0, 0, 0, 0, 32, 108,
+  0, 10, 10, 0, 11, 0, 10, 13, 0, 0,
+  58, 0, 30, 0, 0, 71, 79, 0, 0, 0,
+  0, 18, 0, 26, 0, 0, 0, 0, 0, 0,
+  4, 4, 54, 0, 0, 35, 0, 18, 0, 0,
+  0, 17, 0, 23, 0, 0, 70, 0, 4, 150,
+  0, 0, 0, 0, 0, 1, 23, 94, 0, 0,
+  0, 44, 0, 0, 21, 54, 0, 39, 0, 0,
+  0, 0, 0, 45, 16, 26, 0, 7, 0, 0,
+  0, 50, 0, 0, 0, 11, 0, 27, 0, 8,
+  1, 0, 0, 0, 12, 123, 0, 0, 39, 0,
+  39, 0, 42, 0, 0, 32, 0, 0, 97, 0,
+  0, 31, 0, 64, 0, 26, 51, 0, 0, 17,
+  0, 0, 0, 0, 0, 0, 27, 70, 21, 0,
+  16, 15, 54, 0, 0, 0, 24, 0, 2, 0,
+  0, 0, 0, 60, 12, 0, 0, 0, 0, 79,
+  0, 14, 0, 5, 25, 0, 0, 14, 51, 41,
+  105, 41, 29, 52, 23, 0, 0, 0, 17, 23,
+  0, 13, 0, 43, 48, 0, 24, 32, 13, 0,
+  8, 0, 0, 0, 63, 49, 0, 0, 3, 17,
+  8, 10, 0, 0, 0, 37, 41, 35, 6, 0,
+  0, 48, 48, 0, 0, 14, 0, 0, 0, 2,
+  0, 39, 0, 40, 0, 41, 21, 0, 3, 0,
+  0, 0, 0, 40, 61, 0, 0, 0, 14, 6,
+  2, 35, 0, 6, 0, 21, 0, 0, 0, 27,
+  0, 0, 0, 32, 20, 0, 21, 28, 0, 0,
+  0, 25, 16, 25, 21, 40, 63, 0, 39, 18,
+  50, 13, 0, 0, 32, 28, 0, 22, 0, 38,
+  15, 31, 0, 0, 0, 0, 0, 28, 14, 0,
+  53, 57, 40, 0, 0, 20, 46, 0, 33, 38,
+  62, 29, 61, 16, 47, 0, 46, 37, 0, 1,
+  21, 0, 99, 34, 0, 157, 0, 0, 0, 0,
+  0, 17, 14, 49, 0, 0, 14, 40, 0, 1,
+  5, 82, 30, 0, 0, 0, 0, 0, 0, 147,
+  4, 78, 0, 24, 0, 23, 87, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 3, 42, 0,
+  0, 78, 0, 0, 59, 0, 56, 0, 27, 0,
+  0, 28, 13, 0, 118, 0, 0, 48, 0, 113,
+  0, 36, 68, 0, 0, 7, 28, 0, 17, 0,
+  0, 0, 10, 108, 35, 0, 27, 10, 7, 0,
+  0, 0, 13, 0, 52, 0, 0, 0, 0, 5,
+  41, 0, 0, 0, 0, 82, 0, 16, 0, 8,
+  18, 0, 0, 0, 39, 10, 84, 0, 0, 54,
+  5, 43, 0, 6, 0, 3, 0, 26, 0, 9,
+  38, 0, 15, 120, 0, 0, 0, 0, 0, 3,
+  58, 72, 0, 0, 0, 18, 0, 18, 44, 0,
+  0, 51, 0, 3, 0, 0, 0, 91, 41, 0,
+  0, 22, 0, 0, 0, 22, 0, 25, 0, 45,
+  0, 53, 1, 0, 0, 32, 0, 0, 0, 70,
+  11, 0, 0, 0, 19, 0, 13, 14, 0, 9,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 58,
+  10, 0, 0, 20, 0, 0, 2, 19, 0, 27,
+  10, 28, 51, 0, 32, 5, 54, 4, 0, 0,
+  52, 5, 0, 37, 0, 0, 0, 30, 0, 0,
+  0, 0, 3, 4, 0, 16, 10, 25, 57, 0,
+  0, 17, 37, 0, 63, 43, 24, 47, 55, 1,
+  2, 0, 25, 2, 0, 0, 0, 70, 65, 0,
+  63, 0, 15, 0, 1, 0, 14, 0, 64, 75,
+  0, 51, 17, 7, 26, 16, 9, 0, 0, 47,
+  38, 59, 0, 0, 0, 0, 53, 0, 0, 37,
+  12, 0, 0, 0, 0, 53, 50, 43, 24, 71,
+  73, 0, 0, 0, 0, 0, 0, 26, 50, 0,
+  0, 0, 0, 20, 1, 27, 24, 0, 0, 63,
+  0, 2, 29, 0, 0, 0, 0, 0, 7, 41,
+  16, 12, 0, 17, 0, 23, 46, 34, 33, 22,
+  87, 14, 32, 4, 49, 40, 0, 20, 24, 31,
+  0, 54, 0, 35, 3, 41, 0, 0, 0, 0,
+  0, 0, 7, 10, 34, 32, 82, 0, 0, 13,
+  31, 0, 0, 29, 54, 8, 7, 0, 55, 0,
+  75, 11, 2, 0, 0, 0, 92, 0, 0, 76,
+  0, 0, 44, 0, 0, 15, 13, 93, 0, 13,
+  41, 74, 27, 0, 22, 35, 4, 32, 0, 0,
+  0, 34, 0, 0, 18, 4, 5, 0, 0, 0,
+  14, 65, 0, 0, 0, 14, 0, 0, 0, 18,
+  0, 0, 0, 0, 19, 112, 26, 0, 66, 0,
+  49, 0, 1, 0, 0, 12, 0, 0, 37, 7,
+  27, 10, 26, 96, 0, 0, 36, 15, 0, 30,
+  0, 21, 0, 0, 0, 0, 33, 83, 0, 28,
+  14, 34, 42, 0, 16, 32, 0, 0, 39, 0,
+  0, 0, 13, 107, 45, 0, 0, 0, 3, 18,
+  0, 20, 0, 5, 17, 0, 0, 0, 49, 0,
+  46, 44, 22, 4, 0, 0, 0, 0, 20, 0,
+  0, 18, 0, 0, 91, 0, 0, 56, 0, 0,
+  0, 0, 0, 21, 6, 68, 0, 0, 3, 66,
+  22, 26, 0, 44, 1, 12, 25, 0, 0, 0,
+  0, 0, 35, 19, 0, 0, 0, 0, 0, 41,
+  0, 0, 0, 9, 0, 13, 0, 4, 17, 0,
+  0, 0, 11, 90, 12, 0, 37, 0, 34, 0,
+  44, 0, 0, 20, 0, 0, 71, 0, 0, 58,
+  0, 66, 0, 22, 34, 0, 4, 12, 0, 0,
+  14, 0, 0, 0, 11, 67, 48, 0, 47, 25,
+  46, 0, 0, 0, 0, 0, 2, 0, 0, 5,
+  16, 47, 0, 0, 0, 1, 0, 93, 0, 9,
+  0, 23, 27, 12, 0, 4, 70, 6, 57, 62,
+  45, 37, 28, 1, 0, 0, 18, 8, 3, 27,
+  0, 16, 49, 0, 0, 5, 31, 0, 1, 0,
+  0, 6, 0, 41, 0, 0, 0, 25, 35, 4,
+  0, 0, 0, 52, 24, 0, 16, 5, 179, 11,
+  21, 0, 23, 0, 0, 0, 0, 11, 0, 43,
+  0, 24, 1, 8, 2, 65, 31, 0, 0, 0,
+  0, 37, 49, 0, 7, 0, 6, 0, 40, 14,
+  28, 28, 0, 0, 0, 18, 44, 18, 0, 7,
+  0, 39, 35, 0, 13, 18, 0, 0, 20, 0,
+  17, 2, 0, 51, 0, 0, 32, 30, 78, 35,
+  0, 0, 40, 0, 0, 22, 0, 0, 33, 23,
+  14, 18, 8, 0, 15, 74, 44, 16, 21, 36,
+  0, 12, 0, 0, 6, 34, 56, 40, 46, 34,
+  33, 8, 0, 0, 18, 0, 14, 30, 0, 0,
+  70, 0, 4, 150, 0, 0, 0, 0, 0, 1,
+  23, 94, 0, 0, 0, 44, 0, 0, 21, 54,
+  0, 39, 0, 0, 0, 0, 0, 45, 16, 26,
+  0, 7, 0, 0, 0, 50, 0, 0, 0, 11,
+  0, 27, 0, 8, 1, 0, 0, 0, 12, 123,
+  0, 0, 39, 0, 39, 0, 42, 0, 0, 32,
+  0, 0, 97, 0, 0, 31, 0, 64, 0, 26,
+  51, 0, 0, 17, 0, 0, 0, 0, 0, 0,
+  27, 70, 21, 0, 16, 15, 54, 0, 0, 0,
+  24, 0, 2, 0, 0, 0, 0, 60, 12, 0,
+  0, 0, 0, 79, 0, 14, 0, 5, 25, 0,
+  0, 14, 51, 41, 105, 41, 29, 52, 23, 0,
+  0, 0, 17, 23, 0, 13, 0, 43, 48, 0,
+  24, 32, 13, 0, 8, 0, 0, 0, 63, 49,
+  0, 0, 3, 17, 8, 10, 0, 0, 0, 37,
+  41, 35, 6, 0, 0, 48, 48, 0, 0, 14,
+  0, 0, 0, 2, 0, 39, 0, 40, 0, 41,
+  21, 0, 3, 0, 0, 0, 0, 40, 61, 0,
+  0, 0, 14, 6, 2, 35, 0, 6, 0, 21,
+  0, 0, 0, 27, 0, 0, 0, 32, 20, 0,
+  21, 28, 0, 0, 0, 25, 16, 25, 21, 40,
+  63, 0, 39, 18, 50, 13, 0, 0, 32, 28,
+  0, 22, 0, 38, 15, 31, 0, 0, 0, 0,
+  0, 28, 14, 0, 53, 57, 40, 0, 0, 20,
+  46, 0, 33, 38, 62, 29, 61, 16, 47, 0,
+  46, 37, 0, 1, 0, 41, 74, 0, 7, 0,
+  37, 0, 26, 0, 0, 0, 8, 45, 0, 15,
+  14, 0, 13, 0, 0, 0, 20, 55, 23, 53,
+  16, 0, 159, 1, 19, 0, 8, 19, 20, 0,
+  0, 0, 0, 81, 7, 52, 28, 35, 49, 21,
+  9, 3, 0, 0, 0, 24, 50, 0, 0, 0,
+  1, 33, 4, 24, 7, 14, 0, 0, 0, 27,
+  51, 0, 10, 0, 0, 31, 38, 26, 32, 14,
+  0, 0, 0, 32, 48, 29, 26, 13, 31, 0,
+  3, 25, 74, 17, 4, 0, 45, 17, 0, 32,
+  0, 0, 21, 15, 0, 0, 0, 0, 6, 22,
+  50, 8, 38, 32, 47, 0, 0, 0, 1, 0,
+  13, 0, 30, 2, 0, 0, 24, 0, 46, 24,
+  32, 0, 0, 9, 38, 0, 15, 120, 0, 0,
+  0, 0, 0, 3, 58, 72, 0, 0, 0, 18,
+  0, 18, 44, 0, 0, 51, 0, 3, 0, 0,
+  0, 91, 41, 0, 0, 22, 0, 0, 0, 22,
+  0, 25, 0, 45, 0, 53, 1, 0, 0, 32,
+  0, 0, 0, 70, 11, 0, 0, 0, 19, 0,
+  13, 14, 0, 9, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 58, 10, 0, 0, 20, 0, 0,
+  2, 19, 0, 27, 10, 28, 51, 0, 32, 5,
+  54, 4, 0, 0, 52, 5, 0, 37, 0, 0,
+  0, 30, 0, 0, 0, 0, 3, 4, 0, 16,
+  10, 25, 57, 0, 0, 17, 37, 0, 63, 43,
+  24, 47, 55, 1, 2, 0, 25, 2, 0, 0,
+  0, 70, 65, 0, 63, 0, 15, 0, 1, 0,
+  14, 0, 64, 75, 0, 51, 17, 7, 26, 16,
+  9, 0, 0, 47, 38, 59, 0, 0, 0, 0,
+  53, 0, 0, 37, 12, 0, 0, 0, 0, 53,
+  50, 43, 24, 71, 73, 0, 0, 0, 0, 0,
+  0, 26, 50, 0, 0, 0, 0, 20, 1, 27,
+  24, 0, 0, 63, 0, 2, 29, 0, 0, 0,
+  0, 0, 7, 41, 16, 12, 0, 17, 0, 23,
+  46, 34, 33, 22, 87, 14, 32, 4, 49, 40,
+  0, 20, 24, 31, 0, 54, 0, 35, 3, 41,
+  0, 0, 0, 0, 0, 0, 7, 10, 34, 32,
+  82, 0, 0, 13, 31, 0, 0, 29, 54, 8,
+  7, 0, 55, 0, 75, 11, 2, 0, 0, 0,
+  119, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 103, 0, 9, 0, 6, 10, 5, 9, 50,
+  108, 24, 0, 0, 0, 8, 184, 0, 22, 0,
+  0, 31, 0, 0, 11, 12, 0, 10, 106, 0,
+  19, 21, 57, 33, 0, 2, 16, 0, 0, 65,
+  0, 0, 30, 0, 14, 26, 31, 0, 30, 40,
+  20, 0, 16, 5, 36, 0, 0, 70, 0, 0,
+  38, 61, 0, 0, 13, 0, 0, 0, 25, 10,
+  0, 19, 7, 11, 0, 47, 49, 0, 0, 54,
+  39, 0, 33, 24, 0, 0, 0, 22, 19, 7,
+  17, 0, 40, 27, 0, 5, 0, 0, 50, 3,
+  0, 0, 37, 20, 52, 0, 0, 30, 0, 0,
+  0, 0, 2, 25, 2, 0, 0, 0, 91, 0,
+  0, 56, 0, 0, 0, 0, 0, 21, 6, 68,
+  0, 0, 3, 66, 22, 26, 0, 44, 1, 12,
+  25, 0, 0, 0, 0, 0, 35, 19, 0, 0,
+  0, 0, 0, 41, 0, 0, 0, 9, 0, 13,
+  0, 4, 17, 0, 0, 0, 11, 90, 12, 0,
+  37, 0, 34, 0, 44, 0, 0, 20, 0, 0,
+  71, 0, 0, 58, 0, 66, 0, 22, 34, 0,
+  4, 12, 0, 0, 14, 0, 0, 0, 11, 67,
+  48, 0, 47, 25, 46, 0, 0, 0, 0, 0,
+  2, 0, 0, 5, 16, 47, 0, 0, 0, 1,
+  0, 93, 0, 9, 0, 23, 27, 12, 0, 4,
+  70, 6, 57, 62, 45, 37, 28, 1, 0, 0,
+  18, 8, 3, 27, 0, 16, 49, 0, 0, 5,
+  31, 0, 1, 0, 0, 6, 0, 41, 0, 0,
+  0, 25, 35, 4, 0, 0, 0, 52, 24, 0,
+  16, 5, 179, 11, 21, 0, 23, 0, 0, 0,
+  0, 11, 0, 43, 0, 24, 1, 8, 2, 65,
+  31, 0, 0, 0, 0, 37, 49, 0, 7, 0,
+  6, 0, 40, 14, 28, 28, 0, 0, 0, 18,
+  44, 18, 0, 7, 0, 39, 35, 0, 13, 18,
+  0, 0, 20, 0, 17, 2, 0, 51, 0, 0,
+  32, 30, 78, 35, 0, 0, 40, 0, 0, 22,
+  0, 0, 33, 23, 14, 18, 8, 0, 15, 74,
+  44, 16, 21, 36, 0, 12, 0, 0, 6, 34,
+  56, 40, 46, 34, 33, 8, 0, 0, 18, 0,
+  14, 30, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 43, 48, 0, 24, 32, 13, 0, 8, 0,
+  0, 0, 63, 49, 0, 0, 3, 17, 8, 10,
+  0, 0, 0, 37, 41, 35, 6, 0, 0, 48,
+  48, 0, 0, 14, 0, 0, 0, 2, 0, 39,
+  0, 40, 0, 41, 21, 0, 3, 0, 0, 0,
+  0, 40, 61, 0, 0, 0, 14, 6, 2, 35,
+  0, 6, 0, 21, 0, 0, 0, 27, 0, 0,
+  0, 32, 20, 0, 21, 28, 0, 0, 0, 25,
+  16, 25, 21, 40, 63, 0, 39, 18, 50, 13,
+  0, 0, 32, 28, 0, 22, 0, 38, 15, 31,
+  0, 0, 0, 0, 0, 28, 14, 0, 53, 57,
+  40, 0, 0, 20, 46, 0, 33, 38, 62, 29,
+  61, 16, 47, 0, 46, 37, 0, 1, 0, 41,
+  74, 0, 7, 0, 37, 0, 26, 0, 0, 0,
+  8, 45, 0, 15, 14, 0, 13, 0, 0, 0,
+  20, 55, 23, 53, 16, 0, 159, 1, 19, 0,
+  8, 19, 20, 0, 0, 0, 0, 81, 7, 52,
+  28, 35, 49, 21, 9, 3, 0, 0, 0, 24,
+  50, 0, 0, 0, 1, 33, 4, 24, 7, 14,
+  0, 0, 0, 27, 51, 0, 10, 0, 0, 31,
+  38, 26, 32, 14, 0, 0, 0, 32, 48, 29,
+  26, 13, 31, 0, 3, 25, 74, 17, 4, 0,
+  45, 17, 0, 32, 0, 0, 21, 15, 0, 0,
+  0, 0, 6, 22, 50, 8, 38, 32, 47, 0,
+  0, 0, 1, 0, 13, 0, 30, 2, 0, 0,
+  24, 0, 46, 24, 32, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 70, 65, 0, 63, 0,
+  15, 0, 1, 0, 14, 0, 64, 75, 0, 51,
+  17, 7, 26, 16, 9, 0, 0, 47, 38, 59,
+  0, 0, 0, 0, 53, 0, 0, 37, 12, 0,
+  0, 0, 0, 53, 50, 43, 24, 71, 73, 0,
+  0, 0, 0, 0, 0, 26, 50, 0, 0, 0,
+  0, 20, 1, 27, 24, 0, 0, 63, 0, 2,
+  29, 0, 0, 0, 0, 0, 7, 41, 16, 12,
+  0, 17, 0, 23, 46, 34, 33, 22, 87, 14,
+  32, 4, 49, 40, 0, 20, 24, 31, 0, 54,
+  0, 35, 3, 41, 0, 0, 0, 0, 0, 0,
+  7, 10, 34, 32, 82, 0, 0, 13, 31, 0,
+  0, 29, 54, 8, 7, 0, 55, 0, 75, 11,
+  2, 0, 0, 0, 119, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 103, 0, 9, 0, 6,
+  10, 5, 9, 50, 108, 24, 0, 0, 0, 8,
+  184, 0, 22, 0, 0, 31, 0, 0, 11, 12,
+  0, 10, 106, 0, 19, 21, 57, 33, 0, 2,
+  16, 0, 0, 65, 0, 0, 30, 0, 14, 26,
+  31, 0, 30, 40, 20, 0, 16, 5, 36, 0,
+  0, 70, 0, 0, 38, 61, 0, 0, 13, 0,
+  0, 0, 25, 10, 0, 19, 7, 11, 0, 47,
+  49, 0, 0, 54, 39, 0, 33, 24, 0, 0,
+  0, 22, 19, 7, 17, 0, 40, 27, 0, 5,
+  0, 0, 50, 3, 0, 0, 37, 20, 52, 0,
+  0, 30, 0, 0, 0, 0, 2, 25, 2, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 47, 23, 86, 28,
+  0, 0, 29, 6, 18, 0, 12, 0, 0, 94,
+  0, 55, 94, 25, 14, 29, 7, 39, 13, 18,
+  25, 0, 29, 32, 164, 9, 5, 45, 79, 0,
+  0, 0, 0, 37, 0, 0, 0, 4, 0, 10,
+  7, 71, 53, 0, 0, 0, 0, 40, 22, 15,
+  17, 0, 13, 0, 0, 3, 39, 29, 0, 0,
+  0, 0, 72, 0, 119, 51, 0, 0, 21, 0,
+  24, 0, 65, 11, 0, 23, 14, 0, 42, 0,
+  0, 26, 0, 0, 59, 5, 0, 16, 0, 5,
+  15, 0, 38, 1, 14, 93, 25, 0, 14, 51,
+  54, 47, 12, 0, 25, 0, 4, 10, 0, 41,
+  10, 0, 18, 0, 17, 0, 59, 0, 0, 0,
+  0, 24, 48, 21, 43, 69, 0, 8, 5, 11,
+  0, 0, 0, 0, 0, 0, 16, 73, 0, 0,
+  82, 18, 0, 0, 0, 41, 0, 50, 15, 0,
+  5, 16, 0, 0, 0, 19, 83, 23, 0, 0,
+  0, 9, 0, 0, 0, 6, 0, 0, 9, 74,
+  35, 102, 0, 0, 0, 29, 56, 0, 22, 0,
+  18, 0, 0, 0, 78, 24, 0, 51, 0, 0,
+  97, 0, 107, 49, 0, 0, 4, 13, 45, 0,
+  27, 0, 0, 5, 25, 0, 35, 12, 0, 12,
+  0, 6, 0, 6, 0, 26, 0, 19, 1, 0,
+  34, 0, 12, 95, 20, 81, 35, 21, 44, 44,
+  10, 0, 51, 0, 0, 63, 0, 7, 0, 0,
+  0, 0, 11, 0, 22, 0, 33, 0, 0, 27,
+  27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  23, 32, 93, 27, 1, 9, 26, 5, 18, 0,
+  0, 0, 0, 103, 0, 30, 67, 4, 0, 16,
+  13, 75, 10, 41, 20, 0, 6, 20, 201, 42,
+  3, 62, 71, 0, 24, 0, 0, 56, 0, 4,
+  5, 32, 0, 22, 9, 88, 48, 0, 0, 0,
+  0, 51, 21, 3, 55, 0, 44, 0, 32, 0,
+  31, 72, 0, 0, 0, 0, 48, 9, 120, 30,
+  0, 10, 58, 0, 32, 0, 53, 0, 0, 37,
+  0, 0, 36, 11, 0, 15, 0, 0, 58, 5,
+  0, 0, 0, 3, 0, 36, 0, 0, 40, 101,
+  17, 0, 0, 52, 55, 89, 20, 0, 9, 0,
+  2, 9, 0, 33, 6, 2, 40, 0, 19, 12,
+  51, 0, 0, 0, 3, 0, 39, 30, 0, 67,
+  0, 11, 0, 33, 2, 0, 0, 0, 0, 17,
+  28, 49, 0, 0, 52, 3, 0, 0, 28, 58,
+  0, 42, 19, 0, 0, 8, 0, 9, 0, 26,
+  82, 21, 0, 0, 0, 27, 0, 8, 0, 40,
+  0, 22, 24, 91, 9, 110, 0, 0, 0, 27,
+  50, 0, 37, 0, 28, 0, 14, 0, 55, 50,
+  0, 43, 0, 0, 49, 11, 81, 0, 4, 0,
+  22, 7, 42, 0, 12, 0, 0, 26, 21, 0,
+  21, 24, 0, 0, 0, 0, 0, 9, 0, 0,
+  0, 9, 0, 20, 0, 0, 47, 83, 0, 52,
+  17, 21, 41, 51, 25, 0, 40, 5, 0, 40,
+  0, 11, 0, 0, 21, 0, 13, 13, 31, 0,
+  15, 0, 35, 1, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 13, 24, 67, 6, 0, 18,
+  27, 22, 0, 0, 0, 0, 0, 97, 0, 0,
+  60, 4, 0, 5, 27, 86, 27, 52, 0, 0,
+  8, 9, 193, 55, 1, 28, 52, 0, 59, 1,
+  0, 58, 0, 17, 14, 39, 0, 14, 26, 83,
+  17, 0, 2, 0, 0, 64, 30, 0, 71, 0,
+  60, 0, 49, 0, 15, 71, 0, 0, 0, 0,
+  7, 6, 77, 33, 0, 22, 82, 11, 31, 27,
+  25, 0, 20, 13, 0, 0, 15, 5, 0, 0,
+  0, 0, 62, 3, 0, 0, 23, 0, 15, 37,
+  0, 0, 49, 67, 15, 0, 0, 37, 46, 75,
+  26, 0, 0, 6, 1, 16, 0, 37, 12, 0,
+  55, 0, 9, 28, 40, 0, 0, 0, 4, 0,
+  26, 26, 0, 60, 0, 15, 0, 5, 36, 23,
+  2, 0, 0, 31, 86, 8, 0, 0, 59, 11,
+  0, 0, 65, 56, 0, 25, 23, 0, 0, 13,
+  0, 13, 0, 11, 92, 0, 18, 0, 0, 32,
+  0, 53, 0, 28, 0, 44, 48, 94, 4, 86,
+  0, 7, 0, 38, 52, 0, 35, 0, 21, 0,
+  24, 0, 13, 27, 0, 40, 0, 11, 10, 0,
+  33, 0, 8, 0, 25, 13, 37, 0, 0, 0,
+  0, 15, 39, 0, 14, 13, 0, 0, 0, 0,
+  0, 24, 0, 0, 0, 13, 0, 47, 0, 0,
+  62, 50, 3, 0, 0, 13, 20, 1, 44, 0,
+  24, 28, 0, 29, 0, 15, 0, 0, 25, 0,
+  11, 10, 47, 0, 42, 0, 79, 0, 14, 0,
+  47, 23, 86, 28, 0, 0, 29, 6, 18, 0,
+  12, 0, 0, 94, 0, 55, 94, 25, 14, 29,
+  7, 39, 13, 18, 25, 0, 29, 32, 164, 9,
+  5, 45, 79, 0, 0, 0, 0, 37, 0, 0,
+  0, 4, 0, 10, 7, 71, 53, 0, 0, 0,
+  0, 40, 22, 15, 17, 0, 13, 0, 0, 3,
+  39, 29, 0, 0, 0, 0, 72, 0, 119, 51,
+  0, 0, 21, 0, 24, 0, 65, 11, 0, 23,
+  14, 0, 42, 0, 0, 26, 0, 0, 59, 5,
+  0, 16, 0, 5, 15, 0, 38, 1, 14, 93,
+  25, 0, 14, 51, 54, 47, 12, 0, 25, 0,
+  4, 10, 0, 41, 10, 0, 18, 0, 17, 0,
+  59, 0, 0, 0, 0, 24, 48, 21, 43, 69,
+  0, 8, 5, 11, 0, 0, 0, 0, 0, 0,
+  16, 73, 0, 0, 82, 18, 0, 0, 0, 41,
+  0, 50, 15, 0, 5, 16, 0, 0, 0, 19,
+  83, 23, 0, 0, 0, 9, 0, 0, 0, 6,
+  0, 0, 9, 74, 35, 102, 0, 0, 0, 29,
+  56, 0, 22, 0, 18, 0, 0, 0, 78, 24,
+  0, 51, 0, 0, 97, 0, 107, 49, 0, 0,
+  4, 13, 45, 0, 27, 0, 0, 5, 25, 0,
+  35, 12, 0, 12, 0, 6, 0, 6, 0, 26,
+  0, 19, 1, 0, 34, 0, 12, 95, 20, 81,
+  35, 21, 44, 44, 10, 0, 51, 0, 0, 63,
+  0, 7, 0, 0, 0, 0, 11, 0, 22, 0,
+  33, 0, 0, 27, 27, 0, 0, 39, 39, 29,
+  0, 48, 7, 15, 23, 0, 0, 11, 81, 0,
+  0, 23, 58, 7, 0, 0, 0, 63, 0, 21,
+  41, 0, 0, 12, 0, 0, 0, 32, 67, 3,
+  1, 0, 0, 13, 0, 47, 0, 18, 41, 13,
+  22, 69, 25, 53, 0, 12, 0, 37, 21, 7,
+  22, 0, 22, 0, 0, 0, 16, 31, 0, 29,
+  0, 0, 7, 0, 37, 0, 18, 0, 9, 21,
+  4, 0, 5, 11, 0, 39, 27, 0, 62, 62,
+  0, 0, 0, 0, 0, 18, 1, 0, 0, 19,
+  0, 19, 32, 0, 0, 78, 11, 0, 0, 10,
+  15, 0, 33, 0, 0, 0, 0, 8, 0, 0,
+  0, 0, 7, 0, 0, 0, 0, 0, 38, 0,
+  39, 0, 9, 0, 23, 32, 93, 27, 1, 9,
+  26, 5, 18, 0, 0, 0, 0, 103, 0, 30,
+  67, 4, 0, 16, 13, 75, 10, 41, 20, 0,
+  6, 20, 201, 42, 3, 62, 71, 0, 24, 0,
+  0, 56, 0, 4, 5, 32, 0, 22, 9, 88,
+  48, 0, 0, 0, 0, 51, 21, 3, 55, 0,
+  44, 0, 32, 0, 31, 72, 0, 0, 0, 0,
+  48, 9, 120, 30, 0, 10, 58, 0, 32, 0,
+  53, 0, 0, 37, 0, 0, 36, 11, 0, 15,
+  0, 0, 58, 5, 0, 0, 0, 3, 0, 36,
+  0, 0, 40, 101, 17, 0, 0, 52, 55, 89,
+  20, 0, 9, 0, 2, 9, 0, 33, 6, 2,
+  40, 0, 19, 12, 51, 0, 0, 0, 3, 0,
+  39, 30, 0, 67, 0, 11, 0, 33, 2, 0,
+  0, 0, 0, 17, 28, 49, 0, 0, 52, 3,
+  0, 0, 28, 58, 0, 42, 19, 0, 0, 8,
+  0, 9, 0, 26, 82, 21, 0, 0, 0, 27,
+  0, 8, 0, 40, 0, 22, 24, 91, 9, 110,
+  0, 0, 0, 27, 50, 0, 37, 0, 28, 0,
+  14, 0, 55, 50, 0, 43, 0, 0, 49, 11,
+  81, 0, 4, 0, 22, 7, 42, 0, 12, 0,
+  0, 26, 21, 0, 21, 24, 0, 0, 0, 0,
+  0, 9, 0, 0, 0, 9, 0, 20, 0, 0,
+  47, 83, 0, 52, 17, 21, 41, 51, 25, 0,
+  40, 5, 0, 40, 0, 11, 0, 0, 21, 0,
+  13, 13, 31, 0, 15, 0, 35, 1, 15, 0,
+  0, 27, 36, 37, 0, 42, 17, 9, 15, 0,
+  0, 22, 97, 0, 7, 27, 55, 8, 0, 0,
+  0, 69, 0, 8, 46, 0, 0, 20, 0, 2,
+  0, 37, 78, 0, 3, 0, 0, 24, 0, 73,
+  0, 34, 30, 29, 29, 57, 25, 42, 0, 28,
+  0, 43, 34, 9, 17, 0, 10, 0, 0, 0,
+  6, 14, 0, 16, 0, 0, 0, 0, 28, 0,
+  23, 6, 0, 10, 7, 0, 0, 23, 0, 35,
+  38, 0, 52, 56, 0, 0, 11, 0, 0, 18,
+  0, 0, 0, 4, 0, 16, 29, 0, 0, 66,
+  6, 0, 0, 10, 18, 0, 38, 0, 0, 6,
+  0, 7, 0, 1, 0, 0, 17, 0, 0, 0,
+  5, 0, 43, 0, 63, 0, 11, 0, 13, 24,
+  67, 6, 0, 18, 27, 22, 0, 0, 0, 0,
+  0, 97, 0, 0, 60, 4, 0, 5, 27, 86,
+  27, 52, 0, 0, 8, 9, 193, 55, 1, 28,
+  52, 0, 59, 1, 0, 58, 0, 17, 14, 39,
+  0, 14, 26, 83, 17, 0, 2, 0, 0, 64,
+  30, 0, 71, 0, 60, 0, 49, 0, 15, 71,
+  0, 0, 0, 0, 7, 6, 77, 33, 0, 22,
+  82, 11, 31, 27, 25, 0, 20, 13, 0, 0,
+  15, 5, 0, 0, 0, 0, 62, 3, 0, 0,
+  23, 0, 15, 37, 0, 0, 49, 67, 15, 0,
+  0, 37, 46, 75, 26, 0, 0, 6, 1, 16,
+  0, 37, 12, 0, 55, 0, 9, 28, 40, 0,
+  0, 0, 4, 0, 26, 26, 0, 60, 0, 15,
+  0, 5, 36, 23, 2, 0, 0, 31, 86, 8,
+  0, 0, 59, 11, 0, 0, 65, 56, 0, 25,
+  23, 0, 0, 13, 0, 13, 0, 11, 92, 0,
+  18, 0, 0, 32, 0, 53, 0, 28, 0, 44,
+  48, 94, 4, 86, 0, 7, 0, 38, 52, 0,
+  35, 0, 21, 0, 24, 0, 13, 27, 0, 40,
+  0, 11, 10, 0, 33, 0, 8, 0, 25, 13,
+  37, 0, 0, 0, 0, 15, 39, 0, 14, 13,
+  0, 0, 0, 0, 0, 24, 0, 0, 0, 13,
+  0, 47, 0, 0, 62, 50, 3, 0, 0, 13,
+  20, 1, 44, 0, 24, 28, 0, 29, 0, 15,
+  0, 0, 25, 0, 11, 10, 47, 0, 42, 0,
+  79, 0, 14, 0, 3, 28, 40, 34, 0, 19,
+  25, 3, 20, 0, 0, 31, 114, 0, 21, 37,
+  61, 3, 0, 0, 0, 74, 0, 5, 57, 0,
+  0, 30, 0, 1, 0, 41, 79, 0, 10, 0,
+  0, 27, 0, 80, 0, 41, 32, 32, 31, 55,
+  32, 23, 0, 44, 0, 50, 31, 17, 17, 0,
+  7, 0, 0, 0, 12, 0, 0, 36, 0, 0,
+  4, 0, 28, 0, 17, 10, 0, 3, 3, 0,
+  15, 36, 0, 33, 36, 0, 51, 45, 0, 0,
+  5, 0, 0, 36, 0, 0, 0, 5, 0, 25,
+  33, 0, 3, 68, 5, 0, 5, 7, 24, 0,
+  28, 0, 2, 10, 6, 14, 0, 1, 0, 0,
+  2, 0, 6, 0, 15, 4, 59, 0, 74, 0,
+  21, 0, 43, 69, 0, 8, 5, 11, 0, 0,
+  0, 0, 0, 0, 16, 73, 0, 0, 82, 18,
+  0, 0, 0, 41, 0, 50, 15, 0, 5, 16,
+  0, 0, 0, 19, 83, 23, 0, 0, 0, 9,
+  0, 0, 0, 6, 0, 0, 9, 74, 35, 102,
+  0, 0, 0, 29, 56, 0, 22, 0, 18, 0,
+  0, 0, 78, 24, 0, 51, 0, 0, 97, 0,
+  107, 49, 0, 0, 4, 13, 45, 0, 27, 0,
+  0, 5, 25, 0, 35, 12, 0, 12, 0, 6,
+  0, 6, 0, 26, 0, 19, 1, 0, 34, 0,
+  12, 95, 20, 81, 35, 21, 44, 44, 10, 0,
+  51, 0, 0, 63, 0, 7, 0, 0, 0, 0,
+  11, 0, 22, 0, 33, 0, 0, 27, 27, 0,
+  0, 39, 39, 29, 0, 48, 7, 15, 23, 0,
+  0, 11, 81, 0, 0, 23, 58, 7, 0, 0,
+  0, 63, 0, 21, 41, 0, 0, 12, 0, 0,
+  0, 32, 67, 3, 1, 0, 0, 13, 0, 47,
+  0, 18, 41, 13, 22, 69, 25, 53, 0, 12,
+  0, 37, 21, 7, 22, 0, 22, 0, 0, 0,
+  16, 31, 0, 29, 0, 0, 7, 0, 37, 0,
+  18, 0, 9, 21, 4, 0, 5, 11, 0, 39,
+  27, 0, 62, 62, 0, 0, 0, 0, 0, 18,
+  1, 0, 0, 19, 0, 19, 32, 0, 0, 78,
+  11, 0, 0, 10, 15, 0, 33, 0, 0, 0,
+  0, 8, 0, 0, 0, 0, 7, 0, 0, 0,
+  0, 0, 38, 0, 39, 0, 9, 0, 0, 0,
+  0, 12, 0, 128, 4, 0, 24, 0, 0, 24,
+  44, 0, 0, 3, 15, 0, 0, 0, 17, 87,
+  14, 19, 11, 0, 0, 0, 0, 0, 0, 22,
+  19, 26, 0, 6, 0, 37, 0, 56, 0, 21,
+  0, 56, 0, 77, 54, 47, 0, 0, 0, 41,
+  15, 0, 2, 0, 67, 0, 29, 0, 3, 66,
+  0, 12, 54, 5, 0, 16, 73, 0, 77, 17,
+  14, 1, 0, 19, 20, 20, 0, 39, 27, 0,
+  45, 41, 10, 0, 5, 0, 0, 0, 0, 17,
+  0, 0, 0, 33, 0, 0, 7, 75, 14, 0,
+  0, 3, 5, 0, 19, 0, 0, 0, 0, 0,
+  0, 14, 0, 0, 93, 0, 37, 0, 0, 0,
+  0, 0, 36, 0, 0, 0, 0, 67, 0, 11,
+  0, 33, 2, 0, 0, 0, 0, 17, 28, 49,
+  0, 0, 52, 3, 0, 0, 28, 58, 0, 42,
+  19, 0, 0, 8, 0, 9, 0, 26, 82, 21,
+  0, 0, 0, 27, 0, 8, 0, 40, 0, 22,
+  24, 91, 9, 110, 0, 0, 0, 27, 50, 0,
+  37, 0, 28, 0, 14, 0, 55, 50, 0, 43,
+  0, 0, 49, 11, 81, 0, 4, 0, 22, 7,
+  42, 0, 12, 0, 0, 26, 21, 0, 21, 24,
+  0, 0, 0, 0, 0, 9, 0, 0, 0, 9,
+  0, 20, 0, 0, 47, 83, 0, 52, 17, 21,
+  41, 51, 25, 0, 40, 5, 0, 40, 0, 11,
+  0, 0, 21, 0, 13, 13, 31, 0, 15, 0,
+  35, 1, 15, 0, 0, 27, 36, 37, 0, 42,
+  17, 9, 15, 0, 0, 22, 97, 0, 7, 27,
+  55, 8, 0, 0, 0, 69, 0, 8, 46, 0,
+  0, 20, 0, 2, 0, 37, 78, 0, 3, 0,
+  0, 24, 0, 73, 0, 34, 30, 29, 29, 57,
+  25, 42, 0, 28, 0, 43, 34, 9, 17, 0,
+  10, 0, 0, 0, 6, 14, 0, 16, 0, 0,
+  0, 0, 28, 0, 23, 6, 0, 10, 7, 0,
+  0, 23, 0, 35, 38, 0, 52, 56, 0, 0,
+  11, 0, 0, 18, 0, 0, 0, 4, 0, 16,
+  29, 0, 0, 66, 6, 0, 0, 10, 18, 0,
+  38, 0, 0, 6, 0, 7, 0, 1, 0, 0,
+  17, 0, 0, 0, 5, 0, 43, 0, 63, 0,
+  11, 0, 0, 0, 0, 15, 0, 142, 5, 0,
+  3, 0, 0, 27, 43, 0, 0, 0, 6, 0,
+  0, 0, 37, 88, 23, 15, 8, 0, 0, 0,
+  0, 13, 0, 22, 26, 24, 0, 2, 0, 36,
+  0, 50, 0, 35, 0, 56, 1, 71, 43, 43,
+  0, 0, 0, 38, 8, 0, 4, 0, 67, 0,
+  33, 0, 0, 57, 0, 0, 64, 0, 0, 26,
+  62, 0, 74, 26, 27, 3, 4, 32, 9, 25,
+  0, 31, 35, 0, 37, 52, 8, 0, 19, 0,
+  0, 0, 0, 11, 7, 0, 1, 26, 0, 0,
+  10, 66, 18, 0, 0, 7, 8, 0, 31, 0,
+  0, 0, 0, 0, 0, 15, 0, 0, 111, 2,
+  35, 3, 0, 0, 0, 0, 41, 0, 0, 0,
+  0, 60, 0, 15, 0, 5, 36, 23, 2, 0,
+  0, 31, 86, 8, 0, 0, 59, 11, 0, 0,
+  65, 56, 0, 25, 23, 0, 0, 13, 0, 13,
+  0, 11, 92, 0, 18, 0, 0, 32, 0, 53,
+  0, 28, 0, 44, 48, 94, 4, 86, 0, 7,
+  0, 38, 52, 0, 35, 0, 21, 0, 24, 0,
+  13, 27, 0, 40, 0, 11, 10, 0, 33, 0,
+  8, 0, 25, 13, 37, 0, 0, 0, 0, 15,
+  39, 0, 14, 13, 0, 0, 0, 0, 0, 24,
+  0, 0, 0, 13, 0, 47, 0, 0, 62, 50,
+  3, 0, 0, 13, 20, 1, 44, 0, 24, 28,
+  0, 29, 0, 15, 0, 0, 25, 0, 11, 10,
+  47, 0, 42, 0, 79, 0, 14, 0, 3, 28,
+  40, 34, 0, 19, 25, 3, 20, 0, 0, 31,
+  114, 0, 21, 37, 61, 3, 0, 0, 0, 74,
+  0, 5, 57, 0, 0, 30, 0, 1, 0, 41,
+  79, 0, 10, 0, 0, 27, 0, 80, 0, 41,
+  32, 32, 31, 55, 32, 23, 0, 44, 0, 50,
+  31, 17, 17, 0, 7, 0, 0, 0, 12, 0,
+  0, 36, 0, 0, 4, 0, 28, 0, 17, 10,
+  0, 3, 3, 0, 15, 36, 0, 33, 36, 0,
+  51, 45, 0, 0, 5, 0, 0, 36, 0, 0,
+  0, 5, 0, 25, 33, 0, 3, 68, 5, 0,
+  5, 7, 24, 0, 28, 0, 2, 10, 6, 14,
+  0, 1, 0, 0, 2, 0, 6, 0, 15, 4,
+  59, 0, 74, 0, 21, 0, 0, 0, 0, 16,
+  0, 145, 3, 0, 12, 0, 0, 27, 50, 0,
+  0, 22, 2, 0, 1, 0, 35, 91, 18, 9,
+  3, 0, 0, 0, 0, 4, 0, 27, 23, 43,
+  0, 0, 0, 30, 0, 60, 0, 29, 0, 69,
+  6, 72, 26, 52, 0, 0, 0, 48, 12, 0,
+  0, 0, 56, 0, 35, 0, 2, 55, 0, 0,
+  72, 0, 0, 20, 53, 0, 83, 22, 17, 0,
+  0, 33, 2, 22, 0, 37, 41, 0, 32, 49,
+  7, 0, 27, 0, 0, 0, 0, 13, 1, 0,
+  15, 38, 0, 0, 2, 68, 27, 0, 0, 7,
+  17, 0, 22, 0, 0, 0, 0, 0, 0, 29,
+  0, 0, 104, 4, 40, 7, 0, 0, 0, 0,
+  54, 0, 3, 0, 0, 39, 39, 29, 0, 48,
+  7, 15, 23, 0, 0, 11, 81, 0, 0, 23,
+  58, 7, 0, 0, 0, 63, 0, 21, 41, 0,
+  0, 12, 0, 0, 0, 32, 67, 3, 1, 0,
+  0, 13, 0, 47, 0, 18, 41, 13, 22, 69,
+  25, 53, 0, 12, 0, 37, 21, 7, 22, 0,
+  22, 0, 0, 0, 16, 31, 0, 29, 0, 0,
+  7, 0, 37, 0, 18, 0, 9, 21, 4, 0,
+  5, 11, 0, 39, 27, 0, 62, 62, 0, 0,
+  0, 0, 0, 18, 1, 0, 0, 19, 0, 19,
+  32, 0, 0, 78, 11, 0, 0, 10, 15, 0,
+  33, 0, 0, 0, 0, 8, 0, 0, 0, 0,
+  7, 0, 0, 0, 0, 0, 38, 0, 39, 0,
+  9, 0, 0, 0, 0, 12, 0, 128, 4, 0,
+  24, 0, 0, 24, 44, 0, 0, 3, 15, 0,
+  0, 0, 17, 87, 14, 19, 11, 0, 0, 0,
+  0, 0, 0, 22, 19, 26, 0, 6, 0, 37,
+  0, 56, 0, 21, 0, 56, 0, 77, 54, 47,
+  0, 0, 0, 41, 15, 0, 2, 0, 67, 0,
+  29, 0, 3, 66, 0, 12, 54, 5, 0, 16,
+  73, 0, 77, 17, 14, 1, 0, 19, 20, 20,
+  0, 39, 27, 0, 45, 41, 10, 0, 5, 0,
+  0, 0, 0, 17, 0, 0, 0, 33, 0, 0,
+  7, 75, 14, 0, 0, 3, 5, 0, 19, 0,
+  0, 0, 0, 0, 0, 14, 0, 0, 93, 0,
+  37, 0, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 0, 0, 0, 0, 48, 47, 0, 22, 0,
+  0, 0, 38, 0, 10, 49, 31, 17, 0, 15,
+  62, 0, 0, 40, 0, 20, 12, 0, 0, 26,
+  0, 0, 64, 55, 8, 0, 0, 16, 0, 41,
+  0, 28, 0, 56, 0, 45, 21, 45, 0, 12,
+  2, 10, 93, 9, 0, 9, 48, 0, 0, 35,
+  16, 4, 0, 1, 0, 0, 17, 7, 42, 0,
+  2, 3, 0, 21, 13, 42, 3, 0, 0, 26,
+  69, 0, 18, 2, 18, 0, 12, 0, 9, 8,
+  0, 31, 0, 8, 5, 29, 0, 0, 36, 54,
+  18, 0, 0, 0, 1, 0, 24, 4, 0, 31,
+  0, 1, 0, 19, 0, 0, 51, 3, 32, 0,
+  21, 0, 83, 0, 35, 0, 4, 0, 0, 27,
+  36, 37, 0, 42, 17, 9, 15, 0, 0, 22,
+  97, 0, 7, 27, 55, 8, 0, 0, 0, 69,
+  0, 8, 46, 0, 0, 20, 0, 2, 0, 37,
+  78, 0, 3, 0, 0, 24, 0, 73, 0, 34,
+  30, 29, 29, 57, 25, 42, 0, 28, 0, 43,
+  34, 9, 17, 0, 10, 0, 0, 0, 6, 14,
+  0, 16, 0, 0, 0, 0, 28, 0, 23, 6,
+  0, 10, 7, 0, 0, 23, 0, 35, 38, 0,
+  52, 56, 0, 0, 11, 0, 0, 18, 0, 0,
+  0, 4, 0, 16, 29, 0, 0, 66, 6, 0,
+  0, 10, 18, 0, 38, 0, 0, 6, 0, 7,
+  0, 1, 0, 0, 17, 0, 0, 0, 5, 0,
+  43, 0, 63, 0, 11, 0, 0, 0, 0, 15,
+  0, 142, 5, 0, 3, 0, 0, 27, 43, 0,
+  0, 0, 6, 0, 0, 0, 37, 88, 23, 15,
+  8, 0, 0, 0, 0, 13, 0, 22, 26, 24,
+  0, 2, 0, 36, 0, 50, 0, 35, 0, 56,
+  1, 71, 43, 43, 0, 0, 0, 38, 8, 0,
+  4, 0, 67, 0, 33, 0, 0, 57, 0, 0,
+  64, 0, 0, 26, 62, 0, 74, 26, 27, 3,
+  4, 32, 9, 25, 0, 31, 35, 0, 37, 52,
+  8, 0, 19, 0, 0, 0, 0, 11, 7, 0,
+  1, 26, 0, 0, 10, 66, 18, 0, 0, 7,
+  8, 0, 31, 0, 0, 0, 0, 0, 0, 15,
+  0, 0, 111, 2, 35, 3, 0, 0, 0, 0,
+  41, 0, 0, 0, 0, 0, 0, 0, 0, 51,
+  48, 0, 17, 0, 0, 1, 56, 0, 12, 28,
+  33, 20, 5, 18, 77, 0, 0, 29, 0, 42,
+  17, 0, 0, 38, 0, 0, 71, 57, 0, 0,
+  0, 12, 0, 39, 0, 43, 0, 51, 0, 34,
+  20, 45, 0, 31, 15, 0, 71, 13, 0, 6,
+  44, 0, 0, 54, 15, 0, 0, 0, 0, 0,
+  23, 28, 33, 0, 0, 13, 0, 22, 15, 54,
+  0, 0, 0, 29, 69, 6, 16, 0, 25, 0,
+  11, 13, 3, 2, 0, 26, 5, 14, 0, 26,
+  0, 0, 43, 47, 11, 6, 0, 0, 0, 0,
+  43, 0, 0, 46, 1, 0, 0, 11, 0, 0,
+  48, 15, 46, 0, 23, 0, 104, 0, 47, 0,
+  0, 0, 3, 28, 40, 34, 0, 19, 25, 3,
+  20, 0, 0, 31, 114, 0, 21, 37, 61, 3,
+  0, 0, 0, 74, 0, 5, 57, 0, 0, 30,
+  0, 1, 0, 41, 79, 0, 10, 0, 0, 27,
+  0, 80, 0, 41, 32, 32, 31, 55, 32, 23,
+  0, 44, 0, 50, 31, 17, 17, 0, 7, 0,
+  0, 0, 12, 0, 0, 36, 0, 0, 4, 0,
+  28, 0, 17, 10, 0, 3, 3, 0, 15, 36,
+  0, 33, 36, 0, 51, 45, 0, 0, 5, 0,
+  0, 36, 0, 0, 0, 5, 0, 25, 33, 0,
+  3, 68, 5, 0, 5, 7, 24, 0, 28, 0,
+  2, 10, 6, 14, 0, 1, 0, 0, 2, 0,
+  6, 0, 15, 4, 59, 0, 74, 0, 21, 0,
+  0, 0, 0, 16, 0, 145, 3, 0, 12, 0,
+  0, 27, 50, 0, 0, 22, 2, 0, 1, 0,
+  35, 91, 18, 9, 3, 0, 0, 0, 0, 4,
+  0, 27, 23, 43, 0, 0, 0, 30, 0, 60,
+  0, 29, 0, 69, 6, 72, 26, 52, 0, 0,
+  0, 48, 12, 0, 0, 0, 56, 0, 35, 0,
+  2, 55, 0, 0, 72, 0, 0, 20, 53, 0,
+  83, 22, 17, 0, 0, 33, 2, 22, 0, 37,
+  41, 0, 32, 49, 7, 0, 27, 0, 0, 0,
+  0, 13, 1, 0, 15, 38, 0, 0, 2, 68,
+  27, 0, 0, 7, 17, 0, 22, 0, 0, 0,
+  0, 0, 0, 29, 0, 0, 104, 4, 40, 7,
+  0, 0, 0, 0, 54, 0, 3, 0, 0, 0,
+  0, 0, 0, 45, 41, 0, 20, 0, 0, 0,
+  75, 11, 19, 55, 39, 21, 25, 2, 84, 0,
+  0, 27, 13, 52, 3, 2, 0, 52, 0, 0,
+  56, 63, 0, 0, 0, 0, 0, 59, 0, 43,
+  0, 45, 7, 20, 17, 36, 0, 46, 0, 0,
+  66, 22, 0, 0, 25, 0, 0, 76, 20, 0,
+  0, 2, 0, 0, 13, 21, 31, 0, 0, 26,
+  0, 14, 8, 55, 0, 0, 0, 54, 58, 17,
+  20, 5, 37, 0, 12, 14, 8, 14, 4, 15,
+  7, 17, 1, 41, 0, 0, 39, 55, 6, 0,
+  4, 0, 0, 0, 35, 0, 0, 42, 13, 0,
+  0, 5, 0, 0, 43, 15, 52, 0, 18, 3,
+  121, 0, 68, 0, 9, 0, 0, 0, 0, 12,
+  0, 128, 4, 0, 24, 0, 0, 24, 44, 0,
+  0, 3, 15, 0, 0, 0, 17, 87, 14, 19,
+  11, 0, 0, 0, 0, 0, 0, 22, 19, 26,
+  0, 6, 0, 37, 0, 56, 0, 21, 0, 56,
+  0, 77, 54, 47, 0, 0, 0, 41, 15, 0,
+  2, 0, 67, 0, 29, 0, 3, 66, 0, 12,
+  54, 5, 0, 16, 73, 0, 77, 17, 14, 1,
+  0, 19, 20, 20, 0, 39, 27, 0, 45, 41,
+  10, 0, 5, 0, 0, 0, 0, 17, 0, 0,
+  0, 33, 0, 0, 7, 75, 14, 0, 0, 3,
+  5, 0, 19, 0, 0, 0, 0, 0, 0, 14,
+  0, 0, 93, 0, 37, 0, 0, 0, 0, 0,
+  36, 0, 0, 0, 0, 0, 0, 0, 0, 48,
+  47, 0, 22, 0, 0, 0, 38, 0, 10, 49,
+  31, 17, 0, 15, 62, 0, 0, 40, 0, 20,
+  12, 0, 0, 26, 0, 0, 64, 55, 8, 0,
+  0, 16, 0, 41, 0, 28, 0, 56, 0, 45,
+  21, 45, 0, 12, 2, 10, 93, 9, 0, 9,
+  48, 0, 0, 35, 16, 4, 0, 1, 0, 0,
+  17, 7, 42, 0, 2, 3, 0, 21, 13, 42,
+  3, 0, 0, 26, 69, 0, 18, 2, 18, 0,
+  12, 0, 9, 8, 0, 31, 0, 8, 5, 29,
+  0, 0, 36, 54, 18, 0, 0, 0, 1, 0,
+  24, 4, 0, 31, 0, 1, 0, 19, 0, 0,
+  51, 3, 32, 0, 21, 0, 83, 0, 35, 0,
+  4, 0, 0, 9, 0, 0, 15, 0, 57, 0,
+  37, 0, 0, 0, 30, 12, 51, 40, 45, 47,
+  0, 28, 101, 0, 0, 27, 0, 9, 25, 8,
+  0, 23, 0, 0, 52, 4, 22, 0, 0, 12,
+  0, 35, 0, 7, 0, 70, 5, 54, 4, 16,
+  0, 0, 13, 8, 68, 27, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 23, 1,
+  27, 0, 0, 0, 0, 10, 48, 0, 7, 9,
+  0, 11, 57, 13, 9, 0, 13, 0, 0, 0,
+  22, 29, 9, 0, 0, 15, 0, 34, 0, 0,
+  59, 37, 0, 0, 0, 0, 12, 0, 17, 14,
+  11, 27, 0, 0, 0, 5, 0, 0, 24, 0,
+  14, 0, 27, 0, 77, 0, 21, 0, 13, 0,
+  0, 0, 0, 15, 0, 142, 5, 0, 3, 0,
+  0, 27, 43, 0, 0, 0, 6, 0, 0, 0,
+  37, 88, 23, 15, 8, 0, 0, 0, 0, 13,
+  0, 22, 26, 24, 0, 2, 0, 36, 0, 50,
+  0, 35, 0, 56, 1, 71, 43, 43, 0, 0,
+  0, 38, 8, 0, 4, 0, 67, 0, 33, 0,
+  0, 57, 0, 0, 64, 0, 0, 26, 62, 0,
+  74, 26, 27, 3, 4, 32, 9, 25, 0, 31,
+  35, 0, 37, 52, 8, 0, 19, 0, 0, 0,
+  0, 11, 7, 0, 1, 26, 0, 0, 10, 66,
+  18, 0, 0, 7, 8, 0, 31, 0, 0, 0,
+  0, 0, 0, 15, 0, 0, 111, 2, 35, 3,
+  0, 0, 0, 0, 41, 0, 0, 0, 0, 0,
+  0, 0, 0, 51, 48, 0, 17, 0, 0, 1,
+  56, 0, 12, 28, 33, 20, 5, 18, 77, 0,
+  0, 29, 0, 42, 17, 0, 0, 38, 0, 0,
+  71, 57, 0, 0, 0, 12, 0, 39, 0, 43,
+  0, 51, 0, 34, 20, 45, 0, 31, 15, 0,
+  71, 13, 0, 6, 44, 0, 0, 54, 15, 0,
+  0, 0, 0, 0, 23, 28, 33, 0, 0, 13,
+  0, 22, 15, 54, 0, 0, 0, 29, 69, 6,
+  16, 0, 25, 0, 11, 13, 3, 2, 0, 26,
+  5, 14, 0, 26, 0, 0, 43, 47, 11, 6,
+  0, 0, 0, 0, 43, 0, 0, 46, 1, 0,
+  0, 11, 0, 0, 48, 15, 46, 0, 23, 0,
+  104, 0, 47, 0, 0, 0, 0, 29, 0, 0,
+  20, 0, 45, 0, 38, 0, 0, 2, 26, 28,
+  73, 29, 52, 53, 0, 24, 91, 0, 0, 24,
+  16, 39, 26, 0, 0, 20, 0, 0, 40, 12,
+  3, 0, 0, 8, 0, 47, 0, 9, 0, 58,
+  0, 33, 12, 19, 0, 0, 17, 3, 66, 44,
+  0, 0, 7, 0, 0, 3, 7, 0, 0, 0,
+  0, 0, 42, 7, 32, 0, 0, 0, 0, 10,
+  51, 0, 4, 0, 0, 8, 61, 18, 25, 0,
+  32, 0, 8, 4, 12, 12, 2, 0, 0, 26,
+  0, 31, 0, 0, 56, 29, 0, 2, 0, 0,
+  0, 0, 30, 0, 7, 37, 0, 0, 0, 21,
+  0, 0, 7, 6, 14, 0, 16, 0, 90, 0,
+  25, 0, 12, 0, 0, 0, 0, 16, 0, 145,
+  3, 0, 12, 0, 0, 27, 50, 0, 0, 22,
+  2, 0, 1, 0, 35, 91, 18, 9, 3, 0,
+  0, 0, 0, 4, 0, 27, 23, 43, 0, 0,
+  0, 30, 0, 60, 0, 29, 0, 69, 6, 72,
+  26, 52, 0, 0, 0, 48, 12, 0, 0, 0,
+  56, 0, 35, 0, 2, 55, 0, 0, 72, 0,
+  0, 20, 53, 0, 83, 22, 17, 0, 0, 33,
+  2, 22, 0, 37, 41, 0, 32, 49, 7, 0,
+  27, 0, 0, 0, 0, 13, 1, 0, 15, 38,
+  0, 0, 2, 68, 27, 0, 0, 7, 17, 0,
+  22, 0, 0, 0, 0, 0, 0, 29, 0, 0,
+  104, 4, 40, 7, 0, 0, 0, 0, 54, 0,
+  3, 0, 0, 0, 0, 0, 0, 45, 41, 0,
+  20, 0, 0, 0, 75, 11, 19, 55, 39, 21,
+  25, 2, 84, 0, 0, 27, 13, 52, 3, 2,
+  0, 52, 0, 0, 56, 63, 0, 0, 0, 0,
+  0, 59, 0, 43, 0, 45, 7, 20, 17, 36,
+  0, 46, 0, 0, 66, 22, 0, 0, 25, 0,
+  0, 76, 20, 0, 0, 2, 0, 0, 13, 21,
+  31, 0, 0, 26, 0, 14, 8, 55, 0, 0,
+  0, 54, 58, 17, 20, 5, 37, 0, 12, 14,
+  8, 14, 4, 15, 7, 17, 1, 41, 0, 0,
+  39, 55, 6, 0, 4, 0, 0, 0, 35, 0,
+  0, 42, 13, 0, 0, 5, 0, 0, 43, 15,
+  52, 0, 18, 3, 121, 0, 68, 0, 9, 0,
+  0, 49, 1, 0, 30, 0, 15, 0, 64, 0,
+  0, 7, 46, 41, 52, 60, 59, 47, 14, 4,
+  85, 0, 0, 29, 21, 32, 22, 9, 0, 19,
+  0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+  0, 0, 0, 54, 0, 32, 4, 0, 0, 16,
+  7, 12, 54, 37, 0, 0, 0, 0, 0, 0,
+  1, 0, 0, 0, 0, 0, 49, 0, 30, 0,
+  0, 0, 5, 29, 27, 0, 0, 9, 0, 21,
+  35, 23, 45, 0, 23, 22, 4, 26, 21, 30,
+  26, 0, 0, 24, 0, 19, 0, 0, 46, 43,
+  11, 0, 0, 0, 0, 0, 30, 1, 0, 44,
+  0, 0, 0, 16, 0, 0, 1, 3, 6, 0,
+  0, 0, 95, 0, 52, 0, 20, 0, 0, 0,
+  0, 0, 0, 48, 47, 0, 22, 0, 0, 0,
+  38, 0, 10, 49, 31, 17, 0, 15, 62, 0,
+  0, 40, 0, 20, 12, 0, 0, 26, 0, 0,
+  64, 55, 8, 0, 0, 16, 0, 41, 0, 28,
+  0, 56, 0, 45, 21, 45, 0, 12, 2, 10,
+  93, 9, 0, 9, 48, 0, 0, 35, 16, 4,
+  0, 1, 0, 0, 17, 7, 42, 0, 2, 3,
+  0, 21, 13, 42, 3, 0, 0, 26, 69, 0,
+  18, 2, 18, 0, 12, 0, 9, 8, 0, 31,
+  0, 8, 5, 29, 0, 0, 36, 54, 18, 0,
+  0, 0, 1, 0, 24, 4, 0, 31, 0, 1,
+  0, 19, 0, 0, 51, 3, 32, 0, 21, 0,
+  83, 0, 35, 0, 4, 0, 0, 9, 0, 0,
+  15, 0, 57, 0, 37, 0, 0, 0, 30, 12,
+  51, 40, 45, 47, 0, 28, 101, 0, 0, 27,
+  0, 9, 25, 8, 0, 23, 0, 0, 52, 4,
+  22, 0, 0, 12, 0, 35, 0, 7, 0, 70,
+  5, 54, 4, 16, 0, 0, 13, 8, 68, 27,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 23, 1, 27, 0, 0, 0, 0, 10,
+  48, 0, 7, 9, 0, 11, 57, 13, 9, 0,
+  13, 0, 0, 0, 22, 29, 9, 0, 0, 15,
+  0, 34, 0, 0, 59, 37, 0, 0, 0, 0,
+  12, 0, 17, 14, 11, 27, 0, 0, 0, 5,
+  0, 0, 24, 0, 14, 0, 27, 0, 77, 0,
+  21, 0, 13, 0, 0, 33, 0, 0, 27, 0,
+  41, 0, 45, 22, 0, 7, 22, 44, 69, 48,
+  60, 49, 0, 17, 100, 0, 0, 26, 19, 29,
+  19, 25, 0, 21, 0, 0, 29, 10, 19, 0,
+  0, 21, 0, 35, 0, 0, 0, 56, 7, 31,
+  16, 4, 0, 0, 48, 0, 33, 46, 0, 2,
+  16, 0, 0, 12, 0, 0, 0, 0, 0, 0,
+  48, 0, 33, 0, 0, 0, 0, 6, 51, 0,
+  15, 23, 0, 30, 42, 35, 0, 0, 24, 0,
+  0, 0, 26, 42, 0, 0, 0, 46, 0, 27,
+  0, 13, 75, 38, 0, 0, 0, 0, 17, 0,
+  16, 5, 28, 44, 0, 0, 0, 5, 8, 0,
+  2, 0, 24, 0, 4, 0, 105, 0, 27, 6,
+  32, 0, 0, 0, 0, 0, 0, 51, 48, 0,
+  17, 0, 0, 1, 56, 0, 12, 28, 33, 20,
+  5, 18, 77, 0, 0, 29, 0, 42, 17, 0,
+  0, 38, 0, 0, 71, 57, 0, 0, 0, 12,
+  0, 39, 0, 43, 0, 51, 0, 34, 20, 45,
+  0, 31, 15, 0, 71, 13, 0, 6, 44, 0,
+  0, 54, 15, 0, 0, 0, 0, 0, 23, 28,
+  33, 0, 0, 13, 0, 22, 15, 54, 0, 0,
+  0, 29, 69, 6, 16, 0, 25, 0, 11, 13,
+  3, 2, 0, 26, 5, 14, 0, 26, 0, 0,
+  43, 47, 11, 6, 0, 0, 0, 0, 43, 0,
+  0, 46, 1, 0, 0, 11, 0, 0, 48, 15,
+  46, 0, 23, 0, 104, 0, 47, 0, 0, 0,
+  0, 29, 0, 0, 20, 0, 45, 0, 38, 0,
+  0, 2, 26, 28, 73, 29, 52, 53, 0, 24,
+  91, 0, 0, 24, 16, 39, 26, 0, 0, 20,
+  0, 0, 40, 12, 3, 0, 0, 8, 0, 47,
+  0, 9, 0, 58, 0, 33, 12, 19, 0, 0,
+  17, 3, 66, 44, 0, 0, 7, 0, 0, 3,
+  7, 0, 0, 0, 0, 0, 42, 7, 32, 0,
+  0, 0, 0, 10, 51, 0, 4, 0, 0, 8,
+  61, 18, 25, 0, 32, 0, 8, 4, 12, 12,
+  2, 0, 0, 26, 0, 31, 0, 0, 56, 29,
+  0, 2, 0, 0, 0, 0, 30, 0, 7, 37,
+  0, 0, 0, 21, 0, 0, 7, 6, 14, 0,
+  16, 0, 90, 0, 25, 0, 12, 0, 0, 65,
+  0, 0, 34, 0, 36, 0, 61, 12, 0, 5,
+  44, 54, 61, 74, 64, 45, 0, 12, 72, 0,
+  0, 33, 31, 57, 17, 27, 0, 12, 0, 0,
+  29, 8, 17, 0, 0, 37, 0, 58, 0, 3,
+  0, 54, 0, 29, 24, 4, 0, 0, 35, 0,
+  43, 56, 0, 0, 7, 0, 0, 32, 0, 0,
+  0, 0, 0, 0, 70, 9, 41, 0, 0, 0,
+  0, 18, 51, 0, 0, 21, 0, 27, 40, 52,
+  13, 20, 40, 15, 0, 9, 25, 57, 3, 0,
+  0, 59, 0, 27, 0, 5, 69, 44, 0, 0,
+  0, 0, 2, 0, 12, 20, 36, 60, 0, 0,
+  0, 21, 0, 0, 0, 18, 24, 0, 0, 1,
+  134, 0, 38, 0, 44, 0, 0, 0, 0, 0,
+  0, 45, 41, 0, 20, 0, 0, 0, 75, 11,
+  19, 55, 39, 21, 25, 2, 84, 0, 0, 27,
+  13, 52, 3, 2, 0, 52, 0, 0, 56, 63,
+  0, 0, 0, 0, 0, 59, 0, 43, 0, 45,
+  7, 20, 17, 36, 0, 46, 0, 0, 66, 22,
+  0, 0, 25, 0, 0, 76, 20, 0, 0, 2,
+  0, 0, 13, 21, 31, 0, 0, 26, 0, 14,
+  8, 55, 0, 0, 0, 54, 58, 17, 20, 5,
+  37, 0, 12, 14, 8, 14, 4, 15, 7, 17,
+  1, 41, 0, 0, 39, 55, 6, 0, 4, 0,
+  0, 0, 35, 0, 0, 42, 13, 0, 0, 5,
+  0, 0, 43, 15, 52, 0, 18, 3, 121, 0,
+  68, 0, 9, 0, 0, 49, 1, 0, 30, 0,
+  15, 0, 64, 0, 0, 7, 46, 41, 52, 60,
+  59, 47, 14, 4, 85, 0, 0, 29, 21, 32,
+  22, 9, 0, 19, 0, 0, 33, 0, 0, 0,
+  0, 0, 0, 62, 0, 0, 0, 54, 0, 32,
+  4, 0, 0, 16, 7, 12, 54, 37, 0, 0,
+  0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+  49, 0, 30, 0, 0, 0, 5, 29, 27, 0,
+  0, 9, 0, 21, 35, 23, 45, 0, 23, 22,
+  4, 26, 21, 30, 26, 0, 0, 24, 0, 19,
+  0, 0, 46, 43, 11, 0, 0, 0, 0, 0,
+  30, 1, 0, 44, 0, 0, 0, 16, 0, 0,
+  1, 3, 6, 0, 0, 0, 95, 0, 52, 0,
+  20, 0, 0, 44, 27, 0, 33, 0, 0, 0,
+  76, 0, 0, 1, 67, 69, 11, 51, 63, 32,
+  6, 0, 66, 0, 0, 38, 0, 0, 28, 40,
+  0, 0, 0, 0, 7, 0, 0, 0, 0, 27,
+  0, 47, 0, 0, 0, 20, 0, 38, 0, 0,
+  0, 16, 0, 34, 21, 7, 0, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 0, 0, 98, 0,
+  25, 5, 0, 0, 0, 78, 9, 0, 0, 35,
+  0, 0, 12, 5, 38, 41, 20, 53, 0, 44,
+  32, 14, 27, 37, 0, 13, 0, 0, 0, 0,
+  28, 63, 38, 0, 0, 0, 0, 0, 3, 36,
+  0, 61, 0, 0, 0, 5, 3, 0, 4, 0,
+  0, 0, 0, 0, 77, 0, 26, 0, 18, 21,
+  0, 9, 0, 0, 15, 0, 57, 0, 37, 0,
+  0, 0, 30, 12, 51, 40, 45, 47, 0, 28,
+  101, 0, 0, 27, 0, 9, 25, 8, 0, 23,
+  0, 0, 52, 4, 22, 0, 0, 12, 0, 35,
+  0, 7, 0, 70, 5, 54, 4, 16, 0, 0,
+  13, 8, 68, 27, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 23, 1, 27, 0,
+  0, 0, 0, 10, 48, 0, 7, 9, 0, 11,
+  57, 13, 9, 0, 13, 0, 0, 0, 22, 29,
+  9, 0, 0, 15, 0, 34, 0, 0, 59, 37,
+  0, 0, 0, 0, 12, 0, 17, 14, 11, 27,
+  0, 0, 0, 5, 0, 0, 24, 0, 14, 0,
+  27, 0, 77, 0, 21, 0, 13, 0, 0, 33,
+  0, 0, 27, 0, 41, 0, 45, 22, 0, 7,
+  22, 44, 69, 48, 60, 49, 0, 17, 100, 0,
+  0, 26, 19, 29, 19, 25, 0, 21, 0, 0,
+  29, 10, 19, 0, 0, 21, 0, 35, 0, 0,
+  0, 56, 7, 31, 16, 4, 0, 0, 48, 0,
+  33, 46, 0, 2, 16, 0, 0, 12, 0, 0,
+  0, 0, 0, 0, 48, 0, 33, 0, 0, 0,
+  0, 6, 51, 0, 15, 23, 0, 30, 42, 35,
+  0, 0, 24, 0, 0, 0, 26, 42, 0, 0,
+  0, 46, 0, 27, 0, 13, 75, 38, 0, 0,
+  0, 0, 17, 0, 16, 5, 28, 44, 0, 0,
+  0, 5, 8, 0, 2, 0, 24, 0, 4, 0,
+  105, 0, 27, 6, 32, 0, 0, 33, 0, 0,
+  36, 0, 0, 3, 48, 28, 0, 0, 10, 59,
+  39, 46, 67, 44, 12, 0, 51, 0, 0, 36,
+  0, 22, 41, 60, 0, 0, 0, 0, 19, 0,
+  7, 0, 0, 22, 0, 24, 0, 0, 0, 4,
+  0, 17, 23, 0, 0, 0, 55, 0, 1, 17,
+  0, 0, 18, 15, 0, 17, 0, 0, 0, 0,
+  0, 0, 102, 0, 17, 0, 0, 0, 5, 41,
+  35, 0, 3, 53, 0, 13, 18, 38, 12, 42,
+  10, 28, 0, 30, 22, 26, 21, 17, 0, 42,
+  0, 0, 0, 2, 49, 55, 1, 0, 0, 0,
+  16, 0, 14, 19, 32, 69, 0, 3, 0, 0,
+  21, 0, 0, 0, 17, 0, 0, 13, 100, 0,
+  0, 0, 30, 37, 0, 29, 0, 0, 20, 0,
+  45, 0, 38, 0, 0, 2, 26, 28, 73, 29,
+  52, 53, 0, 24, 91, 0, 0, 24, 16, 39,
+  26, 0, 0, 20, 0, 0, 40, 12, 3, 0,
+  0, 8, 0, 47, 0, 9, 0, 58, 0, 33,
+  12, 19, 0, 0, 17, 3, 66, 44, 0, 0,
+  7, 0, 0, 3, 7, 0, 0, 0, 0, 0,
+  42, 7, 32, 0, 0, 0, 0, 10, 51, 0,
+  4, 0, 0, 8, 61, 18, 25, 0, 32, 0,
+  8, 4, 12, 12, 2, 0, 0, 26, 0, 31,
+  0, 0, 56, 29, 0, 2, 0, 0, 0, 0,
+  30, 0, 7, 37, 0, 0, 0, 21, 0, 0,
+  7, 6, 14, 0, 16, 0, 90, 0, 25, 0,
+  12, 0, 0, 65, 0, 0, 34, 0, 36, 0,
+  61, 12, 0, 5, 44, 54, 61, 74, 64, 45,
+  0, 12, 72, 0, 0, 33, 31, 57, 17, 27,
+  0, 12, 0, 0, 29, 8, 17, 0, 0, 37,
+  0, 58, 0, 3, 0, 54, 0, 29, 24, 4,
+  0, 0, 35, 0, 43, 56, 0, 0, 7, 0,
+  0, 32, 0, 0, 0, 0, 0, 0, 70, 9,
+  41, 0, 0, 0, 0, 18, 51, 0, 0, 21,
+  0, 27, 40, 52, 13, 20, 40, 15, 0, 9,
+  25, 57, 3, 0, 0, 59, 0, 27, 0, 5,
+  69, 44, 0, 0, 0, 0, 2, 0, 12, 20,
+  36, 60, 0, 0, 0, 21, 0, 0, 0, 18,
+  24, 0, 0, 1, 134, 0, 38, 0, 44, 0,
+  0, 26, 42, 0, 40, 0, 0, 0, 68, 7,
+  0, 5, 43, 69, 21, 36, 59, 16, 3, 0,
+  30, 7, 16, 33, 0, 0, 32, 69, 0, 5,
+  0, 0, 0, 0, 0, 0, 0, 55, 0, 45,
+  0, 4, 0, 0, 0, 8, 12, 0, 0, 16,
+  23, 16, 0, 8, 0, 0, 24, 20, 0, 0,
+  0, 0, 0, 0, 0, 0, 70, 10, 16, 0,
+  0, 0, 0, 27, 24, 0, 0, 57, 0, 13,
+  0, 13, 15, 76, 12, 31, 0, 45, 9, 26,
+  24, 0, 0, 11, 0, 0, 0, 0, 52, 56,
+  16, 0, 0, 0, 1, 0, 7, 24, 39, 91,
+  4, 0, 0, 0, 0, 0, 11, 0, 10, 0,
+  0, 35, 51, 0, 0, 0, 24, 66, 0, 49,
+  1, 0, 30, 0, 15, 0, 64, 0, 0, 7,
+  46, 41, 52, 60, 59, 47, 14, 4, 85, 0,
+  0, 29, 21, 32, 22, 9, 0, 19, 0, 0,
+  33, 0, 0, 0, 0, 0, 0, 62, 0, 0,
+  0, 54, 0, 32, 4, 0, 0, 16, 7, 12,
+  54, 37, 0, 0, 0, 0, 0, 0, 1, 0,
+  0, 0, 0, 0, 49, 0, 30, 0, 0, 0,
+  5, 29, 27, 0, 0, 9, 0, 21, 35, 23,
+  45, 0, 23, 22, 4, 26, 21, 30, 26, 0,
+  0, 24, 0, 19, 0, 0, 46, 43, 11, 0,
+  0, 0, 0, 0, 30, 1, 0, 44, 0, 0,
+  0, 16, 0, 0, 1, 3, 6, 0, 0, 0,
+  95, 0, 52, 0, 20, 0, 0, 44, 27, 0,
+  33, 0, 0, 0, 76, 0, 0, 1, 67, 69,
+  11, 51, 63, 32, 6, 0, 66, 0, 0, 38,
+  0, 0, 28, 40, 0, 0, 0, 0, 7, 0,
+  0, 0, 0, 27, 0, 47, 0, 0, 0, 20,
+  0, 38, 0, 0, 0, 16, 0, 34, 21, 7,
+  0, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  0, 0, 98, 0, 25, 5, 0, 0, 0, 78,
+  9, 0, 0, 35, 0, 0, 12, 5, 38, 41,
+  20, 53, 0, 44, 32, 14, 27, 37, 0, 13,
+  0, 0, 0, 0, 28, 63, 38, 0, 0, 0,
+  0, 0, 3, 36, 0, 61, 0, 0, 0, 5,
+  3, 0, 4, 0, 0, 0, 0, 0, 77, 0,
+  26, 0, 18, 21, 29, 0, 57, 0, 12, 30,
+  0, 0, 52, 0, 0, 2, 43, 101, 14, 0,
+  40, 0, 0, 0, 32, 66, 0, 35, 0, 0,
+  0, 29, 0, 8, 0, 0, 0, 11, 0, 0,
+  0, 50, 0, 48, 0, 31, 0, 0, 0, 0,
+  0, 0, 6, 9, 0, 67, 0, 0, 11, 0,
+  13, 40, 0, 0, 5, 7, 0, 44, 0, 15,
+  58, 0, 30, 45, 0, 14, 0, 32, 0, 0,
+  0, 10, 0, 27, 0, 3, 29, 32, 45, 49,
+  0, 64, 21, 0, 0, 14, 0, 0, 0, 0,
+  0, 0, 30, 78, 0, 0, 0, 0, 0, 18,
+  0, 23, 14, 57, 17, 0, 0, 0, 29, 0,
+  59, 1, 9, 2, 0, 17, 0, 0, 0, 0,
+  0, 41, 0, 33, 0, 0, 27, 0, 41, 0,
+  45, 22, 0, 7, 22, 44, 69, 48, 60, 49,
+  0, 17, 100, 0, 0, 26, 19, 29, 19, 25,
+  0, 21, 0, 0, 29, 10, 19, 0, 0, 21,
+  0, 35, 0, 0, 0, 56, 7, 31, 16, 4,
+  0, 0, 48, 0, 33, 46, 0, 2, 16, 0,
+  0, 12, 0, 0, 0, 0, 0, 0, 48, 0,
+  33, 0, 0, 0, 0, 6, 51, 0, 15, 23,
+  0, 30, 42, 35, 0, 0, 24, 0, 0, 0,
+  26, 42, 0, 0, 0, 46, 0, 27, 0, 13,
+  75, 38, 0, 0, 0, 0, 17, 0, 16, 5,
+  28, 44, 0, 0, 0, 5, 8, 0, 2, 0,
+  24, 0, 4, 0, 105, 0, 27, 6, 32, 0,
+  0, 33, 0, 0, 36, 0, 0, 3, 48, 28,
+  0, 0, 10, 59, 39, 46, 67, 44, 12, 0,
+  51, 0, 0, 36, 0, 22, 41, 60, 0, 0,
+  0, 0, 19, 0, 7, 0, 0, 22, 0, 24,
+  0, 0, 0, 4, 0, 17, 23, 0, 0, 0,
+  55, 0, 1, 17, 0, 0, 18, 15, 0, 17,
+  0, 0, 0, 0, 0, 0, 102, 0, 17, 0,
+  0, 0, 5, 41, 35, 0, 3, 53, 0, 13,
+  18, 38, 12, 42, 10, 28, 0, 30, 22, 26,
+  21, 17, 0, 42, 0, 0, 0, 2, 49, 55,
+  1, 0, 0, 0, 16, 0, 14, 19, 32, 69,
+  0, 3, 0, 0, 21, 0, 0, 0, 17, 0,
+  0, 13, 100, 0, 0, 0, 30, 37, 12, 0,
+  30, 0, 18, 0, 0, 0, 37, 30, 0, 0,
+  4, 71, 11, 0, 44, 48, 26, 0, 25, 1,
+  22, 8, 0, 6, 34, 49, 0, 0, 16, 0,
+  0, 5, 0, 0, 40, 32, 0, 1, 1, 0,
+  0, 0, 0, 0, 9, 0, 0, 0, 31, 0,
+  0, 10, 0, 0, 0, 51, 0, 0, 2, 6,
+  23, 5, 0, 0, 106, 5, 12, 82, 0, 0,
+  6, 39, 0, 0, 0, 50, 1, 0, 0, 34,
+  0, 54, 42, 31, 0, 69, 0, 0, 0, 56,
+  0, 0, 20, 0, 0, 15, 19, 45, 10, 6,
+  0, 0, 0, 0, 0, 21, 1, 57, 6, 0,
+  0, 0, 53, 11, 0, 0, 15, 0, 0, 26,
+  8, 0, 0, 12, 42, 48, 0, 65, 0, 0,
+  34, 0, 36, 0, 61, 12, 0, 5, 44, 54,
+  61, 74, 64, 45, 0, 12, 72, 0, 0, 33,
+  31, 57, 17, 27, 0, 12, 0, 0, 29, 8,
+  17, 0, 0, 37, 0, 58, 0, 3, 0, 54,
+  0, 29, 24, 4, 0, 0, 35, 0, 43, 56,
+  0, 0, 7, 0, 0, 32, 0, 0, 0, 0,
+  0, 0, 70, 9, 41, 0, 0, 0, 0, 18,
+  51, 0, 0, 21, 0, 27, 40, 52, 13, 20,
+  40, 15, 0, 9, 25, 57, 3, 0, 0, 59,
+  0, 27, 0, 5, 69, 44, 0, 0, 0, 0,
+  2, 0, 12, 20, 36, 60, 0, 0, 0, 21,
+  0, 0, 0, 18, 24, 0, 0, 1, 134, 0,
+  38, 0, 44, 0, 0, 26, 42, 0, 40, 0,
+  0, 0, 68, 7, 0, 5, 43, 69, 21, 36,
+  59, 16, 3, 0, 30, 7, 16, 33, 0, 0,
+  32, 69, 0, 5, 0, 0, 0, 0, 0, 0,
+  0, 55, 0, 45, 0, 4, 0, 0, 0, 8,
+  12, 0, 0, 16, 23, 16, 0, 8, 0, 0,
+  24, 20, 0, 0, 0, 0, 0, 0, 0, 0,
+  70, 10, 16, 0, 0, 0, 0, 27, 24, 0,
+  0, 57, 0, 13, 0, 13, 15, 76, 12, 31,
+  0, 45, 9, 26, 24, 0, 0, 11, 0, 0,
+  0, 0, 52, 56, 16, 0, 0, 0, 1, 0,
+  7, 24, 39, 91, 4, 0, 0, 0, 0, 0,
+  11, 0, 10, 0, 0, 35, 51, 0, 0, 0,
+  24, 66, 70, 0, 17, 0, 20, 30, 0, 0,
+  12, 0, 0, 0, 2, 79, 18, 0, 26, 23,
+  6, 5, 29, 52, 17, 15, 0, 0, 8, 29,
+  0, 0, 0, 9, 0, 47, 0, 0, 7, 43,
+  0, 12, 0, 10, 0, 0, 5, 0, 16, 5,
+  10, 0, 24, 4, 0, 0, 15, 0, 23, 37,
+  5, 0, 30, 16, 31, 0, 0, 12, 69, 32,
+  32, 66, 0, 18, 10, 0, 25, 0, 0, 55,
+  11, 6, 0, 12, 0, 37, 48, 12, 31, 65,
+  0, 0, 0, 0, 0, 0, 29, 0, 0, 17,
+  57, 30, 0, 27, 0, 0, 0, 60, 0, 14,
+  29, 64, 0, 0, 0, 1, 7, 52, 58, 0,
+  0, 0, 0, 32, 0, 0, 0, 19, 23, 49,
+  0, 44, 27, 0, 33, 0, 0, 0, 76, 0,
+  0, 1, 67, 69, 11, 51, 63, 32, 6, 0,
+  66, 0, 0, 38, 0, 0, 28, 40, 0, 0,
+  0, 0, 7, 0, 0, 0, 0, 27, 0, 47,
+  0, 0, 0, 20, 0, 38, 0, 0, 0, 16,
+  0, 34, 21, 7, 0, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 0, 0, 98, 0, 25, 5,
+  0, 0, 0, 78, 9, 0, 0, 35, 0, 0,
+  12, 5, 38, 41, 20, 53, 0, 44, 32, 14,
+  27, 37, 0, 13, 0, 0, 0, 0, 28, 63,
+  38, 0, 0, 0, 0, 0, 3, 36, 0, 61,
+  0, 0, 0, 5, 3, 0, 4, 0, 0, 0,
+  0, 0, 77, 0, 26, 0, 18, 21, 29, 0,
+  57, 0, 12, 30, 0, 0, 52, 0, 0, 2,
+  43, 101, 14, 0, 40, 0, 0, 0, 32, 66,
+  0, 35, 0, 0, 0, 29, 0, 8, 0, 0,
+  0, 11, 0, 0, 0, 50, 0, 48, 0, 31,
+  0, 0, 0, 0, 0, 0, 6, 9, 0, 67,
+  0, 0, 11, 0, 13, 40, 0, 0, 5, 7,
+  0, 44, 0, 15, 58, 0, 30, 45, 0, 14,
+  0, 32, 0, 0, 0, 10, 0, 27, 0, 3,
+  29, 32, 45, 49, 0, 64, 21, 0, 0, 14,
+  0, 0, 0, 0, 0, 0, 30, 78, 0, 0,
+  0, 0, 0, 18, 0, 23, 14, 57, 17, 0,
+  0, 0, 29, 0, 59, 1, 9, 2, 0, 17,
+  0, 0, 0, 0, 0, 41, 0, 0, 0, 0,
+  31, 51, 0, 0, 37, 2, 0, 0, 4, 70,
+  43, 0, 24, 35, 0, 14, 56, 0, 0, 39,
+  0, 0, 9, 13, 0, 36, 0, 0, 0, 14,
+  0, 0, 0, 19, 0, 41, 0, 0, 0, 5,
+  3, 0, 4, 0, 0, 0, 23, 13, 20, 0,
+  0, 0, 18, 34, 0, 0, 4, 17, 0, 0,
+  0, 0, 21, 0, 0, 0, 0, 23, 10, 1,
+  39, 9, 0, 0, 1, 25, 3, 20, 0, 8,
+  17, 5, 38, 41, 32, 19, 10, 0, 6, 0,
+  0, 0, 0, 5, 45, 39, 4, 0, 0, 0,
+  0, 31, 0, 9, 12, 73, 0, 0, 0, 0,
+  2, 0, 65, 11, 0, 5, 37, 0, 20, 0,
+  0, 11, 0, 8, 0, 33, 0, 0, 36, 0,
+  0, 3, 48, 28, 0, 0, 10, 59, 39, 46,
+  67, 44, 12, 0, 51, 0, 0, 36, 0, 22,
+  41, 60, 0, 0, 0, 0, 19, 0, 7, 0,
+  0, 22, 0, 24, 0, 0, 0, 4, 0, 17,
+  23, 0, 0, 0, 55, 0, 1, 17, 0, 0,
+  18, 15, 0, 17, 0, 0, 0, 0, 0, 0,
+  102, 0, 17, 0, 0, 0, 5, 41, 35, 0,
+  3, 53, 0, 13, 18, 38, 12, 42, 10, 28,
+  0, 30, 22, 26, 21, 17, 0, 42, 0, 0,
+  0, 2, 49, 55, 1, 0, 0, 0, 16, 0,
+  14, 19, 32, 69, 0, 3, 0, 0, 21, 0,
+  0, 0, 17, 0, 0, 13, 100, 0, 0, 0,
+  30, 37, 12, 0, 30, 0, 18, 0, 0, 0,
+  37, 30, 0, 0, 4, 71, 11, 0, 44, 48,
+  26, 0, 25, 1, 22, 8, 0, 6, 34, 49,
+  0, 0, 16, 0, 0, 5, 0, 0, 40, 32,
+  0, 1, 1, 0, 0, 0, 0, 0, 9, 0,
+  0, 0, 31, 0, 0, 10, 0, 0, 0, 51,
+  0, 0, 2, 6, 23, 5, 0, 0, 106, 5,
+  12, 82, 0, 0, 6, 39, 0, 0, 0, 50,
+  1, 0, 0, 34, 0, 54, 42, 31, 0, 69,
+  0, 0, 0, 56, 0, 0, 20, 0, 0, 15,
+  19, 45, 10, 6, 0, 0, 0, 0, 0, 21,
+  1, 57, 6, 0, 0, 0, 53, 11, 0, 0,
+  15, 0, 0, 26, 8, 0, 0, 12, 42, 48,
+  16, 0, 43, 0, 0, 0, 0, 0, 40, 54,
+  0, 16, 0, 59, 14, 0, 21, 57, 23, 17,
+  21, 14, 54, 0, 0, 0, 42, 21, 0, 0,
+  0, 0, 0, 0, 0, 0, 54, 47, 0, 0,
+  9, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+  23, 0, 0, 0, 10, 0, 8, 40, 0, 0,
+  0, 25, 50, 0, 59, 21, 36, 7, 0, 114,
+  0, 9, 8, 6, 0, 0, 4, 34, 0, 0,
+  0, 19, 0, 29, 42, 2, 22, 44, 6, 0,
+  0, 57, 0, 0, 19, 0, 0, 0, 14, 17,
+  24, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+  0, 0, 0, 0, 81, 4, 14, 0, 20, 0,
+  0, 18, 0, 0, 0, 19, 37, 4, 0, 26,
+  42, 0, 40, 0, 0, 0, 68, 7, 0, 5,
+  43, 69, 21, 36, 59, 16, 3, 0, 30, 7,
+  16, 33, 0, 0, 32, 69, 0, 5, 0, 0,
+  0, 0, 0, 0, 0, 55, 0, 45, 0, 4,
+  0, 0, 0, 8, 12, 0, 0, 16, 23, 16,
+  0, 8, 0, 0, 24, 20, 0, 0, 0, 0,
+  0, 0, 0, 0, 70, 10, 16, 0, 0, 0,
+  0, 27, 24, 0, 0, 57, 0, 13, 0, 13,
+  15, 76, 12, 31, 0, 45, 9, 26, 24, 0,
+  0, 11, 0, 0, 0, 0, 52, 56, 16, 0,
+  0, 0, 1, 0, 7, 24, 39, 91, 4, 0,
+  0, 0, 0, 0, 11, 0, 10, 0, 0, 35,
+  51, 0, 0, 0, 24, 66, 70, 0, 17, 0,
+  20, 30, 0, 0, 12, 0, 0, 0, 2, 79,
+  18, 0, 26, 23, 6, 5, 29, 52, 17, 15,
+  0, 0, 8, 29, 0, 0, 0, 9, 0, 47,
+  0, 0, 7, 43, 0, 12, 0, 10, 0, 0,
+  5, 0, 16, 5, 10, 0, 24, 4, 0, 0,
+  15, 0, 23, 37, 5, 0, 30, 16, 31, 0,
+  0, 12, 69, 32, 32, 66, 0, 18, 10, 0,
+  25, 0, 0, 55, 11, 6, 0, 12, 0, 37,
+  48, 12, 31, 65, 0, 0, 0, 0, 0, 0,
+  29, 0, 0, 17, 57, 30, 0, 27, 0, 0,
+  0, 60, 0, 14, 29, 64, 0, 0, 0, 1,
+  7, 52, 58, 0, 0, 0, 0, 32, 0, 0,
+  0, 19, 23, 49, 22, 3, 0, 0, 24, 14,
+  0, 0, 31, 13, 0, 23, 0, 61, 30, 0,
+  16, 46, 7, 38, 53, 0, 0, 0, 7, 20,
+  37, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  9, 0, 0, 0, 0, 3, 0, 3, 12, 0,
+  13, 5, 0, 0, 57, 0, 3, 0, 0, 0,
+  27, 17, 0, 0, 5, 8, 37, 0, 0, 0,
+  19, 60, 0, 39, 0, 33, 30, 0, 37, 12,
+  0, 30, 0, 10, 5, 30, 0, 0, 41, 0,
+  71, 36, 0, 13, 0, 0, 4, 0, 18, 0,
+  0, 16, 44, 2, 0, 26, 0, 0, 0, 38,
+  5, 6, 19, 51, 0, 0, 0, 14, 43, 20,
+  37, 0, 0, 0, 39, 13, 0, 0, 0, 39,
+  17, 0, 29, 0, 57, 0, 12, 30, 0, 0,
+  52, 0, 0, 2, 43, 101, 14, 0, 40, 0,
+  0, 0, 32, 66, 0, 35, 0, 0, 0, 29,
+  0, 8, 0, 0, 0, 11, 0, 0, 0, 50,
+  0, 48, 0, 31, 0, 0, 0, 0, 0, 0,
+  6, 9, 0, 67, 0, 0, 11, 0, 13, 40,
+  0, 0, 5, 7, 0, 44, 0, 15, 58, 0,
+  30, 45, 0, 14, 0, 32, 0, 0, 0, 10,
+  0, 27, 0, 3, 29, 32, 45, 49, 0, 64,
+  21, 0, 0, 14, 0, 0, 0, 0, 0, 0,
+  30, 78, 0, 0, 0, 0, 0, 18, 0, 23,
+  14, 57, 17, 0, 0, 0, 29, 0, 59, 1,
+  9, 2, 0, 17, 0, 0, 0, 0, 0, 41,
+  0, 0, 0, 0, 31, 51, 0, 0, 37, 2,
+  0, 0, 4, 70, 43, 0, 24, 35, 0, 14,
+  56, 0, 0, 39, 0, 0, 9, 13, 0, 36,
+  0, 0, 0, 14, 0, 0, 0, 19, 0, 41,
+  0, 0, 0, 5, 3, 0, 4, 0, 0, 0,
+  23, 13, 20, 0, 0, 0, 18, 34, 0, 0,
+  4, 17, 0, 0, 0, 0, 21, 0, 0, 0,
+  0, 23, 10, 1, 39, 9, 0, 0, 1, 25,
+  3, 20, 0, 8, 17, 5, 38, 41, 32, 19,
+  10, 0, 6, 0, 0, 0, 0, 5, 45, 39,
+  4, 0, 0, 0, 0, 31, 0, 9, 12, 73,
+  0, 0, 0, 0, 2, 0, 65, 11, 0, 5,
+  37, 0, 20, 0, 0, 11, 0, 8, 0, 32,
+  0, 0, 31, 0, 19, 0, 50, 0, 0, 16,
+  7, 64, 58, 24, 16, 46, 0, 28, 76, 0,
+  0, 47, 16, 40, 25, 0, 0, 27, 0, 0,
+  0, 37, 5, 0, 0, 0, 0, 29, 0, 1,
+  0, 41, 21, 3, 4, 6, 0, 0, 60, 0,
+  56, 11, 0, 0, 8, 6, 0, 26, 13, 0,
+  0, 0, 0, 0, 17, 6, 0, 0, 0, 25,
+  0, 0, 41, 13, 0, 0, 0, 30, 48, 39,
+  12, 0, 31, 0, 58, 23, 37, 56, 3, 0,
+  8, 19, 0, 16, 0, 10, 57, 33, 0, 0,
+  0, 0, 0, 0, 23, 0, 31, 59, 0, 0,
+  0, 1, 24, 0, 21, 0, 8, 0, 47, 0,
+  77, 0, 1, 23, 9, 0, 12, 0, 30, 0,
+  18, 0, 0, 0, 37, 30, 0, 0, 4, 71,
+  11, 0, 44, 48, 26, 0, 25, 1, 22, 8,
+  0, 6, 34, 49, 0, 0, 16, 0, 0, 5,
+  0, 0, 40, 32, 0, 1, 1, 0, 0, 0,
+  0, 0, 9, 0, 0, 0, 31, 0, 0, 10,
+  0, 0, 0, 51, 0, 0, 2, 6, 23, 5,
+  0, 0, 106, 5, 12, 82, 0, 0, 6, 39,
+  0, 0, 0, 50, 1, 0, 0, 34, 0, 54,
+  42, 31, 0, 69, 0, 0, 0, 56, 0, 0,
+  20, 0, 0, 15, 19, 45, 10, 6, 0, 0,
+  0, 0, 0, 21, 1, 57, 6, 0, 0, 0,
+  53, 11, 0, 0, 15, 0, 0, 26, 8, 0,
+  0, 12, 42, 48, 16, 0, 43, 0, 0, 0,
+  0, 0, 40, 54, 0, 16, 0, 59, 14, 0,
+  21, 57, 23, 17, 21, 14, 54, 0, 0, 0,
+  42, 21, 0, 0, 0, 0, 0, 0, 0, 0,
+  54, 47, 0, 0, 9, 0, 0, 0, 0, 0,
+  9, 0, 0, 0, 23, 0, 0, 0, 10, 0,
+  8, 40, 0, 0, 0, 25, 50, 0, 59, 21,
+  36, 7, 0, 114, 0, 9, 8, 6, 0, 0,
+  4, 34, 0, 0, 0, 19, 0, 29, 42, 2,
+  22, 44, 6, 0, 0, 57, 0, 0, 19, 0,
+  0, 0, 14, 17, 24, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 0, 0, 0, 0, 81, 4,
+  14, 0, 20, 0, 0, 18, 0, 0, 0, 19,
+  37, 4, 30, 0, 21, 8, 18, 0, 0, 0,
+  23, 36, 0, 0, 0, 54, 7, 0, 0, 65,
+  15, 16, 55, 1, 62, 10, 0, 0, 52, 0,
+  0, 0, 14, 0, 0, 0, 0, 0, 9, 33,
+  0, 0, 29, 0, 0, 9, 0, 0, 15, 0,
+  0, 0, 30, 30, 0, 0, 29, 0, 20, 15,
+  0, 0, 0, 14, 64, 0, 89, 22, 8, 0,
+  0, 130, 0, 14, 8, 0, 2, 0, 14, 22,
+  0, 0, 24, 0, 8, 22, 41, 0, 39, 0,
+  26, 0, 0, 30, 15, 0, 0, 0, 0, 0,
+  23, 0, 15, 0, 0, 0, 0, 0, 0, 32,
+  0, 10, 0, 9, 0, 0, 99, 17, 35, 0,
+  24, 0, 6, 0, 0, 0, 0, 31, 25, 0,
+  70, 0, 17, 0, 20, 30, 0, 0, 12, 0,
+  0, 0, 2, 79, 18, 0, 26, 23, 6, 5,
+  29, 52, 17, 15, 0, 0, 8, 29, 0, 0,
+  0, 9, 0, 47, 0, 0, 7, 43, 0, 12,
+  0, 10, 0, 0, 5, 0, 16, 5, 10, 0,
+  24, 4, 0, 0, 15, 0, 23, 37, 5, 0,
+  30, 16, 31, 0, 0, 12, 69, 32, 32, 66,
+  0, 18, 10, 0, 25, 0, 0, 55, 11, 6,
+  0, 12, 0, 37, 48, 12, 31, 65, 0, 0,
+  0, 0, 0, 0, 29, 0, 0, 17, 57, 30,
+  0, 27, 0, 0, 0, 60, 0, 14, 29, 64,
+  0, 0, 0, 1, 7, 52, 58, 0, 0, 0,
+  0, 32, 0, 0, 0, 19, 23, 49, 22, 3,
+  0, 0, 24, 14, 0, 0, 31, 13, 0, 23,
+  0, 61, 30, 0, 16, 46, 7, 38, 53, 0,
+  0, 0, 7, 20, 37, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 9, 0, 0, 0, 0, 3,
+  0, 3, 12, 0, 13, 5, 0, 0, 57, 0,
+  3, 0, 0, 0, 27, 17, 0, 0, 5, 8,
+  37, 0, 0, 0, 19, 60, 0, 39, 0, 33,
+  30, 0, 37, 12, 0, 30, 0, 10, 5, 30,
+  0, 0, 41, 0, 71, 36, 0, 13, 0, 0,
+  4, 0, 18, 0, 0, 16, 44, 2, 0, 26,
+  0, 0, 0, 38, 5, 6, 19, 51, 0, 0,
+  0, 14, 43, 20, 37, 0, 0, 0, 39, 13,
+  0, 0, 0, 39, 17, 0, 19, 51, 0, 11,
+  63, 0, 36, 0, 33, 2, 0, 24, 2, 46,
+  28, 0, 6, 25, 11, 52, 60, 0, 0, 15,
+  21, 37, 39, 0, 0, 21, 42, 0, 0, 33,
+  0, 0, 0, 0, 0, 0, 0, 29, 0, 51,
+  23, 0, 7, 28, 0, 0, 51, 0, 37, 15,
+  0, 12, 5, 0, 0, 22, 16, 2, 15, 0,
+  0, 0, 4, 57, 0, 0, 0, 41, 5, 0,
+  60, 0, 19, 1, 4, 1, 52, 31, 4, 0,
+  58, 0, 51, 26, 21, 39, 0, 0, 0, 32,
+  0, 23, 0, 0, 55, 8, 0, 36, 1, 0,
+  0, 0, 14, 29, 63, 36, 0, 0, 0, 0,
+  46, 0, 12, 0, 4, 0, 35, 1, 40, 0,
+  0, 33, 0, 0, 0, 0, 0, 0, 31, 51,
+  0, 0, 37, 2, 0, 0, 4, 70, 43, 0,
+  24, 35, 0, 14, 56, 0, 0, 39, 0, 0,
+  9, 13, 0, 36, 0, 0, 0, 14, 0, 0,
+  0, 19, 0, 41, 0, 0, 0, 5, 3, 0,
+  4, 0, 0, 0, 23, 13, 20, 0, 0, 0,
+  18, 34, 0, 0, 4, 17, 0, 0, 0, 0,
+  21, 0, 0, 0, 0, 23, 10, 1, 39, 9,
+  0, 0, 1, 25, 3, 20, 0, 8, 17, 5,
+  38, 41, 32, 19, 10, 0, 6, 0, 0, 0,
+  0, 5, 45, 39, 4, 0, 0, 0, 0, 31,
+  0, 9, 12, 73, 0, 0, 0, 0, 2, 0,
+  65, 11, 0, 5, 37, 0, 20, 0, 0, 11,
+  0, 8, 0, 32, 0, 0, 31, 0, 19, 0,
+  50, 0, 0, 16, 7, 64, 58, 24, 16, 46,
+  0, 28, 76, 0, 0, 47, 16, 40, 25, 0,
+  0, 27, 0, 0, 0, 37, 5, 0, 0, 0,
+  0, 29, 0, 1, 0, 41, 21, 3, 4, 6,
+  0, 0, 60, 0, 56, 11, 0, 0, 8, 6,
+  0, 26, 13, 0, 0, 0, 0, 0, 17, 6,
+  0, 0, 0, 25, 0, 0, 41, 13, 0, 0,
+  0, 30, 48, 39, 12, 0, 31, 0, 58, 23,
+  37, 56, 3, 0, 8, 19, 0, 16, 0, 10,
+  57, 33, 0, 0, 0, 0, 0, 0, 23, 0,
+  31, 59, 0, 0, 0, 1, 24, 0, 21, 0,
+  8, 0, 47, 0, 77, 0, 1, 23, 9, 0,
+  0, 86, 6, 8, 42, 0, 32, 0, 64, 4,
+  0, 0, 6, 42, 74, 53, 38, 43, 0, 27,
+  68, 0, 0, 42, 0, 47, 25, 9, 0, 24,
+  6, 0, 0, 29, 9, 0, 0, 0, 0, 25,
+  0, 26, 0, 59, 9, 0, 0, 24, 0, 0,
+  45, 0, 88, 34, 0, 0, 0, 0, 0, 9,
+  6, 0, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 0, 0, 17, 64, 0, 2, 0, 1, 0,
+  91, 28, 8, 0, 51, 13, 35, 13, 47, 25,
+  0, 0, 0, 32, 0, 22, 0, 0, 48, 22,
+  0, 7, 0, 0, 23, 0, 25, 21, 43, 64,
+  10, 0, 0, 0, 29, 0, 0, 0, 18, 0,
+  4, 0, 74, 0, 0, 37, 25, 0, 16, 0,
+  43, 0, 0, 0, 0, 0, 40, 54, 0, 16,
+  0, 59, 14, 0, 21, 57, 23, 17, 21, 14,
+  54, 0, 0, 0, 42, 21, 0, 0, 0, 0,
+  0, 0, 0, 0, 54, 47, 0, 0, 9, 0,
+  0, 0, 0, 0, 9, 0, 0, 0, 23, 0,
+  0, 0, 10, 0, 8, 40, 0, 0, 0, 25,
+  50, 0, 59, 21, 36, 7, 0, 114, 0, 9,
+  8, 6, 0, 0, 4, 34, 0, 0, 0, 19,
+  0, 29, 42, 2, 22, 44, 6, 0, 0, 57,
+  0, 0, 19, 0, 0, 0, 14, 17, 24, 0,
+  0, 0, 0, 0, 0, 0, 0, 39, 0, 0,
+  0, 0, 81, 4, 14, 0, 20, 0, 0, 18,
+  0, 0, 0, 19, 37, 4, 30, 0, 21, 8,
+  18, 0, 0, 0, 23, 36, 0, 0, 0, 54,
+  7, 0, 0, 65, 15, 16, 55, 1, 62, 10,
+  0, 0, 52, 0, 0, 0, 14, 0, 0, 0,
+  0, 0, 9, 33, 0, 0, 29, 0, 0, 9,
+  0, 0, 15, 0, 0, 0, 30, 30, 0, 0,
+  29, 0, 20, 15, 0, 0, 0, 14, 64, 0,
+  89, 22, 8, 0, 0, 130, 0, 14, 8, 0,
+  2, 0, 14, 22, 0, 0, 24, 0, 8, 22,
+  41, 0, 39, 0, 26, 0, 0, 30, 15, 0,
+  0, 0, 0, 0, 23, 0, 15, 0, 0, 0,
+  0, 0, 0, 32, 0, 10, 0, 9, 0, 0,
+  99, 17, 35, 0, 24, 0, 6, 0, 0, 0,
+  0, 31, 25, 0, 5, 13, 0, 32, 19, 0,
+  8, 0, 42, 4, 0, 13, 0, 36, 0, 0,
+  0, 57, 0, 20, 78, 0, 62, 17, 0, 0,
+  48, 0, 0, 0, 23, 0, 0, 0, 0, 0,
+  0, 22, 0, 0, 41, 0, 0, 33, 9, 0,
+  6, 0, 0, 0, 32, 6, 0, 0, 33, 0,
+  37, 0, 4, 0, 0, 39, 62, 0, 84, 8,
+  32, 22, 0, 130, 0, 9, 16, 0, 0, 9,
+  33, 13, 0, 0, 29, 13, 0, 22, 32, 0,
+  33, 0, 24, 0, 0, 28, 10, 0, 0, 0,
+  8, 0, 32, 0, 10, 12, 0, 0, 0, 0,
+  0, 83, 0, 0, 2, 0, 0, 0, 98, 36,
+  46, 0, 18, 0, 8, 0, 0, 0, 0, 28,
+  8, 0, 22, 3, 0, 0, 24, 14, 0, 0,
+  31, 13, 0, 23, 0, 61, 30, 0, 16, 46,
+  7, 38, 53, 0, 0, 0, 7, 20, 37, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 9, 0,
+  0, 0, 0, 3, 0, 3, 12, 0, 13, 5,
+  0, 0, 57, 0, 3, 0, 0, 0, 27, 17,
+  0, 0, 5, 8, 37, 0, 0, 0, 19, 60,
+  0, 39, 0, 33, 30, 0, 37, 12, 0, 30,
+  0, 10, 5, 30, 0, 0, 41, 0, 71, 36,
+  0, 13, 0, 0, 4, 0, 18, 0, 0, 16,
+  44, 2, 0, 26, 0, 0, 0, 38, 5, 6,
+  19, 51, 0, 0, 0, 14, 43, 20, 37, 0,
+  0, 0, 39, 13, 0, 0, 0, 39, 17, 0,
+  19, 51, 0, 11, 63, 0, 36, 0, 33, 2,
+  0, 24, 2, 46, 28, 0, 6, 25, 11, 52,
+  60, 0, 0, 15, 21, 37, 39, 0, 0, 21,
+  42, 0, 0, 33, 0, 0, 0, 0, 0, 0,
+  0, 29, 0, 51, 23, 0, 7, 28, 0, 0,
+  51, 0, 37, 15, 0, 12, 5, 0, 0, 22,
+  16, 2, 15, 0, 0, 0, 4, 57, 0, 0,
+  0, 41, 5, 0, 60, 0, 19, 1, 4, 1,
+  52, 31, 4, 0, 58, 0, 51, 26, 21, 39,
+  0, 0, 0, 32, 0, 23, 0, 0, 55, 8,
+  0, 36, 1, 0, 0, 0, 14, 29, 63, 36,
+  0, 0, 0, 0, 46, 0, 12, 0, 4, 0,
+  35, 1, 40, 0, 0, 33, 0, 0, 0, 99,
+  0, 38, 55, 0, 74, 0, 47, 0, 0, 55,
+  43, 30, 27, 0, 3, 36, 0, 59, 80, 0,
+  0, 26, 36, 49, 32, 1, 0, 12, 51, 0,
+  22, 17, 3, 0, 0, 0, 0, 0, 0, 20,
+  0, 83, 20, 23, 0, 15, 0, 0, 26, 0,
+  67, 45, 0, 11, 23, 0, 0, 37, 22, 0,
+  0, 0, 0, 0, 14, 67, 0, 0, 0, 11,
+  0, 0, 67, 0, 16, 0, 7, 0, 80, 54,
+  0, 0, 42, 0, 37, 1, 24, 67, 6, 0,
+  0, 40, 0, 45, 0, 0, 77, 8, 0, 34,
+  3, 0, 0, 0, 25, 58, 103, 36, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 0, 21, 22,
+  80, 0, 38, 25, 8, 0, 0, 32, 0, 0,
+  31, 0, 19, 0, 50, 0, 0, 16, 7, 64,
+  58, 24, 16, 46, 0, 28, 76, 0, 0, 47,
+  16, 40, 25, 0, 0, 27, 0, 0, 0, 37,
+  5, 0, 0, 0, 0, 29, 0, 1, 0, 41,
+  21, 3, 4, 6, 0, 0, 60, 0, 56, 11,
+  0, 0, 8, 6, 0, 26, 13, 0, 0, 0,
+  0, 0, 17, 6, 0, 0, 0, 25, 0, 0,
+  41, 13, 0, 0, 0, 30, 48, 39, 12, 0,
+  31, 0, 58, 23, 37, 56, 3, 0, 8, 19,
+  0, 16, 0, 10, 57, 33, 0, 0, 0, 0,
+  0, 0, 23, 0, 31, 59, 0, 0, 0, 1,
+  24, 0, 21, 0, 8, 0, 47, 0, 77, 0,
+  1, 23, 9, 0, 0, 86, 6, 8, 42, 0,
+  32, 0, 64, 4, 0, 0, 6, 42, 74, 53,
+  38, 43, 0, 27, 68, 0, 0, 42, 0, 47,
+  25, 9, 0, 24, 6, 0, 0, 29, 9, 0,
+  0, 0, 0, 25, 0, 26, 0, 59, 9, 0,
+  0, 24, 0, 0, 45, 0, 88, 34, 0, 0,
+  0, 0, 0, 9, 6, 0, 0, 0, 0, 0,
+  36, 0, 0, 0, 0, 0, 0, 17, 64, 0,
+  2, 0, 1, 0, 91, 28, 8, 0, 51, 13,
+  35, 13, 47, 25, 0, 0, 0, 32, 0, 22,
+  0, 0, 48, 22, 0, 7, 0, 0, 23, 0,
+  25, 21, 43, 64, 10, 0, 0, 0, 29, 0,
+  0, 0, 18, 0, 4, 0, 74, 0, 0, 37,
+  25, 0, 0, 96, 8, 3, 33, 0, 35, 0,
+  85, 3, 0, 27, 4, 58, 40, 66, 33, 44,
+  0, 33, 67, 0, 11, 33, 0, 10, 35, 17,
+  0, 0, 0, 0, 16, 0, 0, 0, 0, 12,
+  0, 0, 0, 9, 0, 67, 0, 25, 0, 38,
+  0, 0, 28, 0, 77, 30, 0, 0, 25, 0,
+  0, 0, 0, 0, 0, 0, 2, 0, 21, 0,
+  17, 0, 0, 0, 18, 29, 78, 0, 11, 0,
+  0, 0, 78, 36, 3, 0, 35, 3, 44, 7,
+  36, 20, 0, 27, 0, 26, 0, 8, 0, 0,
+  61, 33, 8, 16, 0, 0, 58, 0, 22, 29,
+  12, 37, 7, 0, 0, 0, 41, 0, 0, 0,
+  20, 0, 0, 0, 52, 0, 0, 31, 46, 0,
+  30, 0, 21, 8, 18, 0, 0, 0, 23, 36,
+  0, 0, 0, 54, 7, 0, 0, 65, 15, 16,
+  55, 1, 62, 10, 0, 0, 52, 0, 0, 0,
+  14, 0, 0, 0, 0, 0, 9, 33, 0, 0,
+  29, 0, 0, 9, 0, 0, 15, 0, 0, 0,
+  30, 30, 0, 0, 29, 0, 20, 15, 0, 0,
+  0, 14, 64, 0, 89, 22, 8, 0, 0, 130,
+  0, 14, 8, 0, 2, 0, 14, 22, 0, 0,
+  24, 0, 8, 22, 41, 0, 39, 0, 26, 0,
+  0, 30, 15, 0, 0, 0, 0, 0, 23, 0,
+  15, 0, 0, 0, 0, 0, 0, 32, 0, 10,
+  0, 9, 0, 0, 99, 17, 35, 0, 24, 0,
+  6, 0, 0, 0, 0, 31, 25, 0, 5, 13,
+  0, 32, 19, 0, 8, 0, 42, 4, 0, 13,
+  0, 36, 0, 0, 0, 57, 0, 20, 78, 0,
+  62, 17, 0, 0, 48, 0, 0, 0, 23, 0,
+  0, 0, 0, 0, 0, 22, 0, 0, 41, 0,
+  0, 33, 9, 0, 6, 0, 0, 0, 32, 6,
+  0, 0, 33, 0, 37, 0, 4, 0, 0, 39,
+  62, 0, 84, 8, 32, 22, 0, 130, 0, 9,
+  16, 0, 0, 9, 33, 13, 0, 0, 29, 13,
+  0, 22, 32, 0, 33, 0, 24, 0, 0, 28,
+  10, 0, 0, 0, 8, 0, 32, 0, 10, 12,
+  0, 0, 0, 0, 0, 83, 0, 0, 2, 0,
+  0, 0, 98, 36, 46, 0, 18, 0, 8, 0,
+  0, 0, 0, 28, 8, 0, 11, 29, 0, 45,
+  2, 0, 17, 0, 59, 0, 0, 24, 0, 0,
+  0, 0, 0, 40, 1, 11, 70, 0, 8, 10,
+  0, 0, 32, 0, 0, 0, 26, 22, 0, 7,
+  0, 0, 17, 26, 2, 0, 47, 0, 0, 21,
+  13, 9, 8, 0, 0, 0, 39, 2, 0, 18,
+  67, 54, 46, 0, 21, 0, 0, 41, 60, 20,
+  72, 13, 27, 31, 0, 123, 0, 13, 17, 0,
+  0, 28, 28, 13, 17, 0, 23, 19, 0, 3,
+  26, 0, 27, 0, 23, 0, 0, 39, 0, 0,
+  0, 3, 33, 0, 52, 9, 4, 75, 0, 0,
+  0, 0, 0, 100, 0, 0, 2, 0, 0, 11,
+  51, 34, 23, 0, 31, 0, 14, 0, 0, 0,
+  3, 31, 7, 0, 19, 51, 0, 11, 63, 0,
+  36, 0, 33, 2, 0, 24, 2, 46, 28, 0,
+  6, 25, 11, 52, 60, 0, 0, 15, 21, 37,
+  39, 0, 0, 21, 42, 0, 0, 33, 0, 0,
+  0, 0, 0, 0, 0, 29, 0, 51, 23, 0,
+  7, 28, 0, 0, 51, 0, 37, 15, 0, 12,
+  5, 0, 0, 22, 16, 2, 15, 0, 0, 0,
+  4, 57, 0, 0, 0, 41, 5, 0, 60, 0,
+  19, 1, 4, 1, 52, 31, 4, 0, 58, 0,
+  51, 26, 21, 39, 0, 0, 0, 32, 0, 23,
+  0, 0, 55, 8, 0, 36, 1, 0, 0, 0,
+  14, 29, 63, 36, 0, 0, 0, 0, 46, 0,
+  12, 0, 4, 0, 35, 1, 40, 0, 0, 33,
+  0, 0, 0, 99, 0, 38, 55, 0, 74, 0,
+  47, 0, 0, 55, 43, 30, 27, 0, 3, 36,
+  0, 59, 80, 0, 0, 26, 36, 49, 32, 1,
+  0, 12, 51, 0, 22, 17, 3, 0, 0, 0,
+  0, 0, 0, 20, 0, 83, 20, 23, 0, 15,
+  0, 0, 26, 0, 67, 45, 0, 11, 23, 0,
+  0, 37, 22, 0, 0, 0, 0, 0, 14, 67,
+  0, 0, 0, 11, 0, 0, 67, 0, 16, 0,
+  7, 0, 80, 54, 0, 0, 42, 0, 37, 1,
+  24, 67, 6, 0, 0, 40, 0, 45, 0, 0,
+  77, 8, 0, 34, 3, 0, 0, 0, 25, 58,
+  103, 36, 0, 0, 0, 0, 32, 0, 0, 0,
+  0, 0, 21, 22, 80, 0, 38, 25, 8, 0,
+  0, 129, 0, 59, 30, 0, 80, 0, 63, 0,
+  2, 62, 41, 13, 24, 8, 0, 36, 0, 50,
+  73, 0, 0, 34, 40, 69, 39, 5, 0, 13,
+  44, 0, 63, 0, 17, 0, 0, 0, 0, 0,
+  0, 30, 0, 55, 31, 26, 0, 15, 0, 0,
+  34, 0, 63, 66, 0, 6, 53, 0, 0, 76,
+  13, 0, 0, 0, 0, 0, 32, 81, 0, 0,
+  0, 20, 0, 0, 48, 49, 0, 0, 0, 0,
+  65, 72, 1, 0, 21, 0, 34, 0, 17, 106,
+  73, 0, 0, 66, 0, 33, 16, 0, 73, 22,
+  0, 27, 0, 0, 0, 0, 17, 70, 123, 31,
+  8, 0, 18, 0, 19, 0, 0, 0, 0, 0,
+  16, 21, 113, 10, 49, 16, 11, 0, 0, 86,
+  6, 8, 42, 0, 32, 0, 64, 4, 0, 0,
+  6, 42, 74, 53, 38, 43, 0, 27, 68, 0,
+  0, 42, 0, 47, 25, 9, 0, 24, 6, 0,
+  0, 29, 9, 0, 0, 0, 0, 25, 0, 26,
+  0, 59, 9, 0, 0, 24, 0, 0, 45, 0,
+  88, 34, 0, 0, 0, 0, 0, 9, 6, 0,
+  0, 0, 0, 0, 36, 0, 0, 0, 0, 0,
+  0, 17, 64, 0, 2, 0, 1, 0, 91, 28,
+  8, 0, 51, 13, 35, 13, 47, 25, 0, 0,
+  0, 32, 0, 22, 0, 0, 48, 22, 0, 7,
+  0, 0, 23, 0, 25, 21, 43, 64, 10, 0,
+  0, 0, 29, 0, 0, 0, 18, 0, 4, 0,
+  74, 0, 0, 37, 25, 0, 0, 96, 8, 3,
+  33, 0, 35, 0, 85, 3, 0, 27, 4, 58,
+  40, 66, 33, 44, 0, 33, 67, 0, 11, 33,
+  0, 10, 35, 17, 0, 0, 0, 0, 16, 0,
+  0, 0, 0, 12, 0, 0, 0, 9, 0, 67,
+  0, 25, 0, 38, 0, 0, 28, 0, 77, 30,
+  0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
+  2, 0, 21, 0, 17, 0, 0, 0, 18, 29,
+  78, 0, 11, 0, 0, 0, 78, 36, 3, 0,
+  35, 3, 44, 7, 36, 20, 0, 27, 0, 26,
+  0, 8, 0, 0, 61, 33, 8, 16, 0, 0,
+  58, 0, 22, 29, 12, 37, 7, 0, 0, 0,
+  41, 0, 0, 0, 20, 0, 0, 0, 52, 0,
+  0, 31, 46, 0, 0, 50, 11, 21, 17, 0,
+  0, 0, 67, 0, 0, 42, 4, 106, 9, 17,
+  15, 45, 0, 24, 71, 0, 40, 19, 0, 0,
+  0, 3, 0, 0, 0, 0, 0, 10, 0, 0,
+  0, 0, 0, 0, 4, 19, 0, 50, 0, 0,
+  0, 45, 0, 0, 34, 65, 36, 45, 0, 0,
+  44, 0, 0, 0, 0, 0, 7, 0, 60, 7,
+  0, 7, 12, 15, 0, 0, 10, 2, 40, 0,
+  0, 0, 0, 1, 42, 35, 2, 0, 21, 0,
+  58, 15, 51, 12, 0, 30, 0, 0, 0, 9,
+  0, 0, 58, 45, 6, 2, 0, 0, 16, 0,
+  0, 13, 0, 3, 7, 0, 0, 0, 80, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
+  12, 0, 5, 13, 0, 32, 19, 0, 8, 0,
+  42, 4, 0, 13, 0, 36, 0, 0, 0, 57,
+  0, 20, 78, 0, 62, 17, 0, 0, 48, 0,
+  0, 0, 23, 0, 0, 0, 0, 0, 0, 22,
+  0, 0, 41, 0, 0, 33, 9, 0, 6, 0,
+  0, 0, 32, 6, 0, 0, 33, 0, 37, 0,
+  4, 0, 0, 39, 62, 0, 84, 8, 32, 22,
+  0, 130, 0, 9, 16, 0, 0, 9, 33, 13,
+  0, 0, 29, 13, 0, 22, 32, 0, 33, 0,
+  24, 0, 0, 28, 10, 0, 0, 0, 8, 0,
+  32, 0, 10, 12, 0, 0, 0, 0, 0, 83,
+  0, 0, 2, 0, 0, 0, 98, 36, 46, 0,
+  18, 0, 8, 0, 0, 0, 0, 28, 8, 0,
+  11, 29, 0, 45, 2, 0, 17, 0, 59, 0,
+  0, 24, 0, 0, 0, 0, 0, 40, 1, 11,
+  70, 0, 8, 10, 0, 0, 32, 0, 0, 0,
+  26, 22, 0, 7, 0, 0, 17, 26, 2, 0,
+  47, 0, 0, 21, 13, 9, 8, 0, 0, 0,
+  39, 2, 0, 18, 67, 54, 46, 0, 21, 0,
+  0, 41, 60, 20, 72, 13, 27, 31, 0, 123,
+  0, 13, 17, 0, 0, 28, 28, 13, 17, 0,
+  23, 19, 0, 3, 26, 0, 27, 0, 23, 0,
+  0, 39, 0, 0, 0, 3, 33, 0, 52, 9,
+  4, 75, 0, 0, 0, 0, 0, 100, 0, 0,
+  2, 0, 0, 11, 51, 34, 23, 0, 31, 0,
+  14, 0, 0, 0, 3, 31, 7, 0, 11, 24,
+  0, 20, 0, 8, 0, 0, 72, 0, 0, 35,
+  0, 0, 0, 0, 0, 45, 6, 0, 35, 11,
+  0, 11, 0, 0, 13, 0, 0, 0, 2, 13,
+  0, 0, 0, 0, 29, 44, 34, 0, 50, 0,
+  0, 11, 0, 7, 0, 0, 0, 0, 8, 60,
+  0, 0, 108, 136, 34, 5, 37, 0, 0, 24,
+  71, 27, 134, 39, 0, 0, 0, 158, 66, 0,
+  9, 0, 0, 10, 0, 0, 39, 0, 9, 0,
+  13, 5, 9, 0, 4, 0, 70, 0, 0, 80,
+  0, 0, 27, 0, 26, 0, 39, 45, 33, 130,
+  0, 0, 0, 0, 0, 84, 0, 0, 0, 0,
+  0, 24, 23, 13, 0, 0, 36, 0, 0, 0,
+  0, 0, 23, 31, 12, 0, 0, 99, 0, 38,
+  55, 0, 74, 0, 47, 0, 0, 55, 43, 30,
+  27, 0, 3, 36, 0, 59, 80, 0, 0, 26,
+  36, 49, 32, 1, 0, 12, 51, 0, 22, 17,
+  3, 0, 0, 0, 0, 0, 0, 20, 0, 83,
+  20, 23, 0, 15, 0, 0, 26, 0, 67, 45,
+  0, 11, 23, 0, 0, 37, 22, 0, 0, 0,
+  0, 0, 14, 67, 0, 0, 0, 11, 0, 0,
+  67, 0, 16, 0, 7, 0, 80, 54, 0, 0,
+  42, 0, 37, 1, 24, 67, 6, 0, 0, 40,
+  0, 45, 0, 0, 77, 8, 0, 34, 3, 0,
+  0, 0, 25, 58, 103, 36, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 0, 21, 22, 80, 0,
+  38, 25, 8, 0, 0, 129, 0, 59, 30, 0,
+  80, 0, 63, 0, 2, 62, 41, 13, 24, 8,
+  0, 36, 0, 50, 73, 0, 0, 34, 40, 69,
+  39, 5, 0, 13, 44, 0, 63, 0, 17, 0,
+  0, 0, 0, 0, 0, 30, 0, 55, 31, 26,
+  0, 15, 0, 0, 34, 0, 63, 66, 0, 6,
+  53, 0, 0, 76, 13, 0, 0, 0, 0, 0,
+  32, 81, 0, 0, 0, 20, 0, 0, 48, 49,
+  0, 0, 0, 0, 65, 72, 1, 0, 21, 0,
+  34, 0, 17, 106, 73, 0, 0, 66, 0, 33,
+  16, 0, 73, 22, 0, 27, 0, 0, 0, 0,
+  17, 70, 123, 31, 8, 0, 18, 0, 19, 0,
+  0, 0, 0, 0, 16, 21, 113, 10, 49, 16,
+  11, 0, 4, 112, 0, 54, 23, 0, 15, 0,
+  85, 7, 0, 53, 5, 3, 0, 0, 0, 18,
+  0, 13, 49, 0, 0, 31, 10, 11, 45, 17,
+  0, 0, 0, 9, 32, 0, 23, 0, 0, 18,
+  0, 0, 0, 0, 0, 18, 25, 27, 0, 0,
+  0, 0, 33, 14, 7, 64, 44, 38, 45, 0,
+  0, 10, 0, 11, 7, 12, 0, 7, 17, 45,
+  0, 29, 0, 13, 26, 0, 1, 55, 0, 8,
+  5, 0, 20, 44, 16, 23, 0, 0, 15, 29,
+  38, 55, 93, 0, 0, 17, 0, 0, 52, 0,
+  35, 52, 0, 80, 0, 0, 0, 0, 0, 84,
+  112, 0, 31, 0, 15, 3, 1, 0, 0, 0,
+  0, 0, 3, 0, 28, 0, 45, 32, 0, 0,
+  0, 96, 8, 3, 33, 0, 35, 0, 85, 3,
+  0, 27, 4, 58, 40, 66, 33, 44, 0, 33,
+  67, 0, 11, 33, 0, 10, 35, 17, 0, 0,
+  0, 0, 16, 0, 0, 0, 0, 12, 0, 0,
+  0, 9, 0, 67, 0, 25, 0, 38, 0, 0,
+  28, 0, 77, 30, 0, 0, 25, 0, 0, 0,
+  0, 0, 0, 0, 2, 0, 21, 0, 17, 0,
+  0, 0, 18, 29, 78, 0, 11, 0, 0, 0,
+  78, 36, 3, 0, 35, 3, 44, 7, 36, 20,
+  0, 27, 0, 26, 0, 8, 0, 0, 61, 33,
+  8, 16, 0, 0, 58, 0, 22, 29, 12, 37,
+  7, 0, 0, 0, 41, 0, 0, 0, 20, 0,
+  0, 0, 52, 0, 0, 31, 46, 0, 0, 50,
+  11, 21, 17, 0, 0, 0, 67, 0, 0, 42,
+  4, 106, 9, 17, 15, 45, 0, 24, 71, 0,
+  40, 19, 0, 0, 0, 3, 0, 0, 0, 0,
+  0, 10, 0, 0, 0, 0, 0, 0, 4, 19,
+  0, 50, 0, 0, 0, 45, 0, 0, 34, 65,
+  36, 45, 0, 0, 44, 0, 0, 0, 0, 0,
+  7, 0, 60, 7, 0, 7, 12, 15, 0, 0,
+  10, 2, 40, 0, 0, 0, 0, 1, 42, 35,
+  2, 0, 21, 0, 58, 15, 51, 12, 0, 30,
+  0, 0, 0, 9, 0, 0, 58, 45, 6, 2,
+  0, 0, 16, 0, 0, 13, 0, 3, 7, 0,
+  0, 0, 80, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 4, 12, 0, 20, 58, 19, 29,
+  24, 0, 0, 0, 79, 0, 0, 44, 19, 100,
+  0, 0, 0, 11, 0, 4, 57, 0, 28, 24,
+  0, 0, 2, 0, 0, 3, 5, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 34, 0, 24,
+  0, 0, 6, 41, 0, 0, 50, 104, 10, 72,
+  18, 0, 43, 0, 5, 0, 0, 0, 14, 0,
+  25, 49, 0, 0, 0, 41, 0, 14, 1, 0,
+  14, 2, 0, 0, 0, 33, 14, 52, 21, 0,
+  21, 0, 41, 46, 70, 27, 15, 0, 0, 0,
+  0, 6, 30, 0, 57, 63, 0, 18, 0, 0,
+  0, 0, 0, 23, 55, 0, 32, 0, 0, 0,
+  90, 0, 14, 0, 0, 0, 5, 1, 0, 0,
+  20, 7, 0, 0, 11, 29, 0, 45, 2, 0,
+  17, 0, 59, 0, 0, 24, 0, 0, 0, 0,
+  0, 40, 1, 11, 70, 0, 8, 10, 0, 0,
+  32, 0, 0, 0, 26, 22, 0, 7, 0, 0,
+  17, 26, 2, 0, 47, 0, 0, 21, 13, 9,
+  8, 0, 0, 0, 39, 2, 0, 18, 67, 54,
+  46, 0, 21, 0, 0, 41, 60, 20, 72, 13,
+  27, 31, 0, 123, 0, 13, 17, 0, 0, 28,
+  28, 13, 17, 0, 23, 19, 0, 3, 26, 0,
+  27, 0, 23, 0, 0, 39, 0, 0, 0, 3,
+  33, 0, 52, 9, 4, 75, 0, 0, 0, 0,
+  0, 100, 0, 0, 2, 0, 0, 11, 51, 34,
+  23, 0, 31, 0, 14, 0, 0, 0, 3, 31,
+  7, 0, 11, 24, 0, 20, 0, 8, 0, 0,
+  72, 0, 0, 35, 0, 0, 0, 0, 0, 45,
+  6, 0, 35, 11, 0, 11, 0, 0, 13, 0,
+  0, 0, 2, 13, 0, 0, 0, 0, 29, 44,
+  34, 0, 50, 0, 0, 11, 0, 7, 0, 0,
+  0, 0, 8, 60, 0, 0, 108, 136, 34, 5,
+  37, 0, 0, 24, 71, 27, 134, 39, 0, 0,
+  0, 158, 66, 0, 9, 0, 0, 10, 0, 0,
+  39, 0, 9, 0, 13, 5, 9, 0, 4, 0,
+  70, 0, 0, 80, 0, 0, 27, 0, 26, 0,
+  39, 45, 33, 130, 0, 0, 0, 0, 0, 84,
+  0, 0, 0, 0, 0, 24, 23, 13, 0, 0,
+  36, 0, 0, 0, 0, 0, 23, 31, 12, 0,
+  0, 15, 0, 0, 0, 50, 0, 0, 53, 14,
+  0, 2, 0, 0, 0, 0, 0, 48, 12, 0,
+  0, 0, 0, 19, 0, 0, 0, 3, 0, 0,
+  3, 11, 0, 0, 0, 9, 43, 82, 35, 0,
+  70, 0, 5, 16, 0, 7, 7, 0, 0, 0,
+  0, 63, 0, 0, 57, 160, 47, 9, 35, 0,
+  0, 29, 57, 0, 153, 4, 0, 0, 0, 121,
+  122, 0, 14, 27, 0, 33, 0, 0, 46, 0,
+  6, 0, 5, 13, 16, 0, 0, 10, 64, 0,
+  0, 128, 0, 0, 35, 0, 0, 0, 10, 76,
+  58, 96, 0, 0, 0, 0, 0, 62, 0, 0,
+  0, 3, 0, 35, 0, 0, 0, 0, 53, 0,
+  0, 0, 0, 0, 18, 28, 29, 0, 0, 129,
+  0, 59, 30, 0, 80, 0, 63, 0, 2, 62,
+  41, 13, 24, 8, 0, 36, 0, 50, 73, 0,
+  0, 34, 40, 69, 39, 5, 0, 13, 44, 0,
+  63, 0, 17, 0, 0, 0, 0, 0, 0, 30,
+  0, 55, 31, 26, 0, 15, 0, 0, 34, 0,
+  63, 66, 0, 6, 53, 0, 0, 76, 13, 0,
+  0, 0, 0, 0, 32, 81, 0, 0, 0, 20,
+  0, 0, 48, 49, 0, 0, 0, 0, 65, 72,
+  1, 0, 21, 0, 34, 0, 17, 106, 73, 0,
+  0, 66, 0, 33, 16, 0, 73, 22, 0, 27,
+  0, 0, 0, 0, 17, 70, 123, 31, 8, 0,
+  18, 0, 19, 0, 0, 0, 0, 0, 16, 21,
+  113, 10, 49, 16, 11, 0, 4, 112, 0, 54,
+  23, 0, 15, 0, 85, 7, 0, 53, 5, 3,
+  0, 0, 0, 18, 0, 13, 49, 0, 0, 31,
+  10, 11, 45, 17, 0, 0, 0, 9, 32, 0,
+  23, 0, 0, 18, 0, 0, 0, 0, 0, 18,
+  25, 27, 0, 0, 0, 0, 33, 14, 7, 64,
+  44, 38, 45, 0, 0, 10, 0, 11, 7, 12,
+  0, 7, 17, 45, 0, 29, 0, 13, 26, 0,
+  1, 55, 0, 8, 5, 0, 20, 44, 16, 23,
+  0, 0, 15, 29, 38, 55, 93, 0, 0, 17,
+  0, 0, 52, 0, 35, 52, 0, 80, 0, 0,
+  0, 0, 0, 84, 112, 0, 31, 0, 15, 3,
+  1, 0, 0, 0, 0, 0, 3, 0, 28, 0,
+  45, 32, 0, 0, 29, 57, 0, 24, 0, 27,
+  0, 0, 42, 0, 0, 31, 0, 13, 0, 0,
+  0, 38, 15, 0, 3, 20, 0, 0, 0, 0,
+  2, 0, 0, 0, 0, 33, 0, 0, 0, 22,
+  12, 36, 5, 0, 22, 0, 25, 16, 5, 0,
+  6, 0, 0, 0, 0, 74, 0, 26, 125, 100,
+  30, 22, 18, 0, 0, 43, 75, 37, 102, 36,
+  0, 20, 0, 109, 123, 3, 27, 0, 0, 17,
+  0, 0, 34, 0, 0, 1, 35, 33, 3, 0,
+  0, 8, 62, 0, 21, 30, 0, 0, 38, 0,
+  43, 0, 9, 59, 0, 117, 0, 0, 0, 0,
+  0, 80, 21, 0, 14, 0, 0, 24, 0, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 32, 35,
+  0, 0, 0, 50, 11, 21, 17, 0, 0, 0,
+  67, 0, 0, 42, 4, 106, 9, 17, 15, 45,
+  0, 24, 71, 0, 40, 19, 0, 0, 0, 3,
+  0, 0, 0, 0, 0, 10, 0, 0, 0, 0,
+  0, 0, 4, 19, 0, 50, 0, 0, 0, 45,
+  0, 0, 34, 65, 36, 45, 0, 0, 44, 0,
+  0, 0, 0, 0, 7, 0, 60, 7, 0, 7,
+  12, 15, 0, 0, 10, 2, 40, 0, 0, 0,
+  0, 1, 42, 35, 2, 0, 21, 0, 58, 15,
+  51, 12, 0, 30, 0, 0, 0, 9, 0, 0,
+  58, 45, 6, 2, 0, 0, 16, 0, 0, 13,
+  0, 3, 7, 0, 0, 0, 80, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 4, 12, 0,
+  20, 58, 19, 29, 24, 0, 0, 0, 79, 0,
+  0, 44, 19, 100, 0, 0, 0, 11, 0, 4,
+  57, 0, 28, 24, 0, 0, 2, 0, 0, 3,
+  5, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 34, 0, 24, 0, 0, 6, 41, 0, 0,
+  50, 104, 10, 72, 18, 0, 43, 0, 5, 0,
+  0, 0, 14, 0, 25, 49, 0, 0, 0, 41,
+  0, 14, 1, 0, 14, 2, 0, 0, 0, 33,
+  14, 52, 21, 0, 21, 0, 41, 46, 70, 27,
+  15, 0, 0, 0, 0, 6, 30, 0, 57, 63,
+  0, 18, 0, 0, 0, 0, 0, 23, 55, 0,
+  32, 0, 0, 0, 90, 0, 14, 0, 0, 0,
+  5, 1, 0, 0, 20, 7, 0, 0, 56, 103,
+  0, 45, 15, 0, 0, 0, 58, 0, 0, 52,
+  30, 60, 0, 0, 0, 11, 22, 8, 26, 0,
+  0, 48, 0, 0, 58, 0, 0, 0, 19, 13,
+  0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+  0, 14, 26, 11, 2, 0, 0, 0, 23, 83,
+  1, 41, 67, 0, 39, 3, 0, 0, 0, 31,
+  34, 12, 4, 15, 0, 13, 0, 63, 0, 12,
+  10, 0, 0, 36, 0, 0, 33, 0, 0, 39,
+  30, 13, 0, 0, 19, 60, 73, 69, 93, 0,
+  0, 0, 0, 0, 59, 0, 21, 68, 23, 82,
+  0, 0, 0, 0, 0, 52, 129, 3, 21, 0,
+  0, 7, 40, 0, 0, 0, 3, 0, 26, 0,
+  14, 0, 57, 39, 0, 0, 11, 24, 0, 20,
+  0, 8, 0, 0, 72, 0, 0, 35, 0, 0,
+  0, 0, 0, 45, 6, 0, 35, 11, 0, 11,
+  0, 0, 13, 0, 0, 0, 2, 13, 0, 0,
+  0, 0, 29, 44, 34, 0, 50, 0, 0, 11,
+  0, 7, 0, 0, 0, 0, 8, 60, 0, 0,
+  108, 136, 34, 5, 37, 0, 0, 24, 71, 27,
+  134, 39, 0, 0, 0, 158, 66, 0, 9, 0,
+  0, 10, 0, 0, 39, 0, 9, 0, 13, 5,
+  9, 0, 4, 0, 70, 0, 0, 80, 0, 0,
+  27, 0, 26, 0, 39, 45, 33, 130, 0, 0,
+  0, 0, 0, 84, 0, 0, 0, 0, 0, 24,
+  23, 13, 0, 0, 36, 0, 0, 0, 0, 0,
+  23, 31, 12, 0, 0, 15, 0, 0, 0, 50,
+  0, 0, 53, 14, 0, 2, 0, 0, 0, 0,
+  0, 48, 12, 0, 0, 0, 0, 19, 0, 0,
+  0, 3, 0, 0, 3, 11, 0, 0, 0, 9,
+  43, 82, 35, 0, 70, 0, 5, 16, 0, 7,
+  7, 0, 0, 0, 0, 63, 0, 0, 57, 160,
+  47, 9, 35, 0, 0, 29, 57, 0, 153, 4,
+  0, 0, 0, 121, 122, 0, 14, 27, 0, 33,
+  0, 0, 46, 0, 6, 0, 5, 13, 16, 0,
+  0, 10, 64, 0, 0, 128, 0, 0, 35, 0,
+  0, 0, 10, 76, 58, 96, 0, 0, 0, 0,
+  0, 62, 0, 0, 0, 3, 0, 35, 0, 0,
+  0, 0, 53, 0, 0, 0, 0, 0, 18, 28,
+  29, 0, 0, 39, 0, 0, 0, 29, 0, 0,
+  78, 47, 0, 0, 30, 0, 0, 88, 39, 61,
+  6, 17, 0, 0, 0, 41, 0, 0, 7, 53,
+  6, 0, 17, 0, 36, 0, 0, 0, 35, 96,
+  0, 0, 48, 0, 9, 30, 0, 28, 42, 19,
+  0, 0, 0, 32, 2, 0, 4, 101, 46, 8,
+  0, 0, 0, 0, 0, 0, 66, 0, 6, 4,
+  24, 53, 52, 0, 17, 37, 0, 49, 0, 0,
+  5, 0, 39, 0, 0, 0, 0, 1, 0, 30,
+  51, 0, 0, 131, 0, 0, 11, 0, 0, 0,
+  0, 86, 87, 31, 0, 0, 0, 0, 0, 48,
+  0, 13, 0, 11, 0, 8, 2, 0, 0, 2,
+  51, 0, 25, 0, 41, 0, 28, 12, 43, 0,
+  4, 112, 0, 54, 23, 0, 15, 0, 85, 7,
+  0, 53, 5, 3, 0, 0, 0, 18, 0, 13,
+  49, 0, 0, 31, 10, 11, 45, 17, 0, 0,
+  0, 9, 32, 0, 23, 0, 0, 18, 0, 0,
+  0, 0, 0, 18, 25, 27, 0, 0, 0, 0,
+  33, 14, 7, 64, 44, 38, 45, 0, 0, 10,
+  0, 11, 7, 12, 0, 7, 17, 45, 0, 29,
+  0, 13, 26, 0, 1, 55, 0, 8, 5, 0,
+  20, 44, 16, 23, 0, 0, 15, 29, 38, 55,
+  93, 0, 0, 17, 0, 0, 52, 0, 35, 52,
+  0, 80, 0, 0, 0, 0, 0, 84, 112, 0,
+  31, 0, 15, 3, 1, 0, 0, 0, 0, 0,
+  3, 0, 28, 0, 45, 32, 0, 0, 29, 57,
+  0, 24, 0, 27, 0, 0, 42, 0, 0, 31,
+  0, 13, 0, 0, 0, 38, 15, 0, 3, 20,
+  0, 0, 0, 0, 2, 0, 0, 0, 0, 33,
+  0, 0, 0, 22, 12, 36, 5, 0, 22, 0,
+  25, 16, 5, 0, 6, 0, 0, 0, 0, 74,
+  0, 26, 125, 100, 30, 22, 18, 0, 0, 43,
+  75, 37, 102, 36, 0, 20, 0, 109, 123, 3,
+  27, 0, 0, 17, 0, 0, 34, 0, 0, 1,
+  35, 33, 3, 0, 0, 8, 62, 0, 21, 30,
+  0, 0, 38, 0, 43, 0, 9, 59, 0, 117,
+  0, 0, 0, 0, 0, 80, 21, 0, 14, 0,
+  0, 24, 0, 0, 0, 0, 10, 0, 0, 0,
+  0, 0, 32, 35, 0, 0, 10, 25, 0, 0,
+  0, 85, 0, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 3, 8, 0, 40, 0, 0,
+  0, 0, 8, 3, 0, 0, 0, 38, 0, 0,
+  0, 43, 47, 68, 23, 0, 46, 0, 22, 15,
+  0, 13, 59, 13, 0, 0, 0, 55, 0, 0,
+  112, 118, 34, 26, 48, 0, 0, 57, 67, 0,
+  179, 5, 0, 32, 0, 139, 175, 0, 10, 15,
+  0, 0, 0, 0, 42, 0, 0, 0, 28, 19,
+  31, 0, 0, 11, 42, 0, 0, 116, 13, 0,
+  34, 0, 0, 0, 6, 54, 43, 142, 0, 0,
+  0, 0, 0, 58, 0, 0, 0, 29, 0, 30,
+  0, 10, 0, 0, 53, 0, 0, 0, 0, 0,
+  1, 29, 1, 6, 20, 58, 19, 29, 24, 0,
+  0, 0, 79, 0, 0, 44, 19, 100, 0, 0,
+  0, 11, 0, 4, 57, 0, 28, 24, 0, 0,
+  2, 0, 0, 3, 5, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 34, 0, 24, 0, 0,
+  6, 41, 0, 0, 50, 104, 10, 72, 18, 0,
+  43, 0, 5, 0, 0, 0, 14, 0, 25, 49,
+  0, 0, 0, 41, 0, 14, 1, 0, 14, 2,
+  0, 0, 0, 33, 14, 52, 21, 0, 21, 0,
+  41, 46, 70, 27, 15, 0, 0, 0, 0, 6,
+  30, 0, 57, 63, 0, 18, 0, 0, 0, 0,
+  0, 23, 55, 0, 32, 0, 0, 0, 90, 0,
+  14, 0, 0, 0, 5, 1, 0, 0, 20, 7,
+  0, 0, 56, 103, 0, 45, 15, 0, 0, 0,
+  58, 0, 0, 52, 30, 60, 0, 0, 0, 11,
+  22, 8, 26, 0, 0, 48, 0, 0, 58, 0,
+  0, 0, 19, 13, 0, 0, 3, 0, 0, 0,
+  0, 0, 0, 0, 0, 14, 26, 11, 2, 0,
+  0, 0, 23, 83, 1, 41, 67, 0, 39, 3,
+  0, 0, 0, 31, 34, 12, 4, 15, 0, 13,
+  0, 63, 0, 12, 10, 0, 0, 36, 0, 0,
+  33, 0, 0, 39, 30, 13, 0, 0, 19, 60,
+  73, 69, 93, 0, 0, 0, 0, 0, 59, 0,
+  21, 68, 23, 82, 0, 0, 0, 0, 0, 52,
+  129, 3, 21, 0, 0, 7, 40, 0, 0, 0,
+  3, 0, 26, 0, 14, 0, 57, 39, 0, 0,
+  46, 82, 0, 50, 1, 35, 0, 0, 22, 0,
+  0, 15, 41, 6, 0, 0, 0, 19, 21, 11,
+  13, 31, 0, 0, 0, 0, 64, 0, 0, 0,
+  30, 54, 0, 0, 28, 29, 0, 17, 0, 0,
+  0, 0, 1, 18, 5, 11, 10, 0, 0, 0,
+  0, 57, 0, 22, 95, 48, 30, 4, 0, 0,
+  0, 73, 54, 11, 88, 0, 0, 66, 0, 94,
+  130, 13, 9, 0, 0, 4, 0, 2, 68, 0,
+  0, 0, 23, 16, 20, 0, 0, 28, 33, 13,
+  56, 0, 0, 0, 6, 0, 47, 0, 18, 68,
+  22, 150, 0, 0, 0, 0, 0, 82, 91, 0,
+  7, 26, 10, 31, 0, 0, 0, 0, 31, 0,
+  0, 0, 0, 0, 50, 35, 0, 2, 0, 15,
+  0, 0, 0, 50, 0, 0, 53, 14, 0, 2,
+  0, 0, 0, 0, 0, 48, 12, 0, 0, 0,
+  0, 19, 0, 0, 0, 3, 0, 0, 3, 11,
+  0, 0, 0, 9, 43, 82, 35, 0, 70, 0,
+  5, 16, 0, 7, 7, 0, 0, 0, 0, 63,
+  0, 0, 57, 160, 47, 9, 35, 0, 0, 29,
+  57, 0, 153, 4, 0, 0, 0, 121, 122, 0,
+  14, 27, 0, 33, 0, 0, 46, 0, 6, 0,
+  5, 13, 16, 0, 0, 10, 64, 0, 0, 128,
+  0, 0, 35, 0, 0, 0, 10, 76, 58, 96,
+  0, 0, 0, 0, 0, 62, 0, 0, 0, 3,
+  0, 35, 0, 0, 0, 0, 53, 0, 0, 0,
+  0, 0, 18, 28, 29, 0, 0, 39, 0, 0,
+  0, 29, 0, 0, 78, 47, 0, 0, 30, 0,
+  0, 88, 39, 61, 6, 17, 0, 0, 0, 41,
+  0, 0, 7, 53, 6, 0, 17, 0, 36, 0,
+  0, 0, 35, 96, 0, 0, 48, 0, 9, 30,
+  0, 28, 42, 19, 0, 0, 0, 32, 2, 0,
+  4, 101, 46, 8, 0, 0, 0, 0, 0, 0,
+  66, 0, 6, 4, 24, 53, 52, 0, 17, 37,
+  0, 49, 0, 0, 5, 0, 39, 0, 0, 0,
+  0, 1, 0, 30, 51, 0, 0, 131, 0, 0,
+  11, 0, 0, 0, 0, 86, 87, 31, 0, 0,
+  0, 0, 0, 48, 0, 13, 0, 11, 0, 8,
+  2, 0, 0, 2, 51, 0, 25, 0, 41, 0,
+  28, 12, 43, 0, 0, 93, 41, 0, 7, 0,
+  52, 3, 86, 40, 12, 0, 76, 3, 0, 125,
+  70, 39, 2, 33, 0, 0, 0, 54, 36, 13,
+  16, 61, 3, 0, 21, 0, 90, 1, 0, 0,
+  0, 58, 0, 29, 9, 0, 26, 52, 0, 59,
+  72, 36, 0, 44, 0, 0, 84, 12, 0, 0,
+  22, 0, 0, 42, 0, 0, 0, 0, 0, 0,
+  47, 0, 62, 0, 0, 0, 2, 50, 38, 28,
+  0, 0, 0, 0, 77, 11, 8, 0, 0, 21,
+  0, 22, 43, 0, 0, 57, 0, 32, 0, 0,
+  0, 0, 0, 79, 66, 0, 0, 0, 15, 0,
+  10, 29, 0, 69, 0, 1, 0, 0, 0, 0,
+  0, 36, 65, 0, 62, 0, 139, 0, 57, 16,
+  25, 0, 29, 57, 0, 24, 0, 27, 0, 0,
+  42, 0, 0, 31, 0, 13, 0, 0, 0, 38,
+  15, 0, 3, 20, 0, 0, 0, 0, 2, 0,
+  0, 0, 0, 33, 0, 0, 0, 22, 12, 36,
+  5, 0, 22, 0, 25, 16, 5, 0, 6, 0,
+  0, 0, 0, 74, 0, 26, 125, 100, 30, 22,
+  18, 0, 0, 43, 75, 37, 102, 36, 0, 20,
+  0, 109, 123, 3, 27, 0, 0, 17, 0, 0,
+  34, 0, 0, 1, 35, 33, 3, 0, 0, 8,
+  62, 0, 21, 30, 0, 0, 38, 0, 43, 0,
+  9, 59, 0, 117, 0, 0, 0, 0, 0, 80,
+  21, 0, 14, 0, 0, 24, 0, 0, 0, 0,
+  10, 0, 0, 0, 0, 0, 32, 35, 0, 0,
+  10, 25, 0, 0, 0, 85, 0, 0, 22, 0,
+  0, 0, 0, 0, 0, 0, 0, 39, 3, 8,
+  0, 40, 0, 0, 0, 0, 8, 3, 0, 0,
+  0, 38, 0, 0, 0, 43, 47, 68, 23, 0,
+  46, 0, 22, 15, 0, 13, 59, 13, 0, 0,
+  0, 55, 0, 0, 112, 118, 34, 26, 48, 0,
+  0, 57, 67, 0, 179, 5, 0, 32, 0, 139,
+  175, 0, 10, 15, 0, 0, 0, 0, 42, 0,
+  0, 0, 28, 19, 31, 0, 0, 11, 42, 0,
+  0, 116, 13, 0, 34, 0, 0, 0, 6, 54,
+  43, 142, 0, 0, 0, 0, 0, 58, 0, 0,
+  0, 29, 0, 30, 0, 10, 0, 0, 53, 0,
+  0, 0, 0, 0, 1, 29, 1, 6, 0, 37,
+  0, 0, 0, 81, 0, 0, 83, 32, 0, 0,
+  0, 9, 0, 42, 6, 26, 0, 10, 0, 0,
+  0, 25, 0, 0, 22, 40, 7, 0, 0, 0,
+  67, 0, 0, 20, 33, 86, 0, 0, 32, 0,
+  0, 10, 0, 67, 54, 81, 0, 26, 0, 6,
+  0, 0, 25, 36, 58, 0, 32, 0, 0, 65,
+  0, 0, 102, 0, 0, 34, 25, 57, 85, 0,
+  33, 59, 0, 79, 0, 0, 3, 0, 3, 0,
+  2, 0, 0, 0, 0, 49, 15, 0, 0, 173,
+  0, 0, 0, 0, 0, 0, 0, 64, 113, 110,
+  0, 0, 0, 0, 0, 29, 0, 22, 0, 30,
+  0, 19, 0, 0, 0, 29, 61, 0, 40, 0,
+  0, 0, 0, 15, 1, 35, 56, 103, 0, 45,
+  15, 0, 0, 0, 58, 0, 0, 52, 30, 60,
+  0, 0, 0, 11, 22, 8, 26, 0, 0, 48,
+  0, 0, 58, 0, 0, 0, 19, 13, 0, 0,
+  3, 0, 0, 0, 0, 0, 0, 0, 0, 14,
+  26, 11, 2, 0, 0, 0, 23, 83, 1, 41,
+  67, 0, 39, 3, 0, 0, 0, 31, 34, 12,
+  4, 15, 0, 13, 0, 63, 0, 12, 10, 0,
+  0, 36, 0, 0, 33, 0, 0, 39, 30, 13,
+  0, 0, 19, 60, 73, 69, 93, 0, 0, 0,
+  0, 0, 59, 0, 21, 68, 23, 82, 0, 0,
+  0, 0, 0, 52, 129, 3, 21, 0, 0, 7,
+  40, 0, 0, 0, 3, 0, 26, 0, 14, 0,
+  57, 39, 0, 0, 46, 82, 0, 50, 1, 35,
+  0, 0, 22, 0, 0, 15, 41, 6, 0, 0,
+  0, 19, 21, 11, 13, 31, 0, 0, 0, 0,
+  64, 0, 0, 0, 30, 54, 0, 0, 28, 29,
+  0, 17, 0, 0, 0, 0, 1, 18, 5, 11,
+  10, 0, 0, 0, 0, 57, 0, 22, 95, 48,
+  30, 4, 0, 0, 0, 73, 54, 11, 88, 0,
+  0, 66, 0, 94, 130, 13, 9, 0, 0, 4,
+  0, 2, 68, 0, 0, 0, 23, 16, 20, 0,
+  0, 28, 33, 13, 56, 0, 0, 0, 6, 0,
+  47, 0, 18, 68, 22, 150, 0, 0, 0, 0,
+  0, 82, 91, 0, 7, 26, 10, 31, 0, 0,
+  0, 0, 31, 0, 0, 0, 0, 0, 50, 35,
+  0, 2, 1, 12, 0, 19, 0, 115, 0, 0,
+  17, 0, 0, 0, 0, 1, 0, 0, 0, 28,
+  11, 16, 0, 65, 2, 0, 0, 0, 23, 0,
+  0, 0, 0, 17, 8, 0, 9, 65, 12, 45,
+  5, 0, 48, 0, 0, 18, 0, 33, 46, 0,
+  0, 7, 0, 29, 0, 0, 131, 59, 54, 5,
+  43, 0, 0, 107, 51, 0, 166, 0, 0, 46,
+  0, 112, 193, 0, 44, 0, 0, 35, 0, 0,
+  29, 0, 0, 0, 32, 0, 28, 0, 0, 1,
+  14, 0, 0, 79, 16, 0, 38, 0, 0, 0,
+  3, 61, 47, 127, 0, 0, 0, 0, 0, 36,
+  0, 0, 0, 55, 0, 53, 0, 0, 0, 0,
+  47, 0, 0, 0, 0, 0, 13, 18, 0, 12,
+  0, 39, 0, 0, 0, 29, 0, 0, 78, 47,
+  0, 0, 30, 0, 0, 88, 39, 61, 6, 17,
+  0, 0, 0, 41, 0, 0, 7, 53, 6, 0,
+  17, 0, 36, 0, 0, 0, 35, 96, 0, 0,
+  48, 0, 9, 30, 0, 28, 42, 19, 0, 0,
+  0, 32, 2, 0, 4, 101, 46, 8, 0, 0,
+  0, 0, 0, 0, 66, 0, 6, 4, 24, 53,
+  52, 0, 17, 37, 0, 49, 0, 0, 5, 0,
+  39, 0, 0, 0, 0, 1, 0, 30, 51, 0,
+  0, 131, 0, 0, 11, 0, 0, 0, 0, 86,
+  87, 31, 0, 0, 0, 0, 0, 48, 0, 13,
+  0, 11, 0, 8, 2, 0, 0, 2, 51, 0,
+  25, 0, 41, 0, 28, 12, 43, 0, 0, 93,
+  41, 0, 7, 0, 52, 3, 86, 40, 12, 0,
+  76, 3, 0, 125, 70, 39, 2, 33, 0, 0,
+  0, 54, 36, 13, 16, 61, 3, 0, 21, 0,
+  90, 1, 0, 0, 0, 58, 0, 29, 9, 0,
+  26, 52, 0, 59, 72, 36, 0, 44, 0, 0,
+  84, 12, 0, 0, 22, 0, 0, 42, 0, 0,
+  0, 0, 0, 0, 47, 0, 62, 0, 0, 0,
+  2, 50, 38, 28, 0, 0, 0, 0, 77, 11,
+  8, 0, 0, 21, 0, 22, 43, 0, 0, 57,
+  0, 32, 0, 0, 0, 0, 0, 79, 66, 0,
+  0, 0, 15, 0, 10, 29, 0, 69, 0, 1,
+  0, 0, 0, 0, 0, 36, 65, 0, 62, 0,
+  139, 0, 57, 16, 25, 0, 0, 58, 49, 0,
+  14, 0, 50, 16, 63, 8, 3, 26, 61, 1,
+  7, 53, 52, 0, 0, 15, 0, 27, 43, 19,
+  23, 0, 0, 13, 0, 0, 0, 0, 41, 0,
+  0, 6, 0, 16, 0, 79, 0, 24, 0, 55,
+  1, 70, 61, 46, 0, 21, 0, 20, 72, 1,
+  0, 0, 29, 0, 0, 0, 15, 36, 0, 43,
+  0, 14, 0, 0, 79, 0, 0, 0, 7, 27,
+  66, 15, 34, 28, 0, 0, 79, 0, 29, 0,
+  25, 0, 16, 0, 0, 0, 0, 0, 0, 17,
+  0, 26, 0, 0, 5, 71, 31, 0, 0, 0,
+  26, 0, 28, 0, 0, 38, 0, 0, 0, 2,
+  0, 0, 2, 14, 69, 0, 27, 0, 63, 0,
+  43, 7, 17, 0, 10, 25, 0, 0, 0, 85,
+  0, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+  0, 39, 3, 8, 0, 40, 0, 0, 0, 0,
+  8, 3, 0, 0, 0, 38, 0, 0, 0, 43,
+  47, 68, 23, 0, 46, 0, 22, 15, 0, 13,
+  59, 13, 0, 0, 0, 55, 0, 0, 112, 118,
+  34, 26, 48, 0, 0, 57, 67, 0, 179, 5,
+  0, 32, 0, 139, 175, 0, 10, 15, 0, 0,
+  0, 0, 42, 0, 0, 0, 28, 19, 31, 0,
+  0, 11, 42, 0, 0, 116, 13, 0, 34, 0,
+  0, 0, 6, 54, 43, 142, 0, 0, 0, 0,
+  0, 58, 0, 0, 0, 29, 0, 30, 0, 10,
+  0, 0, 53, 0, 0, 0, 0, 0, 1, 29,
+  1, 6, 0, 37, 0, 0, 0, 81, 0, 0,
+  83, 32, 0, 0, 0, 9, 0, 42, 6, 26,
+  0, 10, 0, 0, 0, 25, 0, 0, 22, 40,
+  7, 0, 0, 0, 67, 0, 0, 20, 33, 86,
+  0, 0, 32, 0, 0, 10, 0, 67, 54, 81,
+  0, 26, 0, 6, 0, 0, 25, 36, 58, 0,
+  32, 0, 0, 65, 0, 0, 102, 0, 0, 34,
+  25, 57, 85, 0, 33, 59, 0, 79, 0, 0,
+  3, 0, 3, 0, 2, 0, 0, 0, 0, 49,
+  15, 0, 0, 173, 0, 0, 0, 0, 0, 0,
+  0, 64, 113, 110, 0, 0, 0, 0, 0, 29,
+  0, 22, 0, 30, 0, 19, 0, 0, 0, 29,
+  61, 0, 40, 0, 0, 0, 0, 15, 1, 35,
+  0, 34, 21, 0, 0, 0, 48, 33, 91, 15,
+  14, 16, 57, 1, 0, 81, 49, 0, 0, 0,
+  6, 20, 26, 30, 1, 0, 0, 23, 0, 0,
+  0, 0, 60, 0, 3, 0, 0, 56, 0, 42,
+  4, 5, 0, 43, 0, 101, 57, 64, 0, 36,
+  0, 14, 67, 0, 0, 0, 60, 0, 18, 0,
+  6, 36, 0, 46, 0, 0, 0, 0, 80, 0,
+  0, 0, 27, 50, 26, 48, 16, 11, 0, 0,
+  59, 0, 25, 0, 0, 9, 9, 3, 5, 0,
+  0, 63, 0, 14, 0, 0, 0, 0, 4, 79,
+  88, 0, 0, 0, 17, 0, 30, 2, 0, 51,
+  0, 7, 0, 20, 0, 0, 0, 31, 77, 0,
+  50, 0, 85, 0, 42, 0, 14, 0, 46, 82,
+  0, 50, 1, 35, 0, 0, 22, 0, 0, 15,
+  41, 6, 0, 0, 0, 19, 21, 11, 13, 31,
+  0, 0, 0, 0, 64, 0, 0, 0, 30, 54,
+  0, 0, 28, 29, 0, 17, 0, 0, 0, 0,
+  1, 18, 5, 11, 10, 0, 0, 0, 0, 57,
+  0, 22, 95, 48, 30, 4, 0, 0, 0, 73,
+  54, 11, 88, 0, 0, 66, 0, 94, 130, 13,
+  9, 0, 0, 4, 0, 2, 68, 0, 0, 0,
+  23, 16, 20, 0, 0, 28, 33, 13, 56, 0,
+  0, 0, 6, 0, 47, 0, 18, 68, 22, 150,
+  0, 0, 0, 0, 0, 82, 91, 0, 7, 26,
+  10, 31, 0, 0, 0, 0, 31, 0, 0, 0,
+  0, 0, 50, 35, 0, 2, 1, 12, 0, 19,
+  0, 115, 0, 0, 17, 0, 0, 0, 0, 1,
+  0, 0, 0, 28, 11, 16, 0, 65, 2, 0,
+  0, 0, 23, 0, 0, 0, 0, 17, 8, 0,
+  9, 65, 12, 45, 5, 0, 48, 0, 0, 18,
+  0, 33, 46, 0, 0, 7, 0, 29, 0, 0,
+  131, 59, 54, 5, 43, 0, 0, 107, 51, 0,
+  166, 0, 0, 46, 0, 112, 193, 0, 44, 0,
+  0, 35, 0, 0, 29, 0, 0, 0, 32, 0,
+  28, 0, 0, 1, 14, 0, 0, 79, 16, 0,
+  38, 0, 0, 0, 3, 61, 47, 127, 0, 0,
+  0, 0, 0, 36, 0, 0, 0, 55, 0, 53,
+  0, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+  13, 18, 0, 12, 0, 1, 0, 0, 0, 57,
+  0, 18, 70, 15, 0, 4, 0, 0, 0, 50,
+  13, 20, 0, 0, 47, 47, 29, 12, 0, 0,
+  0, 10, 0, 0, 0, 0, 50, 0, 0, 44,
+  0, 64, 0, 0, 54, 0, 0, 47, 0, 99,
+  16, 46, 0, 15, 0, 37, 0, 0, 63, 0,
+  74, 0, 64, 0, 0, 62, 0, 0, 90, 0,
+  0, 12, 30, 23, 61, 0, 70, 60, 0, 76,
+  0, 1, 0, 0, 21, 0, 0, 0, 0, 0,
+  8, 0, 5, 0, 0, 121, 9, 0, 0, 0,
+  0, 0, 20, 54, 116, 17, 0, 0, 0, 0,
+  11, 9, 0, 21, 0, 19, 0, 73, 0, 0,
+  0, 0, 56, 0, 53, 0, 0, 0, 21, 0,
+  18, 0, 0, 93, 41, 0, 7, 0, 52, 3,
+  86, 40, 12, 0, 76, 3, 0, 125, 70, 39,
+  2, 33, 0, 0, 0, 54, 36, 13, 16, 61,
+  3, 0, 21, 0, 90, 1, 0, 0, 0, 58,
+  0, 29, 9, 0, 26, 52, 0, 59, 72, 36,
+  0, 44, 0, 0, 84, 12, 0, 0, 22, 0,
+  0, 42, 0, 0, 0, 0, 0, 0, 47, 0,
+  62, 0, 0, 0, 2, 50, 38, 28, 0, 0,
+  0, 0, 77, 11, 8, 0, 0, 21, 0, 22,
+  43, 0, 0, 57, 0, 32, 0, 0, 0, 0,
+  0, 79, 66, 0, 0, 0, 15, 0, 10, 29,
+  0, 69, 0, 1, 0, 0, 0, 0, 0, 36,
+  65, 0, 62, 0, 139, 0, 57, 16, 25, 0,
+  0, 58, 49, 0, 14, 0, 50, 16, 63, 8,
+  3, 26, 61, 1, 7, 53, 52, 0, 0, 15,
+  0, 27, 43, 19, 23, 0, 0, 13, 0, 0,
+  0, 0, 41, 0, 0, 6, 0, 16, 0, 79,
+  0, 24, 0, 55, 1, 70, 61, 46, 0, 21,
+  0, 20, 72, 1, 0, 0, 29, 0, 0, 0,
+  15, 36, 0, 43, 0, 14, 0, 0, 79, 0,
+  0, 0, 7, 27, 66, 15, 34, 28, 0, 0,
+  79, 0, 29, 0, 25, 0, 16, 0, 0, 0,
+  0, 0, 0, 17, 0, 26, 0, 0, 5, 71,
+  31, 0, 0, 0, 26, 0, 28, 0, 0, 38,
+  0, 0, 0, 2, 0, 0, 2, 14, 69, 0,
+  27, 0, 63, 0, 43, 7, 17, 0, 0, 6,
+  0, 0, 0, 1, 30, 12, 26, 0, 0, 25,
+  43, 0, 8, 23, 56, 23, 0, 0, 32, 29,
+  18, 2, 25, 0, 0, 0, 0, 0, 0, 0,
+  36, 17, 0, 0, 0, 0, 0, 34, 0, 11,
+  0, 58, 21, 87, 29, 59, 0, 1, 0, 52,
+  63, 0, 3, 0, 12, 0, 0, 0, 25, 4,
+  0, 38, 0, 10, 4, 0, 42, 0, 34, 0,
+  0, 17, 34, 0, 45, 41, 0, 0, 77, 0,
+  55, 0, 5, 0, 14, 0, 0, 0, 0, 31,
+  0, 0, 0, 22, 0, 0, 32, 57, 30, 0,
+  0, 9, 8, 0, 15, 0, 0, 13, 0, 14,
+  0, 2, 0, 0, 29, 0, 33, 0, 14, 0,
+  33, 0, 13, 6, 20, 0, 0, 37, 0, 0,
+  0, 81, 0, 0, 83, 32, 0, 0, 0, 9,
+  0, 42, 6, 26, 0, 10, 0, 0, 0, 25,
+  0, 0, 22, 40, 7, 0, 0, 0, 67, 0,
+  0, 20, 33, 86, 0, 0, 32, 0, 0, 10,
+  0, 67, 54, 81, 0, 26, 0, 6, 0, 0,
+  25, 36, 58, 0, 32, 0, 0, 65, 0, 0,
+  102, 0, 0, 34, 25, 57, 85, 0, 33, 59,
+  0, 79, 0, 0, 3, 0, 3, 0, 2, 0,
+  0, 0, 0, 49, 15, 0, 0, 173, 0, 0,
+  0, 0, 0, 0, 0, 64, 113, 110, 0, 0,
+  0, 0, 0, 29, 0, 22, 0, 30, 0, 19,
+  0, 0, 0, 29, 61, 0, 40, 0, 0, 0,
+  0, 15, 1, 35, 0, 34, 21, 0, 0, 0,
+  48, 33, 91, 15, 14, 16, 57, 1, 0, 81,
+  49, 0, 0, 0, 6, 20, 26, 30, 1, 0,
+  0, 23, 0, 0, 0, 0, 60, 0, 3, 0,
+  0, 56, 0, 42, 4, 5, 0, 43, 0, 101,
+  57, 64, 0, 36, 0, 14, 67, 0, 0, 0,
+  60, 0, 18, 0, 6, 36, 0, 46, 0, 0,
+  0, 0, 80, 0, 0, 0, 27, 50, 26, 48,
+  16, 11, 0, 0, 59, 0, 25, 0, 0, 9,
+  9, 3, 5, 0, 0, 63, 0, 14, 0, 0,
+  0, 0, 4, 79, 88, 0, 0, 0, 17, 0,
+  30, 2, 0, 51, 0, 7, 0, 20, 0, 0,
+  0, 31, 77, 0, 50, 0, 85, 0, 42, 0,
+  14, 0, 0, 27, 0, 6, 0, 0, 33, 17,
+  40, 0, 12, 29, 62, 0, 14, 33, 65, 28,
+  0, 0, 26, 32, 26, 12, 42, 0, 0, 27,
+  0, 0, 0, 0, 69, 0, 0, 0, 0, 14,
+  0, 40, 0, 14, 0, 40, 23, 88, 0, 29,
+  0, 18, 0, 24, 66, 1, 4, 0, 0, 0,
+  0, 0, 30, 14, 0, 50, 0, 7, 42, 0,
+  37, 0, 0, 0, 0, 48, 16, 0, 58, 78,
+  0, 0, 60, 0, 43, 4, 0, 14, 12, 0,
+  0, 2, 0, 24, 0, 6, 0, 25, 4, 0,
+  5, 84, 38, 0, 0, 3, 48, 0, 12, 5,
+  0, 1, 0, 12, 0, 2, 0, 0, 15, 0,
+  12, 0, 16, 0, 60, 0, 26, 0, 25, 0,
+  1, 12, 0, 19, 0, 115, 0, 0, 17, 0,
+  0, 0, 0, 1, 0, 0, 0, 28, 11, 16,
+  0, 65, 2, 0, 0, 0, 23, 0, 0, 0,
+  0, 17, 8, 0, 9, 65, 12, 45, 5, 0,
+  48, 0, 0, 18, 0, 33, 46, 0, 0, 7,
+  0, 29, 0, 0, 131, 59, 54, 5, 43, 0,
+  0, 107, 51, 0, 166, 0, 0, 46, 0, 112,
+  193, 0, 44, 0, 0, 35, 0, 0, 29, 0,
+  0, 0, 32, 0, 28, 0, 0, 1, 14, 0,
+  0, 79, 16, 0, 38, 0, 0, 0, 3, 61,
+  47, 127, 0, 0, 0, 0, 0, 36, 0, 0,
+  0, 55, 0, 53, 0, 0, 0, 0, 47, 0,
+  0, 0, 0, 0, 13, 18, 0, 12, 0, 1,
+  0, 0, 0, 57, 0, 18, 70, 15, 0, 4,
+  0, 0, 0, 50, 13, 20, 0, 0, 47, 47,
+  29, 12, 0, 0, 0, 10, 0, 0, 0, 0,
+  50, 0, 0, 44, 0, 64, 0, 0, 54, 0,
+  0, 47, 0, 99, 16, 46, 0, 15, 0, 37,
+  0, 0, 63, 0, 74, 0, 64, 0, 0, 62,
+  0, 0, 90, 0, 0, 12, 30, 23, 61, 0,
+  70, 60, 0, 76, 0, 1, 0, 0, 21, 0,
+  0, 0, 0, 0, 8, 0, 5, 0, 0, 121,
+  9, 0, 0, 0, 0, 0, 20, 54, 116, 17,
+  0, 0, 0, 0, 11, 9, 0, 21, 0, 19,
+  0, 73, 0, 0, 0, 0, 56, 0, 53, 0,
+  0, 0, 21, 0, 18, 0, 0, 48, 16, 0,
+  0, 0, 50, 44, 75, 3, 3, 42, 110, 0,
+  16, 61, 79, 13, 2, 0, 31, 54, 4, 6,
+  49, 0, 0, 45, 0, 0, 0, 0, 83, 0,
+  2, 0, 0, 62, 0, 80, 0, 35, 4, 49,
+  18, 97, 6, 35, 0, 42, 0, 40, 48, 0,
+  23, 0, 3, 0, 0, 0, 0, 5, 0, 59,
+  0, 17, 20, 0, 40, 0, 0, 0, 0, 48,
+  8, 0, 29, 54, 0, 0, 33, 0, 42, 5,
+  0, 9, 4, 0, 0, 8, 0, 4, 0, 44,
+  0, 13, 5, 8, 15, 84, 41, 0, 0, 0,
+  34, 0, 24, 13, 4, 22, 0, 21, 0, 22,
+  0, 0, 0, 0, 35, 0, 31, 0, 111, 0,
+  71, 0, 32, 0, 0, 58, 49, 0, 14, 0,
+  50, 16, 63, 8, 3, 26, 61, 1, 7, 53,
+  52, 0, 0, 15, 0, 27, 43, 19, 23, 0,
+  0, 13, 0, 0, 0, 0, 41, 0, 0, 6,
+  0, 16, 0, 79, 0, 24, 0, 55, 1, 70,
+  61, 46, 0, 21, 0, 20, 72, 1, 0, 0,
+  29, 0, 0, 0, 15, 36, 0, 43, 0, 14,
+  0, 0, 79, 0, 0, 0, 7, 27, 66, 15,
+  34, 28, 0, 0, 79, 0, 29, 0, 25, 0,
+  16, 0, 0, 0, 0, 0, 0, 17, 0, 26,
+  0, 0, 5, 71, 31, 0, 0, 0, 26, 0,
+  28, 0, 0, 38, 0, 0, 0, 2, 0, 0,
+  2, 14, 69, 0, 27, 0, 63, 0, 43, 7,
+  17, 0, 0, 6, 0, 0, 0, 1, 30, 12,
+  26, 0, 0, 25, 43, 0, 8, 23, 56, 23,
+  0, 0, 32, 29, 18, 2, 25, 0, 0, 0,
+  0, 0, 0, 0, 36, 17, 0, 0, 0, 0,
+  0, 34, 0, 11, 0, 58, 21, 87, 29, 59,
+  0, 1, 0, 52, 63, 0, 3, 0, 12, 0,
+  0, 0, 25, 4, 0, 38, 0, 10, 4, 0,
+  42, 0, 34, 0, 0, 17, 34, 0, 45, 41,
+  0, 0, 77, 0, 55, 0, 5, 0, 14, 0,
+  0, 0, 0, 31, 0, 0, 0, 22, 0, 0,
+  32, 57, 30, 0, 0, 9, 8, 0, 15, 0,
+  0, 13, 0, 14, 0, 2, 0, 0, 29, 0,
+  33, 0, 14, 0, 33, 0, 13, 6, 20, 0,
+  0, 5, 0, 30, 11, 9, 0, 0, 16, 0,
+  14, 0, 28, 0, 0, 43, 62, 17, 0, 4,
+  0, 0, 0, 14, 39, 0, 19, 14, 0, 0,
+  0, 0, 39, 51, 0, 0, 0, 0, 8, 0,
+  0, 0, 0, 26, 0, 76, 41, 64, 0, 17,
+  0, 73, 78, 15, 1, 58, 0, 0, 0, 0,
+  35, 0, 0, 26, 0, 0, 54, 0, 52, 39,
+  59, 0, 0, 16, 4, 0, 13, 36, 0, 0,
+  89, 0, 49, 0, 0, 20, 1, 30, 0, 0,
+  0, 79, 0, 0, 39, 0, 21, 0, 17, 79,
+  53, 5, 0, 14, 0, 0, 0, 9, 0, 17,
+  0, 33, 0, 25, 0, 0, 3, 0, 0, 0,
+  0, 0, 77, 0, 14, 5, 4, 0, 0, 34,
+  21, 0, 0, 0, 48, 33, 91, 15, 14, 16,
+  57, 1, 0, 81, 49, 0, 0, 0, 6, 20,
+  26, 30, 1, 0, 0, 23, 0, 0, 0, 0,
+  60, 0, 3, 0, 0, 56, 0, 42, 4, 5,
+  0, 43, 0, 101, 57, 64, 0, 36, 0, 14,
+  67, 0, 0, 0, 60, 0, 18, 0, 6, 36,
+  0, 46, 0, 0, 0, 0, 80, 0, 0, 0,
+  27, 50, 26, 48, 16, 11, 0, 0, 59, 0,
+  25, 0, 0, 9, 9, 3, 5, 0, 0, 63,
+  0, 14, 0, 0, 0, 0, 4, 79, 88, 0,
+  0, 0, 17, 0, 30, 2, 0, 51, 0, 7,
+  0, 20, 0, 0, 0, 31, 77, 0, 50, 0,
+  85, 0, 42, 0, 14, 0, 0, 27, 0, 6,
+  0, 0, 33, 17, 40, 0, 12, 29, 62, 0,
+  14, 33, 65, 28, 0, 0, 26, 32, 26, 12,
+  42, 0, 0, 27, 0, 0, 0, 0, 69, 0,
+  0, 0, 0, 14, 0, 40, 0, 14, 0, 40,
+  23, 88, 0, 29, 0, 18, 0, 24, 66, 1,
+  4, 0, 0, 0, 0, 0, 30, 14, 0, 50,
+  0, 7, 42, 0, 37, 0, 0, 0, 0, 48,
+  16, 0, 58, 78, 0, 0, 60, 0, 43, 4,
+  0, 14, 12, 0, 0, 2, 0, 24, 0, 6,
+  0, 25, 4, 0, 5, 84, 38, 0, 0, 3,
+  48, 0, 12, 5, 0, 1, 0, 12, 0, 2,
+  0, 0, 15, 0, 12, 0, 16, 0, 60, 0,
+  26, 0, 25, 0, 32, 14, 0, 17, 0, 0,
+  0, 0, 0, 0, 1, 1, 16, 0, 0, 0,
+  49, 11, 3, 0, 0, 29, 0, 16, 72, 0,
+  37, 30, 0, 0, 0, 15, 79, 12, 0, 0,
+  0, 13, 41, 0, 0, 0, 0, 11, 0, 105,
+  32, 28, 0, 0, 0, 8, 36, 0, 22, 20,
+  3, 0, 0, 0, 87, 22, 0, 54, 0, 0,
+  130, 30, 67, 49, 31, 0, 0, 36, 0, 0,
+  48, 46, 0, 0, 36, 0, 58, 28, 0, 42,
+  0, 0, 0, 0, 0, 73, 0, 0, 0, 0,
+  0, 0, 0, 113, 49, 57, 10, 33, 35, 37,
+  0, 0, 24, 0, 0, 52, 0, 0, 0, 0,
+  4, 0, 10, 0, 8, 0, 23, 0, 0, 0,
+  31, 19, 0, 1, 0, 0, 0, 57, 0, 18,
+  70, 15, 0, 4, 0, 0, 0, 50, 13, 20,
+  0, 0, 47, 47, 29, 12, 0, 0, 0, 10,
+  0, 0, 0, 0, 50, 0, 0, 44, 0, 64,
+  0, 0, 54, 0, 0, 47, 0, 99, 16, 46,
+  0, 15, 0, 37, 0, 0, 63, 0, 74, 0,
+  64, 0, 0, 62, 0, 0, 90, 0, 0, 12,
+  30, 23, 61, 0, 70, 60, 0, 76, 0, 1,
+  0, 0, 21, 0, 0, 0, 0, 0, 8, 0,
+  5, 0, 0, 121, 9, 0, 0, 0, 0, 0,
+  20, 54, 116, 17, 0, 0, 0, 0, 11, 9,
+  0, 21, 0, 19, 0, 73, 0, 0, 0, 0,
+  56, 0, 53, 0, 0, 0, 21, 0, 18, 0,
+  0, 48, 16, 0, 0, 0, 50, 44, 75, 3,
+  3, 42, 110, 0, 16, 61, 79, 13, 2, 0,
+  31, 54, 4, 6, 49, 0, 0, 45, 0, 0,
+  0, 0, 83, 0, 2, 0, 0, 62, 0, 80,
+  0, 35, 4, 49, 18, 97, 6, 35, 0, 42,
+  0, 40, 48, 0, 23, 0, 3, 0, 0, 0,
+  0, 5, 0, 59, 0, 17, 20, 0, 40, 0,
+  0, 0, 0, 48, 8, 0, 29, 54, 0, 0,
+  33, 0, 42, 5, 0, 9, 4, 0, 0, 8,
+  0, 4, 0, 44, 0, 13, 5, 8, 15, 84,
+  41, 0, 0, 0, 34, 0, 24, 13, 4, 22,
+  0, 21, 0, 22, 0, 0, 0, 0, 35, 0,
+  31, 0, 111, 0, 71, 0, 32, 0, 3, 37,
+  0, 0, 14, 0, 32, 0, 0, 0, 3, 23,
+  56, 0, 0, 4, 62, 15, 4, 0, 0, 72,
+  0, 17, 107, 0, 0, 48, 0, 0, 0, 48,
+  90, 0, 0, 0, 0, 51, 43, 7, 0, 46,
+  21, 29, 25, 100, 41, 0, 0, 5, 0, 0,
+  5, 0, 27, 0, 7, 0, 20, 2, 58, 63,
+  0, 50, 0, 0, 97, 52, 73, 0, 0, 0,
+  9, 20, 30, 0, 53, 59, 0, 0, 0, 0,
+  39, 57, 10, 31, 0, 0, 0, 14, 0, 0,
+  0, 54, 0, 21, 0, 18, 0, 113, 24, 11,
+  22, 20, 39, 43, 10, 0, 43, 0, 0, 50,
+  0, 0, 0, 0, 10, 1, 48, 0, 7, 0,
+  27, 0, 30, 0, 30, 47, 0, 6, 0, 0,
+  0, 1, 30, 12, 26, 0, 0, 25, 43, 0,
+  8, 23, 56, 23, 0, 0, 32, 29, 18, 2,
+  25, 0, 0, 0, 0, 0, 0, 0, 36, 17,
+  0, 0, 0, 0, 0, 34, 0, 11, 0, 58,
+  21, 87, 29, 59, 0, 1, 0, 52, 63, 0,
+  3, 0, 12, 0, 0, 0, 25, 4, 0, 38,
+  0, 10, 4, 0, 42, 0, 34, 0, 0, 17,
+  34, 0, 45, 41, 0, 0, 77, 0, 55, 0,
+  5, 0, 14, 0, 0, 0, 0, 31, 0, 0,
+  0, 22, 0, 0, 32, 57, 30, 0, 0, 9,
+  8, 0, 15, 0, 0, 13, 0, 14, 0, 2,
+  0, 0, 29, 0, 33, 0, 14, 0, 33, 0,
+  13, 6, 20, 0, 0, 5, 0, 30, 11, 9,
+  0, 0, 16, 0, 14, 0, 28, 0, 0, 43,
+  62, 17, 0, 4, 0, 0, 0, 14, 39, 0,
+  19, 14, 0, 0, 0, 0, 39, 51, 0, 0,
+  0, 0, 8, 0, 0, 0, 0, 26, 0, 76,
+  41, 64, 0, 17, 0, 73, 78, 15, 1, 58,
+  0, 0, 0, 0, 35, 0, 0, 26, 0, 0,
+  54, 0, 52, 39, 59, 0, 0, 16, 4, 0,
+  13, 36, 0, 0, 89, 0, 49, 0, 0, 20,
+  1, 30, 0, 0, 0, 79, 0, 0, 39, 0,
+  21, 0, 17, 79, 53, 5, 0, 14, 0, 0,
+  0, 9, 0, 17, 0, 33, 0, 25, 0, 0,
+  3, 0, 0, 0, 0, 0, 77, 0, 14, 5,
+  4, 0, 0, 37, 0, 30, 19, 0, 8, 0,
+  29, 1, 5, 0, 23, 0, 24, 68, 78, 31,
+  0, 2, 0, 0, 0, 40, 45, 0, 20, 28,
+  0, 0, 7, 0, 46, 69, 0, 0, 0, 8,
+  7, 0, 0, 0, 0, 16, 0, 35, 63, 39,
+  0, 11, 0, 42, 72, 27, 0, 30, 0, 4,
+  0, 3, 38, 0, 0, 31, 0, 0, 79, 0,
+  75, 41, 0, 0, 0, 12, 16, 0, 14, 1,
+  0, 0, 85, 0, 26, 0, 0, 32, 0, 18,
+  6, 0, 14, 72, 0, 6, 28, 0, 15, 0,
+  0, 80, 18, 0, 0, 7, 0, 0, 0, 0,
+  2, 22, 0, 30, 8, 22, 3, 0, 0, 0,
+  0, 0, 0, 0, 101, 0, 9, 26, 7, 0,
+  0, 27, 0, 6, 0, 0, 33, 17, 40, 0,
+  12, 29, 62, 0, 14, 33, 65, 28, 0, 0,
+  26, 32, 26, 12, 42, 0, 0, 27, 0, 0,
+  0, 0, 69, 0, 0, 0, 0, 14, 0, 40,
+  0, 14, 0, 40, 23, 88, 0, 29, 0, 18,
+  0, 24, 66, 1, 4, 0, 0, 0, 0, 0,
+  30, 14, 0, 50, 0, 7, 42, 0, 37, 0,
+  0, 0, 0, 48, 16, 0, 58, 78, 0, 0,
+  60, 0, 43, 4, 0, 14, 12, 0, 0, 2,
+  0, 24, 0, 6, 0, 25, 4, 0, 5, 84,
+  38, 0, 0, 3, 48, 0, 12, 5, 0, 1,
+  0, 12, 0, 2, 0, 0, 15, 0, 12, 0,
+  16, 0, 60, 0, 26, 0, 25, 0, 32, 14,
+  0, 17, 0, 0, 0, 0, 0, 0, 1, 1,
+  16, 0, 0, 0, 49, 11, 3, 0, 0, 29,
+  0, 16, 72, 0, 37, 30, 0, 0, 0, 15,
+  79, 12, 0, 0, 0, 13, 41, 0, 0, 0,
+  0, 11, 0, 105, 32, 28, 0, 0, 0, 8,
+  36, 0, 22, 20, 3, 0, 0, 0, 87, 22,
+  0, 54, 0, 0, 130, 30, 67, 49, 31, 0,
+  0, 36, 0, 0, 48, 46, 0, 0, 36, 0,
+  58, 28, 0, 42, 0, 0, 0, 0, 0, 73,
+  0, 0, 0, 0, 0, 0, 0, 113, 49, 57,
+  10, 33, 35, 37, 0, 0, 24, 0, 0, 52,
+  0, 0, 0, 0, 4, 0, 10, 0, 8, 0,
+  23, 0, 0, 0, 31, 19, 12, 13, 0, 21,
+  6, 5, 0, 0, 11, 0, 0, 0, 48, 0,
+  0, 18, 58, 12, 0, 0, 0, 8, 0, 28,
+  33, 0, 31, 20, 0, 0, 0, 2, 67, 50,
+  0, 0, 0, 26, 49, 0, 0, 0, 0, 31,
+  0, 97, 52, 74, 0, 0, 0, 36, 26, 0,
+  0, 44, 0, 0, 0, 0, 64, 9, 0, 12,
+  0, 0, 87, 26, 88, 48, 67, 0, 0, 16,
+  0, 0, 28, 0, 0, 0, 33, 0, 46, 22,
+  0, 32, 0, 0, 2, 0, 0, 84, 0, 0,
+  12, 0, 0, 0, 1, 115, 49, 54, 0, 40,
+  17, 26, 0, 0, 9, 0, 0, 49, 0, 16,
+  0, 0, 0, 0, 29, 0, 1, 0, 46, 0,
+  0, 0, 33, 16, 0, 48, 16, 0, 0, 0,
+  50, 44, 75, 3, 3, 42, 110, 0, 16, 61,
+  79, 13, 2, 0, 31, 54, 4, 6, 49, 0,
+  0, 45, 0, 0, 0, 0, 83, 0, 2, 0,
+  0, 62, 0, 80, 0, 35, 4, 49, 18, 97,
+  6, 35, 0, 42, 0, 40, 48, 0, 23, 0,
+  3, 0, 0, 0, 0, 5, 0, 59, 0, 17,
+  20, 0, 40, 0, 0, 0, 0, 48, 8, 0,
+  29, 54, 0, 0, 33, 0, 42, 5, 0, 9,
+  4, 0, 0, 8, 0, 4, 0, 44, 0, 13,
+  5, 8, 15, 84, 41, 0, 0, 0, 34, 0,
+  24, 13, 4, 22, 0, 21, 0, 22, 0, 0,
+  0, 0, 35, 0, 31, 0, 111, 0, 71, 0,
+  32, 0, 3, 37, 0, 0, 14, 0, 32, 0,
+  0, 0, 3, 23, 56, 0, 0, 4, 62, 15,
+  4, 0, 0, 72, 0, 17, 107, 0, 0, 48,
+  0, 0, 0, 48, 90, 0, 0, 0, 0, 51,
+  43, 7, 0, 46, 21, 29, 25, 100, 41, 0,
+  0, 5, 0, 0, 5, 0, 27, 0, 7, 0,
+  20, 2, 58, 63, 0, 50, 0, 0, 97, 52,
+  73, 0, 0, 0, 9, 20, 30, 0, 53, 59,
+  0, 0, 0, 0, 39, 57, 10, 31, 0, 0,
+  0, 14, 0, 0, 0, 54, 0, 21, 0, 18,
+  0, 113, 24, 11, 22, 20, 39, 43, 10, 0,
+  43, 0, 0, 50, 0, 0, 0, 0, 10, 1,
+  48, 0, 7, 0, 27, 0, 30, 0, 30, 47,
+  0, 22, 0, 0, 13, 12, 20, 0, 30, 0,
+  12, 20, 47, 4, 0, 16, 61, 0, 3, 0,
+  0, 56, 0, 10, 36, 0, 0, 41, 0, 0,
+  2, 0, 51, 24, 0, 0, 0, 75, 57, 0,
+  0, 1, 0, 46, 0, 115, 40, 68, 0, 0,
+  0, 16, 0, 0, 30, 32, 30, 0, 49, 0,
+  37, 54, 0, 31, 7, 0, 25, 63, 98, 0,
+  89, 0, 26, 32, 28, 22, 29, 0, 0, 0,
+  0, 0, 23, 34, 22, 43, 0, 13, 0, 0,
+  0, 67, 0, 29, 0, 0, 0, 0, 28, 122,
+  64, 34, 0, 28, 14, 55, 5, 5, 0, 0,
+  0, 59, 0, 9, 0, 5, 0, 38, 80, 0,
+  0, 0, 7, 0, 12, 0, 22, 22, 0, 5,
+  0, 30, 11, 9, 0, 0, 16, 0, 14, 0,
+  28, 0, 0, 43, 62, 17, 0, 4, 0, 0,
+  0, 14, 39, 0, 19, 14, 0, 0, 0, 0,
+  39, 51, 0, 0, 0, 0, 8, 0, 0, 0,
+  0, 26, 0, 76, 41, 64, 0, 17, 0, 73,
+  78, 15, 1, 58, 0, 0, 0, 0, 35, 0,
+  0, 26, 0, 0, 54, 0, 52, 39, 59, 0,
+  0, 16, 4, 0, 13, 36, 0, 0, 89, 0,
+  49, 0, 0, 20, 1, 30, 0, 0, 0, 79,
+  0, 0, 39, 0, 21, 0, 17, 79, 53, 5,
+  0, 14, 0, 0, 0, 9, 0, 17, 0, 33,
+  0, 25, 0, 0, 3, 0, 0, 0, 0, 0,
+  77, 0, 14, 5, 4, 0, 0, 37, 0, 30,
+  19, 0, 8, 0, 29, 1, 5, 0, 23, 0,
+  24, 68, 78, 31, 0, 2, 0, 0, 0, 40,
+  45, 0, 20, 28, 0, 0, 7, 0, 46, 69,
+  0, 0, 0, 8, 7, 0, 0, 0, 0, 16,
+  0, 35, 63, 39, 0, 11, 0, 42, 72, 27,
+  0, 30, 0, 4, 0, 3, 38, 0, 0, 31,
+  0, 0, 79, 0, 75, 41, 0, 0, 0, 12,
+  16, 0, 14, 1, 0, 0, 85, 0, 26, 0,
+  0, 32, 0, 18, 6, 0, 14, 72, 0, 6,
+  28, 0, 15, 0, 0, 80, 18, 0, 0, 7,
+  0, 0, 0, 0, 2, 22, 0, 30, 8, 22,
+  3, 0, 0, 0, 0, 0, 0, 0, 101, 0,
+  9, 26, 7, 0, 0, 119, 31, 10, 0, 0,
+  55, 0, 33, 18, 0, 0, 0, 0, 46, 39,
+  65, 38, 5, 18, 0, 0, 0, 46, 49, 6,
+  24, 40, 0, 0, 0, 0, 84, 26, 0, 0,
+  0, 16, 0, 3, 0, 0, 24, 17, 0, 45,
+  64, 6, 0, 10, 0, 0, 73, 0, 0, 0,
+  32, 0, 0, 35, 7, 5, 0, 0, 0, 0,
+  63, 0, 26, 11, 0, 0, 0, 15, 64, 26,
+  8, 27, 5, 0, 67, 3, 18, 28, 0, 6,
+  0, 0, 1, 26, 36, 0, 0, 22, 0, 0,
+  0, 0, 0, 60, 6, 0, 0, 0, 2, 0,
+  43, 0, 35, 36, 0, 21, 0, 19, 0, 0,
+  0, 0, 13, 0, 0, 0, 95, 0, 24, 41,
+  20, 0, 32, 14, 0, 17, 0, 0, 0, 0,
+  0, 0, 1, 1, 16, 0, 0, 0, 49, 11,
+  3, 0, 0, 29, 0, 16, 72, 0, 37, 30,
+  0, 0, 0, 15, 79, 12, 0, 0, 0, 13,
+  41, 0, 0, 0, 0, 11, 0, 105, 32, 28,
+  0, 0, 0, 8, 36, 0, 22, 20, 3, 0,
+  0, 0, 87, 22, 0, 54, 0, 0, 130, 30,
+  67, 49, 31, 0, 0, 36, 0, 0, 48, 46,
+  0, 0, 36, 0, 58, 28, 0, 42, 0, 0,
+  0, 0, 0, 73, 0, 0, 0, 0, 0, 0,
+  0, 113, 49, 57, 10, 33, 35, 37, 0, 0,
+  24, 0, 0, 52, 0, 0, 0, 0, 4, 0,
+  10, 0, 8, 0, 23, 0, 0, 0, 31, 19,
+  12, 13, 0, 21, 6, 5, 0, 0, 11, 0,
+  0, 0, 48, 0, 0, 18, 58, 12, 0, 0,
+  0, 8, 0, 28, 33, 0, 31, 20, 0, 0,
+  0, 2, 67, 50, 0, 0, 0, 26, 49, 0,
+  0, 0, 0, 31, 0, 97, 52, 74, 0, 0,
+  0, 36, 26, 0, 0, 44, 0, 0, 0, 0,
+  64, 9, 0, 12, 0, 0, 87, 26, 88, 48,
+  67, 0, 0, 16, 0, 0, 28, 0, 0, 0,
+  33, 0, 46, 22, 0, 32, 0, 0, 2, 0,
+  0, 84, 0, 0, 12, 0, 0, 0, 1, 115,
+  49, 54, 0, 40, 17, 26, 0, 0, 9, 0,
+  0, 49, 0, 16, 0, 0, 0, 0, 29, 0,
+  1, 0, 46, 0, 0, 0, 33, 16, 0, 98,
+  0, 20, 14, 0, 60, 12, 44, 16, 32, 0,
+  54, 0, 44, 107, 104, 30, 6, 0, 0, 0,
+  0, 40, 41, 45, 0, 53, 0, 0, 0, 0,
+  87, 64, 0, 0, 0, 27, 0, 41, 0, 0,
+  16, 28, 30, 44, 24, 53, 0, 28, 0, 0,
+  87, 10, 0, 0, 0, 14, 0, 58, 10, 0,
+  0, 24, 0, 0, 75, 0, 41, 0, 0, 0,
+  0, 48, 17, 40, 0, 0, 0, 12, 73, 0,
+  9, 26, 0, 32, 2, 2, 0, 43, 49, 36,
+  0, 65, 0, 26, 0, 0, 0, 86, 27, 0,
+  0, 0, 9, 0, 28, 10, 24, 30, 0, 17,
+  0, 27, 0, 0, 0, 0, 2, 0, 8, 0,
+  164, 0, 52, 9, 40, 0, 3, 37, 0, 0,
+  14, 0, 32, 0, 0, 0, 3, 23, 56, 0,
+  0, 4, 62, 15, 4, 0, 0, 72, 0, 17,
+  107, 0, 0, 48, 0, 0, 0, 48, 90, 0,
+  0, 0, 0, 51, 43, 7, 0, 46, 21, 29,
+  25, 100, 41, 0, 0, 5, 0, 0, 5, 0,
+  27, 0, 7, 0, 20, 2, 58, 63, 0, 50,
+  0, 0, 97, 52, 73, 0, 0, 0, 9, 20,
+  30, 0, 53, 59, 0, 0, 0, 0, 39, 57,
+  10, 31, 0, 0, 0, 14, 0, 0, 0, 54,
+  0, 21, 0, 18, 0, 113, 24, 11, 22, 20,
+  39, 43, 10, 0, 43, 0, 0, 50, 0, 0,
+  0, 0, 10, 1, 48, 0, 7, 0, 27, 0,
+  30, 0, 30, 47, 0, 22, 0, 0, 13, 12,
+  20, 0, 30, 0, 12, 20, 47, 4, 0, 16,
+  61, 0, 3, 0, 0, 56, 0, 10, 36, 0,
+  0, 41, 0, 0, 2, 0, 51, 24, 0, 0,
+  0, 75, 57, 0, 0, 1, 0, 46, 0, 115,
+  40, 68, 0, 0, 0, 16, 0, 0, 30, 32,
+  30, 0, 49, 0, 37, 54, 0, 31, 7, 0,
+  25, 63, 98, 0, 89, 0, 26, 32, 28, 22,
+  29, 0, 0, 0, 0, 0, 23, 34, 22, 43,
+  0, 13, 0, 0, 0, 67, 0, 29, 0, 0,
+  0, 0, 28, 122, 64, 34, 0, 28, 14, 55,
+  5, 5, 0, 0, 0, 59, 0, 9, 0, 5,
+  0, 38, 80, 0, 0, 0, 7, 0, 12, 0,
+  22, 22, 0, 49, 0, 0, 0, 0, 12, 0,
+  80, 43, 25, 0, 73, 2, 0, 149, 100, 43,
+  17, 0, 0, 0, 0, 25, 0, 0, 21, 90,
+  9, 0, 9, 0, 115, 13, 0, 0, 4, 73,
+  0, 0, 23, 0, 0, 26, 0, 80, 0, 54,
+  0, 37, 0, 15, 61, 0, 0, 23, 13, 7,
+  0, 32, 0, 0, 0, 0, 0, 0, 27, 12,
+  61, 0, 7, 0, 0, 98, 0, 66, 0, 13,
+  0, 0, 19, 3, 24, 48, 0, 47, 3, 23,
+  13, 19, 53, 124, 0, 32, 23, 0, 0, 0,
+  0, 90, 142, 0, 0, 0, 8, 0, 0, 33,
+  0, 34, 0, 47, 0, 22, 0, 0, 0, 0,
+  6, 0, 0, 0, 122, 0, 29, 0, 52, 16,
+  0, 37, 0, 30, 19, 0, 8, 0, 29, 1,
+  5, 0, 23, 0, 24, 68, 78, 31, 0, 2,
+  0, 0, 0, 40, 45, 0, 20, 28, 0, 0,
+  7, 0, 46, 69, 0, 0, 0, 8, 7, 0,
+  0, 0, 0, 16, 0, 35, 63, 39, 0, 11,
+  0, 42, 72, 27, 0, 30, 0, 4, 0, 3,
+  38, 0, 0, 31, 0, 0, 79, 0, 75, 41,
+  0, 0, 0, 12, 16, 0, 14, 1, 0, 0,
+  85, 0, 26, 0, 0, 32, 0, 18, 6, 0,
+  14, 72, 0, 6, 28, 0, 15, 0, 0, 80,
+  18, 0, 0, 7, 0, 0, 0, 0, 2, 22,
+  0, 30, 8, 22, 3, 0, 0, 0, 0, 0,
+  0, 0, 101, 0, 9, 26, 7, 0, 0, 119,
+  31, 10, 0, 0, 55, 0, 33, 18, 0, 0,
+  0, 0, 46, 39, 65, 38, 5, 18, 0, 0,
+  0, 46, 49, 6, 24, 40, 0, 0, 0, 0,
+  84, 26, 0, 0, 0, 16, 0, 3, 0, 0,
+  24, 17, 0, 45, 64, 6, 0, 10, 0, 0,
+  73, 0, 0, 0, 32, 0, 0, 35, 7, 5,
+  0, 0, 0, 0, 63, 0, 26, 11, 0, 0,
+  0, 15, 64, 26, 8, 27, 5, 0, 67, 3,
+  18, 28, 0, 6, 0, 0, 1, 26, 36, 0,
+  0, 22, 0, 0, 0, 0, 0, 60, 6, 0,
+  0, 0, 2, 0, 43, 0, 35, 36, 0, 21,
+  0, 19, 0, 0, 0, 0, 13, 0, 0, 0,
+  95, 0, 24, 41, 20, 0, 0, 104, 16, 18,
+  0, 0, 0, 0, 47, 19, 0, 0, 6, 0,
+  7, 17, 36, 23, 0, 2, 0, 0, 72, 39,
+  0, 0, 14, 29, 0, 0, 0, 0, 40, 0,
+  36, 14, 0, 1, 11, 0, 0, 0, 22, 32,
+  0, 52, 25, 0, 0, 0, 0, 42, 40, 0,
+  22, 0, 44, 0, 3, 0, 0, 33, 0, 0,
+  52, 0, 0, 0, 0, 10, 106, 0, 39, 32,
+  46, 45, 0, 59, 28, 0, 21, 0, 1, 31,
+  0, 0, 5, 21, 26, 0, 31, 0, 0, 0,
+  5, 0, 0, 0, 0, 52, 28, 23, 1, 0,
+  7, 59, 48, 1, 0, 29, 0, 28, 0, 8,
+  0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+  49, 26, 5, 0, 12, 13, 0, 21, 6, 5,
+  0, 0, 11, 0, 0, 0, 48, 0, 0, 18,
+  58, 12, 0, 0, 0, 8, 0, 28, 33, 0,
+  31, 20, 0, 0, 0, 2, 67, 50, 0, 0,
+  0, 26, 49, 0, 0, 0, 0, 31, 0, 97,
+  52, 74, 0, 0, 0, 36, 26, 0, 0, 44,
+  0, 0, 0, 0, 64, 9, 0, 12, 0, 0,
+  87, 26, 88, 48, 67, 0, 0, 16, 0, 0,
+  28, 0, 0, 0, 33, 0, 46, 22, 0, 32,
+  0, 0, 2, 0, 0, 84, 0, 0, 12, 0,
+  0, 0, 1, 115, 49, 54, 0, 40, 17, 26,
+  0, 0, 9, 0, 0, 49, 0, 16, 0, 0,
+  0, 0, 29, 0, 1, 0, 46, 0, 0, 0,
+  33, 16, 0, 98, 0, 20, 14, 0, 60, 12,
+  44, 16, 32, 0, 54, 0, 44, 107, 104, 30,
+  6, 0, 0, 0, 0, 40, 41, 45, 0, 53,
+  0, 0, 0, 0, 87, 64, 0, 0, 0, 27,
+  0, 41, 0, 0, 16, 28, 30, 44, 24, 53,
+  0, 28, 0, 0, 87, 10, 0, 0, 0, 14,
+  0, 58, 10, 0, 0, 24, 0, 0, 75, 0,
+  41, 0, 0, 0, 0, 48, 17, 40, 0, 0,
+  0, 12, 73, 0, 9, 26, 0, 32, 2, 2,
+  0, 43, 49, 36, 0, 65, 0, 26, 0, 0,
+  0, 86, 27, 0, 0, 0, 9, 0, 28, 10,
+  24, 30, 0, 17, 0, 27, 0, 0, 0, 0,
+  2, 0, 8, 0, 164, 0, 52, 9, 40, 0,
+  0, 111, 49, 4, 4, 0, 0, 13, 78, 36,
+  24, 0, 20, 0, 0, 97, 83, 24, 24, 5,
+  0, 0, 48, 50, 0, 0, 1, 78, 1, 0,
+  0, 0, 68, 0, 12, 0, 0, 28, 0, 3,
+  0, 0, 11, 19, 11, 36, 0, 0, 0, 29,
+  0, 18, 44, 0, 0, 0, 1, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+  0, 0, 32, 72, 9, 90, 0, 112, 2, 20,
+  35, 0, 0, 53, 0, 31, 6, 61, 21, 24,
+  117, 0, 0, 0, 26, 0, 0, 0, 0, 100,
+  90, 0, 0, 0, 7, 0, 54, 21, 0, 21,
+  0, 0, 0, 15, 0, 0, 0, 0, 0, 21,
+  0, 0, 73, 0, 76, 10, 35, 0, 0, 22,
+  0, 0, 13, 12, 20, 0, 30, 0, 12, 20,
+  47, 4, 0, 16, 61, 0, 3, 0, 0, 56,
+  0, 10, 36, 0, 0, 41, 0, 0, 2, 0,
+  51, 24, 0, 0, 0, 75, 57, 0, 0, 1,
+  0, 46, 0, 115, 40, 68, 0, 0, 0, 16,
+  0, 0, 30, 32, 30, 0, 49, 0, 37, 54,
+  0, 31, 7, 0, 25, 63, 98, 0, 89, 0,
+  26, 32, 28, 22, 29, 0, 0, 0, 0, 0,
+  23, 34, 22, 43, 0, 13, 0, 0, 0, 67,
+  0, 29, 0, 0, 0, 0, 28, 122, 64, 34,
+  0, 28, 14, 55, 5, 5, 0, 0, 0, 59,
+  0, 9, 0, 5, 0, 38, 80, 0, 0, 0,
+  7, 0, 12, 0, 22, 22, 0, 49, 0, 0,
+  0, 0, 12, 0, 80, 43, 25, 0, 73, 2,
+  0, 149, 100, 43, 17, 0, 0, 0, 0, 25,
+  0, 0, 21, 90, 9, 0, 9, 0, 115, 13,
+  0, 0, 4, 73, 0, 0, 23, 0, 0, 26,
+  0, 80, 0, 54, 0, 37, 0, 15, 61, 0,
+  0, 23, 13, 7, 0, 32, 0, 0, 0, 0,
+  0, 0, 27, 12, 61, 0, 7, 0, 0, 98,
+  0, 66, 0, 13, 0, 0, 19, 3, 24, 48,
+  0, 47, 3, 23, 13, 19, 53, 124, 0, 32,
+  23, 0, 0, 0, 0, 90, 142, 0, 0, 0,
+  8, 0, 0, 33, 0, 34, 0, 47, 0, 22,
+  0, 0, 0, 0, 6, 0, 0, 0, 122, 0,
+  29, 0, 52, 16, 0, 27, 108, 0, 0, 0,
+  0, 0, 90, 42, 15, 0, 26, 53, 0, 84,
+  60, 35, 50, 0, 0, 15, 20, 31, 0, 0,
+  3, 111, 0, 0, 0, 0, 61, 0, 0, 0,
+  0, 79, 0, 0, 3, 0, 0, 0, 0, 28,
+  0, 0, 0, 35, 0, 82, 11, 0, 69, 0,
+  27, 18, 0, 0, 0, 0, 0, 0, 27, 0,
+  48, 0, 11, 70, 0, 0, 22, 90, 0, 69,
+  0, 68, 0, 0, 7, 0, 32, 92, 0, 47,
+  0, 58, 48, 0, 85, 34, 0, 0, 11, 0,
+  0, 0, 0, 133, 125, 0, 0, 0, 8, 0,
+  0, 61, 0, 16, 7, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 45, 0, 54, 0,
+  21, 46, 0, 119, 31, 10, 0, 0, 55, 0,
+  33, 18, 0, 0, 0, 0, 46, 39, 65, 38,
+  5, 18, 0, 0, 0, 46, 49, 6, 24, 40,
+  0, 0, 0, 0, 84, 26, 0, 0, 0, 16,
+  0, 3, 0, 0, 24, 17, 0, 45, 64, 6,
+  0, 10, 0, 0, 73, 0, 0, 0, 32, 0,
+  0, 35, 7, 5, 0, 0, 0, 0, 63, 0,
+  26, 11, 0, 0, 0, 15, 64, 26, 8, 27,
+  5, 0, 67, 3, 18, 28, 0, 6, 0, 0,
+  1, 26, 36, 0, 0, 22, 0, 0, 0, 0,
+  0, 60, 6, 0, 0, 0, 2, 0, 43, 0,
+  35, 36, 0, 21, 0, 19, 0, 0, 0, 0,
+  13, 0, 0, 0, 95, 0, 24, 41, 20, 0,
+  0, 104, 16, 18, 0, 0, 0, 0, 47, 19,
+  0, 0, 6, 0, 7, 17, 36, 23, 0, 2,
+  0, 0, 72, 39, 0, 0, 14, 29, 0, 0,
+  0, 0, 40, 0, 36, 14, 0, 1, 11, 0,
+  0, 0, 22, 32, 0, 52, 25, 0, 0, 0,
+  0, 42, 40, 0, 22, 0, 44, 0, 3, 0,
+  0, 33, 0, 0, 52, 0, 0, 0, 0, 10,
+  106, 0, 39, 32, 46, 45, 0, 59, 28, 0,
+  21, 0, 1, 31, 0, 0, 5, 21, 26, 0,
+  31, 0, 0, 0, 5, 0, 0, 0, 0, 52,
+  28, 23, 1, 0, 7, 59, 48, 1, 0, 29,
+  0, 28, 0, 8, 0, 0, 0, 0, 0, 12,
+  0, 0, 0, 0, 49, 26, 5, 0, 107, 66,
+  16, 65, 30, 0, 0, 17, 71, 14, 28, 0,
+  85, 0, 0, 80, 60, 0, 13, 0, 0, 32,
+  32, 6, 0, 0, 0, 61, 0, 37, 19, 69,
+  10, 6, 18, 5, 0, 44, 103, 0, 0, 23,
+  0, 23, 18, 0, 0, 0, 0, 0, 0, 86,
+  0, 0, 83, 13, 32, 36, 9, 0, 0, 0,
+  0, 0, 15, 55, 0, 0, 11, 0, 91, 19,
+  43, 55, 0, 39, 28, 49, 0, 26, 0, 0,
+  19, 64, 28, 26, 14, 0, 86, 0, 32, 0,
+  0, 14, 0, 0, 66, 0, 5, 67, 43, 0,
+  9, 0, 0, 58, 0, 60, 9, 0, 6, 0,
+  0, 0, 0, 0, 0, 0, 0, 15, 0, 4,
+  0, 18, 46, 15, 12, 30, 0, 98, 0, 20,
+  14, 0, 60, 12, 44, 16, 32, 0, 54, 0,
+  44, 107, 104, 30, 6, 0, 0, 0, 0, 40,
+  41, 45, 0, 53, 0, 0, 0, 0, 87, 64,
+  0, 0, 0, 27, 0, 41, 0, 0, 16, 28,
+  30, 44, 24, 53, 0, 28, 0, 0, 87, 10,
+  0, 0, 0, 14, 0, 58, 10, 0, 0, 24,
+  0, 0, 75, 0, 41, 0, 0, 0, 0, 48,
+  17, 40, 0, 0, 0, 12, 73, 0, 9, 26,
+  0, 32, 2, 2, 0, 43, 49, 36, 0, 65,
+  0, 26, 0, 0, 0, 86, 27, 0, 0, 0,
+  9, 0, 28, 10, 24, 30, 0, 17, 0, 27,
+  0, 0, 0, 0, 2, 0, 8, 0, 164, 0,
+  52, 9, 40, 0, 0, 111, 49, 4, 4, 0,
+  0, 13, 78, 36, 24, 0, 20, 0, 0, 97,
+  83, 24, 24, 5, 0, 0, 48, 50, 0, 0,
+  1, 78, 1, 0, 0, 0, 68, 0, 12, 0,
+  0, 28, 0, 3, 0, 0, 11, 19, 11, 36,
+  0, 0, 0, 29, 0, 18, 44, 0, 0, 0,
+  1, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  29, 0, 0, 0, 0, 0, 32, 72, 9, 90,
+  0, 112, 2, 20, 35, 0, 0, 53, 0, 31,
+  6, 61, 21, 24, 117, 0, 0, 0, 26, 0,
+  0, 0, 0, 100, 90, 0, 0, 0, 7, 0,
+  54, 21, 0, 21, 0, 0, 0, 15, 0, 0,
+  0, 0, 0, 21, 0, 0, 73, 0, 76, 10,
+  35, 0, 59, 1, 72, 42, 0, 0, 0, 22,
+  38, 13, 13, 6, 0, 7, 0, 21, 38, 13,
+  14, 0, 0, 64, 43, 11, 0, 0, 1, 54,
+  0, 38, 0, 39, 17, 0, 12, 19, 36, 29,
+  3, 0, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 0, 0, 70, 0, 0, 91, 0, 38, 0,
+  8, 0, 0, 4, 0, 0, 64, 10, 0, 0,
+  0, 114, 20, 0, 74, 27, 0, 45, 12, 51,
+  27, 0, 0, 0, 15, 101, 0, 21, 22, 36,
+  22, 0, 57, 0, 0, 0, 62, 0, 29, 0,
+  0, 72, 95, 0, 0, 0, 0, 80, 0, 16,
+  0, 0, 0, 13, 0, 0, 0, 0, 0, 0,
+  0, 33, 0, 3, 0, 0, 0, 0, 4, 22,
+  0, 49, 0, 0, 0, 0, 12, 0, 80, 43,
+  25, 0, 73, 2, 0, 149, 100, 43, 17, 0,
+  0, 0, 0, 25, 0, 0, 21, 90, 9, 0,
+  9, 0, 115, 13, 0, 0, 4, 73, 0, 0,
+  23, 0, 0, 26, 0, 80, 0, 54, 0, 37,
+  0, 15, 61, 0, 0, 23, 13, 7, 0, 32,
+  0, 0, 0, 0, 0, 0, 27, 12, 61, 0,
+  7, 0, 0, 98, 0, 66, 0, 13, 0, 0,
+  19, 3, 24, 48, 0, 47, 3, 23, 13, 19,
+  53, 124, 0, 32, 23, 0, 0, 0, 0, 90,
+  142, 0, 0, 0, 8, 0, 0, 33, 0, 34,
+  0, 47, 0, 22, 0, 0, 0, 0, 6, 0,
+  0, 0, 122, 0, 29, 0, 52, 16, 0, 27,
+  108, 0, 0, 0, 0, 0, 90, 42, 15, 0,
+  26, 53, 0, 84, 60, 35, 50, 0, 0, 15,
+  20, 31, 0, 0, 3, 111, 0, 0, 0, 0,
+  61, 0, 0, 0, 0, 79, 0, 0, 3, 0,
+  0, 0, 0, 28, 0, 0, 0, 35, 0, 82,
+  11, 0, 69, 0, 27, 18, 0, 0, 0, 0,
+  0, 0, 27, 0, 48, 0, 11, 70, 0, 0,
+  22, 90, 0, 69, 0, 68, 0, 0, 7, 0,
+  32, 92, 0, 47, 0, 58, 48, 0, 85, 34,
+  0, 0, 11, 0, 0, 0, 0, 133, 125, 0,
+  0, 0, 8, 0, 0, 61, 0, 16, 7, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  45, 0, 54, 0, 21, 46, 0, 0, 117, 0,
+  0, 75, 0, 0, 21, 0, 0, 1, 34, 80,
+  0, 0, 0, 31, 19, 0, 0, 94, 14, 24,
+  0, 0, 0, 29, 0, 0, 10, 39, 0, 0,
+  0, 0, 0, 56, 0, 0, 0, 0, 0, 7,
+  0, 0, 0, 0, 0, 0, 0, 155, 0, 0,
+  71, 0, 21, 0, 50, 0, 0, 5, 0, 0,
+  108, 0, 0, 0, 0, 98, 0, 0, 39, 7,
+  0, 0, 0, 22, 15, 0, 0, 0, 31, 74,
+  16, 3, 15, 30, 48, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 72, 30, 0, 0, 0,
+  0, 78, 0, 23, 0, 11, 40, 0, 0, 0,
+  17, 16, 68, 25, 10, 51, 0, 3, 0, 0,
+  33, 0, 0, 53, 0, 104, 16, 18, 0, 0,
+  0, 0, 47, 19, 0, 0, 6, 0, 7, 17,
+  36, 23, 0, 2, 0, 0, 72, 39, 0, 0,
+  14, 29, 0, 0, 0, 0, 40, 0, 36, 14,
+  0, 1, 11, 0, 0, 0, 22, 32, 0, 52,
+  25, 0, 0, 0, 0, 42, 40, 0, 22, 0,
+  44, 0, 3, 0, 0, 33, 0, 0, 52, 0,
+  0, 0, 0, 10, 106, 0, 39, 32, 46, 45,
+  0, 59, 28, 0, 21, 0, 1, 31, 0, 0,
+  5, 21, 26, 0, 31, 0, 0, 0, 5, 0,
+  0, 0, 0, 52, 28, 23, 1, 0, 7, 59,
+  48, 1, 0, 29, 0, 28, 0, 8, 0, 0,
+  0, 0, 0, 12, 0, 0, 0, 0, 49, 26,
+  5, 0, 107, 66, 16, 65, 30, 0, 0, 17,
+  71, 14, 28, 0, 85, 0, 0, 80, 60, 0,
+  13, 0, 0, 32, 32, 6, 0, 0, 0, 61,
+  0, 37, 19, 69, 10, 6, 18, 5, 0, 44,
+  103, 0, 0, 23, 0, 23, 18, 0, 0, 0,
+  0, 0, 0, 86, 0, 0, 83, 13, 32, 36,
+  9, 0, 0, 0, 0, 0, 15, 55, 0, 0,
+  11, 0, 91, 19, 43, 55, 0, 39, 28, 49,
+  0, 26, 0, 0, 19, 64, 28, 26, 14, 0,
+  86, 0, 32, 0, 0, 14, 0, 0, 66, 0,
+  5, 67, 43, 0, 9, 0, 0, 58, 0, 60,
+  9, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+  0, 15, 0, 4, 0, 18, 46, 15, 12, 30,
+  14, 0, 60, 29, 0, 164, 0, 0, 18, 0,
+  0, 0, 3, 20, 0, 48, 30, 38, 0, 0,
+  13, 76, 24, 1, 0, 0, 0, 35, 0, 48,
+  0, 88, 0, 0, 0, 20, 63, 58, 24, 0,
+  0, 0, 0, 0, 0, 11, 0, 0, 13, 0,
+  0, 83, 0, 0, 99, 0, 57, 0, 22, 0,
+  0, 57, 14, 0, 110, 0, 0, 29, 2, 76,
+  21, 14, 67, 27, 0, 44, 44, 26, 0, 0,
+  0, 0, 32, 108, 0, 10, 10, 0, 11, 0,
+  10, 13, 0, 0, 58, 0, 30, 0, 0, 71,
+  79, 0, 0, 0, 0, 18, 0, 26, 0, 0,
+  0, 0, 0, 0, 4, 4, 54, 0, 0, 35,
+  0, 18, 0, 0, 0, 17, 0, 23, 0, 111,
+  49, 4, 4, 0, 0, 13, 78, 36, 24, 0,
+  20, 0, 0, 97, 83, 24, 24, 5, 0, 0,
+  48, 50, 0, 0, 1, 78, 1, 0, 0, 0,
+  68, 0, 12, 0, 0, 28, 0, 3, 0, 0,
+  11, 19, 11, 36, 0, 0, 0, 29, 0, 18,
+  44, 0, 0, 0, 1, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 29, 0, 0, 0, 0, 0,
+  32, 72, 9, 90, 0, 112, 2, 20, 35, 0,
+  0, 53, 0, 31, 6, 61, 21, 24, 117, 0,
+  0, 0, 26, 0, 0, 0, 0, 100, 90, 0,
+  0, 0, 7, 0, 54, 21, 0, 21, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 21, 0, 0,
+  73, 0, 76, 10, 35, 0, 59, 1, 72, 42,
+  0, 0, 0, 22, 38, 13, 13, 6, 0, 7,
+  0, 21, 38, 13, 14, 0, 0, 64, 43, 11,
+  0, 0, 1, 54, 0, 38, 0, 39, 17, 0,
+  12, 19, 36, 29, 3, 0, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 0, 0, 70, 0, 0,
+  91, 0, 38, 0, 8, 0, 0, 4, 0, 0,
+  64, 10, 0, 0, 0, 114, 20, 0, 74, 27,
+  0, 45, 12, 51, 27, 0, 0, 0, 15, 101,
+  0, 21, 22, 36, 22, 0, 57, 0, 0, 0,
+  62, 0, 29, 0, 0, 72, 95, 0, 0, 0,
+  0, 80, 0, 16, 0, 0, 0, 13, 0, 0,
+  0, 0, 0, 0, 0, 33, 0, 3, 0, 0,
+  0, 0, 4, 22, 21, 0, 99, 34, 0, 157,
+  0, 0, 0, 0, 0, 17, 14, 49, 0, 0,
+  14, 40, 0, 1, 5, 82, 30, 0, 0, 0,
+  0, 0, 0, 147, 4, 78, 0, 24, 0, 23,
+  87, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 3, 42, 0, 0, 78, 0, 0, 59, 0,
+  56, 0, 27, 0, 0, 28, 13, 0, 118, 0,
+  0, 48, 0, 113, 0, 36, 68, 0, 0, 7,
+  28, 0, 17, 0, 0, 0, 10, 108, 35, 0,
+  27, 10, 7, 0, 0, 0, 13, 0, 52, 0,
+  0, 0, 0, 5, 41, 0, 0, 0, 0, 82,
+  0, 16, 0, 8, 18, 0, 0, 0, 39, 10,
+  84, 0, 0, 54, 5, 43, 0, 6, 0, 3,
+  0, 26, 0, 27, 108, 0, 0, 0, 0, 0,
+  90, 42, 15, 0, 26, 53, 0, 84, 60, 35,
+  50, 0, 0, 15, 20, 31, 0, 0, 3, 111,
+  0, 0, 0, 0, 61, 0, 0, 0, 0, 79,
+  0, 0, 3, 0, 0, 0, 0, 28, 0, 0,
+  0, 35, 0, 82, 11, 0, 69, 0, 27, 18,
+  0, 0, 0, 0, 0, 0, 27, 0, 48, 0,
+  11, 70, 0, 0, 22, 90, 0, 69, 0, 68,
+  0, 0, 7, 0, 32, 92, 0, 47, 0, 58,
+  48, 0, 85, 34, 0, 0, 11, 0, 0, 0,
+  0, 133, 125, 0, 0, 0, 8, 0, 0, 61,
+  0, 16, 7, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 45, 0, 54, 0, 21, 46,
+  0, 0, 117, 0, 0, 75, 0, 0, 21, 0,
+  0, 1, 34, 80, 0, 0, 0, 31, 19, 0,
+  0, 94, 14, 24, 0, 0, 0, 29, 0, 0,
+  10, 39, 0, 0, 0, 0, 0, 56, 0, 0,
+  0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+  0, 155, 0, 0, 71, 0, 21, 0, 50, 0,
+  0, 5, 0, 0, 108, 0, 0, 0, 0, 98,
+  0, 0, 39, 7, 0, 0, 0, 22, 15, 0,
+  0, 0, 31, 74, 16, 3, 15, 30, 48, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 72,
+  30, 0, 0, 0, 0, 78, 0, 23, 0, 11,
+  40, 0, 0, 0, 17, 16, 68, 25, 10, 51,
+  0, 3, 0, 0, 33, 0, 0, 53, 0, 0,
+  59, 0, 5, 69, 0, 0, 0, 0, 0, 19,
+  45, 76, 0, 0, 0, 17, 2, 8, 10, 22,
+  0, 35, 0, 0, 0, 0, 0, 77, 41, 11,
+  0, 18, 0, 0, 0, 17, 0, 13, 0, 0,
+  0, 39, 0, 0, 0, 0, 0, 0, 0, 110,
+  0, 0, 0, 0, 15, 4, 28, 0, 0, 0,
+  0, 0, 48, 0, 0, 6, 0, 9, 0, 40,
+  17, 0, 0, 0, 0, 0, 53, 0, 0, 17,
+  0, 52, 45, 0, 40, 9, 68, 0, 0, 0,
+  56, 0, 0, 5, 0, 0, 0, 21, 0, 0,
+  0, 0, 1, 53, 0, 16, 7, 45, 50, 0,
+  0, 13, 38, 10, 68, 48, 19, 52, 56, 0,
+  0, 0, 26, 9, 0, 10, 107, 66, 16, 65,
+  30, 0, 0, 17, 71, 14, 28, 0, 85, 0,
+  0, 80, 60, 0, 13, 0, 0, 32, 32, 6,
+  0, 0, 0, 61, 0, 37, 19, 69, 10, 6,
+  18, 5, 0, 44, 103, 0, 0, 23, 0, 23,
+  18, 0, 0, 0, 0, 0, 0, 86, 0, 0,
+  83, 13, 32, 36, 9, 0, 0, 0, 0, 0,
+  15, 55, 0, 0, 11, 0, 91, 19, 43, 55,
+  0, 39, 28, 49, 0, 26, 0, 0, 19, 64,
+  28, 26, 14, 0, 86, 0, 32, 0, 0, 14,
+  0, 0, 66, 0, 5, 67, 43, 0, 9, 0,
+  0, 58, 0, 60, 9, 0, 6, 0, 0, 0,
+  0, 0, 0, 0, 0, 15, 0, 4, 0, 18,
+  46, 15, 12, 30, 14, 0, 60, 29, 0, 164,
+  0, 0, 18, 0, 0, 0, 3, 20, 0, 48,
+  30, 38, 0, 0, 13, 76, 24, 1, 0, 0,
+  0, 35, 0, 48, 0, 88, 0, 0, 0, 20,
+  63, 58, 24, 0, 0, 0, 0, 0, 0, 11,
+  0, 0, 13, 0, 0, 83, 0, 0, 99, 0,
+  57, 0, 22, 0, 0, 57, 14, 0, 110, 0,
+  0, 29, 2, 76, 21, 14, 67, 27, 0, 44,
+  44, 26, 0, 0, 0, 0, 32, 108, 0, 10,
+  10, 0, 11, 0, 10, 13, 0, 0, 58, 0,
+  30, 0, 0, 71, 79, 0, 0, 0, 0, 18,
+  0, 26, 0, 0, 0, 0, 0, 0, 4, 4,
+  54, 0, 0, 35, 0, 18, 0, 0, 0, 17,
+  0, 23, 0, 0, 70, 0, 4, 150, 0, 0,
+  0, 0, 0, 1, 23, 94, 0, 0, 0, 44,
+  0, 0, 21, 54, 0, 39, 0, 0, 0, 0,
+  0, 45, 16, 26, 0, 7, 0, 0, 0, 50,
+  0, 0, 0, 11, 0, 27, 0, 8, 1, 0,
+  0, 0, 12, 123, 0, 0, 39, 0, 39, 0,
+  42, 0, 0, 32, 0, 0, 97, 0, 0, 31,
+  0, 64, 0, 26, 51, 0, 0, 17, 0, 0,
+  0, 0, 0, 0, 27, 70, 21, 0, 16, 15,
+  54, 0, 0, 0, 24, 0, 2, 0, 0, 0,
+  0, 60, 12, 0, 0, 0, 0, 79, 0, 14,
+  0, 5, 25, 0, 0, 14, 51, 41, 105, 41,
+  29, 52, 23, 0, 0, 0, 17, 23, 0, 13,
+  59, 1, 72, 42, 0, 0, 0, 22, 38, 13,
+  13, 6, 0, 7, 0, 21, 38, 13, 14, 0,
+  0, 64, 43, 11, 0, 0, 1, 54, 0, 38,
+  0, 39, 17, 0, 12, 19, 36, 29, 3, 0,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 0,
+  0, 70, 0, 0, 91, 0, 38, 0, 8, 0,
+  0, 4, 0, 0, 64, 10, 0, 0, 0, 114,
+  20, 0, 74, 27, 0, 45, 12, 51, 27, 0,
+  0, 0, 15, 101, 0, 21, 22, 36, 22, 0,
+  57, 0, 0, 0, 62, 0, 29, 0, 0, 72,
+  95, 0, 0, 0, 0, 80, 0, 16, 0, 0,
+  0, 13, 0, 0, 0, 0, 0, 0, 0, 33,
+  0, 3, 0, 0, 0, 0, 4, 22, 21, 0,
+  99, 34, 0, 157, 0, 0, 0, 0, 0, 17,
+  14, 49, 0, 0, 14, 40, 0, 1, 5, 82,
+  30, 0, 0, 0, 0, 0, 0, 147, 4, 78,
+  0, 24, 0, 23, 87, 19, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 3, 42, 0, 0, 78,
+  0, 0, 59, 0, 56, 0, 27, 0, 0, 28,
+  13, 0, 118, 0, 0, 48, 0, 113, 0, 36,
+  68, 0, 0, 7, 28, 0, 17, 0, 0, 0,
+  10, 108, 35, 0, 27, 10, 7, 0, 0, 0,
+  13, 0, 52, 0, 0, 0, 0, 5, 41, 0,
+  0, 0, 0, 82, 0, 16, 0, 8, 18, 0,
+  0, 0, 39, 10, 84, 0, 0, 54, 5, 43,
+  0, 6, 0, 3, 0, 26, 0, 9, 38, 0,
+  15, 120, 0, 0, 0, 0, 0, 3, 58, 72,
+  0, 0, 0, 18, 0, 18, 44, 0, 0, 51,
+  0, 3, 0, 0, 0, 91, 41, 0, 0, 22,
+  0, 0, 0, 22, 0, 25, 0, 45, 0, 53,
+  1, 0, 0, 32, 0, 0, 0, 70, 11, 0,
+  0, 0, 19, 0, 13, 14, 0, 9, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 58, 10, 0,
+  0, 20, 0, 0, 2, 19, 0, 27, 10, 28,
+  51, 0, 32, 5, 54, 4, 0, 0, 52, 5,
+  0, 37, 0, 0, 0, 30, 0, 0, 0, 0,
+  3, 4, 0, 16, 10, 25, 57, 0, 0, 17,
+  37, 0, 63, 43, 24, 47, 55, 1, 2, 0,
+  25, 2, 0, 0, 0, 0, 117, 0, 0, 75,
+  0, 0, 21, 0, 0, 1, 34, 80, 0, 0,
+  0, 31, 19, 0, 0, 94, 14, 24, 0, 0,
+  0, 29, 0, 0, 10, 39, 0, 0, 0, 0,
+  0, 56, 0, 0, 0, 0, 0, 7, 0, 0,
+  0, 0, 0, 0, 0, 155, 0, 0, 71, 0,
+  21, 0, 50, 0, 0, 5, 0, 0, 108, 0,
+  0, 0, 0, 98, 0, 0, 39, 7, 0, 0,
+  0, 22, 15, 0, 0, 0, 31, 74, 16, 3,
+  15, 30, 48, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 72, 30, 0, 0, 0, 0, 78,
+  0, 23, 0, 11, 40, 0, 0, 0, 17, 16,
+  68, 25, 10, 51, 0, 3, 0, 0, 33, 0,
+  0, 53, 0, 0, 59, 0, 5, 69, 0, 0,
+  0, 0, 0, 19, 45, 76, 0, 0, 0, 17,
+  2, 8, 10, 22, 0, 35, 0, 0, 0, 0,
+  0, 77, 41, 11, 0, 18, 0, 0, 0, 17,
+  0, 13, 0, 0, 0, 39, 0, 0, 0, 0,
+  0, 0, 0, 110, 0, 0, 0, 0, 15, 4,
+  28, 0, 0, 0, 0, 0, 48, 0, 0, 6,
+  0, 9, 0, 40, 17, 0, 0, 0, 0, 0,
+  53, 0, 0, 17, 0, 52, 45, 0, 40, 9,
+  68, 0, 0, 0, 56, 0, 0, 5, 0, 0,
+  0, 21, 0, 0, 0, 0, 1, 53, 0, 16,
+  7, 45, 50, 0, 0, 13, 38, 10, 68, 48,
+  19, 52, 56, 0, 0, 0, 26, 9, 0, 10,
+  0, 52, 52, 0, 44, 0, 21, 0, 7, 0,
+  0, 3, 68, 73, 3, 33, 10, 1, 18, 0,
+  44, 0, 0, 50, 14, 42, 0, 0, 0, 12,
+  60, 0, 0, 39, 0, 0, 0, 7, 0, 62,
+  39, 63, 0, 87, 51, 0, 0, 0, 0, 0,
+  0, 78, 42, 0, 0, 0, 18, 20, 19, 14,
+  11, 0, 3, 81, 0, 28, 0, 0, 0, 0,
+  0, 30, 0, 13, 8, 1, 0, 0, 0, 18,
+  37, 38, 21, 0, 88, 0, 16, 0, 65, 54,
+  0, 0, 46, 25, 0, 61, 0, 19, 5, 30,
+  0, 0, 0, 0, 0, 0, 0, 15, 38, 43,
+  88, 0, 0, 20, 22, 0, 0, 24, 58, 18,
+  39, 4, 45, 0, 79, 0, 1, 0, 14, 0,
+  60, 29, 0, 164, 0, 0, 18, 0, 0, 0,
+  3, 20, 0, 48, 30, 38, 0, 0, 13, 76,
+  24, 1, 0, 0, 0, 35, 0, 48, 0, 88,
+  0, 0, 0, 20, 63, 58, 24, 0, 0, 0,
+  0, 0, 0, 11, 0, 0, 13, 0, 0, 83,
+  0, 0, 99, 0, 57, 0, 22, 0, 0, 57,
+  14, 0, 110, 0, 0, 29, 2, 76, 21, 14,
+  67, 27, 0, 44, 44, 26, 0, 0, 0, 0,
+  32, 108, 0, 10, 10, 0, 11, 0, 10, 13,
+  0, 0, 58, 0, 30, 0, 0, 71, 79, 0,
+  0, 0, 0, 18, 0, 26, 0, 0, 0, 0,
+  0, 0, 4, 4, 54, 0, 0, 35, 0, 18,
+  0, 0, 0, 17, 0, 23, 0, 0, 70, 0,
+  4, 150, 0, 0, 0, 0, 0, 1, 23, 94,
+  0, 0, 0, 44, 0, 0, 21, 54, 0, 39,
+  0, 0, 0, 0, 0, 45, 16, 26, 0, 7,
+  0, 0, 0, 50, 0, 0, 0, 11, 0, 27,
+  0, 8, 1, 0, 0, 0, 12, 123, 0, 0,
+  39, 0, 39, 0, 42, 0, 0, 32, 0, 0,
+  97, 0, 0, 31, 0, 64, 0, 26, 51, 0,
+  0, 17, 0, 0, 0, 0, 0, 0, 27, 70,
+  21, 0, 16, 15, 54, 0, 0, 0, 24, 0,
+  2, 0, 0, 0, 0, 60, 12, 0, 0, 0,
+  0, 79, 0, 14, 0, 5, 25, 0, 0, 14,
+  51, 41, 105, 41, 29, 52, 23, 0, 0, 0,
+  17, 23, 0, 13, 0, 43, 48, 0, 24, 32,
+  13, 0, 8, 0, 0, 0, 63, 49, 0, 0,
+  3, 17, 8, 10, 0, 0, 0, 37, 41, 35,
+  6, 0, 0, 48, 48, 0, 0, 14, 0, 0,
+  0, 2, 0, 39, 0, 40, 0, 41, 21, 0,
+  3, 0, 0, 0, 0, 40, 61, 0, 0, 0,
+  14, 6, 2, 35, 0, 6, 0, 21, 0, 0,
+  0, 27, 0, 0, 0, 32, 20, 0, 21, 28,
+  0, 0, 0, 25, 16, 25, 21, 40, 63, 0,
+  39, 18, 50, 13, 0, 0, 32, 28, 0, 22,
+  0, 38, 15, 31, 0, 0, 0, 0, 0, 28,
+  14, 0, 53, 57, 40, 0, 0, 20, 46, 0,
+  33, 38, 62, 29, 61, 16, 47, 0, 46, 37,
+  0, 1, 21, 0, 99, 34, 0, 157, 0, 0,
+  0, 0, 0, 17, 14, 49, 0, 0, 14, 40,
+  0, 1, 5, 82, 30, 0, 0, 0, 0, 0,
+  0, 147, 4, 78, 0, 24, 0, 23, 87, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+  42, 0, 0, 78, 0, 0, 59, 0, 56, 0,
+  27, 0, 0, 28, 13, 0, 118, 0, 0, 48,
+  0, 113, 0, 36, 68, 0, 0, 7, 28, 0,
+  17, 0, 0, 0, 10, 108, 35, 0, 27, 10,
+  7, 0, 0, 0, 13, 0, 52, 0, 0, 0,
+  0, 5, 41, 0, 0, 0, 0, 82, 0, 16,
+  0, 8, 18, 0, 0, 0, 39, 10, 84, 0,
+  0, 54, 5, 43, 0, 6, 0, 3, 0, 26,
+  0, 9, 38, 0, 15, 120, 0, 0, 0, 0,
+  0, 3, 58, 72, 0, 0, 0, 18, 0, 18,
+  44, 0, 0, 51, 0, 3, 0, 0, 0, 91,
+  41, 0, 0, 22, 0, 0, 0, 22, 0, 25,
+  0, 45, 0, 53, 1, 0, 0, 32, 0, 0,
+  0, 70, 11, 0, 0, 0, 19, 0, 13, 14,
+  0, 9, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 58, 10, 0, 0, 20, 0, 0, 2, 19,
+  0, 27, 10, 28, 51, 0, 32, 5, 54, 4,
+  0, 0, 52, 5, 0, 37, 0, 0, 0, 30,
+  0, 0, 0, 0, 3, 4, 0, 16, 10, 25,
+  57, 0, 0, 17, 37, 0, 63, 43, 24, 47,
+  55, 1, 2, 0, 25, 2, 0, 0, 0, 70,
+  65, 0, 63, 0, 15, 0, 1, 0, 14, 0,
+  64, 75, 0, 51, 17, 7, 26, 16, 9, 0,
+  0, 47, 38, 59, 0, 0, 0, 0, 53, 0,
+  0, 37, 12, 0, 0, 0, 0, 53, 50, 43,
+  24, 71, 73, 0, 0, 0, 0, 0, 0, 26,
+  50, 0, 0, 0, 0, 20, 1, 27, 24, 0,
+  0, 63, 0, 2, 29, 0, 0, 0, 0, 0,
+  7, 41, 16, 12, 0, 17, 0, 23, 46, 34,
+  33, 22, 87, 14, 32, 4, 49, 40, 0, 20,
+  24, 31, 0, 54, 0, 35, 3, 41, 0, 0,
+  0, 0, 0, 0, 7, 10, 34, 32, 82, 0,
+  0, 13, 31, 0, 0, 29, 54, 8, 7, 0,
+  55, 0, 75, 11, 2, 0, 0, 0, 59, 0,
+  5, 69, 0, 0, 0, 0, 0, 19, 45, 76,
+  0, 0, 0, 17, 2, 8, 10, 22, 0, 35,
+  0, 0, 0, 0, 0, 77, 41, 11, 0, 18,
+  0, 0, 0, 17, 0, 13, 0, 0, 0, 39,
+  0, 0, 0, 0, 0, 0, 0, 110, 0, 0,
+  0, 0, 15, 4, 28, 0, 0, 0, 0, 0,
+  48, 0, 0, 6, 0, 9, 0, 40, 17, 0,
+  0, 0, 0, 0, 53, 0, 0, 17, 0, 52,
+  45, 0, 40, 9, 68, 0, 0, 0, 56, 0,
+  0, 5, 0, 0, 0, 21, 0, 0, 0, 0,
+  1, 53, 0, 16, 7, 45, 50, 0, 0, 13,
+  38, 10, 68, 48, 19, 52, 56, 0, 0, 0,
+  26, 9, 0, 10, 0, 52, 52, 0, 44, 0,
+  21, 0, 7, 0, 0, 3, 68, 73, 3, 33,
+  10, 1, 18, 0, 44, 0, 0, 50, 14, 42,
+  0, 0, 0, 12, 60, 0, 0, 39, 0, 0,
+  0, 7, 0, 62, 39, 63, 0, 87, 51, 0,
+  0, 0, 0, 0, 0, 78, 42, 0, 0, 0,
+  18, 20, 19, 14, 11, 0, 3, 81, 0, 28,
+  0, 0, 0, 0, 0, 30, 0, 13, 8, 1,
+  0, 0, 0, 18, 37, 38, 21, 0, 88, 0,
+  16, 0, 65, 54, 0, 0, 46, 25, 0, 61,
+  0, 19, 5, 30, 0, 0, 0, 0, 0, 0,
+  0, 15, 38, 43, 88, 0, 0, 20, 22, 0,
+  0, 24, 58, 18, 39, 4, 45, 0, 79, 0,
+  1, 0, 0, 16, 100, 0, 22, 0, 0, 0,
+  0, 0, 0, 11, 22, 94, 0, 49, 0, 51,
+  31, 35, 50, 27, 110, 9, 0, 0, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 94, 0, 0, 96, 51, 18, 0, 0,
+  0, 0, 0, 79, 0, 0, 15, 0, 24, 0,
+  24, 0, 7, 8, 19, 6, 56, 0, 0, 10,
+  0, 51, 0, 0, 21, 34, 0, 0, 0, 16,
+  0, 0, 24, 0, 36, 0, 41, 12, 2, 0,
+  43, 21, 0, 36, 0, 0, 5, 39, 0, 0,
+  0, 27, 23, 0, 0, 0, 0, 0, 0, 11,
+  0, 6, 79, 9, 0, 5, 40, 0, 52, 15,
+  28, 31, 21, 0, 0, 0, 55, 12, 0, 0,
+  0, 0, 70, 0, 4, 150, 0, 0, 0, 0,
+  0, 1, 23, 94, 0, 0, 0, 44, 0, 0,
+  21, 54, 0, 39, 0, 0, 0, 0, 0, 45,
+  16, 26, 0, 7, 0, 0, 0, 50, 0, 0,
+  0, 11, 0, 27, 0, 8, 1, 0, 0, 0,
+  12, 123, 0, 0, 39, 0, 39, 0, 42, 0,
+  0, 32, 0, 0, 97, 0, 0, 31, 0, 64,
+  0, 26, 51, 0, 0, 17, 0, 0, 0, 0,
+  0, 0, 27, 70, 21, 0, 16, 15, 54, 0,
+  0, 0, 24, 0, 2, 0, 0, 0, 0, 60,
+  12, 0, 0, 0, 0, 79, 0, 14, 0, 5,
+  25, 0, 0, 14, 51, 41, 105, 41, 29, 52,
+  23, 0, 0, 0, 17, 23, 0, 13, 0, 43,
+  48, 0, 24, 32, 13, 0, 8, 0, 0, 0,
+  63, 49, 0, 0, 3, 17, 8, 10, 0, 0,
+  0, 37, 41, 35, 6, 0, 0, 48, 48, 0,
+  0, 14, 0, 0, 0, 2, 0, 39, 0, 40,
+  0, 41, 21, 0, 3, 0, 0, 0, 0, 40,
+  61, 0, 0, 0, 14, 6, 2, 35, 0, 6,
+  0, 21, 0, 0, 0, 27, 0, 0, 0, 32,
+  20, 0, 21, 28, 0, 0, 0, 25, 16, 25,
+  21, 40, 63, 0, 39, 18, 50, 13, 0, 0,
+  32, 28, 0, 22, 0, 38, 15, 31, 0, 0,
+  0, 0, 0, 28, 14, 0, 53, 57, 40, 0,
+  0, 20, 46, 0, 33, 38, 62, 29, 61, 16,
+  47, 0, 46, 37, 0, 1, 0, 41, 74, 0,
+  7, 0, 37, 0, 26, 0, 0, 0, 8, 45,
+  0, 15, 14, 0, 13, 0, 0, 0, 20, 55,
+  23, 53, 16, 0, 159, 1, 19, 0, 8, 19,
+  20, 0, 0, 0, 0, 81, 7, 52, 28, 35,
+  49, 21, 9, 3, 0, 0, 0, 24, 50, 0,
+  0, 0, 1, 33, 4, 24, 7, 14, 0, 0,
+  0, 27, 51, 0, 10, 0, 0, 31, 38, 26,
+  32, 14, 0, 0, 0, 32, 48, 29, 26, 13,
+  31, 0, 3, 25, 74, 17, 4, 0, 45, 17,
+  0, 32, 0, 0, 21, 15, 0, 0, 0, 0,
+  6, 22, 50, 8, 38, 32, 47, 0, 0, 0,
+  1, 0, 13, 0, 30, 2, 0, 0, 24, 0,
+  46, 24, 32, 0, 0, 9, 38, 0, 15, 120,
+  0, 0, 0, 0, 0, 3, 58, 72, 0, 0,
+  0, 18, 0, 18, 44, 0, 0, 51, 0, 3,
+  0, 0, 0, 91, 41, 0, 0, 22, 0, 0,
+  0, 22, 0, 25, 0, 45, 0, 53, 1, 0,
+  0, 32, 0, 0, 0, 70, 11, 0, 0, 0,
+  19, 0, 13, 14, 0, 9, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 58, 10, 0, 0, 20,
+  0, 0, 2, 19, 0, 27, 10, 28, 51, 0,
+  32, 5, 54, 4, 0, 0, 52, 5, 0, 37,
+  0, 0, 0, 30, 0, 0, 0, 0, 3, 4,
+  0, 16, 10, 25, 57, 0, 0, 17, 37, 0,
+  63, 43, 24, 47, 55, 1, 2, 0, 25, 2,
+  0, 0, 0, 70, 65, 0, 63, 0, 15, 0,
+  1, 0, 14, 0, 64, 75, 0, 51, 17, 7,
+  26, 16, 9, 0, 0, 47, 38, 59, 0, 0,
+  0, 0, 53, 0, 0, 37, 12, 0, 0, 0,
+  0, 53, 50, 43, 24, 71, 73, 0, 0, 0,
+  0, 0, 0, 26, 50, 0, 0, 0, 0, 20,
+  1, 27, 24, 0, 0, 63, 0, 2, 29, 0,
+  0, 0, 0, 0, 7, 41, 16, 12, 0, 17,
+  0, 23, 46, 34, 33, 22, 87, 14, 32, 4,
+  49, 40, 0, 20, 24, 31, 0, 54, 0, 35,
+  3, 41, 0, 0, 0, 0, 0, 0, 7, 10,
+  34, 32, 82, 0, 0, 13, 31, 0, 0, 29,
+  54, 8, 7, 0, 55, 0, 75, 11, 2, 0,
+  0, 0, 119, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 103, 0, 9, 0, 6, 10, 5,
+  9, 50, 108, 24, 0, 0, 0, 8, 184, 0,
+  22, 0, 0, 31, 0, 0, 11, 12, 0, 10,
+  106, 0, 19, 21, 57, 33, 0, 2, 16, 0,
+  0, 65, 0, 0, 30, 0, 14, 26, 31, 0,
+  30, 40, 20, 0, 16, 5, 36, 0, 0, 70,
+  0, 0, 38, 61, 0, 0, 13, 0, 0, 0,
+  25, 10, 0, 19, 7, 11, 0, 47, 49, 0,
+  0, 54, 39, 0, 33, 24, 0, 0, 0, 22,
+  19, 7, 17, 0, 40, 27, 0, 5, 0, 0,
+  50, 3, 0, 0, 37, 20, 52, 0, 0, 30,
+  0, 0, 0, 0, 2, 25, 2, 0, 0, 52,
+  52, 0, 44, 0, 21, 0, 7, 0, 0, 3,
+  68, 73, 3, 33, 10, 1, 18, 0, 44, 0,
+  0, 50, 14, 42, 0, 0, 0, 12, 60, 0,
+  0, 39, 0, 0, 0, 7, 0, 62, 39, 63,
+  0, 87, 51, 0, 0, 0, 0, 0, 0, 78,
+  42, 0, 0, 0, 18, 20, 19, 14, 11, 0,
+  3, 81, 0, 28, 0, 0, 0, 0, 0, 30,
+  0, 13, 8, 1, 0, 0, 0, 18, 37, 38,
+  21, 0, 88, 0, 16, 0, 65, 54, 0, 0,
+  46, 25, 0, 61, 0, 19, 5, 30, 0, 0,
+  0, 0, 0, 0, 0, 15, 38, 43, 88, 0,
+  0, 20, 22, 0, 0, 24, 58, 18, 39, 4,
+  45, 0, 79, 0, 1, 0, 0, 16, 100, 0,
+  22, 0, 0, 0, 0, 0, 0, 11, 22, 94,
+  0, 49, 0, 51, 31, 35, 50, 27, 110, 9,
+  0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 94, 0, 0, 96,
+  51, 18, 0, 0, 0, 0, 0, 79, 0, 0,
+  15, 0, 24, 0, 24, 0, 7, 8, 19, 6,
+  56, 0, 0, 10, 0, 51, 0, 0, 21, 34,
+  0, 0, 0, 16, 0, 0, 24, 0, 36, 0,
+  41, 12, 2, 0, 43, 21, 0, 36, 0, 0,
+  5, 39, 0, 0, 0, 27, 23, 0, 0, 0,
+  0, 0, 0, 11, 0, 6, 79, 9, 0, 5,
+  40, 0, 52, 15, 28, 31, 21, 0, 0, 0,
+  55, 12, 0, 0, 20, 0, 91, 19, 0, 0,
+  0, 12, 20, 0, 0, 0, 0, 125, 0, 0,
+  0, 22, 28, 1, 36, 70, 81, 11, 0, 0,
+  7, 35, 205, 0, 23, 21, 0, 15, 0, 0,
+  0, 31, 0, 0, 65, 0, 0, 38, 53, 70,
+  0, 0, 0, 0, 0, 120, 0, 6, 74, 0,
+  21, 12, 39, 0, 24, 17, 49, 0, 50, 0,
+  10, 0, 0, 102, 0, 0, 27, 14, 0, 0,
+  25, 0, 0, 0, 12, 2, 2, 20, 0, 0,
+  0, 33, 96, 33, 0, 2, 0, 0, 53, 20,
+  39, 0, 2, 26, 35, 12, 15, 0, 81, 19,
+  3, 30, 19, 0, 74, 0, 14, 0, 19, 31,
+  105, 0, 0, 54, 0, 0, 0, 0, 40, 22,
+  0, 17, 0, 43, 48, 0, 24, 32, 13, 0,
+  8, 0, 0, 0, 63, 49, 0, 0, 3, 17,
+  8, 10, 0, 0, 0, 37, 41, 35, 6, 0,
+  0, 48, 48, 0, 0, 14, 0, 0, 0, 2,
+  0, 39, 0, 40, 0, 41, 21, 0, 3, 0,
+  0, 0, 0, 40, 61, 0, 0, 0, 14, 6,
+  2, 35, 0, 6, 0, 21, 0, 0, 0, 27,
+  0, 0, 0, 32, 20, 0, 21, 28, 0, 0,
+  0, 25, 16, 25, 21, 40, 63, 0, 39, 18,
+  50, 13, 0, 0, 32, 28, 0, 22, 0, 38,
+  15, 31, 0, 0, 0, 0, 0, 28, 14, 0,
+  53, 57, 40, 0, 0, 20, 46, 0, 33, 38,
+  62, 29, 61, 16, 47, 0, 46, 37, 0, 1,
+  0, 41, 74, 0, 7, 0, 37, 0, 26, 0,
+  0, 0, 8, 45, 0, 15, 14, 0, 13, 0,
+  0, 0, 20, 55, 23, 53, 16, 0, 159, 1,
+  19, 0, 8, 19, 20, 0, 0, 0, 0, 81,
+  7, 52, 28, 35, 49, 21, 9, 3, 0, 0,
+  0, 24, 50, 0, 0, 0, 1, 33, 4, 24,
+  7, 14, 0, 0, 0, 27, 51, 0, 10, 0,
+  0, 31, 38, 26, 32, 14, 0, 0, 0, 32,
+  48, 29, 26, 13, 31, 0, 3, 25, 74, 17,
+  4, 0, 45, 17, 0, 32, 0, 0, 21, 15,
+  0, 0, 0, 0, 6, 22, 50, 8, 38, 32,
+  47, 0, 0, 0, 1, 0, 13, 0, 30, 2,
+  0, 0, 24, 0, 46, 24, 32, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 70, 65, 0,
+  63, 0, 15, 0, 1, 0, 14, 0, 64, 75,
+  0, 51, 17, 7, 26, 16, 9, 0, 0, 47,
+  38, 59, 0, 0, 0, 0, 53, 0, 0, 37,
+  12, 0, 0, 0, 0, 53, 50, 43, 24, 71,
+  73, 0, 0, 0, 0, 0, 0, 26, 50, 0,
+  0, 0, 0, 20, 1, 27, 24, 0, 0, 63,
+  0, 2, 29, 0, 0, 0, 0, 0, 7, 41,
+  16, 12, 0, 17, 0, 23, 46, 34, 33, 22,
+  87, 14, 32, 4, 49, 40, 0, 20, 24, 31,
+  0, 54, 0, 35, 3, 41, 0, 0, 0, 0,
+  0, 0, 7, 10, 34, 32, 82, 0, 0, 13,
+  31, 0, 0, 29, 54, 8, 7, 0, 55, 0,
+  75, 11, 2, 0, 0, 0, 119, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 103, 0, 9,
+  0, 6, 10, 5, 9, 50, 108, 24, 0, 0,
+  0, 8, 184, 0, 22, 0, 0, 31, 0, 0,
+  11, 12, 0, 10, 106, 0, 19, 21, 57, 33,
+  0, 2, 16, 0, 0, 65, 0, 0, 30, 0,
+  14, 26, 31, 0, 30, 40, 20, 0, 16, 5,
+  36, 0, 0, 70, 0, 0, 38, 61, 0, 0,
+  13, 0, 0, 0, 25, 10, 0, 19, 7, 11,
+  0, 47, 49, 0, 0, 54, 39, 0, 33, 24,
+  0, 0, 0, 22, 19, 7, 17, 0, 40, 27,
+  0, 5, 0, 0, 50, 3, 0, 0, 37, 20,
+  52, 0, 0, 30, 0, 0, 0, 0, 2, 25,
+  2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 16, 100, 0, 22, 0, 0, 0, 0, 0,
+  0, 11, 22, 94, 0, 49, 0, 51, 31, 35,
+  50, 27, 110, 9, 0, 0, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  94, 0, 0, 96, 51, 18, 0, 0, 0, 0,
+  0, 79, 0, 0, 15, 0, 24, 0, 24, 0,
+  7, 8, 19, 6, 56, 0, 0, 10, 0, 51,
+  0, 0, 21, 34, 0, 0, 0, 16, 0, 0,
+  24, 0, 36, 0, 41, 12, 2, 0, 43, 21,
+  0, 36, 0, 0, 5, 39, 0, 0, 0, 27,
+  23, 0, 0, 0, 0, 0, 0, 11, 0, 6,
+  79, 9, 0, 5, 40, 0, 52, 15, 28, 31,
+  21, 0, 0, 0, 55, 12, 0, 0, 20, 0,
+  91, 19, 0, 0, 0, 12, 20, 0, 0, 0,
+  0, 125, 0, 0, 0, 22, 28, 1, 36, 70,
+  81, 11, 0, 0, 7, 35, 205, 0, 23, 21,
+  0, 15, 0, 0, 0, 31, 0, 0, 65, 0,
+  0, 38, 53, 70, 0, 0, 0, 0, 0, 120,
+  0, 6, 74, 0, 21, 12, 39, 0, 24, 17,
+  49, 0, 50, 0, 10, 0, 0, 102, 0, 0,
+  27, 14, 0, 0, 25, 0, 0, 0, 12, 2,
+  2, 20, 0, 0, 0, 33, 96, 33, 0, 2,
+  0, 0, 53, 20, 39, 0, 2, 26, 35, 12,
+  15, 0, 81, 19, 3, 30, 19, 0, 74, 0,
+  14, 0, 19, 31, 105, 0, 0, 54, 0, 0,
+  0, 0, 40, 22, 0, 17, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 23, 32, 93, 27, 1, 9, 26, 5,
+  18, 0, 0, 0, 0, 103, 0, 30, 67, 4,
+  0, 16, 13, 75, 10, 41, 20, 0, 6, 20,
+  201, 42, 3, 62, 71, 0, 24, 0, 0, 56,
+  0, 4, 5, 32, 0, 22, 9, 88, 48, 0,
+  0, 0, 0, 51, 21, 3, 55, 0, 44, 0,
+  32, 0, 31, 72, 0, 0, 0, 0, 48, 9,
+  120, 30, 0, 10, 58, 0, 32, 0, 53, 0,
+  0, 37, 0, 0, 36, 11, 0, 15, 0, 0,
+  58, 5, 0, 0, 0, 3, 0, 36, 0, 0,
+  40, 101, 17, 0, 0, 52, 55, 89, 20, 0,
+  9, 0, 2, 9, 0, 33, 6, 2, 40, 0,
+  19, 12, 51, 0, 0, 0, 3, 0, 39, 30,
+  0, 67, 0, 11, 0, 33, 2, 0, 0, 0,
+  0, 17, 28, 49, 0, 0, 52, 3, 0, 0,
+  28, 58, 0, 42, 19, 0, 0, 8, 0, 9,
+  0, 26, 82, 21, 0, 0, 0, 27, 0, 8,
+  0, 40, 0, 22, 24, 91, 9, 110, 0, 0,
+  0, 27, 50, 0, 37, 0, 28, 0, 14, 0,
+  55, 50, 0, 43, 0, 0, 49, 11, 81, 0,
+  4, 0, 22, 7, 42, 0, 12, 0, 0, 26,
+  21, 0, 21, 24, 0, 0, 0, 0, 0, 9,
+  0, 0, 0, 9, 0, 20, 0, 0, 47, 83,
+  0, 52, 17, 21, 41, 51, 25, 0, 40, 5,
+  0, 40, 0, 11, 0, 0, 21, 0, 13, 13,
+  31, 0, 15, 0, 35, 1, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 13, 24, 67, 6,
+  0, 18, 27, 22, 0, 0, 0, 0, 0, 97,
+  0, 0, 60, 4, 0, 5, 27, 86, 27, 52,
+  0, 0, 8, 9, 193, 55, 1, 28, 52, 0,
+  59, 1, 0, 58, 0, 17, 14, 39, 0, 14,
+  26, 83, 17, 0, 2, 0, 0, 64, 30, 0,
+  71, 0, 60, 0, 49, 0, 15, 71, 0, 0,
+  0, 0, 7, 6, 77, 33, 0, 22, 82, 11,
+  31, 27, 25, 0, 20, 13, 0, 0, 15, 5,
+  0, 0, 0, 0, 62, 3, 0, 0, 23, 0,
+  15, 37, 0, 0, 49, 67, 15, 0, 0, 37,
+  46, 75, 26, 0, 0, 6, 1, 16, 0, 37,
+  12, 0, 55, 0, 9, 28, 40, 0, 0, 0,
+  4, 0, 26, 26, 0, 60, 0, 15, 0, 5,
+  36, 23, 2, 0, 0, 31, 86, 8, 0, 0,
+  59, 11, 0, 0, 65, 56, 0, 25, 23, 0,
+  0, 13, 0, 13, 0, 11, 92, 0, 18, 0,
+  0, 32, 0, 53, 0, 28, 0, 44, 48, 94,
+  4, 86, 0, 7, 0, 38, 52, 0, 35, 0,
+  21, 0, 24, 0, 13, 27, 0, 40, 0, 11,
+  10, 0, 33, 0, 8, 0, 25, 13, 37, 0,
+  0, 0, 0, 15, 39, 0, 14, 13, 0, 0,
+  0, 0, 0, 24, 0, 0, 0, 13, 0, 47,
+  0, 0, 62, 50, 3, 0, 0, 13, 20, 1,
+  44, 0, 24, 28, 0, 29, 0, 15, 0, 0,
+  25, 0, 11, 10, 47, 0, 42, 0, 79, 0,
+  14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 30, 25, 0, 1, 3, 33, 18, 0, 0,
+  0, 0, 0, 38, 0, 18, 43, 15, 0, 40,
+  38, 17, 58, 51, 0, 9, 8, 5, 128, 38,
+  0, 0, 54, 0, 69, 16, 0, 30, 0, 38,
+  21, 38, 0, 22, 60, 37, 2, 0, 0, 0,
+  0, 13, 47, 0, 16, 0, 64, 0, 29, 0,
+  6, 33, 7, 0, 0, 0, 7, 19, 25, 0,
+  0, 36, 79, 26, 45, 46, 0, 7, 30, 1,
+  38, 2, 13, 0, 0, 0, 0, 0, 54, 6,
+  3, 0, 38, 1, 15, 56, 0, 0, 37, 35,
+  9, 0, 0, 19, 20, 19, 57, 1, 0, 26,
+  0, 8, 0, 33, 5, 0, 23, 13, 0, 22,
+  19, 0, 0, 0, 19, 0, 11, 9, 0, 48,
+  13, 14, 0, 0, 29, 34, 3, 0, 0, 37,
+  105, 0, 2, 11, 53, 15, 0, 14, 67, 51,
+  53, 17, 9, 0, 0, 9, 0, 0, 0, 0,
+  96, 0, 32, 9, 0, 24, 0, 75, 0, 32,
+  0, 38, 68, 64, 0, 61, 0, 41, 0, 28,
+  43, 1, 16, 0, 14, 0, 11, 0, 0, 0,
+  0, 18, 0, 0, 0, 0, 17, 0, 10, 2,
+  29, 20, 37, 0, 16, 39, 0, 22, 45, 0,
+  41, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+  0, 7, 0, 48, 0, 0, 52, 46, 8, 0,
+  0, 12, 18, 0, 59, 0, 0, 16, 0, 17,
+  0, 17, 0, 0, 14, 0, 6, 8, 40, 0,
+  40, 0, 76, 0, 11, 0, 23, 32, 93, 27,
+  1, 9, 26, 5, 18, 0, 0, 0, 0, 103,
+  0, 30, 67, 4, 0, 16, 13, 75, 10, 41,
+  20, 0, 6, 20, 201, 42, 3, 62, 71, 0,
+  24, 0, 0, 56, 0, 4, 5, 32, 0, 22,
+  9, 88, 48, 0, 0, 0, 0, 51, 21, 3,
+  55, 0, 44, 0, 32, 0, 31, 72, 0, 0,
+  0, 0, 48, 9, 120, 30, 0, 10, 58, 0,
+  32, 0, 53, 0, 0, 37, 0, 0, 36, 11,
+  0, 15, 0, 0, 58, 5, 0, 0, 0, 3,
+  0, 36, 0, 0, 40, 101, 17, 0, 0, 52,
+  55, 89, 20, 0, 9, 0, 2, 9, 0, 33,
+  6, 2, 40, 0, 19, 12, 51, 0, 0, 0,
+  3, 0, 39, 30, 0, 67, 0, 11, 0, 33,
+  2, 0, 0, 0, 0, 17, 28, 49, 0, 0,
+  52, 3, 0, 0, 28, 58, 0, 42, 19, 0,
+  0, 8, 0, 9, 0, 26, 82, 21, 0, 0,
+  0, 27, 0, 8, 0, 40, 0, 22, 24, 91,
+  9, 110, 0, 0, 0, 27, 50, 0, 37, 0,
+  28, 0, 14, 0, 55, 50, 0, 43, 0, 0,
+  49, 11, 81, 0, 4, 0, 22, 7, 42, 0,
+  12, 0, 0, 26, 21, 0, 21, 24, 0, 0,
+  0, 0, 0, 9, 0, 0, 0, 9, 0, 20,
+  0, 0, 47, 83, 0, 52, 17, 21, 41, 51,
+  25, 0, 40, 5, 0, 40, 0, 11, 0, 0,
+  21, 0, 13, 13, 31, 0, 15, 0, 35, 1,
+  15, 0, 0, 27, 36, 37, 0, 42, 17, 9,
+  15, 0, 0, 22, 97, 0, 7, 27, 55, 8,
+  0, 0, 0, 69, 0, 8, 46, 0, 0, 20,
+  0, 2, 0, 37, 78, 0, 3, 0, 0, 24,
+  0, 73, 0, 34, 30, 29, 29, 57, 25, 42,
+  0, 28, 0, 43, 34, 9, 17, 0, 10, 0,
+  0, 0, 6, 14, 0, 16, 0, 0, 0, 0,
+  28, 0, 23, 6, 0, 10, 7, 0, 0, 23,
+  0, 35, 38, 0, 52, 56, 0, 0, 11, 0,
+  0, 18, 0, 0, 0, 4, 0, 16, 29, 0,
+  0, 66, 6, 0, 0, 10, 18, 0, 38, 0,
+  0, 6, 0, 7, 0, 1, 0, 0, 17, 0,
+  0, 0, 5, 0, 43, 0, 63, 0, 11, 0,
+  13, 24, 67, 6, 0, 18, 27, 22, 0, 0,
+  0, 0, 0, 97, 0, 0, 60, 4, 0, 5,
+  27, 86, 27, 52, 0, 0, 8, 9, 193, 55,
+  1, 28, 52, 0, 59, 1, 0, 58, 0, 17,
+  14, 39, 0, 14, 26, 83, 17, 0, 2, 0,
+  0, 64, 30, 0, 71, 0, 60, 0, 49, 0,
+  15, 71, 0, 0, 0, 0, 7, 6, 77, 33,
+  0, 22, 82, 11, 31, 27, 25, 0, 20, 13,
+  0, 0, 15, 5, 0, 0, 0, 0, 62, 3,
+  0, 0, 23, 0, 15, 37, 0, 0, 49, 67,
+  15, 0, 0, 37, 46, 75, 26, 0, 0, 6,
+  1, 16, 0, 37, 12, 0, 55, 0, 9, 28,
+  40, 0, 0, 0, 4, 0, 26, 26, 0, 60,
+  0, 15, 0, 5, 36, 23, 2, 0, 0, 31,
+  86, 8, 0, 0, 59, 11, 0, 0, 65, 56,
+  0, 25, 23, 0, 0, 13, 0, 13, 0, 11,
+  92, 0, 18, 0, 0, 32, 0, 53, 0, 28,
+  0, 44, 48, 94, 4, 86, 0, 7, 0, 38,
+  52, 0, 35, 0, 21, 0, 24, 0, 13, 27,
+  0, 40, 0, 11, 10, 0, 33, 0, 8, 0,
+  25, 13, 37, 0, 0, 0, 0, 15, 39, 0,
+  14, 13, 0, 0, 0, 0, 0, 24, 0, 0,
+  0, 13, 0, 47, 0, 0, 62, 50, 3, 0,
+  0, 13, 20, 1, 44, 0, 24, 28, 0, 29,
+  0, 15, 0, 0, 25, 0, 11, 10, 47, 0,
+  42, 0, 79, 0, 14, 0, 3, 28, 40, 34,
+  0, 19, 25, 3, 20, 0, 0, 31, 114, 0,
+  21, 37, 61, 3, 0, 0, 0, 74, 0, 5,
+  57, 0, 0, 30, 0, 1, 0, 41, 79, 0,
+  10, 0, 0, 27, 0, 80, 0, 41, 32, 32,
+  31, 55, 32, 23, 0, 44, 0, 50, 31, 17,
+  17, 0, 7, 0, 0, 0, 12, 0, 0, 36,
+  0, 0, 4, 0, 28, 0, 17, 10, 0, 3,
+  3, 0, 15, 36, 0, 33, 36, 0, 51, 45,
+  0, 0, 5, 0, 0, 36, 0, 0, 0, 5,
+  0, 25, 33, 0, 3, 68, 5, 0, 5, 7,
+  24, 0, 28, 0, 2, 10, 6, 14, 0, 1,
+  0, 0, 2, 0, 6, 0, 15, 4, 59, 0,
+  74, 0, 21, 0, 0, 30, 25, 0, 1, 3,
+  33, 18, 0, 0, 0, 0, 0, 38, 0, 18,
+  43, 15, 0, 40, 38, 17, 58, 51, 0, 9,
+  8, 5, 128, 38, 0, 0, 54, 0, 69, 16,
+  0, 30, 0, 38, 21, 38, 0, 22, 60, 37,
+  2, 0, 0, 0, 0, 13, 47, 0, 16, 0,
+  64, 0, 29, 0, 6, 33, 7, 0, 0, 0,
+  7, 19, 25, 0, 0, 36, 79, 26, 45, 46,
+  0, 7, 30, 1, 38, 2, 13, 0, 0, 0,
+  0, 0, 54, 6, 3, 0, 38, 1, 15, 56,
+  0, 0, 37, 35, 9, 0, 0, 19, 20, 19,
+  57, 1, 0, 26, 0, 8, 0, 33, 5, 0,
+  23, 13, 0, 22, 19, 0, 0, 0, 19, 0,
+  11, 9, 0, 48, 13, 14, 0, 0, 29, 34,
+  3, 0, 0, 37, 105, 0, 2, 11, 53, 15,
+  0, 14, 67, 51, 53, 17, 9, 0, 0, 9,
+  0, 0, 0, 0, 96, 0, 32, 9, 0, 24,
+  0, 75, 0, 32, 0, 38, 68, 64, 0, 61,
+  0, 41, 0, 28, 43, 1, 16, 0, 14, 0,
+  11, 0, 0, 0, 0, 18, 0, 0, 0, 0,
+  17, 0, 10, 2, 29, 20, 37, 0, 16, 39,
+  0, 22, 45, 0, 41, 0, 0, 0, 0, 0,
+  0, 7, 0, 0, 0, 7, 0, 48, 0, 0,
+  52, 46, 8, 0, 0, 12, 18, 0, 59, 0,
+  0, 16, 0, 17, 0, 17, 0, 0, 14, 0,
+  6, 8, 40, 0, 40, 0, 76, 0, 11, 0,
+  4, 29, 39, 21, 0, 5, 28, 2, 19, 0,
+  0, 34, 112, 0, 22, 39, 53, 0, 0, 0,
+  0, 83, 0, 10, 59, 0, 0, 23, 0, 0,
+  0, 41, 82, 0, 23, 0, 0, 23, 0, 78,
+  0, 55, 37, 22, 36, 48, 30, 16, 0, 54,
+  0, 60, 33, 24, 31, 0, 11, 0, 7, 0,
+  17, 0, 0, 63, 0, 10, 7, 0, 36, 0,
+  8, 20, 0, 4, 0, 0, 33, 43, 0, 29,
+  44, 0, 61, 29, 0, 0, 0, 0, 0, 31,
+  0, 0, 0, 4, 0, 29, 42, 0, 5, 76,
+  2, 0, 8, 14, 30, 0, 21, 0, 0, 0,
+  8, 15, 0, 0, 0, 0, 0, 0, 6, 2,
+  19, 0, 53, 0, 69, 0, 17, 0, 0, 67,
+  0, 11, 0, 33, 2, 0, 0, 0, 0, 17,
+  28, 49, 0, 0, 52, 3, 0, 0, 28, 58,
+  0, 42, 19, 0, 0, 8, 0, 9, 0, 26,
+  82, 21, 0, 0, 0, 27, 0, 8, 0, 40,
+  0, 22, 24, 91, 9, 110, 0, 0, 0, 27,
+  50, 0, 37, 0, 28, 0, 14, 0, 55, 50,
+  0, 43, 0, 0, 49, 11, 81, 0, 4, 0,
+  22, 7, 42, 0, 12, 0, 0, 26, 21, 0,
+  21, 24, 0, 0, 0, 0, 0, 9, 0, 0,
+  0, 9, 0, 20, 0, 0, 47, 83, 0, 52,
+  17, 21, 41, 51, 25, 0, 40, 5, 0, 40,
+  0, 11, 0, 0, 21, 0, 13, 13, 31, 0,
+  15, 0, 35, 1, 15, 0, 0, 27, 36, 37,
+  0, 42, 17, 9, 15, 0, 0, 22, 97, 0,
+  7, 27, 55, 8, 0, 0, 0, 69, 0, 8,
+  46, 0, 0, 20, 0, 2, 0, 37, 78, 0,
+  3, 0, 0, 24, 0, 73, 0, 34, 30, 29,
+  29, 57, 25, 42, 0, 28, 0, 43, 34, 9,
+  17, 0, 10, 0, 0, 0, 6, 14, 0, 16,
+  0, 0, 0, 0, 28, 0, 23, 6, 0, 10,
+  7, 0, 0, 23, 0, 35, 38, 0, 52, 56,
+  0, 0, 11, 0, 0, 18, 0, 0, 0, 4,
+  0, 16, 29, 0, 0, 66, 6, 0, 0, 10,
+  18, 0, 38, 0, 0, 6, 0, 7, 0, 1,
+  0, 0, 17, 0, 0, 0, 5, 0, 43, 0,
+  63, 0, 11, 0, 0, 0, 0, 15, 0, 142,
+  5, 0, 3, 0, 0, 27, 43, 0, 0, 0,
+  6, 0, 0, 0, 37, 88, 23, 15, 8, 0,
+  0, 0, 0, 13, 0, 22, 26, 24, 0, 2,
+  0, 36, 0, 50, 0, 35, 0, 56, 1, 71,
+  43, 43, 0, 0, 0, 38, 8, 0, 4, 0,
+  67, 0, 33, 0, 0, 57, 0, 0, 64, 0,
+  0, 26, 62, 0, 74, 26, 27, 3, 4, 32,
+  9, 25, 0, 31, 35, 0, 37, 52, 8, 0,
+  19, 0, 0, 0, 0, 11, 7, 0, 1, 26,
+  0, 0, 10, 66, 18, 0, 0, 7, 8, 0,
+  31, 0, 0, 0, 0, 0, 0, 15, 0, 0,
+  111, 2, 35, 3, 0, 0, 0, 0, 41, 0,
+  0, 0, 0, 60, 0, 15, 0, 5, 36, 23,
+  2, 0, 0, 31, 86, 8, 0, 0, 59, 11,
+  0, 0, 65, 56, 0, 25, 23, 0, 0, 13,
+  0, 13, 0, 11, 92, 0, 18, 0, 0, 32,
+  0, 53, 0, 28, 0, 44, 48, 94, 4, 86,
+  0, 7, 0, 38, 52, 0, 35, 0, 21, 0,
+  24, 0, 13, 27, 0, 40, 0, 11, 10, 0,
+  33, 0, 8, 0, 25, 13, 37, 0, 0, 0,
+  0, 15, 39, 0, 14, 13, 0, 0, 0, 0,
+  0, 24, 0, 0, 0, 13, 0, 47, 0, 0,
+  62, 50, 3, 0, 0, 13, 20, 1, 44, 0,
+  24, 28, 0, 29, 0, 15, 0, 0, 25, 0,
+  11, 10, 47, 0, 42, 0, 79, 0, 14, 0,
+  3, 28, 40, 34, 0, 19, 25, 3, 20, 0,
+  0, 31, 114, 0, 21, 37, 61, 3, 0, 0,
+  0, 74, 0, 5, 57, 0, 0, 30, 0, 1,
+  0, 41, 79, 0, 10, 0, 0, 27, 0, 80,
+  0, 41, 32, 32, 31, 55, 32, 23, 0, 44,
+  0, 50, 31, 17, 17, 0, 7, 0, 0, 0,
+  12, 0, 0, 36, 0, 0, 4, 0, 28, 0,
+  17, 10, 0, 3, 3, 0, 15, 36, 0, 33,
+  36, 0, 51, 45, 0, 0, 5, 0, 0, 36,
+  0, 0, 0, 5, 0, 25, 33, 0, 3, 68,
+  5, 0, 5, 7, 24, 0, 28, 0, 2, 10,
+  6, 14, 0, 1, 0, 0, 2, 0, 6, 0,
+  15, 4, 59, 0, 74, 0, 21, 0, 0, 0,
+  0, 16, 0, 145, 3, 0, 12, 0, 0, 27,
+  50, 0, 0, 22, 2, 0, 1, 0, 35, 91,
+  18, 9, 3, 0, 0, 0, 0, 4, 0, 27,
+  23, 43, 0, 0, 0, 30, 0, 60, 0, 29,
+  0, 69, 6, 72, 26, 52, 0, 0, 0, 48,
+  12, 0, 0, 0, 56, 0, 35, 0, 2, 55,
+  0, 0, 72, 0, 0, 20, 53, 0, 83, 22,
+  17, 0, 0, 33, 2, 22, 0, 37, 41, 0,
+  32, 49, 7, 0, 27, 0, 0, 0, 0, 13,
+  1, 0, 15, 38, 0, 0, 2, 68, 27, 0,
+  0, 7, 17, 0, 22, 0, 0, 0, 0, 0,
+  0, 29, 0, 0, 104, 4, 40, 7, 0, 0,
+  0, 0, 54, 0, 3, 0, 0, 48, 13, 14,
+  0, 0, 29, 34, 3, 0, 0, 37, 105, 0,
+  2, 11, 53, 15, 0, 14, 67, 51, 53, 17,
+  9, 0, 0, 9, 0, 0, 0, 0, 96, 0,
+  32, 9, 0, 24, 0, 75, 0, 32, 0, 38,
+  68, 64, 0, 61, 0, 41, 0, 28, 43, 1,
+  16, 0, 14, 0, 11, 0, 0, 0, 0, 18,
+  0, 0, 0, 0, 17, 0, 10, 2, 29, 20,
+  37, 0, 16, 39, 0, 22, 45, 0, 41, 0,
+  0, 0, 0, 0, 0, 7, 0, 0, 0, 7,
+  0, 48, 0, 0, 52, 46, 8, 0, 0, 12,
+  18, 0, 59, 0, 0, 16, 0, 17, 0, 17,
+  0, 0, 14, 0, 6, 8, 40, 0, 40, 0,
+  76, 0, 11, 0, 4, 29, 39, 21, 0, 5,
+  28, 2, 19, 0, 0, 34, 112, 0, 22, 39,
+  53, 0, 0, 0, 0, 83, 0, 10, 59, 0,
+  0, 23, 0, 0, 0, 41, 82, 0, 23, 0,
+  0, 23, 0, 78, 0, 55, 37, 22, 36, 48,
+  30, 16, 0, 54, 0, 60, 33, 24, 31, 0,
+  11, 0, 7, 0, 17, 0, 0, 63, 0, 10,
+  7, 0, 36, 0, 8, 20, 0, 4, 0, 0,
+  33, 43, 0, 29, 44, 0, 61, 29, 0, 0,
+  0, 0, 0, 31, 0, 0, 0, 4, 0, 29,
+  42, 0, 5, 76, 2, 0, 8, 14, 30, 0,
+  21, 0, 0, 0, 8, 15, 0, 0, 0, 0,
+  0, 0, 6, 2, 19, 0, 53, 0, 69, 0,
+  17, 0, 0, 0, 0, 10, 0, 139, 4, 0,
+  12, 0, 0, 18, 33, 0, 0, 25, 0, 0,
+  0, 0, 30, 95, 19, 11, 3, 0, 0, 0,
+  0, 0, 0, 27, 29, 38, 0, 0, 0, 23,
+  0, 54, 0, 22, 0, 53, 1, 90, 35, 56,
+  0, 0, 0, 51, 6, 0, 10, 0, 55, 0,
+  49, 0, 11, 61, 0, 0, 76, 3, 0, 3,
+  55, 0, 82, 11, 11, 0, 0, 21, 26, 25,
+  0, 32, 34, 0, 41, 44, 0, 0, 22, 0,
+  0, 7, 0, 21, 4, 0, 4, 31, 0, 0,
+  7, 66, 36, 0, 0, 23, 27, 0, 16, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 100, 2,
+  34, 1, 0, 0, 0, 0, 28, 0, 0, 0,
+  0, 27, 36, 37, 0, 42, 17, 9, 15, 0,
+  0, 22, 97, 0, 7, 27, 55, 8, 0, 0,
+  0, 69, 0, 8, 46, 0, 0, 20, 0, 2,
+  0, 37, 78, 0, 3, 0, 0, 24, 0, 73,
+  0, 34, 30, 29, 29, 57, 25, 42, 0, 28,
+  0, 43, 34, 9, 17, 0, 10, 0, 0, 0,
+  6, 14, 0, 16, 0, 0, 0, 0, 28, 0,
+  23, 6, 0, 10, 7, 0, 0, 23, 0, 35,
+  38, 0, 52, 56, 0, 0, 11, 0, 0, 18,
+  0, 0, 0, 4, 0, 16, 29, 0, 0, 66,
+  6, 0, 0, 10, 18, 0, 38, 0, 0, 6,
+  0, 7, 0, 1, 0, 0, 17, 0, 0, 0,
+  5, 0, 43, 0, 63, 0, 11, 0, 0, 0,
+  0, 15, 0, 142, 5, 0, 3, 0, 0, 27,
+  43, 0, 0, 0, 6, 0, 0, 0, 37, 88,
+  23, 15, 8, 0, 0, 0, 0, 13, 0, 22,
+  26, 24, 0, 2, 0, 36, 0, 50, 0, 35,
+  0, 56, 1, 71, 43, 43, 0, 0, 0, 38,
+  8, 0, 4, 0, 67, 0, 33, 0, 0, 57,
+  0, 0, 64, 0, 0, 26, 62, 0, 74, 26,
+  27, 3, 4, 32, 9, 25, 0, 31, 35, 0,
+  37, 52, 8, 0, 19, 0, 0, 0, 0, 11,
+  7, 0, 1, 26, 0, 0, 10, 66, 18, 0,
+  0, 7, 8, 0, 31, 0, 0, 0, 0, 0,
+  0, 15, 0, 0, 111, 2, 35, 3, 0, 0,
+  0, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+  0, 51, 48, 0, 17, 0, 0, 1, 56, 0,
+  12, 28, 33, 20, 5, 18, 77, 0, 0, 29,
+  0, 42, 17, 0, 0, 38, 0, 0, 71, 57,
+  0, 0, 0, 12, 0, 39, 0, 43, 0, 51,
+  0, 34, 20, 45, 0, 31, 15, 0, 71, 13,
+  0, 6, 44, 0, 0, 54, 15, 0, 0, 0,
+  0, 0, 23, 28, 33, 0, 0, 13, 0, 22,
+  15, 54, 0, 0, 0, 29, 69, 6, 16, 0,
+  25, 0, 11, 13, 3, 2, 0, 26, 5, 14,
+  0, 26, 0, 0, 43, 47, 11, 6, 0, 0,
+  0, 0, 43, 0, 0, 46, 1, 0, 0, 11,
+  0, 0, 48, 15, 46, 0, 23, 0, 104, 0,
+  47, 0, 0, 0, 3, 28, 40, 34, 0, 19,
+  25, 3, 20, 0, 0, 31, 114, 0, 21, 37,
+  61, 3, 0, 0, 0, 74, 0, 5, 57, 0,
+  0, 30, 0, 1, 0, 41, 79, 0, 10, 0,
+  0, 27, 0, 80, 0, 41, 32, 32, 31, 55,
+  32, 23, 0, 44, 0, 50, 31, 17, 17, 0,
+  7, 0, 0, 0, 12, 0, 0, 36, 0, 0,
+  4, 0, 28, 0, 17, 10, 0, 3, 3, 0,
+  15, 36, 0, 33, 36, 0, 51, 45, 0, 0,
+  5, 0, 0, 36, 0, 0, 0, 5, 0, 25,
+  33, 0, 3, 68, 5, 0, 5, 7, 24, 0,
+  28, 0, 2, 10, 6, 14, 0, 1, 0, 0,
+  2, 0, 6, 0, 15, 4, 59, 0, 74, 0,
+  21, 0, 0, 0, 0, 16, 0, 145, 3, 0,
+  12, 0, 0, 27, 50, 0, 0, 22, 2, 0,
+  1, 0, 35, 91, 18, 9, 3, 0, 0, 0,
+  0, 4, 0, 27, 23, 43, 0, 0, 0, 30,
+  0, 60, 0, 29, 0, 69, 6, 72, 26, 52,
+  0, 0, 0, 48, 12, 0, 0, 0, 56, 0,
+  35, 0, 2, 55, 0, 0, 72, 0, 0, 20,
+  53, 0, 83, 22, 17, 0, 0, 33, 2, 22,
+  0, 37, 41, 0, 32, 49, 7, 0, 27, 0,
+  0, 0, 0, 13, 1, 0, 15, 38, 0, 0,
+  2, 68, 27, 0, 0, 7, 17, 0, 22, 0,
+  0, 0, 0, 0, 0, 29, 0, 0, 104, 4,
+  40, 7, 0, 0, 0, 0, 54, 0, 3, 0,
+  0, 0, 0, 0, 0, 45, 41, 0, 20, 0,
+  0, 0, 75, 11, 19, 55, 39, 21, 25, 2,
+  84, 0, 0, 27, 13, 52, 3, 2, 0, 52,
+  0, 0, 56, 63, 0, 0, 0, 0, 0, 59,
+  0, 43, 0, 45, 7, 20, 17, 36, 0, 46,
+  0, 0, 66, 22, 0, 0, 25, 0, 0, 76,
+  20, 0, 0, 2, 0, 0, 13, 21, 31, 0,
+  0, 26, 0, 14, 8, 55, 0, 0, 0, 54,
+  58, 17, 20, 5, 37, 0, 12, 14, 8, 14,
+  4, 15, 7, 17, 1, 41, 0, 0, 39, 55,
+  6, 0, 4, 0, 0, 0, 35, 0, 0, 42,
+  13, 0, 0, 5, 0, 0, 43, 15, 52, 0,
+  18, 3, 121, 0, 68, 0, 9, 0, 4, 29,
+  39, 21, 0, 5, 28, 2, 19, 0, 0, 34,
+  112, 0, 22, 39, 53, 0, 0, 0, 0, 83,
+  0, 10, 59, 0, 0, 23, 0, 0, 0, 41,
+  82, 0, 23, 0, 0, 23, 0, 78, 0, 55,
+  37, 22, 36, 48, 30, 16, 0, 54, 0, 60,
+  33, 24, 31, 0, 11, 0, 7, 0, 17, 0,
+  0, 63, 0, 10, 7, 0, 36, 0, 8, 20,
+  0, 4, 0, 0, 33, 43, 0, 29, 44, 0,
+  61, 29, 0, 0, 0, 0, 0, 31, 0, 0,
+  0, 4, 0, 29, 42, 0, 5, 76, 2, 0,
+  8, 14, 30, 0, 21, 0, 0, 0, 8, 15,
+  0, 0, 0, 0, 0, 0, 6, 2, 19, 0,
+  53, 0, 69, 0, 17, 0, 0, 0, 0, 10,
+  0, 139, 4, 0, 12, 0, 0, 18, 33, 0,
+  0, 25, 0, 0, 0, 0, 30, 95, 19, 11,
+  3, 0, 0, 0, 0, 0, 0, 27, 29, 38,
+  0, 0, 0, 23, 0, 54, 0, 22, 0, 53,
+  1, 90, 35, 56, 0, 0, 0, 51, 6, 0,
+  10, 0, 55, 0, 49, 0, 11, 61, 0, 0,
+  76, 3, 0, 3, 55, 0, 82, 11, 11, 0,
+  0, 21, 26, 25, 0, 32, 34, 0, 41, 44,
+  0, 0, 22, 0, 0, 7, 0, 21, 4, 0,
+  4, 31, 0, 0, 7, 66, 36, 0, 0, 23,
+  27, 0, 16, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 100, 2, 34, 1, 0, 0, 0, 0,
+  28, 0, 0, 0, 0, 0, 0, 0, 9, 38,
+  29, 0, 28, 0, 15, 0, 49, 21, 13, 59,
+  25, 11, 12, 5, 68, 0, 0, 42, 2, 24,
+  1, 0, 0, 35, 0, 0, 51, 61, 4, 0,
+  0, 0, 0, 42, 8, 38, 0, 45, 9, 26,
+  16, 31, 0, 20, 23, 0, 74, 24, 0, 0,
+  43, 0, 0, 56, 26, 7, 0, 0, 0, 0,
+  26, 8, 30, 0, 0, 7, 0, 8, 2, 45,
+  9, 0, 0, 52, 52, 14, 29, 21, 20, 0,
+  7, 19, 17, 28, 6, 32, 0, 6, 20, 41,
+  0, 0, 30, 59, 7, 0, 1, 0, 0, 0,
+  35, 0, 0, 25, 13, 0, 0, 13, 0, 0,
+  41, 20, 37, 0, 1, 0, 90, 0, 36, 0,
+  0, 0, 0, 0, 0, 15, 0, 142, 5, 0,
+  3, 0, 0, 27, 43, 0, 0, 0, 6, 0,
+  0, 0, 37, 88, 23, 15, 8, 0, 0, 0,
+  0, 13, 0, 22, 26, 24, 0, 2, 0, 36,
+  0, 50, 0, 35, 0, 56, 1, 71, 43, 43,
+  0, 0, 0, 38, 8, 0, 4, 0, 67, 0,
+  33, 0, 0, 57, 0, 0, 64, 0, 0, 26,
+  62, 0, 74, 26, 27, 3, 4, 32, 9, 25,
+  0, 31, 35, 0, 37, 52, 8, 0, 19, 0,
+  0, 0, 0, 11, 7, 0, 1, 26, 0, 0,
+  10, 66, 18, 0, 0, 7, 8, 0, 31, 0,
+  0, 0, 0, 0, 0, 15, 0, 0, 111, 2,
+  35, 3, 0, 0, 0, 0, 41, 0, 0, 0,
+  0, 0, 0, 0, 0, 51, 48, 0, 17, 0,
+  0, 1, 56, 0, 12, 28, 33, 20, 5, 18,
+  77, 0, 0, 29, 0, 42, 17, 0, 0, 38,
+  0, 0, 71, 57, 0, 0, 0, 12, 0, 39,
+  0, 43, 0, 51, 0, 34, 20, 45, 0, 31,
+  15, 0, 71, 13, 0, 6, 44, 0, 0, 54,
+  15, 0, 0, 0, 0, 0, 23, 28, 33, 0,
+  0, 13, 0, 22, 15, 54, 0, 0, 0, 29,
+  69, 6, 16, 0, 25, 0, 11, 13, 3, 2,
+  0, 26, 5, 14, 0, 26, 0, 0, 43, 47,
+  11, 6, 0, 0, 0, 0, 43, 0, 0, 46,
+  1, 0, 0, 11, 0, 0, 48, 15, 46, 0,
+  23, 0, 104, 0, 47, 0, 0, 0, 0, 29,
+  0, 0, 20, 0, 45, 0, 38, 0, 0, 2,
+  26, 28, 73, 29, 52, 53, 0, 24, 91, 0,
+  0, 24, 16, 39, 26, 0, 0, 20, 0, 0,
+  40, 12, 3, 0, 0, 8, 0, 47, 0, 9,
+  0, 58, 0, 33, 12, 19, 0, 0, 17, 3,
+  66, 44, 0, 0, 7, 0, 0, 3, 7, 0,
+  0, 0, 0, 0, 42, 7, 32, 0, 0, 0,
+  0, 10, 51, 0, 4, 0, 0, 8, 61, 18,
+  25, 0, 32, 0, 8, 4, 12, 12, 2, 0,
+  0, 26, 0, 31, 0, 0, 56, 29, 0, 2,
+  0, 0, 0, 0, 30, 0, 7, 37, 0, 0,
+  0, 21, 0, 0, 7, 6, 14, 0, 16, 0,
+  90, 0, 25, 0, 12, 0, 0, 0, 0, 16,
+  0, 145, 3, 0, 12, 0, 0, 27, 50, 0,
+  0, 22, 2, 0, 1, 0, 35, 91, 18, 9,
+  3, 0, 0, 0, 0, 4, 0, 27, 23, 43,
+  0, 0, 0, 30, 0, 60, 0, 29, 0, 69,
+  6, 72, 26, 52, 0, 0, 0, 48, 12, 0,
+  0, 0, 56, 0, 35, 0, 2, 55, 0, 0,
+  72, 0, 0, 20, 53, 0, 83, 22, 17, 0,
+  0, 33, 2, 22, 0, 37, 41, 0, 32, 49,
+  7, 0, 27, 0, 0, 0, 0, 13, 1, 0,
+  15, 38, 0, 0, 2, 68, 27, 0, 0, 7,
+  17, 0, 22, 0, 0, 0, 0, 0, 0, 29,
+  0, 0, 104, 4, 40, 7, 0, 0, 0, 0,
+  54, 0, 3, 0, 0, 0, 0, 0, 0, 45,
+  41, 0, 20, 0, 0, 0, 75, 11, 19, 55,
+  39, 21, 25, 2, 84, 0, 0, 27, 13, 52,
+  3, 2, 0, 52, 0, 0, 56, 63, 0, 0,
+  0, 0, 0, 59, 0, 43, 0, 45, 7, 20,
+  17, 36, 0, 46, 0, 0, 66, 22, 0, 0,
+  25, 0, 0, 76, 20, 0, 0, 2, 0, 0,
+  13, 21, 31, 0, 0, 26, 0, 14, 8, 55,
+  0, 0, 0, 54, 58, 17, 20, 5, 37, 0,
+  12, 14, 8, 14, 4, 15, 7, 17, 1, 41,
+  0, 0, 39, 55, 6, 0, 4, 0, 0, 0,
+  35, 0, 0, 42, 13, 0, 0, 5, 0, 0,
+  43, 15, 52, 0, 18, 3, 121, 0, 68, 0,
+  9, 0, 0, 49, 1, 0, 30, 0, 15, 0,
+  64, 0, 0, 7, 46, 41, 52, 60, 59, 47,
+  14, 4, 85, 0, 0, 29, 21, 32, 22, 9,
+  0, 19, 0, 0, 33, 0, 0, 0, 0, 0,
+  0, 62, 0, 0, 0, 54, 0, 32, 4, 0,
+  0, 16, 7, 12, 54, 37, 0, 0, 0, 0,
+  0, 0, 1, 0, 0, 0, 0, 0, 49, 0,
+  30, 0, 0, 0, 5, 29, 27, 0, 0, 9,
+  0, 21, 35, 23, 45, 0, 23, 22, 4, 26,
+  21, 30, 26, 0, 0, 24, 0, 19, 0, 0,
+  46, 43, 11, 0, 0, 0, 0, 0, 30, 1,
+  0, 44, 0, 0, 0, 16, 0, 0, 1, 3,
+  6, 0, 0, 0, 95, 0, 52, 0, 20, 0,
+  0, 0, 0, 10, 0, 139, 4, 0, 12, 0,
+  0, 18, 33, 0, 0, 25, 0, 0, 0, 0,
+  30, 95, 19, 11, 3, 0, 0, 0, 0, 0,
+  0, 27, 29, 38, 0, 0, 0, 23, 0, 54,
+  0, 22, 0, 53, 1, 90, 35, 56, 0, 0,
+  0, 51, 6, 0, 10, 0, 55, 0, 49, 0,
+  11, 61, 0, 0, 76, 3, 0, 3, 55, 0,
+  82, 11, 11, 0, 0, 21, 26, 25, 0, 32,
+  34, 0, 41, 44, 0, 0, 22, 0, 0, 7,
+  0, 21, 4, 0, 4, 31, 0, 0, 7, 66,
+  36, 0, 0, 23, 27, 0, 16, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 100, 2, 34, 1,
+  0, 0, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 9, 38, 29, 0, 28, 0, 15, 0,
+  49, 21, 13, 59, 25, 11, 12, 5, 68, 0,
+  0, 42, 2, 24, 1, 0, 0, 35, 0, 0,
+  51, 61, 4, 0, 0, 0, 0, 42, 8, 38,
+  0, 45, 9, 26, 16, 31, 0, 20, 23, 0,
+  74, 24, 0, 0, 43, 0, 0, 56, 26, 7,
+  0, 0, 0, 0, 26, 8, 30, 0, 0, 7,
+  0, 8, 2, 45, 9, 0, 0, 52, 52, 14,
+  29, 21, 20, 0, 7, 19, 17, 28, 6, 32,
+  0, 6, 20, 41, 0, 0, 30, 59, 7, 0,
+  1, 0, 0, 0, 35, 0, 0, 25, 13, 0,
+  0, 13, 0, 0, 41, 20, 37, 0, 1, 0,
+  90, 0, 36, 0, 0, 0, 0, 41, 38, 0,
+  0, 0, 0, 0, 61, 6, 0, 16, 12, 19,
+  25, 54, 49, 37, 21, 5, 43, 0, 53, 32,
+  0, 0, 35, 21, 0, 0, 0, 0, 32, 0,
+  3, 0, 0, 0, 0, 35, 0, 0, 0, 27,
+  0, 26, 0, 0, 0, 15, 28, 3, 38, 9,
+  0, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 56, 0, 5, 0, 0, 0, 1, 44,
+  11, 11, 0, 62, 0, 23, 13, 12, 56, 44,
+  1, 24, 0, 29, 27, 31, 52, 10, 0, 0,
+  12, 0, 0, 0, 11, 51, 42, 0, 0, 0,
+  0, 0, 41, 0, 0, 48, 5, 0, 0, 10,
+  0, 0, 7, 0, 0, 0, 0, 0, 47, 0,
+  21, 0, 1, 20, 0, 0, 0, 0, 0, 51,
+  48, 0, 17, 0, 0, 1, 56, 0, 12, 28,
+  33, 20, 5, 18, 77, 0, 0, 29, 0, 42,
+  17, 0, 0, 38, 0, 0, 71, 57, 0, 0,
+  0, 12, 0, 39, 0, 43, 0, 51, 0, 34,
+  20, 45, 0, 31, 15, 0, 71, 13, 0, 6,
+  44, 0, 0, 54, 15, 0, 0, 0, 0, 0,
+  23, 28, 33, 0, 0, 13, 0, 22, 15, 54,
+  0, 0, 0, 29, 69, 6, 16, 0, 25, 0,
+  11, 13, 3, 2, 0, 26, 5, 14, 0, 26,
+  0, 0, 43, 47, 11, 6, 0, 0, 0, 0,
+  43, 0, 0, 46, 1, 0, 0, 11, 0, 0,
+  48, 15, 46, 0, 23, 0, 104, 0, 47, 0,
+  0, 0, 0, 29, 0, 0, 20, 0, 45, 0,
+  38, 0, 0, 2, 26, 28, 73, 29, 52, 53,
+  0, 24, 91, 0, 0, 24, 16, 39, 26, 0,
+  0, 20, 0, 0, 40, 12, 3, 0, 0, 8,
+  0, 47, 0, 9, 0, 58, 0, 33, 12, 19,
+  0, 0, 17, 3, 66, 44, 0, 0, 7, 0,
+  0, 3, 7, 0, 0, 0, 0, 0, 42, 7,
+  32, 0, 0, 0, 0, 10, 51, 0, 4, 0,
+  0, 8, 61, 18, 25, 0, 32, 0, 8, 4,
+  12, 12, 2, 0, 0, 26, 0, 31, 0, 0,
+  56, 29, 0, 2, 0, 0, 0, 0, 30, 0,
+  7, 37, 0, 0, 0, 21, 0, 0, 7, 6,
+  14, 0, 16, 0, 90, 0, 25, 0, 12, 0,
+  0, 65, 0, 0, 34, 0, 36, 0, 61, 12,
+  0, 5, 44, 54, 61, 74, 64, 45, 0, 12,
+  72, 0, 0, 33, 31, 57, 17, 27, 0, 12,
+  0, 0, 29, 8, 17, 0, 0, 37, 0, 58,
+  0, 3, 0, 54, 0, 29, 24, 4, 0, 0,
+  35, 0, 43, 56, 0, 0, 7, 0, 0, 32,
+  0, 0, 0, 0, 0, 0, 70, 9, 41, 0,
+  0, 0, 0, 18, 51, 0, 0, 21, 0, 27,
+  40, 52, 13, 20, 40, 15, 0, 9, 25, 57,
+  3, 0, 0, 59, 0, 27, 0, 5, 69, 44,
+  0, 0, 0, 0, 2, 0, 12, 20, 36, 60,
+  0, 0, 0, 21, 0, 0, 0, 18, 24, 0,
+  0, 1, 134, 0, 38, 0, 44, 0, 0, 0,
+  0, 0, 0, 45, 41, 0, 20, 0, 0, 0,
+  75, 11, 19, 55, 39, 21, 25, 2, 84, 0,
+  0, 27, 13, 52, 3, 2, 0, 52, 0, 0,
+  56, 63, 0, 0, 0, 0, 0, 59, 0, 43,
+  0, 45, 7, 20, 17, 36, 0, 46, 0, 0,
+  66, 22, 0, 0, 25, 0, 0, 76, 20, 0,
+  0, 2, 0, 0, 13, 21, 31, 0, 0, 26,
+  0, 14, 8, 55, 0, 0, 0, 54, 58, 17,
+  20, 5, 37, 0, 12, 14, 8, 14, 4, 15,
+  7, 17, 1, 41, 0, 0, 39, 55, 6, 0,
+  4, 0, 0, 0, 35, 0, 0, 42, 13, 0,
+  0, 5, 0, 0, 43, 15, 52, 0, 18, 3,
+  121, 0, 68, 0, 9, 0, 0, 49, 1, 0,
+  30, 0, 15, 0, 64, 0, 0, 7, 46, 41,
+  52, 60, 59, 47, 14, 4, 85, 0, 0, 29,
+  21, 32, 22, 9, 0, 19, 0, 0, 33, 0,
+  0, 0, 0, 0, 0, 62, 0, 0, 0, 54,
+  0, 32, 4, 0, 0, 16, 7, 12, 54, 37,
+  0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+  0, 0, 49, 0, 30, 0, 0, 0, 5, 29,
+  27, 0, 0, 9, 0, 21, 35, 23, 45, 0,
+  23, 22, 4, 26, 21, 30, 26, 0, 0, 24,
+  0, 19, 0, 0, 46, 43, 11, 0, 0, 0,
+  0, 0, 30, 1, 0, 44, 0, 0, 0, 16,
+  0, 0, 1, 3, 6, 0, 0, 0, 95, 0,
+  52, 0, 20, 0, 0, 44, 27, 0, 33, 0,
+  0, 0, 76, 0, 0, 1, 67, 69, 11, 51,
+  63, 32, 6, 0, 66, 0, 0, 38, 0, 0,
+  28, 40, 0, 0, 0, 0, 7, 0, 0, 0,
+  0, 27, 0, 47, 0, 0, 0, 20, 0, 38,
+  0, 0, 0, 16, 0, 34, 21, 7, 0, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
+  98, 0, 25, 5, 0, 0, 0, 78, 9, 0,
+  0, 35, 0, 0, 12, 5, 38, 41, 20, 53,
+  0, 44, 32, 14, 27, 37, 0, 13, 0, 0,
+  0, 0, 28, 63, 38, 0, 0, 0, 0, 0,
+  3, 36, 0, 61, 0, 0, 0, 5, 3, 0,
+  4, 0, 0, 0, 0, 0, 77, 0, 26, 0,
+  18, 21, 0, 0, 0, 0, 9, 38, 29, 0,
+  28, 0, 15, 0, 49, 21, 13, 59, 25, 11,
+  12, 5, 68, 0, 0, 42, 2, 24, 1, 0,
+  0, 35, 0, 0, 51, 61, 4, 0, 0, 0,
+  0, 42, 8, 38, 0, 45, 9, 26, 16, 31,
+  0, 20, 23, 0, 74, 24, 0, 0, 43, 0,
+  0, 56, 26, 7, 0, 0, 0, 0, 26, 8,
+  30, 0, 0, 7, 0, 8, 2, 45, 9, 0,
+  0, 52, 52, 14, 29, 21, 20, 0, 7, 19,
+  17, 28, 6, 32, 0, 6, 20, 41, 0, 0,
+  30, 59, 7, 0, 1, 0, 0, 0, 35, 0,
+  0, 25, 13, 0, 0, 13, 0, 0, 41, 20,
+  37, 0, 1, 0, 90, 0, 36, 0, 0, 0,
+  0, 41, 38, 0, 0, 0, 0, 0, 61, 6,
+  0, 16, 12, 19, 25, 54, 49, 37, 21, 5,
+  43, 0, 53, 32, 0, 0, 35, 21, 0, 0,
+  0, 0, 32, 0, 3, 0, 0, 0, 0, 35,
+  0, 0, 0, 27, 0, 26, 0, 0, 0, 15,
+  28, 3, 38, 9, 0, 0, 27, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 56, 0, 5, 0,
+  0, 0, 1, 44, 11, 11, 0, 62, 0, 23,
+  13, 12, 56, 44, 1, 24, 0, 29, 27, 31,
+  52, 10, 0, 0, 12, 0, 0, 0, 11, 51,
+  42, 0, 0, 0, 0, 0, 41, 0, 0, 48,
+  5, 0, 0, 10, 0, 0, 7, 0, 0, 0,
+  0, 0, 47, 0, 21, 0, 1, 20, 52, 0,
+  43, 0, 22, 0, 0, 0, 29, 0, 0, 0,
+  38, 88, 0, 0, 38, 0, 13, 0, 33, 104,
+  68, 26, 0, 0, 8, 50, 0, 0, 0, 10,
+  0, 4, 0, 0, 0, 20, 0, 11, 1, 0,
+  0, 0, 0, 16, 0, 0, 0, 7, 0, 77,
+  0, 0, 52, 0, 26, 23, 6, 0, 25, 0,
+  0, 6, 24, 0, 92, 16, 18, 73, 0, 0,
+  0, 73, 0, 0, 0, 50, 0, 0, 0, 0,
+  11, 59, 10, 49, 0, 55, 10, 0, 0, 37,
+  0, 0, 5, 0, 13, 0, 23, 61, 29, 7,
+  1, 0, 19, 2, 0, 26, 0, 53, 0, 7,
+  0, 0, 0, 23, 69, 0, 1, 0, 0, 31,
+  0, 0, 4, 0, 0, 61, 0, 29, 0, 0,
+  20, 0, 45, 0, 38, 0, 0, 2, 26, 28,
+  73, 29, 52, 53, 0, 24, 91, 0, 0, 24,
+  16, 39, 26, 0, 0, 20, 0, 0, 40, 12,
+  3, 0, 0, 8, 0, 47, 0, 9, 0, 58,
+  0, 33, 12, 19, 0, 0, 17, 3, 66, 44,
+  0, 0, 7, 0, 0, 3, 7, 0, 0, 0,
+  0, 0, 42, 7, 32, 0, 0, 0, 0, 10,
+  51, 0, 4, 0, 0, 8, 61, 18, 25, 0,
+  32, 0, 8, 4, 12, 12, 2, 0, 0, 26,
+  0, 31, 0, 0, 56, 29, 0, 2, 0, 0,
+  0, 0, 30, 0, 7, 37, 0, 0, 0, 21,
+  0, 0, 7, 6, 14, 0, 16, 0, 90, 0,
+  25, 0, 12, 0, 0, 65, 0, 0, 34, 0,
+  36, 0, 61, 12, 0, 5, 44, 54, 61, 74,
+  64, 45, 0, 12, 72, 0, 0, 33, 31, 57,
+  17, 27, 0, 12, 0, 0, 29, 8, 17, 0,
+  0, 37, 0, 58, 0, 3, 0, 54, 0, 29,
+  24, 4, 0, 0, 35, 0, 43, 56, 0, 0,
+  7, 0, 0, 32, 0, 0, 0, 0, 0, 0,
+  70, 9, 41, 0, 0, 0, 0, 18, 51, 0,
+  0, 21, 0, 27, 40, 52, 13, 20, 40, 15,
+  0, 9, 25, 57, 3, 0, 0, 59, 0, 27,
+  0, 5, 69, 44, 0, 0, 0, 0, 2, 0,
+  12, 20, 36, 60, 0, 0, 0, 21, 0, 0,
+  0, 18, 24, 0, 0, 1, 134, 0, 38, 0,
+  44, 0, 0, 26, 42, 0, 40, 0, 0, 0,
+  68, 7, 0, 5, 43, 69, 21, 36, 59, 16,
+  3, 0, 30, 7, 16, 33, 0, 0, 32, 69,
+  0, 5, 0, 0, 0, 0, 0, 0, 0, 55,
+  0, 45, 0, 4, 0, 0, 0, 8, 12, 0,
+  0, 16, 23, 16, 0, 8, 0, 0, 24, 20,
+  0, 0, 0, 0, 0, 0, 0, 0, 70, 10,
+  16, 0, 0, 0, 0, 27, 24, 0, 0, 57,
+  0, 13, 0, 13, 15, 76, 12, 31, 0, 45,
+  9, 26, 24, 0, 0, 11, 0, 0, 0, 0,
+  52, 56, 16, 0, 0, 0, 1, 0, 7, 24,
+  39, 91, 4, 0, 0, 0, 0, 0, 11, 0,
+  10, 0, 0, 35, 51, 0, 0, 0, 24, 66,
+  0, 49, 1, 0, 30, 0, 15, 0, 64, 0,
+  0, 7, 46, 41, 52, 60, 59, 47, 14, 4,
+  85, 0, 0, 29, 21, 32, 22, 9, 0, 19,
+  0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+  0, 0, 0, 54, 0, 32, 4, 0, 0, 16,
+  7, 12, 54, 37, 0, 0, 0, 0, 0, 0,
+  1, 0, 0, 0, 0, 0, 49, 0, 30, 0,
+  0, 0, 5, 29, 27, 0, 0, 9, 0, 21,
+  35, 23, 45, 0, 23, 22, 4, 26, 21, 30,
+  26, 0, 0, 24, 0, 19, 0, 0, 46, 43,
+  11, 0, 0, 0, 0, 0, 30, 1, 0, 44,
+  0, 0, 0, 16, 0, 0, 1, 3, 6, 0,
+  0, 0, 95, 0, 52, 0, 20, 0, 0, 44,
+  27, 0, 33, 0, 0, 0, 76, 0, 0, 1,
+  67, 69, 11, 51, 63, 32, 6, 0, 66, 0,
+  0, 38, 0, 0, 28, 40, 0, 0, 0, 0,
+  7, 0, 0, 0, 0, 27, 0, 47, 0, 0,
+  0, 20, 0, 38, 0, 0, 0, 16, 0, 34,
+  21, 7, 0, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 0, 0, 98, 0, 25, 5, 0, 0,
+  0, 78, 9, 0, 0, 35, 0, 0, 12, 5,
+  38, 41, 20, 53, 0, 44, 32, 14, 27, 37,
+  0, 13, 0, 0, 0, 0, 28, 63, 38, 0,
+  0, 0, 0, 0, 3, 36, 0, 61, 0, 0,
+  0, 5, 3, 0, 4, 0, 0, 0, 0, 0,
+  77, 0, 26, 0, 18, 21, 29, 0, 57, 0,
+  12, 30, 0, 0, 52, 0, 0, 2, 43, 101,
+  14, 0, 40, 0, 0, 0, 32, 66, 0, 35,
+  0, 0, 0, 29, 0, 8, 0, 0, 0, 11,
+  0, 0, 0, 50, 0, 48, 0, 31, 0, 0,
+  0, 0, 0, 0, 6, 9, 0, 67, 0, 0,
+  11, 0, 13, 40, 0, 0, 5, 7, 0, 44,
+  0, 15, 58, 0, 30, 45, 0, 14, 0, 32,
+  0, 0, 0, 10, 0, 27, 0, 3, 29, 32,
+  45, 49, 0, 64, 21, 0, 0, 14, 0, 0,
+  0, 0, 0, 0, 30, 78, 0, 0, 0, 0,
+  0, 18, 0, 23, 14, 57, 17, 0, 0, 0,
+  29, 0, 59, 1, 9, 2, 0, 17, 0, 0,
+  0, 0, 0, 41, 0, 41, 38, 0, 0, 0,
+  0, 0, 61, 6, 0, 16, 12, 19, 25, 54,
+  49, 37, 21, 5, 43, 0, 53, 32, 0, 0,
+  35, 21, 0, 0, 0, 0, 32, 0, 3, 0,
+  0, 0, 0, 35, 0, 0, 0, 27, 0, 26,
+  0, 0, 0, 15, 28, 3, 38, 9, 0, 0,
+  27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  56, 0, 5, 0, 0, 0, 1, 44, 11, 11,
+  0, 62, 0, 23, 13, 12, 56, 44, 1, 24,
+  0, 29, 27, 31, 52, 10, 0, 0, 12, 0,
+  0, 0, 11, 51, 42, 0, 0, 0, 0, 0,
+  41, 0, 0, 48, 5, 0, 0, 10, 0, 0,
+  7, 0, 0, 0, 0, 0, 47, 0, 21, 0,
+  1, 20, 52, 0, 43, 0, 22, 0, 0, 0,
+  29, 0, 0, 0, 38, 88, 0, 0, 38, 0,
+  13, 0, 33, 104, 68, 26, 0, 0, 8, 50,
+  0, 0, 0, 10, 0, 4, 0, 0, 0, 20,
+  0, 11, 1, 0, 0, 0, 0, 16, 0, 0,
+  0, 7, 0, 77, 0, 0, 52, 0, 26, 23,
+  6, 0, 25, 0, 0, 6, 24, 0, 92, 16,
+  18, 73, 0, 0, 0, 73, 0, 0, 0, 50,
+  0, 0, 0, 0, 11, 59, 10, 49, 0, 55,
+  10, 0, 0, 37, 0, 0, 5, 0, 13, 0,
+  23, 61, 29, 7, 1, 0, 19, 2, 0, 26,
+  0, 53, 0, 7, 0, 0, 0, 23, 69, 0,
+  1, 0, 0, 31, 0, 0, 4, 0, 0, 61,
+  44, 0, 0, 0, 25, 73, 0, 0, 7, 0,
+  0, 0, 26, 81, 0, 0, 48, 0, 0, 0,
+  40, 70, 0, 48, 0, 0, 0, 16, 0, 0,
+  0, 0, 0, 39, 0, 0, 0, 36, 0, 27,
+  0, 6, 0, 0, 20, 1, 0, 24, 22, 0,
+  0, 39, 0, 0, 0, 0, 10, 25, 0, 0,
+  31, 12, 0, 4, 0, 0, 87, 23, 22, 30,
+  0, 6, 0, 43, 7, 0, 0, 5, 0, 16,
+  0, 0, 0, 7, 9, 33, 0, 49, 1, 0,
+  0, 56, 0, 0, 0, 0, 0, 0, 17, 64,
+  6, 22, 16, 0, 10, 13, 0, 13, 8, 65,
+  0, 0, 0, 0, 0, 16, 82, 0, 8, 0,
+  12, 7, 0, 0, 0, 7, 4, 20, 0, 65,
+  0, 0, 34, 0, 36, 0, 61, 12, 0, 5,
+  44, 54, 61, 74, 64, 45, 0, 12, 72, 0,
+  0, 33, 31, 57, 17, 27, 0, 12, 0, 0,
+  29, 8, 17, 0, 0, 37, 0, 58, 0, 3,
+  0, 54, 0, 29, 24, 4, 0, 0, 35, 0,
+  43, 56, 0, 0, 7, 0, 0, 32, 0, 0,
+  0, 0, 0, 0, 70, 9, 41, 0, 0, 0,
+  0, 18, 51, 0, 0, 21, 0, 27, 40, 52,
+  13, 20, 40, 15, 0, 9, 25, 57, 3, 0,
+  0, 59, 0, 27, 0, 5, 69, 44, 0, 0,
+  0, 0, 2, 0, 12, 20, 36, 60, 0, 0,
+  0, 21, 0, 0, 0, 18, 24, 0, 0, 1,
+  134, 0, 38, 0, 44, 0, 0, 26, 42, 0,
+  40, 0, 0, 0, 68, 7, 0, 5, 43, 69,
+  21, 36, 59, 16, 3, 0, 30, 7, 16, 33,
+  0, 0, 32, 69, 0, 5, 0, 0, 0, 0,
+  0, 0, 0, 55, 0, 45, 0, 4, 0, 0,
+  0, 8, 12, 0, 0, 16, 23, 16, 0, 8,
+  0, 0, 24, 20, 0, 0, 0, 0, 0, 0,
+  0, 0, 70, 10, 16, 0, 0, 0, 0, 27,
+  24, 0, 0, 57, 0, 13, 0, 13, 15, 76,
+  12, 31, 0, 45, 9, 26, 24, 0, 0, 11,
+  0, 0, 0, 0, 52, 56, 16, 0, 0, 0,
+  1, 0, 7, 24, 39, 91, 4, 0, 0, 0,
+  0, 0, 11, 0, 10, 0, 0, 35, 51, 0,
+  0, 0, 24, 66, 70, 0, 17, 0, 20, 30,
+  0, 0, 12, 0, 0, 0, 2, 79, 18, 0,
+  26, 23, 6, 5, 29, 52, 17, 15, 0, 0,
+  8, 29, 0, 0, 0, 9, 0, 47, 0, 0,
+  7, 43, 0, 12, 0, 10, 0, 0, 5, 0,
+  16, 5, 10, 0, 24, 4, 0, 0, 15, 0,
+  23, 37, 5, 0, 30, 16, 31, 0, 0, 12,
+  69, 32, 32, 66, 0, 18, 10, 0, 25, 0,
+  0, 55, 11, 6, 0, 12, 0, 37, 48, 12,
+  31, 65, 0, 0, 0, 0, 0, 0, 29, 0,
+  0, 17, 57, 30, 0, 27, 0, 0, 0, 60,
+  0, 14, 29, 64, 0, 0, 0, 1, 7, 52,
+  58, 0, 0, 0, 0, 32, 0, 0, 0, 19,
+  23, 49, 0, 44, 27, 0, 33, 0, 0, 0,
+  76, 0, 0, 1, 67, 69, 11, 51, 63, 32,
+  6, 0, 66, 0, 0, 38, 0, 0, 28, 40,
+  0, 0, 0, 0, 7, 0, 0, 0, 0, 27,
+  0, 47, 0, 0, 0, 20, 0, 38, 0, 0,
+  0, 16, 0, 34, 21, 7, 0, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 0, 0, 98, 0,
+  25, 5, 0, 0, 0, 78, 9, 0, 0, 35,
+  0, 0, 12, 5, 38, 41, 20, 53, 0, 44,
+  32, 14, 27, 37, 0, 13, 0, 0, 0, 0,
+  28, 63, 38, 0, 0, 0, 0, 0, 3, 36,
+  0, 61, 0, 0, 0, 5, 3, 0, 4, 0,
+  0, 0, 0, 0, 77, 0, 26, 0, 18, 21,
+  29, 0, 57, 0, 12, 30, 0, 0, 52, 0,
+  0, 2, 43, 101, 14, 0, 40, 0, 0, 0,
+  32, 66, 0, 35, 0, 0, 0, 29, 0, 8,
+  0, 0, 0, 11, 0, 0, 0, 50, 0, 48,
+  0, 31, 0, 0, 0, 0, 0, 0, 6, 9,
+  0, 67, 0, 0, 11, 0, 13, 40, 0, 0,
+  5, 7, 0, 44, 0, 15, 58, 0, 30, 45,
+  0, 14, 0, 32, 0, 0, 0, 10, 0, 27,
+  0, 3, 29, 32, 45, 49, 0, 64, 21, 0,
+  0, 14, 0, 0, 0, 0, 0, 0, 30, 78,
+  0, 0, 0, 0, 0, 18, 0, 23, 14, 57,
+  17, 0, 0, 0, 29, 0, 59, 1, 9, 2,
+  0, 17, 0, 0, 0, 0, 0, 41, 0, 0,
+  0, 0, 31, 51, 0, 0, 37, 2, 0, 0,
+  4, 70, 43, 0, 24, 35, 0, 14, 56, 0,
+  0, 39, 0, 0, 9, 13, 0, 36, 0, 0,
+  0, 14, 0, 0, 0, 19, 0, 41, 0, 0,
+  0, 5, 3, 0, 4, 0, 0, 0, 23, 13,
+  20, 0, 0, 0, 18, 34, 0, 0, 4, 17,
+  0, 0, 0, 0, 21, 0, 0, 0, 0, 23,
+  10, 1, 39, 9, 0, 0, 1, 25, 3, 20,
+  0, 8, 17, 5, 38, 41, 32, 19, 10, 0,
+  6, 0, 0, 0, 0, 5, 45, 39, 4, 0,
+  0, 0, 0, 31, 0, 9, 12, 73, 0, 0,
+  0, 0, 2, 0, 65, 11, 0, 5, 37, 0,
+  20, 0, 0, 11, 0, 8, 52, 0, 43, 0,
+  22, 0, 0, 0, 29, 0, 0, 0, 38, 88,
+  0, 0, 38, 0, 13, 0, 33, 104, 68, 26,
+  0, 0, 8, 50, 0, 0, 0, 10, 0, 4,
+  0, 0, 0, 20, 0, 11, 1, 0, 0, 0,
+  0, 16, 0, 0, 0, 7, 0, 77, 0, 0,
+  52, 0, 26, 23, 6, 0, 25, 0, 0, 6,
+  24, 0, 92, 16, 18, 73, 0, 0, 0, 73,
+  0, 0, 0, 50, 0, 0, 0, 0, 11, 59,
+  10, 49, 0, 55, 10, 0, 0, 37, 0, 0,
+  5, 0, 13, 0, 23, 61, 29, 7, 1, 0,
+  19, 2, 0, 26, 0, 53, 0, 7, 0, 0,
+  0, 23, 69, 0, 1, 0, 0, 31, 0, 0,
+  4, 0, 0, 61, 44, 0, 0, 0, 25, 73,
+  0, 0, 7, 0, 0, 0, 26, 81, 0, 0,
+  48, 0, 0, 0, 40, 70, 0, 48, 0, 0,
+  0, 16, 0, 0, 0, 0, 0, 39, 0, 0,
+  0, 36, 0, 27, 0, 6, 0, 0, 20, 1,
+  0, 24, 22, 0, 0, 39, 0, 0, 0, 0,
+  10, 25, 0, 0, 31, 12, 0, 4, 0, 0,
+  87, 23, 22, 30, 0, 6, 0, 43, 7, 0,
+  0, 5, 0, 16, 0, 0, 0, 7, 9, 33,
+  0, 49, 1, 0, 0, 56, 0, 0, 0, 0,
+  0, 0, 17, 64, 6, 22, 16, 0, 10, 13,
+  0, 13, 8, 65, 0, 0, 0, 0, 0, 16,
+  82, 0, 8, 0, 12, 7, 0, 0, 0, 7,
+  4, 20, 0, 17, 0, 0, 21, 28, 30, 14,
+  58, 16, 0, 5, 32, 30, 51, 35, 42, 53,
+  0, 21, 81, 0, 0, 49, 7, 50, 21, 0,
+  0, 19, 0, 0, 2, 16, 18, 0, 0, 7,
+  0, 43, 0, 40, 0, 33, 27, 19, 0, 12,
+  0, 0, 23, 0, 84, 2, 0, 0, 0, 0,
+  0, 29, 0, 0, 0, 0, 0, 0, 33, 0,
+  0, 0, 0, 25, 18, 30, 44, 27, 0, 0,
+  0, 44, 47, 23, 14, 0, 26, 7, 56, 14,
+  51, 35, 8, 27, 0, 39, 0, 19, 0, 4,
+  43, 43, 0, 0, 0, 0, 0, 0, 8, 13,
+  9, 61, 0, 0, 0, 0, 12, 0, 28, 21,
+  21, 0, 50, 0, 111, 0, 14, 14, 3, 0,
+  0, 26, 42, 0, 40, 0, 0, 0, 68, 7,
+  0, 5, 43, 69, 21, 36, 59, 16, 3, 0,
+  30, 7, 16, 33, 0, 0, 32, 69, 0, 5,
+  0, 0, 0, 0, 0, 0, 0, 55, 0, 45,
+  0, 4, 0, 0, 0, 8, 12, 0, 0, 16,
+  23, 16, 0, 8, 0, 0, 24, 20, 0, 0,
+  0, 0, 0, 0, 0, 0, 70, 10, 16, 0,
+  0, 0, 0, 27, 24, 0, 0, 57, 0, 13,
+  0, 13, 15, 76, 12, 31, 0, 45, 9, 26,
+  24, 0, 0, 11, 0, 0, 0, 0, 52, 56,
+  16, 0, 0, 0, 1, 0, 7, 24, 39, 91,
+  4, 0, 0, 0, 0, 0, 11, 0, 10, 0,
+  0, 35, 51, 0, 0, 0, 24, 66, 70, 0,
+  17, 0, 20, 30, 0, 0, 12, 0, 0, 0,
+  2, 79, 18, 0, 26, 23, 6, 5, 29, 52,
+  17, 15, 0, 0, 8, 29, 0, 0, 0, 9,
+  0, 47, 0, 0, 7, 43, 0, 12, 0, 10,
+  0, 0, 5, 0, 16, 5, 10, 0, 24, 4,
+  0, 0, 15, 0, 23, 37, 5, 0, 30, 16,
+  31, 0, 0, 12, 69, 32, 32, 66, 0, 18,
+  10, 0, 25, 0, 0, 55, 11, 6, 0, 12,
+  0, 37, 48, 12, 31, 65, 0, 0, 0, 0,
+  0, 0, 29, 0, 0, 17, 57, 30, 0, 27,
+  0, 0, 0, 60, 0, 14, 29, 64, 0, 0,
+  0, 1, 7, 52, 58, 0, 0, 0, 0, 32,
+  0, 0, 0, 19, 23, 49, 22, 3, 0, 0,
+  24, 14, 0, 0, 31, 13, 0, 23, 0, 61,
+  30, 0, 16, 46, 7, 38, 53, 0, 0, 0,
+  7, 20, 37, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 9, 0, 0, 0, 0, 3, 0, 3,
+  12, 0, 13, 5, 0, 0, 57, 0, 3, 0,
+  0, 0, 27, 17, 0, 0, 5, 8, 37, 0,
+  0, 0, 19, 60, 0, 39, 0, 33, 30, 0,
+  37, 12, 0, 30, 0, 10, 5, 30, 0, 0,
+  41, 0, 71, 36, 0, 13, 0, 0, 4, 0,
+  18, 0, 0, 16, 44, 2, 0, 26, 0, 0,
+  0, 38, 5, 6, 19, 51, 0, 0, 0, 14,
+  43, 20, 37, 0, 0, 0, 39, 13, 0, 0,
+  0, 39, 17, 0, 29, 0, 57, 0, 12, 30,
+  0, 0, 52, 0, 0, 2, 43, 101, 14, 0,
+  40, 0, 0, 0, 32, 66, 0, 35, 0, 0,
+  0, 29, 0, 8, 0, 0, 0, 11, 0, 0,
+  0, 50, 0, 48, 0, 31, 0, 0, 0, 0,
+  0, 0, 6, 9, 0, 67, 0, 0, 11, 0,
+  13, 40, 0, 0, 5, 7, 0, 44, 0, 15,
+  58, 0, 30, 45, 0, 14, 0, 32, 0, 0,
+  0, 10, 0, 27, 0, 3, 29, 32, 45, 49,
+  0, 64, 21, 0, 0, 14, 0, 0, 0, 0,
+  0, 0, 30, 78, 0, 0, 0, 0, 0, 18,
+  0, 23, 14, 57, 17, 0, 0, 0, 29, 0,
+  59, 1, 9, 2, 0, 17, 0, 0, 0, 0,
+  0, 41, 0, 0, 0, 0, 31, 51, 0, 0,
+  37, 2, 0, 0, 4, 70, 43, 0, 24, 35,
+  0, 14, 56, 0, 0, 39, 0, 0, 9, 13,
+  0, 36, 0, 0, 0, 14, 0, 0, 0, 19,
+  0, 41, 0, 0, 0, 5, 3, 0, 4, 0,
+  0, 0, 23, 13, 20, 0, 0, 0, 18, 34,
+  0, 0, 4, 17, 0, 0, 0, 0, 21, 0,
+  0, 0, 0, 23, 10, 1, 39, 9, 0, 0,
+  1, 25, 3, 20, 0, 8, 17, 5, 38, 41,
+  32, 19, 10, 0, 6, 0, 0, 0, 0, 5,
+  45, 39, 4, 0, 0, 0, 0, 31, 0, 9,
+  12, 73, 0, 0, 0, 0, 2, 0, 65, 11,
+  0, 5, 37, 0, 20, 0, 0, 11, 0, 8,
+  0, 32, 0, 0, 31, 0, 19, 0, 50, 0,
+  0, 16, 7, 64, 58, 24, 16, 46, 0, 28,
+  76, 0, 0, 47, 16, 40, 25, 0, 0, 27,
+  0, 0, 0, 37, 5, 0, 0, 0, 0, 29,
+  0, 1, 0, 41, 21, 3, 4, 6, 0, 0,
+  60, 0, 56, 11, 0, 0, 8, 6, 0, 26,
+  13, 0, 0, 0, 0, 0, 17, 6, 0, 0,
+  0, 25, 0, 0, 41, 13, 0, 0, 0, 30,
+  48, 39, 12, 0, 31, 0, 58, 23, 37, 56,
+  3, 0, 8, 19, 0, 16, 0, 10, 57, 33,
+  0, 0, 0, 0, 0, 0, 23, 0, 31, 59,
+  0, 0, 0, 1, 24, 0, 21, 0, 8, 0,
+  47, 0, 77, 0, 1, 23, 9, 0, 44, 0,
+  0, 0, 25, 73, 0, 0, 7, 0, 0, 0,
+  26, 81, 0, 0, 48, 0, 0, 0, 40, 70,
+  0, 48, 0, 0, 0, 16, 0, 0, 0, 0,
+  0, 39, 0, 0, 0, 36, 0, 27, 0, 6,
+  0, 0, 20, 1, 0, 24, 22, 0, 0, 39,
+  0, 0, 0, 0, 10, 25, 0, 0, 31, 12,
+  0, 4, 0, 0, 87, 23, 22, 30, 0, 6,
+  0, 43, 7, 0, 0, 5, 0, 16, 0, 0,
+  0, 7, 9, 33, 0, 49, 1, 0, 0, 56,
+  0, 0, 0, 0, 0, 0, 17, 64, 6, 22,
+  16, 0, 10, 13, 0, 13, 8, 65, 0, 0,
+  0, 0, 0, 16, 82, 0, 8, 0, 12, 7,
+  0, 0, 0, 7, 4, 20, 0, 17, 0, 0,
+  21, 28, 30, 14, 58, 16, 0, 5, 32, 30,
+  51, 35, 42, 53, 0, 21, 81, 0, 0, 49,
+  7, 50, 21, 0, 0, 19, 0, 0, 2, 16,
+  18, 0, 0, 7, 0, 43, 0, 40, 0, 33,
+  27, 19, 0, 12, 0, 0, 23, 0, 84, 2,
+  0, 0, 0, 0, 0, 29, 0, 0, 0, 0,
+  0, 0, 33, 0, 0, 0, 0, 25, 18, 30,
+  44, 27, 0, 0, 0, 44, 47, 23, 14, 0,
+  26, 7, 56, 14, 51, 35, 8, 27, 0, 39,
+  0, 19, 0, 4, 43, 43, 0, 0, 0, 0,
+  0, 0, 8, 13, 9, 61, 0, 0, 0, 0,
+  12, 0, 28, 21, 21, 0, 50, 0, 111, 0,
+  14, 14, 3, 0, 0, 47, 23, 0, 8, 0,
+  33, 0, 55, 0, 0, 17, 28, 56, 45, 66,
+  49, 49, 0, 15, 78, 0, 0, 46, 13, 29,
+  27, 0, 0, 0, 14, 0, 11, 19, 4, 0,
+  0, 0, 0, 33, 12, 13, 0, 55, 6, 0,
+  0, 0, 0, 0, 63, 12, 64, 29, 0, 0,
+  0, 0, 0, 23, 0, 0, 0, 0, 0, 0,
+  42, 0, 0, 0, 0, 0, 0, 41, 36, 0,
+  0, 29, 0, 27, 65, 51, 36, 6, 50, 11,
+  55, 0, 58, 33, 0, 14, 0, 30, 0, 20,
+  0, 12, 43, 51, 0, 0, 0, 0, 0, 0,
+  5, 6, 14, 33, 30, 0, 0, 0, 41, 0,
+  0, 0, 5, 0, 0, 0, 81, 0, 6, 22,
+  17, 0, 70, 0, 17, 0, 20, 30, 0, 0,
+  12, 0, 0, 0, 2, 79, 18, 0, 26, 23,
+  6, 5, 29, 52, 17, 15, 0, 0, 8, 29,
+  0, 0, 0, 9, 0, 47, 0, 0, 7, 43,
+  0, 12, 0, 10, 0, 0, 5, 0, 16, 5,
+  10, 0, 24, 4, 0, 0, 15, 0, 23, 37,
+  5, 0, 30, 16, 31, 0, 0, 12, 69, 32,
+  32, 66, 0, 18, 10, 0, 25, 0, 0, 55,
+  11, 6, 0, 12, 0, 37, 48, 12, 31, 65,
+  0, 0, 0, 0, 0, 0, 29, 0, 0, 17,
+  57, 30, 0, 27, 0, 0, 0, 60, 0, 14,
+  29, 64, 0, 0, 0, 1, 7, 52, 58, 0,
+  0, 0, 0, 32, 0, 0, 0, 19, 23, 49,
+  22, 3, 0, 0, 24, 14, 0, 0, 31, 13,
+  0, 23, 0, 61, 30, 0, 16, 46, 7, 38,
+  53, 0, 0, 0, 7, 20, 37, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 9, 0, 0, 0,
+  0, 3, 0, 3, 12, 0, 13, 5, 0, 0,
+  57, 0, 3, 0, 0, 0, 27, 17, 0, 0,
+  5, 8, 37, 0, 0, 0, 19, 60, 0, 39,
+  0, 33, 30, 0, 37, 12, 0, 30, 0, 10,
+  5, 30, 0, 0, 41, 0, 71, 36, 0, 13,
+  0, 0, 4, 0, 18, 0, 0, 16, 44, 2,
+  0, 26, 0, 0, 0, 38, 5, 6, 19, 51,
+  0, 0, 0, 14, 43, 20, 37, 0, 0, 0,
+  39, 13, 0, 0, 0, 39, 17, 0, 19, 51,
+  0, 11, 63, 0, 36, 0, 33, 2, 0, 24,
+  2, 46, 28, 0, 6, 25, 11, 52, 60, 0,
+  0, 15, 21, 37, 39, 0, 0, 21, 42, 0,
+  0, 33, 0, 0, 0, 0, 0, 0, 0, 29,
+  0, 51, 23, 0, 7, 28, 0, 0, 51, 0,
+  37, 15, 0, 12, 5, 0, 0, 22, 16, 2,
+  15, 0, 0, 0, 4, 57, 0, 0, 0, 41,
+  5, 0, 60, 0, 19, 1, 4, 1, 52, 31,
+  4, 0, 58, 0, 51, 26, 21, 39, 0, 0,
+  0, 32, 0, 23, 0, 0, 55, 8, 0, 36,
+  1, 0, 0, 0, 14, 29, 63, 36, 0, 0,
+  0, 0, 46, 0, 12, 0, 4, 0, 35, 1,
+  40, 0, 0, 33, 0, 0, 0, 0, 0, 0,
+  31, 51, 0, 0, 37, 2, 0, 0, 4, 70,
+  43, 0, 24, 35, 0, 14, 56, 0, 0, 39,
+  0, 0, 9, 13, 0, 36, 0, 0, 0, 14,
+  0, 0, 0, 19, 0, 41, 0, 0, 0, 5,
+  3, 0, 4, 0, 0, 0, 23, 13, 20, 0,
+  0, 0, 18, 34, 0, 0, 4, 17, 0, 0,
+  0, 0, 21, 0, 0, 0, 0, 23, 10, 1,
+  39, 9, 0, 0, 1, 25, 3, 20, 0, 8,
+  17, 5, 38, 41, 32, 19, 10, 0, 6, 0,
+  0, 0, 0, 5, 45, 39, 4, 0, 0, 0,
+  0, 31, 0, 9, 12, 73, 0, 0, 0, 0,
+  2, 0, 65, 11, 0, 5, 37, 0, 20, 0,
+  0, 11, 0, 8, 0, 32, 0, 0, 31, 0,
+  19, 0, 50, 0, 0, 16, 7, 64, 58, 24,
+  16, 46, 0, 28, 76, 0, 0, 47, 16, 40,
+  25, 0, 0, 27, 0, 0, 0, 37, 5, 0,
+  0, 0, 0, 29, 0, 1, 0, 41, 21, 3,
+  4, 6, 0, 0, 60, 0, 56, 11, 0, 0,
+  8, 6, 0, 26, 13, 0, 0, 0, 0, 0,
+  17, 6, 0, 0, 0, 25, 0, 0, 41, 13,
+  0, 0, 0, 30, 48, 39, 12, 0, 31, 0,
+  58, 23, 37, 56, 3, 0, 8, 19, 0, 16,
+  0, 10, 57, 33, 0, 0, 0, 0, 0, 0,
+  23, 0, 31, 59, 0, 0, 0, 1, 24, 0,
+  21, 0, 8, 0, 47, 0, 77, 0, 1, 23,
+  9, 0, 0, 86, 6, 8, 42, 0, 32, 0,
+  64, 4, 0, 0, 6, 42, 74, 53, 38, 43,
+  0, 27, 68, 0, 0, 42, 0, 47, 25, 9,
+  0, 24, 6, 0, 0, 29, 9, 0, 0, 0,
+  0, 25, 0, 26, 0, 59, 9, 0, 0, 24,
+  0, 0, 45, 0, 88, 34, 0, 0, 0, 0,
+  0, 9, 6, 0, 0, 0, 0, 0, 36, 0,
+  0, 0, 0, 0, 0, 17, 64, 0, 2, 0,
+  1, 0, 91, 28, 8, 0, 51, 13, 35, 13,
+  47, 25, 0, 0, 0, 32, 0, 22, 0, 0,
+  48, 22, 0, 7, 0, 0, 23, 0, 25, 21,
+  43, 64, 10, 0, 0, 0, 29, 0, 0, 0,
+  18, 0, 4, 0, 74, 0, 0, 37, 25, 0,
+  0, 17, 0, 0, 21, 28, 30, 14, 58, 16,
+  0, 5, 32, 30, 51, 35, 42, 53, 0, 21,
+  81, 0, 0, 49, 7, 50, 21, 0, 0, 19,
+  0, 0, 2, 16, 18, 0, 0, 7, 0, 43,
+  0, 40, 0, 33, 27, 19, 0, 12, 0, 0,
+  23, 0, 84, 2, 0, 0, 0, 0, 0, 29,
+  0, 0, 0, 0, 0, 0, 33, 0, 0, 0,
+  0, 25, 18, 30, 44, 27, 0, 0, 0, 44,
+  47, 23, 14, 0, 26, 7, 56, 14, 51, 35,
+  8, 27, 0, 39, 0, 19, 0, 4, 43, 43,
+  0, 0, 0, 0, 0, 0, 8, 13, 9, 61,
+  0, 0, 0, 0, 12, 0, 28, 21, 21, 0,
+  50, 0, 111, 0, 14, 14, 3, 0, 0, 47,
+  23, 0, 8, 0, 33, 0, 55, 0, 0, 17,
+  28, 56, 45, 66, 49, 49, 0, 15, 78, 0,
+  0, 46, 13, 29, 27, 0, 0, 0, 14, 0,
+  11, 19, 4, 0, 0, 0, 0, 33, 12, 13,
+  0, 55, 6, 0, 0, 0, 0, 0, 63, 12,
+  64, 29, 0, 0, 0, 0, 0, 23, 0, 0,
+  0, 0, 0, 0, 42, 0, 0, 0, 0, 0,
+  0, 41, 36, 0, 0, 29, 0, 27, 65, 51,
+  36, 6, 50, 11, 55, 0, 58, 33, 0, 14,
+  0, 30, 0, 20, 0, 12, 43, 51, 0, 0,
+  0, 0, 0, 0, 5, 6, 14, 33, 30, 0,
+  0, 0, 41, 0, 0, 0, 5, 0, 0, 0,
+  81, 0, 6, 22, 17, 0, 0, 43, 70, 0,
+  11, 0, 9, 0, 57, 6, 0, 0, 0, 60,
+  23, 63, 30, 38, 0, 12, 39, 0, 33, 35,
+  0, 0, 9, 14, 0, 0, 27, 0, 0, 0,
+  0, 0, 0, 17, 0, 12, 27, 0, 0, 40,
+  0, 0, 0, 0, 0, 0, 48, 52, 41, 12,
+  0, 0, 19, 12, 0, 0, 0, 0, 0, 0,
+  24, 0, 45, 0, 11, 4, 0, 0, 0, 28,
+  32, 0, 0, 18, 0, 0, 58, 19, 0, 21,
+  59, 13, 23, 9, 64, 10, 0, 32, 0, 0,
+  0, 0, 0, 0, 40, 51, 0, 0, 0, 0,
+  36, 0, 0, 22, 4, 24, 40, 0, 0, 0,
+  86, 0, 2, 0, 26, 0, 0, 1, 21, 0,
+  0, 24, 22, 0, 22, 3, 0, 0, 24, 14,
+  0, 0, 31, 13, 0, 23, 0, 61, 30, 0,
+  16, 46, 7, 38, 53, 0, 0, 0, 7, 20,
+  37, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  9, 0, 0, 0, 0, 3, 0, 3, 12, 0,
+  13, 5, 0, 0, 57, 0, 3, 0, 0, 0,
+  27, 17, 0, 0, 5, 8, 37, 0, 0, 0,
+  19, 60, 0, 39, 0, 33, 30, 0, 37, 12,
+  0, 30, 0, 10, 5, 30, 0, 0, 41, 0,
+  71, 36, 0, 13, 0, 0, 4, 0, 18, 0,
+  0, 16, 44, 2, 0, 26, 0, 0, 0, 38,
+  5, 6, 19, 51, 0, 0, 0, 14, 43, 20,
+  37, 0, 0, 0, 39, 13, 0, 0, 0, 39,
+  17, 0, 19, 51, 0, 11, 63, 0, 36, 0,
+  33, 2, 0, 24, 2, 46, 28, 0, 6, 25,
+  11, 52, 60, 0, 0, 15, 21, 37, 39, 0,
+  0, 21, 42, 0, 0, 33, 0, 0, 0, 0,
+  0, 0, 0, 29, 0, 51, 23, 0, 7, 28,
+  0, 0, 51, 0, 37, 15, 0, 12, 5, 0,
+  0, 22, 16, 2, 15, 0, 0, 0, 4, 57,
+  0, 0, 0, 41, 5, 0, 60, 0, 19, 1,
+  4, 1, 52, 31, 4, 0, 58, 0, 51, 26,
+  21, 39, 0, 0, 0, 32, 0, 23, 0, 0,
+  55, 8, 0, 36, 1, 0, 0, 0, 14, 29,
+  63, 36, 0, 0, 0, 0, 46, 0, 12, 0,
+  4, 0, 35, 1, 40, 0, 0, 33, 0, 0,
+  0, 99, 0, 38, 55, 0, 74, 0, 47, 0,
+  0, 55, 43, 30, 27, 0, 3, 36, 0, 59,
+  80, 0, 0, 26, 36, 49, 32, 1, 0, 12,
+  51, 0, 22, 17, 3, 0, 0, 0, 0, 0,
+  0, 20, 0, 83, 20, 23, 0, 15, 0, 0,
+  26, 0, 67, 45, 0, 11, 23, 0, 0, 37,
+  22, 0, 0, 0, 0, 0, 14, 67, 0, 0,
+  0, 11, 0, 0, 67, 0, 16, 0, 7, 0,
+  80, 54, 0, 0, 42, 0, 37, 1, 24, 67,
+  6, 0, 0, 40, 0, 45, 0, 0, 77, 8,
+  0, 34, 3, 0, 0, 0, 25, 58, 103, 36,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 0,
+  21, 22, 80, 0, 38, 25, 8, 0, 0, 32,
+  0, 0, 31, 0, 19, 0, 50, 0, 0, 16,
+  7, 64, 58, 24, 16, 46, 0, 28, 76, 0,
+  0, 47, 16, 40, 25, 0, 0, 27, 0, 0,
+  0, 37, 5, 0, 0, 0, 0, 29, 0, 1,
+  0, 41, 21, 3, 4, 6, 0, 0, 60, 0,
+  56, 11, 0, 0, 8, 6, 0, 26, 13, 0,
+  0, 0, 0, 0, 17, 6, 0, 0, 0, 25,
+  0, 0, 41, 13, 0, 0, 0, 30, 48, 39,
+  12, 0, 31, 0, 58, 23, 37, 56, 3, 0,
+  8, 19, 0, 16, 0, 10, 57, 33, 0, 0,
+  0, 0, 0, 0, 23, 0, 31, 59, 0, 0,
+  0, 1, 24, 0, 21, 0, 8, 0, 47, 0,
+  77, 0, 1, 23, 9, 0, 0, 86, 6, 8,
+  42, 0, 32, 0, 64, 4, 0, 0, 6, 42,
+  74, 53, 38, 43, 0, 27, 68, 0, 0, 42,
+  0, 47, 25, 9, 0, 24, 6, 0, 0, 29,
+  9, 0, 0, 0, 0, 25, 0, 26, 0, 59,
+  9, 0, 0, 24, 0, 0, 45, 0, 88, 34,
+  0, 0, 0, 0, 0, 9, 6, 0, 0, 0,
+  0, 0, 36, 0, 0, 0, 0, 0, 0, 17,
+  64, 0, 2, 0, 1, 0, 91, 28, 8, 0,
+  51, 13, 35, 13, 47, 25, 0, 0, 0, 32,
+  0, 22, 0, 0, 48, 22, 0, 7, 0, 0,
+  23, 0, 25, 21, 43, 64, 10, 0, 0, 0,
+  29, 0, 0, 0, 18, 0, 4, 0, 74, 0,
+  0, 37, 25, 0, 0, 96, 8, 3, 33, 0,
+  35, 0, 85, 3, 0, 27, 4, 58, 40, 66,
+  33, 44, 0, 33, 67, 0, 11, 33, 0, 10,
+  35, 17, 0, 0, 0, 0, 16, 0, 0, 0,
+  0, 12, 0, 0, 0, 9, 0, 67, 0, 25,
+  0, 38, 0, 0, 28, 0, 77, 30, 0, 0,
+  25, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+  21, 0, 17, 0, 0, 0, 18, 29, 78, 0,
+  11, 0, 0, 0, 78, 36, 3, 0, 35, 3,
+  44, 7, 36, 20, 0, 27, 0, 26, 0, 8,
+  0, 0, 61, 33, 8, 16, 0, 0, 58, 0,
+  22, 29, 12, 37, 7, 0, 0, 0, 41, 0,
+  0, 0, 20, 0, 0, 0, 52, 0, 0, 31,
+  46, 0, 0, 47, 23, 0, 8, 0, 33, 0,
+  55, 0, 0, 17, 28, 56, 45, 66, 49, 49,
+  0, 15, 78, 0, 0, 46, 13, 29, 27, 0,
+  0, 0, 14, 0, 11, 19, 4, 0, 0, 0,
+  0, 33, 12, 13, 0, 55, 6, 0, 0, 0,
+  0, 0, 63, 12, 64, 29, 0, 0, 0, 0,
+  0, 23, 0, 0, 0, 0, 0, 0, 42, 0,
+  0, 0, 0, 0, 0, 41, 36, 0, 0, 29,
+  0, 27, 65, 51, 36, 6, 50, 11, 55, 0,
+  58, 33, 0, 14, 0, 30, 0, 20, 0, 12,
+  43, 51, 0, 0, 0, 0, 0, 0, 5, 6,
+  14, 33, 30, 0, 0, 0, 41, 0, 0, 0,
+  5, 0, 0, 0, 81, 0, 6, 22, 17, 0,
+  0, 43, 70, 0, 11, 0, 9, 0, 57, 6,
+  0, 0, 0, 60, 23, 63, 30, 38, 0, 12,
+  39, 0, 33, 35, 0, 0, 9, 14, 0, 0,
+  27, 0, 0, 0, 0, 0, 0, 17, 0, 12,
+  27, 0, 0, 40, 0, 0, 0, 0, 0, 0,
+  48, 52, 41, 12, 0, 0, 19, 12, 0, 0,
+  0, 0, 0, 0, 24, 0, 45, 0, 11, 4,
+  0, 0, 0, 28, 32, 0, 0, 18, 0, 0,
+  58, 19, 0, 21, 59, 13, 23, 9, 64, 10,
+  0, 32, 0, 0, 0, 0, 0, 0, 40, 51,
+  0, 0, 0, 0, 36, 0, 0, 22, 4, 24,
+  40, 0, 0, 0, 86, 0, 2, 0, 26, 0,
+  0, 1, 21, 0, 0, 24, 22, 0, 0, 1,
+  54, 0, 0, 0, 0, 0, 42, 0, 0, 7,
+  0, 86, 0, 0, 1, 43, 0, 15, 50, 15,
+  93, 16, 0, 0, 0, 18, 0, 0, 16, 0,
+  0, 0, 0, 0, 0, 25, 0, 0, 34, 33,
+  0, 35, 0, 0, 0, 17, 0, 0, 34, 96,
+  0, 0, 21, 0, 40, 0, 14, 0, 0, 2,
+  21, 0, 100, 23, 1, 3, 2, 71, 0, 0,
+  0, 0, 18, 0, 0, 0, 0, 0, 25, 5,
+  0, 25, 63, 0, 32, 16, 62, 0, 0, 28,
+  0, 0, 0, 0, 0, 0, 67, 44, 0, 0,
+  0, 0, 26, 0, 0, 29, 0, 5, 41, 0,
+  0, 0, 99, 0, 45, 0, 46, 0, 0, 13,
+  0, 0, 0, 6, 19, 0, 19, 51, 0, 11,
+  63, 0, 36, 0, 33, 2, 0, 24, 2, 46,
+  28, 0, 6, 25, 11, 52, 60, 0, 0, 15,
+  21, 37, 39, 0, 0, 21, 42, 0, 0, 33,
+  0, 0, 0, 0, 0, 0, 0, 29, 0, 51,
+  23, 0, 7, 28, 0, 0, 51, 0, 37, 15,
+  0, 12, 5, 0, 0, 22, 16, 2, 15, 0,
+  0, 0, 4, 57, 0, 0, 0, 41, 5, 0,
+  60, 0, 19, 1, 4, 1, 52, 31, 4, 0,
+  58, 0, 51, 26, 21, 39, 0, 0, 0, 32,
+  0, 23, 0, 0, 55, 8, 0, 36, 1, 0,
+  0, 0, 14, 29, 63, 36, 0, 0, 0, 0,
+  46, 0, 12, 0, 4, 0, 35, 1, 40, 0,
+  0, 33, 0, 0, 0, 99, 0, 38, 55, 0,
+  74, 0, 47, 0, 0, 55, 43, 30, 27, 0,
+  3, 36, 0, 59, 80, 0, 0, 26, 36, 49,
+  32, 1, 0, 12, 51, 0, 22, 17, 3, 0,
+  0, 0, 0, 0, 0, 20, 0, 83, 20, 23,
+  0, 15, 0, 0, 26, 0, 67, 45, 0, 11,
+  23, 0, 0, 37, 22, 0, 0, 0, 0, 0,
+  14, 67, 0, 0, 0, 11, 0, 0, 67, 0,
+  16, 0, 7, 0, 80, 54, 0, 0, 42, 0,
+  37, 1, 24, 67, 6, 0, 0, 40, 0, 45,
+  0, 0, 77, 8, 0, 34, 3, 0, 0, 0,
+  25, 58, 103, 36, 0, 0, 0, 0, 32, 0,
+  0, 0, 0, 0, 21, 22, 80, 0, 38, 25,
+  8, 0, 0, 129, 0, 59, 30, 0, 80, 0,
+  63, 0, 2, 62, 41, 13, 24, 8, 0, 36,
+  0, 50, 73, 0, 0, 34, 40, 69, 39, 5,
+  0, 13, 44, 0, 63, 0, 17, 0, 0, 0,
+  0, 0, 0, 30, 0, 55, 31, 26, 0, 15,
+  0, 0, 34, 0, 63, 66, 0, 6, 53, 0,
+  0, 76, 13, 0, 0, 0, 0, 0, 32, 81,
+  0, 0, 0, 20, 0, 0, 48, 49, 0, 0,
+  0, 0, 65, 72, 1, 0, 21, 0, 34, 0,
+  17, 106, 73, 0, 0, 66, 0, 33, 16, 0,
+  73, 22, 0, 27, 0, 0, 0, 0, 17, 70,
+  123, 31, 8, 0, 18, 0, 19, 0, 0, 0,
+  0, 0, 16, 21, 113, 10, 49, 16, 11, 0,
+  0, 86, 6, 8, 42, 0, 32, 0, 64, 4,
+  0, 0, 6, 42, 74, 53, 38, 43, 0, 27,
+  68, 0, 0, 42, 0, 47, 25, 9, 0, 24,
+  6, 0, 0, 29, 9, 0, 0, 0, 0, 25,
+  0, 26, 0, 59, 9, 0, 0, 24, 0, 0,
+  45, 0, 88, 34, 0, 0, 0, 0, 0, 9,
+  6, 0, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 0, 0, 17, 64, 0, 2, 0, 1, 0,
+  91, 28, 8, 0, 51, 13, 35, 13, 47, 25,
+  0, 0, 0, 32, 0, 22, 0, 0, 48, 22,
+  0, 7, 0, 0, 23, 0, 25, 21, 43, 64,
+  10, 0, 0, 0, 29, 0, 0, 0, 18, 0,
+  4, 0, 74, 0, 0, 37, 25, 0, 0, 96,
+  8, 3, 33, 0, 35, 0, 85, 3, 0, 27,
+  4, 58, 40, 66, 33, 44, 0, 33, 67, 0,
+  11, 33, 0, 10, 35, 17, 0, 0, 0, 0,
+  16, 0, 0, 0, 0, 12, 0, 0, 0, 9,
+  0, 67, 0, 25, 0, 38, 0, 0, 28, 0,
+  77, 30, 0, 0, 25, 0, 0, 0, 0, 0,
+  0, 0, 2, 0, 21, 0, 17, 0, 0, 0,
+  18, 29, 78, 0, 11, 0, 0, 0, 78, 36,
+  3, 0, 35, 3, 44, 7, 36, 20, 0, 27,
+  0, 26, 0, 8, 0, 0, 61, 33, 8, 16,
+  0, 0, 58, 0, 22, 29, 12, 37, 7, 0,
+  0, 0, 41, 0, 0, 0, 20, 0, 0, 0,
+  52, 0, 0, 31, 46, 0, 0, 50, 11, 21,
+  17, 0, 0, 0, 67, 0, 0, 42, 4, 106,
+  9, 17, 15, 45, 0, 24, 71, 0, 40, 19,
+  0, 0, 0, 3, 0, 0, 0, 0, 0, 10,
+  0, 0, 0, 0, 0, 0, 4, 19, 0, 50,
+  0, 0, 0, 45, 0, 0, 34, 65, 36, 45,
+  0, 0, 44, 0, 0, 0, 0, 0, 7, 0,
+  60, 7, 0, 7, 12, 15, 0, 0, 10, 2,
+  40, 0, 0, 0, 0, 1, 42, 35, 2, 0,
+  21, 0, 58, 15, 51, 12, 0, 30, 0, 0,
+  0, 9, 0, 0, 58, 45, 6, 2, 0, 0,
+  16, 0, 0, 13, 0, 3, 7, 0, 0, 0,
+  80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 4, 12, 0, 0, 43, 70, 0, 11, 0,
+  9, 0, 57, 6, 0, 0, 0, 60, 23, 63,
+  30, 38, 0, 12, 39, 0, 33, 35, 0, 0,
+  9, 14, 0, 0, 27, 0, 0, 0, 0, 0,
+  0, 17, 0, 12, 27, 0, 0, 40, 0, 0,
+  0, 0, 0, 0, 48, 52, 41, 12, 0, 0,
+  19, 12, 0, 0, 0, 0, 0, 0, 24, 0,
+  45, 0, 11, 4, 0, 0, 0, 28, 32, 0,
+  0, 18, 0, 0, 58, 19, 0, 21, 59, 13,
+  23, 9, 64, 10, 0, 32, 0, 0, 0, 0,
+  0, 0, 40, 51, 0, 0, 0, 0, 36, 0,
+  0, 22, 4, 24, 40, 0, 0, 0, 86, 0,
+  2, 0, 26, 0, 0, 1, 21, 0, 0, 24,
+  22, 0, 0, 1, 54, 0, 0, 0, 0, 0,
+  42, 0, 0, 7, 0, 86, 0, 0, 1, 43,
+  0, 15, 50, 15, 93, 16, 0, 0, 0, 18,
+  0, 0, 16, 0, 0, 0, 0, 0, 0, 25,
+  0, 0, 34, 33, 0, 35, 0, 0, 0, 17,
+  0, 0, 34, 96, 0, 0, 21, 0, 40, 0,
+  14, 0, 0, 2, 21, 0, 100, 23, 1, 3,
+  2, 71, 0, 0, 0, 0, 18, 0, 0, 0,
+  0, 0, 25, 5, 0, 25, 63, 0, 32, 16,
+  62, 0, 0, 28, 0, 0, 0, 0, 0, 0,
+  67, 44, 0, 0, 0, 0, 26, 0, 0, 29,
+  0, 5, 41, 0, 0, 0, 99, 0, 45, 0,
+  46, 0, 0, 13, 0, 0, 0, 6, 19, 0,
+  16, 0, 16, 11, 0, 0, 0, 0, 35, 0,
+  0, 25, 4, 106, 0, 0, 0, 36, 2, 10,
+  68, 10, 49, 2, 0, 0, 0, 0, 0, 0,
+  0, 2, 0, 9, 0, 0, 0, 0, 0, 0,
+  5, 41, 0, 45, 0, 0, 0, 31, 0, 0,
+  66, 127, 0, 42, 14, 0, 16, 0, 2, 0,
+  0, 0, 48, 0, 110, 32, 0, 9, 0, 60,
+  0, 11, 0, 0, 22, 0, 0, 0, 0, 41,
+  18, 32, 0, 0, 51, 0, 58, 18, 81, 0,
+  0, 0, 0, 0, 0, 12, 11, 0, 73, 49,
+  0, 0, 0, 0, 6, 0, 0, 8, 11, 0,
+  36, 0, 0, 0, 95, 0, 70, 0, 20, 0,
+  1, 0, 0, 0, 8, 0, 11, 0, 0, 99,
+  0, 38, 55, 0, 74, 0, 47, 0, 0, 55,
+  43, 30, 27, 0, 3, 36, 0, 59, 80, 0,
+  0, 26, 36, 49, 32, 1, 0, 12, 51, 0,
+  22, 17, 3, 0, 0, 0, 0, 0, 0, 20,
+  0, 83, 20, 23, 0, 15, 0, 0, 26, 0,
+  67, 45, 0, 11, 23, 0, 0, 37, 22, 0,
+  0, 0, 0, 0, 14, 67, 0, 0, 0, 11,
+  0, 0, 67, 0, 16, 0, 7, 0, 80, 54,
+  0, 0, 42, 0, 37, 1, 24, 67, 6, 0,
+  0, 40, 0, 45, 0, 0, 77, 8, 0, 34,
+  3, 0, 0, 0, 25, 58, 103, 36, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 0, 21, 22,
+  80, 0, 38, 25, 8, 0, 0, 129, 0, 59,
+  30, 0, 80, 0, 63, 0, 2, 62, 41, 13,
+  24, 8, 0, 36, 0, 50, 73, 0, 0, 34,
+  40, 69, 39, 5, 0, 13, 44, 0, 63, 0,
+  17, 0, 0, 0, 0, 0, 0, 30, 0, 55,
+  31, 26, 0, 15, 0, 0, 34, 0, 63, 66,
+  0, 6, 53, 0, 0, 76, 13, 0, 0, 0,
+  0, 0, 32, 81, 0, 0, 0, 20, 0, 0,
+  48, 49, 0, 0, 0, 0, 65, 72, 1, 0,
+  21, 0, 34, 0, 17, 106, 73, 0, 0, 66,
+  0, 33, 16, 0, 73, 22, 0, 27, 0, 0,
+  0, 0, 17, 70, 123, 31, 8, 0, 18, 0,
+  19, 0, 0, 0, 0, 0, 16, 21, 113, 10,
+  49, 16, 11, 0, 4, 112, 0, 54, 23, 0,
+  15, 0, 85, 7, 0, 53, 5, 3, 0, 0,
+  0, 18, 0, 13, 49, 0, 0, 31, 10, 11,
+  45, 17, 0, 0, 0, 9, 32, 0, 23, 0,
+  0, 18, 0, 0, 0, 0, 0, 18, 25, 27,
+  0, 0, 0, 0, 33, 14, 7, 64, 44, 38,
+  45, 0, 0, 10, 0, 11, 7, 12, 0, 7,
+  17, 45, 0, 29, 0, 13, 26, 0, 1, 55,
+  0, 8, 5, 0, 20, 44, 16, 23, 0, 0,
+  15, 29, 38, 55, 93, 0, 0, 17, 0, 0,
+  52, 0, 35, 52, 0, 80, 0, 0, 0, 0,
+  0, 84, 112, 0, 31, 0, 15, 3, 1, 0,
+  0, 0, 0, 0, 3, 0, 28, 0, 45, 32,
+  0, 0, 0, 96, 8, 3, 33, 0, 35, 0,
+  85, 3, 0, 27, 4, 58, 40, 66, 33, 44,
+  0, 33, 67, 0, 11, 33, 0, 10, 35, 17,
+  0, 0, 0, 0, 16, 0, 0, 0, 0, 12,
+  0, 0, 0, 9, 0, 67, 0, 25, 0, 38,
+  0, 0, 28, 0, 77, 30, 0, 0, 25, 0,
+  0, 0, 0, 0, 0, 0, 2, 0, 21, 0,
+  17, 0, 0, 0, 18, 29, 78, 0, 11, 0,
+  0, 0, 78, 36, 3, 0, 35, 3, 44, 7,
+  36, 20, 0, 27, 0, 26, 0, 8, 0, 0,
+  61, 33, 8, 16, 0, 0, 58, 0, 22, 29,
+  12, 37, 7, 0, 0, 0, 41, 0, 0, 0,
+  20, 0, 0, 0, 52, 0, 0, 31, 46, 0,
+  0, 50, 11, 21, 17, 0, 0, 0, 67, 0,
+  0, 42, 4, 106, 9, 17, 15, 45, 0, 24,
+  71, 0, 40, 19, 0, 0, 0, 3, 0, 0,
+  0, 0, 0, 10, 0, 0, 0, 0, 0, 0,
+  4, 19, 0, 50, 0, 0, 0, 45, 0, 0,
+  34, 65, 36, 45, 0, 0, 44, 0, 0, 0,
+  0, 0, 7, 0, 60, 7, 0, 7, 12, 15,
+  0, 0, 10, 2, 40, 0, 0, 0, 0, 1,
+  42, 35, 2, 0, 21, 0, 58, 15, 51, 12,
+  0, 30, 0, 0, 0, 9, 0, 0, 58, 45,
+  6, 2, 0, 0, 16, 0, 0, 13, 0, 3,
+  7, 0, 0, 0, 80, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 4, 12, 0, 20, 58,
+  19, 29, 24, 0, 0, 0, 79, 0, 0, 44,
+  19, 100, 0, 0, 0, 11, 0, 4, 57, 0,
+  28, 24, 0, 0, 2, 0, 0, 3, 5, 0,
+  0, 6, 0, 0, 0, 0, 0, 0, 0, 34,
+  0, 24, 0, 0, 6, 41, 0, 0, 50, 104,
+  10, 72, 18, 0, 43, 0, 5, 0, 0, 0,
+  14, 0, 25, 49, 0, 0, 0, 41, 0, 14,
+  1, 0, 14, 2, 0, 0, 0, 33, 14, 52,
+  21, 0, 21, 0, 41, 46, 70, 27, 15, 0,
+  0, 0, 0, 6, 30, 0, 57, 63, 0, 18,
+  0, 0, 0, 0, 0, 23, 55, 0, 32, 0,
+  0, 0, 90, 0, 14, 0, 0, 0, 5, 1,
+  0, 0, 20, 7, 0, 0, 0, 1, 54, 0,
+  0, 0, 0, 0, 42, 0, 0, 7, 0, 86,
+  0, 0, 1, 43, 0, 15, 50, 15, 93, 16,
+  0, 0, 0, 18, 0, 0, 16, 0, 0, 0,
+  0, 0, 0, 25, 0, 0, 34, 33, 0, 35,
+  0, 0, 0, 17, 0, 0, 34, 96, 0, 0,
+  21, 0, 40, 0, 14, 0, 0, 2, 21, 0,
+  100, 23, 1, 3, 2, 71, 0, 0, 0, 0,
+  18, 0, 0, 0, 0, 0, 25, 5, 0, 25,
+  63, 0, 32, 16, 62, 0, 0, 28, 0, 0,
+  0, 0, 0, 0, 67, 44, 0, 0, 0, 0,
+  26, 0, 0, 29, 0, 5, 41, 0, 0, 0,
+  99, 0, 45, 0, 46, 0, 0, 13, 0, 0,
+  0, 6, 19, 0, 16, 0, 16, 11, 0, 0,
+  0, 0, 35, 0, 0, 25, 4, 106, 0, 0,
+  0, 36, 2, 10, 68, 10, 49, 2, 0, 0,
+  0, 0, 0, 0, 0, 2, 0, 9, 0, 0,
+  0, 0, 0, 0, 5, 41, 0, 45, 0, 0,
+  0, 31, 0, 0, 66, 127, 0, 42, 14, 0,
+  16, 0, 2, 0, 0, 0, 48, 0, 110, 32,
+  0, 9, 0, 60, 0, 11, 0, 0, 22, 0,
+  0, 0, 0, 41, 18, 32, 0, 0, 51, 0,
+  58, 18, 81, 0, 0, 0, 0, 0, 0, 12,
+  11, 0, 73, 49, 0, 0, 0, 0, 6, 0,
+  0, 8, 11, 0, 36, 0, 0, 0, 95, 0,
+  70, 0, 20, 0, 1, 0, 0, 0, 8, 0,
+  11, 0, 7, 17, 0, 25, 21, 11, 0, 0,
+  61, 0, 0, 19, 7, 87, 0, 0, 0, 20,
+  13, 16, 69, 0, 0, 19, 0, 0, 0, 0,
+  0, 18, 0, 0, 0, 6, 0, 0, 0, 0,
+  0, 0, 0, 18, 0, 55, 0, 0, 10, 38,
+  0, 0, 71, 103, 0, 69, 0, 0, 31, 9,
+  0, 0, 0, 0, 4, 0, 42, 20, 0, 14,
+  0, 7, 0, 2, 0, 0, 39, 0, 0, 0,
+  0, 43, 31, 45, 9, 0, 36, 0, 50, 45,
+  79, 24, 11, 1, 0, 0, 0, 13, 32, 0,
+  65, 65, 1, 23, 0, 0, 0, 0, 0, 13,
+  64, 0, 7, 0, 0, 0, 59, 0, 45, 0,
+  6, 0, 45, 0, 40, 0, 47, 0, 8, 0,
+  0, 129, 0, 59, 30, 0, 80, 0, 63, 0,
+  2, 62, 41, 13, 24, 8, 0, 36, 0, 50,
+  73, 0, 0, 34, 40, 69, 39, 5, 0, 13,
+  44, 0, 63, 0, 17, 0, 0, 0, 0, 0,
+  0, 30, 0, 55, 31, 26, 0, 15, 0, 0,
+  34, 0, 63, 66, 0, 6, 53, 0, 0, 76,
+  13, 0, 0, 0, 0, 0, 32, 81, 0, 0,
+  0, 20, 0, 0, 48, 49, 0, 0, 0, 0,
+  65, 72, 1, 0, 21, 0, 34, 0, 17, 106,
+  73, 0, 0, 66, 0, 33, 16, 0, 73, 22,
+  0, 27, 0, 0, 0, 0, 17, 70, 123, 31,
+  8, 0, 18, 0, 19, 0, 0, 0, 0, 0,
+  16, 21, 113, 10, 49, 16, 11, 0, 4, 112,
+  0, 54, 23, 0, 15, 0, 85, 7, 0, 53,
+  5, 3, 0, 0, 0, 18, 0, 13, 49, 0,
+  0, 31, 10, 11, 45, 17, 0, 0, 0, 9,
+  32, 0, 23, 0, 0, 18, 0, 0, 0, 0,
+  0, 18, 25, 27, 0, 0, 0, 0, 33, 14,
+  7, 64, 44, 38, 45, 0, 0, 10, 0, 11,
+  7, 12, 0, 7, 17, 45, 0, 29, 0, 13,
+  26, 0, 1, 55, 0, 8, 5, 0, 20, 44,
+  16, 23, 0, 0, 15, 29, 38, 55, 93, 0,
+  0, 17, 0, 0, 52, 0, 35, 52, 0, 80,
+  0, 0, 0, 0, 0, 84, 112, 0, 31, 0,
+  15, 3, 1, 0, 0, 0, 0, 0, 3, 0,
+  28, 0, 45, 32, 0, 0, 29, 57, 0, 24,
+  0, 27, 0, 0, 42, 0, 0, 31, 0, 13,
+  0, 0, 0, 38, 15, 0, 3, 20, 0, 0,
+  0, 0, 2, 0, 0, 0, 0, 33, 0, 0,
+  0, 22, 12, 36, 5, 0, 22, 0, 25, 16,
+  5, 0, 6, 0, 0, 0, 0, 74, 0, 26,
+  125, 100, 30, 22, 18, 0, 0, 43, 75, 37,
+  102, 36, 0, 20, 0, 109, 123, 3, 27, 0,
+  0, 17, 0, 0, 34, 0, 0, 1, 35, 33,
+  3, 0, 0, 8, 62, 0, 21, 30, 0, 0,
+  38, 0, 43, 0, 9, 59, 0, 117, 0, 0,
+  0, 0, 0, 80, 21, 0, 14, 0, 0, 24,
+  0, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  32, 35, 0, 0, 0, 50, 11, 21, 17, 0,
+  0, 0, 67, 0, 0, 42, 4, 106, 9, 17,
+  15, 45, 0, 24, 71, 0, 40, 19, 0, 0,
+  0, 3, 0, 0, 0, 0, 0, 10, 0, 0,
+  0, 0, 0, 0, 4, 19, 0, 50, 0, 0,
+  0, 45, 0, 0, 34, 65, 36, 45, 0, 0,
+  44, 0, 0, 0, 0, 0, 7, 0, 60, 7,
+  0, 7, 12, 15, 0, 0, 10, 2, 40, 0,
+  0, 0, 0, 1, 42, 35, 2, 0, 21, 0,
+  58, 15, 51, 12, 0, 30, 0, 0, 0, 9,
+  0, 0, 58, 45, 6, 2, 0, 0, 16, 0,
+  0, 13, 0, 3, 7, 0, 0, 0, 80, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
+  12, 0, 20, 58, 19, 29, 24, 0, 0, 0,
+  79, 0, 0, 44, 19, 100, 0, 0, 0, 11,
+  0, 4, 57, 0, 28, 24, 0, 0, 2, 0,
+  0, 3, 5, 0, 0, 6, 0, 0, 0, 0,
+  0, 0, 0, 34, 0, 24, 0, 0, 6, 41,
+  0, 0, 50, 104, 10, 72, 18, 0, 43, 0,
+  5, 0, 0, 0, 14, 0, 25, 49, 0, 0,
+  0, 41, 0, 14, 1, 0, 14, 2, 0, 0,
+  0, 33, 14, 52, 21, 0, 21, 0, 41, 46,
+  70, 27, 15, 0, 0, 0, 0, 6, 30, 0,
+  57, 63, 0, 18, 0, 0, 0, 0, 0, 23,
+  55, 0, 32, 0, 0, 0, 90, 0, 14, 0,
+  0, 0, 5, 1, 0, 0, 20, 7, 0, 0,
+  56, 103, 0, 45, 15, 0, 0, 0, 58, 0,
+  0, 52, 30, 60, 0, 0, 0, 11, 22, 8,
+  26, 0, 0, 48, 0, 0, 58, 0, 0, 0,
+  19, 13, 0, 0, 3, 0, 0, 0, 0, 0,
+  0, 0, 0, 14, 26, 11, 2, 0, 0, 0,
+  23, 83, 1, 41, 67, 0, 39, 3, 0, 0,
+  0, 31, 34, 12, 4, 15, 0, 13, 0, 63,
+  0, 12, 10, 0, 0, 36, 0, 0, 33, 0,
+  0, 39, 30, 13, 0, 0, 19, 60, 73, 69,
+  93, 0, 0, 0, 0, 0, 59, 0, 21, 68,
+  23, 82, 0, 0, 0, 0, 0, 52, 129, 3,
+  21, 0, 0, 7, 40, 0, 0, 0, 3, 0,
+  26, 0, 14, 0, 57, 39, 0, 0, 16, 0,
+  16, 11, 0, 0, 0, 0, 35, 0, 0, 25,
+  4, 106, 0, 0, 0, 36, 2, 10, 68, 10,
+  49, 2, 0, 0, 0, 0, 0, 0, 0, 2,
+  0, 9, 0, 0, 0, 0, 0, 0, 5, 41,
+  0, 45, 0, 0, 0, 31, 0, 0, 66, 127,
+  0, 42, 14, 0, 16, 0, 2, 0, 0, 0,
+  48, 0, 110, 32, 0, 9, 0, 60, 0, 11,
+  0, 0, 22, 0, 0, 0, 0, 41, 18, 32,
+  0, 0, 51, 0, 58, 18, 81, 0, 0, 0,
+  0, 0, 0, 12, 11, 0, 73, 49, 0, 0,
+  0, 0, 6, 0, 0, 8, 11, 0, 36, 0,
+  0, 0, 95, 0, 70, 0, 20, 0, 1, 0,
+  0, 0, 8, 0, 11, 0, 7, 17, 0, 25,
+  21, 11, 0, 0, 61, 0, 0, 19, 7, 87,
+  0, 0, 0, 20, 13, 16, 69, 0, 0, 19,
+  0, 0, 0, 0, 0, 18, 0, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 18, 0, 55,
+  0, 0, 10, 38, 0, 0, 71, 103, 0, 69,
+  0, 0, 31, 9, 0, 0, 0, 0, 4, 0,
+  42, 20, 0, 14, 0, 7, 0, 2, 0, 0,
+  39, 0, 0, 0, 0, 43, 31, 45, 9, 0,
+  36, 0, 50, 45, 79, 24, 11, 1, 0, 0,
+  0, 13, 32, 0, 65, 65, 1, 23, 0, 0,
+  0, 0, 0, 13, 64, 0, 7, 0, 0, 0,
+  59, 0, 45, 0, 6, 0, 45, 0, 40, 0,
+  47, 0, 8, 0, 0, 108, 0, 50, 20, 0,
+  23, 0, 76, 0, 5, 27, 31, 30, 12, 0,
+  0, 17, 12, 30, 55, 0, 0, 56, 13, 61,
+  39, 0, 0, 26, 15, 0, 27, 4, 0, 0,
+  0, 0, 0, 5, 0, 21, 0, 47, 11, 0,
+  10, 19, 0, 0, 54, 49, 57, 86, 0, 0,
+  20, 0, 0, 49, 9, 0, 0, 0, 0, 0,
+  32, 13, 0, 0, 0, 12, 0, 0, 51, 32,
+  0, 0, 0, 19, 65, 67, 24, 0, 19, 0,
+  39, 50, 52, 88, 74, 0, 0, 18, 0, 13,
+  42, 0, 60, 63, 11, 32, 0, 0, 0, 0,
+  14, 25, 123, 40, 2, 0, 0, 0, 13, 0,
+  5, 0, 0, 0, 42, 3, 144, 0, 86, 0,
+  0, 0, 4, 112, 0, 54, 23, 0, 15, 0,
+  85, 7, 0, 53, 5, 3, 0, 0, 0, 18,
+  0, 13, 49, 0, 0, 31, 10, 11, 45, 17,
+  0, 0, 0, 9, 32, 0, 23, 0, 0, 18,
+  0, 0, 0, 0, 0, 18, 25, 27, 0, 0,
+  0, 0, 33, 14, 7, 64, 44, 38, 45, 0,
+  0, 10, 0, 11, 7, 12, 0, 7, 17, 45,
+  0, 29, 0, 13, 26, 0, 1, 55, 0, 8,
+  5, 0, 20, 44, 16, 23, 0, 0, 15, 29,
+  38, 55, 93, 0, 0, 17, 0, 0, 52, 0,
+  35, 52, 0, 80, 0, 0, 0, 0, 0, 84,
+  112, 0, 31, 0, 15, 3, 1, 0, 0, 0,
+  0, 0, 3, 0, 28, 0, 45, 32, 0, 0,
+  29, 57, 0, 24, 0, 27, 0, 0, 42, 0,
+  0, 31, 0, 13, 0, 0, 0, 38, 15, 0,
+  3, 20, 0, 0, 0, 0, 2, 0, 0, 0,
+  0, 33, 0, 0, 0, 22, 12, 36, 5, 0,
+  22, 0, 25, 16, 5, 0, 6, 0, 0, 0,
+  0, 74, 0, 26, 125, 100, 30, 22, 18, 0,
+  0, 43, 75, 37, 102, 36, 0, 20, 0, 109,
+  123, 3, 27, 0, 0, 17, 0, 0, 34, 0,
+  0, 1, 35, 33, 3, 0, 0, 8, 62, 0,
+  21, 30, 0, 0, 38, 0, 43, 0, 9, 59,
+  0, 117, 0, 0, 0, 0, 0, 80, 21, 0,
+  14, 0, 0, 24, 0, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 32, 35, 0, 0, 10, 25,
+  0, 0, 0, 85, 0, 0, 22, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 3, 8, 0, 40,
+  0, 0, 0, 0, 8, 3, 0, 0, 0, 38,
+  0, 0, 0, 43, 47, 68, 23, 0, 46, 0,
+  22, 15, 0, 13, 59, 13, 0, 0, 0, 55,
+  0, 0, 112, 118, 34, 26, 48, 0, 0, 57,
+  67, 0, 179, 5, 0, 32, 0, 139, 175, 0,
+  10, 15, 0, 0, 0, 0, 42, 0, 0, 0,
+  28, 19, 31, 0, 0, 11, 42, 0, 0, 116,
+  13, 0, 34, 0, 0, 0, 6, 54, 43, 142,
+  0, 0, 0, 0, 0, 58, 0, 0, 0, 29,
+  0, 30, 0, 10, 0, 0, 53, 0, 0, 0,
+  0, 0, 1, 29, 1, 6, 20, 58, 19, 29,
+  24, 0, 0, 0, 79, 0, 0, 44, 19, 100,
+  0, 0, 0, 11, 0, 4, 57, 0, 28, 24,
+  0, 0, 2, 0, 0, 3, 5, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 34, 0, 24,
+  0, 0, 6, 41, 0, 0, 50, 104, 10, 72,
+  18, 0, 43, 0, 5, 0, 0, 0, 14, 0,
+  25, 49, 0, 0, 0, 41, 0, 14, 1, 0,
+  14, 2, 0, 0, 0, 33, 14, 52, 21, 0,
+  21, 0, 41, 46, 70, 27, 15, 0, 0, 0,
+  0, 6, 30, 0, 57, 63, 0, 18, 0, 0,
+  0, 0, 0, 23, 55, 0, 32, 0, 0, 0,
+  90, 0, 14, 0, 0, 0, 5, 1, 0, 0,
+  20, 7, 0, 0, 56, 103, 0, 45, 15, 0,
+  0, 0, 58, 0, 0, 52, 30, 60, 0, 0,
+  0, 11, 22, 8, 26, 0, 0, 48, 0, 0,
+  58, 0, 0, 0, 19, 13, 0, 0, 3, 0,
+  0, 0, 0, 0, 0, 0, 0, 14, 26, 11,
+  2, 0, 0, 0, 23, 83, 1, 41, 67, 0,
+  39, 3, 0, 0, 0, 31, 34, 12, 4, 15,
+  0, 13, 0, 63, 0, 12, 10, 0, 0, 36,
+  0, 0, 33, 0, 0, 39, 30, 13, 0, 0,
+  19, 60, 73, 69, 93, 0, 0, 0, 0, 0,
+  59, 0, 21, 68, 23, 82, 0, 0, 0, 0,
+  0, 52, 129, 3, 21, 0, 0, 7, 40, 0,
+  0, 0, 3, 0, 26, 0, 14, 0, 57, 39,
+  0, 0, 46, 82, 0, 50, 1, 35, 0, 0,
+  22, 0, 0, 15, 41, 6, 0, 0, 0, 19,
+  21, 11, 13, 31, 0, 0, 0, 0, 64, 0,
+  0, 0, 30, 54, 0, 0, 28, 29, 0, 17,
+  0, 0, 0, 0, 1, 18, 5, 11, 10, 0,
+  0, 0, 0, 57, 0, 22, 95, 48, 30, 4,
+  0, 0, 0, 73, 54, 11, 88, 0, 0, 66,
+  0, 94, 130, 13, 9, 0, 0, 4, 0, 2,
+  68, 0, 0, 0, 23, 16, 20, 0, 0, 28,
+  33, 13, 56, 0, 0, 0, 6, 0, 47, 0,
+  18, 68, 22, 150, 0, 0, 0, 0, 0, 82,
+  91, 0, 7, 26, 10, 31, 0, 0, 0, 0,
+  31, 0, 0, 0, 0, 0, 50, 35, 0, 2,
+  7, 17, 0, 25, 21, 11, 0, 0, 61, 0,
+  0, 19, 7, 87, 0, 0, 0, 20, 13, 16,
+  69, 0, 0, 19, 0, 0, 0, 0, 0, 18,
+  0, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 18, 0, 55, 0, 0, 10, 38, 0, 0,
+  71, 103, 0, 69, 0, 0, 31, 9, 0, 0,
+  0, 0, 4, 0, 42, 20, 0, 14, 0, 7,
+  0, 2, 0, 0, 39, 0, 0, 0, 0, 43,
+  31, 45, 9, 0, 36, 0, 50, 45, 79, 24,
+  11, 1, 0, 0, 0, 13, 32, 0, 65, 65,
+  1, 23, 0, 0, 0, 0, 0, 13, 64, 0,
+  7, 0, 0, 0, 59, 0, 45, 0, 6, 0,
+  45, 0, 40, 0, 47, 0, 8, 0, 0, 108,
+  0, 50, 20, 0, 23, 0, 76, 0, 5, 27,
+  31, 30, 12, 0, 0, 17, 12, 30, 55, 0,
+  0, 56, 13, 61, 39, 0, 0, 26, 15, 0,
+  27, 4, 0, 0, 0, 0, 0, 5, 0, 21,
+  0, 47, 11, 0, 10, 19, 0, 0, 54, 49,
+  57, 86, 0, 0, 20, 0, 0, 49, 9, 0,
+  0, 0, 0, 0, 32, 13, 0, 0, 0, 12,
+  0, 0, 51, 32, 0, 0, 0, 19, 65, 67,
+  24, 0, 19, 0, 39, 50, 52, 88, 74, 0,
+  0, 18, 0, 13, 42, 0, 60, 63, 11, 32,
+  0, 0, 0, 0, 14, 25, 123, 40, 2, 0,
+  0, 0, 13, 0, 5, 0, 0, 0, 42, 3,
+  144, 0, 86, 0, 0, 0, 0, 155, 0, 57,
+  4, 0, 35, 0, 65, 0, 13, 22, 77, 0,
+  0, 0, 0, 12, 22, 43, 12, 0, 0, 61,
+  29, 33, 73, 13, 3, 0, 36, 0, 52, 0,
+  38, 0, 0, 0, 0, 0, 0, 22, 0, 53,
+  11, 0, 16, 0, 0, 0, 43, 52, 47, 51,
+  11, 17, 36, 0, 0, 49, 1, 0, 0, 0,
+  0, 0, 2, 16, 0, 0, 11, 34, 0, 0,
+  39, 55, 0, 69, 4, 0, 37, 56, 49, 10,
+  11, 0, 0, 58, 72, 93, 137, 0, 0, 11,
+  0, 0, 57, 0, 44, 81, 42, 39, 0, 0,
+  0, 0, 27, 70, 152, 18, 4, 0, 17, 10,
+  0, 0, 0, 0, 0, 0, 3, 0, 133, 2,
+  119, 5, 0, 0, 29, 57, 0, 24, 0, 27,
+  0, 0, 42, 0, 0, 31, 0, 13, 0, 0,
+  0, 38, 15, 0, 3, 20, 0, 0, 0, 0,
+  2, 0, 0, 0, 0, 33, 0, 0, 0, 22,
+  12, 36, 5, 0, 22, 0, 25, 16, 5, 0,
+  6, 0, 0, 0, 0, 74, 0, 26, 125, 100,
+  30, 22, 18, 0, 0, 43, 75, 37, 102, 36,
+  0, 20, 0, 109, 123, 3, 27, 0, 0, 17,
+  0, 0, 34, 0, 0, 1, 35, 33, 3, 0,
+  0, 8, 62, 0, 21, 30, 0, 0, 38, 0,
+  43, 0, 9, 59, 0, 117, 0, 0, 0, 0,
+  0, 80, 21, 0, 14, 0, 0, 24, 0, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 32, 35,
+  0, 0, 10, 25, 0, 0, 0, 85, 0, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+  3, 8, 0, 40, 0, 0, 0, 0, 8, 3,
+  0, 0, 0, 38, 0, 0, 0, 43, 47, 68,
+  23, 0, 46, 0, 22, 15, 0, 13, 59, 13,
+  0, 0, 0, 55, 0, 0, 112, 118, 34, 26,
+  48, 0, 0, 57, 67, 0, 179, 5, 0, 32,
+  0, 139, 175, 0, 10, 15, 0, 0, 0, 0,
+  42, 0, 0, 0, 28, 19, 31, 0, 0, 11,
+  42, 0, 0, 116, 13, 0, 34, 0, 0, 0,
+  6, 54, 43, 142, 0, 0, 0, 0, 0, 58,
+  0, 0, 0, 29, 0, 30, 0, 10, 0, 0,
+  53, 0, 0, 0, 0, 0, 1, 29, 1, 6,
+  0, 37, 0, 0, 0, 81, 0, 0, 83, 32,
+  0, 0, 0, 9, 0, 42, 6, 26, 0, 10,
+  0, 0, 0, 25, 0, 0, 22, 40, 7, 0,
+  0, 0, 67, 0, 0, 20, 33, 86, 0, 0,
+  32, 0, 0, 10, 0, 67, 54, 81, 0, 26,
+  0, 6, 0, 0, 25, 36, 58, 0, 32, 0,
+  0, 65, 0, 0, 102, 0, 0, 34, 25, 57,
+  85, 0, 33, 59, 0, 79, 0, 0, 3, 0,
+  3, 0, 2, 0, 0, 0, 0, 49, 15, 0,
+  0, 173, 0, 0, 0, 0, 0, 0, 0, 64,
+  113, 110, 0, 0, 0, 0, 0, 29, 0, 22,
+  0, 30, 0, 19, 0, 0, 0, 29, 61, 0,
+  40, 0, 0, 0, 0, 15, 1, 35, 56, 103,
+  0, 45, 15, 0, 0, 0, 58, 0, 0, 52,
+  30, 60, 0, 0, 0, 11, 22, 8, 26, 0,
+  0, 48, 0, 0, 58, 0, 0, 0, 19, 13,
+  0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+  0, 14, 26, 11, 2, 0, 0, 0, 23, 83,
+  1, 41, 67, 0, 39, 3, 0, 0, 0, 31,
+  34, 12, 4, 15, 0, 13, 0, 63, 0, 12,
+  10, 0, 0, 36, 0, 0, 33, 0, 0, 39,
+  30, 13, 0, 0, 19, 60, 73, 69, 93, 0,
+  0, 0, 0, 0, 59, 0, 21, 68, 23, 82,
+  0, 0, 0, 0, 0, 52, 129, 3, 21, 0,
+  0, 7, 40, 0, 0, 0, 3, 0, 26, 0,
+  14, 0, 57, 39, 0, 0, 46, 82, 0, 50,
+  1, 35, 0, 0, 22, 0, 0, 15, 41, 6,
+  0, 0, 0, 19, 21, 11, 13, 31, 0, 0,
+  0, 0, 64, 0, 0, 0, 30, 54, 0, 0,
+  28, 29, 0, 17, 0, 0, 0, 0, 1, 18,
+  5, 11, 10, 0, 0, 0, 0, 57, 0, 22,
+  95, 48, 30, 4, 0, 0, 0, 73, 54, 11,
+  88, 0, 0, 66, 0, 94, 130, 13, 9, 0,
+  0, 4, 0, 2, 68, 0, 0, 0, 23, 16,
+  20, 0, 0, 28, 33, 13, 56, 0, 0, 0,
+  6, 0, 47, 0, 18, 68, 22, 150, 0, 0,
+  0, 0, 0, 82, 91, 0, 7, 26, 10, 31,
+  0, 0, 0, 0, 31, 0, 0, 0, 0, 0,
+  50, 35, 0, 2, 1, 12, 0, 19, 0, 115,
+  0, 0, 17, 0, 0, 0, 0, 1, 0, 0,
+  0, 28, 11, 16, 0, 65, 2, 0, 0, 0,
+  23, 0, 0, 0, 0, 17, 8, 0, 9, 65,
+  12, 45, 5, 0, 48, 0, 0, 18, 0, 33,
+  46, 0, 0, 7, 0, 29, 0, 0, 131, 59,
+  54, 5, 43, 0, 0, 107, 51, 0, 166, 0,
+  0, 46, 0, 112, 193, 0, 44, 0, 0, 35,
+  0, 0, 29, 0, 0, 0, 32, 0, 28, 0,
+  0, 1, 14, 0, 0, 79, 16, 0, 38, 0,
+  0, 0, 3, 61, 47, 127, 0, 0, 0, 0,
+  0, 36, 0, 0, 0, 55, 0, 53, 0, 0,
+  0, 0, 47, 0, 0, 0, 0, 0, 13, 18,
+  0, 12, 0, 108, 0, 50, 20, 0, 23, 0,
+  76, 0, 5, 27, 31, 30, 12, 0, 0, 17,
+  12, 30, 55, 0, 0, 56, 13, 61, 39, 0,
+  0, 26, 15, 0, 27, 4, 0, 0, 0, 0,
+  0, 5, 0, 21, 0, 47, 11, 0, 10, 19,
+  0, 0, 54, 49, 57, 86, 0, 0, 20, 0,
+  0, 49, 9, 0, 0, 0, 0, 0, 32, 13,
+  0, 0, 0, 12, 0, 0, 51, 32, 0, 0,
+  0, 19, 65, 67, 24, 0, 19, 0, 39, 50,
+  52, 88, 74, 0, 0, 18, 0, 13, 42, 0,
+  60, 63, 11, 32, 0, 0, 0, 0, 14, 25,
+  123, 40, 2, 0, 0, 0, 13, 0, 5, 0,
+  0, 0, 42, 3, 144, 0, 86, 0, 0, 0,
+  0, 155, 0, 57, 4, 0, 35, 0, 65, 0,
+  13, 22, 77, 0, 0, 0, 0, 12, 22, 43,
+  12, 0, 0, 61, 29, 33, 73, 13, 3, 0,
+  36, 0, 52, 0, 38, 0, 0, 0, 0, 0,
+  0, 22, 0, 53, 11, 0, 16, 0, 0, 0,
+  43, 52, 47, 51, 11, 17, 36, 0, 0, 49,
+  1, 0, 0, 0, 0, 0, 2, 16, 0, 0,
+  11, 34, 0, 0, 39, 55, 0, 69, 4, 0,
+  37, 56, 49, 10, 11, 0, 0, 58, 72, 93,
+  137, 0, 0, 11, 0, 0, 57, 0, 44, 81,
+  42, 39, 0, 0, 0, 0, 27, 70, 152, 18,
+  4, 0, 17, 10, 0, 0, 0, 0, 0, 0,
+  3, 0, 133, 2, 119, 5, 0, 0, 21, 77,
+  0, 54, 0, 57, 1, 0, 24, 0, 0, 9,
+  43, 0, 0, 0, 0, 20, 47, 27, 0, 27,
+  1, 0, 0, 0, 69, 0, 0, 0, 4, 19,
+  15, 0, 32, 49, 0, 0, 3, 0, 0, 7,
+  0, 34, 8, 10, 16, 0, 0, 0, 3, 45,
+  0, 0, 93, 35, 51, 0, 0, 0, 0, 53,
+  20, 0, 103, 0, 0, 43, 0, 68, 175, 29,
+  22, 0, 0, 35, 0, 61, 4, 6, 0, 0,
+  64, 5, 21, 0, 0, 19, 51, 0, 81, 0,
+  0, 0, 7, 0, 55, 0, 12, 95, 28, 106,
+  1, 0, 0, 0, 4, 67, 71, 0, 2, 16,
+  0, 39, 0, 0, 0, 0, 25, 0, 0, 0,
+  0, 18, 65, 17, 0, 0, 10, 25, 0, 0,
+  0, 85, 0, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 3, 8, 0, 40, 0, 0,
+  0, 0, 8, 3, 0, 0, 0, 38, 0, 0,
+  0, 43, 47, 68, 23, 0, 46, 0, 22, 15,
+  0, 13, 59, 13, 0, 0, 0, 55, 0, 0,
+  112, 118, 34, 26, 48, 0, 0, 57, 67, 0,
+  179, 5, 0, 32, 0, 139, 175, 0, 10, 15,
+  0, 0, 0, 0, 42, 0, 0, 0, 28, 19,
+  31, 0, 0, 11, 42, 0, 0, 116, 13, 0,
+  34, 0, 0, 0, 6, 54, 43, 142, 0, 0,
+  0, 0, 0, 58, 0, 0, 0, 29, 0, 30,
+  0, 10, 0, 0, 53, 0, 0, 0, 0, 0,
+  1, 29, 1, 6, 0, 37, 0, 0, 0, 81,
+  0, 0, 83, 32, 0, 0, 0, 9, 0, 42,
+  6, 26, 0, 10, 0, 0, 0, 25, 0, 0,
+  22, 40, 7, 0, 0, 0, 67, 0, 0, 20,
+  33, 86, 0, 0, 32, 0, 0, 10, 0, 67,
+  54, 81, 0, 26, 0, 6, 0, 0, 25, 36,
+  58, 0, 32, 0, 0, 65, 0, 0, 102, 0,
+  0, 34, 25, 57, 85, 0, 33, 59, 0, 79,
+  0, 0, 3, 0, 3, 0, 2, 0, 0, 0,
+  0, 49, 15, 0, 0, 173, 0, 0, 0, 0,
+  0, 0, 0, 64, 113, 110, 0, 0, 0, 0,
+  0, 29, 0, 22, 0, 30, 0, 19, 0, 0,
+  0, 29, 61, 0, 40, 0, 0, 0, 0, 15,
+  1, 35, 0, 34, 21, 0, 0, 0, 48, 33,
+  91, 15, 14, 16, 57, 1, 0, 81, 49, 0,
+  0, 0, 6, 20, 26, 30, 1, 0, 0, 23,
+  0, 0, 0, 0, 60, 0, 3, 0, 0, 56,
+  0, 42, 4, 5, 0, 43, 0, 101, 57, 64,
+  0, 36, 0, 14, 67, 0, 0, 0, 60, 0,
+  18, 0, 6, 36, 0, 46, 0, 0, 0, 0,
+  80, 0, 0, 0, 27, 50, 26, 48, 16, 11,
+  0, 0, 59, 0, 25, 0, 0, 9, 9, 3,
+  5, 0, 0, 63, 0, 14, 0, 0, 0, 0,
+  4, 79, 88, 0, 0, 0, 17, 0, 30, 2,
+  0, 51, 0, 7, 0, 20, 0, 0, 0, 31,
+  77, 0, 50, 0, 85, 0, 42, 0, 14, 0,
+  46, 82, 0, 50, 1, 35, 0, 0, 22, 0,
+  0, 15, 41, 6, 0, 0, 0, 19, 21, 11,
+  13, 31, 0, 0, 0, 0, 64, 0, 0, 0,
+  30, 54, 0, 0, 28, 29, 0, 17, 0, 0,
+  0, 0, 1, 18, 5, 11, 10, 0, 0, 0,
+  0, 57, 0, 22, 95, 48, 30, 4, 0, 0,
+  0, 73, 54, 11, 88, 0, 0, 66, 0, 94,
+  130, 13, 9, 0, 0, 4, 0, 2, 68, 0,
+  0, 0, 23, 16, 20, 0, 0, 28, 33, 13,
+  56, 0, 0, 0, 6, 0, 47, 0, 18, 68,
+  22, 150, 0, 0, 0, 0, 0, 82, 91, 0,
+  7, 26, 10, 31, 0, 0, 0, 0, 31, 0,
+  0, 0, 0, 0, 50, 35, 0, 2, 1, 12,
+  0, 19, 0, 115, 0, 0, 17, 0, 0, 0,
+  0, 1, 0, 0, 0, 28, 11, 16, 0, 65,
+  2, 0, 0, 0, 23, 0, 0, 0, 0, 17,
+  8, 0, 9, 65, 12, 45, 5, 0, 48, 0,
+  0, 18, 0, 33, 46, 0, 0, 7, 0, 29,
+  0, 0, 131, 59, 54, 5, 43, 0, 0, 107,
+  51, 0, 166, 0, 0, 46, 0, 112, 193, 0,
+  44, 0, 0, 35, 0, 0, 29, 0, 0, 0,
+  32, 0, 28, 0, 0, 1, 14, 0, 0, 79,
+  16, 0, 38, 0, 0, 0, 3, 61, 47, 127,
+  0, 0, 0, 0, 0, 36, 0, 0, 0, 55,
+  0, 53, 0, 0, 0, 0, 47, 0, 0, 0,
+  0, 0, 13, 18, 0, 12, 0, 1, 0, 0,
+  0, 57, 0, 18, 70, 15, 0, 4, 0, 0,
+  0, 50, 13, 20, 0, 0, 47, 47, 29, 12,
+  0, 0, 0, 10, 0, 0, 0, 0, 50, 0,
+  0, 44, 0, 64, 0, 0, 54, 0, 0, 47,
+  0, 99, 16, 46, 0, 15, 0, 37, 0, 0,
+  63, 0, 74, 0, 64, 0, 0, 62, 0, 0,
+  90, 0, 0, 12, 30, 23, 61, 0, 70, 60,
+  0, 76, 0, 1, 0, 0, 21, 0, 0, 0,
+  0, 0, 8, 0, 5, 0, 0, 121, 9, 0,
+  0, 0, 0, 0, 20, 54, 116, 17, 0, 0,
+  0, 0, 11, 9, 0, 21, 0, 19, 0, 73,
+  0, 0, 0, 0, 56, 0, 53, 0, 0, 0,
+  21, 0, 18, 0, 0, 155, 0, 57, 4, 0,
+  35, 0, 65, 0, 13, 22, 77, 0, 0, 0,
+  0, 12, 22, 43, 12, 0, 0, 61, 29, 33,
+  73, 13, 3, 0, 36, 0, 52, 0, 38, 0,
+  0, 0, 0, 0, 0, 22, 0, 53, 11, 0,
+  16, 0, 0, 0, 43, 52, 47, 51, 11, 17,
+  36, 0, 0, 49, 1, 0, 0, 0, 0, 0,
+  2, 16, 0, 0, 11, 34, 0, 0, 39, 55,
+  0, 69, 4, 0, 37, 56, 49, 10, 11, 0,
+  0, 58, 72, 93, 137, 0, 0, 11, 0, 0,
+  57, 0, 44, 81, 42, 39, 0, 0, 0, 0,
+  27, 70, 152, 18, 4, 0, 17, 10, 0, 0,
+  0, 0, 0, 0, 3, 0, 133, 2, 119, 5,
+  0, 0, 21, 77, 0, 54, 0, 57, 1, 0,
+  24, 0, 0, 9, 43, 0, 0, 0, 0, 20,
+  47, 27, 0, 27, 1, 0, 0, 0, 69, 0,
+  0, 0, 4, 19, 15, 0, 32, 49, 0, 0,
+  3, 0, 0, 7, 0, 34, 8, 10, 16, 0,
+  0, 0, 3, 45, 0, 0, 93, 35, 51, 0,
+  0, 0, 0, 53, 20, 0, 103, 0, 0, 43,
+  0, 68, 175, 29, 22, 0, 0, 35, 0, 61,
+  4, 6, 0, 0, 64, 5, 21, 0, 0, 19,
+  51, 0, 81, 0, 0, 0, 7, 0, 55, 0,
+  12, 95, 28, 106, 1, 0, 0, 0, 4, 67,
+  71, 0, 2, 16, 0, 39, 0, 0, 0, 0,
+  25, 0, 0, 0, 0, 18, 65, 17, 0, 0,
+  0, 0, 0, 25, 0, 135, 0, 7, 42, 0,
+  0, 4, 0, 6, 0, 0, 0, 25, 13, 0,
+  41, 106, 15, 0, 0, 0, 0, 1, 0, 0,
+  0, 1, 9, 0, 0, 82, 0, 40, 0, 0,
+  45, 0, 0, 46, 0, 80, 0, 4, 0, 0,
+  0, 52, 0, 0, 133, 36, 44, 0, 57, 0,
+  0, 92, 42, 0, 155, 0, 0, 30, 0, 77,
+  196, 0, 59, 34, 0, 31, 0, 16, 9, 0,
+  0, 0, 35, 0, 0, 0, 1, 0, 11, 0,
+  0, 92, 0, 0, 27, 0, 0, 0, 7, 76,
+  78, 108, 0, 0, 0, 0, 0, 30, 0, 0,
+  0, 38, 0, 95, 0, 0, 0, 0, 52, 0,
+  0, 0, 0, 0, 21, 0, 0, 6, 0, 37,
+  0, 0, 0, 81, 0, 0, 83, 32, 0, 0,
+  0, 9, 0, 42, 6, 26, 0, 10, 0, 0,
+  0, 25, 0, 0, 22, 40, 7, 0, 0, 0,
+  67, 0, 0, 20, 33, 86, 0, 0, 32, 0,
+  0, 10, 0, 67, 54, 81, 0, 26, 0, 6,
+  0, 0, 25, 36, 58, 0, 32, 0, 0, 65,
+  0, 0, 102, 0, 0, 34, 25, 57, 85, 0,
+  33, 59, 0, 79, 0, 0, 3, 0, 3, 0,
+  2, 0, 0, 0, 0, 49, 15, 0, 0, 173,
+  0, 0, 0, 0, 0, 0, 0, 64, 113, 110,
+  0, 0, 0, 0, 0, 29, 0, 22, 0, 30,
+  0, 19, 0, 0, 0, 29, 61, 0, 40, 0,
+  0, 0, 0, 15, 1, 35, 0, 34, 21, 0,
+  0, 0, 48, 33, 91, 15, 14, 16, 57, 1,
+  0, 81, 49, 0, 0, 0, 6, 20, 26, 30,
+  1, 0, 0, 23, 0, 0, 0, 0, 60, 0,
+  3, 0, 0, 56, 0, 42, 4, 5, 0, 43,
+  0, 101, 57, 64, 0, 36, 0, 14, 67, 0,
+  0, 0, 60, 0, 18, 0, 6, 36, 0, 46,
+  0, 0, 0, 0, 80, 0, 0, 0, 27, 50,
+  26, 48, 16, 11, 0, 0, 59, 0, 25, 0,
+  0, 9, 9, 3, 5, 0, 0, 63, 0, 14,
+  0, 0, 0, 0, 4, 79, 88, 0, 0, 0,
+  17, 0, 30, 2, 0, 51, 0, 7, 0, 20,
+  0, 0, 0, 31, 77, 0, 50, 0, 85, 0,
+  42, 0, 14, 0, 0, 27, 0, 6, 0, 0,
+  33, 17, 40, 0, 12, 29, 62, 0, 14, 33,
+  65, 28, 0, 0, 26, 32, 26, 12, 42, 0,
+  0, 27, 0, 0, 0, 0, 69, 0, 0, 0,
+  0, 14, 0, 40, 0, 14, 0, 40, 23, 88,
+  0, 29, 0, 18, 0, 24, 66, 1, 4, 0,
+  0, 0, 0, 0, 30, 14, 0, 50, 0, 7,
+  42, 0, 37, 0, 0, 0, 0, 48, 16, 0,
+  58, 78, 0, 0, 60, 0, 43, 4, 0, 14,
+  12, 0, 0, 2, 0, 24, 0, 6, 0, 25,
+  4, 0, 5, 84, 38, 0, 0, 3, 48, 0,
+  12, 5, 0, 1, 0, 12, 0, 2, 0, 0,
+  15, 0, 12, 0, 16, 0, 60, 0, 26, 0,
+  25, 0, 1, 12, 0, 19, 0, 115, 0, 0,
+  17, 0, 0, 0, 0, 1, 0, 0, 0, 28,
+  11, 16, 0, 65, 2, 0, 0, 0, 23, 0,
+  0, 0, 0, 17, 8, 0, 9, 65, 12, 45,
+  5, 0, 48, 0, 0, 18, 0, 33, 46, 0,
+  0, 7, 0, 29, 0, 0, 131, 59, 54, 5,
+  43, 0, 0, 107, 51, 0, 166, 0, 0, 46,
+  0, 112, 193, 0, 44, 0, 0, 35, 0, 0,
+  29, 0, 0, 0, 32, 0, 28, 0, 0, 1,
+  14, 0, 0, 79, 16, 0, 38, 0, 0, 0,
+  3, 61, 47, 127, 0, 0, 0, 0, 0, 36,
+  0, 0, 0, 55, 0, 53, 0, 0, 0, 0,
+  47, 0, 0, 0, 0, 0, 13, 18, 0, 12,
+  0, 1, 0, 0, 0, 57, 0, 18, 70, 15,
+  0, 4, 0, 0, 0, 50, 13, 20, 0, 0,
+  47, 47, 29, 12, 0, 0, 0, 10, 0, 0,
+  0, 0, 50, 0, 0, 44, 0, 64, 0, 0,
+  54, 0, 0, 47, 0, 99, 16, 46, 0, 15,
+  0, 37, 0, 0, 63, 0, 74, 0, 64, 0,
+  0, 62, 0, 0, 90, 0, 0, 12, 30, 23,
+  61, 0, 70, 60, 0, 76, 0, 1, 0, 0,
+  21, 0, 0, 0, 0, 0, 8, 0, 5, 0,
+  0, 121, 9, 0, 0, 0, 0, 0, 20, 54,
+  116, 17, 0, 0, 0, 0, 11, 9, 0, 21,
+  0, 19, 0, 73, 0, 0, 0, 0, 56, 0,
+  53, 0, 0, 0, 21, 0, 18, 0, 0, 48,
+  16, 0, 0, 0, 50, 44, 75, 3, 3, 42,
+  110, 0, 16, 61, 79, 13, 2, 0, 31, 54,
+  4, 6, 49, 0, 0, 45, 0, 0, 0, 0,
+  83, 0, 2, 0, 0, 62, 0, 80, 0, 35,
+  4, 49, 18, 97, 6, 35, 0, 42, 0, 40,
+  48, 0, 23, 0, 3, 0, 0, 0, 0, 5,
+  0, 59, 0, 17, 20, 0, 40, 0, 0, 0,
+  0, 48, 8, 0, 29, 54, 0, 0, 33, 0,
+  42, 5, 0, 9, 4, 0, 0, 8, 0, 4,
+  0, 44, 0, 13, 5, 8, 15, 84, 41, 0,
+  0, 0, 34, 0, 24, 13, 4, 22, 0, 21,
+  0, 22, 0, 0, 0, 0, 35, 0, 31, 0,
+  111, 0, 71, 0, 32, 0, 21, 77, 0, 54,
+  0, 57, 1, 0, 24, 0, 0, 9, 43, 0,
+  0, 0, 0, 20, 47, 27, 0, 27, 1, 0,
+  0, 0, 69, 0, 0, 0, 4, 19, 15, 0,
+  32, 49, 0, 0, 3, 0, 0, 7, 0, 34,
+  8, 10, 16, 0, 0, 0, 3, 45, 0, 0,
+  93, 35, 51, 0, 0, 0, 0, 53, 20, 0,
+  103, 0, 0, 43, 0, 68, 175, 29, 22, 0,
+  0, 35, 0, 61, 4, 6, 0, 0, 64, 5,
+  21, 0, 0, 19, 51, 0, 81, 0, 0, 0,
+  7, 0, 55, 0, 12, 95, 28, 106, 1, 0,
+  0, 0, 4, 67, 71, 0, 2, 16, 0, 39,
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 18,
+  65, 17, 0, 0, 0, 0, 0, 25, 0, 135,
+  0, 7, 42, 0, 0, 4, 0, 6, 0, 0,
+  0, 25, 13, 0, 41, 106, 15, 0, 0, 0,
+  0, 1, 0, 0, 0, 1, 9, 0, 0, 82,
+  0, 40, 0, 0, 45, 0, 0, 46, 0, 80,
+  0, 4, 0, 0, 0, 52, 0, 0, 133, 36,
+  44, 0, 57, 0, 0, 92, 42, 0, 155, 0,
+  0, 30, 0, 77, 196, 0, 59, 34, 0, 31,
+  0, 16, 9, 0, 0, 0, 35, 0, 0, 0,
+  1, 0, 11, 0, 0, 92, 0, 0, 27, 0,
+  0, 0, 7, 76, 78, 108, 0, 0, 0, 0,
+  0, 30, 0, 0, 0, 38, 0, 95, 0, 0,
+  0, 0, 52, 0, 0, 0, 0, 0, 21, 0,
+  0, 6, 0, 28, 0, 8, 0, 24, 24, 29,
+  104, 12, 0, 37, 106, 0, 0, 105, 62, 22,
+  0, 0, 41, 62, 0, 12, 2, 0, 0, 43,
+  0, 0, 0, 0, 76, 0, 33, 0, 0, 91,
+  0, 53, 32, 0, 4, 39, 5, 115, 2, 34,
+  0, 36, 0, 56, 16, 0, 56, 0, 6, 0,
+  36, 0, 0, 14, 0, 21, 0, 0, 0, 0,
+  27, 0, 37, 0, 47, 52, 0, 14, 8, 31,
+  0, 0, 8, 0, 29, 0, 0, 10, 11, 0,
+  20, 0, 0, 68, 0, 34, 0, 0, 0, 0,
+  26, 84, 90, 0, 0, 0, 22, 0, 15, 31,
+  0, 34, 0, 30, 0, 52, 0, 0, 0, 0,
+  60, 0, 39, 0, 79, 0, 69, 0, 34, 16,
+  0, 34, 21, 0, 0, 0, 48, 33, 91, 15,
+  14, 16, 57, 1, 0, 81, 49, 0, 0, 0,
+  6, 20, 26, 30, 1, 0, 0, 23, 0, 0,
+  0, 0, 60, 0, 3, 0, 0, 56, 0, 42,
+  4, 5, 0, 43, 0, 101, 57, 64, 0, 36,
+  0, 14, 67, 0, 0, 0, 60, 0, 18, 0,
+  6, 36, 0, 46, 0, 0, 0, 0, 80, 0,
+  0, 0, 27, 50, 26, 48, 16, 11, 0, 0,
+  59, 0, 25, 0, 0, 9, 9, 3, 5, 0,
+  0, 63, 0, 14, 0, 0, 0, 0, 4, 79,
+  88, 0, 0, 0, 17, 0, 30, 2, 0, 51,
+  0, 7, 0, 20, 0, 0, 0, 31, 77, 0,
+  50, 0, 85, 0, 42, 0, 14, 0, 0, 27,
+  0, 6, 0, 0, 33, 17, 40, 0, 12, 29,
+  62, 0, 14, 33, 65, 28, 0, 0, 26, 32,
+  26, 12, 42, 0, 0, 27, 0, 0, 0, 0,
+  69, 0, 0, 0, 0, 14, 0, 40, 0, 14,
+  0, 40, 23, 88, 0, 29, 0, 18, 0, 24,
+  66, 1, 4, 0, 0, 0, 0, 0, 30, 14,
+  0, 50, 0, 7, 42, 0, 37, 0, 0, 0,
+  0, 48, 16, 0, 58, 78, 0, 0, 60, 0,
+  43, 4, 0, 14, 12, 0, 0, 2, 0, 24,
+  0, 6, 0, 25, 4, 0, 5, 84, 38, 0,
+  0, 3, 48, 0, 12, 5, 0, 1, 0, 12,
+  0, 2, 0, 0, 15, 0, 12, 0, 16, 0,
+  60, 0, 26, 0, 25, 0, 32, 14, 0, 17,
+  0, 0, 0, 0, 0, 0, 1, 1, 16, 0,
+  0, 0, 49, 11, 3, 0, 0, 29, 0, 16,
+  72, 0, 37, 30, 0, 0, 0, 15, 79, 12,
+  0, 0, 0, 13, 41, 0, 0, 0, 0, 11,
+  0, 105, 32, 28, 0, 0, 0, 8, 36, 0,
+  22, 20, 3, 0, 0, 0, 87, 22, 0, 54,
+  0, 0, 130, 30, 67, 49, 31, 0, 0, 36,
+  0, 0, 48, 46, 0, 0, 36, 0, 58, 28,
+  0, 42, 0, 0, 0, 0, 0, 73, 0, 0,
+  0, 0, 0, 0, 0, 113, 49, 57, 10, 33,
+  35, 37, 0, 0, 24, 0, 0, 52, 0, 0,
+  0, 0, 4, 0, 10, 0, 8, 0, 23, 0,
+  0, 0, 31, 19, 0, 1, 0, 0, 0, 57,
+  0, 18, 70, 15, 0, 4, 0, 0, 0, 50,
+  13, 20, 0, 0, 47, 47, 29, 12, 0, 0,
+  0, 10, 0, 0, 0, 0, 50, 0, 0, 44,
+  0, 64, 0, 0, 54, 0, 0, 47, 0, 99,
+  16, 46, 0, 15, 0, 37, 0, 0, 63, 0,
+  74, 0, 64, 0, 0, 62, 0, 0, 90, 0,
+  0, 12, 30, 23, 61, 0, 70, 60, 0, 76,
+  0, 1, 0, 0, 21, 0, 0, 0, 0, 0,
+  8, 0, 5, 0, 0, 121, 9, 0, 0, 0,
+  0, 0, 20, 54, 116, 17, 0, 0, 0, 0,
+  11, 9, 0, 21, 0, 19, 0, 73, 0, 0,
+  0, 0, 56, 0, 53, 0, 0, 0, 21, 0,
+  18, 0, 0, 48, 16, 0, 0, 0, 50, 44,
+  75, 3, 3, 42, 110, 0, 16, 61, 79, 13,
+  2, 0, 31, 54, 4, 6, 49, 0, 0, 45,
+  0, 0, 0, 0, 83, 0, 2, 0, 0, 62,
+  0, 80, 0, 35, 4, 49, 18, 97, 6, 35,
+  0, 42, 0, 40, 48, 0, 23, 0, 3, 0,
+  0, 0, 0, 5, 0, 59, 0, 17, 20, 0,
+  40, 0, 0, 0, 0, 48, 8, 0, 29, 54,
+  0, 0, 33, 0, 42, 5, 0, 9, 4, 0,
+  0, 8, 0, 4, 0, 44, 0, 13, 5, 8,
+  15, 84, 41, 0, 0, 0, 34, 0, 24, 13,
+  4, 22, 0, 21, 0, 22, 0, 0, 0, 0,
+  35, 0, 31, 0, 111, 0, 71, 0, 32, 0,
+  3, 37, 0, 0, 14, 0, 32, 0, 0, 0,
+  3, 23, 56, 0, 0, 4, 62, 15, 4, 0,
+  0, 72, 0, 17, 107, 0, 0, 48, 0, 0,
+  0, 48, 90, 0, 0, 0, 0, 51, 43, 7,
+  0, 46, 21, 29, 25, 100, 41, 0, 0, 5,
+  0, 0, 5, 0, 27, 0, 7, 0, 20, 2,
+  58, 63, 0, 50, 0, 0, 97, 52, 73, 0,
+  0, 0, 9, 20, 30, 0, 53, 59, 0, 0,
+  0, 0, 39, 57, 10, 31, 0, 0, 0, 14,
+  0, 0, 0, 54, 0, 21, 0, 18, 0, 113,
+  24, 11, 22, 20, 39, 43, 10, 0, 43, 0,
+  0, 50, 0, 0, 0, 0, 10, 1, 48, 0,
+  7, 0, 27, 0, 30, 0, 30, 47, 0, 0,
+  0, 25, 0, 135, 0, 7, 42, 0, 0, 4,
+  0, 6, 0, 0, 0, 25, 13, 0, 41, 106,
+  15, 0, 0, 0, 0, 1, 0, 0, 0, 1,
+  9, 0, 0, 82, 0, 40, 0, 0, 45, 0,
+  0, 46, 0, 80, 0, 4, 0, 0, 0, 52,
+  0, 0, 133, 36, 44, 0, 57, 0, 0, 92,
+  42, 0, 155, 0, 0, 30, 0, 77, 196, 0,
+  59, 34, 0, 31, 0, 16, 9, 0, 0, 0,
+  35, 0, 0, 0, 1, 0, 11, 0, 0, 92,
+  0, 0, 27, 0, 0, 0, 7, 76, 78, 108,
+  0, 0, 0, 0, 0, 30, 0, 0, 0, 38,
+  0, 95, 0, 0, 0, 0, 52, 0, 0, 0,
+  0, 0, 21, 0, 0, 6, 0, 28, 0, 8,
+  0, 24, 24, 29, 104, 12, 0, 37, 106, 0,
+  0, 105, 62, 22, 0, 0, 41, 62, 0, 12,
+  2, 0, 0, 43, 0, 0, 0, 0, 76, 0,
+  33, 0, 0, 91, 0, 53, 32, 0, 4, 39,
+  5, 115, 2, 34, 0, 36, 0, 56, 16, 0,
+  56, 0, 6, 0, 36, 0, 0, 14, 0, 21,
+  0, 0, 0, 0, 27, 0, 37, 0, 47, 52,
+  0, 14, 8, 31, 0, 0, 8, 0, 29, 0,
+  0, 10, 11, 0, 20, 0, 0, 68, 0, 34,
+  0, 0, 0, 0, 26, 84, 90, 0, 0, 0,
+  22, 0, 15, 31, 0, 34, 0, 30, 0, 52,
+  0, 0, 0, 0, 60, 0, 39, 0, 79, 0,
+  69, 0, 34, 16, 0, 39, 58, 0, 0, 0,
+  35, 20, 76, 0, 11, 39, 97, 0, 0, 94,
+  63, 17, 0, 0, 0, 47, 11, 21, 63, 0,
+  0, 58, 0, 0, 0, 24, 97, 0, 27, 0,
+  0, 89, 26, 22, 38, 4, 46, 33, 23, 117,
+  42, 0, 0, 22, 0, 0, 14, 0, 32, 0,
+  5, 0, 47, 0, 0, 49, 0, 19, 0, 0,
+  17, 1, 30, 0, 0, 0, 56, 43, 10, 31,
+  22, 65, 0, 0, 6, 0, 19, 88, 0, 42,
+  0, 0, 0, 23, 0, 11, 0, 31, 0, 0,
+  0, 0, 0, 85, 98, 0, 0, 0, 13, 0,
+  31, 29, 0, 24, 0, 19, 0, 5, 0, 0,
+  0, 12, 70, 0, 0, 0, 32, 0, 63, 0,
+  24, 34, 0, 27, 0, 6, 0, 0, 33, 17,
+  40, 0, 12, 29, 62, 0, 14, 33, 65, 28,
+  0, 0, 26, 32, 26, 12, 42, 0, 0, 27,
+  0, 0, 0, 0, 69, 0, 0, 0, 0, 14,
+  0, 40, 0, 14, 0, 40, 23, 88, 0, 29,
+  0, 18, 0, 24, 66, 1, 4, 0, 0, 0,
+  0, 0, 30, 14, 0, 50, 0, 7, 42, 0,
+  37, 0, 0, 0, 0, 48, 16, 0, 58, 78,
+  0, 0, 60, 0, 43, 4, 0, 14, 12, 0,
+  0, 2, 0, 24, 0, 6, 0, 25, 4, 0,
+  5, 84, 38, 0, 0, 3, 48, 0, 12, 5,
+  0, 1, 0, 12, 0, 2, 0, 0, 15, 0,
+  12, 0, 16, 0, 60, 0, 26, 0, 25, 0,
+  32, 14, 0, 17, 0, 0, 0, 0, 0, 0,
+  1, 1, 16, 0, 0, 0, 49, 11, 3, 0,
+  0, 29, 0, 16, 72, 0, 37, 30, 0, 0,
+  0, 15, 79, 12, 0, 0, 0, 13, 41, 0,
+  0, 0, 0, 11, 0, 105, 32, 28, 0, 0,
+  0, 8, 36, 0, 22, 20, 3, 0, 0, 0,
+  87, 22, 0, 54, 0, 0, 130, 30, 67, 49,
+  31, 0, 0, 36, 0, 0, 48, 46, 0, 0,
+  36, 0, 58, 28, 0, 42, 0, 0, 0, 0,
+  0, 73, 0, 0, 0, 0, 0, 0, 0, 113,
+  49, 57, 10, 33, 35, 37, 0, 0, 24, 0,
+  0, 52, 0, 0, 0, 0, 4, 0, 10, 0,
+  8, 0, 23, 0, 0, 0, 31, 19, 12, 13,
+  0, 21, 6, 5, 0, 0, 11, 0, 0, 0,
+  48, 0, 0, 18, 58, 12, 0, 0, 0, 8,
+  0, 28, 33, 0, 31, 20, 0, 0, 0, 2,
+  67, 50, 0, 0, 0, 26, 49, 0, 0, 0,
+  0, 31, 0, 97, 52, 74, 0, 0, 0, 36,
+  26, 0, 0, 44, 0, 0, 0, 0, 64, 9,
+  0, 12, 0, 0, 87, 26, 88, 48, 67, 0,
+  0, 16, 0, 0, 28, 0, 0, 0, 33, 0,
+  46, 22, 0, 32, 0, 0, 2, 0, 0, 84,
+  0, 0, 12, 0, 0, 0, 1, 115, 49, 54,
+  0, 40, 17, 26, 0, 0, 9, 0, 0, 49,
+  0, 16, 0, 0, 0, 0, 29, 0, 1, 0,
+  46, 0, 0, 0, 33, 16, 0, 48, 16, 0,
+  0, 0, 50, 44, 75, 3, 3, 42, 110, 0,
+  16, 61, 79, 13, 2, 0, 31, 54, 4, 6,
+  49, 0, 0, 45, 0, 0, 0, 0, 83, 0,
+  2, 0, 0, 62, 0, 80, 0, 35, 4, 49,
+  18, 97, 6, 35, 0, 42, 0, 40, 48, 0,
+  23, 0, 3, 0, 0, 0, 0, 5, 0, 59,
+  0, 17, 20, 0, 40, 0, 0, 0, 0, 48,
+  8, 0, 29, 54, 0, 0, 33, 0, 42, 5,
+  0, 9, 4, 0, 0, 8, 0, 4, 0, 44,
+  0, 13, 5, 8, 15, 84, 41, 0, 0, 0,
+  34, 0, 24, 13, 4, 22, 0, 21, 0, 22,
+  0, 0, 0, 0, 35, 0, 31, 0, 111, 0,
+  71, 0, 32, 0, 3, 37, 0, 0, 14, 0,
+  32, 0, 0, 0, 3, 23, 56, 0, 0, 4,
+  62, 15, 4, 0, 0, 72, 0, 17, 107, 0,
+  0, 48, 0, 0, 0, 48, 90, 0, 0, 0,
+  0, 51, 43, 7, 0, 46, 21, 29, 25, 100,
+  41, 0, 0, 5, 0, 0, 5, 0, 27, 0,
+  7, 0, 20, 2, 58, 63, 0, 50, 0, 0,
+  97, 52, 73, 0, 0, 0, 9, 20, 30, 0,
+  53, 59, 0, 0, 0, 0, 39, 57, 10, 31,
+  0, 0, 0, 14, 0, 0, 0, 54, 0, 21,
+  0, 18, 0, 113, 24, 11, 22, 20, 39, 43,
+  10, 0, 43, 0, 0, 50, 0, 0, 0, 0,
+  10, 1, 48, 0, 7, 0, 27, 0, 30, 0,
+  30, 47, 0, 22, 0, 0, 13, 12, 20, 0,
+  30, 0, 12, 20, 47, 4, 0, 16, 61, 0,
+  3, 0, 0, 56, 0, 10, 36, 0, 0, 41,
+  0, 0, 2, 0, 51, 24, 0, 0, 0, 75,
+  57, 0, 0, 1, 0, 46, 0, 115, 40, 68,
+  0, 0, 0, 16, 0, 0, 30, 32, 30, 0,
+  49, 0, 37, 54, 0, 31, 7, 0, 25, 63,
+  98, 0, 89, 0, 26, 32, 28, 22, 29, 0,
+  0, 0, 0, 0, 23, 34, 22, 43, 0, 13,
+  0, 0, 0, 67, 0, 29, 0, 0, 0, 0,
+  28, 122, 64, 34, 0, 28, 14, 55, 5, 5,
+  0, 0, 0, 59, 0, 9, 0, 5, 0, 38,
+  80, 0, 0, 0, 7, 0, 12, 0, 22, 22,
+  0, 28, 0, 8, 0, 24, 24, 29, 104, 12,
+  0, 37, 106, 0, 0, 105, 62, 22, 0, 0,
+  41, 62, 0, 12, 2, 0, 0, 43, 0, 0,
+  0, 0, 76, 0, 33, 0, 0, 91, 0, 53,
+  32, 0, 4, 39, 5, 115, 2, 34, 0, 36,
+  0, 56, 16, 0, 56, 0, 6, 0, 36, 0,
+  0, 14, 0, 21, 0, 0, 0, 0, 27, 0,
+  37, 0, 47, 52, 0, 14, 8, 31, 0, 0,
+  8, 0, 29, 0, 0, 10, 11, 0, 20, 0,
+  0, 68, 0, 34, 0, 0, 0, 0, 26, 84,
+  90, 0, 0, 0, 22, 0, 15, 31, 0, 34,
+  0, 30, 0, 52, 0, 0, 0, 0, 60, 0,
+  39, 0, 79, 0, 69, 0, 34, 16, 0, 39,
+  58, 0, 0, 0, 35, 20, 76, 0, 11, 39,
+  97, 0, 0, 94, 63, 17, 0, 0, 0, 47,
+  11, 21, 63, 0, 0, 58, 0, 0, 0, 24,
+  97, 0, 27, 0, 0, 89, 26, 22, 38, 4,
+  46, 33, 23, 117, 42, 0, 0, 22, 0, 0,
+  14, 0, 32, 0, 5, 0, 47, 0, 0, 49,
+  0, 19, 0, 0, 17, 1, 30, 0, 0, 0,
+  56, 43, 10, 31, 22, 65, 0, 0, 6, 0,
+  19, 88, 0, 42, 0, 0, 0, 23, 0, 11,
+  0, 31, 0, 0, 0, 0, 0, 85, 98, 0,
+  0, 0, 13, 0, 31, 29, 0, 24, 0, 19,
+  0, 5, 0, 0, 0, 12, 70, 0, 0, 0,
+  32, 0, 63, 0, 24, 34, 0, 10, 0, 0,
+  0, 0, 0, 1, 32, 2, 16, 56, 0, 30,
+  0, 9, 3, 0, 2, 0, 1, 27, 71, 20,
+  5, 0, 0, 23, 0, 18, 0, 0, 30, 0,
+  15, 0, 59, 84, 34, 0, 85, 0, 0, 5,
+  0, 98, 39, 10, 0, 0, 0, 0, 0, 0,
+  57, 0, 55, 0, 96, 0, 0, 81, 9, 12,
+  28, 9, 50, 46, 29, 21, 0, 0, 85, 58,
+  7, 94, 37, 18, 0, 0, 0, 22, 0, 74,
+  0, 50, 11, 36, 0, 0, 0, 84, 19, 16,
+  0, 0, 0, 0, 17, 49, 89, 0, 0, 0,
+  0, 27, 5, 0, 0, 3, 0, 9, 0, 9,
+  21, 75, 0, 33, 64, 0, 0, 0, 0, 0,
+  0, 0, 0, 41, 32, 14, 0, 17, 0, 0,
+  0, 0, 0, 0, 1, 1, 16, 0, 0, 0,
+  49, 11, 3, 0, 0, 29, 0, 16, 72, 0,
+  37, 30, 0, 0, 0, 15, 79, 12, 0, 0,
+  0, 13, 41, 0, 0, 0, 0, 11, 0, 105,
+  32, 28, 0, 0, 0, 8, 36, 0, 22, 20,
+  3, 0, 0, 0, 87, 22, 0, 54, 0, 0,
+  130, 30, 67, 49, 31, 0, 0, 36, 0, 0,
+  48, 46, 0, 0, 36, 0, 58, 28, 0, 42,
+  0, 0, 0, 0, 0, 73, 0, 0, 0, 0,
+  0, 0, 0, 113, 49, 57, 10, 33, 35, 37,
+  0, 0, 24, 0, 0, 52, 0, 0, 0, 0,
+  4, 0, 10, 0, 8, 0, 23, 0, 0, 0,
+  31, 19, 12, 13, 0, 21, 6, 5, 0, 0,
+  11, 0, 0, 0, 48, 0, 0, 18, 58, 12,
+  0, 0, 0, 8, 0, 28, 33, 0, 31, 20,
+  0, 0, 0, 2, 67, 50, 0, 0, 0, 26,
+  49, 0, 0, 0, 0, 31, 0, 97, 52, 74,
+  0, 0, 0, 36, 26, 0, 0, 44, 0, 0,
+  0, 0, 64, 9, 0, 12, 0, 0, 87, 26,
+  88, 48, 67, 0, 0, 16, 0, 0, 28, 0,
+  0, 0, 33, 0, 46, 22, 0, 32, 0, 0,
+  2, 0, 0, 84, 0, 0, 12, 0, 0, 0,
+  1, 115, 49, 54, 0, 40, 17, 26, 0, 0,
+  9, 0, 0, 49, 0, 16, 0, 0, 0, 0,
+  29, 0, 1, 0, 46, 0, 0, 0, 33, 16,
+  0, 98, 0, 20, 14, 0, 60, 12, 44, 16,
+  32, 0, 54, 0, 44, 107, 104, 30, 6, 0,
+  0, 0, 0, 40, 41, 45, 0, 53, 0, 0,
+  0, 0, 87, 64, 0, 0, 0, 27, 0, 41,
+  0, 0, 16, 28, 30, 44, 24, 53, 0, 28,
+  0, 0, 87, 10, 0, 0, 0, 14, 0, 58,
+  10, 0, 0, 24, 0, 0, 75, 0, 41, 0,
+  0, 0, 0, 48, 17, 40, 0, 0, 0, 12,
+  73, 0, 9, 26, 0, 32, 2, 2, 0, 43,
+  49, 36, 0, 65, 0, 26, 0, 0, 0, 86,
+  27, 0, 0, 0, 9, 0, 28, 10, 24, 30,
+  0, 17, 0, 27, 0, 0, 0, 0, 2, 0,
+  8, 0, 164, 0, 52, 9, 40, 0, 3, 37,
+  0, 0, 14, 0, 32, 0, 0, 0, 3, 23,
+  56, 0, 0, 4, 62, 15, 4, 0, 0, 72,
+  0, 17, 107, 0, 0, 48, 0, 0, 0, 48,
+  90, 0, 0, 0, 0, 51, 43, 7, 0, 46,
+  21, 29, 25, 100, 41, 0, 0, 5, 0, 0,
+  5, 0, 27, 0, 7, 0, 20, 2, 58, 63,
+  0, 50, 0, 0, 97, 52, 73, 0, 0, 0,
+  9, 20, 30, 0, 53, 59, 0, 0, 0, 0,
+  39, 57, 10, 31, 0, 0, 0, 14, 0, 0,
+  0, 54, 0, 21, 0, 18, 0, 113, 24, 11,
+  22, 20, 39, 43, 10, 0, 43, 0, 0, 50,
+  0, 0, 0, 0, 10, 1, 48, 0, 7, 0,
+  27, 0, 30, 0, 30, 47, 0, 22, 0, 0,
+  13, 12, 20, 0, 30, 0, 12, 20, 47, 4,
+  0, 16, 61, 0, 3, 0, 0, 56, 0, 10,
+  36, 0, 0, 41, 0, 0, 2, 0, 51, 24,
+  0, 0, 0, 75, 57, 0, 0, 1, 0, 46,
+  0, 115, 40, 68, 0, 0, 0, 16, 0, 0,
+  30, 32, 30, 0, 49, 0, 37, 54, 0, 31,
+  7, 0, 25, 63, 98, 0, 89, 0, 26, 32,
+  28, 22, 29, 0, 0, 0, 0, 0, 23, 34,
+  22, 43, 0, 13, 0, 0, 0, 67, 0, 29,
+  0, 0, 0, 0, 28, 122, 64, 34, 0, 28,
+  14, 55, 5, 5, 0, 0, 0, 59, 0, 9,
+  0, 5, 0, 38, 80, 0, 0, 0, 7, 0,
+  12, 0, 22, 22, 0, 49, 0, 0, 0, 0,
+  12, 0, 80, 43, 25, 0, 73, 2, 0, 149,
+  100, 43, 17, 0, 0, 0, 0, 25, 0, 0,
+  21, 90, 9, 0, 9, 0, 115, 13, 0, 0,
+  4, 73, 0, 0, 23, 0, 0, 26, 0, 80,
+  0, 54, 0, 37, 0, 15, 61, 0, 0, 23,
+  13, 7, 0, 32, 0, 0, 0, 0, 0, 0,
+  27, 12, 61, 0, 7, 0, 0, 98, 0, 66,
+  0, 13, 0, 0, 19, 3, 24, 48, 0, 47,
+  3, 23, 13, 19, 53, 124, 0, 32, 23, 0,
+  0, 0, 0, 90, 142, 0, 0, 0, 8, 0,
+  0, 33, 0, 34, 0, 47, 0, 22, 0, 0,
+  0, 0, 6, 0, 0, 0, 122, 0, 29, 0,
+  52, 16, 0, 39, 58, 0, 0, 0, 35, 20,
+  76, 0, 11, 39, 97, 0, 0, 94, 63, 17,
+  0, 0, 0, 47, 11, 21, 63, 0, 0, 58,
+  0, 0, 0, 24, 97, 0, 27, 0, 0, 89,
+  26, 22, 38, 4, 46, 33, 23, 117, 42, 0,
+  0, 22, 0, 0, 14, 0, 32, 0, 5, 0,
+  47, 0, 0, 49, 0, 19, 0, 0, 17, 1,
+  30, 0, 0, 0, 56, 43, 10, 31, 22, 65,
+  0, 0, 6, 0, 19, 88, 0, 42, 0, 0,
+  0, 23, 0, 11, 0, 31, 0, 0, 0, 0,
+  0, 85, 98, 0, 0, 0, 13, 0, 31, 29,
+  0, 24, 0, 19, 0, 5, 0, 0, 0, 12,
+  70, 0, 0, 0, 32, 0, 63, 0, 24, 34,
+  0, 10, 0, 0, 0, 0, 0, 1, 32, 2,
+  16, 56, 0, 30, 0, 9, 3, 0, 2, 0,
+  1, 27, 71, 20, 5, 0, 0, 23, 0, 18,
+  0, 0, 30, 0, 15, 0, 59, 84, 34, 0,
+  85, 0, 0, 5, 0, 98, 39, 10, 0, 0,
+  0, 0, 0, 0, 57, 0, 55, 0, 96, 0,
+  0, 81, 9, 12, 28, 9, 50, 46, 29, 21,
+  0, 0, 85, 58, 7, 94, 37, 18, 0, 0,
+  0, 22, 0, 74, 0, 50, 11, 36, 0, 0,
+  0, 84, 19, 16, 0, 0, 0, 0, 17, 49,
+  89, 0, 0, 0, 0, 27, 5, 0, 0, 3,
+  0, 9, 0, 9, 21, 75, 0, 33, 64, 0,
+  0, 0, 0, 0, 0, 0, 0, 41, 4, 18,
+  11, 6, 0, 0, 0, 0, 60, 44, 0, 0,
+  0, 54, 0, 0, 0, 29, 17, 0, 3, 11,
+  34, 17, 0, 0, 58, 48, 0, 0, 0, 0,
+  53, 0, 0, 0, 74, 109, 0, 0, 46, 0,
+  0, 0, 0, 59, 0, 51, 0, 23, 0, 0,
+  0, 0, 78, 7, 34, 8, 0, 0, 0, 52,
+  29, 14, 74, 2, 53, 17, 8, 144, 9, 0,
+  46, 89, 0, 57, 27, 0, 12, 0, 0, 0,
+  31, 87, 0, 30, 0, 43, 20, 0, 0, 171,
+  0, 0, 22, 0, 7, 0, 0, 57, 123, 33,
+  0, 0, 0, 0, 0, 2, 0, 0, 0, 24,
+  0, 10, 20, 24, 0, 0, 14, 0, 0, 0,
+  0, 0, 0, 4, 58, 62, 12, 13, 0, 21,
+  6, 5, 0, 0, 11, 0, 0, 0, 48, 0,
+  0, 18, 58, 12, 0, 0, 0, 8, 0, 28,
+  33, 0, 31, 20, 0, 0, 0, 2, 67, 50,
+  0, 0, 0, 26, 49, 0, 0, 0, 0, 31,
+  0, 97, 52, 74, 0, 0, 0, 36, 26, 0,
+  0, 44, 0, 0, 0, 0, 64, 9, 0, 12,
+  0, 0, 87, 26, 88, 48, 67, 0, 0, 16,
+  0, 0, 28, 0, 0, 0, 33, 0, 46, 22,
+  0, 32, 0, 0, 2, 0, 0, 84, 0, 0,
+  12, 0, 0, 0, 1, 115, 49, 54, 0, 40,
+  17, 26, 0, 0, 9, 0, 0, 49, 0, 16,
+  0, 0, 0, 0, 29, 0, 1, 0, 46, 0,
+  0, 0, 33, 16, 0, 98, 0, 20, 14, 0,
+  60, 12, 44, 16, 32, 0, 54, 0, 44, 107,
+  104, 30, 6, 0, 0, 0, 0, 40, 41, 45,
+  0, 53, 0, 0, 0, 0, 87, 64, 0, 0,
+  0, 27, 0, 41, 0, 0, 16, 28, 30, 44,
+  24, 53, 0, 28, 0, 0, 87, 10, 0, 0,
+  0, 14, 0, 58, 10, 0, 0, 24, 0, 0,
+  75, 0, 41, 0, 0, 0, 0, 48, 17, 40,
+  0, 0, 0, 12, 73, 0, 9, 26, 0, 32,
+  2, 2, 0, 43, 49, 36, 0, 65, 0, 26,
+  0, 0, 0, 86, 27, 0, 0, 0, 9, 0,
+  28, 10, 24, 30, 0, 17, 0, 27, 0, 0,
+  0, 0, 2, 0, 8, 0, 164, 0, 52, 9,
+  40, 0, 0, 111, 49, 4, 4, 0, 0, 13,
+  78, 36, 24, 0, 20, 0, 0, 97, 83, 24,
+  24, 5, 0, 0, 48, 50, 0, 0, 1, 78,
+  1, 0, 0, 0, 68, 0, 12, 0, 0, 28,
+  0, 3, 0, 0, 11, 19, 11, 36, 0, 0,
+  0, 29, 0, 18, 44, 0, 0, 0, 1, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 29, 0,
+  0, 0, 0, 0, 32, 72, 9, 90, 0, 112,
+  2, 20, 35, 0, 0, 53, 0, 31, 6, 61,
+  21, 24, 117, 0, 0, 0, 26, 0, 0, 0,
+  0, 100, 90, 0, 0, 0, 7, 0, 54, 21,
+  0, 21, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 21, 0, 0, 73, 0, 76, 10, 35, 0,
+  0, 22, 0, 0, 13, 12, 20, 0, 30, 0,
+  12, 20, 47, 4, 0, 16, 61, 0, 3, 0,
+  0, 56, 0, 10, 36, 0, 0, 41, 0, 0,
+  2, 0, 51, 24, 0, 0, 0, 75, 57, 0,
+  0, 1, 0, 46, 0, 115, 40, 68, 0, 0,
+  0, 16, 0, 0, 30, 32, 30, 0, 49, 0,
+  37, 54, 0, 31, 7, 0, 25, 63, 98, 0,
+  89, 0, 26, 32, 28, 22, 29, 0, 0, 0,
+  0, 0, 23, 34, 22, 43, 0, 13, 0, 0,
+  0, 67, 0, 29, 0, 0, 0, 0, 28, 122,
+  64, 34, 0, 28, 14, 55, 5, 5, 0, 0,
+  0, 59, 0, 9, 0, 5, 0, 38, 80, 0,
+  0, 0, 7, 0, 12, 0, 22, 22, 0, 49,
+  0, 0, 0, 0, 12, 0, 80, 43, 25, 0,
+  73, 2, 0, 149, 100, 43, 17, 0, 0, 0,
+  0, 25, 0, 0, 21, 90, 9, 0, 9, 0,
+  115, 13, 0, 0, 4, 73, 0, 0, 23, 0,
+  0, 26, 0, 80, 0, 54, 0, 37, 0, 15,
+  61, 0, 0, 23, 13, 7, 0, 32, 0, 0,
+  0, 0, 0, 0, 27, 12, 61, 0, 7, 0,
+  0, 98, 0, 66, 0, 13, 0, 0, 19, 3,
+  24, 48, 0, 47, 3, 23, 13, 19, 53, 124,
+  0, 32, 23, 0, 0, 0, 0, 90, 142, 0,
+  0, 0, 8, 0, 0, 33, 0, 34, 0, 47,
+  0, 22, 0, 0, 0, 0, 6, 0, 0, 0,
+  122, 0, 29, 0, 52, 16, 0, 27, 108, 0,
+  0, 0, 0, 0, 90, 42, 15, 0, 26, 53,
+  0, 84, 60, 35, 50, 0, 0, 15, 20, 31,
+  0, 0, 3, 111, 0, 0, 0, 0, 61, 0,
+  0, 0, 0, 79, 0, 0, 3, 0, 0, 0,
+  0, 28, 0, 0, 0, 35, 0, 82, 11, 0,
+  69, 0, 27, 18, 0, 0, 0, 0, 0, 0,
+  27, 0, 48, 0, 11, 70, 0, 0, 22, 90,
+  0, 69, 0, 68, 0, 0, 7, 0, 32, 92,
+  0, 47, 0, 58, 48, 0, 85, 34, 0, 0,
+  11, 0, 0, 0, 0, 133, 125, 0, 0, 0,
+  8, 0, 0, 61, 0, 16, 7, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 45, 0,
+  54, 0, 21, 46, 0, 10, 0, 0, 0, 0,
+  0, 1, 32, 2, 16, 56, 0, 30, 0, 9,
+  3, 0, 2, 0, 1, 27, 71, 20, 5, 0,
+  0, 23, 0, 18, 0, 0, 30, 0, 15, 0,
+  59, 84, 34, 0, 85, 0, 0, 5, 0, 98,
+  39, 10, 0, 0, 0, 0, 0, 0, 57, 0,
+  55, 0, 96, 0, 0, 81, 9, 12, 28, 9,
+  50, 46, 29, 21, 0, 0, 85, 58, 7, 94,
+  37, 18, 0, 0, 0, 22, 0, 74, 0, 50,
+  11, 36, 0, 0, 0, 84, 19, 16, 0, 0,
+  0, 0, 17, 49, 89, 0, 0, 0, 0, 27,
+  5, 0, 0, 3, 0, 9, 0, 9, 21, 75,
+  0, 33, 64, 0, 0, 0, 0, 0, 0, 0,
+  0, 41, 4, 18, 11, 6, 0, 0, 0, 0,
+  60, 44, 0, 0, 0, 54, 0, 0, 0, 29,
+  17, 0, 3, 11, 34, 17, 0, 0, 58, 48,
+  0, 0, 0, 0, 53, 0, 0, 0, 74, 109,
+  0, 0, 46, 0, 0, 0, 0, 59, 0, 51,
+  0, 23, 0, 0, 0, 0, 78, 7, 34, 8,
+  0, 0, 0, 52, 29, 14, 74, 2, 53, 17,
+  8, 144, 9, 0, 46, 89, 0, 57, 27, 0,
+  12, 0, 0, 0, 31, 87, 0, 30, 0, 43,
+  20, 0, 0, 171, 0, 0, 22, 0, 7, 0,
+  0, 57, 123, 33, 0, 0, 0, 0, 0, 2,
+  0, 0, 0, 24, 0, 10, 20, 24, 0, 0,
+  14, 0, 0, 0, 0, 0, 0, 4, 58, 62,
+  28, 0, 51, 0, 0, 127, 0, 0, 28, 13,
+  0, 0, 0, 82, 0, 0, 9, 29, 31, 0,
+  0, 85, 28, 32, 0, 0, 13, 55, 0, 0,
+  0, 43, 0, 0, 0, 17, 44, 93, 0, 0,
+  24, 0, 15, 0, 0, 32, 0, 29, 0, 35,
+  0, 77, 0, 0, 138, 0, 12, 0, 0, 0,
+  0, 64, 0, 0, 81, 0, 9, 6, 12, 125,
+  8, 0, 33, 55, 0, 39, 22, 0, 0, 0,
+  0, 0, 28, 82, 0, 10, 0, 46, 0, 0,
+  0, 123, 0, 0, 55, 0, 11, 0, 0, 88,
+  63, 49, 0, 0, 27, 0, 0, 10, 0, 6,
+  1, 11, 0, 0, 9, 35, 24, 0, 11, 0,
+  0, 0, 0, 0, 0, 3, 9, 79, 0, 98,
+  0, 20, 14, 0, 60, 12, 44, 16, 32, 0,
+  54, 0, 44, 107, 104, 30, 6, 0, 0, 0,
+  0, 40, 41, 45, 0, 53, 0, 0, 0, 0,
+  87, 64, 0, 0, 0, 27, 0, 41, 0, 0,
+  16, 28, 30, 44, 24, 53, 0, 28, 0, 0,
+  87, 10, 0, 0, 0, 14, 0, 58, 10, 0,
+  0, 24, 0, 0, 75, 0, 41, 0, 0, 0,
+  0, 48, 17, 40, 0, 0, 0, 12, 73, 0,
+  9, 26, 0, 32, 2, 2, 0, 43, 49, 36,
+  0, 65, 0, 26, 0, 0, 0, 86, 27, 0,
+  0, 0, 9, 0, 28, 10, 24, 30, 0, 17,
+  0, 27, 0, 0, 0, 0, 2, 0, 8, 0,
+  164, 0, 52, 9, 40, 0, 0, 111, 49, 4,
+  4, 0, 0, 13, 78, 36, 24, 0, 20, 0,
+  0, 97, 83, 24, 24, 5, 0, 0, 48, 50,
+  0, 0, 1, 78, 1, 0, 0, 0, 68, 0,
+  12, 0, 0, 28, 0, 3, 0, 0, 11, 19,
+  11, 36, 0, 0, 0, 29, 0, 18, 44, 0,
+  0, 0, 1, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 29, 0, 0, 0, 0, 0, 32, 72,
+  9, 90, 0, 112, 2, 20, 35, 0, 0, 53,
+  0, 31, 6, 61, 21, 24, 117, 0, 0, 0,
+  26, 0, 0, 0, 0, 100, 90, 0, 0, 0,
+  7, 0, 54, 21, 0, 21, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 21, 0, 0, 73, 0,
+  76, 10, 35, 0, 59, 1, 72, 42, 0, 0,
+  0, 22, 38, 13, 13, 6, 0, 7, 0, 21,
+  38, 13, 14, 0, 0, 64, 43, 11, 0, 0,
+  1, 54, 0, 38, 0, 39, 17, 0, 12, 19,
+  36, 29, 3, 0, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 0, 0, 70, 0, 0, 91, 0,
+  38, 0, 8, 0, 0, 4, 0, 0, 64, 10,
+  0, 0, 0, 114, 20, 0, 74, 27, 0, 45,
+  12, 51, 27, 0, 0, 0, 15, 101, 0, 21,
+  22, 36, 22, 0, 57, 0, 0, 0, 62, 0,
+  29, 0, 0, 72, 95, 0, 0, 0, 0, 80,
+  0, 16, 0, 0, 0, 13, 0, 0, 0, 0,
+  0, 0, 0, 33, 0, 3, 0, 0, 0, 0,
+  4, 22, 0, 49, 0, 0, 0, 0, 12, 0,
+  80, 43, 25, 0, 73, 2, 0, 149, 100, 43,
+  17, 0, 0, 0, 0, 25, 0, 0, 21, 90,
+  9, 0, 9, 0, 115, 13, 0, 0, 4, 73,
+  0, 0, 23, 0, 0, 26, 0, 80, 0, 54,
+  0, 37, 0, 15, 61, 0, 0, 23, 13, 7,
+  0, 32, 0, 0, 0, 0, 0, 0, 27, 12,
+  61, 0, 7, 0, 0, 98, 0, 66, 0, 13,
+  0, 0, 19, 3, 24, 48, 0, 47, 3, 23,
+  13, 19, 53, 124, 0, 32, 23, 0, 0, 0,
+  0, 90, 142, 0, 0, 0, 8, 0, 0, 33,
+  0, 34, 0, 47, 0, 22, 0, 0, 0, 0,
+  6, 0, 0, 0, 122, 0, 29, 0, 52, 16,
+  0, 27, 108, 0, 0, 0, 0, 0, 90, 42,
+  15, 0, 26, 53, 0, 84, 60, 35, 50, 0,
+  0, 15, 20, 31, 0, 0, 3, 111, 0, 0,
+  0, 0, 61, 0, 0, 0, 0, 79, 0, 0,
+  3, 0, 0, 0, 0, 28, 0, 0, 0, 35,
+  0, 82, 11, 0, 69, 0, 27, 18, 0, 0,
+  0, 0, 0, 0, 27, 0, 48, 0, 11, 70,
+  0, 0, 22, 90, 0, 69, 0, 68, 0, 0,
+  7, 0, 32, 92, 0, 47, 0, 58, 48, 0,
+  85, 34, 0, 0, 11, 0, 0, 0, 0, 133,
+  125, 0, 0, 0, 8, 0, 0, 61, 0, 16,
+  7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 45, 0, 54, 0, 21, 46, 0, 0,
+  117, 0, 0, 75, 0, 0, 21, 0, 0, 1,
+  34, 80, 0, 0, 0, 31, 19, 0, 0, 94,
+  14, 24, 0, 0, 0, 29, 0, 0, 10, 39,
+  0, 0, 0, 0, 0, 56, 0, 0, 0, 0,
+  0, 7, 0, 0, 0, 0, 0, 0, 0, 155,
+  0, 0, 71, 0, 21, 0, 50, 0, 0, 5,
+  0, 0, 108, 0, 0, 0, 0, 98, 0, 0,
+  39, 7, 0, 0, 0, 22, 15, 0, 0, 0,
+  31, 74, 16, 3, 15, 30, 48, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 72, 30, 0,
+  0, 0, 0, 78, 0, 23, 0, 11, 40, 0,
+  0, 0, 17, 16, 68, 25, 10, 51, 0, 3,
+  0, 0, 33, 0, 0, 53, 4, 18, 11, 6,
+  0, 0, 0, 0, 60, 44, 0, 0, 0, 54,
+  0, 0, 0, 29, 17, 0, 3, 11, 34, 17,
+  0, 0, 58, 48, 0, 0, 0, 0, 53, 0,
+  0, 0, 74, 109, 0, 0, 46, 0, 0, 0,
+  0, 59, 0, 51, 0, 23, 0, 0, 0, 0,
+  78, 7, 34, 8, 0, 0, 0, 52, 29, 14,
+  74, 2, 53, 17, 8, 144, 9, 0, 46, 89,
+  0, 57, 27, 0, 12, 0, 0, 0, 31, 87,
+  0, 30, 0, 43, 20, 0, 0, 171, 0, 0,
+  22, 0, 7, 0, 0, 57, 123, 33, 0, 0,
+  0, 0, 0, 2, 0, 0, 0, 24, 0, 10,
+  20, 24, 0, 0, 14, 0, 0, 0, 0, 0,
+  0, 4, 58, 62, 28, 0, 51, 0, 0, 127,
+  0, 0, 28, 13, 0, 0, 0, 82, 0, 0,
+  9, 29, 31, 0, 0, 85, 28, 32, 0, 0,
+  13, 55, 0, 0, 0, 43, 0, 0, 0, 17,
+  44, 93, 0, 0, 24, 0, 15, 0, 0, 32,
+  0, 29, 0, 35, 0, 77, 0, 0, 138, 0,
+  12, 0, 0, 0, 0, 64, 0, 0, 81, 0,
+  9, 6, 12, 125, 8, 0, 33, 55, 0, 39,
+  22, 0, 0, 0, 0, 0, 28, 82, 0, 10,
+  0, 46, 0, 0, 0, 123, 0, 0, 55, 0,
+  11, 0, 0, 88, 63, 49, 0, 0, 27, 0,
+  0, 10, 0, 6, 1, 11, 0, 0, 9, 35,
+  24, 0, 11, 0, 0, 0, 0, 0, 0, 3,
+  9, 79, 0, 0, 30, 0, 26, 161, 0, 0,
+  0, 0, 0, 0, 49, 60, 0, 0, 11, 55,
+  0, 0, 7, 16, 0, 50, 0, 0, 0, 0,
+  0, 35, 21, 0, 0, 13, 0, 0, 0, 55,
+  0, 3, 0, 20, 0, 22, 0, 12, 34, 22,
+  0, 0, 13, 103, 4, 0, 17, 0, 10, 0,
+  46, 0, 0, 0, 0, 0, 54, 0, 0, 2,
+  0, 4, 0, 34, 24, 5, 0, 40, 0, 0,
+  0, 10, 0, 0, 18, 36, 19, 0, 31, 36,
+  38, 0, 0, 22, 13, 0, 4, 0, 0, 0,
+  1, 46, 1, 0, 0, 0, 0, 10, 0, 22,
+  0, 25, 23, 0, 0, 0, 5, 29, 102, 47,
+  32, 3, 54, 0, 0, 0, 37, 15, 0, 14,
+  0, 111, 49, 4, 4, 0, 0, 13, 78, 36,
+  24, 0, 20, 0, 0, 97, 83, 24, 24, 5,
+  0, 0, 48, 50, 0, 0, 1, 78, 1, 0,
+  0, 0, 68, 0, 12, 0, 0, 28, 0, 3,
+  0, 0, 11, 19, 11, 36, 0, 0, 0, 29,
+  0, 18, 44, 0, 0, 0, 1, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+  0, 0, 32, 72, 9, 90, 0, 112, 2, 20,
+  35, 0, 0, 53, 0, 31, 6, 61, 21, 24,
+  117, 0, 0, 0, 26, 0, 0, 0, 0, 100,
+  90, 0, 0, 0, 7, 0, 54, 21, 0, 21,
+  0, 0, 0, 15, 0, 0, 0, 0, 0, 21,
+  0, 0, 73, 0, 76, 10, 35, 0, 59, 1,
+  72, 42, 0, 0, 0, 22, 38, 13, 13, 6,
+  0, 7, 0, 21, 38, 13, 14, 0, 0, 64,
+  43, 11, 0, 0, 1, 54, 0, 38, 0, 39,
+  17, 0, 12, 19, 36, 29, 3, 0, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 0, 0, 70,
+  0, 0, 91, 0, 38, 0, 8, 0, 0, 4,
+  0, 0, 64, 10, 0, 0, 0, 114, 20, 0,
+  74, 27, 0, 45, 12, 51, 27, 0, 0, 0,
+  15, 101, 0, 21, 22, 36, 22, 0, 57, 0,
+  0, 0, 62, 0, 29, 0, 0, 72, 95, 0,
+  0, 0, 0, 80, 0, 16, 0, 0, 0, 13,
+  0, 0, 0, 0, 0, 0, 0, 33, 0, 3,
+  0, 0, 0, 0, 4, 22, 21, 0, 99, 34,
+  0, 157, 0, 0, 0, 0, 0, 17, 14, 49,
+  0, 0, 14, 40, 0, 1, 5, 82, 30, 0,
+  0, 0, 0, 0, 0, 147, 4, 78, 0, 24,
+  0, 23, 87, 19, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 3, 42, 0, 0, 78, 0, 0,
+  59, 0, 56, 0, 27, 0, 0, 28, 13, 0,
+  118, 0, 0, 48, 0, 113, 0, 36, 68, 0,
+  0, 7, 28, 0, 17, 0, 0, 0, 10, 108,
+  35, 0, 27, 10, 7, 0, 0, 0, 13, 0,
+  52, 0, 0, 0, 0, 5, 41, 0, 0, 0,
+  0, 82, 0, 16, 0, 8, 18, 0, 0, 0,
+  39, 10, 84, 0, 0, 54, 5, 43, 0, 6,
+  0, 3, 0, 26, 0, 27, 108, 0, 0, 0,
+  0, 0, 90, 42, 15, 0, 26, 53, 0, 84,
+  60, 35, 50, 0, 0, 15, 20, 31, 0, 0,
+  3, 111, 0, 0, 0, 0, 61, 0, 0, 0,
+  0, 79, 0, 0, 3, 0, 0, 0, 0, 28,
+  0, 0, 0, 35, 0, 82, 11, 0, 69, 0,
+  27, 18, 0, 0, 0, 0, 0, 0, 27, 0,
+  48, 0, 11, 70, 0, 0, 22, 90, 0, 69,
+  0, 68, 0, 0, 7, 0, 32, 92, 0, 47,
+  0, 58, 48, 0, 85, 34, 0, 0, 11, 0,
+  0, 0, 0, 133, 125, 0, 0, 0, 8, 0,
+  0, 61, 0, 16, 7, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 45, 0, 54, 0,
+  21, 46, 0, 0, 117, 0, 0, 75, 0, 0,
+  21, 0, 0, 1, 34, 80, 0, 0, 0, 31,
+  19, 0, 0, 94, 14, 24, 0, 0, 0, 29,
+  0, 0, 10, 39, 0, 0, 0, 0, 0, 56,
+  0, 0, 0, 0, 0, 7, 0, 0, 0, 0,
+  0, 0, 0, 155, 0, 0, 71, 0, 21, 0,
+  50, 0, 0, 5, 0, 0, 108, 0, 0, 0,
+  0, 98, 0, 0, 39, 7, 0, 0, 0, 22,
+  15, 0, 0, 0, 31, 74, 16, 3, 15, 30,
+  48, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 72, 30, 0, 0, 0, 0, 78, 0, 23,
+  0, 11, 40, 0, 0, 0, 17, 16, 68, 25,
+  10, 51, 0, 3, 0, 0, 33, 0, 0, 53,
+  0, 0, 59, 0, 5, 69, 0, 0, 0, 0,
+  0, 19, 45, 76, 0, 0, 0, 17, 2, 8,
+  10, 22, 0, 35, 0, 0, 0, 0, 0, 77,
+  41, 11, 0, 18, 0, 0, 0, 17, 0, 13,
+  0, 0, 0, 39, 0, 0, 0, 0, 0, 0,
+  0, 110, 0, 0, 0, 0, 15, 4, 28, 0,
+  0, 0, 0, 0, 48, 0, 0, 6, 0, 9,
+  0, 40, 17, 0, 0, 0, 0, 0, 53, 0,
+  0, 17, 0, 52, 45, 0, 40, 9, 68, 0,
+  0, 0, 56, 0, 0, 5, 0, 0, 0, 21,
+  0, 0, 0, 0, 1, 53, 0, 16, 7, 45,
+  50, 0, 0, 13, 38, 10, 68, 48, 19, 52,
+  56, 0, 0, 0, 26, 9, 0, 10, 28, 0,
+  51, 0, 0, 127, 0, 0, 28, 13, 0, 0,
+  0, 82, 0, 0, 9, 29, 31, 0, 0, 85,
+  28, 32, 0, 0, 13, 55, 0, 0, 0, 43,
+  0, 0, 0, 17, 44, 93, 0, 0, 24, 0,
+  15, 0, 0, 32, 0, 29, 0, 35, 0, 77,
+  0, 0, 138, 0, 12, 0, 0, 0, 0, 64,
+  0, 0, 81, 0, 9, 6, 12, 125, 8, 0,
+  33, 55, 0, 39, 22, 0, 0, 0, 0, 0,
+  28, 82, 0, 10, 0, 46, 0, 0, 0, 123,
+  0, 0, 55, 0, 11, 0, 0, 88, 63, 49,
+  0, 0, 27, 0, 0, 10, 0, 6, 1, 11,
+  0, 0, 9, 35, 24, 0, 11, 0, 0, 0,
+  0, 0, 0, 3, 9, 79, 0, 0, 30, 0,
+  26, 161, 0, 0, 0, 0, 0, 0, 49, 60,
+  0, 0, 11, 55, 0, 0, 7, 16, 0, 50,
+  0, 0, 0, 0, 0, 35, 21, 0, 0, 13,
+  0, 0, 0, 55, 0, 3, 0, 20, 0, 22,
+  0, 12, 34, 22, 0, 0, 13, 103, 4, 0,
+  17, 0, 10, 0, 46, 0, 0, 0, 0, 0,
+  54, 0, 0, 2, 0, 4, 0, 34, 24, 5,
+  0, 40, 0, 0, 0, 10, 0, 0, 18, 36,
+  19, 0, 31, 36, 38, 0, 0, 22, 13, 0,
+  4, 0, 0, 0, 1, 46, 1, 0, 0, 0,
+  0, 10, 0, 22, 0, 25, 23, 0, 0, 0,
+  5, 29, 102, 47, 32, 3, 54, 0, 0, 0,
+  37, 15, 0, 14, 0, 49, 11, 0, 44, 0,
+  25, 0, 19, 0, 0, 0, 81, 51, 5, 17,
+  15, 0, 0, 0, 3, 0, 0, 60, 21, 63,
+  0, 0, 0, 12, 63, 0, 0, 27, 12, 0,
+  0, 6, 0, 70, 0, 97, 10, 75, 53, 0,
+  0, 0, 0, 6, 0, 65, 94, 0, 0, 3,
+  21, 23, 4, 21, 0, 0, 0, 70, 0, 12,
+  8, 0, 0, 0, 0, 33, 0, 19, 20, 29,
+  0, 0, 0, 27, 44, 20, 19, 0, 78, 0,
+  29, 0, 66, 38, 0, 0, 42, 37, 0, 32,
+  0, 38, 3, 45, 0, 0, 0, 0, 0, 0,
+  3, 5, 71, 72, 88, 0, 0, 7, 31, 0,
+  0, 31, 64, 18, 57, 10, 85, 0, 91, 2,
+  0, 0, 59, 1, 72, 42, 0, 0, 0, 22,
+  38, 13, 13, 6, 0, 7, 0, 21, 38, 13,
+  14, 0, 0, 64, 43, 11, 0, 0, 1, 54,
+  0, 38, 0, 39, 17, 0, 12, 19, 36, 29,
+  3, 0, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 0, 0, 70, 0, 0, 91, 0, 38, 0,
+  8, 0, 0, 4, 0, 0, 64, 10, 0, 0,
+  0, 114, 20, 0, 74, 27, 0, 45, 12, 51,
+  27, 0, 0, 0, 15, 101, 0, 21, 22, 36,
+  22, 0, 57, 0, 0, 0, 62, 0, 29, 0,
+  0, 72, 95, 0, 0, 0, 0, 80, 0, 16,
+  0, 0, 0, 13, 0, 0, 0, 0, 0, 0,
+  0, 33, 0, 3, 0, 0, 0, 0, 4, 22,
+  21, 0, 99, 34, 0, 157, 0, 0, 0, 0,
+  0, 17, 14, 49, 0, 0, 14, 40, 0, 1,
+  5, 82, 30, 0, 0, 0, 0, 0, 0, 147,
+  4, 78, 0, 24, 0, 23, 87, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 3, 42, 0,
+  0, 78, 0, 0, 59, 0, 56, 0, 27, 0,
+  0, 28, 13, 0, 118, 0, 0, 48, 0, 113,
+  0, 36, 68, 0, 0, 7, 28, 0, 17, 0,
+  0, 0, 10, 108, 35, 0, 27, 10, 7, 0,
+  0, 0, 13, 0, 52, 0, 0, 0, 0, 5,
+  41, 0, 0, 0, 0, 82, 0, 16, 0, 8,
+  18, 0, 0, 0, 39, 10, 84, 0, 0, 54,
+  5, 43, 0, 6, 0, 3, 0, 26, 0, 9,
+  38, 0, 15, 120, 0, 0, 0, 0, 0, 3,
+  58, 72, 0, 0, 0, 18, 0, 18, 44, 0,
+  0, 51, 0, 3, 0, 0, 0, 91, 41, 0,
+  0, 22, 0, 0, 0, 22, 0, 25, 0, 45,
+  0, 53, 1, 0, 0, 32, 0, 0, 0, 70,
+  11, 0, 0, 0, 19, 0, 13, 14, 0, 9,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 58,
+  10, 0, 0, 20, 0, 0, 2, 19, 0, 27,
+  10, 28, 51, 0, 32, 5, 54, 4, 0, 0,
+  52, 5, 0, 37, 0, 0, 0, 30, 0, 0,
+  0, 0, 3, 4, 0, 16, 10, 25, 57, 0,
+  0, 17, 37, 0, 63, 43, 24, 47, 55, 1,
+  2, 0, 25, 2, 0, 0, 0, 0, 117, 0,
+  0, 75, 0, 0, 21, 0, 0, 1, 34, 80,
+  0, 0, 0, 31, 19, 0, 0, 94, 14, 24,
+  0, 0, 0, 29, 0, 0, 10, 39, 0, 0,
+  0, 0, 0, 56, 0, 0, 0, 0, 0, 7,
+  0, 0, 0, 0, 0, 0, 0, 155, 0, 0,
+  71, 0, 21, 0, 50, 0, 0, 5, 0, 0,
+  108, 0, 0, 0, 0, 98, 0, 0, 39, 7,
+  0, 0, 0, 22, 15, 0, 0, 0, 31, 74,
+  16, 3, 15, 30, 48, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 72, 30, 0, 0, 0,
+  0, 78, 0, 23, 0, 11, 40, 0, 0, 0,
+  17, 16, 68, 25, 10, 51, 0, 3, 0, 0,
+  33, 0, 0, 53, 0, 0, 59, 0, 5, 69,
+  0, 0, 0, 0, 0, 19, 45, 76, 0, 0,
+  0, 17, 2, 8, 10, 22, 0, 35, 0, 0,
+  0, 0, 0, 77, 41, 11, 0, 18, 0, 0,
+  0, 17, 0, 13, 0, 0, 0, 39, 0, 0,
+  0, 0, 0, 0, 0, 110, 0, 0, 0, 0,
+  15, 4, 28, 0, 0, 0, 0, 0, 48, 0,
+  0, 6, 0, 9, 0, 40, 17, 0, 0, 0,
+  0, 0, 53, 0, 0, 17, 0, 52, 45, 0,
+  40, 9, 68, 0, 0, 0, 56, 0, 0, 5,
+  0, 0, 0, 21, 0, 0, 0, 0, 1, 53,
+  0, 16, 7, 45, 50, 0, 0, 13, 38, 10,
+  68, 48, 19, 52, 56, 0, 0, 0, 26, 9,
+  0, 10, 0, 52, 52, 0, 44, 0, 21, 0,
+  7, 0, 0, 3, 68, 73, 3, 33, 10, 1,
+  18, 0, 44, 0, 0, 50, 14, 42, 0, 0,
+  0, 12, 60, 0, 0, 39, 0, 0, 0, 7,
+  0, 62, 39, 63, 0, 87, 51, 0, 0, 0,
+  0, 0, 0, 78, 42, 0, 0, 0, 18, 20,
+  19, 14, 11, 0, 3, 81, 0, 28, 0, 0,
+  0, 0, 0, 30, 0, 13, 8, 1, 0, 0,
+  0, 18, 37, 38, 21, 0, 88, 0, 16, 0,
+  65, 54, 0, 0, 46, 25, 0, 61, 0, 19,
+  5, 30, 0, 0, 0, 0, 0, 0, 0, 15,
+  38, 43, 88, 0, 0, 20, 22, 0, 0, 24,
+  58, 18, 39, 4, 45, 0, 79, 0, 1, 0,
+  0, 0, 30, 0, 26, 161, 0, 0, 0, 0,
+  0, 0, 49, 60, 0, 0, 11, 55, 0, 0,
+  7, 16, 0, 50, 0, 0, 0, 0, 0, 35,
+  21, 0, 0, 13, 0, 0, 0, 55, 0, 3,
+  0, 20, 0, 22, 0, 12, 34, 22, 0, 0,
+  13, 103, 4, 0, 17, 0, 10, 0, 46, 0,
+  0, 0, 0, 0, 54, 0, 0, 2, 0, 4,
+  0, 34, 24, 5, 0, 40, 0, 0, 0, 10,
+  0, 0, 18, 36, 19, 0, 31, 36, 38, 0,
+  0, 22, 13, 0, 4, 0, 0, 0, 1, 46,
+  1, 0, 0, 0, 0, 10, 0, 22, 0, 25,
+  23, 0, 0, 0, 5, 29, 102, 47, 32, 3,
+  54, 0, 0, 0, 37, 15, 0, 14, 0, 49,
+  11, 0, 44, 0, 25, 0, 19, 0, 0, 0,
+  81, 51, 5, 17, 15, 0, 0, 0, 3, 0,
+  0, 60, 21, 63, 0, 0, 0, 12, 63, 0,
+  0, 27, 12, 0, 0, 6, 0, 70, 0, 97,
+  10, 75, 53, 0, 0, 0, 0, 6, 0, 65,
+  94, 0, 0, 3, 21, 23, 4, 21, 0, 0,
+  0, 70, 0, 12, 8, 0, 0, 0, 0, 33,
+  0, 19, 20, 29, 0, 0, 0, 27, 44, 20,
+  19, 0, 78, 0, 29, 0, 66, 38, 0, 0,
+  42, 37, 0, 32, 0, 38, 3, 45, 0, 0,
+  0, 0, 0, 0, 3, 5, 71, 72, 88, 0,
+  0, 7, 31, 0, 0, 31, 64, 18, 57, 10,
+  85, 0, 91, 2, 0, 0, 0, 21, 76, 0,
+  26, 0, 1, 0, 0, 0, 0, 6, 28, 78,
+  0, 20, 4, 29, 21, 10, 35, 34, 113, 11,
+  0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+  0, 0, 0, 1, 0, 10, 66, 3, 0, 101,
+  57, 6, 0, 0, 0, 0, 0, 90, 1, 0,
+  17, 0, 40, 0, 25, 0, 0, 10, 7, 19,
+  34, 0, 0, 18, 0, 29, 0, 0, 0, 43,
+  3, 0, 0, 28, 0, 0, 37, 0, 22, 0,
+  65, 9, 0, 0, 20, 0, 0, 16, 13, 0,
+  0, 46, 0, 0, 0, 39, 0, 0, 0, 0,
+  1, 0, 0, 4, 0, 7, 72, 14, 0, 12,
+  20, 0, 52, 13, 51, 13, 13, 0, 0, 0,
+  64, 0, 0, 0, 21, 0, 99, 34, 0, 157,
+  0, 0, 0, 0, 0, 17, 14, 49, 0, 0,
+  14, 40, 0, 1, 5, 82, 30, 0, 0, 0,
+  0, 0, 0, 147, 4, 78, 0, 24, 0, 23,
+  87, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 3, 42, 0, 0, 78, 0, 0, 59, 0,
+  56, 0, 27, 0, 0, 28, 13, 0, 118, 0,
+  0, 48, 0, 113, 0, 36, 68, 0, 0, 7,
+  28, 0, 17, 0, 0, 0, 10, 108, 35, 0,
+  27, 10, 7, 0, 0, 0, 13, 0, 52, 0,
+  0, 0, 0, 5, 41, 0, 0, 0, 0, 82,
+  0, 16, 0, 8, 18, 0, 0, 0, 39, 10,
+  84, 0, 0, 54, 5, 43, 0, 6, 0, 3,
+  0, 26, 0, 9, 38, 0, 15, 120, 0, 0,
+  0, 0, 0, 3, 58, 72, 0, 0, 0, 18,
+  0, 18, 44, 0, 0, 51, 0, 3, 0, 0,
+  0, 91, 41, 0, 0, 22, 0, 0, 0, 22,
+  0, 25, 0, 45, 0, 53, 1, 0, 0, 32,
+  0, 0, 0, 70, 11, 0, 0, 0, 19, 0,
+  13, 14, 0, 9, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 58, 10, 0, 0, 20, 0, 0,
+  2, 19, 0, 27, 10, 28, 51, 0, 32, 5,
+  54, 4, 0, 0, 52, 5, 0, 37, 0, 0,
+  0, 30, 0, 0, 0, 0, 3, 4, 0, 16,
+  10, 25, 57, 0, 0, 17, 37, 0, 63, 43,
+  24, 47, 55, 1, 2, 0, 25, 2, 0, 0,
+  0, 70, 65, 0, 63, 0, 15, 0, 1, 0,
+  14, 0, 64, 75, 0, 51, 17, 7, 26, 16,
+  9, 0, 0, 47, 38, 59, 0, 0, 0, 0,
+  53, 0, 0, 37, 12, 0, 0, 0, 0, 53,
+  50, 43, 24, 71, 73, 0, 0, 0, 0, 0,
+  0, 26, 50, 0, 0, 0, 0, 20, 1, 27,
+  24, 0, 0, 63, 0, 2, 29, 0, 0, 0,
+  0, 0, 7, 41, 16, 12, 0, 17, 0, 23,
+  46, 34, 33, 22, 87, 14, 32, 4, 49, 40,
+  0, 20, 24, 31, 0, 54, 0, 35, 3, 41,
+  0, 0, 0, 0, 0, 0, 7, 10, 34, 32,
+  82, 0, 0, 13, 31, 0, 0, 29, 54, 8,
+  7, 0, 55, 0, 75, 11, 2, 0, 0, 0,
+  59, 0, 5, 69, 0, 0, 0, 0, 0, 19,
+  45, 76, 0, 0, 0, 17, 2, 8, 10, 22,
+  0, 35, 0, 0, 0, 0, 0, 77, 41, 11,
+  0, 18, 0, 0, 0, 17, 0, 13, 0, 0,
+  0, 39, 0, 0, 0, 0, 0, 0, 0, 110,
+  0, 0, 0, 0, 15, 4, 28, 0, 0, 0,
+  0, 0, 48, 0, 0, 6, 0, 9, 0, 40,
+  17, 0, 0, 0, 0, 0, 53, 0, 0, 17,
+  0, 52, 45, 0, 40, 9, 68, 0, 0, 0,
+  56, 0, 0, 5, 0, 0, 0, 21, 0, 0,
+  0, 0, 1, 53, 0, 16, 7, 45, 50, 0,
+  0, 13, 38, 10, 68, 48, 19, 52, 56, 0,
+  0, 0, 26, 9, 0, 10, 0, 52, 52, 0,
+  44, 0, 21, 0, 7, 0, 0, 3, 68, 73,
+  3, 33, 10, 1, 18, 0, 44, 0, 0, 50,
+  14, 42, 0, 0, 0, 12, 60, 0, 0, 39,
+  0, 0, 0, 7, 0, 62, 39, 63, 0, 87,
+  51, 0, 0, 0, 0, 0, 0, 78, 42, 0,
+  0, 0, 18, 20, 19, 14, 11, 0, 3, 81,
+  0, 28, 0, 0, 0, 0, 0, 30, 0, 13,
+  8, 1, 0, 0, 0, 18, 37, 38, 21, 0,
+  88, 0, 16, 0, 65, 54, 0, 0, 46, 25,
+  0, 61, 0, 19, 5, 30, 0, 0, 0, 0,
+  0, 0, 0, 15, 38, 43, 88, 0, 0, 20,
+  22, 0, 0, 24, 58, 18, 39, 4, 45, 0,
+  79, 0, 1, 0, 0, 16, 100, 0, 22, 0,
+  0, 0, 0, 0, 0, 11, 22, 94, 0, 49,
+  0, 51, 31, 35, 50, 27, 110, 9, 0, 0,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 94, 0, 0, 96, 51, 18,
+  0, 0, 0, 0, 0, 79, 0, 0, 15, 0,
+  24, 0, 24, 0, 7, 8, 19, 6, 56, 0,
+  0, 10, 0, 51, 0, 0, 21, 34, 0, 0,
+  0, 16, 0, 0, 24, 0, 36, 0, 41, 12,
+  2, 0, 43, 21, 0, 36, 0, 0, 5, 39,
+  0, 0, 0, 27, 23, 0, 0, 0, 0, 0,
+  0, 11, 0, 6, 79, 9, 0, 5, 40, 0,
+  52, 15, 28, 31, 21, 0, 0, 0, 55, 12,
+  0, 0, 0, 49, 11, 0, 44, 0, 25, 0,
+  19, 0, 0, 0, 81, 51, 5, 17, 15, 0,
+  0, 0, 3, 0, 0, 60, 21, 63, 0, 0,
+  0, 12, 63, 0, 0, 27, 12, 0, 0, 6,
+  0, 70, 0, 97, 10, 75, 53, 0, 0, 0,
+  0, 6, 0, 65, 94, 0, 0, 3, 21, 23,
+  4, 21, 0, 0, 0, 70, 0, 12, 8, 0,
+  0, 0, 0, 33, 0, 19, 20, 29, 0, 0,
+  0, 27, 44, 20, 19, 0, 78, 0, 29, 0,
+  66, 38, 0, 0, 42, 37, 0, 32, 0, 38,
+  3, 45, 0, 0, 0, 0, 0, 0, 3, 5,
+  71, 72, 88, 0, 0, 7, 31, 0, 0, 31,
+  64, 18, 57, 10, 85, 0, 91, 2, 0, 0,
+  0, 21, 76, 0, 26, 0, 1, 0, 0, 0,
+  0, 6, 28, 78, 0, 20, 4, 29, 21, 10,
+  35, 34, 113, 11, 0, 0, 0, 0, 0, 0,
+  18, 0, 0, 0, 0, 0, 0, 1, 0, 10,
+  66, 3, 0, 101, 57, 6, 0, 0, 0, 0,
+  0, 90, 1, 0, 17, 0, 40, 0, 25, 0,
+  0, 10, 7, 19, 34, 0, 0, 18, 0, 29,
+  0, 0, 0, 43, 3, 0, 0, 28, 0, 0,
+  37, 0, 22, 0, 65, 9, 0, 0, 20, 0,
+  0, 16, 13, 0, 0, 46, 0, 0, 0, 39,
+  0, 0, 0, 0, 1, 0, 0, 4, 0, 7,
+  72, 14, 0, 12, 20, 0, 52, 13, 51, 13,
+  13, 0, 0, 0, 64, 0, 0, 0, 4, 0,
+  79, 3, 6, 0, 0, 0, 14, 0, 0, 8,
+  0, 94, 0, 3, 0, 47, 45, 17, 53, 54,
+  102, 0, 0, 0, 0, 16, 0, 0, 0, 0,
+  0, 0, 0, 14, 0, 0, 0, 0, 37, 0,
+  0, 85, 38, 32, 0, 6, 0, 0, 0, 126,
+  0, 0, 66, 0, 24, 0, 20, 0, 0, 0,
+  29, 0, 99, 0, 0, 10, 0, 92, 0, 0,
+  18, 0, 0, 0, 4, 0, 0, 0, 11, 0,
+  20, 0, 18, 0, 0, 0, 39, 0, 0, 7,
+  0, 0, 22, 29, 2, 0, 4, 32, 23, 0,
+  0, 0, 28, 0, 0, 3, 17, 0, 84, 3,
+  0, 15, 21, 0, 112, 0, 10, 16, 55, 0,
+  0, 0, 57, 15, 0, 0, 0, 9, 38, 0,
+  15, 120, 0, 0, 0, 0, 0, 3, 58, 72,
+  0, 0, 0, 18, 0, 18, 44, 0, 0, 51,
+  0, 3, 0, 0, 0, 91, 41, 0, 0, 22,
+  0, 0, 0, 22, 0, 25, 0, 45, 0, 53,
+  1, 0, 0, 32, 0, 0, 0, 70, 11, 0,
+  0, 0, 19, 0, 13, 14, 0, 9, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 58, 10, 0,
+  0, 20, 0, 0, 2, 19, 0, 27, 10, 28,
+  51, 0, 32, 5, 54, 4, 0, 0, 52, 5,
+  0, 37, 0, 0, 0, 30, 0, 0, 0, 0,
+  3, 4, 0, 16, 10, 25, 57, 0, 0, 17,
+  37, 0, 63, 43, 24, 47, 55, 1, 2, 0,
+  25, 2, 0, 0, 0, 70, 65, 0, 63, 0,
+  15, 0, 1, 0, 14, 0, 64, 75, 0, 51,
+  17, 7, 26, 16, 9, 0, 0, 47, 38, 59,
+  0, 0, 0, 0, 53, 0, 0, 37, 12, 0,
+  0, 0, 0, 53, 50, 43, 24, 71, 73, 0,
+  0, 0, 0, 0, 0, 26, 50, 0, 0, 0,
+  0, 20, 1, 27, 24, 0, 0, 63, 0, 2,
+  29, 0, 0, 0, 0, 0, 7, 41, 16, 12,
+  0, 17, 0, 23, 46, 34, 33, 22, 87, 14,
+  32, 4, 49, 40, 0, 20, 24, 31, 0, 54,
+  0, 35, 3, 41, 0, 0, 0, 0, 0, 0,
+  7, 10, 34, 32, 82, 0, 0, 13, 31, 0,
+  0, 29, 54, 8, 7, 0, 55, 0, 75, 11,
+  2, 0, 0, 0, 119, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 103, 0, 9, 0, 6,
+  10, 5, 9, 50, 108, 24, 0, 0, 0, 8,
+  184, 0, 22, 0, 0, 31, 0, 0, 11, 12,
+  0, 10, 106, 0, 19, 21, 57, 33, 0, 2,
+  16, 0, 0, 65, 0, 0, 30, 0, 14, 26,
+  31, 0, 30, 40, 20, 0, 16, 5, 36, 0,
+  0, 70, 0, 0, 38, 61, 0, 0, 13, 0,
+  0, 0, 25, 10, 0, 19, 7, 11, 0, 47,
+  49, 0, 0, 54, 39, 0, 33, 24, 0, 0,
+  0, 22, 19, 7, 17, 0, 40, 27, 0, 5,
+  0, 0, 50, 3, 0, 0, 37, 20, 52, 0,
+  0, 30, 0, 0, 0, 0, 2, 25, 2, 0,
+  0, 52, 52, 0, 44, 0, 21, 0, 7, 0,
+  0, 3, 68, 73, 3, 33, 10, 1, 18, 0,
+  44, 0, 0, 50, 14, 42, 0, 0, 0, 12,
+  60, 0, 0, 39, 0, 0, 0, 7, 0, 62,
+  39, 63, 0, 87, 51, 0, 0, 0, 0, 0,
+  0, 78, 42, 0, 0, 0, 18, 20, 19, 14,
+  11, 0, 3, 81, 0, 28, 0, 0, 0, 0,
+  0, 30, 0, 13, 8, 1, 0, 0, 0, 18,
+  37, 38, 21, 0, 88, 0, 16, 0, 65, 54,
+  0, 0, 46, 25, 0, 61, 0, 19, 5, 30,
+  0, 0, 0, 0, 0, 0, 0, 15, 38, 43,
+  88, 0, 0, 20, 22, 0, 0, 24, 58, 18,
+  39, 4, 45, 0, 79, 0, 1, 0, 0, 16,
+  100, 0, 22, 0, 0, 0, 0, 0, 0, 11,
+  22, 94, 0, 49, 0, 51, 31, 35, 50, 27,
+  110, 9, 0, 0, 0, 0, 0, 0, 32, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 94, 0,
+  0, 96, 51, 18, 0, 0, 0, 0, 0, 79,
+  0, 0, 15, 0, 24, 0, 24, 0, 7, 8,
+  19, 6, 56, 0, 0, 10, 0, 51, 0, 0,
+  21, 34, 0, 0, 0, 16, 0, 0, 24, 0,
+  36, 0, 41, 12, 2, 0, 43, 21, 0, 36,
+  0, 0, 5, 39, 0, 0, 0, 27, 23, 0,
+  0, 0, 0, 0, 0, 11, 0, 6, 79, 9,
+  0, 5, 40, 0, 52, 15, 28, 31, 21, 0,
+  0, 0, 55, 12, 0, 0, 20, 0, 91, 19,
+  0, 0, 0, 12, 20, 0, 0, 0, 0, 125,
+  0, 0, 0, 22, 28, 1, 36, 70, 81, 11,
+  0, 0, 7, 35, 205, 0, 23, 21, 0, 15,
+  0, 0, 0, 31, 0, 0, 65, 0, 0, 38,
+  53, 70, 0, 0, 0, 0, 0, 120, 0, 6,
+  74, 0, 21, 12, 39, 0, 24, 17, 49, 0,
+  50, 0, 10, 0, 0, 102, 0, 0, 27, 14,
+  0, 0, 25, 0, 0, 0, 12, 2, 2, 20,
+  0, 0, 0, 33, 96, 33, 0, 2, 0, 0,
+  53, 20, 39, 0, 2, 26, 35, 12, 15, 0,
+  81, 19, 3, 30, 19, 0, 74, 0, 14, 0,
+  19, 31, 105, 0, 0, 54, 0, 0, 0, 0,
+  40, 22, 0, 17, 0, 21, 76, 0, 26, 0,
+  1, 0, 0, 0, 0, 6, 28, 78, 0, 20,
+  4, 29, 21, 10, 35, 34, 113, 11, 0, 0,
+  0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
+  0, 1, 0, 10, 66, 3, 0, 101, 57, 6,
+  0, 0, 0, 0, 0, 90, 1, 0, 17, 0,
+  40, 0, 25, 0, 0, 10, 7, 19, 34, 0,
+  0, 18, 0, 29, 0, 0, 0, 43, 3, 0,
+  0, 28, 0, 0, 37, 0, 22, 0, 65, 9,
+  0, 0, 20, 0, 0, 16, 13, 0, 0, 46,
+  0, 0, 0, 39, 0, 0, 0, 0, 1, 0,
+  0, 4, 0, 7, 72, 14, 0, 12, 20, 0,
+  52, 13, 51, 13, 13, 0, 0, 0, 64, 0,
+  0, 0, 4, 0, 79, 3, 6, 0, 0, 0,
+  14, 0, 0, 8, 0, 94, 0, 3, 0, 47,
+  45, 17, 53, 54, 102, 0, 0, 0, 0, 16,
+  0, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+  0, 0, 37, 0, 0, 85, 38, 32, 0, 6,
+  0, 0, 0, 126, 0, 0, 66, 0, 24, 0,
+  20, 0, 0, 0, 29, 0, 99, 0, 0, 10,
+  0, 92, 0, 0, 18, 0, 0, 0, 4, 0,
+  0, 0, 11, 0, 20, 0, 18, 0, 0, 0,
+  39, 0, 0, 7, 0, 0, 22, 29, 2, 0,
+  4, 32, 23, 0, 0, 0, 28, 0, 0, 3,
+  17, 0, 84, 3, 0, 15, 21, 0, 112, 0,
+  10, 16, 55, 0, 0, 0, 57, 15, 0, 0,
+  2, 0, 42, 31, 0, 0, 14, 24, 59, 0,
+  4, 0, 0, 82, 0, 0, 0, 8, 26, 0,
+  35, 19, 23, 27, 0, 0, 38, 57, 187, 16,
+  19, 10, 32, 0, 0, 0, 0, 25, 0, 0,
+  0, 0, 0, 32, 38, 93, 0, 17, 0, 0,
+  3, 110, 0, 32, 59, 0, 9, 0, 14, 0,
+  0, 22, 8, 0, 4, 0, 20, 0, 0, 39,
+  0, 6, 29, 4, 0, 9, 34, 0, 0, 0,
+  24, 0, 1, 24, 0, 0, 0, 30, 103, 45,
+  40, 0, 0, 0, 18, 12, 59, 0, 26, 51,
+  26, 6, 18, 0, 84, 0, 42, 12, 87, 0,
+  79, 0, 10, 0, 1, 0, 115, 0, 0, 34,
+  41, 0, 5, 0, 59, 9, 0, 24, 0, 70,
+  65, 0, 63, 0, 15, 0, 1, 0, 14, 0,
+  64, 75, 0, 51, 17, 7, 26, 16, 9, 0,
+  0, 47, 38, 59, 0, 0, 0, 0, 53, 0,
+  0, 37, 12, 0, 0, 0, 0, 53, 50, 43,
+  24, 71, 73, 0, 0, 0, 0, 0, 0, 26,
+  50, 0, 0, 0, 0, 20, 1, 27, 24, 0,
+  0, 63, 0, 2, 29, 0, 0, 0, 0, 0,
+  7, 41, 16, 12, 0, 17, 0, 23, 46, 34,
+  33, 22, 87, 14, 32, 4, 49, 40, 0, 20,
+  24, 31, 0, 54, 0, 35, 3, 41, 0, 0,
+  0, 0, 0, 0, 7, 10, 34, 32, 82, 0,
+  0, 13, 31, 0, 0, 29, 54, 8, 7, 0,
+  55, 0, 75, 11, 2, 0, 0, 0, 119, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 103,
+  0, 9, 0, 6, 10, 5, 9, 50, 108, 24,
+  0, 0, 0, 8, 184, 0, 22, 0, 0, 31,
+  0, 0, 11, 12, 0, 10, 106, 0, 19, 21,
+  57, 33, 0, 2, 16, 0, 0, 65, 0, 0,
+  30, 0, 14, 26, 31, 0, 30, 40, 20, 0,
+  16, 5, 36, 0, 0, 70, 0, 0, 38, 61,
+  0, 0, 13, 0, 0, 0, 25, 10, 0, 19,
+  7, 11, 0, 47, 49, 0, 0, 54, 39, 0,
+  33, 24, 0, 0, 0, 22, 19, 7, 17, 0,
+  40, 27, 0, 5, 0, 0, 50, 3, 0, 0,
+  37, 20, 52, 0, 0, 30, 0, 0, 0, 0,
+  2, 25, 2, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 16, 100, 0, 22, 0, 0, 0,
+  0, 0, 0, 11, 22, 94, 0, 49, 0, 51,
+  31, 35, 50, 27, 110, 9, 0, 0, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 94, 0, 0, 96, 51, 18, 0, 0,
+  0, 0, 0, 79, 0, 0, 15, 0, 24, 0,
+  24, 0, 7, 8, 19, 6, 56, 0, 0, 10,
+  0, 51, 0, 0, 21, 34, 0, 0, 0, 16,
+  0, 0, 24, 0, 36, 0, 41, 12, 2, 0,
+  43, 21, 0, 36, 0, 0, 5, 39, 0, 0,
+  0, 27, 23, 0, 0, 0, 0, 0, 0, 11,
+  0, 6, 79, 9, 0, 5, 40, 0, 52, 15,
+  28, 31, 21, 0, 0, 0, 55, 12, 0, 0,
+  20, 0, 91, 19, 0, 0, 0, 12, 20, 0,
+  0, 0, 0, 125, 0, 0, 0, 22, 28, 1,
+  36, 70, 81, 11, 0, 0, 7, 35, 205, 0,
+  23, 21, 0, 15, 0, 0, 0, 31, 0, 0,
+  65, 0, 0, 38, 53, 70, 0, 0, 0, 0,
+  0, 120, 0, 6, 74, 0, 21, 12, 39, 0,
+  24, 17, 49, 0, 50, 0, 10, 0, 0, 102,
+  0, 0, 27, 14, 0, 0, 25, 0, 0, 0,
+  12, 2, 2, 20, 0, 0, 0, 33, 96, 33,
+  0, 2, 0, 0, 53, 20, 39, 0, 2, 26,
+  35, 12, 15, 0, 81, 19, 3, 30, 19, 0,
+  74, 0, 14, 0, 19, 31, 105, 0, 0, 54,
+  0, 0, 0, 0, 40, 22, 0, 17, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 4, 0, 79, 3,
+  6, 0, 0, 0, 14, 0, 0, 8, 0, 94,
+  0, 3, 0, 47, 45, 17, 53, 54, 102, 0,
+  0, 0, 0, 16, 0, 0, 0, 0, 0, 0,
+  0, 14, 0, 0, 0, 0, 37, 0, 0, 85,
+  38, 32, 0, 6, 0, 0, 0, 126, 0, 0,
+  66, 0, 24, 0, 20, 0, 0, 0, 29, 0,
+  99, 0, 0, 10, 0, 92, 0, 0, 18, 0,
+  0, 0, 4, 0, 0, 0, 11, 0, 20, 0,
+  18, 0, 0, 0, 39, 0, 0, 7, 0, 0,
+  22, 29, 2, 0, 4, 32, 23, 0, 0, 0,
+  28, 0, 0, 3, 17, 0, 84, 3, 0, 15,
+  21, 0, 112, 0, 10, 16, 55, 0, 0, 0,
+  57, 15, 0, 0, 2, 0, 42, 31, 0, 0,
+  14, 24, 59, 0, 4, 0, 0, 82, 0, 0,
+  0, 8, 26, 0, 35, 19, 23, 27, 0, 0,
+  38, 57, 187, 16, 19, 10, 32, 0, 0, 0,
+  0, 25, 0, 0, 0, 0, 0, 32, 38, 93,
+  0, 17, 0, 0, 3, 110, 0, 32, 59, 0,
+  9, 0, 14, 0, 0, 22, 8, 0, 4, 0,
+  20, 0, 0, 39, 0, 6, 29, 4, 0, 9,
+  34, 0, 0, 0, 24, 0, 1, 24, 0, 0,
+  0, 30, 103, 45, 40, 0, 0, 0, 18, 12,
+  59, 0, 26, 51, 26, 6, 18, 0, 84, 0,
+  42, 12, 87, 0, 79, 0, 10, 0, 1, 0,
+  115, 0, 0, 34, 41, 0, 5, 0, 59, 9,
+  0, 24, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 13, 24,
+  67, 6, 0, 18, 27, 22, 0, 0, 0, 0,
+  0, 97, 0, 0, 60, 4, 0, 5, 27, 86,
+  27, 52, 0, 0, 8, 9, 193, 55, 1, 28,
+  52, 0, 59, 1, 0, 58, 0, 17, 14, 39,
+  0, 14, 26, 83, 17, 0, 2, 0, 0, 64,
+  30, 0, 71, 0, 60, 0, 49, 0, 15, 71,
+  0, 0, 0, 0, 7, 6, 77, 33, 0, 22,
+  82, 11, 31, 27, 25, 0, 20, 13, 0, 0,
+  15, 5, 0, 0, 0, 0, 62, 3, 0, 0,
+  23, 0, 15, 37, 0, 0, 49, 67, 15, 0,
+  0, 37, 46, 75, 26, 0, 0, 6, 1, 16,
+  0, 37, 12, 0, 55, 0, 9, 28, 40, 0,
+  0, 0, 4, 0, 26, 26, 0, 60, 0, 15,
+  0, 5, 36, 23, 2, 0, 0, 31, 86, 8,
+  0, 0, 59, 11, 0, 0, 65, 56, 0, 25,
+  23, 0, 0, 13, 0, 13, 0, 11, 92, 0,
+  18, 0, 0, 32, 0, 53, 0, 28, 0, 44,
+  48, 94, 4, 86, 0, 7, 0, 38, 52, 0,
+  35, 0, 21, 0, 24, 0, 13, 27, 0, 40,
+  0, 11, 10, 0, 33, 0, 8, 0, 25, 13,
+  37, 0, 0, 0, 0, 15, 39, 0, 14, 13,
+  0, 0, 0, 0, 0, 24, 0, 0, 0, 13,
+  0, 47, 0, 0, 62, 50, 3, 0, 0, 13,
+  20, 1, 44, 0, 24, 28, 0, 29, 0, 15,
+  0, 0, 25, 0, 11, 10, 47, 0, 42, 0,
+  79, 0, 14, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 30, 25, 0, 1, 3, 33, 18,
+  0, 0, 0, 0, 0, 38, 0, 18, 43, 15,
+  0, 40, 38, 17, 58, 51, 0, 9, 8, 5,
+  128, 38, 0, 0, 54, 0, 69, 16, 0, 30,
+  0, 38, 21, 38, 0, 22, 60, 37, 2, 0,
+  0, 0, 0, 13, 47, 0, 16, 0, 64, 0,
+  29, 0, 6, 33, 7, 0, 0, 0, 7, 19,
+  25, 0, 0, 36, 79, 26, 45, 46, 0, 7,
+  30, 1, 38, 2, 13, 0, 0, 0, 0, 0,
+  54, 6, 3, 0, 38, 1, 15, 56, 0, 0,
+  37, 35, 9, 0, 0, 19, 20, 19, 57, 1,
+  0, 26, 0, 8, 0, 33, 5, 0, 23, 13,
+  0, 22, 19, 0, 0, 0, 19, 0, 11, 9,
+  0, 48, 13, 14, 0, 0, 29, 34, 3, 0,
+  0, 37, 105, 0, 2, 11, 53, 15, 0, 14,
+  67, 51, 53, 17, 9, 0, 0, 9, 0, 0,
+  0, 0, 96, 0, 32, 9, 0, 24, 0, 75,
+  0, 32, 0, 38, 68, 64, 0, 61, 0, 41,
+  0, 28, 43, 1, 16, 0, 14, 0, 11, 0,
+  0, 0, 0, 18, 0, 0, 0, 0, 17, 0,
+  10, 2, 29, 20, 37, 0, 16, 39, 0, 22,
+  45, 0, 41, 0, 0, 0, 0, 0, 0, 7,
+  0, 0, 0, 7, 0, 48, 0, 0, 52, 46,
+  8, 0, 0, 12, 18, 0, 59, 0, 0, 16,
+  0, 17, 0, 17, 0, 0, 14, 0, 6, 8,
+  40, 0, 40, 0, 76, 0, 11, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 62, 32, 0,
+  2, 1, 44, 3, 0, 0, 16, 4, 12, 0,
+  5, 53, 33, 30, 0, 74, 61, 0, 71, 46,
+  0, 36, 0, 3, 111, 34, 1, 0, 57, 0,
+  53, 22, 0, 16, 0, 48, 40, 30, 5, 36,
+  99, 16, 0, 12, 0, 8, 1, 0, 56, 0,
+  0, 0, 43, 0, 7, 33, 9, 0, 16, 0,
+  0, 0, 18, 21, 0, 0, 8, 32, 42, 43,
+  43, 31, 0, 15, 0, 0, 70, 13, 10, 0,
+  12, 12, 0, 0, 50, 9, 2, 0, 16, 0,
+  5, 73, 0, 0, 8, 21, 2, 0, 0, 16,
+  17, 0, 77, 9, 0, 22, 29, 1, 0, 33,
+  0, 0, 0, 15, 0, 33, 26, 0, 0, 0,
+  28, 0, 14, 0, 5, 45, 49, 8, 0, 13,
+  12, 23, 0, 0, 0, 49, 90, 0, 0, 29,
+  44, 13, 0, 25, 68, 58, 82, 13, 0, 0,
+  0, 11, 0, 0, 0, 0, 81, 0, 34, 31,
+  0, 20, 0, 59, 2, 29, 0, 28, 67, 52,
+  0, 60, 0, 43, 0, 42, 24, 0, 22, 0,
+  17, 0, 7, 0, 0, 0, 0, 9, 8, 0,
+  0, 0, 16, 0, 14, 13, 19, 19, 30, 0,
+  40, 53, 0, 19, 43, 0, 42, 0, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 33,
+  18, 0, 37, 45, 21, 0, 0, 23, 29, 0,
+  60, 0, 0, 7, 11, 13, 0, 17, 0, 0,
+  0, 0, 1, 9, 37, 0, 7, 0, 52, 0,
+  8, 2, 13, 24, 67, 6, 0, 18, 27, 22,
+  0, 0, 0, 0, 0, 97, 0, 0, 60, 4,
+  0, 5, 27, 86, 27, 52, 0, 0, 8, 9,
+  193, 55, 1, 28, 52, 0, 59, 1, 0, 58,
+  0, 17, 14, 39, 0, 14, 26, 83, 17, 0,
+  2, 0, 0, 64, 30, 0, 71, 0, 60, 0,
+  49, 0, 15, 71, 0, 0, 0, 0, 7, 6,
+  77, 33, 0, 22, 82, 11, 31, 27, 25, 0,
+  20, 13, 0, 0, 15, 5, 0, 0, 0, 0,
+  62, 3, 0, 0, 23, 0, 15, 37, 0, 0,
+  49, 67, 15, 0, 0, 37, 46, 75, 26, 0,
+  0, 6, 1, 16, 0, 37, 12, 0, 55, 0,
+  9, 28, 40, 0, 0, 0, 4, 0, 26, 26,
+  0, 60, 0, 15, 0, 5, 36, 23, 2, 0,
+  0, 31, 86, 8, 0, 0, 59, 11, 0, 0,
+  65, 56, 0, 25, 23, 0, 0, 13, 0, 13,
+  0, 11, 92, 0, 18, 0, 0, 32, 0, 53,
+  0, 28, 0, 44, 48, 94, 4, 86, 0, 7,
+  0, 38, 52, 0, 35, 0, 21, 0, 24, 0,
+  13, 27, 0, 40, 0, 11, 10, 0, 33, 0,
+  8, 0, 25, 13, 37, 0, 0, 0, 0, 15,
+  39, 0, 14, 13, 0, 0, 0, 0, 0, 24,
+  0, 0, 0, 13, 0, 47, 0, 0, 62, 50,
+  3, 0, 0, 13, 20, 1, 44, 0, 24, 28,
+  0, 29, 0, 15, 0, 0, 25, 0, 11, 10,
+  47, 0, 42, 0, 79, 0, 14, 0, 3, 28,
+  40, 34, 0, 19, 25, 3, 20, 0, 0, 31,
+  114, 0, 21, 37, 61, 3, 0, 0, 0, 74,
+  0, 5, 57, 0, 0, 30, 0, 1, 0, 41,
+  79, 0, 10, 0, 0, 27, 0, 80, 0, 41,
+  32, 32, 31, 55, 32, 23, 0, 44, 0, 50,
+  31, 17, 17, 0, 7, 0, 0, 0, 12, 0,
+  0, 36, 0, 0, 4, 0, 28, 0, 17, 10,
+  0, 3, 3, 0, 15, 36, 0, 33, 36, 0,
+  51, 45, 0, 0, 5, 0, 0, 36, 0, 0,
+  0, 5, 0, 25, 33, 0, 3, 68, 5, 0,
+  5, 7, 24, 0, 28, 0, 2, 10, 6, 14,
+  0, 1, 0, 0, 2, 0, 6, 0, 15, 4,
+  59, 0, 74, 0, 21, 0, 0, 30, 25, 0,
+  1, 3, 33, 18, 0, 0, 0, 0, 0, 38,
+  0, 18, 43, 15, 0, 40, 38, 17, 58, 51,
+  0, 9, 8, 5, 128, 38, 0, 0, 54, 0,
+  69, 16, 0, 30, 0, 38, 21, 38, 0, 22,
+  60, 37, 2, 0, 0, 0, 0, 13, 47, 0,
+  16, 0, 64, 0, 29, 0, 6, 33, 7, 0,
+  0, 0, 7, 19, 25, 0, 0, 36, 79, 26,
+  45, 46, 0, 7, 30, 1, 38, 2, 13, 0,
+  0, 0, 0, 0, 54, 6, 3, 0, 38, 1,
+  15, 56, 0, 0, 37, 35, 9, 0, 0, 19,
+  20, 19, 57, 1, 0, 26, 0, 8, 0, 33,
+  5, 0, 23, 13, 0, 22, 19, 0, 0, 0,
+  19, 0, 11, 9, 0, 48, 13, 14, 0, 0,
+  29, 34, 3, 0, 0, 37, 105, 0, 2, 11,
+  53, 15, 0, 14, 67, 51, 53, 17, 9, 0,
+  0, 9, 0, 0, 0, 0, 96, 0, 32, 9,
+  0, 24, 0, 75, 0, 32, 0, 38, 68, 64,
+  0, 61, 0, 41, 0, 28, 43, 1, 16, 0,
+  14, 0, 11, 0, 0, 0, 0, 18, 0, 0,
+  0, 0, 17, 0, 10, 2, 29, 20, 37, 0,
+  16, 39, 0, 22, 45, 0, 41, 0, 0, 0,
+  0, 0, 0, 7, 0, 0, 0, 7, 0, 48,
+  0, 0, 52, 46, 8, 0, 0, 12, 18, 0,
+  59, 0, 0, 16, 0, 17, 0, 17, 0, 0,
+  14, 0, 6, 8, 40, 0, 40, 0, 76, 0,
+  11, 0, 4, 29, 39, 21, 0, 5, 28, 2,
+  19, 0, 0, 34, 112, 0, 22, 39, 53, 0,
+  0, 0, 0, 83, 0, 10, 59, 0, 0, 23,
+  0, 0, 0, 41, 82, 0, 23, 0, 0, 23,
+  0, 78, 0, 55, 37, 22, 36, 48, 30, 16,
+  0, 54, 0, 60, 33, 24, 31, 0, 11, 0,
+  7, 0, 17, 0, 0, 63, 0, 10, 7, 0,
+  36, 0, 8, 20, 0, 4, 0, 0, 33, 43,
+  0, 29, 44, 0, 61, 29, 0, 0, 0, 0,
+  0, 31, 0, 0, 0, 4, 0, 29, 42, 0,
+  5, 76, 2, 0, 8, 14, 30, 0, 21, 0,
+  0, 0, 8, 15, 0, 0, 0, 0, 0, 0,
+  6, 2, 19, 0, 53, 0, 69, 0, 17, 0,
+  0, 62, 32, 0, 2, 1, 44, 3, 0, 0,
+  16, 4, 12, 0, 5, 53, 33, 30, 0, 74,
+  61, 0, 71, 46, 0, 36, 0, 3, 111, 34,
+  1, 0, 57, 0, 53, 22, 0, 16, 0, 48,
+  40, 30, 5, 36, 99, 16, 0, 12, 0, 8,
+  1, 0, 56, 0, 0, 0, 43, 0, 7, 33,
+  9, 0, 16, 0, 0, 0, 18, 21, 0, 0,
+  8, 32, 42, 43, 43, 31, 0, 15, 0, 0,
+  70, 13, 10, 0, 12, 12, 0, 0, 50, 9,
+  2, 0, 16, 0, 5, 73, 0, 0, 8, 21,
+  2, 0, 0, 16, 17, 0, 77, 9, 0, 22,
+  29, 1, 0, 33, 0, 0, 0, 15, 0, 33,
+  26, 0, 0, 0, 28, 0, 14, 0, 5, 45,
+  49, 8, 0, 13, 12, 23, 0, 0, 0, 49,
+  90, 0, 0, 29, 44, 13, 0, 25, 68, 58,
+  82, 13, 0, 0, 0, 11, 0, 0, 0, 0,
+  81, 0, 34, 31, 0, 20, 0, 59, 2, 29,
+  0, 28, 67, 52, 0, 60, 0, 43, 0, 42,
+  24, 0, 22, 0, 17, 0, 7, 0, 0, 0,
+  0, 9, 8, 0, 0, 0, 16, 0, 14, 13,
+  19, 19, 30, 0, 40, 53, 0, 19, 43, 0,
+  42, 0, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 33, 18, 0, 37, 45, 21, 0,
+  0, 23, 29, 0, 60, 0, 0, 7, 11, 13,
+  0, 17, 0, 0, 0, 0, 1, 9, 37, 0,
+  7, 0, 52, 0, 8, 2, 2, 29, 35, 14,
+  0, 2, 25, 15, 25, 0, 0, 41, 100, 0,
+  19, 33, 52, 0, 0, 0, 0, 93, 0, 8,
+  42, 0, 0, 23, 0, 0, 0, 43, 78, 0,
+  33, 0, 0, 18, 0, 68, 0, 56, 40, 13,
+  39, 47, 17, 12, 0, 48, 0, 63, 25, 25,
+  42, 0, 13, 0, 12, 0, 4, 7, 0, 68,
+  0, 15, 1, 0, 32, 0, 7, 15, 0, 11,
+  0, 0, 44, 48, 0, 33, 43, 0, 60, 25,
+  0, 0, 0, 0, 0, 17, 0, 0, 0, 3,
+  0, 32, 43, 0, 2, 82, 3, 0, 8, 22,
+  34, 0, 25, 0, 0, 0, 17, 10, 0, 0,
+  0, 0, 0, 0, 2, 15, 15, 5, 38, 0,
+  55, 0, 13, 0, 0, 60, 0, 15, 0, 5,
+  36, 23, 2, 0, 0, 31, 86, 8, 0, 0,
+  59, 11, 0, 0, 65, 56, 0, 25, 23, 0,
+  0, 13, 0, 13, 0, 11, 92, 0, 18, 0,
+  0, 32, 0, 53, 0, 28, 0, 44, 48, 94,
+  4, 86, 0, 7, 0, 38, 52, 0, 35, 0,
+  21, 0, 24, 0, 13, 27, 0, 40, 0, 11,
+  10, 0, 33, 0, 8, 0, 25, 13, 37, 0,
+  0, 0, 0, 15, 39, 0, 14, 13, 0, 0,
+  0, 0, 0, 24, 0, 0, 0, 13, 0, 47,
+  0, 0, 62, 50, 3, 0, 0, 13, 20, 1,
+  44, 0, 24, 28, 0, 29, 0, 15, 0, 0,
+  25, 0, 11, 10, 47, 0, 42, 0, 79, 0,
+  14, 0, 3, 28, 40, 34, 0, 19, 25, 3,
+  20, 0, 0, 31, 114, 0, 21, 37, 61, 3,
+  0, 0, 0, 74, 0, 5, 57, 0, 0, 30,
+  0, 1, 0, 41, 79, 0, 10, 0, 0, 27,
+  0, 80, 0, 41, 32, 32, 31, 55, 32, 23,
+  0, 44, 0, 50, 31, 17, 17, 0, 7, 0,
+  0, 0, 12, 0, 0, 36, 0, 0, 4, 0,
+  28, 0, 17, 10, 0, 3, 3, 0, 15, 36,
+  0, 33, 36, 0, 51, 45, 0, 0, 5, 0,
+  0, 36, 0, 0, 0, 5, 0, 25, 33, 0,
+  3, 68, 5, 0, 5, 7, 24, 0, 28, 0,
+  2, 10, 6, 14, 0, 1, 0, 0, 2, 0,
+  6, 0, 15, 4, 59, 0, 74, 0, 21, 0,
+  0, 0, 0, 16, 0, 145, 3, 0, 12, 0,
+  0, 27, 50, 0, 0, 22, 2, 0, 1, 0,
+  35, 91, 18, 9, 3, 0, 0, 0, 0, 4,
+  0, 27, 23, 43, 0, 0, 0, 30, 0, 60,
+  0, 29, 0, 69, 6, 72, 26, 52, 0, 0,
+  0, 48, 12, 0, 0, 0, 56, 0, 35, 0,
+  2, 55, 0, 0, 72, 0, 0, 20, 53, 0,
+  83, 22, 17, 0, 0, 33, 2, 22, 0, 37,
+  41, 0, 32, 49, 7, 0, 27, 0, 0, 0,
+  0, 13, 1, 0, 15, 38, 0, 0, 2, 68,
+  27, 0, 0, 7, 17, 0, 22, 0, 0, 0,
+  0, 0, 0, 29, 0, 0, 104, 4, 40, 7,
+  0, 0, 0, 0, 54, 0, 3, 0, 0, 48,
+  13, 14, 0, 0, 29, 34, 3, 0, 0, 37,
+  105, 0, 2, 11, 53, 15, 0, 14, 67, 51,
+  53, 17, 9, 0, 0, 9, 0, 0, 0, 0,
+  96, 0, 32, 9, 0, 24, 0, 75, 0, 32,
+  0, 38, 68, 64, 0, 61, 0, 41, 0, 28,
+  43, 1, 16, 0, 14, 0, 11, 0, 0, 0,
+  0, 18, 0, 0, 0, 0, 17, 0, 10, 2,
+  29, 20, 37, 0, 16, 39, 0, 22, 45, 0,
+  41, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+  0, 7, 0, 48, 0, 0, 52, 46, 8, 0,
+  0, 12, 18, 0, 59, 0, 0, 16, 0, 17,
+  0, 17, 0, 0, 14, 0, 6, 8, 40, 0,
+  40, 0, 76, 0, 11, 0, 4, 29, 39, 21,
+  0, 5, 28, 2, 19, 0, 0, 34, 112, 0,
+  22, 39, 53, 0, 0, 0, 0, 83, 0, 10,
+  59, 0, 0, 23, 0, 0, 0, 41, 82, 0,
+  23, 0, 0, 23, 0, 78, 0, 55, 37, 22,
+  36, 48, 30, 16, 0, 54, 0, 60, 33, 24,
+  31, 0, 11, 0, 7, 0, 17, 0, 0, 63,
+  0, 10, 7, 0, 36, 0, 8, 20, 0, 4,
+  0, 0, 33, 43, 0, 29, 44, 0, 61, 29,
+  0, 0, 0, 0, 0, 31, 0, 0, 0, 4,
+  0, 29, 42, 0, 5, 76, 2, 0, 8, 14,
+  30, 0, 21, 0, 0, 0, 8, 15, 0, 0,
+  0, 0, 0, 0, 6, 2, 19, 0, 53, 0,
+  69, 0, 17, 0, 0, 0, 0, 10, 0, 139,
+  4, 0, 12, 0, 0, 18, 33, 0, 0, 25,
+  0, 0, 0, 0, 30, 95, 19, 11, 3, 0,
+  0, 0, 0, 0, 0, 27, 29, 38, 0, 0,
+  0, 23, 0, 54, 0, 22, 0, 53, 1, 90,
+  35, 56, 0, 0, 0, 51, 6, 0, 10, 0,
+  55, 0, 49, 0, 11, 61, 0, 0, 76, 3,
+  0, 3, 55, 0, 82, 11, 11, 0, 0, 21,
+  26, 25, 0, 32, 34, 0, 41, 44, 0, 0,
+  22, 0, 0, 7, 0, 21, 4, 0, 4, 31,
+  0, 0, 7, 66, 36, 0, 0, 23, 27, 0,
+  16, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  100, 2, 34, 1, 0, 0, 0, 0, 28, 0,
+  0, 0, 5, 45, 49, 8, 0, 13, 12, 23,
+  0, 0, 0, 49, 90, 0, 0, 29, 44, 13,
+  0, 25, 68, 58, 82, 13, 0, 0, 0, 11,
+  0, 0, 0, 0, 81, 0, 34, 31, 0, 20,
+  0, 59, 2, 29, 0, 28, 67, 52, 0, 60,
+  0, 43, 0, 42, 24, 0, 22, 0, 17, 0,
+  7, 0, 0, 0, 0, 9, 8, 0, 0, 0,
+  16, 0, 14, 13, 19, 19, 30, 0, 40, 53,
+  0, 19, 43, 0, 42, 0, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 33, 18, 0,
+  37, 45, 21, 0, 0, 23, 29, 0, 60, 0,
+  0, 7, 11, 13, 0, 17, 0, 0, 0, 0,
+  1, 9, 37, 0, 7, 0, 52, 0, 8, 2,
+  2, 29, 35, 14, 0, 2, 25, 15, 25, 0,
+  0, 41, 100, 0, 19, 33, 52, 0, 0, 0,
+  0, 93, 0, 8, 42, 0, 0, 23, 0, 0,
+  0, 43, 78, 0, 33, 0, 0, 18, 0, 68,
+  0, 56, 40, 13, 39, 47, 17, 12, 0, 48,
+  0, 63, 25, 25, 42, 0, 13, 0, 12, 0,
+  4, 7, 0, 68, 0, 15, 1, 0, 32, 0,
+  7, 15, 0, 11, 0, 0, 44, 48, 0, 33,
+  43, 0, 60, 25, 0, 0, 0, 0, 0, 17,
+  0, 0, 0, 3, 0, 32, 43, 0, 2, 82,
+  3, 0, 8, 22, 34, 0, 25, 0, 0, 0,
+  17, 10, 0, 0, 0, 0, 0, 0, 2, 15,
+  15, 5, 38, 0, 55, 0, 13, 0, 0, 0,
+  0, 2, 0, 130, 10, 0, 4, 0, 0, 17,
+  27, 0, 0, 13, 0, 0, 0, 0, 39, 101,
+  22, 12, 0, 0, 0, 0, 0, 3, 0, 24,
+  35, 28, 1, 0, 0, 22, 0, 43, 0, 20,
+  0, 45, 17, 92, 24, 56, 0, 1, 0, 50,
+  0, 0, 17, 0, 51, 0, 51, 0, 0, 57,
+  0, 0, 72, 8, 0, 8, 34, 0, 64, 5,
+  28, 6, 0, 15, 34, 35, 0, 21, 42, 0,
+  36, 58, 0, 0, 16, 0, 0, 0, 0, 14,
+  4, 0, 0, 35, 0, 0, 0, 63, 44, 0,
+  0, 33, 35, 0, 21, 0, 0, 0, 3, 0,
+  0, 32, 0, 0, 109, 11, 25, 17, 0, 0,
+  0, 0, 15, 0, 0, 0, 3, 28, 40, 34,
+  0, 19, 25, 3, 20, 0, 0, 31, 114, 0,
+  21, 37, 61, 3, 0, 0, 0, 74, 0, 5,
+  57, 0, 0, 30, 0, 1, 0, 41, 79, 0,
+  10, 0, 0, 27, 0, 80, 0, 41, 32, 32,
+  31, 55, 32, 23, 0, 44, 0, 50, 31, 17,
+  17, 0, 7, 0, 0, 0, 12, 0, 0, 36,
+  0, 0, 4, 0, 28, 0, 17, 10, 0, 3,
+  3, 0, 15, 36, 0, 33, 36, 0, 51, 45,
+  0, 0, 5, 0, 0, 36, 0, 0, 0, 5,
+  0, 25, 33, 0, 3, 68, 5, 0, 5, 7,
+  24, 0, 28, 0, 2, 10, 6, 14, 0, 1,
+  0, 0, 2, 0, 6, 0, 15, 4, 59, 0,
+  74, 0, 21, 0, 0, 0, 0, 16, 0, 145,
+  3, 0, 12, 0, 0, 27, 50, 0, 0, 22,
+  2, 0, 1, 0, 35, 91, 18, 9, 3, 0,
+  0, 0, 0, 4, 0, 27, 23, 43, 0, 0,
+  0, 30, 0, 60, 0, 29, 0, 69, 6, 72,
+  26, 52, 0, 0, 0, 48, 12, 0, 0, 0,
+  56, 0, 35, 0, 2, 55, 0, 0, 72, 0,
+  0, 20, 53, 0, 83, 22, 17, 0, 0, 33,
+  2, 22, 0, 37, 41, 0, 32, 49, 7, 0,
+  27, 0, 0, 0, 0, 13, 1, 0, 15, 38,
+  0, 0, 2, 68, 27, 0, 0, 7, 17, 0,
+  22, 0, 0, 0, 0, 0, 0, 29, 0, 0,
+  104, 4, 40, 7, 0, 0, 0, 0, 54, 0,
+  3, 0, 0, 0, 0, 0, 0, 45, 41, 0,
+  20, 0, 0, 0, 75, 11, 19, 55, 39, 21,
+  25, 2, 84, 0, 0, 27, 13, 52, 3, 2,
+  0, 52, 0, 0, 56, 63, 0, 0, 0, 0,
+  0, 59, 0, 43, 0, 45, 7, 20, 17, 36,
+  0, 46, 0, 0, 66, 22, 0, 0, 25, 0,
+  0, 76, 20, 0, 0, 2, 0, 0, 13, 21,
+  31, 0, 0, 26, 0, 14, 8, 55, 0, 0,
+  0, 54, 58, 17, 20, 5, 37, 0, 12, 14,
+  8, 14, 4, 15, 7, 17, 1, 41, 0, 0,
+  39, 55, 6, 0, 4, 0, 0, 0, 35, 0,
+  0, 42, 13, 0, 0, 5, 0, 0, 43, 15,
+  52, 0, 18, 3, 121, 0, 68, 0, 9, 0,
+  4, 29, 39, 21, 0, 5, 28, 2, 19, 0,
+  0, 34, 112, 0, 22, 39, 53, 0, 0, 0,
+  0, 83, 0, 10, 59, 0, 0, 23, 0, 0,
+  0, 41, 82, 0, 23, 0, 0, 23, 0, 78,
+  0, 55, 37, 22, 36, 48, 30, 16, 0, 54,
+  0, 60, 33, 24, 31, 0, 11, 0, 7, 0,
+  17, 0, 0, 63, 0, 10, 7, 0, 36, 0,
+  8, 20, 0, 4, 0, 0, 33, 43, 0, 29,
+  44, 0, 61, 29, 0, 0, 0, 0, 0, 31,
+  0, 0, 0, 4, 0, 29, 42, 0, 5, 76,
+  2, 0, 8, 14, 30, 0, 21, 0, 0, 0,
+  8, 15, 0, 0, 0, 0, 0, 0, 6, 2,
+  19, 0, 53, 0, 69, 0, 17, 0, 0, 0,
+  0, 10, 0, 139, 4, 0, 12, 0, 0, 18,
+  33, 0, 0, 25, 0, 0, 0, 0, 30, 95,
+  19, 11, 3, 0, 0, 0, 0, 0, 0, 27,
+  29, 38, 0, 0, 0, 23, 0, 54, 0, 22,
+  0, 53, 1, 90, 35, 56, 0, 0, 0, 51,
+  6, 0, 10, 0, 55, 0, 49, 0, 11, 61,
+  0, 0, 76, 3, 0, 3, 55, 0, 82, 11,
+  11, 0, 0, 21, 26, 25, 0, 32, 34, 0,
+  41, 44, 0, 0, 22, 0, 0, 7, 0, 21,
+  4, 0, 4, 31, 0, 0, 7, 66, 36, 0,
+  0, 23, 27, 0, 16, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 100, 2, 34, 1, 0, 0,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  9, 38, 29, 0, 28, 0, 15, 0, 49, 21,
+  13, 59, 25, 11, 12, 5, 68, 0, 0, 42,
+  2, 24, 1, 0, 0, 35, 0, 0, 51, 61,
+  4, 0, 0, 0, 0, 42, 8, 38, 0, 45,
+  9, 26, 16, 31, 0, 20, 23, 0, 74, 24,
+  0, 0, 43, 0, 0, 56, 26, 7, 0, 0,
+  0, 0, 26, 8, 30, 0, 0, 7, 0, 8,
+  2, 45, 9, 0, 0, 52, 52, 14, 29, 21,
+  20, 0, 7, 19, 17, 28, 6, 32, 0, 6,
+  20, 41, 0, 0, 30, 59, 7, 0, 1, 0,
+  0, 0, 35, 0, 0, 25, 13, 0, 0, 13,
+  0, 0, 41, 20, 37, 0, 1, 0, 90, 0,
+  36, 0, 0, 0, 2, 29, 35, 14, 0, 2,
+  25, 15, 25, 0, 0, 41, 100, 0, 19, 33,
+  52, 0, 0, 0, 0, 93, 0, 8, 42, 0,
+  0, 23, 0, 0, 0, 43, 78, 0, 33, 0,
+  0, 18, 0, 68, 0, 56, 40, 13, 39, 47,
+  17, 12, 0, 48, 0, 63, 25, 25, 42, 0,
+  13, 0, 12, 0, 4, 7, 0, 68, 0, 15,
+  1, 0, 32, 0, 7, 15, 0, 11, 0, 0,
+  44, 48, 0, 33, 43, 0, 60, 25, 0, 0,
+  0, 0, 0, 17, 0, 0, 0, 3, 0, 32,
+  43, 0, 2, 82, 3, 0, 8, 22, 34, 0,
+  25, 0, 0, 0, 17, 10, 0, 0, 0, 0,
+  0, 0, 2, 15, 15, 5, 38, 0, 55, 0,
+  13, 0, 0, 0, 0, 2, 0, 130, 10, 0,
+  4, 0, 0, 17, 27, 0, 0, 13, 0, 0,
+  0, 0, 39, 101, 22, 12, 0, 0, 0, 0,
+  0, 3, 0, 24, 35, 28, 1, 0, 0, 22,
+  0, 43, 0, 20, 0, 45, 17, 92, 24, 56,
+  0, 1, 0, 50, 0, 0, 17, 0, 51, 0,
+  51, 0, 0, 57, 0, 0, 72, 8, 0, 8,
+  34, 0, 64, 5, 28, 6, 0, 15, 34, 35,
+  0, 21, 42, 0, 36, 58, 0, 0, 16, 0,
+  0, 0, 0, 14, 4, 0, 0, 35, 0, 0,
+  0, 63, 44, 0, 0, 33, 35, 0, 21, 0,
+  0, 0, 3, 0, 0, 32, 0, 0, 109, 11,
+  25, 17, 0, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 30, 33, 0, 19, 0,
+  21, 0, 43, 0, 16, 54, 29, 19, 0, 10,
+  66, 0, 0, 44, 0, 21, 4, 0, 0, 41,
+  0, 0, 53, 56, 9, 0, 0, 0, 0, 18,
+  0, 34, 0, 47, 24, 21, 4, 29, 0, 18,
+  41, 0, 75, 14, 0, 0, 37, 0, 0, 75,
+  15, 0, 0, 0, 0, 0, 34, 16, 0, 0,
+  0, 2, 0, 21, 12, 35, 14, 9, 0, 42,
+  59, 0, 15, 48, 23, 0, 5, 24, 11, 27,
+  9, 21, 0, 6, 17, 45, 0, 0, 9, 43,
+  26, 0, 0, 0, 17, 0, 51, 8, 2, 21,
+  33, 2, 0, 20, 0, 0, 46, 39, 44, 11,
+  0, 0, 80, 0, 29, 15, 0, 0, 0, 0,
+  0, 16, 0, 145, 3, 0, 12, 0, 0, 27,
+  50, 0, 0, 22, 2, 0, 1, 0, 35, 91,
+  18, 9, 3, 0, 0, 0, 0, 4, 0, 27,
+  23, 43, 0, 0, 0, 30, 0, 60, 0, 29,
+  0, 69, 6, 72, 26, 52, 0, 0, 0, 48,
+  12, 0, 0, 0, 56, 0, 35, 0, 2, 55,
+  0, 0, 72, 0, 0, 20, 53, 0, 83, 22,
+  17, 0, 0, 33, 2, 22, 0, 37, 41, 0,
+  32, 49, 7, 0, 27, 0, 0, 0, 0, 13,
+  1, 0, 15, 38, 0, 0, 2, 68, 27, 0,
+  0, 7, 17, 0, 22, 0, 0, 0, 0, 0,
+  0, 29, 0, 0, 104, 4, 40, 7, 0, 0,
+  0, 0, 54, 0, 3, 0, 0, 0, 0, 0,
+  0, 45, 41, 0, 20, 0, 0, 0, 75, 11,
+  19, 55, 39, 21, 25, 2, 84, 0, 0, 27,
+  13, 52, 3, 2, 0, 52, 0, 0, 56, 63,
+  0, 0, 0, 0, 0, 59, 0, 43, 0, 45,
+  7, 20, 17, 36, 0, 46, 0, 0, 66, 22,
+  0, 0, 25, 0, 0, 76, 20, 0, 0, 2,
+  0, 0, 13, 21, 31, 0, 0, 26, 0, 14,
+  8, 55, 0, 0, 0, 54, 58, 17, 20, 5,
+  37, 0, 12, 14, 8, 14, 4, 15, 7, 17,
+  1, 41, 0, 0, 39, 55, 6, 0, 4, 0,
+  0, 0, 35, 0, 0, 42, 13, 0, 0, 5,
+  0, 0, 43, 15, 52, 0, 18, 3, 121, 0,
+  68, 0, 9, 0, 0, 49, 1, 0, 30, 0,
+  15, 0, 64, 0, 0, 7, 46, 41, 52, 60,
+  59, 47, 14, 4, 85, 0, 0, 29, 21, 32,
+  22, 9, 0, 19, 0, 0, 33, 0, 0, 0,
+  0, 0, 0, 62, 0, 0, 0, 54, 0, 32,
+  4, 0, 0, 16, 7, 12, 54, 37, 0, 0,
+  0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+  49, 0, 30, 0, 0, 0, 5, 29, 27, 0,
+  0, 9, 0, 21, 35, 23, 45, 0, 23, 22,
+  4, 26, 21, 30, 26, 0, 0, 24, 0, 19,
+  0, 0, 46, 43, 11, 0, 0, 0, 0, 0,
+  30, 1, 0, 44, 0, 0, 0, 16, 0, 0,
+  1, 3, 6, 0, 0, 0, 95, 0, 52, 0,
+  20, 0, 0, 0, 0, 10, 0, 139, 4, 0,
+  12, 0, 0, 18, 33, 0, 0, 25, 0, 0,
+  0, 0, 30, 95, 19, 11, 3, 0, 0, 0,
+  0, 0, 0, 27, 29, 38, 0, 0, 0, 23,
+  0, 54, 0, 22, 0, 53, 1, 90, 35, 56,
+  0, 0, 0, 51, 6, 0, 10, 0, 55, 0,
+  49, 0, 11, 61, 0, 0, 76, 3, 0, 3,
+  55, 0, 82, 11, 11, 0, 0, 21, 26, 25,
+  0, 32, 34, 0, 41, 44, 0, 0, 22, 0,
+  0, 7, 0, 21, 4, 0, 4, 31, 0, 0,
+  7, 66, 36, 0, 0, 23, 27, 0, 16, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 100, 2,
+  34, 1, 0, 0, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 9, 38, 29, 0, 28, 0,
+  15, 0, 49, 21, 13, 59, 25, 11, 12, 5,
+  68, 0, 0, 42, 2, 24, 1, 0, 0, 35,
+  0, 0, 51, 61, 4, 0, 0, 0, 0, 42,
+  8, 38, 0, 45, 9, 26, 16, 31, 0, 20,
+  23, 0, 74, 24, 0, 0, 43, 0, 0, 56,
+  26, 7, 0, 0, 0, 0, 26, 8, 30, 0,
+  0, 7, 0, 8, 2, 45, 9, 0, 0, 52,
+  52, 14, 29, 21, 20, 0, 7, 19, 17, 28,
+  6, 32, 0, 6, 20, 41, 0, 0, 30, 59,
+  7, 0, 1, 0, 0, 0, 35, 0, 0, 25,
+  13, 0, 0, 13, 0, 0, 41, 20, 37, 0,
+  1, 0, 90, 0, 36, 0, 0, 0, 0, 41,
+  38, 0, 0, 0, 0, 0, 61, 6, 0, 16,
+  12, 19, 25, 54, 49, 37, 21, 5, 43, 0,
+  53, 32, 0, 0, 35, 21, 0, 0, 0, 0,
+  32, 0, 3, 0, 0, 0, 0, 35, 0, 0,
+  0, 27, 0, 26, 0, 0, 0, 15, 28, 3,
+  38, 9, 0, 0, 27, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 56, 0, 5, 0, 0, 0,
+  1, 44, 11, 11, 0, 62, 0, 23, 13, 12,
+  56, 44, 1, 24, 0, 29, 27, 31, 52, 10,
+  0, 0, 12, 0, 0, 0, 11, 51, 42, 0,
+  0, 0, 0, 0, 41, 0, 0, 48, 5, 0,
+  0, 10, 0, 0, 7, 0, 0, 0, 0, 0,
+  47, 0, 21, 0, 1, 20, 0, 0, 0, 2,
+  0, 130, 10, 0, 4, 0, 0, 17, 27, 0,
+  0, 13, 0, 0, 0, 0, 39, 101, 22, 12,
+  0, 0, 0, 0, 0, 3, 0, 24, 35, 28,
+  1, 0, 0, 22, 0, 43, 0, 20, 0, 45,
+  17, 92, 24, 56, 0, 1, 0, 50, 0, 0,
+  17, 0, 51, 0, 51, 0, 0, 57, 0, 0,
+  72, 8, 0, 8, 34, 0, 64, 5, 28, 6,
+  0, 15, 34, 35, 0, 21, 42, 0, 36, 58,
+  0, 0, 16, 0, 0, 0, 0, 14, 4, 0,
+  0, 35, 0, 0, 0, 63, 44, 0, 0, 33,
+  35, 0, 21, 0, 0, 0, 3, 0, 0, 32,
+  0, 0, 109, 11, 25, 17, 0, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 30,
+  33, 0, 19, 0, 21, 0, 43, 0, 16, 54,
+  29, 19, 0, 10, 66, 0, 0, 44, 0, 21,
+  4, 0, 0, 41, 0, 0, 53, 56, 9, 0,
+  0, 0, 0, 18, 0, 34, 0, 47, 24, 21,
+  4, 29, 0, 18, 41, 0, 75, 14, 0, 0,
+  37, 0, 0, 75, 15, 0, 0, 0, 0, 0,
+  34, 16, 0, 0, 0, 2, 0, 21, 12, 35,
+  14, 9, 0, 42, 59, 0, 15, 48, 23, 0,
+  5, 24, 11, 27, 9, 21, 0, 6, 17, 45,
+  0, 0, 9, 43, 26, 0, 0, 0, 17, 0,
+  51, 8, 2, 21, 33, 2, 0, 20, 0, 0,
+  46, 39, 44, 11, 0, 0, 80, 0, 29, 15,
+  0, 0, 0, 47, 63, 0, 0, 0, 0, 0,
+  44, 1, 0, 11, 10, 3, 0, 58, 41, 16,
+  11, 0, 10, 0, 65, 40, 0, 0, 36, 16,
+  0, 0, 0, 0, 20, 0, 20, 14, 0, 0,
+  0, 16, 0, 3, 0, 22, 0, 2, 0, 0,
+  0, 1, 57, 3, 31, 0, 0, 0, 29, 0,
+  0, 14, 3, 0, 0, 0, 16, 0, 39, 2,
+  0, 0, 0, 0, 0, 49, 17, 0, 0, 86,
+  0, 30, 13, 0, 52, 56, 3, 30, 0, 29,
+  23, 24, 50, 0, 0, 0, 17, 0, 0, 0,
+  0, 53, 48, 0, 0, 0, 13, 0, 61, 0,
+  0, 31, 25, 0, 0, 5, 0, 0, 7, 0,
+  0, 16, 0, 0, 30, 0, 18, 13, 0, 31,
+  0, 0, 0, 0, 0, 45, 41, 0, 20, 0,
+  0, 0, 75, 11, 19, 55, 39, 21, 25, 2,
+  84, 0, 0, 27, 13, 52, 3, 2, 0, 52,
+  0, 0, 56, 63, 0, 0, 0, 0, 0, 59,
+  0, 43, 0, 45, 7, 20, 17, 36, 0, 46,
+  0, 0, 66, 22, 0, 0, 25, 0, 0, 76,
+  20, 0, 0, 2, 0, 0, 13, 21, 31, 0,
+  0, 26, 0, 14, 8, 55, 0, 0, 0, 54,
+  58, 17, 20, 5, 37, 0, 12, 14, 8, 14,
+  4, 15, 7, 17, 1, 41, 0, 0, 39, 55,
+  6, 0, 4, 0, 0, 0, 35, 0, 0, 42,
+  13, 0, 0, 5, 0, 0, 43, 15, 52, 0,
+  18, 3, 121, 0, 68, 0, 9, 0, 0, 49,
+  1, 0, 30, 0, 15, 0, 64, 0, 0, 7,
+  46, 41, 52, 60, 59, 47, 14, 4, 85, 0,
+  0, 29, 21, 32, 22, 9, 0, 19, 0, 0,
+  33, 0, 0, 0, 0, 0, 0, 62, 0, 0,
+  0, 54, 0, 32, 4, 0, 0, 16, 7, 12,
+  54, 37, 0, 0, 0, 0, 0, 0, 1, 0,
+  0, 0, 0, 0, 49, 0, 30, 0, 0, 0,
+  5, 29, 27, 0, 0, 9, 0, 21, 35, 23,
+  45, 0, 23, 22, 4, 26, 21, 30, 26, 0,
+  0, 24, 0, 19, 0, 0, 46, 43, 11, 0,
+  0, 0, 0, 0, 30, 1, 0, 44, 0, 0,
+  0, 16, 0, 0, 1, 3, 6, 0, 0, 0,
+  95, 0, 52, 0, 20, 0, 0, 44, 27, 0,
+  33, 0, 0, 0, 76, 0, 0, 1, 67, 69,
+  11, 51, 63, 32, 6, 0, 66, 0, 0, 38,
+  0, 0, 28, 40, 0, 0, 0, 0, 7, 0,
+  0, 0, 0, 27, 0, 47, 0, 0, 0, 20,
+  0, 38, 0, 0, 0, 16, 0, 34, 21, 7,
+  0, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  0, 0, 98, 0, 25, 5, 0, 0, 0, 78,
+  9, 0, 0, 35, 0, 0, 12, 5, 38, 41,
+  20, 53, 0, 44, 32, 14, 27, 37, 0, 13,
+  0, 0, 0, 0, 28, 63, 38, 0, 0, 0,
+  0, 0, 3, 36, 0, 61, 0, 0, 0, 5,
+  3, 0, 4, 0, 0, 0, 0, 0, 77, 0,
+  26, 0, 18, 21, 0, 0, 0, 0, 9, 38,
+  29, 0, 28, 0, 15, 0, 49, 21, 13, 59,
+  25, 11, 12, 5, 68, 0, 0, 42, 2, 24,
+  1, 0, 0, 35, 0, 0, 51, 61, 4, 0,
+  0, 0, 0, 42, 8, 38, 0, 45, 9, 26,
+  16, 31, 0, 20, 23, 0, 74, 24, 0, 0,
+  43, 0, 0, 56, 26, 7, 0, 0, 0, 0,
+  26, 8, 30, 0, 0, 7, 0, 8, 2, 45,
+  9, 0, 0, 52, 52, 14, 29, 21, 20, 0,
+  7, 19, 17, 28, 6, 32, 0, 6, 20, 41,
+  0, 0, 30, 59, 7, 0, 1, 0, 0, 0,
+  35, 0, 0, 25, 13, 0, 0, 13, 0, 0,
+  41, 20, 37, 0, 1, 0, 90, 0, 36, 0,
+  0, 0, 0, 41, 38, 0, 0, 0, 0, 0,
+  61, 6, 0, 16, 12, 19, 25, 54, 49, 37,
+  21, 5, 43, 0, 53, 32, 0, 0, 35, 21,
+  0, 0, 0, 0, 32, 0, 3, 0, 0, 0,
+  0, 35, 0, 0, 0, 27, 0, 26, 0, 0,
+  0, 15, 28, 3, 38, 9, 0, 0, 27, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 56, 0,
+  5, 0, 0, 0, 1, 44, 11, 11, 0, 62,
+  0, 23, 13, 12, 56, 44, 1, 24, 0, 29,
+  27, 31, 52, 10, 0, 0, 12, 0, 0, 0,
+  11, 51, 42, 0, 0, 0, 0, 0, 41, 0,
+  0, 48, 5, 0, 0, 10, 0, 0, 7, 0,
+  0, 0, 0, 0, 47, 0, 21, 0, 1, 20,
+  52, 0, 43, 0, 22, 0, 0, 0, 29, 0,
+  0, 0, 38, 88, 0, 0, 38, 0, 13, 0,
+  33, 104, 68, 26, 0, 0, 8, 50, 0, 0,
+  0, 10, 0, 4, 0, 0, 0, 20, 0, 11,
+  1, 0, 0, 0, 0, 16, 0, 0, 0, 7,
+  0, 77, 0, 0, 52, 0, 26, 23, 6, 0,
+  25, 0, 0, 6, 24, 0, 92, 16, 18, 73,
+  0, 0, 0, 73, 0, 0, 0, 50, 0, 0,
+  0, 0, 11, 59, 10, 49, 0, 55, 10, 0,
+  0, 37, 0, 0, 5, 0, 13, 0, 23, 61,
+  29, 7, 1, 0, 19, 2, 0, 26, 0, 53,
+  0, 7, 0, 0, 0, 23, 69, 0, 1, 0,
+  0, 31, 0, 0, 4, 0, 0, 61, 0, 0,
+  0, 0, 0, 30, 33, 0, 19, 0, 21, 0,
+  43, 0, 16, 54, 29, 19, 0, 10, 66, 0,
+  0, 44, 0, 21, 4, 0, 0, 41, 0, 0,
+  53, 56, 9, 0, 0, 0, 0, 18, 0, 34,
+  0, 47, 24, 21, 4, 29, 0, 18, 41, 0,
+  75, 14, 0, 0, 37, 0, 0, 75, 15, 0,
+  0, 0, 0, 0, 34, 16, 0, 0, 0, 2,
+  0, 21, 12, 35, 14, 9, 0, 42, 59, 0,
+  15, 48, 23, 0, 5, 24, 11, 27, 9, 21,
+  0, 6, 17, 45, 0, 0, 9, 43, 26, 0,
+  0, 0, 17, 0, 51, 8, 2, 21, 33, 2,
+  0, 20, 0, 0, 46, 39, 44, 11, 0, 0,
+  80, 0, 29, 15, 0, 0, 0, 47, 63, 0,
+  0, 0, 0, 0, 44, 1, 0, 11, 10, 3,
+  0, 58, 41, 16, 11, 0, 10, 0, 65, 40,
+  0, 0, 36, 16, 0, 0, 0, 0, 20, 0,
+  20, 14, 0, 0, 0, 16, 0, 3, 0, 22,
+  0, 2, 0, 0, 0, 1, 57, 3, 31, 0,
+  0, 0, 29, 0, 0, 14, 3, 0, 0, 0,
+  16, 0, 39, 2, 0, 0, 0, 0, 0, 49,
+  17, 0, 0, 86, 0, 30, 13, 0, 52, 56,
+  3, 30, 0, 29, 23, 24, 50, 0, 0, 0,
+  17, 0, 0, 0, 0, 53, 48, 0, 0, 0,
+  13, 0, 61, 0, 0, 31, 25, 0, 0, 5,
+  0, 0, 7, 0, 0, 16, 0, 0, 30, 0,
+  18, 13, 0, 31, 103, 0, 37, 5, 6, 15,
+  0, 0, 15, 0, 0, 23, 47, 54, 0, 0,
+  22, 0, 6, 0, 0, 173, 80, 13, 0, 0,
+  0, 33, 0, 0, 2, 56, 0, 34, 0, 21,
+  0, 29, 0, 25, 0, 22, 0, 0, 27, 6,
+  10, 8, 0, 0, 0, 77, 0, 0, 89, 0,
+  43, 20, 45, 0, 35, 11, 0, 32, 30, 49,
+  7, 15, 23, 23, 7, 28, 0, 22, 0, 0,
+  3, 45, 0, 13, 0, 0, 4, 42, 8, 27,
+  0, 9, 0, 0, 0, 0, 8, 0, 7, 0,
+  24, 0, 27, 61, 2, 0, 25, 0, 40, 28,
+  4, 8, 10, 35, 4, 0, 0, 0, 0, 15,
+  78, 0, 23, 10, 0, 35, 0, 0, 20, 3,
+  3, 48, 0, 49, 1, 0, 30, 0, 15, 0,
+  64, 0, 0, 7, 46, 41, 52, 60, 59, 47,
+  14, 4, 85, 0, 0, 29, 21, 32, 22, 9,
+  0, 19, 0, 0, 33, 0, 0, 0, 0, 0,
+  0, 62, 0, 0, 0, 54, 0, 32, 4, 0,
+  0, 16, 7, 12, 54, 37, 0, 0, 0, 0,
+  0, 0, 1, 0, 0, 0, 0, 0, 49, 0,
+  30, 0, 0, 0, 5, 29, 27, 0, 0, 9,
+  0, 21, 35, 23, 45, 0, 23, 22, 4, 26,
+  21, 30, 26, 0, 0, 24, 0, 19, 0, 0,
+  46, 43, 11, 0, 0, 0, 0, 0, 30, 1,
+  0, 44, 0, 0, 0, 16, 0, 0, 1, 3,
+  6, 0, 0, 0, 95, 0, 52, 0, 20, 0,
+  0, 44, 27, 0, 33, 0, 0, 0, 76, 0,
+  0, 1, 67, 69, 11, 51, 63, 32, 6, 0,
+  66, 0, 0, 38, 0, 0, 28, 40, 0, 0,
+  0, 0, 7, 0, 0, 0, 0, 27, 0, 47,
+  0, 0, 0, 20, 0, 38, 0, 0, 0, 16,
+  0, 34, 21, 7, 0, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 0, 0, 98, 0, 25, 5,
+  0, 0, 0, 78, 9, 0, 0, 35, 0, 0,
+  12, 5, 38, 41, 20, 53, 0, 44, 32, 14,
+  27, 37, 0, 13, 0, 0, 0, 0, 28, 63,
+  38, 0, 0, 0, 0, 0, 3, 36, 0, 61,
+  0, 0, 0, 5, 3, 0, 4, 0, 0, 0,
+  0, 0, 77, 0, 26, 0, 18, 21, 29, 0,
+  57, 0, 12, 30, 0, 0, 52, 0, 0, 2,
+  43, 101, 14, 0, 40, 0, 0, 0, 32, 66,
+  0, 35, 0, 0, 0, 29, 0, 8, 0, 0,
+  0, 11, 0, 0, 0, 50, 0, 48, 0, 31,
+  0, 0, 0, 0, 0, 0, 6, 9, 0, 67,
+  0, 0, 11, 0, 13, 40, 0, 0, 5, 7,
+  0, 44, 0, 15, 58, 0, 30, 45, 0, 14,
+  0, 32, 0, 0, 0, 10, 0, 27, 0, 3,
+  29, 32, 45, 49, 0, 64, 21, 0, 0, 14,
+  0, 0, 0, 0, 0, 0, 30, 78, 0, 0,
+  0, 0, 0, 18, 0, 23, 14, 57, 17, 0,
+  0, 0, 29, 0, 59, 1, 9, 2, 0, 17,
+  0, 0, 0, 0, 0, 41, 0, 41, 38, 0,
+  0, 0, 0, 0, 61, 6, 0, 16, 12, 19,
+  25, 54, 49, 37, 21, 5, 43, 0, 53, 32,
+  0, 0, 35, 21, 0, 0, 0, 0, 32, 0,
+  3, 0, 0, 0, 0, 35, 0, 0, 0, 27,
+  0, 26, 0, 0, 0, 15, 28, 3, 38, 9,
+  0, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 56, 0, 5, 0, 0, 0, 1, 44,
+  11, 11, 0, 62, 0, 23, 13, 12, 56, 44,
+  1, 24, 0, 29, 27, 31, 52, 10, 0, 0,
+  12, 0, 0, 0, 11, 51, 42, 0, 0, 0,
+  0, 0, 41, 0, 0, 48, 5, 0, 0, 10,
+  0, 0, 7, 0, 0, 0, 0, 0, 47, 0,
+  21, 0, 1, 20, 52, 0, 43, 0, 22, 0,
+  0, 0, 29, 0, 0, 0, 38, 88, 0, 0,
+  38, 0, 13, 0, 33, 104, 68, 26, 0, 0,
+  8, 50, 0, 0, 0, 10, 0, 4, 0, 0,
+  0, 20, 0, 11, 1, 0, 0, 0, 0, 16,
+  0, 0, 0, 7, 0, 77, 0, 0, 52, 0,
+  26, 23, 6, 0, 25, 0, 0, 6, 24, 0,
+  92, 16, 18, 73, 0, 0, 0, 73, 0, 0,
+  0, 50, 0, 0, 0, 0, 11, 59, 10, 49,
+  0, 55, 10, 0, 0, 37, 0, 0, 5, 0,
+  13, 0, 23, 61, 29, 7, 1, 0, 19, 2,
+  0, 26, 0, 53, 0, 7, 0, 0, 0, 23,
+  69, 0, 1, 0, 0, 31, 0, 0, 4, 0,
+  0, 61, 44, 0, 0, 0, 25, 73, 0, 0,
+  7, 0, 0, 0, 26, 81, 0, 0, 48, 0,
+  0, 0, 40, 70, 0, 48, 0, 0, 0, 16,
+  0, 0, 0, 0, 0, 39, 0, 0, 0, 36,
+  0, 27, 0, 6, 0, 0, 20, 1, 0, 24,
+  22, 0, 0, 39, 0, 0, 0, 0, 10, 25,
+  0, 0, 31, 12, 0, 4, 0, 0, 87, 23,
+  22, 30, 0, 6, 0, 43, 7, 0, 0, 5,
+  0, 16, 0, 0, 0, 7, 9, 33, 0, 49,
+  1, 0, 0, 56, 0, 0, 0, 0, 0, 0,
+  17, 64, 6, 22, 16, 0, 10, 13, 0, 13,
+  8, 65, 0, 0, 0, 0, 0, 16, 82, 0,
+  8, 0, 12, 7, 0, 0, 0, 7, 4, 20,
+  0, 47, 63, 0, 0, 0, 0, 0, 44, 1,
+  0, 11, 10, 3, 0, 58, 41, 16, 11, 0,
+  10, 0, 65, 40, 0, 0, 36, 16, 0, 0,
+  0, 0, 20, 0, 20, 14, 0, 0, 0, 16,
+  0, 3, 0, 22, 0, 2, 0, 0, 0, 1,
+  57, 3, 31, 0, 0, 0, 29, 0, 0, 14,
+  3, 0, 0, 0, 16, 0, 39, 2, 0, 0,
+  0, 0, 0, 49, 17, 0, 0, 86, 0, 30,
+  13, 0, 52, 56, 3, 30, 0, 29, 23, 24,
+  50, 0, 0, 0, 17, 0, 0, 0, 0, 53,
+  48, 0, 0, 0, 13, 0, 61, 0, 0, 31,
+  25, 0, 0, 5, 0, 0, 7, 0, 0, 16,
+  0, 0, 30, 0, 18, 13, 0, 31, 103, 0,
+  37, 5, 6, 15, 0, 0, 15, 0, 0, 23,
+  47, 54, 0, 0, 22, 0, 6, 0, 0, 173,
+  80, 13, 0, 0, 0, 33, 0, 0, 2, 56,
+  0, 34, 0, 21, 0, 29, 0, 25, 0, 22,
+  0, 0, 27, 6, 10, 8, 0, 0, 0, 77,
+  0, 0, 89, 0, 43, 20, 45, 0, 35, 11,
+  0, 32, 30, 49, 7, 15, 23, 23, 7, 28,
+  0, 22, 0, 0, 3, 45, 0, 13, 0, 0,
+  4, 42, 8, 27, 0, 9, 0, 0, 0, 0,
+  8, 0, 7, 0, 24, 0, 27, 61, 2, 0,
+  25, 0, 40, 28, 4, 8, 10, 35, 4, 0,
+  0, 0, 0, 15, 78, 0, 23, 10, 0, 35,
+  0, 0, 20, 3, 3, 48, 45, 0, 0, 0,
+  22, 82, 0, 0, 8, 0, 0, 0, 29, 61,
+  0, 8, 48, 0, 0, 0, 21, 71, 5, 41,
+  10, 3, 0, 14, 0, 2, 0, 9, 0, 69,
+  34, 19, 0, 41, 0, 34, 7, 20, 0, 34,
+  59, 23, 26, 10, 5, 0, 0, 0, 0, 0,
+  0, 0, 18, 22, 10, 15, 30, 39, 10, 0,
+  0, 0, 16, 36, 52, 0, 27, 32, 3, 0,
+  12, 28, 0, 21, 0, 48, 0, 2, 0, 34,
+  13, 5, 17, 11, 0, 25, 0, 47, 10, 1,
+  26, 5, 0, 0, 0, 67, 13, 0, 12, 0,
+  16, 0, 0, 15, 0, 51, 0, 0, 0, 0,
+  0, 0, 69, 0, 19, 0, 19, 11, 0, 0,
+  29, 2, 31, 0, 0, 44, 27, 0, 33, 0,
+  0, 0, 76, 0, 0, 1, 67, 69, 11, 51,
+  63, 32, 6, 0, 66, 0, 0, 38, 0, 0,
+  28, 40, 0, 0, 0, 0, 7, 0, 0, 0,
+  0, 27, 0, 47, 0, 0, 0, 20, 0, 38,
+  0, 0, 0, 16, 0, 34, 21, 7, 0, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
+  98, 0, 25, 5, 0, 0, 0, 78, 9, 0,
+  0, 35, 0, 0, 12, 5, 38, 41, 20, 53,
+  0, 44, 32, 14, 27, 37, 0, 13, 0, 0,
+  0, 0, 28, 63, 38, 0, 0, 0, 0, 0,
+  3, 36, 0, 61, 0, 0, 0, 5, 3, 0,
+  4, 0, 0, 0, 0, 0, 77, 0, 26, 0,
+  18, 21, 29, 0, 57, 0, 12, 30, 0, 0,
+  52, 0, 0, 2, 43, 101, 14, 0, 40, 0,
+  0, 0, 32, 66, 0, 35, 0, 0, 0, 29,
+  0, 8, 0, 0, 0, 11, 0, 0, 0, 50,
+  0, 48, 0, 31, 0, 0, 0, 0, 0, 0,
+  6, 9, 0, 67, 0, 0, 11, 0, 13, 40,
+  0, 0, 5, 7, 0, 44, 0, 15, 58, 0,
+  30, 45, 0, 14, 0, 32, 0, 0, 0, 10,
+  0, 27, 0, 3, 29, 32, 45, 49, 0, 64,
+  21, 0, 0, 14, 0, 0, 0, 0, 0, 0,
+  30, 78, 0, 0, 0, 0, 0, 18, 0, 23,
+  14, 57, 17, 0, 0, 0, 29, 0, 59, 1,
+  9, 2, 0, 17, 0, 0, 0, 0, 0, 41,
+  0, 0, 0, 0, 31, 51, 0, 0, 37, 2,
+  0, 0, 4, 70, 43, 0, 24, 35, 0, 14,
+  56, 0, 0, 39, 0, 0, 9, 13, 0, 36,
+  0, 0, 0, 14, 0, 0, 0, 19, 0, 41,
+  0, 0, 0, 5, 3, 0, 4, 0, 0, 0,
+  23, 13, 20, 0, 0, 0, 18, 34, 0, 0,
+  4, 17, 0, 0, 0, 0, 21, 0, 0, 0,
+  0, 23, 10, 1, 39, 9, 0, 0, 1, 25,
+  3, 20, 0, 8, 17, 5, 38, 41, 32, 19,
+  10, 0, 6, 0, 0, 0, 0, 5, 45, 39,
+  4, 0, 0, 0, 0, 31, 0, 9, 12, 73,
+  0, 0, 0, 0, 2, 0, 65, 11, 0, 5,
+  37, 0, 20, 0, 0, 11, 0, 8, 52, 0,
+  43, 0, 22, 0, 0, 0, 29, 0, 0, 0,
+  38, 88, 0, 0, 38, 0, 13, 0, 33, 104,
+  68, 26, 0, 0, 8, 50, 0, 0, 0, 10,
+  0, 4, 0, 0, 0, 20, 0, 11, 1, 0,
+  0, 0, 0, 16, 0, 0, 0, 7, 0, 77,
+  0, 0, 52, 0, 26, 23, 6, 0, 25, 0,
+  0, 6, 24, 0, 92, 16, 18, 73, 0, 0,
+  0, 73, 0, 0, 0, 50, 0, 0, 0, 0,
+  11, 59, 10, 49, 0, 55, 10, 0, 0, 37,
+  0, 0, 5, 0, 13, 0, 23, 61, 29, 7,
+  1, 0, 19, 2, 0, 26, 0, 53, 0, 7,
+  0, 0, 0, 23, 69, 0, 1, 0, 0, 31,
+  0, 0, 4, 0, 0, 61, 44, 0, 0, 0,
+  25, 73, 0, 0, 7, 0, 0, 0, 26, 81,
+  0, 0, 48, 0, 0, 0, 40, 70, 0, 48,
+  0, 0, 0, 16, 0, 0, 0, 0, 0, 39,
+  0, 0, 0, 36, 0, 27, 0, 6, 0, 0,
+  20, 1, 0, 24, 22, 0, 0, 39, 0, 0,
+  0, 0, 10, 25, 0, 0, 31, 12, 0, 4,
+  0, 0, 87, 23, 22, 30, 0, 6, 0, 43,
+  7, 0, 0, 5, 0, 16, 0, 0, 0, 7,
+  9, 33, 0, 49, 1, 0, 0, 56, 0, 0,
+  0, 0, 0, 0, 17, 64, 6, 22, 16, 0,
+  10, 13, 0, 13, 8, 65, 0, 0, 0, 0,
+  0, 16, 82, 0, 8, 0, 12, 7, 0, 0,
+  0, 7, 4, 20, 0, 17, 0, 0, 21, 28,
+  30, 14, 58, 16, 0, 5, 32, 30, 51, 35,
+  42, 53, 0, 21, 81, 0, 0, 49, 7, 50,
+  21, 0, 0, 19, 0, 0, 2, 16, 18, 0,
+  0, 7, 0, 43, 0, 40, 0, 33, 27, 19,
+  0, 12, 0, 0, 23, 0, 84, 2, 0, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
+  33, 0, 0, 0, 0, 25, 18, 30, 44, 27,
+  0, 0, 0, 44, 47, 23, 14, 0, 26, 7,
+  56, 14, 51, 35, 8, 27, 0, 39, 0, 19,
+  0, 4, 43, 43, 0, 0, 0, 0, 0, 0,
+  8, 13, 9, 61, 0, 0, 0, 0, 12, 0,
+  28, 21, 21, 0, 50, 0, 111, 0, 14, 14,
+  3, 0, 103, 0, 37, 5, 6, 15, 0, 0,
+  15, 0, 0, 23, 47, 54, 0, 0, 22, 0,
+  6, 0, 0, 173, 80, 13, 0, 0, 0, 33,
+  0, 0, 2, 56, 0, 34, 0, 21, 0, 29,
+  0, 25, 0, 22, 0, 0, 27, 6, 10, 8,
+  0, 0, 0, 77, 0, 0, 89, 0, 43, 20,
+  45, 0, 35, 11, 0, 32, 30, 49, 7, 15,
+  23, 23, 7, 28, 0, 22, 0, 0, 3, 45,
+  0, 13, 0, 0, 4, 42, 8, 27, 0, 9,
+  0, 0, 0, 0, 8, 0, 7, 0, 24, 0,
+  27, 61, 2, 0, 25, 0, 40, 28, 4, 8,
+  10, 35, 4, 0, 0, 0, 0, 15, 78, 0,
+  23, 10, 0, 35, 0, 0, 20, 3, 3, 48,
+  45, 0, 0, 0, 22, 82, 0, 0, 8, 0,
+  0, 0, 29, 61, 0, 8, 48, 0, 0, 0,
+  21, 71, 5, 41, 10, 3, 0, 14, 0, 2,
+  0, 9, 0, 69, 34, 19, 0, 41, 0, 34,
+  7, 20, 0, 34, 59, 23, 26, 10, 5, 0,
+  0, 0, 0, 0, 0, 0, 18, 22, 10, 15,
+  30, 39, 10, 0, 0, 0, 16, 36, 52, 0,
+  27, 32, 3, 0, 12, 28, 0, 21, 0, 48,
+  0, 2, 0, 34, 13, 5, 17, 11, 0, 25,
+  0, 47, 10, 1, 26, 5, 0, 0, 0, 67,
+  13, 0, 12, 0, 16, 0, 0, 15, 0, 51,
+  0, 0, 0, 0, 0, 0, 69, 0, 19, 0,
+  19, 11, 0, 0, 29, 2, 31, 0, 0, 24,
+  0, 0, 40, 11, 0, 0, 61, 11, 0, 15,
+  51, 85, 31, 58, 61, 16, 0, 9, 60, 0,
+  0, 53, 11, 51, 1, 8, 0, 10, 0, 0,
+  0, 42, 35, 0, 15, 23, 0, 51, 12, 18,
+  0, 69, 33, 20, 9, 0, 0, 0, 24, 0,
+  57, 28, 0, 0, 0, 2, 0, 18, 0, 0,
+  0, 0, 0, 0, 31, 0, 42, 0, 0, 0,
+  4, 14, 36, 12, 0, 6, 0, 29, 44, 60,
+  4, 0, 34, 12, 53, 16, 53, 25, 0, 50,
+  0, 27, 0, 9, 0, 0, 31, 64, 0, 0,
+  0, 0, 0, 0, 0, 12, 10, 60, 0, 0,
+  0, 0, 0, 0, 10, 13, 32, 0, 25, 0,
+  76, 0, 51, 15, 31, 0, 29, 0, 57, 0,
+  12, 30, 0, 0, 52, 0, 0, 2, 43, 101,
+  14, 0, 40, 0, 0, 0, 32, 66, 0, 35,
+  0, 0, 0, 29, 0, 8, 0, 0, 0, 11,
+  0, 0, 0, 50, 0, 48, 0, 31, 0, 0,
+  0, 0, 0, 0, 6, 9, 0, 67, 0, 0,
+  11, 0, 13, 40, 0, 0, 5, 7, 0, 44,
+  0, 15, 58, 0, 30, 45, 0, 14, 0, 32,
+  0, 0, 0, 10, 0, 27, 0, 3, 29, 32,
+  45, 49, 0, 64, 21, 0, 0, 14, 0, 0,
+  0, 0, 0, 0, 30, 78, 0, 0, 0, 0,
+  0, 18, 0, 23, 14, 57, 17, 0, 0, 0,
+  29, 0, 59, 1, 9, 2, 0, 17, 0, 0,
+  0, 0, 0, 41, 0, 0, 0, 0, 31, 51,
+  0, 0, 37, 2, 0, 0, 4, 70, 43, 0,
+  24, 35, 0, 14, 56, 0, 0, 39, 0, 0,
+  9, 13, 0, 36, 0, 0, 0, 14, 0, 0,
+  0, 19, 0, 41, 0, 0, 0, 5, 3, 0,
+  4, 0, 0, 0, 23, 13, 20, 0, 0, 0,
+  18, 34, 0, 0, 4, 17, 0, 0, 0, 0,
+  21, 0, 0, 0, 0, 23, 10, 1, 39, 9,
+  0, 0, 1, 25, 3, 20, 0, 8, 17, 5,
+  38, 41, 32, 19, 10, 0, 6, 0, 0, 0,
+  0, 5, 45, 39, 4, 0, 0, 0, 0, 31,
+  0, 9, 12, 73, 0, 0, 0, 0, 2, 0,
+  65, 11, 0, 5, 37, 0, 20, 0, 0, 11,
+  0, 8, 0, 32, 0, 0, 31, 0, 19, 0,
+  50, 0, 0, 16, 7, 64, 58, 24, 16, 46,
+  0, 28, 76, 0, 0, 47, 16, 40, 25, 0,
+  0, 27, 0, 0, 0, 37, 5, 0, 0, 0,
+  0, 29, 0, 1, 0, 41, 21, 3, 4, 6,
+  0, 0, 60, 0, 56, 11, 0, 0, 8, 6,
+  0, 26, 13, 0, 0, 0, 0, 0, 17, 6,
+  0, 0, 0, 25, 0, 0, 41, 13, 0, 0,
+  0, 30, 48, 39, 12, 0, 31, 0, 58, 23,
+  37, 56, 3, 0, 8, 19, 0, 16, 0, 10,
+  57, 33, 0, 0, 0, 0, 0, 0, 23, 0,
+  31, 59, 0, 0, 0, 1, 24, 0, 21, 0,
+  8, 0, 47, 0, 77, 0, 1, 23, 9, 0,
+  44, 0, 0, 0, 25, 73, 0, 0, 7, 0,
+  0, 0, 26, 81, 0, 0, 48, 0, 0, 0,
+  40, 70, 0, 48, 0, 0, 0, 16, 0, 0,
+  0, 0, 0, 39, 0, 0, 0, 36, 0, 27,
+  0, 6, 0, 0, 20, 1, 0, 24, 22, 0,
+  0, 39, 0, 0, 0, 0, 10, 25, 0, 0,
+  31, 12, 0, 4, 0, 0, 87, 23, 22, 30,
+  0, 6, 0, 43, 7, 0, 0, 5, 0, 16,
+  0, 0, 0, 7, 9, 33, 0, 49, 1, 0,
+  0, 56, 0, 0, 0, 0, 0, 0, 17, 64,
+  6, 22, 16, 0, 10, 13, 0, 13, 8, 65,
+  0, 0, 0, 0, 0, 16, 82, 0, 8, 0,
+  12, 7, 0, 0, 0, 7, 4, 20, 0, 17,
+  0, 0, 21, 28, 30, 14, 58, 16, 0, 5,
+  32, 30, 51, 35, 42, 53, 0, 21, 81, 0,
+  0, 49, 7, 50, 21, 0, 0, 19, 0, 0,
+  2, 16, 18, 0, 0, 7, 0, 43, 0, 40,
+  0, 33, 27, 19, 0, 12, 0, 0, 23, 0,
+  84, 2, 0, 0, 0, 0, 0, 29, 0, 0,
+  0, 0, 0, 0, 33, 0, 0, 0, 0, 25,
+  18, 30, 44, 27, 0, 0, 0, 44, 47, 23,
+  14, 0, 26, 7, 56, 14, 51, 35, 8, 27,
+  0, 39, 0, 19, 0, 4, 43, 43, 0, 0,
+  0, 0, 0, 0, 8, 13, 9, 61, 0, 0,
+  0, 0, 12, 0, 28, 21, 21, 0, 50, 0,
+  111, 0, 14, 14, 3, 0, 0, 47, 23, 0,
+  8, 0, 33, 0, 55, 0, 0, 17, 28, 56,
+  45, 66, 49, 49, 0, 15, 78, 0, 0, 46,
+  13, 29, 27, 0, 0, 0, 14, 0, 11, 19,
+  4, 0, 0, 0, 0, 33, 12, 13, 0, 55,
+  6, 0, 0, 0, 0, 0, 63, 12, 64, 29,
+  0, 0, 0, 0, 0, 23, 0, 0, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 0, 0, 41,
+  36, 0, 0, 29, 0, 27, 65, 51, 36, 6,
+  50, 11, 55, 0, 58, 33, 0, 14, 0, 30,
+  0, 20, 0, 12, 43, 51, 0, 0, 0, 0,
+  0, 0, 5, 6, 14, 33, 30, 0, 0, 0,
+  41, 0, 0, 0, 5, 0, 0, 0, 81, 0,
+  6, 22, 17, 0, 45, 0, 0, 0, 22, 82,
+  0, 0, 8, 0, 0, 0, 29, 61, 0, 8,
+  48, 0, 0, 0, 21, 71, 5, 41, 10, 3,
+  0, 14, 0, 2, 0, 9, 0, 69, 34, 19,
+  0, 41, 0, 34, 7, 20, 0, 34, 59, 23,
+  26, 10, 5, 0, 0, 0, 0, 0, 0, 0,
+  18, 22, 10, 15, 30, 39, 10, 0, 0, 0,
+  16, 36, 52, 0, 27, 32, 3, 0, 12, 28,
+  0, 21, 0, 48, 0, 2, 0, 34, 13, 5,
+  17, 11, 0, 25, 0, 47, 10, 1, 26, 5,
+  0, 0, 0, 67, 13, 0, 12, 0, 16, 0,
+  0, 15, 0, 51, 0, 0, 0, 0, 0, 0,
+  69, 0, 19, 0, 19, 11, 0, 0, 29, 2,
+  31, 0, 0, 24, 0, 0, 40, 11, 0, 0,
+  61, 11, 0, 15, 51, 85, 31, 58, 61, 16,
+  0, 9, 60, 0, 0, 53, 11, 51, 1, 8,
+  0, 10, 0, 0, 0, 42, 35, 0, 15, 23,
+  0, 51, 12, 18, 0, 69, 33, 20, 9, 0,
+  0, 0, 24, 0, 57, 28, 0, 0, 0, 2,
+  0, 18, 0, 0, 0, 0, 0, 0, 31, 0,
+  42, 0, 0, 0, 4, 14, 36, 12, 0, 6,
+  0, 29, 44, 60, 4, 0, 34, 12, 53, 16,
+  53, 25, 0, 50, 0, 27, 0, 9, 0, 0,
+  31, 64, 0, 0, 0, 0, 0, 0, 0, 12,
+  10, 60, 0, 0, 0, 0, 0, 0, 10, 13,
+  32, 0, 25, 0, 76, 0, 51, 15, 31, 0,
+  0, 35, 50, 0, 10, 0, 0, 0, 51, 2,
+  0, 18, 8, 100, 10, 27, 39, 26, 2, 4,
+  44, 0, 34, 24, 0, 0, 0, 5, 0, 0,
+  0, 0, 0, 0, 0, 0, 5, 0, 0, 22,
+  18, 0, 0, 35, 0, 0, 0, 0, 0, 0,
+  52, 66, 0, 34, 0, 0, 6, 2, 0, 0,
+  0, 0, 13, 0, 38, 2, 22, 0, 23, 0,
+  0, 0, 3, 15, 29, 0, 0, 37, 0, 21,
+  32, 48, 11, 18, 40, 3, 53, 7, 75, 6,
+  0, 23, 0, 0, 0, 1, 0, 0, 40, 70,
+  1, 0, 0, 0, 7, 0, 0, 9, 0, 8,
+  32, 0, 0, 0, 57, 0, 10, 0, 12, 0,
+  0, 0, 8, 0, 9, 14, 37, 0, 0, 0,
+  0, 0, 31, 51, 0, 0, 37, 2, 0, 0,
+  4, 70, 43, 0, 24, 35, 0, 14, 56, 0,
+  0, 39, 0, 0, 9, 13, 0, 36, 0, 0,
+  0, 14, 0, 0, 0, 19, 0, 41, 0, 0,
+  0, 5, 3, 0, 4, 0, 0, 0, 23, 13,
+  20, 0, 0, 0, 18, 34, 0, 0, 4, 17,
+  0, 0, 0, 0, 21, 0, 0, 0, 0, 23,
+  10, 1, 39, 9, 0, 0, 1, 25, 3, 20,
+  0, 8, 17, 5, 38, 41, 32, 19, 10, 0,
+  6, 0, 0, 0, 0, 5, 45, 39, 4, 0,
+  0, 0, 0, 31, 0, 9, 12, 73, 0, 0,
+  0, 0, 2, 0, 65, 11, 0, 5, 37, 0,
+  20, 0, 0, 11, 0, 8, 0, 32, 0, 0,
+  31, 0, 19, 0, 50, 0, 0, 16, 7, 64,
+  58, 24, 16, 46, 0, 28, 76, 0, 0, 47,
+  16, 40, 25, 0, 0, 27, 0, 0, 0, 37,
+  5, 0, 0, 0, 0, 29, 0, 1, 0, 41,
+  21, 3, 4, 6, 0, 0, 60, 0, 56, 11,
+  0, 0, 8, 6, 0, 26, 13, 0, 0, 0,
+  0, 0, 17, 6, 0, 0, 0, 25, 0, 0,
+  41, 13, 0, 0, 0, 30, 48, 39, 12, 0,
+  31, 0, 58, 23, 37, 56, 3, 0, 8, 19,
+  0, 16, 0, 10, 57, 33, 0, 0, 0, 0,
+  0, 0, 23, 0, 31, 59, 0, 0, 0, 1,
+  24, 0, 21, 0, 8, 0, 47, 0, 77, 0,
+  1, 23, 9, 0, 0, 86, 6, 8, 42, 0,
+  32, 0, 64, 4, 0, 0, 6, 42, 74, 53,
+  38, 43, 0, 27, 68, 0, 0, 42, 0, 47,
+  25, 9, 0, 24, 6, 0, 0, 29, 9, 0,
+  0, 0, 0, 25, 0, 26, 0, 59, 9, 0,
+  0, 24, 0, 0, 45, 0, 88, 34, 0, 0,
+  0, 0, 0, 9, 6, 0, 0, 0, 0, 0,
+  36, 0, 0, 0, 0, 0, 0, 17, 64, 0,
+  2, 0, 1, 0, 91, 28, 8, 0, 51, 13,
+  35, 13, 47, 25, 0, 0, 0, 32, 0, 22,
+  0, 0, 48, 22, 0, 7, 0, 0, 23, 0,
+  25, 21, 43, 64, 10, 0, 0, 0, 29, 0,
+  0, 0, 18, 0, 4, 0, 74, 0, 0, 37,
+  25, 0, 0, 17, 0, 0, 21, 28, 30, 14,
+  58, 16, 0, 5, 32, 30, 51, 35, 42, 53,
+  0, 21, 81, 0, 0, 49, 7, 50, 21, 0,
+  0, 19, 0, 0, 2, 16, 18, 0, 0, 7,
+  0, 43, 0, 40, 0, 33, 27, 19, 0, 12,
+  0, 0, 23, 0, 84, 2, 0, 0, 0, 0,
+  0, 29, 0, 0, 0, 0, 0, 0, 33, 0,
+  0, 0, 0, 25, 18, 30, 44, 27, 0, 0,
+  0, 44, 47, 23, 14, 0, 26, 7, 56, 14,
+  51, 35, 8, 27, 0, 39, 0, 19, 0, 4,
+  43, 43, 0, 0, 0, 0, 0, 0, 8, 13,
+  9, 61, 0, 0, 0, 0, 12, 0, 28, 21,
+  21, 0, 50, 0, 111, 0, 14, 14, 3, 0,
+  0, 47, 23, 0, 8, 0, 33, 0, 55, 0,
+  0, 17, 28, 56, 45, 66, 49, 49, 0, 15,
+  78, 0, 0, 46, 13, 29, 27, 0, 0, 0,
+  14, 0, 11, 19, 4, 0, 0, 0, 0, 33,
+  12, 13, 0, 55, 6, 0, 0, 0, 0, 0,
+  63, 12, 64, 29, 0, 0, 0, 0, 0, 23,
+  0, 0, 0, 0, 0, 0, 42, 0, 0, 0,
+  0, 0, 0, 41, 36, 0, 0, 29, 0, 27,
+  65, 51, 36, 6, 50, 11, 55, 0, 58, 33,
+  0, 14, 0, 30, 0, 20, 0, 12, 43, 51,
+  0, 0, 0, 0, 0, 0, 5, 6, 14, 33,
+  30, 0, 0, 0, 41, 0, 0, 0, 5, 0,
+  0, 0, 81, 0, 6, 22, 17, 0, 0, 43,
+  70, 0, 11, 0, 9, 0, 57, 6, 0, 0,
+  0, 60, 23, 63, 30, 38, 0, 12, 39, 0,
+  33, 35, 0, 0, 9, 14, 0, 0, 27, 0,
+  0, 0, 0, 0, 0, 17, 0, 12, 27, 0,
+  0, 40, 0, 0, 0, 0, 0, 0, 48, 52,
+  41, 12, 0, 0, 19, 12, 0, 0, 0, 0,
+  0, 0, 24, 0, 45, 0, 11, 4, 0, 0,
+  0, 28, 32, 0, 0, 18, 0, 0, 58, 19,
+  0, 21, 59, 13, 23, 9, 64, 10, 0, 32,
+  0, 0, 0, 0, 0, 0, 40, 51, 0, 0,
+  0, 0, 36, 0, 0, 22, 4, 24, 40, 0,
+  0, 0, 86, 0, 2, 0, 26, 0, 0, 1,
+  21, 0, 0, 24, 22, 0, 0, 24, 0, 0,
+  40, 11, 0, 0, 61, 11, 0, 15, 51, 85,
+  31, 58, 61, 16, 0, 9, 60, 0, 0, 53,
+  11, 51, 1, 8, 0, 10, 0, 0, 0, 42,
+  35, 0, 15, 23, 0, 51, 12, 18, 0, 69,
+  33, 20, 9, 0, 0, 0, 24, 0, 57, 28,
+  0, 0, 0, 2, 0, 18, 0, 0, 0, 0,
+  0, 0, 31, 0, 42, 0, 0, 0, 4, 14,
+  36, 12, 0, 6, 0, 29, 44, 60, 4, 0,
+  34, 12, 53, 16, 53, 25, 0, 50, 0, 27,
+  0, 9, 0, 0, 31, 64, 0, 0, 0, 0,
+  0, 0, 0, 12, 10, 60, 0, 0, 0, 0,
+  0, 0, 10, 13, 32, 0, 25, 0, 76, 0,
+  51, 15, 31, 0, 0, 35, 50, 0, 10, 0,
+  0, 0, 51, 2, 0, 18, 8, 100, 10, 27,
+  39, 26, 2, 4, 44, 0, 34, 24, 0, 0,
+  0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+  5, 0, 0, 22, 18, 0, 0, 35, 0, 0,
+  0, 0, 0, 0, 52, 66, 0, 34, 0, 0,
+  6, 2, 0, 0, 0, 0, 13, 0, 38, 2,
+  22, 0, 23, 0, 0, 0, 3, 15, 29, 0,
+  0, 37, 0, 21, 32, 48, 11, 18, 40, 3,
+  53, 7, 75, 6, 0, 23, 0, 0, 0, 1,
+  0, 0, 40, 70, 1, 0, 0, 0, 7, 0,
+  0, 9, 0, 8, 32, 0, 0, 0, 57, 0,
+  10, 0, 12, 0, 0, 0, 8, 0, 9, 14,
+  37, 0, 22, 0, 59, 0, 0, 0, 0, 0,
+  23, 0, 0, 0, 0, 116, 1, 0, 6, 27,
+  1, 0, 38, 30, 84, 8, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+  0, 0, 28, 17, 0, 30, 0, 0, 0, 0,
+  0, 0, 35, 131, 0, 15, 36, 0, 30, 17,
+  14, 0, 0, 0, 34, 0, 88, 47, 7, 2,
+  16, 67, 0, 0, 0, 0, 11, 0, 0, 0,
+  0, 24, 16, 22, 0, 15, 41, 0, 31, 10,
+  71, 0, 0, 11, 2, 0, 0, 5, 0, 0,
+  62, 66, 0, 0, 0, 0, 12, 10, 0, 7,
+  0, 0, 50, 0, 0, 0, 91, 3, 77, 0,
+  19, 0, 0, 0, 0, 0, 21, 6, 10, 0,
+  0, 32, 0, 0, 31, 0, 19, 0, 50, 0,
+  0, 16, 7, 64, 58, 24, 16, 46, 0, 28,
+  76, 0, 0, 47, 16, 40, 25, 0, 0, 27,
+  0, 0, 0, 37, 5, 0, 0, 0, 0, 29,
+  0, 1, 0, 41, 21, 3, 4, 6, 0, 0,
+  60, 0, 56, 11, 0, 0, 8, 6, 0, 26,
+  13, 0, 0, 0, 0, 0, 17, 6, 0, 0,
+  0, 25, 0, 0, 41, 13, 0, 0, 0, 30,
+  48, 39, 12, 0, 31, 0, 58, 23, 37, 56,
+  3, 0, 8, 19, 0, 16, 0, 10, 57, 33,
+  0, 0, 0, 0, 0, 0, 23, 0, 31, 59,
+  0, 0, 0, 1, 24, 0, 21, 0, 8, 0,
+  47, 0, 77, 0, 1, 23, 9, 0, 0, 86,
+  6, 8, 42, 0, 32, 0, 64, 4, 0, 0,
+  6, 42, 74, 53, 38, 43, 0, 27, 68, 0,
+  0, 42, 0, 47, 25, 9, 0, 24, 6, 0,
+  0, 29, 9, 0, 0, 0, 0, 25, 0, 26,
+  0, 59, 9, 0, 0, 24, 0, 0, 45, 0,
+  88, 34, 0, 0, 0, 0, 0, 9, 6, 0,
+  0, 0, 0, 0, 36, 0, 0, 0, 0, 0,
+  0, 17, 64, 0, 2, 0, 1, 0, 91, 28,
+  8, 0, 51, 13, 35, 13, 47, 25, 0, 0,
+  0, 32, 0, 22, 0, 0, 48, 22, 0, 7,
+  0, 0, 23, 0, 25, 21, 43, 64, 10, 0,
+  0, 0, 29, 0, 0, 0, 18, 0, 4, 0,
+  74, 0, 0, 37, 25, 0, 0, 96, 8, 3,
+  33, 0, 35, 0, 85, 3, 0, 27, 4, 58,
+  40, 66, 33, 44, 0, 33, 67, 0, 11, 33,
+  0, 10, 35, 17, 0, 0, 0, 0, 16, 0,
+  0, 0, 0, 12, 0, 0, 0, 9, 0, 67,
+  0, 25, 0, 38, 0, 0, 28, 0, 77, 30,
+  0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
+  2, 0, 21, 0, 17, 0, 0, 0, 18, 29,
+  78, 0, 11, 0, 0, 0, 78, 36, 3, 0,
+  35, 3, 44, 7, 36, 20, 0, 27, 0, 26,
+  0, 8, 0, 0, 61, 33, 8, 16, 0, 0,
+  58, 0, 22, 29, 12, 37, 7, 0, 0, 0,
+  41, 0, 0, 0, 20, 0, 0, 0, 52, 0,
+  0, 31, 46, 0, 0, 47, 23, 0, 8, 0,
+  33, 0, 55, 0, 0, 17, 28, 56, 45, 66,
+  49, 49, 0, 15, 78, 0, 0, 46, 13, 29,
+  27, 0, 0, 0, 14, 0, 11, 19, 4, 0,
+  0, 0, 0, 33, 12, 13, 0, 55, 6, 0,
+  0, 0, 0, 0, 63, 12, 64, 29, 0, 0,
+  0, 0, 0, 23, 0, 0, 0, 0, 0, 0,
+  42, 0, 0, 0, 0, 0, 0, 41, 36, 0,
+  0, 29, 0, 27, 65, 51, 36, 6, 50, 11,
+  55, 0, 58, 33, 0, 14, 0, 30, 0, 20,
+  0, 12, 43, 51, 0, 0, 0, 0, 0, 0,
+  5, 6, 14, 33, 30, 0, 0, 0, 41, 0,
+  0, 0, 5, 0, 0, 0, 81, 0, 6, 22,
+  17, 0, 0, 43, 70, 0, 11, 0, 9, 0,
+  57, 6, 0, 0, 0, 60, 23, 63, 30, 38,
+  0, 12, 39, 0, 33, 35, 0, 0, 9, 14,
+  0, 0, 27, 0, 0, 0, 0, 0, 0, 17,
+  0, 12, 27, 0, 0, 40, 0, 0, 0, 0,
+  0, 0, 48, 52, 41, 12, 0, 0, 19, 12,
+  0, 0, 0, 0, 0, 0, 24, 0, 45, 0,
+  11, 4, 0, 0, 0, 28, 32, 0, 0, 18,
+  0, 0, 58, 19, 0, 21, 59, 13, 23, 9,
+  64, 10, 0, 32, 0, 0, 0, 0, 0, 0,
+  40, 51, 0, 0, 0, 0, 36, 0, 0, 22,
+  4, 24, 40, 0, 0, 0, 86, 0, 2, 0,
+  26, 0, 0, 1, 21, 0, 0, 24, 22, 0,
+  0, 1, 54, 0, 0, 0, 0, 0, 42, 0,
+  0, 7, 0, 86, 0, 0, 1, 43, 0, 15,
+  50, 15, 93, 16, 0, 0, 0, 18, 0, 0,
+  16, 0, 0, 0, 0, 0, 0, 25, 0, 0,
+  34, 33, 0, 35, 0, 0, 0, 17, 0, 0,
+  34, 96, 0, 0, 21, 0, 40, 0, 14, 0,
+  0, 2, 21, 0, 100, 23, 1, 3, 2, 71,
+  0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
+  25, 5, 0, 25, 63, 0, 32, 16, 62, 0,
+  0, 28, 0, 0, 0, 0, 0, 0, 67, 44,
+  0, 0, 0, 0, 26, 0, 0, 29, 0, 5,
+  41, 0, 0, 0, 99, 0, 45, 0, 46, 0,
+  0, 13, 0, 0, 0, 6, 19, 0, 0, 35,
+  50, 0, 10, 0, 0, 0, 51, 2, 0, 18,
+  8, 100, 10, 27, 39, 26, 2, 4, 44, 0,
+  34, 24, 0, 0, 0, 5, 0, 0, 0, 0,
+  0, 0, 0, 0, 5, 0, 0, 22, 18, 0,
+  0, 35, 0, 0, 0, 0, 0, 0, 52, 66,
+  0, 34, 0, 0, 6, 2, 0, 0, 0, 0,
+  13, 0, 38, 2, 22, 0, 23, 0, 0, 0,
+  3, 15, 29, 0, 0, 37, 0, 21, 32, 48,
+  11, 18, 40, 3, 53, 7, 75, 6, 0, 23,
+  0, 0, 0, 1, 0, 0, 40, 70, 1, 0,
+  0, 0, 7, 0, 0, 9, 0, 8, 32, 0,
+  0, 0, 57, 0, 10, 0, 12, 0, 0, 0,
+  8, 0, 9, 14, 37, 0, 22, 0, 59, 0,
+  0, 0, 0, 0, 23, 0, 0, 0, 0, 116,
+  1, 0, 6, 27, 1, 0, 38, 30, 84, 8,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 2, 0, 0, 28, 17, 0, 30,
+  0, 0, 0, 0, 0, 0, 35, 131, 0, 15,
+  36, 0, 30, 17, 14, 0, 0, 0, 34, 0,
+  88, 47, 7, 2, 16, 67, 0, 0, 0, 0,
+  11, 0, 0, 0, 0, 24, 16, 22, 0, 15,
+  41, 0, 31, 10, 71, 0, 0, 11, 2, 0,
+  0, 5, 0, 0, 62, 66, 0, 0, 0, 0,
+  12, 10, 0, 7, 0, 0, 50, 0, 0, 0,
+  91, 3, 77, 0, 19, 0, 0, 0, 0, 0,
+  21, 6, 10, 0, 20, 0, 19, 16, 0, 0,
+  0, 0, 29, 0, 0, 0, 2, 73, 0, 0,
+  0, 28, 8, 5, 49, 5, 52, 6, 0, 0,
+  0, 7, 0, 12, 6, 1, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 29, 0, 45, 0, 0,
+  0, 16, 0, 0, 39, 114, 0, 30, 15, 0,
+  35, 10, 0, 0, 0, 0, 31, 0, 77, 23,
+  0, 26, 0, 48, 0, 8, 0, 0, 25, 0,
+  0, 0, 0, 24, 31, 18, 0, 15, 42, 0,
+  28, 19, 61, 0, 0, 0, 0, 0, 0, 9,
+  24, 0, 72, 41, 0, 0, 3, 0, 0, 0,
+  0, 13, 37, 0, 43, 0, 0, 5, 84, 0,
+  93, 0, 17, 0, 7, 5, 0, 0, 42, 4,
+  0, 0, 0, 86, 6, 8, 42, 0, 32, 0,
+  64, 4, 0, 0, 6, 42, 74, 53, 38, 43,
+  0, 27, 68, 0, 0, 42, 0, 47, 25, 9,
+  0, 24, 6, 0, 0, 29, 9, 0, 0, 0,
+  0, 25, 0, 26, 0, 59, 9, 0, 0, 24,
+  0, 0, 45, 0, 88, 34, 0, 0, 0, 0,
+  0, 9, 6, 0, 0, 0, 0, 0, 36, 0,
+  0, 0, 0, 0, 0, 17, 64, 0, 2, 0,
+  1, 0, 91, 28, 8, 0, 51, 13, 35, 13,
+  47, 25, 0, 0, 0, 32, 0, 22, 0, 0,
+  48, 22, 0, 7, 0, 0, 23, 0, 25, 21,
+  43, 64, 10, 0, 0, 0, 29, 0, 0, 0,
+  18, 0, 4, 0, 74, 0, 0, 37, 25, 0,
+  0, 96, 8, 3, 33, 0, 35, 0, 85, 3,
+  0, 27, 4, 58, 40, 66, 33, 44, 0, 33,
+  67, 0, 11, 33, 0, 10, 35, 17, 0, 0,
+  0, 0, 16, 0, 0, 0, 0, 12, 0, 0,
+  0, 9, 0, 67, 0, 25, 0, 38, 0, 0,
+  28, 0, 77, 30, 0, 0, 25, 0, 0, 0,
+  0, 0, 0, 0, 2, 0, 21, 0, 17, 0,
+  0, 0, 18, 29, 78, 0, 11, 0, 0, 0,
+  78, 36, 3, 0, 35, 3, 44, 7, 36, 20,
+  0, 27, 0, 26, 0, 8, 0, 0, 61, 33,
+  8, 16, 0, 0, 58, 0, 22, 29, 12, 37,
+  7, 0, 0, 0, 41, 0, 0, 0, 20, 0,
+  0, 0, 52, 0, 0, 31, 46, 0, 0, 50,
+  11, 21, 17, 0, 0, 0, 67, 0, 0, 42,
+  4, 106, 9, 17, 15, 45, 0, 24, 71, 0,
+  40, 19, 0, 0, 0, 3, 0, 0, 0, 0,
+  0, 10, 0, 0, 0, 0, 0, 0, 4, 19,
+  0, 50, 0, 0, 0, 45, 0, 0, 34, 65,
+  36, 45, 0, 0, 44, 0, 0, 0, 0, 0,
+  7, 0, 60, 7, 0, 7, 12, 15, 0, 0,
+  10, 2, 40, 0, 0, 0, 0, 1, 42, 35,
+  2, 0, 21, 0, 58, 15, 51, 12, 0, 30,
+  0, 0, 0, 9, 0, 0, 58, 45, 6, 2,
+  0, 0, 16, 0, 0, 13, 0, 3, 7, 0,
+  0, 0, 80, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 4, 12, 0, 0, 43, 70, 0,
+  11, 0, 9, 0, 57, 6, 0, 0, 0, 60,
+  23, 63, 30, 38, 0, 12, 39, 0, 33, 35,
+  0, 0, 9, 14, 0, 0, 27, 0, 0, 0,
+  0, 0, 0, 17, 0, 12, 27, 0, 0, 40,
+  0, 0, 0, 0, 0, 0, 48, 52, 41, 12,
+  0, 0, 19, 12, 0, 0, 0, 0, 0, 0,
+  24, 0, 45, 0, 11, 4, 0, 0, 0, 28,
+  32, 0, 0, 18, 0, 0, 58, 19, 0, 21,
+  59, 13, 23, 9, 64, 10, 0, 32, 0, 0,
+  0, 0, 0, 0, 40, 51, 0, 0, 0, 0,
+  36, 0, 0, 22, 4, 24, 40, 0, 0, 0,
+  86, 0, 2, 0, 26, 0, 0, 1, 21, 0,
+  0, 24, 22, 0, 0, 1, 54, 0, 0, 0,
+  0, 0, 42, 0, 0, 7, 0, 86, 0, 0,
+  1, 43, 0, 15, 50, 15, 93, 16, 0, 0,
+  0, 18, 0, 0, 16, 0, 0, 0, 0, 0,
+  0, 25, 0, 0, 34, 33, 0, 35, 0, 0,
+  0, 17, 0, 0, 34, 96, 0, 0, 21, 0,
+  40, 0, 14, 0, 0, 2, 21, 0, 100, 23,
+  1, 3, 2, 71, 0, 0, 0, 0, 18, 0,
+  0, 0, 0, 0, 25, 5, 0, 25, 63, 0,
+  32, 16, 62, 0, 0, 28, 0, 0, 0, 0,
+  0, 0, 67, 44, 0, 0, 0, 0, 26, 0,
+  0, 29, 0, 5, 41, 0, 0, 0, 99, 0,
+  45, 0, 46, 0, 0, 13, 0, 0, 0, 6,
+  19, 0, 16, 0, 16, 11, 0, 0, 0, 0,
+  35, 0, 0, 25, 4, 106, 0, 0, 0, 36,
+  2, 10, 68, 10, 49, 2, 0, 0, 0, 0,
+  0, 0, 0, 2, 0, 9, 0, 0, 0, 0,
+  0, 0, 5, 41, 0, 45, 0, 0, 0, 31,
+  0, 0, 66, 127, 0, 42, 14, 0, 16, 0,
+  2, 0, 0, 0, 48, 0, 110, 32, 0, 9,
+  0, 60, 0, 11, 0, 0, 22, 0, 0, 0,
+  0, 41, 18, 32, 0, 0, 51, 0, 58, 18,
+  81, 0, 0, 0, 0, 0, 0, 12, 11, 0,
+  73, 49, 0, 0, 0, 0, 6, 0, 0, 8,
+  11, 0, 36, 0, 0, 0, 95, 0, 70, 0,
+  20, 0, 1, 0, 0, 0, 8, 0, 11, 0,
+  22, 0, 59, 0, 0, 0, 0, 0, 23, 0,
+  0, 0, 0, 116, 1, 0, 6, 27, 1, 0,
+  38, 30, 84, 8, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+  28, 17, 0, 30, 0, 0, 0, 0, 0, 0,
+  35, 131, 0, 15, 36, 0, 30, 17, 14, 0,
+  0, 0, 34, 0, 88, 47, 7, 2, 16, 67,
+  0, 0, 0, 0, 11, 0, 0, 0, 0, 24,
+  16, 22, 0, 15, 41, 0, 31, 10, 71, 0,
+  0, 11, 2, 0, 0, 5, 0, 0, 62, 66,
+  0, 0, 0, 0, 12, 10, 0, 7, 0, 0,
+  50, 0, 0, 0, 91, 3, 77, 0, 19, 0,
+  0, 0, 0, 0, 21, 6, 10, 0, 20, 0,
+  19, 16, 0, 0, 0, 0, 29, 0, 0, 0,
+  2, 73, 0, 0, 0, 28, 8, 5, 49, 5,
+  52, 6, 0, 0, 0, 7, 0, 12, 6, 1,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 29,
+  0, 45, 0, 0, 0, 16, 0, 0, 39, 114,
+  0, 30, 15, 0, 35, 10, 0, 0, 0, 0,
+  31, 0, 77, 23, 0, 26, 0, 48, 0, 8,
+  0, 0, 25, 0, 0, 0, 0, 24, 31, 18,
+  0, 15, 42, 0, 28, 19, 61, 0, 0, 0,
+  0, 0, 0, 9, 24, 0, 72, 41, 0, 0,
+  3, 0, 0, 0, 0, 13, 37, 0, 43, 0,
+  0, 5, 84, 0, 93, 0, 17, 0, 7, 5,
+  0, 0, 42, 4, 0, 0, 3, 16, 0, 41,
+  1, 0, 4, 6, 70, 0, 0, 11, 25, 55,
+  18, 0, 14, 4, 17, 0, 52, 0, 0, 17,
+  0, 16, 4, 14, 0, 32, 2, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 25, 0, 53,
+  0, 0, 5, 16, 0, 0, 58, 87, 18, 68,
+  0, 0, 15, 25, 0, 19, 0, 0, 0, 0,
+  0, 11, 7, 13, 8, 0, 0, 9, 0, 0,
+  44, 3, 0, 0, 0, 43, 57, 57, 0, 0,
+  32, 0, 31, 33, 74, 29, 25, 0, 0, 0,
+  0, 11, 45, 0, 71, 48, 0, 0, 7, 0,
+  2, 0, 0, 12, 74, 6, 34, 0, 0, 0,
+  67, 0, 49, 0, 0, 0, 48, 9, 63, 0,
+  76, 0, 5, 0, 0, 96, 8, 3, 33, 0,
+  35, 0, 85, 3, 0, 27, 4, 58, 40, 66,
+  33, 44, 0, 33, 67, 0, 11, 33, 0, 10,
+  35, 17, 0, 0, 0, 0, 16, 0, 0, 0,
+  0, 12, 0, 0, 0, 9, 0, 67, 0, 25,
+  0, 38, 0, 0, 28, 0, 77, 30, 0, 0,
+  25, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+  21, 0, 17, 0, 0, 0, 18, 29, 78, 0,
+  11, 0, 0, 0, 78, 36, 3, 0, 35, 3,
+  44, 7, 36, 20, 0, 27, 0, 26, 0, 8,
+  0, 0, 61, 33, 8, 16, 0, 0, 58, 0,
+  22, 29, 12, 37, 7, 0, 0, 0, 41, 0,
+  0, 0, 20, 0, 0, 0, 52, 0, 0, 31,
+  46, 0, 0, 50, 11, 21, 17, 0, 0, 0,
+  67, 0, 0, 42, 4, 106, 9, 17, 15, 45,
+  0, 24, 71, 0, 40, 19, 0, 0, 0, 3,
+  0, 0, 0, 0, 0, 10, 0, 0, 0, 0,
+  0, 0, 4, 19, 0, 50, 0, 0, 0, 45,
+  0, 0, 34, 65, 36, 45, 0, 0, 44, 0,
+  0, 0, 0, 0, 7, 0, 60, 7, 0, 7,
+  12, 15, 0, 0, 10, 2, 40, 0, 0, 0,
+  0, 1, 42, 35, 2, 0, 21, 0, 58, 15,
+  51, 12, 0, 30, 0, 0, 0, 9, 0, 0,
+  58, 45, 6, 2, 0, 0, 16, 0, 0, 13,
+  0, 3, 7, 0, 0, 0, 80, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 4, 12, 0,
+  20, 58, 19, 29, 24, 0, 0, 0, 79, 0,
+  0, 44, 19, 100, 0, 0, 0, 11, 0, 4,
+  57, 0, 28, 24, 0, 0, 2, 0, 0, 3,
+  5, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 34, 0, 24, 0, 0, 6, 41, 0, 0,
+  50, 104, 10, 72, 18, 0, 43, 0, 5, 0,
+  0, 0, 14, 0, 25, 49, 0, 0, 0, 41,
+  0, 14, 1, 0, 14, 2, 0, 0, 0, 33,
+  14, 52, 21, 0, 21, 0, 41, 46, 70, 27,
+  15, 0, 0, 0, 0, 6, 30, 0, 57, 63,
+  0, 18, 0, 0, 0, 0, 0, 23, 55, 0,
+  32, 0, 0, 0, 90, 0, 14, 0, 0, 0,
+  5, 1, 0, 0, 20, 7, 0, 0, 0, 1,
+  54, 0, 0, 0, 0, 0, 42, 0, 0, 7,
+  0, 86, 0, 0, 1, 43, 0, 15, 50, 15,
+  93, 16, 0, 0, 0, 18, 0, 0, 16, 0,
+  0, 0, 0, 0, 0, 25, 0, 0, 34, 33,
+  0, 35, 0, 0, 0, 17, 0, 0, 34, 96,
+  0, 0, 21, 0, 40, 0, 14, 0, 0, 2,
+  21, 0, 100, 23, 1, 3, 2, 71, 0, 0,
+  0, 0, 18, 0, 0, 0, 0, 0, 25, 5,
+  0, 25, 63, 0, 32, 16, 62, 0, 0, 28,
+  0, 0, 0, 0, 0, 0, 67, 44, 0, 0,
+  0, 0, 26, 0, 0, 29, 0, 5, 41, 0,
+  0, 0, 99, 0, 45, 0, 46, 0, 0, 13,
+  0, 0, 0, 6, 19, 0, 16, 0, 16, 11,
+  0, 0, 0, 0, 35, 0, 0, 25, 4, 106,
+  0, 0, 0, 36, 2, 10, 68, 10, 49, 2,
+  0, 0, 0, 0, 0, 0, 0, 2, 0, 9,
+  0, 0, 0, 0, 0, 0, 5, 41, 0, 45,
+  0, 0, 0, 31, 0, 0, 66, 127, 0, 42,
+  14, 0, 16, 0, 2, 0, 0, 0, 48, 0,
+  110, 32, 0, 9, 0, 60, 0, 11, 0, 0,
+  22, 0, 0, 0, 0, 41, 18, 32, 0, 0,
+  51, 0, 58, 18, 81, 0, 0, 0, 0, 0,
+  0, 12, 11, 0, 73, 49, 0, 0, 0, 0,
+  6, 0, 0, 8, 11, 0, 36, 0, 0, 0,
+  95, 0, 70, 0, 20, 0, 1, 0, 0, 0,
+  8, 0, 11, 0, 7, 17, 0, 25, 21, 11,
+  0, 0, 61, 0, 0, 19, 7, 87, 0, 0,
+  0, 20, 13, 16, 69, 0, 0, 19, 0, 0,
+  0, 0, 0, 18, 0, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 18, 0, 55, 0, 0,
+  10, 38, 0, 0, 71, 103, 0, 69, 0, 0,
+  31, 9, 0, 0, 0, 0, 4, 0, 42, 20,
+  0, 14, 0, 7, 0, 2, 0, 0, 39, 0,
+  0, 0, 0, 43, 31, 45, 9, 0, 36, 0,
+  50, 45, 79, 24, 11, 1, 0, 0, 0, 13,
+  32, 0, 65, 65, 1, 23, 0, 0, 0, 0,
+  0, 13, 64, 0, 7, 0, 0, 0, 59, 0,
+  45, 0, 6, 0, 45, 0, 40, 0, 47, 0,
+  8, 0, 20, 0, 19, 16, 0, 0, 0, 0,
+  29, 0, 0, 0, 2, 73, 0, 0, 0, 28,
+  8, 5, 49, 5, 52, 6, 0, 0, 0, 7,
+  0, 12, 6, 1, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 29, 0, 45, 0, 0, 0, 16,
+  0, 0, 39, 114, 0, 30, 15, 0, 35, 10,
+  0, 0, 0, 0, 31, 0, 77, 23, 0, 26,
+  0, 48, 0, 8, 0, 0, 25, 0, 0, 0,
+  0, 24, 31, 18, 0, 15, 42, 0, 28, 19,
+  61, 0, 0, 0, 0, 0, 0, 9, 24, 0,
+  72, 41, 0, 0, 3, 0, 0, 0, 0, 13,
+  37, 0, 43, 0, 0, 5, 84, 0, 93, 0,
+  17, 0, 7, 5, 0, 0, 42, 4, 0, 0,
+  3, 16, 0, 41, 1, 0, 4, 6, 70, 0,
+  0, 11, 25, 55, 18, 0, 14, 4, 17, 0,
+  52, 0, 0, 17, 0, 16, 4, 14, 0, 32,
+  2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 25, 0, 53, 0, 0, 5, 16, 0, 0,
+  58, 87, 18, 68, 0, 0, 15, 25, 0, 19,
+  0, 0, 0, 0, 0, 11, 7, 13, 8, 0,
+  0, 9, 0, 0, 44, 3, 0, 0, 0, 43,
+  57, 57, 0, 0, 32, 0, 31, 33, 74, 29,
+  25, 0, 0, 0, 0, 11, 45, 0, 71, 48,
+  0, 0, 7, 0, 2, 0, 0, 12, 74, 6,
+  34, 0, 0, 0, 67, 0, 49, 0, 0, 0,
+  48, 9, 63, 0, 76, 0, 5, 0, 0, 29,
+  0, 36, 17, 0, 0, 1, 82, 0, 0, 10,
+  14, 80, 41, 0, 22, 8, 10, 0, 47, 0,
+  0, 23, 0, 13, 0, 15, 0, 5, 0, 0,
+  0, 11, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 51, 0, 0, 23, 16, 0, 0, 35, 72,
+  21, 74, 0, 0, 3, 24, 0, 11, 0, 0,
+  0, 0, 0, 21, 29, 0, 30, 0, 0, 0,
+  0, 0, 58, 0, 0, 0, 0, 30, 56, 60,
+  4, 0, 25, 0, 29, 51, 61, 17, 7, 13,
+  0, 0, 0, 14, 29, 0, 67, 43, 0, 16,
+  0, 0, 10, 1, 0, 7, 54, 13, 18, 0,
+  0, 0, 34, 0, 15, 0, 0, 0, 35, 0,
+  63, 0, 64, 0, 8, 0, 0, 50, 11, 21,
+  17, 0, 0, 0, 67, 0, 0, 42, 4, 106,
+  9, 17, 15, 45, 0, 24, 71, 0, 40, 19,
+  0, 0, 0, 3, 0, 0, 0, 0, 0, 10,
+  0, 0, 0, 0, 0, 0, 4, 19, 0, 50,
+  0, 0, 0, 45, 0, 0, 34, 65, 36, 45,
+  0, 0, 44, 0, 0, 0, 0, 0, 7, 0,
+  60, 7, 0, 7, 12, 15, 0, 0, 10, 2,
+  40, 0, 0, 0, 0, 1, 42, 35, 2, 0,
+  21, 0, 58, 15, 51, 12, 0, 30, 0, 0,
+  0, 9, 0, 0, 58, 45, 6, 2, 0, 0,
+  16, 0, 0, 13, 0, 3, 7, 0, 0, 0,
+  80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 4, 12, 0, 20, 58, 19, 29, 24, 0,
+  0, 0, 79, 0, 0, 44, 19, 100, 0, 0,
+  0, 11, 0, 4, 57, 0, 28, 24, 0, 0,
+  2, 0, 0, 3, 5, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 34, 0, 24, 0, 0,
+  6, 41, 0, 0, 50, 104, 10, 72, 18, 0,
+  43, 0, 5, 0, 0, 0, 14, 0, 25, 49,
+  0, 0, 0, 41, 0, 14, 1, 0, 14, 2,
+  0, 0, 0, 33, 14, 52, 21, 0, 21, 0,
+  41, 46, 70, 27, 15, 0, 0, 0, 0, 6,
+  30, 0, 57, 63, 0, 18, 0, 0, 0, 0,
+  0, 23, 55, 0, 32, 0, 0, 0, 90, 0,
+  14, 0, 0, 0, 5, 1, 0, 0, 20, 7,
+  0, 0, 56, 103, 0, 45, 15, 0, 0, 0,
+  58, 0, 0, 52, 30, 60, 0, 0, 0, 11,
+  22, 8, 26, 0, 0, 48, 0, 0, 58, 0,
+  0, 0, 19, 13, 0, 0, 3, 0, 0, 0,
+  0, 0, 0, 0, 0, 14, 26, 11, 2, 0,
+  0, 0, 23, 83, 1, 41, 67, 0, 39, 3,
+  0, 0, 0, 31, 34, 12, 4, 15, 0, 13,
+  0, 63, 0, 12, 10, 0, 0, 36, 0, 0,
+  33, 0, 0, 39, 30, 13, 0, 0, 19, 60,
+  73, 69, 93, 0, 0, 0, 0, 0, 59, 0,
+  21, 68, 23, 82, 0, 0, 0, 0, 0, 52,
+  129, 3, 21, 0, 0, 7, 40, 0, 0, 0,
+  3, 0, 26, 0, 14, 0, 57, 39, 0, 0,
+  16, 0, 16, 11, 0, 0, 0, 0, 35, 0,
+  0, 25, 4, 106, 0, 0, 0, 36, 2, 10,
+  68, 10, 49, 2, 0, 0, 0, 0, 0, 0,
+  0, 2, 0, 9, 0, 0, 0, 0, 0, 0,
+  5, 41, 0, 45, 0, 0, 0, 31, 0, 0,
+  66, 127, 0, 42, 14, 0, 16, 0, 2, 0,
+  0, 0, 48, 0, 110, 32, 0, 9, 0, 60,
+  0, 11, 0, 0, 22, 0, 0, 0, 0, 41,
+  18, 32, 0, 0, 51, 0, 58, 18, 81, 0,
+  0, 0, 0, 0, 0, 12, 11, 0, 73, 49,
+  0, 0, 0, 0, 6, 0, 0, 8, 11, 0,
+  36, 0, 0, 0, 95, 0, 70, 0, 20, 0,
+  1, 0, 0, 0, 8, 0, 11, 0, 7, 17,
+  0, 25, 21, 11, 0, 0, 61, 0, 0, 19,
+  7, 87, 0, 0, 0, 20, 13, 16, 69, 0,
+  0, 19, 0, 0, 0, 0, 0, 18, 0, 0,
+  0, 6, 0, 0, 0, 0, 0, 0, 0, 18,
+  0, 55, 0, 0, 10, 38, 0, 0, 71, 103,
+  0, 69, 0, 0, 31, 9, 0, 0, 0, 0,
+  4, 0, 42, 20, 0, 14, 0, 7, 0, 2,
+  0, 0, 39, 0, 0, 0, 0, 43, 31, 45,
+  9, 0, 36, 0, 50, 45, 79, 24, 11, 1,
+  0, 0, 0, 13, 32, 0, 65, 65, 1, 23,
+  0, 0, 0, 0, 0, 13, 64, 0, 7, 0,
+  0, 0, 59, 0, 45, 0, 6, 0, 45, 0,
+  40, 0, 47, 0, 8, 0, 0, 108, 0, 50,
+  20, 0, 23, 0, 76, 0, 5, 27, 31, 30,
+  12, 0, 0, 17, 12, 30, 55, 0, 0, 56,
+  13, 61, 39, 0, 0, 26, 15, 0, 27, 4,
+  0, 0, 0, 0, 0, 5, 0, 21, 0, 47,
+  11, 0, 10, 19, 0, 0, 54, 49, 57, 86,
+  0, 0, 20, 0, 0, 49, 9, 0, 0, 0,
+  0, 0, 32, 13, 0, 0, 0, 12, 0, 0,
+  51, 32, 0, 0, 0, 19, 65, 67, 24, 0,
+  19, 0, 39, 50, 52, 88, 74, 0, 0, 18,
+  0, 13, 42, 0, 60, 63, 11, 32, 0, 0,
+  0, 0, 14, 25, 123, 40, 2, 0, 0, 0,
+  13, 0, 5, 0, 0, 0, 42, 3, 144, 0,
+  86, 0, 0, 0, 3, 16, 0, 41, 1, 0,
+  4, 6, 70, 0, 0, 11, 25, 55, 18, 0,
+  14, 4, 17, 0, 52, 0, 0, 17, 0, 16,
+  4, 14, 0, 32, 2, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 25, 0, 53, 0, 0,
+  5, 16, 0, 0, 58, 87, 18, 68, 0, 0,
+  15, 25, 0, 19, 0, 0, 0, 0, 0, 11,
+  7, 13, 8, 0, 0, 9, 0, 0, 44, 3,
+  0, 0, 0, 43, 57, 57, 0, 0, 32, 0,
+  31, 33, 74, 29, 25, 0, 0, 0, 0, 11,
+  45, 0, 71, 48, 0, 0, 7, 0, 2, 0,
+  0, 12, 74, 6, 34, 0, 0, 0, 67, 0,
+  49, 0, 0, 0, 48, 9, 63, 0, 76, 0,
+  5, 0, 0, 29, 0, 36, 17, 0, 0, 1,
+  82, 0, 0, 10, 14, 80, 41, 0, 22, 8,
+  10, 0, 47, 0, 0, 23, 0, 13, 0, 15,
+  0, 5, 0, 0, 0, 11, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 51, 0, 0, 23, 16,
+  0, 0, 35, 72, 21, 74, 0, 0, 3, 24,
+  0, 11, 0, 0, 0, 0, 0, 21, 29, 0,
+  30, 0, 0, 0, 0, 0, 58, 0, 0, 0,
+  0, 30, 56, 60, 4, 0, 25, 0, 29, 51,
+  61, 17, 7, 13, 0, 0, 0, 14, 29, 0,
+  67, 43, 0, 16, 0, 0, 10, 1, 0, 7,
+  54, 13, 18, 0, 0, 0, 34, 0, 15, 0,
+  0, 0, 35, 0, 63, 0, 64, 0, 8, 0,
+  0, 64, 0, 40, 20, 0, 10, 0, 63, 0,
+  7, 15, 12, 65, 48, 6, 31, 34, 0, 25,
+  58, 0, 0, 21, 0, 36, 3, 4, 0, 0,
+  0, 0, 0, 32, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 41, 0, 0, 21, 22, 0, 0,
+  26, 26, 28, 76, 0, 0, 10, 4, 0, 25,
+  19, 0, 0, 0, 0, 11, 55, 3, 50, 0,
+  0, 0, 0, 0, 62, 0, 0, 0, 0, 3,
+  57, 69, 4, 0, 25, 19, 41, 29, 30, 12,
+  0, 34, 0, 1, 0, 24, 19, 0, 63, 30,
+  0, 19, 0, 0, 12, 0, 3, 1, 34, 21,
+  0, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 13, 75, 0, 41, 0, 17, 0, 20, 58,
+  19, 29, 24, 0, 0, 0, 79, 0, 0, 44,
+  19, 100, 0, 0, 0, 11, 0, 4, 57, 0,
+  28, 24, 0, 0, 2, 0, 0, 3, 5, 0,
+  0, 6, 0, 0, 0, 0, 0, 0, 0, 34,
+  0, 24, 0, 0, 6, 41, 0, 0, 50, 104,
+  10, 72, 18, 0, 43, 0, 5, 0, 0, 0,
+  14, 0, 25, 49, 0, 0, 0, 41, 0, 14,
+  1, 0, 14, 2, 0, 0, 0, 33, 14, 52,
+  21, 0, 21, 0, 41, 46, 70, 27, 15, 0,
+  0, 0, 0, 6, 30, 0, 57, 63, 0, 18,
+  0, 0, 0, 0, 0, 23, 55, 0, 32, 0,
+  0, 0, 90, 0, 14, 0, 0, 0, 5, 1,
+  0, 0, 20, 7, 0, 0, 56, 103, 0, 45,
+  15, 0, 0, 0, 58, 0, 0, 52, 30, 60,
+  0, 0, 0, 11, 22, 8, 26, 0, 0, 48,
+  0, 0, 58, 0, 0, 0, 19, 13, 0, 0,
+  3, 0, 0, 0, 0, 0, 0, 0, 0, 14,
+  26, 11, 2, 0, 0, 0, 23, 83, 1, 41,
+  67, 0, 39, 3, 0, 0, 0, 31, 34, 12,
+  4, 15, 0, 13, 0, 63, 0, 12, 10, 0,
+  0, 36, 0, 0, 33, 0, 0, 39, 30, 13,
+  0, 0, 19, 60, 73, 69, 93, 0, 0, 0,
+  0, 0, 59, 0, 21, 68, 23, 82, 0, 0,
+  0, 0, 0, 52, 129, 3, 21, 0, 0, 7,
+  40, 0, 0, 0, 3, 0, 26, 0, 14, 0,
+  57, 39, 0, 0, 46, 82, 0, 50, 1, 35,
+  0, 0, 22, 0, 0, 15, 41, 6, 0, 0,
+  0, 19, 21, 11, 13, 31, 0, 0, 0, 0,
+  64, 0, 0, 0, 30, 54, 0, 0, 28, 29,
+  0, 17, 0, 0, 0, 0, 1, 18, 5, 11,
+  10, 0, 0, 0, 0, 57, 0, 22, 95, 48,
+  30, 4, 0, 0, 0, 73, 54, 11, 88, 0,
+  0, 66, 0, 94, 130, 13, 9, 0, 0, 4,
+  0, 2, 68, 0, 0, 0, 23, 16, 20, 0,
+  0, 28, 33, 13, 56, 0, 0, 0, 6, 0,
+  47, 0, 18, 68, 22, 150, 0, 0, 0, 0,
+  0, 82, 91, 0, 7, 26, 10, 31, 0, 0,
+  0, 0, 31, 0, 0, 0, 0, 0, 50, 35,
+  0, 2, 7, 17, 0, 25, 21, 11, 0, 0,
+  61, 0, 0, 19, 7, 87, 0, 0, 0, 20,
+  13, 16, 69, 0, 0, 19, 0, 0, 0, 0,
+  0, 18, 0, 0, 0, 6, 0, 0, 0, 0,
+  0, 0, 0, 18, 0, 55, 0, 0, 10, 38,
+  0, 0, 71, 103, 0, 69, 0, 0, 31, 9,
+  0, 0, 0, 0, 4, 0, 42, 20, 0, 14,
+  0, 7, 0, 2, 0, 0, 39, 0, 0, 0,
+  0, 43, 31, 45, 9, 0, 36, 0, 50, 45,
+  79, 24, 11, 1, 0, 0, 0, 13, 32, 0,
+  65, 65, 1, 23, 0, 0, 0, 0, 0, 13,
+  64, 0, 7, 0, 0, 0, 59, 0, 45, 0,
+  6, 0, 45, 0, 40, 0, 47, 0, 8, 0,
+  0, 108, 0, 50, 20, 0, 23, 0, 76, 0,
+  5, 27, 31, 30, 12, 0, 0, 17, 12, 30,
+  55, 0, 0, 56, 13, 61, 39, 0, 0, 26,
+  15, 0, 27, 4, 0, 0, 0, 0, 0, 5,
+  0, 21, 0, 47, 11, 0, 10, 19, 0, 0,
+  54, 49, 57, 86, 0, 0, 20, 0, 0, 49,
+  9, 0, 0, 0, 0, 0, 32, 13, 0, 0,
+  0, 12, 0, 0, 51, 32, 0, 0, 0, 19,
+  65, 67, 24, 0, 19, 0, 39, 50, 52, 88,
+  74, 0, 0, 18, 0, 13, 42, 0, 60, 63,
+  11, 32, 0, 0, 0, 0, 14, 25, 123, 40,
+  2, 0, 0, 0, 13, 0, 5, 0, 0, 0,
+  42, 3, 144, 0, 86, 0, 0, 0, 0, 155,
+  0, 57, 4, 0, 35, 0, 65, 0, 13, 22,
+  77, 0, 0, 0, 0, 12, 22, 43, 12, 0,
+  0, 61, 29, 33, 73, 13, 3, 0, 36, 0,
+  52, 0, 38, 0, 0, 0, 0, 0, 0, 22,
+  0, 53, 11, 0, 16, 0, 0, 0, 43, 52,
+  47, 51, 11, 17, 36, 0, 0, 49, 1, 0,
+  0, 0, 0, 0, 2, 16, 0, 0, 11, 34,
+  0, 0, 39, 55, 0, 69, 4, 0, 37, 56,
+  49, 10, 11, 0, 0, 58, 72, 93, 137, 0,
+  0, 11, 0, 0, 57, 0, 44, 81, 42, 39,
+  0, 0, 0, 0, 27, 70, 152, 18, 4, 0,
+  17, 10, 0, 0, 0, 0, 0, 0, 3, 0,
+  133, 2, 119, 5, 0, 0, 0, 29, 0, 36,
+  17, 0, 0, 1, 82, 0, 0, 10, 14, 80,
+  41, 0, 22, 8, 10, 0, 47, 0, 0, 23,
+  0, 13, 0, 15, 0, 5, 0, 0, 0, 11,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 51,
+  0, 0, 23, 16, 0, 0, 35, 72, 21, 74,
+  0, 0, 3, 24, 0, 11, 0, 0, 0, 0,
+  0, 21, 29, 0, 30, 0, 0, 0, 0, 0,
+  58, 0, 0, 0, 0, 30, 56, 60, 4, 0,
+  25, 0, 29, 51, 61, 17, 7, 13, 0, 0,
+  0, 14, 29, 0, 67, 43, 0, 16, 0, 0,
+  10, 1, 0, 7, 54, 13, 18, 0, 0, 0,
+  34, 0, 15, 0, 0, 0, 35, 0, 63, 0,
+  64, 0, 8, 0, 0, 64, 0, 40, 20, 0,
+  10, 0, 63, 0, 7, 15, 12, 65, 48, 6,
+  31, 34, 0, 25, 58, 0, 0, 21, 0, 36,
+  3, 4, 0, 0, 0, 0, 0, 32, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 41, 0, 0,
+  21, 22, 0, 0, 26, 26, 28, 76, 0, 0,
+  10, 4, 0, 25, 19, 0, 0, 0, 0, 11,
+  55, 3, 50, 0, 0, 0, 0, 0, 62, 0,
+  0, 0, 0, 3, 57, 69, 4, 0, 25, 19,
+  41, 29, 30, 12, 0, 34, 0, 1, 0, 24,
+  19, 0, 63, 30, 0, 19, 0, 0, 12, 0,
+  3, 1, 34, 21, 0, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 13, 75, 0, 41, 0,
+  17, 0, 0, 151, 1, 57, 8, 0, 17, 0,
+  42, 0, 26, 0, 19, 37, 38, 18, 29, 7,
+  6, 53, 10, 0, 0, 24, 1, 37, 15, 7,
+  0, 0, 0, 0, 46, 5, 0, 0, 0, 0,
+  0, 1, 0, 2, 0, 21, 0, 0, 21, 42,
+  0, 0, 40, 0, 12, 89, 0, 0, 18, 1,
+  0, 44, 24, 0, 0, 0, 0, 0, 73, 21,
+  53, 0, 0, 0, 0, 8, 68, 12, 0, 35,
+  0, 18, 49, 62, 21, 11, 30, 33, 16, 49,
+  19, 13, 53, 22, 0, 17, 0, 5, 44, 0,
+  24, 80, 3, 46, 0, 0, 12, 0, 22, 12,
+  52, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 89, 0, 51, 0, 16, 1,
+  56, 103, 0, 45, 15, 0, 0, 0, 58, 0,
+  0, 52, 30, 60, 0, 0, 0, 11, 22, 8,
+  26, 0, 0, 48, 0, 0, 58, 0, 0, 0,
+  19, 13, 0, 0, 3, 0, 0, 0, 0, 0,
+  0, 0, 0, 14, 26, 11, 2, 0, 0, 0,
+  23, 83, 1, 41, 67, 0, 39, 3, 0, 0,
+  0, 31, 34, 12, 4, 15, 0, 13, 0, 63,
+  0, 12, 10, 0, 0, 36, 0, 0, 33, 0,
+  0, 39, 30, 13, 0, 0, 19, 60, 73, 69,
+  93, 0, 0, 0, 0, 0, 59, 0, 21, 68,
+  23, 82, 0, 0, 0, 0, 0, 52, 129, 3,
+  21, 0, 0, 7, 40, 0, 0, 0, 3, 0,
+  26, 0, 14, 0, 57, 39, 0, 0, 46, 82,
+  0, 50, 1, 35, 0, 0, 22, 0, 0, 15,
+  41, 6, 0, 0, 0, 19, 21, 11, 13, 31,
+  0, 0, 0, 0, 64, 0, 0, 0, 30, 54,
+  0, 0, 28, 29, 0, 17, 0, 0, 0, 0,
+  1, 18, 5, 11, 10, 0, 0, 0, 0, 57,
+  0, 22, 95, 48, 30, 4, 0, 0, 0, 73,
+  54, 11, 88, 0, 0, 66, 0, 94, 130, 13,
+  9, 0, 0, 4, 0, 2, 68, 0, 0, 0,
+  23, 16, 20, 0, 0, 28, 33, 13, 56, 0,
+  0, 0, 6, 0, 47, 0, 18, 68, 22, 150,
+  0, 0, 0, 0, 0, 82, 91, 0, 7, 26,
+  10, 31, 0, 0, 0, 0, 31, 0, 0, 0,
+  0, 0, 50, 35, 0, 2, 1, 12, 0, 19,
+  0, 115, 0, 0, 17, 0, 0, 0, 0, 1,
+  0, 0, 0, 28, 11, 16, 0, 65, 2, 0,
+  0, 0, 23, 0, 0, 0, 0, 17, 8, 0,
+  9, 65, 12, 45, 5, 0, 48, 0, 0, 18,
+  0, 33, 46, 0, 0, 7, 0, 29, 0, 0,
+  131, 59, 54, 5, 43, 0, 0, 107, 51, 0,
+  166, 0, 0, 46, 0, 112, 193, 0, 44, 0,
+  0, 35, 0, 0, 29, 0, 0, 0, 32, 0,
+  28, 0, 0, 1, 14, 0, 0, 79, 16, 0,
+  38, 0, 0, 0, 3, 61, 47, 127, 0, 0,
+  0, 0, 0, 36, 0, 0, 0, 55, 0, 53,
+  0, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+  13, 18, 0, 12, 0, 108, 0, 50, 20, 0,
+  23, 0, 76, 0, 5, 27, 31, 30, 12, 0,
+  0, 17, 12, 30, 55, 0, 0, 56, 13, 61,
+  39, 0, 0, 26, 15, 0, 27, 4, 0, 0,
+  0, 0, 0, 5, 0, 21, 0, 47, 11, 0,
+  10, 19, 0, 0, 54, 49, 57, 86, 0, 0,
+  20, 0, 0, 49, 9, 0, 0, 0, 0, 0,
+  32, 13, 0, 0, 0, 12, 0, 0, 51, 32,
+  0, 0, 0, 19, 65, 67, 24, 0, 19, 0,
+  39, 50, 52, 88, 74, 0, 0, 18, 0, 13,
+  42, 0, 60, 63, 11, 32, 0, 0, 0, 0,
+  14, 25, 123, 40, 2, 0, 0, 0, 13, 0,
+  5, 0, 0, 0, 42, 3, 144, 0, 86, 0,
+  0, 0, 0, 155, 0, 57, 4, 0, 35, 0,
+  65, 0, 13, 22, 77, 0, 0, 0, 0, 12,
+  22, 43, 12, 0, 0, 61, 29, 33, 73, 13,
+  3, 0, 36, 0, 52, 0, 38, 0, 0, 0,
+  0, 0, 0, 22, 0, 53, 11, 0, 16, 0,
+  0, 0, 43, 52, 47, 51, 11, 17, 36, 0,
+  0, 49, 1, 0, 0, 0, 0, 0, 2, 16,
+  0, 0, 11, 34, 0, 0, 39, 55, 0, 69,
+  4, 0, 37, 56, 49, 10, 11, 0, 0, 58,
+  72, 93, 137, 0, 0, 11, 0, 0, 57, 0,
+  44, 81, 42, 39, 0, 0, 0, 0, 27, 70,
+  152, 18, 4, 0, 17, 10, 0, 0, 0, 0,
+  0, 0, 3, 0, 133, 2, 119, 5, 0, 0,
+  21, 77, 0, 54, 0, 57, 1, 0, 24, 0,
+  0, 9, 43, 0, 0, 0, 0, 20, 47, 27,
+  0, 27, 1, 0, 0, 0, 69, 0, 0, 0,
+  4, 19, 15, 0, 32, 49, 0, 0, 3, 0,
+  0, 7, 0, 34, 8, 10, 16, 0, 0, 0,
+  3, 45, 0, 0, 93, 35, 51, 0, 0, 0,
+  0, 53, 20, 0, 103, 0, 0, 43, 0, 68,
+  175, 29, 22, 0, 0, 35, 0, 61, 4, 6,
+  0, 0, 64, 5, 21, 0, 0, 19, 51, 0,
+  81, 0, 0, 0, 7, 0, 55, 0, 12, 95,
+  28, 106, 1, 0, 0, 0, 4, 67, 71, 0,
+  2, 16, 0, 39, 0, 0, 0, 0, 25, 0,
+  0, 0, 0, 18, 65, 17, 0, 0, 0, 64,
+  0, 40, 20, 0, 10, 0, 63, 0, 7, 15,
+  12, 65, 48, 6, 31, 34, 0, 25, 58, 0,
+  0, 21, 0, 36, 3, 4, 0, 0, 0, 0,
+  0, 32, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 41, 0, 0, 21, 22, 0, 0, 26, 26,
+  28, 76, 0, 0, 10, 4, 0, 25, 19, 0,
+  0, 0, 0, 11, 55, 3, 50, 0, 0, 0,
+  0, 0, 62, 0, 0, 0, 0, 3, 57, 69,
+  4, 0, 25, 19, 41, 29, 30, 12, 0, 34,
+  0, 1, 0, 24, 19, 0, 63, 30, 0, 19,
+  0, 0, 12, 0, 3, 1, 34, 21, 0, 0,
+  0, 0, 15, 0, 0, 0, 0, 0, 0, 13,
+  75, 0, 41, 0, 17, 0, 0, 151, 1, 57,
+  8, 0, 17, 0, 42, 0, 26, 0, 19, 37,
+  38, 18, 29, 7, 6, 53, 10, 0, 0, 24,
+  1, 37, 15, 7, 0, 0, 0, 0, 46, 5,
+  0, 0, 0, 0, 0, 1, 0, 2, 0, 21,
+  0, 0, 21, 42, 0, 0, 40, 0, 12, 89,
+  0, 0, 18, 1, 0, 44, 24, 0, 0, 0,
+  0, 0, 73, 21, 53, 0, 0, 0, 0, 8,
+  68, 12, 0, 35, 0, 18, 49, 62, 21, 11,
+  30, 33, 16, 49, 19, 13, 53, 22, 0, 17,
+  0, 5, 44, 0, 24, 80, 3, 46, 0, 0,
+  12, 0, 22, 12, 52, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 89, 0,
+  51, 0, 16, 1, 6, 145, 0, 66, 0, 25,
+  0, 0, 52, 0, 6, 0, 69, 0, 0, 0,
+  0, 5, 33, 32, 0, 0, 14, 32, 3, 0,
+  70, 0, 0, 0, 0, 0, 77, 0, 13, 38,
+  0, 0, 0, 0, 0, 17, 0, 19, 0, 15,
+  48, 19, 0, 17, 5, 25, 0, 35, 17, 0,
+  54, 0, 0, 16, 0, 0, 0, 0, 16, 0,
+  16, 19, 0, 1, 65, 17, 3, 0, 34, 29,
+  0, 94, 0, 16, 0, 0, 90, 39, 0, 18,
+  0, 41, 51, 18, 99, 0, 0, 0, 0, 0,
+  61, 0, 18, 99, 42, 59, 0, 0, 0, 10,
+  57, 44, 87, 0, 0, 0, 0, 36, 0, 0,
+  0, 0, 5, 0, 3, 0, 48, 0, 39, 0,
+  0, 46, 46, 82, 0, 50, 1, 35, 0, 0,
+  22, 0, 0, 15, 41, 6, 0, 0, 0, 19,
+  21, 11, 13, 31, 0, 0, 0, 0, 64, 0,
+  0, 0, 30, 54, 0, 0, 28, 29, 0, 17,
+  0, 0, 0, 0, 1, 18, 5, 11, 10, 0,
+  0, 0, 0, 57, 0, 22, 95, 48, 30, 4,
+  0, 0, 0, 73, 54, 11, 88, 0, 0, 66,
+  0, 94, 130, 13, 9, 0, 0, 4, 0, 2,
+  68, 0, 0, 0, 23, 16, 20, 0, 0, 28,
+  33, 13, 56, 0, 0, 0, 6, 0, 47, 0,
+  18, 68, 22, 150, 0, 0, 0, 0, 0, 82,
+  91, 0, 7, 26, 10, 31, 0, 0, 0, 0,
+  31, 0, 0, 0, 0, 0, 50, 35, 0, 2,
+  1, 12, 0, 19, 0, 115, 0, 0, 17, 0,
+  0, 0, 0, 1, 0, 0, 0, 28, 11, 16,
+  0, 65, 2, 0, 0, 0, 23, 0, 0, 0,
+  0, 17, 8, 0, 9, 65, 12, 45, 5, 0,
+  48, 0, 0, 18, 0, 33, 46, 0, 0, 7,
+  0, 29, 0, 0, 131, 59, 54, 5, 43, 0,
+  0, 107, 51, 0, 166, 0, 0, 46, 0, 112,
+  193, 0, 44, 0, 0, 35, 0, 0, 29, 0,
+  0, 0, 32, 0, 28, 0, 0, 1, 14, 0,
+  0, 79, 16, 0, 38, 0, 0, 0, 3, 61,
+  47, 127, 0, 0, 0, 0, 0, 36, 0, 0,
+  0, 55, 0, 53, 0, 0, 0, 0, 47, 0,
+  0, 0, 0, 0, 13, 18, 0, 12, 0, 1,
+  0, 0, 0, 57, 0, 18, 70, 15, 0, 4,
+  0, 0, 0, 50, 13, 20, 0, 0, 47, 47,
+  29, 12, 0, 0, 0, 10, 0, 0, 0, 0,
+  50, 0, 0, 44, 0, 64, 0, 0, 54, 0,
+  0, 47, 0, 99, 16, 46, 0, 15, 0, 37,
+  0, 0, 63, 0, 74, 0, 64, 0, 0, 62,
+  0, 0, 90, 0, 0, 12, 30, 23, 61, 0,
+  70, 60, 0, 76, 0, 1, 0, 0, 21, 0,
+  0, 0, 0, 0, 8, 0, 5, 0, 0, 121,
+  9, 0, 0, 0, 0, 0, 20, 54, 116, 17,
+  0, 0, 0, 0, 11, 9, 0, 21, 0, 19,
+  0, 73, 0, 0, 0, 0, 56, 0, 53, 0,
+  0, 0, 21, 0, 18, 0, 0, 155, 0, 57,
+  4, 0, 35, 0, 65, 0, 13, 22, 77, 0,
+  0, 0, 0, 12, 22, 43, 12, 0, 0, 61,
+  29, 33, 73, 13, 3, 0, 36, 0, 52, 0,
+  38, 0, 0, 0, 0, 0, 0, 22, 0, 53,
+  11, 0, 16, 0, 0, 0, 43, 52, 47, 51,
+  11, 17, 36, 0, 0, 49, 1, 0, 0, 0,
+  0, 0, 2, 16, 0, 0, 11, 34, 0, 0,
+  39, 55, 0, 69, 4, 0, 37, 56, 49, 10,
+  11, 0, 0, 58, 72, 93, 137, 0, 0, 11,
+  0, 0, 57, 0, 44, 81, 42, 39, 0, 0,
+  0, 0, 27, 70, 152, 18, 4, 0, 17, 10,
+  0, 0, 0, 0, 0, 0, 3, 0, 133, 2,
+  119, 5, 0, 0, 21, 77, 0, 54, 0, 57,
+  1, 0, 24, 0, 0, 9, 43, 0, 0, 0,
+  0, 20, 47, 27, 0, 27, 1, 0, 0, 0,
+  69, 0, 0, 0, 4, 19, 15, 0, 32, 49,
+  0, 0, 3, 0, 0, 7, 0, 34, 8, 10,
+  16, 0, 0, 0, 3, 45, 0, 0, 93, 35,
+  51, 0, 0, 0, 0, 53, 20, 0, 103, 0,
+  0, 43, 0, 68, 175, 29, 22, 0, 0, 35,
+  0, 61, 4, 6, 0, 0, 64, 5, 21, 0,
+  0, 19, 51, 0, 81, 0, 0, 0, 7, 0,
+  55, 0, 12, 95, 28, 106, 1, 0, 0, 0,
+  4, 67, 71, 0, 2, 16, 0, 39, 0, 0,
+  0, 0, 25, 0, 0, 0, 0, 18, 65, 17,
+  0, 0, 0, 0, 0, 25, 0, 135, 0, 7,
+  42, 0, 0, 4, 0, 6, 0, 0, 0, 25,
+  13, 0, 41, 106, 15, 0, 0, 0, 0, 1,
+  0, 0, 0, 1, 9, 0, 0, 82, 0, 40,
+  0, 0, 45, 0, 0, 46, 0, 80, 0, 4,
+  0, 0, 0, 52, 0, 0, 133, 36, 44, 0,
+  57, 0, 0, 92, 42, 0, 155, 0, 0, 30,
+  0, 77, 196, 0, 59, 34, 0, 31, 0, 16,
+  9, 0, 0, 0, 35, 0, 0, 0, 1, 0,
+  11, 0, 0, 92, 0, 0, 27, 0, 0, 0,
+  7, 76, 78, 108, 0, 0, 0, 0, 0, 30,
+  0, 0, 0, 38, 0, 95, 0, 0, 0, 0,
+  52, 0, 0, 0, 0, 0, 21, 0, 0, 6,
+  0, 151, 1, 57, 8, 0, 17, 0, 42, 0,
+  26, 0, 19, 37, 38, 18, 29, 7, 6, 53,
+  10, 0, 0, 24, 1, 37, 15, 7, 0, 0,
+  0, 0, 46, 5, 0, 0, 0, 0, 0, 1,
+  0, 2, 0, 21, 0, 0, 21, 42, 0, 0,
+  40, 0, 12, 89, 0, 0, 18, 1, 0, 44,
+  24, 0, 0, 0, 0, 0, 73, 21, 53, 0,
+  0, 0, 0, 8, 68, 12, 0, 35, 0, 18,
+  49, 62, 21, 11, 30, 33, 16, 49, 19, 13,
+  53, 22, 0, 17, 0, 5, 44, 0, 24, 80,
+  3, 46, 0, 0, 12, 0, 22, 12, 52, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 89, 0, 51, 0, 16, 1, 6, 145,
+  0, 66, 0, 25, 0, 0, 52, 0, 6, 0,
+  69, 0, 0, 0, 0, 5, 33, 32, 0, 0,
+  14, 32, 3, 0, 70, 0, 0, 0, 0, 0,
+  77, 0, 13, 38, 0, 0, 0, 0, 0, 17,
+  0, 19, 0, 15, 48, 19, 0, 17, 5, 25,
+  0, 35, 17, 0, 54, 0, 0, 16, 0, 0,
+  0, 0, 16, 0, 16, 19, 0, 1, 65, 17,
+  3, 0, 34, 29, 0, 94, 0, 16, 0, 0,
+  90, 39, 0, 18, 0, 41, 51, 18, 99, 0,
+  0, 0, 0, 0, 61, 0, 18, 99, 42, 59,
+  0, 0, 0, 10, 57, 44, 87, 0, 0, 0,
+  0, 36, 0, 0, 0, 0, 5, 0, 3, 0,
+  48, 0, 39, 0, 0, 46, 58, 21, 0, 68,
+  2, 105, 0, 4, 38, 0, 0, 0, 40, 0,
+  0, 0, 2, 21, 35, 0, 0, 90, 13, 0,
+  0, 0, 31, 0, 9, 0, 0, 31, 3, 0,
+  67, 72, 9, 0, 27, 0, 20, 14, 0, 28,
+  22, 53, 41, 0, 0, 0, 0, 61, 0, 0,
+  135, 38, 37, 0, 7, 0, 0, 47, 34, 0,
+  96, 0, 0, 31, 0, 47, 198, 6, 55, 0,
+  0, 0, 0, 35, 0, 0, 0, 0, 77, 27,
+  31, 0, 1, 1, 38, 0, 0, 15, 0, 0,
+  17, 0, 39, 0, 26, 71, 33, 77, 0, 0,
+  0, 0, 6, 46, 5, 0, 19, 40, 0, 88,
+  0, 0, 0, 0, 55, 0, 0, 0, 0, 0,
+  28, 0, 0, 16, 1, 12, 0, 19, 0, 115,
+  0, 0, 17, 0, 0, 0, 0, 1, 0, 0,
+  0, 28, 11, 16, 0, 65, 2, 0, 0, 0,
+  23, 0, 0, 0, 0, 17, 8, 0, 9, 65,
+  12, 45, 5, 0, 48, 0, 0, 18, 0, 33,
+  46, 0, 0, 7, 0, 29, 0, 0, 131, 59,
+  54, 5, 43, 0, 0, 107, 51, 0, 166, 0,
+  0, 46, 0, 112, 193, 0, 44, 0, 0, 35,
+  0, 0, 29, 0, 0, 0, 32, 0, 28, 0,
+  0, 1, 14, 0, 0, 79, 16, 0, 38, 0,
+  0, 0, 3, 61, 47, 127, 0, 0, 0, 0,
+  0, 36, 0, 0, 0, 55, 0, 53, 0, 0,
+  0, 0, 47, 0, 0, 0, 0, 0, 13, 18,
+  0, 12, 0, 1, 0, 0, 0, 57, 0, 18,
+  70, 15, 0, 4, 0, 0, 0, 50, 13, 20,
+  0, 0, 47, 47, 29, 12, 0, 0, 0, 10,
+  0, 0, 0, 0, 50, 0, 0, 44, 0, 64,
+  0, 0, 54, 0, 0, 47, 0, 99, 16, 46,
+  0, 15, 0, 37, 0, 0, 63, 0, 74, 0,
+  64, 0, 0, 62, 0, 0, 90, 0, 0, 12,
+  30, 23, 61, 0, 70, 60, 0, 76, 0, 1,
+  0, 0, 21, 0, 0, 0, 0, 0, 8, 0,
+  5, 0, 0, 121, 9, 0, 0, 0, 0, 0,
+  20, 54, 116, 17, 0, 0, 0, 0, 11, 9,
+  0, 21, 0, 19, 0, 73, 0, 0, 0, 0,
+  56, 0, 53, 0, 0, 0, 21, 0, 18, 0,
+  0, 48, 16, 0, 0, 0, 50, 44, 75, 3,
+  3, 42, 110, 0, 16, 61, 79, 13, 2, 0,
+  31, 54, 4, 6, 49, 0, 0, 45, 0, 0,
+  0, 0, 83, 0, 2, 0, 0, 62, 0, 80,
+  0, 35, 4, 49, 18, 97, 6, 35, 0, 42,
+  0, 40, 48, 0, 23, 0, 3, 0, 0, 0,
+  0, 5, 0, 59, 0, 17, 20, 0, 40, 0,
+  0, 0, 0, 48, 8, 0, 29, 54, 0, 0,
+  33, 0, 42, 5, 0, 9, 4, 0, 0, 8,
+  0, 4, 0, 44, 0, 13, 5, 8, 15, 84,
+  41, 0, 0, 0, 34, 0, 24, 13, 4, 22,
+  0, 21, 0, 22, 0, 0, 0, 0, 35, 0,
+  31, 0, 111, 0, 71, 0, 32, 0, 21, 77,
+  0, 54, 0, 57, 1, 0, 24, 0, 0, 9,
+  43, 0, 0, 0, 0, 20, 47, 27, 0, 27,
+  1, 0, 0, 0, 69, 0, 0, 0, 4, 19,
+  15, 0, 32, 49, 0, 0, 3, 0, 0, 7,
+  0, 34, 8, 10, 16, 0, 0, 0, 3, 45,
+  0, 0, 93, 35, 51, 0, 0, 0, 0, 53,
+  20, 0, 103, 0, 0, 43, 0, 68, 175, 29,
+  22, 0, 0, 35, 0, 61, 4, 6, 0, 0,
+  64, 5, 21, 0, 0, 19, 51, 0, 81, 0,
+  0, 0, 7, 0, 55, 0, 12, 95, 28, 106,
+  1, 0, 0, 0, 4, 67, 71, 0, 2, 16,
+  0, 39, 0, 0, 0, 0, 25, 0, 0, 0,
+  0, 18, 65, 17, 0, 0, 0, 0, 0, 25,
+  0, 135, 0, 7, 42, 0, 0, 4, 0, 6,
+  0, 0, 0, 25, 13, 0, 41, 106, 15, 0,
+  0, 0, 0, 1, 0, 0, 0, 1, 9, 0,
+  0, 82, 0, 40, 0, 0, 45, 0, 0, 46,
+  0, 80, 0, 4, 0, 0, 0, 52, 0, 0,
+  133, 36, 44, 0, 57, 0, 0, 92, 42, 0,
+  155, 0, 0, 30, 0, 77, 196, 0, 59, 34,
+  0, 31, 0, 16, 9, 0, 0, 0, 35, 0,
+  0, 0, 1, 0, 11, 0, 0, 92, 0, 0,
+  27, 0, 0, 0, 7, 76, 78, 108, 0, 0,
+  0, 0, 0, 30, 0, 0, 0, 38, 0, 95,
+  0, 0, 0, 0, 52, 0, 0, 0, 0, 0,
+  21, 0, 0, 6, 0, 28, 0, 8, 0, 24,
+  24, 29, 104, 12, 0, 37, 106, 0, 0, 105,
+  62, 22, 0, 0, 41, 62, 0, 12, 2, 0,
+  0, 43, 0, 0, 0, 0, 76, 0, 33, 0,
+  0, 91, 0, 53, 32, 0, 4, 39, 5, 115,
+  2, 34, 0, 36, 0, 56, 16, 0, 56, 0,
+  6, 0, 36, 0, 0, 14, 0, 21, 0, 0,
+  0, 0, 27, 0, 37, 0, 47, 52, 0, 14,
+  8, 31, 0, 0, 8, 0, 29, 0, 0, 10,
+  11, 0, 20, 0, 0, 68, 0, 34, 0, 0,
+  0, 0, 26, 84, 90, 0, 0, 0, 22, 0,
+  15, 31, 0, 34, 0, 30, 0, 52, 0, 0,
+  0, 0, 60, 0, 39, 0, 79, 0, 69, 0,
+  34, 16, 6, 145, 0, 66, 0, 25, 0, 0,
+  52, 0, 6, 0, 69, 0, 0, 0, 0, 5,
+  33, 32, 0, 0, 14, 32, 3, 0, 70, 0,
+  0, 0, 0, 0, 77, 0, 13, 38, 0, 0,
+  0, 0, 0, 17, 0, 19, 0, 15, 48, 19,
+  0, 17, 5, 25, 0, 35, 17, 0, 54, 0,
+  0, 16, 0, 0, 0, 0, 16, 0, 16, 19,
+  0, 1, 65, 17, 3, 0, 34, 29, 0, 94,
+  0, 16, 0, 0, 90, 39, 0, 18, 0, 41,
+  51, 18, 99, 0, 0, 0, 0, 0, 61, 0,
+  18, 99, 42, 59, 0, 0, 0, 10, 57, 44,
+  87, 0, 0, 0, 0, 36, 0, 0, 0, 0,
+  5, 0, 3, 0, 48, 0, 39, 0, 0, 46,
+  58, 21, 0, 68, 2, 105, 0, 4, 38, 0,
+  0, 0, 40, 0, 0, 0, 2, 21, 35, 0,
+  0, 90, 13, 0, 0, 0, 31, 0, 9, 0,
+  0, 31, 3, 0, 67, 72, 9, 0, 27, 0,
+  20, 14, 0, 28, 22, 53, 41, 0, 0, 0,
+  0, 61, 0, 0, 135, 38, 37, 0, 7, 0,
+  0, 47, 34, 0, 96, 0, 0, 31, 0, 47,
+  198, 6, 55, 0, 0, 0, 0, 35, 0, 0,
+  0, 0, 77, 27, 31, 0, 1, 1, 38, 0,
+  0, 15, 0, 0, 17, 0, 39, 0, 26, 71,
+  33, 77, 0, 0, 0, 0, 6, 46, 5, 0,
+  19, 40, 0, 88, 0, 0, 0, 0, 55, 0,
+  0, 0, 0, 0, 28, 0, 0, 16, 0, 0,
+  0, 15, 0, 83, 0, 21, 90, 39, 0, 48,
+  26, 0, 0, 60, 13, 28, 16, 0, 25, 81,
+  1, 0, 0, 0, 1, 44, 17, 19, 0, 35,
+  60, 0, 78, 36, 79, 138, 7, 0, 76, 0,
+  2, 0, 0, 129, 0, 4, 0, 11, 0, 4,
+  0, 0, 138, 0, 2, 0, 27, 0, 0, 90,
+  14, 2, 90, 0, 0, 39, 0, 61, 111, 0,
+  118, 35, 0, 31, 35, 22, 25, 0, 0, 0,
+  0, 27, 0, 0, 12, 25, 0, 0, 0, 91,
+  0, 7, 15, 0, 6, 0, 0, 89, 131, 18,
+  0, 0, 39, 0, 0, 48, 0, 0, 1, 67,
+  0, 57, 0, 0, 0, 0, 75, 0, 0, 0,
+  0, 0, 0, 0, 75, 51, 0, 1, 0, 0,
+  0, 57, 0, 18, 70, 15, 0, 4, 0, 0,
+  0, 50, 13, 20, 0, 0, 47, 47, 29, 12,
+  0, 0, 0, 10, 0, 0, 0, 0, 50, 0,
+  0, 44, 0, 64, 0, 0, 54, 0, 0, 47,
+  0, 99, 16, 46, 0, 15, 0, 37, 0, 0,
+  63, 0, 74, 0, 64, 0, 0, 62, 0, 0,
+  90, 0, 0, 12, 30, 23, 61, 0, 70, 60,
+  0, 76, 0, 1, 0, 0, 21, 0, 0, 0,
+  0, 0, 8, 0, 5, 0, 0, 121, 9, 0,
+  0, 0, 0, 0, 20, 54, 116, 17, 0, 0,
+  0, 0, 11, 9, 0, 21, 0, 19, 0, 73,
+  0, 0, 0, 0, 56, 0, 53, 0, 0, 0,
+  21, 0, 18, 0, 0, 48, 16, 0, 0, 0,
+  50, 44, 75, 3, 3, 42, 110, 0, 16, 61,
+  79, 13, 2, 0, 31, 54, 4, 6, 49, 0,
+  0, 45, 0, 0, 0, 0, 83, 0, 2, 0,
+  0, 62, 0, 80, 0, 35, 4, 49, 18, 97,
+  6, 35, 0, 42, 0, 40, 48, 0, 23, 0,
+  3, 0, 0, 0, 0, 5, 0, 59, 0, 17,
+  20, 0, 40, 0, 0, 0, 0, 48, 8, 0,
+  29, 54, 0, 0, 33, 0, 42, 5, 0, 9,
+  4, 0, 0, 8, 0, 4, 0, 44, 0, 13,
+  5, 8, 15, 84, 41, 0, 0, 0, 34, 0,
+  24, 13, 4, 22, 0, 21, 0, 22, 0, 0,
+  0, 0, 35, 0, 31, 0, 111, 0, 71, 0,
+  32, 0, 3, 37, 0, 0, 14, 0, 32, 0,
+  0, 0, 3, 23, 56, 0, 0, 4, 62, 15,
+  4, 0, 0, 72, 0, 17, 107, 0, 0, 48,
+  0, 0, 0, 48, 90, 0, 0, 0, 0, 51,
+  43, 7, 0, 46, 21, 29, 25, 100, 41, 0,
+  0, 5, 0, 0, 5, 0, 27, 0, 7, 0,
+  20, 2, 58, 63, 0, 50, 0, 0, 97, 52,
+  73, 0, 0, 0, 9, 20, 30, 0, 53, 59,
+  0, 0, 0, 0, 39, 57, 10, 31, 0, 0,
+  0, 14, 0, 0, 0, 54, 0, 21, 0, 18,
+  0, 113, 24, 11, 22, 20, 39, 43, 10, 0,
+  43, 0, 0, 50, 0, 0, 0, 0, 10, 1,
+  48, 0, 7, 0, 27, 0, 30, 0, 30, 47,
+  0, 0, 0, 25, 0, 135, 0, 7, 42, 0,
+  0, 4, 0, 6, 0, 0, 0, 25, 13, 0,
+  41, 106, 15, 0, 0, 0, 0, 1, 0, 0,
+  0, 1, 9, 0, 0, 82, 0, 40, 0, 0,
+  45, 0, 0, 46, 0, 80, 0, 4, 0, 0,
+  0, 52, 0, 0, 133, 36, 44, 0, 57, 0,
+  0, 92, 42, 0, 155, 0, 0, 30, 0, 77,
+  196, 0, 59, 34, 0, 31, 0, 16, 9, 0,
+  0, 0, 35, 0, 0, 0, 1, 0, 11, 0,
+  0, 92, 0, 0, 27, 0, 0, 0, 7, 76,
+  78, 108, 0, 0, 0, 0, 0, 30, 0, 0,
+  0, 38, 0, 95, 0, 0, 0, 0, 52, 0,
+  0, 0, 0, 0, 21, 0, 0, 6, 0, 28,
+  0, 8, 0, 24, 24, 29, 104, 12, 0, 37,
+  106, 0, 0, 105, 62, 22, 0, 0, 41, 62,
+  0, 12, 2, 0, 0, 43, 0, 0, 0, 0,
+  76, 0, 33, 0, 0, 91, 0, 53, 32, 0,
+  4, 39, 5, 115, 2, 34, 0, 36, 0, 56,
+  16, 0, 56, 0, 6, 0, 36, 0, 0, 14,
+  0, 21, 0, 0, 0, 0, 27, 0, 37, 0,
+  47, 52, 0, 14, 8, 31, 0, 0, 8, 0,
+  29, 0, 0, 10, 11, 0, 20, 0, 0, 68,
+  0, 34, 0, 0, 0, 0, 26, 84, 90, 0,
+  0, 0, 22, 0, 15, 31, 0, 34, 0, 30,
+  0, 52, 0, 0, 0, 0, 60, 0, 39, 0,
+  79, 0, 69, 0, 34, 16, 0, 39, 58, 0,
+  0, 0, 35, 20, 76, 0, 11, 39, 97, 0,
+  0, 94, 63, 17, 0, 0, 0, 47, 11, 21,
+  63, 0, 0, 58, 0, 0, 0, 24, 97, 0,
+  27, 0, 0, 89, 26, 22, 38, 4, 46, 33,
+  23, 117, 42, 0, 0, 22, 0, 0, 14, 0,
+  32, 0, 5, 0, 47, 0, 0, 49, 0, 19,
+  0, 0, 17, 1, 30, 0, 0, 0, 56, 43,
+  10, 31, 22, 65, 0, 0, 6, 0, 19, 88,
+  0, 42, 0, 0, 0, 23, 0, 11, 0, 31,
+  0, 0, 0, 0, 0, 85, 98, 0, 0, 0,
+  13, 0, 31, 29, 0, 24, 0, 19, 0, 5,
+  0, 0, 0, 12, 70, 0, 0, 0, 32, 0,
+  63, 0, 24, 34, 58, 21, 0, 68, 2, 105,
+  0, 4, 38, 0, 0, 0, 40, 0, 0, 0,
+  2, 21, 35, 0, 0, 90, 13, 0, 0, 0,
+  31, 0, 9, 0, 0, 31, 3, 0, 67, 72,
+  9, 0, 27, 0, 20, 14, 0, 28, 22, 53,
+  41, 0, 0, 0, 0, 61, 0, 0, 135, 38,
+  37, 0, 7, 0, 0, 47, 34, 0, 96, 0,
+  0, 31, 0, 47, 198, 6, 55, 0, 0, 0,
+  0, 35, 0, 0, 0, 0, 77, 27, 31, 0,
+  1, 1, 38, 0, 0, 15, 0, 0, 17, 0,
+  39, 0, 26, 71, 33, 77, 0, 0, 0, 0,
+  6, 46, 5, 0, 19, 40, 0, 88, 0, 0,
+  0, 0, 55, 0, 0, 0, 0, 0, 28, 0,
+  0, 16, 0, 0, 0, 15, 0, 83, 0, 21,
+  90, 39, 0, 48, 26, 0, 0, 60, 13, 28,
+  16, 0, 25, 81, 1, 0, 0, 0, 1, 44,
+  17, 19, 0, 35, 60, 0, 78, 36, 79, 138,
+  7, 0, 76, 0, 2, 0, 0, 129, 0, 4,
+  0, 11, 0, 4, 0, 0, 138, 0, 2, 0,
+  27, 0, 0, 90, 14, 2, 90, 0, 0, 39,
+  0, 61, 111, 0, 118, 35, 0, 31, 35, 22,
+  25, 0, 0, 0, 0, 27, 0, 0, 12, 25,
+  0, 0, 0, 91, 0, 7, 15, 0, 6, 0,
+  0, 89, 131, 18, 0, 0, 39, 0, 0, 48,
+  0, 0, 1, 67, 0, 57, 0, 0, 0, 0,
+  75, 0, 0, 0, 0, 0, 0, 0, 75, 51,
+  0, 0, 95, 9, 0, 0, 0, 24, 67, 28,
+  0, 54, 35, 44, 0, 52, 0, 15, 0, 0,
+  0, 58, 28, 9, 0, 0, 21, 48, 6, 84,
+  0, 37, 76, 0, 22, 0, 105, 123, 0, 0,
+  100, 0, 38, 0, 0, 109, 0, 0, 0, 11,
+  0, 0, 0, 0, 96, 0, 19, 0, 47, 0,
+  0, 83, 53, 15, 66, 0, 7, 34, 0, 90,
+  0, 0, 122, 30, 0, 21, 7, 0, 14, 0,
+  0, 2, 0, 89, 0, 17, 21, 0, 35, 0,
+  0, 36, 0, 3, 0, 0, 0, 0, 0, 59,
+  137, 0, 0, 0, 0, 0, 0, 52, 0, 3,
+  30, 17, 0, 0, 80, 0, 22, 0, 52, 0,
+  0, 0, 0, 0, 0, 14, 61, 73, 0, 48,
+  16, 0, 0, 0, 50, 44, 75, 3, 3, 42,
+  110, 0, 16, 61, 79, 13, 2, 0, 31, 54,
+  4, 6, 49, 0, 0, 45, 0, 0, 0, 0,
+  83, 0, 2, 0, 0, 62, 0, 80, 0, 35,
+  4, 49, 18, 97, 6, 35, 0, 42, 0, 40,
+  48, 0, 23, 0, 3, 0, 0, 0, 0, 5,
+  0, 59, 0, 17, 20, 0, 40, 0, 0, 0,
+  0, 48, 8, 0, 29, 54, 0, 0, 33, 0,
+  42, 5, 0, 9, 4, 0, 0, 8, 0, 4,
+  0, 44, 0, 13, 5, 8, 15, 84, 41, 0,
+  0, 0, 34, 0, 24, 13, 4, 22, 0, 21,
+  0, 22, 0, 0, 0, 0, 35, 0, 31, 0,
+  111, 0, 71, 0, 32, 0, 3, 37, 0, 0,
+  14, 0, 32, 0, 0, 0, 3, 23, 56, 0,
+  0, 4, 62, 15, 4, 0, 0, 72, 0, 17,
+  107, 0, 0, 48, 0, 0, 0, 48, 90, 0,
+  0, 0, 0, 51, 43, 7, 0, 46, 21, 29,
+  25, 100, 41, 0, 0, 5, 0, 0, 5, 0,
+  27, 0, 7, 0, 20, 2, 58, 63, 0, 50,
+  0, 0, 97, 52, 73, 0, 0, 0, 9, 20,
+  30, 0, 53, 59, 0, 0, 0, 0, 39, 57,
+  10, 31, 0, 0, 0, 14, 0, 0, 0, 54,
+  0, 21, 0, 18, 0, 113, 24, 11, 22, 20,
+  39, 43, 10, 0, 43, 0, 0, 50, 0, 0,
+  0, 0, 10, 1, 48, 0, 7, 0, 27, 0,
+  30, 0, 30, 47, 0, 22, 0, 0, 13, 12,
+  20, 0, 30, 0, 12, 20, 47, 4, 0, 16,
+  61, 0, 3, 0, 0, 56, 0, 10, 36, 0,
+  0, 41, 0, 0, 2, 0, 51, 24, 0, 0,
+  0, 75, 57, 0, 0, 1, 0, 46, 0, 115,
+  40, 68, 0, 0, 0, 16, 0, 0, 30, 32,
+  30, 0, 49, 0, 37, 54, 0, 31, 7, 0,
+  25, 63, 98, 0, 89, 0, 26, 32, 28, 22,
+  29, 0, 0, 0, 0, 0, 23, 34, 22, 43,
+  0, 13, 0, 0, 0, 67, 0, 29, 0, 0,
+  0, 0, 28, 122, 64, 34, 0, 28, 14, 55,
+  5, 5, 0, 0, 0, 59, 0, 9, 0, 5,
+  0, 38, 80, 0, 0, 0, 7, 0, 12, 0,
+  22, 22, 0, 28, 0, 8, 0, 24, 24, 29,
+  104, 12, 0, 37, 106, 0, 0, 105, 62, 22,
+  0, 0, 41, 62, 0, 12, 2, 0, 0, 43,
+  0, 0, 0, 0, 76, 0, 33, 0, 0, 91,
+  0, 53, 32, 0, 4, 39, 5, 115, 2, 34,
+  0, 36, 0, 56, 16, 0, 56, 0, 6, 0,
+  36, 0, 0, 14, 0, 21, 0, 0, 0, 0,
+  27, 0, 37, 0, 47, 52, 0, 14, 8, 31,
+  0, 0, 8, 0, 29, 0, 0, 10, 11, 0,
+  20, 0, 0, 68, 0, 34, 0, 0, 0, 0,
+  26, 84, 90, 0, 0, 0, 22, 0, 15, 31,
+  0, 34, 0, 30, 0, 52, 0, 0, 0, 0,
+  60, 0, 39, 0, 79, 0, 69, 0, 34, 16,
+  0, 39, 58, 0, 0, 0, 35, 20, 76, 0,
+  11, 39, 97, 0, 0, 94, 63, 17, 0, 0,
+  0, 47, 11, 21, 63, 0, 0, 58, 0, 0,
+  0, 24, 97, 0, 27, 0, 0, 89, 26, 22,
+  38, 4, 46, 33, 23, 117, 42, 0, 0, 22,
+  0, 0, 14, 0, 32, 0, 5, 0, 47, 0,
+  0, 49, 0, 19, 0, 0, 17, 1, 30, 0,
+  0, 0, 56, 43, 10, 31, 22, 65, 0, 0,
+  6, 0, 19, 88, 0, 42, 0, 0, 0, 23,
+  0, 11, 0, 31, 0, 0, 0, 0, 0, 85,
+  98, 0, 0, 0, 13, 0, 31, 29, 0, 24,
+  0, 19, 0, 5, 0, 0, 0, 12, 70, 0,
+  0, 0, 32, 0, 63, 0, 24, 34, 0, 10,
+  0, 0, 0, 0, 0, 1, 32, 2, 16, 56,
+  0, 30, 0, 9, 3, 0, 2, 0, 1, 27,
+  71, 20, 5, 0, 0, 23, 0, 18, 0, 0,
+  30, 0, 15, 0, 59, 84, 34, 0, 85, 0,
+  0, 5, 0, 98, 39, 10, 0, 0, 0, 0,
+  0, 0, 57, 0, 55, 0, 96, 0, 0, 81,
+  9, 12, 28, 9, 50, 46, 29, 21, 0, 0,
+  85, 58, 7, 94, 37, 18, 0, 0, 0, 22,
+  0, 74, 0, 50, 11, 36, 0, 0, 0, 84,
+  19, 16, 0, 0, 0, 0, 17, 49, 89, 0,
+  0, 0, 0, 27, 5, 0, 0, 3, 0, 9,
+  0, 9, 21, 75, 0, 33, 64, 0, 0, 0,
+  0, 0, 0, 0, 0, 41, 0, 0, 0, 15,
+  0, 83, 0, 21, 90, 39, 0, 48, 26, 0,
+  0, 60, 13, 28, 16, 0, 25, 81, 1, 0,
+  0, 0, 1, 44, 17, 19, 0, 35, 60, 0,
+  78, 36, 79, 138, 7, 0, 76, 0, 2, 0,
+  0, 129, 0, 4, 0, 11, 0, 4, 0, 0,
+  138, 0, 2, 0, 27, 0, 0, 90, 14, 2,
+  90, 0, 0, 39, 0, 61, 111, 0, 118, 35,
+  0, 31, 35, 22, 25, 0, 0, 0, 0, 27,
+  0, 0, 12, 25, 0, 0, 0, 91, 0, 7,
+  15, 0, 6, 0, 0, 89, 131, 18, 0, 0,
+  39, 0, 0, 48, 0, 0, 1, 67, 0, 57,
+  0, 0, 0, 0, 75, 0, 0, 0, 0, 0,
+  0, 0, 75, 51, 0, 0, 95, 9, 0, 0,
+  0, 24, 67, 28, 0, 54, 35, 44, 0, 52,
+  0, 15, 0, 0, 0, 58, 28, 9, 0, 0,
+  21, 48, 6, 84, 0, 37, 76, 0, 22, 0,
+  105, 123, 0, 0, 100, 0, 38, 0, 0, 109,
+  0, 0, 0, 11, 0, 0, 0, 0, 96, 0,
+  19, 0, 47, 0, 0, 83, 53, 15, 66, 0,
+  7, 34, 0, 90, 0, 0, 122, 30, 0, 21,
+  7, 0, 14, 0, 0, 2, 0, 89, 0, 17,
+  21, 0, 35, 0, 0, 36, 0, 3, 0, 0,
+  0, 0, 0, 59, 137, 0, 0, 0, 0, 0,
+  0, 52, 0, 3, 30, 17, 0, 0, 80, 0,
+  22, 0, 52, 0, 0, 0, 0, 0, 0, 14,
+  61, 73, 19, 3, 82, 25, 7, 0, 0, 19,
+  0, 0, 0, 50, 24, 124, 0, 0, 0, 0,
+  0, 0, 16, 66, 70, 4, 0, 0, 12, 4,
+  0, 88, 7, 3, 0, 13, 0, 0, 74, 8,
+  0, 0, 84, 0, 0, 15, 17, 36, 17, 22,
+  4, 0, 9, 49, 0, 0, 86, 0, 46, 0,
+  71, 0, 0, 47, 100, 0, 96, 0, 0, 47,
+  0, 116, 0, 23, 90, 0, 0, 33, 0, 0,
+  23, 0, 0, 55, 0, 76, 0, 1, 45, 31,
+  68, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  0, 29, 67, 0, 0, 0, 0, 4, 0, 42,
+  0, 0, 54, 0, 0, 0, 124, 74, 44, 0,
+  25, 0, 0, 0, 0, 25, 0, 22, 0, 56,
+  3, 37, 0, 0, 14, 0, 32, 0, 0, 0,
+  3, 23, 56, 0, 0, 4, 62, 15, 4, 0,
+  0, 72, 0, 17, 107, 0, 0, 48, 0, 0,
+  0, 48, 90, 0, 0, 0, 0, 51, 43, 7,
+  0, 46, 21, 29, 25, 100, 41, 0, 0, 5,
+  0, 0, 5, 0, 27, 0, 7, 0, 20, 2,
+  58, 63, 0, 50, 0, 0, 97, 52, 73, 0,
+  0, 0, 9, 20, 30, 0, 53, 59, 0, 0,
+  0, 0, 39, 57, 10, 31, 0, 0, 0, 14,
+  0, 0, 0, 54, 0, 21, 0, 18, 0, 113,
+  24, 11, 22, 20, 39, 43, 10, 0, 43, 0,
+  0, 50, 0, 0, 0, 0, 10, 1, 48, 0,
+  7, 0, 27, 0, 30, 0, 30, 47, 0, 22,
+  0, 0, 13, 12, 20, 0, 30, 0, 12, 20,
+  47, 4, 0, 16, 61, 0, 3, 0, 0, 56,
+  0, 10, 36, 0, 0, 41, 0, 0, 2, 0,
+  51, 24, 0, 0, 0, 75, 57, 0, 0, 1,
+  0, 46, 0, 115, 40, 68, 0, 0, 0, 16,
+  0, 0, 30, 32, 30, 0, 49, 0, 37, 54,
+  0, 31, 7, 0, 25, 63, 98, 0, 89, 0,
+  26, 32, 28, 22, 29, 0, 0, 0, 0, 0,
+  23, 34, 22, 43, 0, 13, 0, 0, 0, 67,
+  0, 29, 0, 0, 0, 0, 28, 122, 64, 34,
+  0, 28, 14, 55, 5, 5, 0, 0, 0, 59,
+  0, 9, 0, 5, 0, 38, 80, 0, 0, 0,
+  7, 0, 12, 0, 22, 22, 0, 49, 0, 0,
+  0, 0, 12, 0, 80, 43, 25, 0, 73, 2,
+  0, 149, 100, 43, 17, 0, 0, 0, 0, 25,
+  0, 0, 21, 90, 9, 0, 9, 0, 115, 13,
+  0, 0, 4, 73, 0, 0, 23, 0, 0, 26,
+  0, 80, 0, 54, 0, 37, 0, 15, 61, 0,
+  0, 23, 13, 7, 0, 32, 0, 0, 0, 0,
+  0, 0, 27, 12, 61, 0, 7, 0, 0, 98,
+  0, 66, 0, 13, 0, 0, 19, 3, 24, 48,
+  0, 47, 3, 23, 13, 19, 53, 124, 0, 32,
+  23, 0, 0, 0, 0, 90, 142, 0, 0, 0,
+  8, 0, 0, 33, 0, 34, 0, 47, 0, 22,
+  0, 0, 0, 0, 6, 0, 0, 0, 122, 0,
+  29, 0, 52, 16, 0, 39, 58, 0, 0, 0,
+  35, 20, 76, 0, 11, 39, 97, 0, 0, 94,
+  63, 17, 0, 0, 0, 47, 11, 21, 63, 0,
+  0, 58, 0, 0, 0, 24, 97, 0, 27, 0,
+  0, 89, 26, 22, 38, 4, 46, 33, 23, 117,
+  42, 0, 0, 22, 0, 0, 14, 0, 32, 0,
+  5, 0, 47, 0, 0, 49, 0, 19, 0, 0,
+  17, 1, 30, 0, 0, 0, 56, 43, 10, 31,
+  22, 65, 0, 0, 6, 0, 19, 88, 0, 42,
+  0, 0, 0, 23, 0, 11, 0, 31, 0, 0,
+  0, 0, 0, 85, 98, 0, 0, 0, 13, 0,
+  31, 29, 0, 24, 0, 19, 0, 5, 0, 0,
+  0, 12, 70, 0, 0, 0, 32, 0, 63, 0,
+  24, 34, 0, 10, 0, 0, 0, 0, 0, 1,
+  32, 2, 16, 56, 0, 30, 0, 9, 3, 0,
+  2, 0, 1, 27, 71, 20, 5, 0, 0, 23,
+  0, 18, 0, 0, 30, 0, 15, 0, 59, 84,
+  34, 0, 85, 0, 0, 5, 0, 98, 39, 10,
+  0, 0, 0, 0, 0, 0, 57, 0, 55, 0,
+  96, 0, 0, 81, 9, 12, 28, 9, 50, 46,
+  29, 21, 0, 0, 85, 58, 7, 94, 37, 18,
+  0, 0, 0, 22, 0, 74, 0, 50, 11, 36,
+  0, 0, 0, 84, 19, 16, 0, 0, 0, 0,
+  17, 49, 89, 0, 0, 0, 0, 27, 5, 0,
+  0, 3, 0, 9, 0, 9, 21, 75, 0, 33,
+  64, 0, 0, 0, 0, 0, 0, 0, 0, 41,
+  4, 18, 11, 6, 0, 0, 0, 0, 60, 44,
+  0, 0, 0, 54, 0, 0, 0, 29, 17, 0,
+  3, 11, 34, 17, 0, 0, 58, 48, 0, 0,
+  0, 0, 53, 0, 0, 0, 74, 109, 0, 0,
+  46, 0, 0, 0, 0, 59, 0, 51, 0, 23,
+  0, 0, 0, 0, 78, 7, 34, 8, 0, 0,
+  0, 52, 29, 14, 74, 2, 53, 17, 8, 144,
+  9, 0, 46, 89, 0, 57, 27, 0, 12, 0,
+  0, 0, 31, 87, 0, 30, 0, 43, 20, 0,
+  0, 171, 0, 0, 22, 0, 7, 0, 0, 57,
+  123, 33, 0, 0, 0, 0, 0, 2, 0, 0,
+  0, 24, 0, 10, 20, 24, 0, 0, 14, 0,
+  0, 0, 0, 0, 0, 4, 58, 62, 0, 0,
+  95, 9, 0, 0, 0, 24, 67, 28, 0, 54,
+  35, 44, 0, 52, 0, 15, 0, 0, 0, 58,
+  28, 9, 0, 0, 21, 48, 6, 84, 0, 37,
+  76, 0, 22, 0, 105, 123, 0, 0, 100, 0,
+  38, 0, 0, 109, 0, 0, 0, 11, 0, 0,
+  0, 0, 96, 0, 19, 0, 47, 0, 0, 83,
+  53, 15, 66, 0, 7, 34, 0, 90, 0, 0,
+  122, 30, 0, 21, 7, 0, 14, 0, 0, 2,
+  0, 89, 0, 17, 21, 0, 35, 0, 0, 36,
+  0, 3, 0, 0, 0, 0, 0, 59, 137, 0,
+  0, 0, 0, 0, 0, 52, 0, 3, 30, 17,
+  0, 0, 80, 0, 22, 0, 52, 0, 0, 0,
+  0, 0, 0, 14, 61, 73, 19, 3, 82, 25,
+  7, 0, 0, 19, 0, 0, 0, 50, 24, 124,
+  0, 0, 0, 0, 0, 0, 16, 66, 70, 4,
+  0, 0, 12, 4, 0, 88, 7, 3, 0, 13,
+  0, 0, 74, 8, 0, 0, 84, 0, 0, 15,
+  17, 36, 17, 22, 4, 0, 9, 49, 0, 0,
+  86, 0, 46, 0, 71, 0, 0, 47, 100, 0,
+  96, 0, 0, 47, 0, 116, 0, 23, 90, 0,
+  0, 33, 0, 0, 23, 0, 0, 55, 0, 76,
+  0, 1, 45, 31, 68, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 0, 29, 67, 0, 0, 0,
+  0, 4, 0, 42, 0, 0, 54, 0, 0, 0,
+  124, 74, 44, 0, 25, 0, 0, 0, 0, 25,
+  0, 22, 0, 56, 83, 83, 12, 72, 44, 15,
+  0, 0, 20, 0, 22, 0, 23, 126, 0, 0,
+  0, 0, 39, 0, 24, 37, 34, 21, 0, 0,
+  35, 11, 0, 34, 52, 81, 0, 0, 0, 0,
+  0, 26, 0, 0, 0, 1, 0, 0, 1, 18,
+  42, 71, 0, 0, 11, 40, 0, 7, 106, 0,
+  38, 4, 10, 0, 0, 34, 61, 26, 20, 0,
+  27, 21, 0, 98, 0, 49, 51, 0, 0, 28,
+  54, 0, 44, 0, 0, 48, 15, 60, 0, 1,
+  2, 45, 68, 0, 14, 0, 0, 25, 0, 0,
+  81, 0, 11, 15, 12, 121, 4, 0, 0, 16,
+  0, 68, 74, 0, 26, 0, 17, 1, 24, 87,
+  0, 0, 20, 2, 10, 0, 0, 0, 0, 22,
+  0, 87, 0, 22, 0, 0, 13, 12, 20, 0,
+  30, 0, 12, 20, 47, 4, 0, 16, 61, 0,
+  3, 0, 0, 56, 0, 10, 36, 0, 0, 41,
+  0, 0, 2, 0, 51, 24, 0, 0, 0, 75,
+  57, 0, 0, 1, 0, 46, 0, 115, 40, 68,
+  0, 0, 0, 16, 0, 0, 30, 32, 30, 0,
+  49, 0, 37, 54, 0, 31, 7, 0, 25, 63,
+  98, 0, 89, 0, 26, 32, 28, 22, 29, 0,
+  0, 0, 0, 0, 23, 34, 22, 43, 0, 13,
+  0, 0, 0, 67, 0, 29, 0, 0, 0, 0,
+  28, 122, 64, 34, 0, 28, 14, 55, 5, 5,
+  0, 0, 0, 59, 0, 9, 0, 5, 0, 38,
+  80, 0, 0, 0, 7, 0, 12, 0, 22, 22,
+  0, 49, 0, 0, 0, 0, 12, 0, 80, 43,
+  25, 0, 73, 2, 0, 149, 100, 43, 17, 0,
+  0, 0, 0, 25, 0, 0, 21, 90, 9, 0,
+  9, 0, 115, 13, 0, 0, 4, 73, 0, 0,
+  23, 0, 0, 26, 0, 80, 0, 54, 0, 37,
+  0, 15, 61, 0, 0, 23, 13, 7, 0, 32,
+  0, 0, 0, 0, 0, 0, 27, 12, 61, 0,
+  7, 0, 0, 98, 0, 66, 0, 13, 0, 0,
+  19, 3, 24, 48, 0, 47, 3, 23, 13, 19,
+  53, 124, 0, 32, 23, 0, 0, 0, 0, 90,
+  142, 0, 0, 0, 8, 0, 0, 33, 0, 34,
+  0, 47, 0, 22, 0, 0, 0, 0, 6, 0,
+  0, 0, 122, 0, 29, 0, 52, 16, 0, 27,
+  108, 0, 0, 0, 0, 0, 90, 42, 15, 0,
+  26, 53, 0, 84, 60, 35, 50, 0, 0, 15,
+  20, 31, 0, 0, 3, 111, 0, 0, 0, 0,
+  61, 0, 0, 0, 0, 79, 0, 0, 3, 0,
+  0, 0, 0, 28, 0, 0, 0, 35, 0, 82,
+  11, 0, 69, 0, 27, 18, 0, 0, 0, 0,
+  0, 0, 27, 0, 48, 0, 11, 70, 0, 0,
+  22, 90, 0, 69, 0, 68, 0, 0, 7, 0,
+  32, 92, 0, 47, 0, 58, 48, 0, 85, 34,
+  0, 0, 11, 0, 0, 0, 0, 133, 125, 0,
+  0, 0, 8, 0, 0, 61, 0, 16, 7, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  45, 0, 54, 0, 21, 46, 0, 10, 0, 0,
+  0, 0, 0, 1, 32, 2, 16, 56, 0, 30,
+  0, 9, 3, 0, 2, 0, 1, 27, 71, 20,
+  5, 0, 0, 23, 0, 18, 0, 0, 30, 0,
+  15, 0, 59, 84, 34, 0, 85, 0, 0, 5,
+  0, 98, 39, 10, 0, 0, 0, 0, 0, 0,
+  57, 0, 55, 0, 96, 0, 0, 81, 9, 12,
+  28, 9, 50, 46, 29, 21, 0, 0, 85, 58,
+  7, 94, 37, 18, 0, 0, 0, 22, 0, 74,
+  0, 50, 11, 36, 0, 0, 0, 84, 19, 16,
+  0, 0, 0, 0, 17, 49, 89, 0, 0, 0,
+  0, 27, 5, 0, 0, 3, 0, 9, 0, 9,
+  21, 75, 0, 33, 64, 0, 0, 0, 0, 0,
+  0, 0, 0, 41, 4, 18, 11, 6, 0, 0,
+  0, 0, 60, 44, 0, 0, 0, 54, 0, 0,
+  0, 29, 17, 0, 3, 11, 34, 17, 0, 0,
+  58, 48, 0, 0, 0, 0, 53, 0, 0, 0,
+  74, 109, 0, 0, 46, 0, 0, 0, 0, 59,
+  0, 51, 0, 23, 0, 0, 0, 0, 78, 7,
+  34, 8, 0, 0, 0, 52, 29, 14, 74, 2,
+  53, 17, 8, 144, 9, 0, 46, 89, 0, 57,
+  27, 0, 12, 0, 0, 0, 31, 87, 0, 30,
+  0, 43, 20, 0, 0, 171, 0, 0, 22, 0,
+  7, 0, 0, 57, 123, 33, 0, 0, 0, 0,
+  0, 2, 0, 0, 0, 24, 0, 10, 20, 24,
+  0, 0, 14, 0, 0, 0, 0, 0, 0, 4,
+  58, 62, 28, 0, 51, 0, 0, 127, 0, 0,
+  28, 13, 0, 0, 0, 82, 0, 0, 9, 29,
+  31, 0, 0, 85, 28, 32, 0, 0, 13, 55,
+  0, 0, 0, 43, 0, 0, 0, 17, 44, 93,
+  0, 0, 24, 0, 15, 0, 0, 32, 0, 29,
+  0, 35, 0, 77, 0, 0, 138, 0, 12, 0,
+  0, 0, 0, 64, 0, 0, 81, 0, 9, 6,
+  12, 125, 8, 0, 33, 55, 0, 39, 22, 0,
+  0, 0, 0, 0, 28, 82, 0, 10, 0, 46,
+  0, 0, 0, 123, 0, 0, 55, 0, 11, 0,
+  0, 88, 63, 49, 0, 0, 27, 0, 0, 10,
+  0, 6, 1, 11, 0, 0, 9, 35, 24, 0,
+  11, 0, 0, 0, 0, 0, 0, 3, 9, 79,
+  19, 3, 82, 25, 7, 0, 0, 19, 0, 0,
+  0, 50, 24, 124, 0, 0, 0, 0, 0, 0,
+  16, 66, 70, 4, 0, 0, 12, 4, 0, 88,
+  7, 3, 0, 13, 0, 0, 74, 8, 0, 0,
+  84, 0, 0, 15, 17, 36, 17, 22, 4, 0,
+  9, 49, 0, 0, 86, 0, 46, 0, 71, 0,
+  0, 47, 100, 0, 96, 0, 0, 47, 0, 116,
+  0, 23, 90, 0, 0, 33, 0, 0, 23, 0,
+  0, 55, 0, 76, 0, 1, 45, 31, 68, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 0, 29,
+  67, 0, 0, 0, 0, 4, 0, 42, 0, 0,
+  54, 0, 0, 0, 124, 74, 44, 0, 25, 0,
+  0, 0, 0, 25, 0, 22, 0, 56, 83, 83,
+  12, 72, 44, 15, 0, 0, 20, 0, 22, 0,
+  23, 126, 0, 0, 0, 0, 39, 0, 24, 37,
+  34, 21, 0, 0, 35, 11, 0, 34, 52, 81,
+  0, 0, 0, 0, 0, 26, 0, 0, 0, 1,
+  0, 0, 1, 18, 42, 71, 0, 0, 11, 40,
+  0, 7, 106, 0, 38, 4, 10, 0, 0, 34,
+  61, 26, 20, 0, 27, 21, 0, 98, 0, 49,
+  51, 0, 0, 28, 54, 0, 44, 0, 0, 48,
+  15, 60, 0, 1, 2, 45, 68, 0, 14, 0,
+  0, 25, 0, 0, 81, 0, 11, 15, 12, 121,
+  4, 0, 0, 16, 0, 68, 74, 0, 26, 0,
+  17, 1, 24, 87, 0, 0, 20, 2, 10, 0,
+  0, 0, 0, 22, 0, 87, 35, 0, 20, 65,
+  14, 232, 0, 0, 1, 0, 0, 0, 0, 21,
+  0, 0, 0, 33, 62, 0, 0, 113, 15, 0,
+  0, 0, 0, 6, 0, 17, 8, 99, 0, 0,
+  0, 33, 0, 40, 0, 0, 0, 0, 0, 0,
+  0, 58, 44, 47, 7, 4, 0, 38, 0, 0,
+  142, 0, 48, 0, 21, 0, 27, 92, 17, 0,
+  115, 0, 0, 40, 0, 96, 83, 63, 62, 0,
+  0, 35, 43, 0, 0, 0, 0, 0, 46, 65,
+  0, 0, 0, 31, 0, 0, 7, 7, 0, 0,
+  70, 0, 52, 0, 0, 9, 17, 116, 2, 0,
+  0, 5, 18, 17, 0, 0, 0, 39, 0, 0,
+  0, 45, 36, 0, 13, 16, 0, 19, 0, 0,
+  0, 15, 0, 44, 0, 49, 0, 0, 0, 0,
+  12, 0, 80, 43, 25, 0, 73, 2, 0, 149,
+  100, 43, 17, 0, 0, 0, 0, 25, 0, 0,
+  21, 90, 9, 0, 9, 0, 115, 13, 0, 0,
+  4, 73, 0, 0, 23, 0, 0, 26, 0, 80,
+  0, 54, 0, 37, 0, 15, 61, 0, 0, 23,
+  13, 7, 0, 32, 0, 0, 0, 0, 0, 0,
+  27, 12, 61, 0, 7, 0, 0, 98, 0, 66,
+  0, 13, 0, 0, 19, 3, 24, 48, 0, 47,
+  3, 23, 13, 19, 53, 124, 0, 32, 23, 0,
+  0, 0, 0, 90, 142, 0, 0, 0, 8, 0,
+  0, 33, 0, 34, 0, 47, 0, 22, 0, 0,
+  0, 0, 6, 0, 0, 0, 122, 0, 29, 0,
+  52, 16, 0, 27, 108, 0, 0, 0, 0, 0,
+  90, 42, 15, 0, 26, 53, 0, 84, 60, 35,
+  50, 0, 0, 15, 20, 31, 0, 0, 3, 111,
+  0, 0, 0, 0, 61, 0, 0, 0, 0, 79,
+  0, 0, 3, 0, 0, 0, 0, 28, 0, 0,
+  0, 35, 0, 82, 11, 0, 69, 0, 27, 18,
+  0, 0, 0, 0, 0, 0, 27, 0, 48, 0,
+  11, 70, 0, 0, 22, 90, 0, 69, 0, 68,
+  0, 0, 7, 0, 32, 92, 0, 47, 0, 58,
+  48, 0, 85, 34, 0, 0, 11, 0, 0, 0,
+  0, 133, 125, 0, 0, 0, 8, 0, 0, 61,
+  0, 16, 7, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 45, 0, 54, 0, 21, 46,
+  0, 0, 117, 0, 0, 75, 0, 0, 21, 0,
+  0, 1, 34, 80, 0, 0, 0, 31, 19, 0,
+  0, 94, 14, 24, 0, 0, 0, 29, 0, 0,
+  10, 39, 0, 0, 0, 0, 0, 56, 0, 0,
+  0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+  0, 155, 0, 0, 71, 0, 21, 0, 50, 0,
+  0, 5, 0, 0, 108, 0, 0, 0, 0, 98,
+  0, 0, 39, 7, 0, 0, 0, 22, 15, 0,
+  0, 0, 31, 74, 16, 3, 15, 30, 48, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 72,
+  30, 0, 0, 0, 0, 78, 0, 23, 0, 11,
+  40, 0, 0, 0, 17, 16, 68, 25, 10, 51,
+  0, 3, 0, 0, 33, 0, 0, 53, 4, 18,
+  11, 6, 0, 0, 0, 0, 60, 44, 0, 0,
+  0, 54, 0, 0, 0, 29, 17, 0, 3, 11,
+  34, 17, 0, 0, 58, 48, 0, 0, 0, 0,
+  53, 0, 0, 0, 74, 109, 0, 0, 46, 0,
+  0, 0, 0, 59, 0, 51, 0, 23, 0, 0,
+  0, 0, 78, 7, 34, 8, 0, 0, 0, 52,
+  29, 14, 74, 2, 53, 17, 8, 144, 9, 0,
+  46, 89, 0, 57, 27, 0, 12, 0, 0, 0,
+  31, 87, 0, 30, 0, 43, 20, 0, 0, 171,
+  0, 0, 22, 0, 7, 0, 0, 57, 123, 33,
+  0, 0, 0, 0, 0, 2, 0, 0, 0, 24,
+  0, 10, 20, 24, 0, 0, 14, 0, 0, 0,
+  0, 0, 0, 4, 58, 62, 28, 0, 51, 0,
+  0, 127, 0, 0, 28, 13, 0, 0, 0, 82,
+  0, 0, 9, 29, 31, 0, 0, 85, 28, 32,
+  0, 0, 13, 55, 0, 0, 0, 43, 0, 0,
+  0, 17, 44, 93, 0, 0, 24, 0, 15, 0,
+  0, 32, 0, 29, 0, 35, 0, 77, 0, 0,
+  138, 0, 12, 0, 0, 0, 0, 64, 0, 0,
+  81, 0, 9, 6, 12, 125, 8, 0, 33, 55,
+  0, 39, 22, 0, 0, 0, 0, 0, 28, 82,
+  0, 10, 0, 46, 0, 0, 0, 123, 0, 0,
+  55, 0, 11, 0, 0, 88, 63, 49, 0, 0,
+  27, 0, 0, 10, 0, 6, 1, 11, 0, 0,
+  9, 35, 24, 0, 11, 0, 0, 0, 0, 0,
+  0, 3, 9, 79, 0, 0, 30, 0, 26, 161,
+  0, 0, 0, 0, 0, 0, 49, 60, 0, 0,
+  11, 55, 0, 0, 7, 16, 0, 50, 0, 0,
+  0, 0, 0, 35, 21, 0, 0, 13, 0, 0,
+  0, 55, 0, 3, 0, 20, 0, 22, 0, 12,
+  34, 22, 0, 0, 13, 103, 4, 0, 17, 0,
+  10, 0, 46, 0, 0, 0, 0, 0, 54, 0,
+  0, 2, 0, 4, 0, 34, 24, 5, 0, 40,
+  0, 0, 0, 10, 0, 0, 18, 36, 19, 0,
+  31, 36, 38, 0, 0, 22, 13, 0, 4, 0,
+  0, 0, 1, 46, 1, 0, 0, 0, 0, 10,
+  0, 22, 0, 25, 23, 0, 0, 0, 5, 29,
+  102, 47, 32, 3, 54, 0, 0, 0, 37, 15,
+  0, 14, 83, 83, 12, 72, 44, 15, 0, 0,
+  20, 0, 22, 0, 23, 126, 0, 0, 0, 0,
+  39, 0, 24, 37, 34, 21, 0, 0, 35, 11,
+  0, 34, 52, 81, 0, 0, 0, 0, 0, 26,
+  0, 0, 0, 1, 0, 0, 1, 18, 42, 71,
+  0, 0, 11, 40, 0, 7, 106, 0, 38, 4,
+  10, 0, 0, 34, 61, 26, 20, 0, 27, 21,
+  0, 98, 0, 49, 51, 0, 0, 28, 54, 0,
+  44, 0, 0, 48, 15, 60, 0, 1, 2, 45,
+  68, 0, 14, 0, 0, 25, 0, 0, 81, 0,
+  11, 15, 12, 121, 4, 0, 0, 16, 0, 68,
+  74, 0, 26, 0, 17, 1, 24, 87, 0, 0,
+  20, 2, 10, 0, 0, 0, 0, 22, 0, 87,
+  35, 0, 20, 65, 14, 232, 0, 0, 1, 0,
+  0, 0, 0, 21, 0, 0, 0, 33, 62, 0,
+  0, 113, 15, 0, 0, 0, 0, 6, 0, 17,
+  8, 99, 0, 0, 0, 33, 0, 40, 0, 0,
+  0, 0, 0, 0, 0, 58, 44, 47, 7, 4,
+  0, 38, 0, 0, 142, 0, 48, 0, 21, 0,
+  27, 92, 17, 0, 115, 0, 0, 40, 0, 96,
+  83, 63, 62, 0, 0, 35, 43, 0, 0, 0,
+  0, 0, 46, 65, 0, 0, 0, 31, 0, 0,
+  7, 7, 0, 0, 70, 0, 52, 0, 0, 9,
+  17, 116, 2, 0, 0, 5, 18, 17, 0, 0,
+  0, 39, 0, 0, 0, 45, 36, 0, 13, 16,
+  0, 19, 0, 0, 0, 15, 0, 44, 0, 0,
+  0, 5, 19, 184, 0, 0, 0, 0, 0, 0,
+  30, 14, 0, 24, 4, 50, 5, 0, 21, 0,
+  0, 62, 18, 19, 0, 0, 0, 10, 18, 0,
+  0, 34, 0, 4, 0, 24, 0, 24, 0, 55,
+  0, 16, 0, 17, 43, 43, 0, 20, 0, 38,
+  14, 0, 0, 0, 9, 0, 19, 12, 5, 26,
+  0, 0, 6, 0, 0, 22, 22, 0, 30, 56,
+  37, 1, 2, 80, 0, 0, 0, 42, 0, 0,
+  13, 12, 24, 0, 22, 14, 2, 28, 1, 67,
+  43, 9, 35, 30, 0, 0, 7, 25, 0, 0,
+  0, 0, 0, 0, 0, 6, 0, 17, 0, 1,
+  0, 13, 0, 7, 81, 29, 34, 0, 48, 9,
+  42, 0, 38, 19, 0, 0, 0, 27, 108, 0,
+  0, 0, 0, 0, 90, 42, 15, 0, 26, 53,
+  0, 84, 60, 35, 50, 0, 0, 15, 20, 31,
+  0, 0, 3, 111, 0, 0, 0, 0, 61, 0,
+  0, 0, 0, 79, 0, 0, 3, 0, 0, 0,
+  0, 28, 0, 0, 0, 35, 0, 82, 11, 0,
+  69, 0, 27, 18, 0, 0, 0, 0, 0, 0,
+  27, 0, 48, 0, 11, 70, 0, 0, 22, 90,
+  0, 69, 0, 68, 0, 0, 7, 0, 32, 92,
+  0, 47, 0, 58, 48, 0, 85, 34, 0, 0,
+  11, 0, 0, 0, 0, 133, 125, 0, 0, 0,
+  8, 0, 0, 61, 0, 16, 7, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 45, 0,
+  54, 0, 21, 46, 0, 0, 117, 0, 0, 75,
+  0, 0, 21, 0, 0, 1, 34, 80, 0, 0,
+  0, 31, 19, 0, 0, 94, 14, 24, 0, 0,
+  0, 29, 0, 0, 10, 39, 0, 0, 0, 0,
+  0, 56, 0, 0, 0, 0, 0, 7, 0, 0,
+  0, 0, 0, 0, 0, 155, 0, 0, 71, 0,
+  21, 0, 50, 0, 0, 5, 0, 0, 108, 0,
+  0, 0, 0, 98, 0, 0, 39, 7, 0, 0,
+  0, 22, 15, 0, 0, 0, 31, 74, 16, 3,
+  15, 30, 48, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 72, 30, 0, 0, 0, 0, 78,
+  0, 23, 0, 11, 40, 0, 0, 0, 17, 16,
+  68, 25, 10, 51, 0, 3, 0, 0, 33, 0,
+  0, 53, 0, 0, 59, 0, 5, 69, 0, 0,
+  0, 0, 0, 19, 45, 76, 0, 0, 0, 17,
+  2, 8, 10, 22, 0, 35, 0, 0, 0, 0,
+  0, 77, 41, 11, 0, 18, 0, 0, 0, 17,
+  0, 13, 0, 0, 0, 39, 0, 0, 0, 0,
+  0, 0, 0, 110, 0, 0, 0, 0, 15, 4,
+  28, 0, 0, 0, 0, 0, 48, 0, 0, 6,
+  0, 9, 0, 40, 17, 0, 0, 0, 0, 0,
+  53, 0, 0, 17, 0, 52, 45, 0, 40, 9,
+  68, 0, 0, 0, 56, 0, 0, 5, 0, 0,
+  0, 21, 0, 0, 0, 0, 1, 53, 0, 16,
+  7, 45, 50, 0, 0, 13, 38, 10, 68, 48,
+  19, 52, 56, 0, 0, 0, 26, 9, 0, 10,
+  28, 0, 51, 0, 0, 127, 0, 0, 28, 13,
+  0, 0, 0, 82, 0, 0, 9, 29, 31, 0,
+  0, 85, 28, 32, 0, 0, 13, 55, 0, 0,
+  0, 43, 0, 0, 0, 17, 44, 93, 0, 0,
+  24, 0, 15, 0, 0, 32, 0, 29, 0, 35,
+  0, 77, 0, 0, 138, 0, 12, 0, 0, 0,
+  0, 64, 0, 0, 81, 0, 9, 6, 12, 125,
+  8, 0, 33, 55, 0, 39, 22, 0, 0, 0,
+  0, 0, 28, 82, 0, 10, 0, 46, 0, 0,
+  0, 123, 0, 0, 55, 0, 11, 0, 0, 88,
+  63, 49, 0, 0, 27, 0, 0, 10, 0, 6,
+  1, 11, 0, 0, 9, 35, 24, 0, 11, 0,
+  0, 0, 0, 0, 0, 3, 9, 79, 0, 0,
+  30, 0, 26, 161, 0, 0, 0, 0, 0, 0,
+  49, 60, 0, 0, 11, 55, 0, 0, 7, 16,
+  0, 50, 0, 0, 0, 0, 0, 35, 21, 0,
+  0, 13, 0, 0, 0, 55, 0, 3, 0, 20,
+  0, 22, 0, 12, 34, 22, 0, 0, 13, 103,
+  4, 0, 17, 0, 10, 0, 46, 0, 0, 0,
+  0, 0, 54, 0, 0, 2, 0, 4, 0, 34,
+  24, 5, 0, 40, 0, 0, 0, 10, 0, 0,
+  18, 36, 19, 0, 31, 36, 38, 0, 0, 22,
+  13, 0, 4, 0, 0, 0, 1, 46, 1, 0,
+  0, 0, 0, 10, 0, 22, 0, 25, 23, 0,
+  0, 0, 5, 29, 102, 47, 32, 3, 54, 0,
+  0, 0, 37, 15, 0, 14, 0, 49, 11, 0,
+  44, 0, 25, 0, 19, 0, 0, 0, 81, 51,
+  5, 17, 15, 0, 0, 0, 3, 0, 0, 60,
+  21, 63, 0, 0, 0, 12, 63, 0, 0, 27,
+  12, 0, 0, 6, 0, 70, 0, 97, 10, 75,
+  53, 0, 0, 0, 0, 6, 0, 65, 94, 0,
+  0, 3, 21, 23, 4, 21, 0, 0, 0, 70,
+  0, 12, 8, 0, 0, 0, 0, 33, 0, 19,
+  20, 29, 0, 0, 0, 27, 44, 20, 19, 0,
+  78, 0, 29, 0, 66, 38, 0, 0, 42, 37,
+  0, 32, 0, 38, 3, 45, 0, 0, 0, 0,
+  0, 0, 3, 5, 71, 72, 88, 0, 0, 7,
+  31, 0, 0, 31, 64, 18, 57, 10, 85, 0,
+  91, 2, 0, 0, 35, 0, 20, 65, 14, 232,
+  0, 0, 1, 0, 0, 0, 0, 21, 0, 0,
+  0, 33, 62, 0, 0, 113, 15, 0, 0, 0,
+  0, 6, 0, 17, 8, 99, 0, 0, 0, 33,
+  0, 40, 0, 0, 0, 0, 0, 0, 0, 58,
+  44, 47, 7, 4, 0, 38, 0, 0, 142, 0,
+  48, 0, 21, 0, 27, 92, 17, 0, 115, 0,
+  0, 40, 0, 96, 83, 63, 62, 0, 0, 35,
+  43, 0, 0, 0, 0, 0, 46, 65, 0, 0,
+  0, 31, 0, 0, 7, 7, 0, 0, 70, 0,
+  52, 0, 0, 9, 17, 116, 2, 0, 0, 5,
+  18, 17, 0, 0, 0, 39, 0, 0, 0, 45,
+  36, 0, 13, 16, 0, 19, 0, 0, 0, 15,
+  0, 44, 0, 0, 0, 5, 19, 184, 0, 0,
+  0, 0, 0, 0, 30, 14, 0, 24, 4, 50,
+  5, 0, 21, 0, 0, 62, 18, 19, 0, 0,
+  0, 10, 18, 0, 0, 34, 0, 4, 0, 24,
+  0, 24, 0, 55, 0, 16, 0, 17, 43, 43,
+  0, 20, 0, 38, 14, 0, 0, 0, 9, 0,
+  19, 12, 5, 26, 0, 0, 6, 0, 0, 22,
+  22, 0, 30, 56, 37, 1, 2, 80, 0, 0,
+  0, 42, 0, 0, 13, 12, 24, 0, 22, 14,
+  2, 28, 1, 67, 43, 9, 35, 30, 0, 0,
+  7, 25, 0, 0, 0, 0, 0, 0, 0, 6,
+  0, 17, 0, 1, 0, 13, 0, 7, 81, 29,
+  34, 0, 48, 9, 42, 0, 38, 19, 0, 0,
+  0, 34, 49, 0, 25, 0, 17, 0, 0, 0,
+  0, 0, 29, 51, 2, 46, 15, 40, 0, 20,
+  33, 0, 79, 40, 0, 20, 0, 0, 0, 0,
+  25, 0, 0, 0, 0, 0, 0, 5, 0, 35,
+  63, 42, 0, 75, 56, 0, 0, 0, 0, 4,
+  0, 42, 63, 0, 1, 0, 44, 5, 9, 0,
+  0, 3, 0, 23, 0, 0, 26, 7, 0, 0,
+  0, 3, 4, 30, 12, 34, 0, 8, 0, 0,
+  40, 0, 0, 0, 68, 13, 0, 0, 40, 12,
+  0, 29, 32, 0, 0, 30, 0, 0, 0, 46,
+  0, 0, 0, 0, 5, 0, 0, 0, 0, 29,
+  58, 4, 0, 15, 30, 0, 26, 17, 54, 0,
+  15, 0, 9, 0, 76, 5, 0, 0, 0, 0,
+  117, 0, 0, 75, 0, 0, 21, 0, 0, 1,
+  34, 80, 0, 0, 0, 31, 19, 0, 0, 94,
+  14, 24, 0, 0, 0, 29, 0, 0, 10, 39,
+  0, 0, 0, 0, 0, 56, 0, 0, 0, 0,
+  0, 7, 0, 0, 0, 0, 0, 0, 0, 155,
+  0, 0, 71, 0, 21, 0, 50, 0, 0, 5,
+  0, 0, 108, 0, 0, 0, 0, 98, 0, 0,
+  39, 7, 0, 0, 0, 22, 15, 0, 0, 0,
+  31, 74, 16, 3, 15, 30, 48, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 72, 30, 0,
+  0, 0, 0, 78, 0, 23, 0, 11, 40, 0,
+  0, 0, 17, 16, 68, 25, 10, 51, 0, 3,
+  0, 0, 33, 0, 0, 53, 0, 0, 59, 0,
+  5, 69, 0, 0, 0, 0, 0, 19, 45, 76,
+  0, 0, 0, 17, 2, 8, 10, 22, 0, 35,
+  0, 0, 0, 0, 0, 77, 41, 11, 0, 18,
+  0, 0, 0, 17, 0, 13, 0, 0, 0, 39,
+  0, 0, 0, 0, 0, 0, 0, 110, 0, 0,
+  0, 0, 15, 4, 28, 0, 0, 0, 0, 0,
+  48, 0, 0, 6, 0, 9, 0, 40, 17, 0,
+  0, 0, 0, 0, 53, 0, 0, 17, 0, 52,
+  45, 0, 40, 9, 68, 0, 0, 0, 56, 0,
+  0, 5, 0, 0, 0, 21, 0, 0, 0, 0,
+  1, 53, 0, 16, 7, 45, 50, 0, 0, 13,
+  38, 10, 68, 48, 19, 52, 56, 0, 0, 0,
+  26, 9, 0, 10, 0, 52, 52, 0, 44, 0,
+  21, 0, 7, 0, 0, 3, 68, 73, 3, 33,
+  10, 1, 18, 0, 44, 0, 0, 50, 14, 42,
+  0, 0, 0, 12, 60, 0, 0, 39, 0, 0,
+  0, 7, 0, 62, 39, 63, 0, 87, 51, 0,
+  0, 0, 0, 0, 0, 78, 42, 0, 0, 0,
+  18, 20, 19, 14, 11, 0, 3, 81, 0, 28,
+  0, 0, 0, 0, 0, 30, 0, 13, 8, 1,
+  0, 0, 0, 18, 37, 38, 21, 0, 88, 0,
+  16, 0, 65, 54, 0, 0, 46, 25, 0, 61,
+  0, 19, 5, 30, 0, 0, 0, 0, 0, 0,
+  0, 15, 38, 43, 88, 0, 0, 20, 22, 0,
+  0, 24, 58, 18, 39, 4, 45, 0, 79, 0,
+  1, 0, 0, 0, 30, 0, 26, 161, 0, 0,
+  0, 0, 0, 0, 49, 60, 0, 0, 11, 55,
+  0, 0, 7, 16, 0, 50, 0, 0, 0, 0,
+  0, 35, 21, 0, 0, 13, 0, 0, 0, 55,
+  0, 3, 0, 20, 0, 22, 0, 12, 34, 22,
+  0, 0, 13, 103, 4, 0, 17, 0, 10, 0,
+  46, 0, 0, 0, 0, 0, 54, 0, 0, 2,
+  0, 4, 0, 34, 24, 5, 0, 40, 0, 0,
+  0, 10, 0, 0, 18, 36, 19, 0, 31, 36,
+  38, 0, 0, 22, 13, 0, 4, 0, 0, 0,
+  1, 46, 1, 0, 0, 0, 0, 10, 0, 22,
+  0, 25, 23, 0, 0, 0, 5, 29, 102, 47,
+  32, 3, 54, 0, 0, 0, 37, 15, 0, 14,
+  0, 49, 11, 0, 44, 0, 25, 0, 19, 0,
+  0, 0, 81, 51, 5, 17, 15, 0, 0, 0,
+  3, 0, 0, 60, 21, 63, 0, 0, 0, 12,
+  63, 0, 0, 27, 12, 0, 0, 6, 0, 70,
+  0, 97, 10, 75, 53, 0, 0, 0, 0, 6,
+  0, 65, 94, 0, 0, 3, 21, 23, 4, 21,
+  0, 0, 0, 70, 0, 12, 8, 0, 0, 0,
+  0, 33, 0, 19, 20, 29, 0, 0, 0, 27,
+  44, 20, 19, 0, 78, 0, 29, 0, 66, 38,
+  0, 0, 42, 37, 0, 32, 0, 38, 3, 45,
+  0, 0, 0, 0, 0, 0, 3, 5, 71, 72,
+  88, 0, 0, 7, 31, 0, 0, 31, 64, 18,
+  57, 10, 85, 0, 91, 2, 0, 0, 0, 21,
+  76, 0, 26, 0, 1, 0, 0, 0, 0, 6,
+  28, 78, 0, 20, 4, 29, 21, 10, 35, 34,
+  113, 11, 0, 0, 0, 0, 0, 0, 18, 0,
+  0, 0, 0, 0, 0, 1, 0, 10, 66, 3,
+  0, 101, 57, 6, 0, 0, 0, 0, 0, 90,
+  1, 0, 17, 0, 40, 0, 25, 0, 0, 10,
+  7, 19, 34, 0, 0, 18, 0, 29, 0, 0,
+  0, 43, 3, 0, 0, 28, 0, 0, 37, 0,
+  22, 0, 65, 9, 0, 0, 20, 0, 0, 16,
+  13, 0, 0, 46, 0, 0, 0, 39, 0, 0,
+  0, 0, 1, 0, 0, 4, 0, 7, 72, 14,
+  0, 12, 20, 0, 52, 13, 51, 13, 13, 0,
+  0, 0, 64, 0, 0, 0, 0, 0, 0, 5,
+  19, 184, 0, 0, 0, 0, 0, 0, 30, 14,
+  0, 24, 4, 50, 5, 0, 21, 0, 0, 62,
+  18, 19, 0, 0, 0, 10, 18, 0, 0, 34,
+  0, 4, 0, 24, 0, 24, 0, 55, 0, 16,
+  0, 17, 43, 43, 0, 20, 0, 38, 14, 0,
+  0, 0, 9, 0, 19, 12, 5, 26, 0, 0,
+  6, 0, 0, 22, 22, 0, 30, 56, 37, 1,
+  2, 80, 0, 0, 0, 42, 0, 0, 13, 12,
+  24, 0, 22, 14, 2, 28, 1, 67, 43, 9,
+  35, 30, 0, 0, 7, 25, 0, 0, 0, 0,
+  0, 0, 0, 6, 0, 17, 0, 1, 0, 13,
+  0, 7, 81, 29, 34, 0, 48, 9, 42, 0,
+  38, 19, 0, 0, 0, 34, 49, 0, 25, 0,
+  17, 0, 0, 0, 0, 0, 29, 51, 2, 46,
+  15, 40, 0, 20, 33, 0, 79, 40, 0, 20,
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 0,
+  0, 5, 0, 35, 63, 42, 0, 75, 56, 0,
+  0, 0, 0, 4, 0, 42, 63, 0, 1, 0,
+  44, 5, 9, 0, 0, 3, 0, 23, 0, 0,
+  26, 7, 0, 0, 0, 3, 4, 30, 12, 34,
+  0, 8, 0, 0, 40, 0, 0, 0, 68, 13,
+  0, 0, 40, 12, 0, 29, 32, 0, 0, 30,
+  0, 0, 0, 46, 0, 0, 0, 0, 5, 0,
+  0, 0, 0, 29, 58, 4, 0, 15, 30, 0,
+  26, 17, 54, 0, 15, 0, 9, 0, 76, 5,
+  0, 0, 10, 0, 77, 0, 9, 10, 0, 0,
+  4, 0, 0, 8, 3, 82, 0, 0, 0, 46,
+  42, 0, 45, 68, 136, 0, 0, 0, 0, 0,
+  0, 0, 3, 0, 0, 0, 0, 9, 0, 0,
+  0, 0, 33, 0, 0, 90, 40, 14, 0, 21,
+  0, 0, 0, 136, 0, 0, 74, 0, 41, 0,
+  36, 0, 0, 0, 35, 0, 125, 0, 0, 23,
+  0, 91, 0, 0, 13, 4, 0, 0, 7, 0,
+  0, 0, 15, 0, 23, 0, 45, 6, 0, 0,
+  20, 0, 0, 0, 0, 0, 24, 27, 0, 0,
+  0, 52, 15, 0, 0, 0, 14, 0, 0, 2,
+  0, 0, 69, 4, 0, 37, 12, 0, 118, 0,
+  23, 19, 24, 0, 0, 0, 53, 0, 0, 0,
+  0, 0, 59, 0, 5, 69, 0, 0, 0, 0,
+  0, 19, 45, 76, 0, 0, 0, 17, 2, 8,
+  10, 22, 0, 35, 0, 0, 0, 0, 0, 77,
+  41, 11, 0, 18, 0, 0, 0, 17, 0, 13,
+  0, 0, 0, 39, 0, 0, 0, 0, 0, 0,
+  0, 110, 0, 0, 0, 0, 15, 4, 28, 0,
+  0, 0, 0, 0, 48, 0, 0, 6, 0, 9,
+  0, 40, 17, 0, 0, 0, 0, 0, 53, 0,
+  0, 17, 0, 52, 45, 0, 40, 9, 68, 0,
+  0, 0, 56, 0, 0, 5, 0, 0, 0, 21,
+  0, 0, 0, 0, 1, 53, 0, 16, 7, 45,
+  50, 0, 0, 13, 38, 10, 68, 48, 19, 52,
+  56, 0, 0, 0, 26, 9, 0, 10, 0, 52,
+  52, 0, 44, 0, 21, 0, 7, 0, 0, 3,
+  68, 73, 3, 33, 10, 1, 18, 0, 44, 0,
+  0, 50, 14, 42, 0, 0, 0, 12, 60, 0,
+  0, 39, 0, 0, 0, 7, 0, 62, 39, 63,
+  0, 87, 51, 0, 0, 0, 0, 0, 0, 78,
+  42, 0, 0, 0, 18, 20, 19, 14, 11, 0,
+  3, 81, 0, 28, 0, 0, 0, 0, 0, 30,
+  0, 13, 8, 1, 0, 0, 0, 18, 37, 38,
+  21, 0, 88, 0, 16, 0, 65, 54, 0, 0,
+  46, 25, 0, 61, 0, 19, 5, 30, 0, 0,
+  0, 0, 0, 0, 0, 15, 38, 43, 88, 0,
+  0, 20, 22, 0, 0, 24, 58, 18, 39, 4,
+  45, 0, 79, 0, 1, 0, 0, 16, 100, 0,
+  22, 0, 0, 0, 0, 0, 0, 11, 22, 94,
+  0, 49, 0, 51, 31, 35, 50, 27, 110, 9,
+  0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 94, 0, 0, 96,
+  51, 18, 0, 0, 0, 0, 0, 79, 0, 0,
+  15, 0, 24, 0, 24, 0, 7, 8, 19, 6,
+  56, 0, 0, 10, 0, 51, 0, 0, 21, 34,
+  0, 0, 0, 16, 0, 0, 24, 0, 36, 0,
+  41, 12, 2, 0, 43, 21, 0, 36, 0, 0,
+  5, 39, 0, 0, 0, 27, 23, 0, 0, 0,
+  0, 0, 0, 11, 0, 6, 79, 9, 0, 5,
+  40, 0, 52, 15, 28, 31, 21, 0, 0, 0,
+  55, 12, 0, 0, 0, 49, 11, 0, 44, 0,
+  25, 0, 19, 0, 0, 0, 81, 51, 5, 17,
+  15, 0, 0, 0, 3, 0, 0, 60, 21, 63,
+  0, 0, 0, 12, 63, 0, 0, 27, 12, 0,
+  0, 6, 0, 70, 0, 97, 10, 75, 53, 0,
+  0, 0, 0, 6, 0, 65, 94, 0, 0, 3,
+  21, 23, 4, 21, 0, 0, 0, 70, 0, 12,
+  8, 0, 0, 0, 0, 33, 0, 19, 20, 29,
+  0, 0, 0, 27, 44, 20, 19, 0, 78, 0,
+  29, 0, 66, 38, 0, 0, 42, 37, 0, 32,
+  0, 38, 3, 45, 0, 0, 0, 0, 0, 0,
+  3, 5, 71, 72, 88, 0, 0, 7, 31, 0,
+  0, 31, 64, 18, 57, 10, 85, 0, 91, 2,
+  0, 0, 0, 21, 76, 0, 26, 0, 1, 0,
+  0, 0, 0, 6, 28, 78, 0, 20, 4, 29,
+  21, 10, 35, 34, 113, 11, 0, 0, 0, 0,
+  0, 0, 18, 0, 0, 0, 0, 0, 0, 1,
+  0, 10, 66, 3, 0, 101, 57, 6, 0, 0,
+  0, 0, 0, 90, 1, 0, 17, 0, 40, 0,
+  25, 0, 0, 10, 7, 19, 34, 0, 0, 18,
+  0, 29, 0, 0, 0, 43, 3, 0, 0, 28,
+  0, 0, 37, 0, 22, 0, 65, 9, 0, 0,
+  20, 0, 0, 16, 13, 0, 0, 46, 0, 0,
+  0, 39, 0, 0, 0, 0, 1, 0, 0, 4,
+  0, 7, 72, 14, 0, 12, 20, 0, 52, 13,
+  51, 13, 13, 0, 0, 0, 64, 0, 0, 0,
+  4, 0, 79, 3, 6, 0, 0, 0, 14, 0,
+  0, 8, 0, 94, 0, 3, 0, 47, 45, 17,
+  53, 54, 102, 0, 0, 0, 0, 16, 0, 0,
+  0, 0, 0, 0, 0, 14, 0, 0, 0, 0,
+  37, 0, 0, 85, 38, 32, 0, 6, 0, 0,
+  0, 126, 0, 0, 66, 0, 24, 0, 20, 0,
+  0, 0, 29, 0, 99, 0, 0, 10, 0, 92,
+  0, 0, 18, 0, 0, 0, 4, 0, 0, 0,
+  11, 0, 20, 0, 18, 0, 0, 0, 39, 0,
+  0, 7, 0, 0, 22, 29, 2, 0, 4, 32,
+  23, 0, 0, 0, 28, 0, 0, 3, 17, 0,
+  84, 3, 0, 15, 21, 0, 112, 0, 10, 16,
+  55, 0, 0, 0, 57, 15, 0, 0, 0, 34,
+  49, 0, 25, 0, 17, 0, 0, 0, 0, 0,
+  29, 51, 2, 46, 15, 40, 0, 20, 33, 0,
+  79, 40, 0, 20, 0, 0, 0, 0, 25, 0,
+  0, 0, 0, 0, 0, 5, 0, 35, 63, 42,
+  0, 75, 56, 0, 0, 0, 0, 4, 0, 42,
+  63, 0, 1, 0, 44, 5, 9, 0, 0, 3,
+  0, 23, 0, 0, 26, 7, 0, 0, 0, 3,
+  4, 30, 12, 34, 0, 8, 0, 0, 40, 0,
+  0, 0, 68, 13, 0, 0, 40, 12, 0, 29,
+  32, 0, 0, 30, 0, 0, 0, 46, 0, 0,
+  0, 0, 5, 0, 0, 0, 0, 29, 58, 4,
+  0, 15, 30, 0, 26, 17, 54, 0, 15, 0,
+  9, 0, 76, 5, 0, 0, 10, 0, 77, 0,
+  9, 10, 0, 0, 4, 0, 0, 8, 3, 82,
+  0, 0, 0, 46, 42, 0, 45, 68, 136, 0,
+  0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+  0, 9, 0, 0, 0, 0, 33, 0, 0, 90,
+  40, 14, 0, 21, 0, 0, 0, 136, 0, 0,
+  74, 0, 41, 0, 36, 0, 0, 0, 35, 0,
+  125, 0, 0, 23, 0, 91, 0, 0, 13, 4,
+  0, 0, 7, 0, 0, 0, 15, 0, 23, 0,
+  45, 6, 0, 0, 20, 0, 0, 0, 0, 0,
+  24, 27, 0, 0, 0, 52, 15, 0, 0, 0,
+  14, 0, 0, 2, 0, 0, 69, 4, 0, 37,
+  12, 0, 118, 0, 23, 19, 24, 0, 0, 0,
+  53, 0, 0, 0, 0, 0, 45, 1, 17, 0,
+  0, 0, 31, 0, 0, 0, 20, 82, 0, 0,
+  0, 11, 29, 0, 23, 30, 25, 5, 0, 0,
+  20, 43, 0, 53, 0, 0, 0, 0, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 45, 6, 26,
+  0, 49, 0, 0, 0, 152, 0, 16, 45, 0,
+  12, 0, 0, 0, 0, 0, 8, 0, 63, 0,
+  0, 6, 0, 72, 0, 0, 8, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 1, 0, 0, 0,
+  0, 44, 53, 0, 44, 0, 0, 0, 18, 0,
+  36, 0, 0, 72, 23, 0, 15, 0, 42, 0,
+  1, 20, 65, 0, 81, 0, 0, 14, 40, 0,
+  141, 0, 0, 33, 89, 0, 30, 0, 58, 0,
+  0, 0, 0, 52, 52, 0, 44, 0, 21, 0,
+  7, 0, 0, 3, 68, 73, 3, 33, 10, 1,
+  18, 0, 44, 0, 0, 50, 14, 42, 0, 0,
+  0, 12, 60, 0, 0, 39, 0, 0, 0, 7,
+  0, 62, 39, 63, 0, 87, 51, 0, 0, 0,
+  0, 0, 0, 78, 42, 0, 0, 0, 18, 20,
+  19, 14, 11, 0, 3, 81, 0, 28, 0, 0,
+  0, 0, 0, 30, 0, 13, 8, 1, 0, 0,
+  0, 18, 37, 38, 21, 0, 88, 0, 16, 0,
+  65, 54, 0, 0, 46, 25, 0, 61, 0, 19,
+  5, 30, 0, 0, 0, 0, 0, 0, 0, 15,
+  38, 43, 88, 0, 0, 20, 22, 0, 0, 24,
+  58, 18, 39, 4, 45, 0, 79, 0, 1, 0,
+  0, 16, 100, 0, 22, 0, 0, 0, 0, 0,
+  0, 11, 22, 94, 0, 49, 0, 51, 31, 35,
+  50, 27, 110, 9, 0, 0, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  94, 0, 0, 96, 51, 18, 0, 0, 0, 0,
+  0, 79, 0, 0, 15, 0, 24, 0, 24, 0,
+  7, 8, 19, 6, 56, 0, 0, 10, 0, 51,
+  0, 0, 21, 34, 0, 0, 0, 16, 0, 0,
+  24, 0, 36, 0, 41, 12, 2, 0, 43, 21,
+  0, 36, 0, 0, 5, 39, 0, 0, 0, 27,
+  23, 0, 0, 0, 0, 0, 0, 11, 0, 6,
+  79, 9, 0, 5, 40, 0, 52, 15, 28, 31,
+  21, 0, 0, 0, 55, 12, 0, 0, 20, 0,
+  91, 19, 0, 0, 0, 12, 20, 0, 0, 0,
+  0, 125, 0, 0, 0, 22, 28, 1, 36, 70,
+  81, 11, 0, 0, 7, 35, 205, 0, 23, 21,
+  0, 15, 0, 0, 0, 31, 0, 0, 65, 0,
+  0, 38, 53, 70, 0, 0, 0, 0, 0, 120,
+  0, 6, 74, 0, 21, 12, 39, 0, 24, 17,
+  49, 0, 50, 0, 10, 0, 0, 102, 0, 0,
+  27, 14, 0, 0, 25, 0, 0, 0, 12, 2,
+  2, 20, 0, 0, 0, 33, 96, 33, 0, 2,
+  0, 0, 53, 20, 39, 0, 2, 26, 35, 12,
+  15, 0, 81, 19, 3, 30, 19, 0, 74, 0,
+  14, 0, 19, 31, 105, 0, 0, 54, 0, 0,
+  0, 0, 40, 22, 0, 17, 0, 21, 76, 0,
+  26, 0, 1, 0, 0, 0, 0, 6, 28, 78,
+  0, 20, 4, 29, 21, 10, 35, 34, 113, 11,
+  0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+  0, 0, 0, 1, 0, 10, 66, 3, 0, 101,
+  57, 6, 0, 0, 0, 0, 0, 90, 1, 0,
+  17, 0, 40, 0, 25, 0, 0, 10, 7, 19,
+  34, 0, 0, 18, 0, 29, 0, 0, 0, 43,
+  3, 0, 0, 28, 0, 0, 37, 0, 22, 0,
+  65, 9, 0, 0, 20, 0, 0, 16, 13, 0,
+  0, 46, 0, 0, 0, 39, 0, 0, 0, 0,
+  1, 0, 0, 4, 0, 7, 72, 14, 0, 12,
+  20, 0, 52, 13, 51, 13, 13, 0, 0, 0,
+  64, 0, 0, 0, 4, 0, 79, 3, 6, 0,
+  0, 0, 14, 0, 0, 8, 0, 94, 0, 3,
+  0, 47, 45, 17, 53, 54, 102, 0, 0, 0,
+  0, 16, 0, 0, 0, 0, 0, 0, 0, 14,
+  0, 0, 0, 0, 37, 0, 0, 85, 38, 32,
+  0, 6, 0, 0, 0, 126, 0, 0, 66, 0,
+  24, 0, 20, 0, 0, 0, 29, 0, 99, 0,
+  0, 10, 0, 92, 0, 0, 18, 0, 0, 0,
+  4, 0, 0, 0, 11, 0, 20, 0, 18, 0,
+  0, 0, 39, 0, 0, 7, 0, 0, 22, 29,
+  2, 0, 4, 32, 23, 0, 0, 0, 28, 0,
+  0, 3, 17, 0, 84, 3, 0, 15, 21, 0,
+  112, 0, 10, 16, 55, 0, 0, 0, 57, 15,
+  0, 0, 2, 0, 42, 31, 0, 0, 14, 24,
+  59, 0, 4, 0, 0, 82, 0, 0, 0, 8,
+  26, 0, 35, 19, 23, 27, 0, 0, 38, 57,
+  187, 16, 19, 10, 32, 0, 0, 0, 0, 25,
+  0, 0, 0, 0, 0, 32, 38, 93, 0, 17,
+  0, 0, 3, 110, 0, 32, 59, 0, 9, 0,
+  14, 0, 0, 22, 8, 0, 4, 0, 20, 0,
+  0, 39, 0, 6, 29, 4, 0, 9, 34, 0,
+  0, 0, 24, 0, 1, 24, 0, 0, 0, 30,
+  103, 45, 40, 0, 0, 0, 18, 12, 59, 0,
+  26, 51, 26, 6, 18, 0, 84, 0, 42, 12,
+  87, 0, 79, 0, 10, 0, 1, 0, 115, 0,
+  0, 34, 41, 0, 5, 0, 59, 9, 0, 24,
+  10, 0, 77, 0, 9, 10, 0, 0, 4, 0,
+  0, 8, 3, 82, 0, 0, 0, 46, 42, 0,
+  45, 68, 136, 0, 0, 0, 0, 0, 0, 0,
+  3, 0, 0, 0, 0, 9, 0, 0, 0, 0,
+  33, 0, 0, 90, 40, 14, 0, 21, 0, 0,
+  0, 136, 0, 0, 74, 0, 41, 0, 36, 0,
+  0, 0, 35, 0, 125, 0, 0, 23, 0, 91,
+  0, 0, 13, 4, 0, 0, 7, 0, 0, 0,
+  15, 0, 23, 0, 45, 6, 0, 0, 20, 0,
+  0, 0, 0, 0, 24, 27, 0, 0, 0, 52,
+  15, 0, 0, 0, 14, 0, 0, 2, 0, 0,
+  69, 4, 0, 37, 12, 0, 118, 0, 23, 19,
+  24, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+  45, 1, 17, 0, 0, 0, 31, 0, 0, 0,
+  20, 82, 0, 0, 0, 11, 29, 0, 23, 30,
+  25, 5, 0, 0, 20, 43, 0, 53, 0, 0,
+  0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 45, 6, 26, 0, 49, 0, 0, 0, 152,
+  0, 16, 45, 0, 12, 0, 0, 0, 0, 0,
+  8, 0, 63, 0, 0, 6, 0, 72, 0, 0,
+  8, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  1, 0, 0, 0, 0, 44, 53, 0, 44, 0,
+  0, 0, 18, 0, 36, 0, 0, 72, 23, 0,
+  15, 0, 42, 0, 1, 20, 65, 0, 81, 0,
+  0, 14, 40, 0, 141, 0, 0, 33, 89, 0,
+  30, 0, 58, 0, 0, 0, 0, 0, 24, 23,
+  0, 0, 18, 24, 50, 29, 0, 0, 0, 30,
+  0, 5, 4, 7, 13, 0, 0, 0, 0, 53,
+  0, 0, 74, 59, 173, 47, 0, 0, 71, 0,
+  19, 0, 0, 20, 0, 24, 0, 0, 0, 0,
+  18, 88, 16, 0, 0, 16, 0, 67, 30, 34,
+  32, 0, 0, 4, 0, 6, 0, 39, 0, 0,
+  0, 0, 33, 0, 0, 14, 6, 12, 56, 3,
+  0, 51, 0, 0, 0, 3, 39, 0, 0, 33,
+  0, 0, 0, 48, 80, 41, 84, 0, 0, 0,
+  23, 0, 51, 0, 2, 59, 14, 2, 58, 0,
+  66, 2, 56, 3, 77, 5, 38, 0, 11, 0,
+  0, 0, 103, 0, 0, 17, 53, 0, 50, 0,
+  60, 0, 7, 11, 0, 16, 100, 0, 22, 0,
+  0, 0, 0, 0, 0, 11, 22, 94, 0, 49,
+  0, 51, 31, 35, 50, 27, 110, 9, 0, 0,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 94, 0, 0, 96, 51, 18,
+  0, 0, 0, 0, 0, 79, 0, 0, 15, 0,
+  24, 0, 24, 0, 7, 8, 19, 6, 56, 0,
+  0, 10, 0, 51, 0, 0, 21, 34, 0, 0,
+  0, 16, 0, 0, 24, 0, 36, 0, 41, 12,
+  2, 0, 43, 21, 0, 36, 0, 0, 5, 39,
+  0, 0, 0, 27, 23, 0, 0, 0, 0, 0,
+  0, 11, 0, 6, 79, 9, 0, 5, 40, 0,
+  52, 15, 28, 31, 21, 0, 0, 0, 55, 12,
+  0, 0, 20, 0, 91, 19, 0, 0, 0, 12,
+  20, 0, 0, 0, 0, 125, 0, 0, 0, 22,
+  28, 1, 36, 70, 81, 11, 0, 0, 7, 35,
+  205, 0, 23, 21, 0, 15, 0, 0, 0, 31,
+  0, 0, 65, 0, 0, 38, 53, 70, 0, 0,
+  0, 0, 0, 120, 0, 6, 74, 0, 21, 12,
+  39, 0, 24, 17, 49, 0, 50, 0, 10, 0,
+  0, 102, 0, 0, 27, 14, 0, 0, 25, 0,
+  0, 0, 12, 2, 2, 20, 0, 0, 0, 33,
+  96, 33, 0, 2, 0, 0, 53, 20, 39, 0,
+  2, 26, 35, 12, 15, 0, 81, 19, 3, 30,
+  19, 0, 74, 0, 14, 0, 19, 31, 105, 0,
+  0, 54, 0, 0, 0, 0, 40, 22, 0, 17,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
+  79, 3, 6, 0, 0, 0, 14, 0, 0, 8,
+  0, 94, 0, 3, 0, 47, 45, 17, 53, 54,
+  102, 0, 0, 0, 0, 16, 0, 0, 0, 0,
+  0, 0, 0, 14, 0, 0, 0, 0, 37, 0,
+  0, 85, 38, 32, 0, 6, 0, 0, 0, 126,
+  0, 0, 66, 0, 24, 0, 20, 0, 0, 0,
+  29, 0, 99, 0, 0, 10, 0, 92, 0, 0,
+  18, 0, 0, 0, 4, 0, 0, 0, 11, 0,
+  20, 0, 18, 0, 0, 0, 39, 0, 0, 7,
+  0, 0, 22, 29, 2, 0, 4, 32, 23, 0,
+  0, 0, 28, 0, 0, 3, 17, 0, 84, 3,
+  0, 15, 21, 0, 112, 0, 10, 16, 55, 0,
+  0, 0, 57, 15, 0, 0, 2, 0, 42, 31,
+  0, 0, 14, 24, 59, 0, 4, 0, 0, 82,
+  0, 0, 0, 8, 26, 0, 35, 19, 23, 27,
+  0, 0, 38, 57, 187, 16, 19, 10, 32, 0,
+  0, 0, 0, 25, 0, 0, 0, 0, 0, 32,
+  38, 93, 0, 17, 0, 0, 3, 110, 0, 32,
+  59, 0, 9, 0, 14, 0, 0, 22, 8, 0,
+  4, 0, 20, 0, 0, 39, 0, 6, 29, 4,
+  0, 9, 34, 0, 0, 0, 24, 0, 1, 24,
+  0, 0, 0, 30, 103, 45, 40, 0, 0, 0,
+  18, 12, 59, 0, 26, 51, 26, 6, 18, 0,
+  84, 0, 42, 12, 87, 0, 79, 0, 10, 0,
+  1, 0, 115, 0, 0, 34, 41, 0, 5, 0,
+  59, 9, 0, 24, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 45, 1, 17, 0, 0, 0,
+  31, 0, 0, 0, 20, 82, 0, 0, 0, 11,
+  29, 0, 23, 30, 25, 5, 0, 0, 20, 43,
+  0, 53, 0, 0, 0, 0, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 45, 6, 26, 0, 49,
+  0, 0, 0, 152, 0, 16, 45, 0, 12, 0,
+  0, 0, 0, 0, 8, 0, 63, 0, 0, 6,
+  0, 72, 0, 0, 8, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 1, 0, 0, 0, 0, 44,
+  53, 0, 44, 0, 0, 0, 18, 0, 36, 0,
+  0, 72, 23, 0, 15, 0, 42, 0, 1, 20,
+  65, 0, 81, 0, 0, 14, 40, 0, 141, 0,
+  0, 33, 89, 0, 30, 0, 58, 0, 0, 0,
+  0, 0, 24, 23, 0, 0, 18, 24, 50, 29,
+  0, 0, 0, 30, 0, 5, 4, 7, 13, 0,
+  0, 0, 0, 53, 0, 0, 74, 59, 173, 47,
+  0, 0, 71, 0, 19, 0, 0, 20, 0, 24,
+  0, 0, 0, 0, 18, 88, 16, 0, 0, 16,
+  0, 67, 30, 34, 32, 0, 0, 4, 0, 6,
+  0, 39, 0, 0, 0, 0, 33, 0, 0, 14,
+  6, 12, 56, 3, 0, 51, 0, 0, 0, 3,
+  39, 0, 0, 33, 0, 0, 0, 48, 80, 41,
+  84, 0, 0, 0, 23, 0, 51, 0, 2, 59,
+  14, 2, 58, 0, 66, 2, 56, 3, 77, 5,
+  38, 0, 11, 0, 0, 0, 103, 0, 0, 17,
+  53, 0, 50, 0, 60, 0, 7, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 30, 25, 0, 1, 3,
+  33, 18, 0, 0, 0, 0, 0, 38, 0, 18,
+  43, 15, 0, 40, 38, 17, 58, 51, 0, 9,
+  8, 5, 128, 38, 0, 0, 54, 0, 69, 16,
+  0, 30, 0, 38, 21, 38, 0, 22, 60, 37,
+  2, 0, 0, 0, 0, 13, 47, 0, 16, 0,
+  64, 0, 29, 0, 6, 33, 7, 0, 0, 0,
+  7, 19, 25, 0, 0, 36, 79, 26, 45, 46,
+  0, 7, 30, 1, 38, 2, 13, 0, 0, 0,
+  0, 0, 54, 6, 3, 0, 38, 1, 15, 56,
+  0, 0, 37, 35, 9, 0, 0, 19, 20, 19,
+  57, 1, 0, 26, 0, 8, 0, 33, 5, 0,
+  23, 13, 0, 22, 19, 0, 0, 0, 19, 0,
+  11, 9, 0, 48, 13, 14, 0, 0, 29, 34,
+  3, 0, 0, 37, 105, 0, 2, 11, 53, 15,
+  0, 14, 67, 51, 53, 17, 9, 0, 0, 9,
+  0, 0, 0, 0, 96, 0, 32, 9, 0, 24,
+  0, 75, 0, 32, 0, 38, 68, 64, 0, 61,
+  0, 41, 0, 28, 43, 1, 16, 0, 14, 0,
+  11, 0, 0, 0, 0, 18, 0, 0, 0, 0,
+  17, 0, 10, 2, 29, 20, 37, 0, 16, 39,
+  0, 22, 45, 0, 41, 0, 0, 0, 0, 0,
+  0, 7, 0, 0, 0, 7, 0, 48, 0, 0,
+  52, 46, 8, 0, 0, 12, 18, 0, 59, 0,
+  0, 16, 0, 17, 0, 17, 0, 0, 14, 0,
+  6, 8, 40, 0, 40, 0, 76, 0, 11, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 62,
+  32, 0, 2, 1, 44, 3, 0, 0, 16, 4,
+  12, 0, 5, 53, 33, 30, 0, 74, 61, 0,
+  71, 46, 0, 36, 0, 3, 111, 34, 1, 0,
+  57, 0, 53, 22, 0, 16, 0, 48, 40, 30,
+  5, 36, 99, 16, 0, 12, 0, 8, 1, 0,
+  56, 0, 0, 0, 43, 0, 7, 33, 9, 0,
+  16, 0, 0, 0, 18, 21, 0, 0, 8, 32,
+  42, 43, 43, 31, 0, 15, 0, 0, 70, 13,
+  10, 0, 12, 12, 0, 0, 50, 9, 2, 0,
+  16, 0, 5, 73, 0, 0, 8, 21, 2, 0,
+  0, 16, 17, 0, 77, 9, 0, 22, 29, 1,
+  0, 33, 0, 0, 0, 15, 0, 33, 26, 0,
+  0, 0, 28, 0, 14, 0, 5, 45, 49, 8,
+  0, 13, 12, 23, 0, 0, 0, 49, 90, 0,
+  0, 29, 44, 13, 0, 25, 68, 58, 82, 13,
+  0, 0, 0, 11, 0, 0, 0, 0, 81, 0,
+  34, 31, 0, 20, 0, 59, 2, 29, 0, 28,
+  67, 52, 0, 60, 0, 43, 0, 42, 24, 0,
+  22, 0, 17, 0, 7, 0, 0, 0, 0, 9,
+  8, 0, 0, 0, 16, 0, 14, 13, 19, 19,
+  30, 0, 40, 53, 0, 19, 43, 0, 42, 0,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 33, 18, 0, 37, 45, 21, 0, 0, 23,
+  29, 0, 60, 0, 0, 7, 11, 13, 0, 17,
+  0, 0, 0, 0, 1, 9, 37, 0, 7, 0,
+  52, 0, 8, 2, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 74, 43, 0, 0, 0, 41, 0,
+  0, 0, 0, 15, 3, 0, 14, 72, 38, 47,
+  0, 64, 66, 0, 81, 51, 0, 26, 10, 14,
+  118, 35, 2, 0, 62, 0, 42, 8, 0, 26,
+  7, 52, 32, 25, 0, 26, 85, 30, 0, 8,
+  0, 25, 0, 13, 61, 0, 0, 0, 25, 0,
+  4, 20, 16, 0, 7, 0, 0, 0, 21, 2,
+  0, 0, 14, 32, 32, 38, 42, 30, 5, 5,
+  0, 0, 76, 3, 4, 0, 0, 15, 0, 0,
+  64, 23, 0, 0, 7, 0, 8, 49, 0, 0,
+  22, 10, 3, 0, 1, 17, 39, 0, 77, 0,
+  0, 43, 30, 0, 0, 41, 0, 0, 0, 3,
+  0, 15, 30, 0, 0, 0, 22, 0, 36, 0,
+  4, 47, 62, 10, 0, 19, 11, 10, 1, 0,
+  0, 51, 73, 0, 0, 33, 47, 24, 0, 20,
+  69, 64, 93, 12, 0, 0, 0, 23, 0, 0,
+  0, 0, 74, 0, 23, 28, 0, 28, 0, 48,
+  1, 24, 0, 19, 53, 57, 0, 57, 0, 37,
+  0, 54, 25, 0, 42, 0, 29, 0, 2, 0,
+  1, 0, 0, 20, 15, 0, 0, 0, 26, 0,
+  13, 15, 11, 22, 32, 0, 46, 51, 0, 12,
+  44, 0, 35, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 24, 31, 0, 40, 41,
+  11, 0, 10, 24, 51, 0, 57, 0, 0, 3,
+  17, 15, 0, 12, 0, 0, 7, 0, 0, 7,
+  15, 4, 0, 0, 47, 0, 18, 0, 0, 30,
+  25, 0, 1, 3, 33, 18, 0, 0, 0, 0,
+  0, 38, 0, 18, 43, 15, 0, 40, 38, 17,
+  58, 51, 0, 9, 8, 5, 128, 38, 0, 0,
+  54, 0, 69, 16, 0, 30, 0, 38, 21, 38,
+  0, 22, 60, 37, 2, 0, 0, 0, 0, 13,
+  47, 0, 16, 0, 64, 0, 29, 0, 6, 33,
+  7, 0, 0, 0, 7, 19, 25, 0, 0, 36,
+  79, 26, 45, 46, 0, 7, 30, 1, 38, 2,
+  13, 0, 0, 0, 0, 0, 54, 6, 3, 0,
+  38, 1, 15, 56, 0, 0, 37, 35, 9, 0,
+  0, 19, 20, 19, 57, 1, 0, 26, 0, 8,
+  0, 33, 5, 0, 23, 13, 0, 22, 19, 0,
+  0, 0, 19, 0, 11, 9, 0, 48, 13, 14,
+  0, 0, 29, 34, 3, 0, 0, 37, 105, 0,
+  2, 11, 53, 15, 0, 14, 67, 51, 53, 17,
+  9, 0, 0, 9, 0, 0, 0, 0, 96, 0,
+  32, 9, 0, 24, 0, 75, 0, 32, 0, 38,
+  68, 64, 0, 61, 0, 41, 0, 28, 43, 1,
+  16, 0, 14, 0, 11, 0, 0, 0, 0, 18,
+  0, 0, 0, 0, 17, 0, 10, 2, 29, 20,
+  37, 0, 16, 39, 0, 22, 45, 0, 41, 0,
+  0, 0, 0, 0, 0, 7, 0, 0, 0, 7,
+  0, 48, 0, 0, 52, 46, 8, 0, 0, 12,
+  18, 0, 59, 0, 0, 16, 0, 17, 0, 17,
+  0, 0, 14, 0, 6, 8, 40, 0, 40, 0,
+  76, 0, 11, 0, 4, 29, 39, 21, 0, 5,
+  28, 2, 19, 0, 0, 34, 112, 0, 22, 39,
+  53, 0, 0, 0, 0, 83, 0, 10, 59, 0,
+  0, 23, 0, 0, 0, 41, 82, 0, 23, 0,
+  0, 23, 0, 78, 0, 55, 37, 22, 36, 48,
+  30, 16, 0, 54, 0, 60, 33, 24, 31, 0,
+  11, 0, 7, 0, 17, 0, 0, 63, 0, 10,
+  7, 0, 36, 0, 8, 20, 0, 4, 0, 0,
+  33, 43, 0, 29, 44, 0, 61, 29, 0, 0,
+  0, 0, 0, 31, 0, 0, 0, 4, 0, 29,
+  42, 0, 5, 76, 2, 0, 8, 14, 30, 0,
+  21, 0, 0, 0, 8, 15, 0, 0, 0, 0,
+  0, 0, 6, 2, 19, 0, 53, 0, 69, 0,
+  17, 0, 0, 62, 32, 0, 2, 1, 44, 3,
+  0, 0, 16, 4, 12, 0, 5, 53, 33, 30,
+  0, 74, 61, 0, 71, 46, 0, 36, 0, 3,
+  111, 34, 1, 0, 57, 0, 53, 22, 0, 16,
+  0, 48, 40, 30, 5, 36, 99, 16, 0, 12,
+  0, 8, 1, 0, 56, 0, 0, 0, 43, 0,
+  7, 33, 9, 0, 16, 0, 0, 0, 18, 21,
+  0, 0, 8, 32, 42, 43, 43, 31, 0, 15,
+  0, 0, 70, 13, 10, 0, 12, 12, 0, 0,
+  50, 9, 2, 0, 16, 0, 5, 73, 0, 0,
+  8, 21, 2, 0, 0, 16, 17, 0, 77, 9,
+  0, 22, 29, 1, 0, 33, 0, 0, 0, 15,
+  0, 33, 26, 0, 0, 0, 28, 0, 14, 0,
+  5, 45, 49, 8, 0, 13, 12, 23, 0, 0,
+  0, 49, 90, 0, 0, 29, 44, 13, 0, 25,
+  68, 58, 82, 13, 0, 0, 0, 11, 0, 0,
+  0, 0, 81, 0, 34, 31, 0, 20, 0, 59,
+  2, 29, 0, 28, 67, 52, 0, 60, 0, 43,
+  0, 42, 24, 0, 22, 0, 17, 0, 7, 0,
+  0, 0, 0, 9, 8, 0, 0, 0, 16, 0,
+  14, 13, 19, 19, 30, 0, 40, 53, 0, 19,
+  43, 0, 42, 0, 0, 11, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 33, 18, 0, 37, 45,
+  21, 0, 0, 23, 29, 0, 60, 0, 0, 7,
+  11, 13, 0, 17, 0, 0, 0, 0, 1, 9,
+  37, 0, 7, 0, 52, 0, 8, 2, 2, 29,
+  35, 14, 0, 2, 25, 15, 25, 0, 0, 41,
+  100, 0, 19, 33, 52, 0, 0, 0, 0, 93,
+  0, 8, 42, 0, 0, 23, 0, 0, 0, 43,
+  78, 0, 33, 0, 0, 18, 0, 68, 0, 56,
+  40, 13, 39, 47, 17, 12, 0, 48, 0, 63,
+  25, 25, 42, 0, 13, 0, 12, 0, 4, 7,
+  0, 68, 0, 15, 1, 0, 32, 0, 7, 15,
+  0, 11, 0, 0, 44, 48, 0, 33, 43, 0,
+  60, 25, 0, 0, 0, 0, 0, 17, 0, 0,
+  0, 3, 0, 32, 43, 0, 2, 82, 3, 0,
+  8, 22, 34, 0, 25, 0, 0, 0, 17, 10,
+  0, 0, 0, 0, 0, 0, 2, 15, 15, 5,
+  38, 0, 55, 0, 13, 0, 0, 74, 43, 0,
+  0, 0, 41, 0, 0, 0, 0, 15, 3, 0,
+  14, 72, 38, 47, 0, 64, 66, 0, 81, 51,
+  0, 26, 10, 14, 118, 35, 2, 0, 62, 0,
+  42, 8, 0, 26, 7, 52, 32, 25, 0, 26,
+  85, 30, 0, 8, 0, 25, 0, 13, 61, 0,
+  0, 0, 25, 0, 4, 20, 16, 0, 7, 0,
+  0, 0, 21, 2, 0, 0, 14, 32, 32, 38,
+  42, 30, 5, 5, 0, 0, 76, 3, 4, 0,
+  0, 15, 0, 0, 64, 23, 0, 0, 7, 0,
+  8, 49, 0, 0, 22, 10, 3, 0, 1, 17,
+  39, 0, 77, 0, 0, 43, 30, 0, 0, 41,
+  0, 0, 0, 3, 0, 15, 30, 0, 0, 0,
+  22, 0, 36, 0, 4, 47, 62, 10, 0, 19,
+  11, 10, 1, 0, 0, 51, 73, 0, 0, 33,
+  47, 24, 0, 20, 69, 64, 93, 12, 0, 0,
+  0, 23, 0, 0, 0, 0, 74, 0, 23, 28,
+  0, 28, 0, 48, 1, 24, 0, 19, 53, 57,
+  0, 57, 0, 37, 0, 54, 25, 0, 42, 0,
+  29, 0, 2, 0, 1, 0, 0, 20, 15, 0,
+  0, 0, 26, 0, 13, 15, 11, 22, 32, 0,
+  46, 51, 0, 12, 44, 0, 35, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
+  31, 0, 40, 41, 11, 0, 10, 24, 51, 0,
+  57, 0, 0, 3, 17, 15, 0, 12, 0, 0,
+  7, 0, 0, 7, 15, 4, 0, 0, 47, 0,
+  18, 0, 3, 30, 27, 20, 0, 12, 23, 23,
+  27, 0, 0, 40, 83, 0, 11, 31, 57, 0,
+  0, 0, 0, 92, 0, 1, 37, 0, 0, 25,
+  0, 0, 0, 50, 77, 0, 34, 0, 0, 19,
+  0, 54, 0, 46, 24, 10, 34, 52, 12, 15,
+  0, 33, 0, 55, 12, 26, 53, 0, 30, 0,
+  10, 0, 0, 13, 0, 58, 0, 13, 0, 0,
+  32, 0, 13, 16, 12, 11, 0, 0, 49, 39,
+  0, 32, 30, 0, 50, 41, 0, 0, 7, 0,
+  0, 13, 0, 0, 0, 16, 0, 30, 52, 0,
+  6, 80, 2, 0, 18, 20, 43, 0, 29, 0,
+  4, 0, 21, 11, 0, 0, 0, 0, 0, 0,
+  0, 11, 4, 11, 36, 0, 51, 0, 18, 0,
+  0, 48, 13, 14, 0, 0, 29, 34, 3, 0,
+  0, 37, 105, 0, 2, 11, 53, 15, 0, 14,
+  67, 51, 53, 17, 9, 0, 0, 9, 0, 0,
+  0, 0, 96, 0, 32, 9, 0, 24, 0, 75,
+  0, 32, 0, 38, 68, 64, 0, 61, 0, 41,
+  0, 28, 43, 1, 16, 0, 14, 0, 11, 0,
+  0, 0, 0, 18, 0, 0, 0, 0, 17, 0,
+  10, 2, 29, 20, 37, 0, 16, 39, 0, 22,
+  45, 0, 41, 0, 0, 0, 0, 0, 0, 7,
+  0, 0, 0, 7, 0, 48, 0, 0, 52, 46,
+  8, 0, 0, 12, 18, 0, 59, 0, 0, 16,
+  0, 17, 0, 17, 0, 0, 14, 0, 6, 8,
+  40, 0, 40, 0, 76, 0, 11, 0, 4, 29,
+  39, 21, 0, 5, 28, 2, 19, 0, 0, 34,
+  112, 0, 22, 39, 53, 0, 0, 0, 0, 83,
+  0, 10, 59, 0, 0, 23, 0, 0, 0, 41,
+  82, 0, 23, 0, 0, 23, 0, 78, 0, 55,
+  37, 22, 36, 48, 30, 16, 0, 54, 0, 60,
+  33, 24, 31, 0, 11, 0, 7, 0, 17, 0,
+  0, 63, 0, 10, 7, 0, 36, 0, 8, 20,
+  0, 4, 0, 0, 33, 43, 0, 29, 44, 0,
+  61, 29, 0, 0, 0, 0, 0, 31, 0, 0,
+  0, 4, 0, 29, 42, 0, 5, 76, 2, 0,
+  8, 14, 30, 0, 21, 0, 0, 0, 8, 15,
+  0, 0, 0, 0, 0, 0, 6, 2, 19, 0,
+  53, 0, 69, 0, 17, 0, 0, 0, 0, 10,
+  0, 139, 4, 0, 12, 0, 0, 18, 33, 0,
+  0, 25, 0, 0, 0, 0, 30, 95, 19, 11,
+  3, 0, 0, 0, 0, 0, 0, 27, 29, 38,
+  0, 0, 0, 23, 0, 54, 0, 22, 0, 53,
+  1, 90, 35, 56, 0, 0, 0, 51, 6, 0,
+  10, 0, 55, 0, 49, 0, 11, 61, 0, 0,
+  76, 3, 0, 3, 55, 0, 82, 11, 11, 0,
+  0, 21, 26, 25, 0, 32, 34, 0, 41, 44,
+  0, 0, 22, 0, 0, 7, 0, 21, 4, 0,
+  4, 31, 0, 0, 7, 66, 36, 0, 0, 23,
+  27, 0, 16, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 100, 2, 34, 1, 0, 0, 0, 0,
+  28, 0, 0, 0, 5, 45, 49, 8, 0, 13,
+  12, 23, 0, 0, 0, 49, 90, 0, 0, 29,
+  44, 13, 0, 25, 68, 58, 82, 13, 0, 0,
+  0, 11, 0, 0, 0, 0, 81, 0, 34, 31,
+  0, 20, 0, 59, 2, 29, 0, 28, 67, 52,
+  0, 60, 0, 43, 0, 42, 24, 0, 22, 0,
+  17, 0, 7, 0, 0, 0, 0, 9, 8, 0,
+  0, 0, 16, 0, 14, 13, 19, 19, 30, 0,
+  40, 53, 0, 19, 43, 0, 42, 0, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 33,
+  18, 0, 37, 45, 21, 0, 0, 23, 29, 0,
+  60, 0, 0, 7, 11, 13, 0, 17, 0, 0,
+  0, 0, 1, 9, 37, 0, 7, 0, 52, 0,
+  8, 2, 2, 29, 35, 14, 0, 2, 25, 15,
+  25, 0, 0, 41, 100, 0, 19, 33, 52, 0,
+  0, 0, 0, 93, 0, 8, 42, 0, 0, 23,
+  0, 0, 0, 43, 78, 0, 33, 0, 0, 18,
+  0, 68, 0, 56, 40, 13, 39, 47, 17, 12,
+  0, 48, 0, 63, 25, 25, 42, 0, 13, 0,
+  12, 0, 4, 7, 0, 68, 0, 15, 1, 0,
+  32, 0, 7, 15, 0, 11, 0, 0, 44, 48,
+  0, 33, 43, 0, 60, 25, 0, 0, 0, 0,
+  0, 17, 0, 0, 0, 3, 0, 32, 43, 0,
+  2, 82, 3, 0, 8, 22, 34, 0, 25, 0,
+  0, 0, 17, 10, 0, 0, 0, 0, 0, 0,
+  2, 15, 15, 5, 38, 0, 55, 0, 13, 0,
+  0, 0, 0, 2, 0, 130, 10, 0, 4, 0,
+  0, 17, 27, 0, 0, 13, 0, 0, 0, 0,
+  39, 101, 22, 12, 0, 0, 0, 0, 0, 3,
+  0, 24, 35, 28, 1, 0, 0, 22, 0, 43,
+  0, 20, 0, 45, 17, 92, 24, 56, 0, 1,
+  0, 50, 0, 0, 17, 0, 51, 0, 51, 0,
+  0, 57, 0, 0, 72, 8, 0, 8, 34, 0,
+  64, 5, 28, 6, 0, 15, 34, 35, 0, 21,
+  42, 0, 36, 58, 0, 0, 16, 0, 0, 0,
+  0, 14, 4, 0, 0, 35, 0, 0, 0, 63,
+  44, 0, 0, 33, 35, 0, 21, 0, 0, 0,
+  3, 0, 0, 32, 0, 0, 109, 11, 25, 17,
+  0, 0, 0, 0, 15, 0, 0, 0, 4, 47,
+  62, 10, 0, 19, 11, 10, 1, 0, 0, 51,
+  73, 0, 0, 33, 47, 24, 0, 20, 69, 64,
+  93, 12, 0, 0, 0, 23, 0, 0, 0, 0,
+  74, 0, 23, 28, 0, 28, 0, 48, 1, 24,
+  0, 19, 53, 57, 0, 57, 0, 37, 0, 54,
+  25, 0, 42, 0, 29, 0, 2, 0, 1, 0,
+  0, 20, 15, 0, 0, 0, 26, 0, 13, 15,
+  11, 22, 32, 0, 46, 51, 0, 12, 44, 0,
+  35, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 24, 31, 0, 40, 41, 11, 0,
+  10, 24, 51, 0, 57, 0, 0, 3, 17, 15,
+  0, 12, 0, 0, 7, 0, 0, 7, 15, 4,
+  0, 0, 47, 0, 18, 0, 3, 30, 27, 20,
+  0, 12, 23, 23, 27, 0, 0, 40, 83, 0,
+  11, 31, 57, 0, 0, 0, 0, 92, 0, 1,
+  37, 0, 0, 25, 0, 0, 0, 50, 77, 0,
+  34, 0, 0, 19, 0, 54, 0, 46, 24, 10,
+  34, 52, 12, 15, 0, 33, 0, 55, 12, 26,
+  53, 0, 30, 0, 10, 0, 0, 13, 0, 58,
+  0, 13, 0, 0, 32, 0, 13, 16, 12, 11,
+  0, 0, 49, 39, 0, 32, 30, 0, 50, 41,
+  0, 0, 7, 0, 0, 13, 0, 0, 0, 16,
+  0, 30, 52, 0, 6, 80, 2, 0, 18, 20,
+  43, 0, 29, 0, 4, 0, 21, 11, 0, 0,
+  0, 0, 0, 0, 0, 11, 4, 11, 36, 0,
+  51, 0, 18, 0, 0, 0, 0, 5, 0, 140,
+  8, 5, 3, 0, 0, 23, 36, 0, 0, 10,
+  2, 0, 0, 0, 35, 102, 17, 9, 0, 0,
+  0, 0, 0, 21, 0, 23, 35, 21, 4, 1,
+  0, 25, 0, 41, 0, 16, 0, 48, 13, 84,
+  13, 57, 0, 3, 0, 61, 0, 0, 24, 0,
+  45, 0, 39, 0, 0, 51, 0, 0, 78, 3,
+  0, 20, 24, 0, 67, 6, 31, 2, 0, 19,
+  16, 27, 0, 18, 39, 0, 33, 59, 0, 0,
+  10, 0, 0, 0, 0, 8, 0, 0, 12, 34,
+  0, 0, 0, 66, 43, 0, 0, 31, 31, 0,
+  26, 0, 0, 0, 14, 0, 0, 24, 0, 0,
+  117, 2, 21, 20, 0, 0, 0, 0, 24, 0,
+  0, 0, 4, 29, 39, 21, 0, 5, 28, 2,
+  19, 0, 0, 34, 112, 0, 22, 39, 53, 0,
+  0, 0, 0, 83, 0, 10, 59, 0, 0, 23,
+  0, 0, 0, 41, 82, 0, 23, 0, 0, 23,
+  0, 78, 0, 55, 37, 22, 36, 48, 30, 16,
+  0, 54, 0, 60, 33, 24, 31, 0, 11, 0,
+  7, 0, 17, 0, 0, 63, 0, 10, 7, 0,
+  36, 0, 8, 20, 0, 4, 0, 0, 33, 43,
+  0, 29, 44, 0, 61, 29, 0, 0, 0, 0,
+  0, 31, 0, 0, 0, 4, 0, 29, 42, 0,
+  5, 76, 2, 0, 8, 14, 30, 0, 21, 0,
+  0, 0, 8, 15, 0, 0, 0, 0, 0, 0,
+  6, 2, 19, 0, 53, 0, 69, 0, 17, 0,
+  0, 0, 0, 10, 0, 139, 4, 0, 12, 0,
+  0, 18, 33, 0, 0, 25, 0, 0, 0, 0,
+  30, 95, 19, 11, 3, 0, 0, 0, 0, 0,
+  0, 27, 29, 38, 0, 0, 0, 23, 0, 54,
+  0, 22, 0, 53, 1, 90, 35, 56, 0, 0,
+  0, 51, 6, 0, 10, 0, 55, 0, 49, 0,
+  11, 61, 0, 0, 76, 3, 0, 3, 55, 0,
+  82, 11, 11, 0, 0, 21, 26, 25, 0, 32,
+  34, 0, 41, 44, 0, 0, 22, 0, 0, 7,
+  0, 21, 4, 0, 4, 31, 0, 0, 7, 66,
+  36, 0, 0, 23, 27, 0, 16, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 100, 2, 34, 1,
+  0, 0, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 9, 38, 29, 0, 28, 0, 15, 0,
+  49, 21, 13, 59, 25, 11, 12, 5, 68, 0,
+  0, 42, 2, 24, 1, 0, 0, 35, 0, 0,
+  51, 61, 4, 0, 0, 0, 0, 42, 8, 38,
+  0, 45, 9, 26, 16, 31, 0, 20, 23, 0,
+  74, 24, 0, 0, 43, 0, 0, 56, 26, 7,
+  0, 0, 0, 0, 26, 8, 30, 0, 0, 7,
+  0, 8, 2, 45, 9, 0, 0, 52, 52, 14,
+  29, 21, 20, 0, 7, 19, 17, 28, 6, 32,
+  0, 6, 20, 41, 0, 0, 30, 59, 7, 0,
+  1, 0, 0, 0, 35, 0, 0, 25, 13, 0,
+  0, 13, 0, 0, 41, 20, 37, 0, 1, 0,
+  90, 0, 36, 0, 0, 0, 2, 29, 35, 14,
+  0, 2, 25, 15, 25, 0, 0, 41, 100, 0,
+  19, 33, 52, 0, 0, 0, 0, 93, 0, 8,
+  42, 0, 0, 23, 0, 0, 0, 43, 78, 0,
+  33, 0, 0, 18, 0, 68, 0, 56, 40, 13,
+  39, 47, 17, 12, 0, 48, 0, 63, 25, 25,
+  42, 0, 13, 0, 12, 0, 4, 7, 0, 68,
+  0, 15, 1, 0, 32, 0, 7, 15, 0, 11,
+  0, 0, 44, 48, 0, 33, 43, 0, 60, 25,
+  0, 0, 0, 0, 0, 17, 0, 0, 0, 3,
+  0, 32, 43, 0, 2, 82, 3, 0, 8, 22,
+  34, 0, 25, 0, 0, 0, 17, 10, 0, 0,
+  0, 0, 0, 0, 2, 15, 15, 5, 38, 0,
+  55, 0, 13, 0, 0, 0, 0, 2, 0, 130,
+  10, 0, 4, 0, 0, 17, 27, 0, 0, 13,
+  0, 0, 0, 0, 39, 101, 22, 12, 0, 0,
+  0, 0, 0, 3, 0, 24, 35, 28, 1, 0,
+  0, 22, 0, 43, 0, 20, 0, 45, 17, 92,
+  24, 56, 0, 1, 0, 50, 0, 0, 17, 0,
+  51, 0, 51, 0, 0, 57, 0, 0, 72, 8,
+  0, 8, 34, 0, 64, 5, 28, 6, 0, 15,
+  34, 35, 0, 21, 42, 0, 36, 58, 0, 0,
+  16, 0, 0, 0, 0, 14, 4, 0, 0, 35,
+  0, 0, 0, 63, 44, 0, 0, 33, 35, 0,
+  21, 0, 0, 0, 3, 0, 0, 32, 0, 0,
+  109, 11, 25, 17, 0, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 30, 33, 0,
+  19, 0, 21, 0, 43, 0, 16, 54, 29, 19,
+  0, 10, 66, 0, 0, 44, 0, 21, 4, 0,
+  0, 41, 0, 0, 53, 56, 9, 0, 0, 0,
+  0, 18, 0, 34, 0, 47, 24, 21, 4, 29,
+  0, 18, 41, 0, 75, 14, 0, 0, 37, 0,
+  0, 75, 15, 0, 0, 0, 0, 0, 34, 16,
+  0, 0, 0, 2, 0, 21, 12, 35, 14, 9,
+  0, 42, 59, 0, 15, 48, 23, 0, 5, 24,
+  11, 27, 9, 21, 0, 6, 17, 45, 0, 0,
+  9, 43, 26, 0, 0, 0, 17, 0, 51, 8,
+  2, 21, 33, 2, 0, 20, 0, 0, 46, 39,
+  44, 11, 0, 0, 80, 0, 29, 15, 0, 0,
+  3, 30, 27, 20, 0, 12, 23, 23, 27, 0,
+  0, 40, 83, 0, 11, 31, 57, 0, 0, 0,
+  0, 92, 0, 1, 37, 0, 0, 25, 0, 0,
+  0, 50, 77, 0, 34, 0, 0, 19, 0, 54,
+  0, 46, 24, 10, 34, 52, 12, 15, 0, 33,
+  0, 55, 12, 26, 53, 0, 30, 0, 10, 0,
+  0, 13, 0, 58, 0, 13, 0, 0, 32, 0,
+  13, 16, 12, 11, 0, 0, 49, 39, 0, 32,
+  30, 0, 50, 41, 0, 0, 7, 0, 0, 13,
+  0, 0, 0, 16, 0, 30, 52, 0, 6, 80,
+  2, 0, 18, 20, 43, 0, 29, 0, 4, 0,
+  21, 11, 0, 0, 0, 0, 0, 0, 0, 11,
+  4, 11, 36, 0, 51, 0, 18, 0, 0, 0,
+  0, 5, 0, 140, 8, 5, 3, 0, 0, 23,
+  36, 0, 0, 10, 2, 0, 0, 0, 35, 102,
+  17, 9, 0, 0, 0, 0, 0, 21, 0, 23,
+  35, 21, 4, 1, 0, 25, 0, 41, 0, 16,
+  0, 48, 13, 84, 13, 57, 0, 3, 0, 61,
+  0, 0, 24, 0, 45, 0, 39, 0, 0, 51,
+  0, 0, 78, 3, 0, 20, 24, 0, 67, 6,
+  31, 2, 0, 19, 16, 27, 0, 18, 39, 0,
+  33, 59, 0, 0, 10, 0, 0, 0, 0, 8,
+  0, 0, 12, 34, 0, 0, 0, 66, 43, 0,
+  0, 31, 31, 0, 26, 0, 0, 0, 14, 0,
+  0, 24, 0, 0, 117, 2, 21, 20, 0, 0,
+  0, 0, 24, 0, 0, 0, 0, 8, 0, 0,
+  0, 26, 43, 6, 20, 0, 13, 0, 59, 0,
+  10, 62, 36, 31, 3, 0, 46, 0, 0, 38,
+  0, 42, 6, 2, 0, 34, 0, 0, 63, 41,
+  15, 0, 0, 0, 0, 46, 0, 37, 0, 53,
+  25, 14, 17, 17, 0, 32, 15, 5, 91, 14,
+  0, 0, 28, 0, 0, 70, 0, 0, 0, 0,
+  0, 0, 24, 8, 0, 0, 0, 2, 0, 9,
+  17, 48, 0, 3, 0, 31, 71, 5, 13, 36,
+  17, 0, 4, 23, 26, 35, 36, 0, 0, 2,
+  17, 32, 0, 0, 2, 44, 36, 0, 0, 0,
+  12, 0, 55, 13, 24, 46, 43, 0, 0, 24,
+  0, 0, 42, 41, 44, 0, 0, 0, 108, 0,
+  71, 14, 0, 0, 0, 0, 0, 10, 0, 139,
+  4, 0, 12, 0, 0, 18, 33, 0, 0, 25,
+  0, 0, 0, 0, 30, 95, 19, 11, 3, 0,
+  0, 0, 0, 0, 0, 27, 29, 38, 0, 0,
+  0, 23, 0, 54, 0, 22, 0, 53, 1, 90,
+  35, 56, 0, 0, 0, 51, 6, 0, 10, 0,
+  55, 0, 49, 0, 11, 61, 0, 0, 76, 3,
+  0, 3, 55, 0, 82, 11, 11, 0, 0, 21,
+  26, 25, 0, 32, 34, 0, 41, 44, 0, 0,
+  22, 0, 0, 7, 0, 21, 4, 0, 4, 31,
+  0, 0, 7, 66, 36, 0, 0, 23, 27, 0,
+  16, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  100, 2, 34, 1, 0, 0, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 9, 38, 29, 0,
+  28, 0, 15, 0, 49, 21, 13, 59, 25, 11,
+  12, 5, 68, 0, 0, 42, 2, 24, 1, 0,
+  0, 35, 0, 0, 51, 61, 4, 0, 0, 0,
+  0, 42, 8, 38, 0, 45, 9, 26, 16, 31,
+  0, 20, 23, 0, 74, 24, 0, 0, 43, 0,
+  0, 56, 26, 7, 0, 0, 0, 0, 26, 8,
+  30, 0, 0, 7, 0, 8, 2, 45, 9, 0,
+  0, 52, 52, 14, 29, 21, 20, 0, 7, 19,
+  17, 28, 6, 32, 0, 6, 20, 41, 0, 0,
+  30, 59, 7, 0, 1, 0, 0, 0, 35, 0,
+  0, 25, 13, 0, 0, 13, 0, 0, 41, 20,
+  37, 0, 1, 0, 90, 0, 36, 0, 0, 0,
+  0, 41, 38, 0, 0, 0, 0, 0, 61, 6,
+  0, 16, 12, 19, 25, 54, 49, 37, 21, 5,
+  43, 0, 53, 32, 0, 0, 35, 21, 0, 0,
+  0, 0, 32, 0, 3, 0, 0, 0, 0, 35,
+  0, 0, 0, 27, 0, 26, 0, 0, 0, 15,
+  28, 3, 38, 9, 0, 0, 27, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 56, 0, 5, 0,
+  0, 0, 1, 44, 11, 11, 0, 62, 0, 23,
+  13, 12, 56, 44, 1, 24, 0, 29, 27, 31,
+  52, 10, 0, 0, 12, 0, 0, 0, 11, 51,
+  42, 0, 0, 0, 0, 0, 41, 0, 0, 48,
+  5, 0, 0, 10, 0, 0, 7, 0, 0, 0,
+  0, 0, 47, 0, 21, 0, 1, 20, 0, 0,
+  0, 2, 0, 130, 10, 0, 4, 0, 0, 17,
+  27, 0, 0, 13, 0, 0, 0, 0, 39, 101,
+  22, 12, 0, 0, 0, 0, 0, 3, 0, 24,
+  35, 28, 1, 0, 0, 22, 0, 43, 0, 20,
+  0, 45, 17, 92, 24, 56, 0, 1, 0, 50,
+  0, 0, 17, 0, 51, 0, 51, 0, 0, 57,
+  0, 0, 72, 8, 0, 8, 34, 0, 64, 5,
+  28, 6, 0, 15, 34, 35, 0, 21, 42, 0,
+  36, 58, 0, 0, 16, 0, 0, 0, 0, 14,
+  4, 0, 0, 35, 0, 0, 0, 63, 44, 0,
+  0, 33, 35, 0, 21, 0, 0, 0, 3, 0,
+  0, 32, 0, 0, 109, 11, 25, 17, 0, 0,
+  0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+  0, 30, 33, 0, 19, 0, 21, 0, 43, 0,
+  16, 54, 29, 19, 0, 10, 66, 0, 0, 44,
+  0, 21, 4, 0, 0, 41, 0, 0, 53, 56,
+  9, 0, 0, 0, 0, 18, 0, 34, 0, 47,
+  24, 21, 4, 29, 0, 18, 41, 0, 75, 14,
+  0, 0, 37, 0, 0, 75, 15, 0, 0, 0,
+  0, 0, 34, 16, 0, 0, 0, 2, 0, 21,
+  12, 35, 14, 9, 0, 42, 59, 0, 15, 48,
+  23, 0, 5, 24, 11, 27, 9, 21, 0, 6,
+  17, 45, 0, 0, 9, 43, 26, 0, 0, 0,
+  17, 0, 51, 8, 2, 21, 33, 2, 0, 20,
+  0, 0, 46, 39, 44, 11, 0, 0, 80, 0,
+  29, 15, 0, 0, 0, 47, 63, 0, 0, 0,
+  0, 0, 44, 1, 0, 11, 10, 3, 0, 58,
+  41, 16, 11, 0, 10, 0, 65, 40, 0, 0,
+  36, 16, 0, 0, 0, 0, 20, 0, 20, 14,
+  0, 0, 0, 16, 0, 3, 0, 22, 0, 2,
+  0, 0, 0, 1, 57, 3, 31, 0, 0, 0,
+  29, 0, 0, 14, 3, 0, 0, 0, 16, 0,
+  39, 2, 0, 0, 0, 0, 0, 49, 17, 0,
+  0, 86, 0, 30, 13, 0, 52, 56, 3, 30,
+  0, 29, 23, 24, 50, 0, 0, 0, 17, 0,
+  0, 0, 0, 53, 48, 0, 0, 0, 13, 0,
+  61, 0, 0, 31, 25, 0, 0, 5, 0, 0,
+  7, 0, 0, 16, 0, 0, 30, 0, 18, 13,
+  0, 31, 0, 0, 0, 5, 0, 140, 8, 5,
+  3, 0, 0, 23, 36, 0, 0, 10, 2, 0,
+  0, 0, 35, 102, 17, 9, 0, 0, 0, 0,
+  0, 21, 0, 23, 35, 21, 4, 1, 0, 25,
+  0, 41, 0, 16, 0, 48, 13, 84, 13, 57,
+  0, 3, 0, 61, 0, 0, 24, 0, 45, 0,
+  39, 0, 0, 51, 0, 0, 78, 3, 0, 20,
+  24, 0, 67, 6, 31, 2, 0, 19, 16, 27,
+  0, 18, 39, 0, 33, 59, 0, 0, 10, 0,
+  0, 0, 0, 8, 0, 0, 12, 34, 0, 0,
+  0, 66, 43, 0, 0, 31, 31, 0, 26, 0,
+  0, 0, 14, 0, 0, 24, 0, 0, 117, 2,
+  21, 20, 0, 0, 0, 0, 24, 0, 0, 0,
+  0, 8, 0, 0, 0, 26, 43, 6, 20, 0,
+  13, 0, 59, 0, 10, 62, 36, 31, 3, 0,
+  46, 0, 0, 38, 0, 42, 6, 2, 0, 34,
+  0, 0, 63, 41, 15, 0, 0, 0, 0, 46,
+  0, 37, 0, 53, 25, 14, 17, 17, 0, 32,
+  15, 5, 91, 14, 0, 0, 28, 0, 0, 70,
+  0, 0, 0, 0, 0, 0, 24, 8, 0, 0,
+  0, 2, 0, 9, 17, 48, 0, 3, 0, 31,
+  71, 5, 13, 36, 17, 0, 4, 23, 26, 35,
+  36, 0, 0, 2, 17, 32, 0, 0, 2, 44,
+  36, 0, 0, 0, 12, 0, 55, 13, 24, 46,
+  43, 0, 0, 24, 0, 0, 42, 41, 44, 0,
+  0, 0, 108, 0, 71, 14, 0, 0, 0, 44,
+  70, 0, 0, 0, 0, 9, 53, 0, 0, 29,
+  11, 20, 0, 36, 26, 0, 0, 0, 0, 7,
+  73, 51, 0, 0, 16, 18, 0, 0, 0, 0,
+  0, 0, 29, 22, 0, 0, 0, 40, 0, 13,
+  0, 10, 0, 1, 22, 0, 0, 0, 35, 32,
+  22, 15, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 20, 0, 30, 0, 2, 0, 0, 8,
+  3, 20, 33, 0, 0, 85, 0, 28, 19, 0,
+  42, 48, 0, 18, 0, 36, 33, 9, 46, 0,
+  0, 0, 8, 0, 0, 0, 0, 81, 37, 0,
+  0, 0, 25, 0, 70, 0, 22, 26, 14, 0,
+  0, 8, 0, 0, 28, 0, 0, 18, 0, 0,
+  19, 0, 44, 20, 0, 20, 0, 0, 0, 0,
+  9, 38, 29, 0, 28, 0, 15, 0, 49, 21,
+  13, 59, 25, 11, 12, 5, 68, 0, 0, 42,
+  2, 24, 1, 0, 0, 35, 0, 0, 51, 61,
+  4, 0, 0, 0, 0, 42, 8, 38, 0, 45,
+  9, 26, 16, 31, 0, 20, 23, 0, 74, 24,
+  0, 0, 43, 0, 0, 56, 26, 7, 0, 0,
+  0, 0, 26, 8, 30, 0, 0, 7, 0, 8,
+  2, 45, 9, 0, 0, 52, 52, 14, 29, 21,
+  20, 0, 7, 19, 17, 28, 6, 32, 0, 6,
+  20, 41, 0, 0, 30, 59, 7, 0, 1, 0,
+  0, 0, 35, 0, 0, 25, 13, 0, 0, 13,
+  0, 0, 41, 20, 37, 0, 1, 0, 90, 0,
+  36, 0, 0, 0, 0, 41, 38, 0, 0, 0,
+  0, 0, 61, 6, 0, 16, 12, 19, 25, 54,
+  49, 37, 21, 5, 43, 0, 53, 32, 0, 0,
+  35, 21, 0, 0, 0, 0, 32, 0, 3, 0,
+  0, 0, 0, 35, 0, 0, 0, 27, 0, 26,
+  0, 0, 0, 15, 28, 3, 38, 9, 0, 0,
+  27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  56, 0, 5, 0, 0, 0, 1, 44, 11, 11,
+  0, 62, 0, 23, 13, 12, 56, 44, 1, 24,
+  0, 29, 27, 31, 52, 10, 0, 0, 12, 0,
+  0, 0, 11, 51, 42, 0, 0, 0, 0, 0,
+  41, 0, 0, 48, 5, 0, 0, 10, 0, 0,
+  7, 0, 0, 0, 0, 0, 47, 0, 21, 0,
+  1, 20, 52, 0, 43, 0, 22, 0, 0, 0,
+  29, 0, 0, 0, 38, 88, 0, 0, 38, 0,
+  13, 0, 33, 104, 68, 26, 0, 0, 8, 50,
+  0, 0, 0, 10, 0, 4, 0, 0, 0, 20,
+  0, 11, 1, 0, 0, 0, 0, 16, 0, 0,
+  0, 7, 0, 77, 0, 0, 52, 0, 26, 23,
+  6, 0, 25, 0, 0, 6, 24, 0, 92, 16,
+  18, 73, 0, 0, 0, 73, 0, 0, 0, 50,
+  0, 0, 0, 0, 11, 59, 10, 49, 0, 55,
+  10, 0, 0, 37, 0, 0, 5, 0, 13, 0,
+  23, 61, 29, 7, 1, 0, 19, 2, 0, 26,
+  0, 53, 0, 7, 0, 0, 0, 23, 69, 0,
+  1, 0, 0, 31, 0, 0, 4, 0, 0, 61,
+  0, 0, 0, 0, 0, 30, 33, 0, 19, 0,
+  21, 0, 43, 0, 16, 54, 29, 19, 0, 10,
+  66, 0, 0, 44, 0, 21, 4, 0, 0, 41,
+  0, 0, 53, 56, 9, 0, 0, 0, 0, 18,
+  0, 34, 0, 47, 24, 21, 4, 29, 0, 18,
+  41, 0, 75, 14, 0, 0, 37, 0, 0, 75,
+  15, 0, 0, 0, 0, 0, 34, 16, 0, 0,
+  0, 2, 0, 21, 12, 35, 14, 9, 0, 42,
+  59, 0, 15, 48, 23, 0, 5, 24, 11, 27,
+  9, 21, 0, 6, 17, 45, 0, 0, 9, 43,
+  26, 0, 0, 0, 17, 0, 51, 8, 2, 21,
+  33, 2, 0, 20, 0, 0, 46, 39, 44, 11,
+  0, 0, 80, 0, 29, 15, 0, 0, 0, 47,
+  63, 0, 0, 0, 0, 0, 44, 1, 0, 11,
+  10, 3, 0, 58, 41, 16, 11, 0, 10, 0,
+  65, 40, 0, 0, 36, 16, 0, 0, 0, 0,
+  20, 0, 20, 14, 0, 0, 0, 16, 0, 3,
+  0, 22, 0, 2, 0, 0, 0, 1, 57, 3,
+  31, 0, 0, 0, 29, 0, 0, 14, 3, 0,
+  0, 0, 16, 0, 39, 2, 0, 0, 0, 0,
+  0, 49, 17, 0, 0, 86, 0, 30, 13, 0,
+  52, 56, 3, 30, 0, 29, 23, 24, 50, 0,
+  0, 0, 17, 0, 0, 0, 0, 53, 48, 0,
+  0, 0, 13, 0, 61, 0, 0, 31, 25, 0,
+  0, 5, 0, 0, 7, 0, 0, 16, 0, 0,
+  30, 0, 18, 13, 0, 31, 103, 0, 37, 5,
+  6, 15, 0, 0, 15, 0, 0, 23, 47, 54,
+  0, 0, 22, 0, 6, 0, 0, 173, 80, 13,
+  0, 0, 0, 33, 0, 0, 2, 56, 0, 34,
+  0, 21, 0, 29, 0, 25, 0, 22, 0, 0,
+  27, 6, 10, 8, 0, 0, 0, 77, 0, 0,
+  89, 0, 43, 20, 45, 0, 35, 11, 0, 32,
+  30, 49, 7, 15, 23, 23, 7, 28, 0, 22,
+  0, 0, 3, 45, 0, 13, 0, 0, 4, 42,
+  8, 27, 0, 9, 0, 0, 0, 0, 8, 0,
+  7, 0, 24, 0, 27, 61, 2, 0, 25, 0,
+  40, 28, 4, 8, 10, 35, 4, 0, 0, 0,
+  0, 15, 78, 0, 23, 10, 0, 35, 0, 0,
+  20, 3, 3, 48, 0, 8, 0, 0, 0, 26,
+  43, 6, 20, 0, 13, 0, 59, 0, 10, 62,
+  36, 31, 3, 0, 46, 0, 0, 38, 0, 42,
+  6, 2, 0, 34, 0, 0, 63, 41, 15, 0,
+  0, 0, 0, 46, 0, 37, 0, 53, 25, 14,
+  17, 17, 0, 32, 15, 5, 91, 14, 0, 0,
+  28, 0, 0, 70, 0, 0, 0, 0, 0, 0,
+  24, 8, 0, 0, 0, 2, 0, 9, 17, 48,
+  0, 3, 0, 31, 71, 5, 13, 36, 17, 0,
+  4, 23, 26, 35, 36, 0, 0, 2, 17, 32,
+  0, 0, 2, 44, 36, 0, 0, 0, 12, 0,
+  55, 13, 24, 46, 43, 0, 0, 24, 0, 0,
+  42, 41, 44, 0, 0, 0, 108, 0, 71, 14,
+  0, 0, 0, 44, 70, 0, 0, 0, 0, 9,
+  53, 0, 0, 29, 11, 20, 0, 36, 26, 0,
+  0, 0, 0, 7, 73, 51, 0, 0, 16, 18,
+  0, 0, 0, 0, 0, 0, 29, 22, 0, 0,
+  0, 40, 0, 13, 0, 10, 0, 1, 22, 0,
+  0, 0, 35, 32, 22, 15, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 20, 0, 30, 0,
+  2, 0, 0, 8, 3, 20, 33, 0, 0, 85,
+  0, 28, 19, 0, 42, 48, 0, 18, 0, 36,
+  33, 9, 46, 0, 0, 0, 8, 0, 0, 0,
+  0, 81, 37, 0, 0, 0, 25, 0, 70, 0,
+  22, 26, 14, 0, 0, 8, 0, 0, 28, 0,
+  0, 18, 0, 0, 19, 0, 44, 20, 0, 20,
+  102, 0, 40, 4, 0, 12, 0, 0, 45, 0,
+  0, 35, 56, 20, 0, 0, 9, 0, 0, 0,
+  0, 189, 80, 25, 0, 0, 0, 31, 0, 0,
+  16, 61, 0, 11, 0, 30, 0, 40, 0, 30,
+  0, 28, 48, 0, 38, 21, 24, 29, 0, 0,
+  0, 80, 0, 0, 100, 0, 63, 0, 47, 0,
+  14, 23, 0, 56, 27, 66, 0, 1, 0, 4,
+  12, 26, 10, 13, 0, 0, 0, 47, 0, 15,
+  0, 0, 7, 21, 0, 11, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 25, 0, 18, 61,
+  0, 0, 17, 0, 54, 23, 26, 12, 6, 14,
+  8, 6, 0, 0, 0, 2, 87, 0, 36, 39,
+  0, 9, 0, 0, 23, 15, 18, 29, 0, 41,
+  38, 0, 0, 0, 0, 0, 61, 6, 0, 16,
+  12, 19, 25, 54, 49, 37, 21, 5, 43, 0,
+  53, 32, 0, 0, 35, 21, 0, 0, 0, 0,
+  32, 0, 3, 0, 0, 0, 0, 35, 0, 0,
+  0, 27, 0, 26, 0, 0, 0, 15, 28, 3,
+  38, 9, 0, 0, 27, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 56, 0, 5, 0, 0, 0,
+  1, 44, 11, 11, 0, 62, 0, 23, 13, 12,
+  56, 44, 1, 24, 0, 29, 27, 31, 52, 10,
+  0, 0, 12, 0, 0, 0, 11, 51, 42, 0,
+  0, 0, 0, 0, 41, 0, 0, 48, 5, 0,
+  0, 10, 0, 0, 7, 0, 0, 0, 0, 0,
+  47, 0, 21, 0, 1, 20, 52, 0, 43, 0,
+  22, 0, 0, 0, 29, 0, 0, 0, 38, 88,
+  0, 0, 38, 0, 13, 0, 33, 104, 68, 26,
+  0, 0, 8, 50, 0, 0, 0, 10, 0, 4,
+  0, 0, 0, 20, 0, 11, 1, 0, 0, 0,
+  0, 16, 0, 0, 0, 7, 0, 77, 0, 0,
+  52, 0, 26, 23, 6, 0, 25, 0, 0, 6,
+  24, 0, 92, 16, 18, 73, 0, 0, 0, 73,
+  0, 0, 0, 50, 0, 0, 0, 0, 11, 59,
+  10, 49, 0, 55, 10, 0, 0, 37, 0, 0,
+  5, 0, 13, 0, 23, 61, 29, 7, 1, 0,
+  19, 2, 0, 26, 0, 53, 0, 7, 0, 0,
+  0, 23, 69, 0, 1, 0, 0, 31, 0, 0,
+  4, 0, 0, 61, 44, 0, 0, 0, 25, 73,
+  0, 0, 7, 0, 0, 0, 26, 81, 0, 0,
+  48, 0, 0, 0, 40, 70, 0, 48, 0, 0,
+  0, 16, 0, 0, 0, 0, 0, 39, 0, 0,
+  0, 36, 0, 27, 0, 6, 0, 0, 20, 1,
+  0, 24, 22, 0, 0, 39, 0, 0, 0, 0,
+  10, 25, 0, 0, 31, 12, 0, 4, 0, 0,
+  87, 23, 22, 30, 0, 6, 0, 43, 7, 0,
+  0, 5, 0, 16, 0, 0, 0, 7, 9, 33,
+  0, 49, 1, 0, 0, 56, 0, 0, 0, 0,
+  0, 0, 17, 64, 6, 22, 16, 0, 10, 13,
+  0, 13, 8, 65, 0, 0, 0, 0, 0, 16,
+  82, 0, 8, 0, 12, 7, 0, 0, 0, 7,
+  4, 20, 0, 47, 63, 0, 0, 0, 0, 0,
+  44, 1, 0, 11, 10, 3, 0, 58, 41, 16,
+  11, 0, 10, 0, 65, 40, 0, 0, 36, 16,
+  0, 0, 0, 0, 20, 0, 20, 14, 0, 0,
+  0, 16, 0, 3, 0, 22, 0, 2, 0, 0,
+  0, 1, 57, 3, 31, 0, 0, 0, 29, 0,
+  0, 14, 3, 0, 0, 0, 16, 0, 39, 2,
+  0, 0, 0, 0, 0, 49, 17, 0, 0, 86,
+  0, 30, 13, 0, 52, 56, 3, 30, 0, 29,
+  23, 24, 50, 0, 0, 0, 17, 0, 0, 0,
+  0, 53, 48, 0, 0, 0, 13, 0, 61, 0,
+  0, 31, 25, 0, 0, 5, 0, 0, 7, 0,
+  0, 16, 0, 0, 30, 0, 18, 13, 0, 31,
+  103, 0, 37, 5, 6, 15, 0, 0, 15, 0,
+  0, 23, 47, 54, 0, 0, 22, 0, 6, 0,
+  0, 173, 80, 13, 0, 0, 0, 33, 0, 0,
+  2, 56, 0, 34, 0, 21, 0, 29, 0, 25,
+  0, 22, 0, 0, 27, 6, 10, 8, 0, 0,
+  0, 77, 0, 0, 89, 0, 43, 20, 45, 0,
+  35, 11, 0, 32, 30, 49, 7, 15, 23, 23,
+  7, 28, 0, 22, 0, 0, 3, 45, 0, 13,
+  0, 0, 4, 42, 8, 27, 0, 9, 0, 0,
+  0, 0, 8, 0, 7, 0, 24, 0, 27, 61,
+  2, 0, 25, 0, 40, 28, 4, 8, 10, 35,
+  4, 0, 0, 0, 0, 15, 78, 0, 23, 10,
+  0, 35, 0, 0, 20, 3, 3, 48, 45, 0,
+  0, 0, 22, 82, 0, 0, 8, 0, 0, 0,
+  29, 61, 0, 8, 48, 0, 0, 0, 21, 71,
+  5, 41, 10, 3, 0, 14, 0, 2, 0, 9,
+  0, 69, 34, 19, 0, 41, 0, 34, 7, 20,
+  0, 34, 59, 23, 26, 10, 5, 0, 0, 0,
+  0, 0, 0, 0, 18, 22, 10, 15, 30, 39,
+  10, 0, 0, 0, 16, 36, 52, 0, 27, 32,
+  3, 0, 12, 28, 0, 21, 0, 48, 0, 2,
+  0, 34, 13, 5, 17, 11, 0, 25, 0, 47,
+  10, 1, 26, 5, 0, 0, 0, 67, 13, 0,
+  12, 0, 16, 0, 0, 15, 0, 51, 0, 0,
+  0, 0, 0, 0, 69, 0, 19, 0, 19, 11,
+  0, 0, 29, 2, 31, 0, 0, 44, 70, 0,
+  0, 0, 0, 9, 53, 0, 0, 29, 11, 20,
+  0, 36, 26, 0, 0, 0, 0, 7, 73, 51,
+  0, 0, 16, 18, 0, 0, 0, 0, 0, 0,
+  29, 22, 0, 0, 0, 40, 0, 13, 0, 10,
+  0, 1, 22, 0, 0, 0, 35, 32, 22, 15,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  20, 0, 30, 0, 2, 0, 0, 8, 3, 20,
+  33, 0, 0, 85, 0, 28, 19, 0, 42, 48,
+  0, 18, 0, 36, 33, 9, 46, 0, 0, 0,
+  8, 0, 0, 0, 0, 81, 37, 0, 0, 0,
+  25, 0, 70, 0, 22, 26, 14, 0, 0, 8,
+  0, 0, 28, 0, 0, 18, 0, 0, 19, 0,
+  44, 20, 0, 20, 102, 0, 40, 4, 0, 12,
+  0, 0, 45, 0, 0, 35, 56, 20, 0, 0,
+  9, 0, 0, 0, 0, 189, 80, 25, 0, 0,
+  0, 31, 0, 0, 16, 61, 0, 11, 0, 30,
+  0, 40, 0, 30, 0, 28, 48, 0, 38, 21,
+  24, 29, 0, 0, 0, 80, 0, 0, 100, 0,
+  63, 0, 47, 0, 14, 23, 0, 56, 27, 66,
+  0, 1, 0, 4, 12, 26, 10, 13, 0, 0,
+  0, 47, 0, 15, 0, 0, 7, 21, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  25, 0, 18, 61, 0, 0, 17, 0, 54, 23,
+  26, 12, 6, 14, 8, 6, 0, 0, 0, 2,
+  87, 0, 36, 39, 0, 9, 0, 0, 23, 15,
+  18, 29, 9, 0, 0, 9, 0, 65, 0, 0,
+  41, 0, 0, 0, 45, 38, 0, 38, 32, 25,
+  0, 0, 8, 14, 5, 56, 28, 0, 0, 19,
+  0, 0, 0, 21, 10, 40, 27, 4, 0, 33,
+  0, 8, 9, 4, 50, 58, 50, 77, 14, 17,
+  0, 0, 0, 0, 0, 0, 0, 0, 54, 0,
+  0, 0, 4, 43, 0, 0, 0, 0, 0, 0,
+  12, 0, 54, 0, 14, 11, 0, 28, 0, 28,
+  0, 28, 0, 16, 0, 39, 0, 0, 31, 0,
+  14, 62, 0, 63, 0, 0, 13, 17, 0, 0,
+  0, 56, 19, 0, 0, 0, 17, 0, 0, 4,
+  0, 40, 0, 0, 0, 9, 0, 0, 61, 0,
+  8, 0, 37, 0, 3, 0, 29, 10, 44, 0,
+  52, 0, 43, 0, 22, 0, 0, 0, 29, 0,
+  0, 0, 38, 88, 0, 0, 38, 0, 13, 0,
+  33, 104, 68, 26, 0, 0, 8, 50, 0, 0,
+  0, 10, 0, 4, 0, 0, 0, 20, 0, 11,
+  1, 0, 0, 0, 0, 16, 0, 0, 0, 7,
+  0, 77, 0, 0, 52, 0, 26, 23, 6, 0,
+  25, 0, 0, 6, 24, 0, 92, 16, 18, 73,
+  0, 0, 0, 73, 0, 0, 0, 50, 0, 0,
+  0, 0, 11, 59, 10, 49, 0, 55, 10, 0,
+  0, 37, 0, 0, 5, 0, 13, 0, 23, 61,
+  29, 7, 1, 0, 19, 2, 0, 26, 0, 53,
+  0, 7, 0, 0, 0, 23, 69, 0, 1, 0,
+  0, 31, 0, 0, 4, 0, 0, 61, 44, 0,
+  0, 0, 25, 73, 0, 0, 7, 0, 0, 0,
+  26, 81, 0, 0, 48, 0, 0, 0, 40, 70,
+  0, 48, 0, 0, 0, 16, 0, 0, 0, 0,
+  0, 39, 0, 0, 0, 36, 0, 27, 0, 6,
+  0, 0, 20, 1, 0, 24, 22, 0, 0, 39,
+  0, 0, 0, 0, 10, 25, 0, 0, 31, 12,
+  0, 4, 0, 0, 87, 23, 22, 30, 0, 6,
+  0, 43, 7, 0, 0, 5, 0, 16, 0, 0,
+  0, 7, 9, 33, 0, 49, 1, 0, 0, 56,
+  0, 0, 0, 0, 0, 0, 17, 64, 6, 22,
+  16, 0, 10, 13, 0, 13, 8, 65, 0, 0,
+  0, 0, 0, 16, 82, 0, 8, 0, 12, 7,
+  0, 0, 0, 7, 4, 20, 0, 17, 0, 0,
+  21, 28, 30, 14, 58, 16, 0, 5, 32, 30,
+  51, 35, 42, 53, 0, 21, 81, 0, 0, 49,
+  7, 50, 21, 0, 0, 19, 0, 0, 2, 16,
+  18, 0, 0, 7, 0, 43, 0, 40, 0, 33,
+  27, 19, 0, 12, 0, 0, 23, 0, 84, 2,
+  0, 0, 0, 0, 0, 29, 0, 0, 0, 0,
+  0, 0, 33, 0, 0, 0, 0, 25, 18, 30,
+  44, 27, 0, 0, 0, 44, 47, 23, 14, 0,
+  26, 7, 56, 14, 51, 35, 8, 27, 0, 39,
+  0, 19, 0, 4, 43, 43, 0, 0, 0, 0,
+  0, 0, 8, 13, 9, 61, 0, 0, 0, 0,
+  12, 0, 28, 21, 21, 0, 50, 0, 111, 0,
+  14, 14, 3, 0, 103, 0, 37, 5, 6, 15,
+  0, 0, 15, 0, 0, 23, 47, 54, 0, 0,
+  22, 0, 6, 0, 0, 173, 80, 13, 0, 0,
+  0, 33, 0, 0, 2, 56, 0, 34, 0, 21,
+  0, 29, 0, 25, 0, 22, 0, 0, 27, 6,
+  10, 8, 0, 0, 0, 77, 0, 0, 89, 0,
+  43, 20, 45, 0, 35, 11, 0, 32, 30, 49,
+  7, 15, 23, 23, 7, 28, 0, 22, 0, 0,
+  3, 45, 0, 13, 0, 0, 4, 42, 8, 27,
+  0, 9, 0, 0, 0, 0, 8, 0, 7, 0,
+  24, 0, 27, 61, 2, 0, 25, 0, 40, 28,
+  4, 8, 10, 35, 4, 0, 0, 0, 0, 15,
+  78, 0, 23, 10, 0, 35, 0, 0, 20, 3,
+  3, 48, 45, 0, 0, 0, 22, 82, 0, 0,
+  8, 0, 0, 0, 29, 61, 0, 8, 48, 0,
+  0, 0, 21, 71, 5, 41, 10, 3, 0, 14,
+  0, 2, 0, 9, 0, 69, 34, 19, 0, 41,
+  0, 34, 7, 20, 0, 34, 59, 23, 26, 10,
+  5, 0, 0, 0, 0, 0, 0, 0, 18, 22,
+  10, 15, 30, 39, 10, 0, 0, 0, 16, 36,
+  52, 0, 27, 32, 3, 0, 12, 28, 0, 21,
+  0, 48, 0, 2, 0, 34, 13, 5, 17, 11,
+  0, 25, 0, 47, 10, 1, 26, 5, 0, 0,
+  0, 67, 13, 0, 12, 0, 16, 0, 0, 15,
+  0, 51, 0, 0, 0, 0, 0, 0, 69, 0,
+  19, 0, 19, 11, 0, 0, 29, 2, 31, 0,
+  0, 24, 0, 0, 40, 11, 0, 0, 61, 11,
+  0, 15, 51, 85, 31, 58, 61, 16, 0, 9,
+  60, 0, 0, 53, 11, 51, 1, 8, 0, 10,
+  0, 0, 0, 42, 35, 0, 15, 23, 0, 51,
+  12, 18, 0, 69, 33, 20, 9, 0, 0, 0,
+  24, 0, 57, 28, 0, 0, 0, 2, 0, 18,
+  0, 0, 0, 0, 0, 0, 31, 0, 42, 0,
+  0, 0, 4, 14, 36, 12, 0, 6, 0, 29,
+  44, 60, 4, 0, 34, 12, 53, 16, 53, 25,
+  0, 50, 0, 27, 0, 9, 0, 0, 31, 64,
+  0, 0, 0, 0, 0, 0, 0, 12, 10, 60,
+  0, 0, 0, 0, 0, 0, 10, 13, 32, 0,
+  25, 0, 76, 0, 51, 15, 31, 0, 102, 0,
+  40, 4, 0, 12, 0, 0, 45, 0, 0, 35,
+  56, 20, 0, 0, 9, 0, 0, 0, 0, 189,
+  80, 25, 0, 0, 0, 31, 0, 0, 16, 61,
+  0, 11, 0, 30, 0, 40, 0, 30, 0, 28,
+  48, 0, 38, 21, 24, 29, 0, 0, 0, 80,
+  0, 0, 100, 0, 63, 0, 47, 0, 14, 23,
+  0, 56, 27, 66, 0, 1, 0, 4, 12, 26,
+  10, 13, 0, 0, 0, 47, 0, 15, 0, 0,
+  7, 21, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 25, 0, 18, 61, 0, 0,
+  17, 0, 54, 23, 26, 12, 6, 14, 8, 6,
+  0, 0, 0, 2, 87, 0, 36, 39, 0, 9,
+  0, 0, 23, 15, 18, 29, 9, 0, 0, 9,
+  0, 65, 0, 0, 41, 0, 0, 0, 45, 38,
+  0, 38, 32, 25, 0, 0, 8, 14, 5, 56,
+  28, 0, 0, 19, 0, 0, 0, 21, 10, 40,
+  27, 4, 0, 33, 0, 8, 9, 4, 50, 58,
+  50, 77, 14, 17, 0, 0, 0, 0, 0, 0,
+  0, 0, 54, 0, 0, 0, 4, 43, 0, 0,
+  0, 0, 0, 0, 12, 0, 54, 0, 14, 11,
+  0, 28, 0, 28, 0, 28, 0, 16, 0, 39,
+  0, 0, 31, 0, 14, 62, 0, 63, 0, 0,
+  13, 17, 0, 0, 0, 56, 19, 0, 0, 0,
+  17, 0, 0, 4, 0, 40, 0, 0, 0, 9,
+  0, 0, 61, 0, 8, 0, 37, 0, 3, 0,
+  29, 10, 44, 0, 0, 14, 0, 0, 35, 12,
+  0, 0, 40, 0, 0, 15, 31, 88, 14, 51,
+  40, 12, 0, 18, 47, 0, 19, 50, 3, 20,
+  0, 2, 0, 0, 0, 0, 0, 38, 7, 0,
+  3, 31, 0, 29, 36, 1, 0, 74, 29, 39,
+  8, 0, 0, 0, 18, 2, 39, 14, 0, 6,
+  37, 0, 0, 0, 0, 4, 5, 0, 0, 0,
+  26, 0, 49, 0, 0, 0, 3, 3, 17, 22,
+  0, 17, 0, 21, 27, 60, 0, 26, 24, 3,
+  57, 0, 52, 33, 0, 62, 14, 8, 23, 27,
+  0, 0, 26, 70, 5, 0, 0, 0, 0, 0,
+  0, 16, 0, 35, 0, 0, 0, 12, 0, 0,
+  17, 3, 26, 0, 0, 0, 20, 0, 35, 8,
+  37, 0, 44, 0, 0, 0, 25, 73, 0, 0,
+  7, 0, 0, 0, 26, 81, 0, 0, 48, 0,
+  0, 0, 40, 70, 0, 48, 0, 0, 0, 16,
+  0, 0, 0, 0, 0, 39, 0, 0, 0, 36,
+  0, 27, 0, 6, 0, 0, 20, 1, 0, 24,
+  22, 0, 0, 39, 0, 0, 0, 0, 10, 25,
+  0, 0, 31, 12, 0, 4, 0, 0, 87, 23,
+  22, 30, 0, 6, 0, 43, 7, 0, 0, 5,
+  0, 16, 0, 0, 0, 7, 9, 33, 0, 49,
+  1, 0, 0, 56, 0, 0, 0, 0, 0, 0,
+  17, 64, 6, 22, 16, 0, 10, 13, 0, 13,
+  8, 65, 0, 0, 0, 0, 0, 16, 82, 0,
+  8, 0, 12, 7, 0, 0, 0, 7, 4, 20,
+  0, 17, 0, 0, 21, 28, 30, 14, 58, 16,
+  0, 5, 32, 30, 51, 35, 42, 53, 0, 21,
+  81, 0, 0, 49, 7, 50, 21, 0, 0, 19,
+  0, 0, 2, 16, 18, 0, 0, 7, 0, 43,
+  0, 40, 0, 33, 27, 19, 0, 12, 0, 0,
+  23, 0, 84, 2, 0, 0, 0, 0, 0, 29,
+  0, 0, 0, 0, 0, 0, 33, 0, 0, 0,
+  0, 25, 18, 30, 44, 27, 0, 0, 0, 44,
+  47, 23, 14, 0, 26, 7, 56, 14, 51, 35,
+  8, 27, 0, 39, 0, 19, 0, 4, 43, 43,
+  0, 0, 0, 0, 0, 0, 8, 13, 9, 61,
+  0, 0, 0, 0, 12, 0, 28, 21, 21, 0,
+  50, 0, 111, 0, 14, 14, 3, 0, 0, 47,
+  23, 0, 8, 0, 33, 0, 55, 0, 0, 17,
+  28, 56, 45, 66, 49, 49, 0, 15, 78, 0,
+  0, 46, 13, 29, 27, 0, 0, 0, 14, 0,
+  11, 19, 4, 0, 0, 0, 0, 33, 12, 13,
+  0, 55, 6, 0, 0, 0, 0, 0, 63, 12,
+  64, 29, 0, 0, 0, 0, 0, 23, 0, 0,
+  0, 0, 0, 0, 42, 0, 0, 0, 0, 0,
+  0, 41, 36, 0, 0, 29, 0, 27, 65, 51,
+  36, 6, 50, 11, 55, 0, 58, 33, 0, 14,
+  0, 30, 0, 20, 0, 12, 43, 51, 0, 0,
+  0, 0, 0, 0, 5, 6, 14, 33, 30, 0,
+  0, 0, 41, 0, 0, 0, 5, 0, 0, 0,
+  81, 0, 6, 22, 17, 0, 45, 0, 0, 0,
+  22, 82, 0, 0, 8, 0, 0, 0, 29, 61,
+  0, 8, 48, 0, 0, 0, 21, 71, 5, 41,
+  10, 3, 0, 14, 0, 2, 0, 9, 0, 69,
+  34, 19, 0, 41, 0, 34, 7, 20, 0, 34,
+  59, 23, 26, 10, 5, 0, 0, 0, 0, 0,
+  0, 0, 18, 22, 10, 15, 30, 39, 10, 0,
+  0, 0, 16, 36, 52, 0, 27, 32, 3, 0,
+  12, 28, 0, 21, 0, 48, 0, 2, 0, 34,
+  13, 5, 17, 11, 0, 25, 0, 47, 10, 1,
+  26, 5, 0, 0, 0, 67, 13, 0, 12, 0,
+  16, 0, 0, 15, 0, 51, 0, 0, 0, 0,
+  0, 0, 69, 0, 19, 0, 19, 11, 0, 0,
+  29, 2, 31, 0, 0, 24, 0, 0, 40, 11,
+  0, 0, 61, 11, 0, 15, 51, 85, 31, 58,
+  61, 16, 0, 9, 60, 0, 0, 53, 11, 51,
+  1, 8, 0, 10, 0, 0, 0, 42, 35, 0,
+  15, 23, 0, 51, 12, 18, 0, 69, 33, 20,
+  9, 0, 0, 0, 24, 0, 57, 28, 0, 0,
+  0, 2, 0, 18, 0, 0, 0, 0, 0, 0,
+  31, 0, 42, 0, 0, 0, 4, 14, 36, 12,
+  0, 6, 0, 29, 44, 60, 4, 0, 34, 12,
+  53, 16, 53, 25, 0, 50, 0, 27, 0, 9,
+  0, 0, 31, 64, 0, 0, 0, 0, 0, 0,
+  0, 12, 10, 60, 0, 0, 0, 0, 0, 0,
+  10, 13, 32, 0, 25, 0, 76, 0, 51, 15,
+  31, 0, 0, 35, 50, 0, 10, 0, 0, 0,
+  51, 2, 0, 18, 8, 100, 10, 27, 39, 26,
+  2, 4, 44, 0, 34, 24, 0, 0, 0, 5,
+  0, 0, 0, 0, 0, 0, 0, 0, 5, 0,
+  0, 22, 18, 0, 0, 35, 0, 0, 0, 0,
+  0, 0, 52, 66, 0, 34, 0, 0, 6, 2,
+  0, 0, 0, 0, 13, 0, 38, 2, 22, 0,
+  23, 0, 0, 0, 3, 15, 29, 0, 0, 37,
+  0, 21, 32, 48, 11, 18, 40, 3, 53, 7,
+  75, 6, 0, 23, 0, 0, 0, 1, 0, 0,
+  40, 70, 1, 0, 0, 0, 7, 0, 0, 9,
+  0, 8, 32, 0, 0, 0, 57, 0, 10, 0,
+  12, 0, 0, 0, 8, 0, 9, 14, 37, 0,
+  9, 0, 0, 9, 0, 65, 0, 0, 41, 0,
+  0, 0, 45, 38, 0, 38, 32, 25, 0, 0,
+  8, 14, 5, 56, 28, 0, 0, 19, 0, 0,
+  0, 21, 10, 40, 27, 4, 0, 33, 0, 8,
+  9, 4, 50, 58, 50, 77, 14, 17, 0, 0,
+  0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
+  4, 43, 0, 0, 0, 0, 0, 0, 12, 0,
+  54, 0, 14, 11, 0, 28, 0, 28, 0, 28,
+  0, 16, 0, 39, 0, 0, 31, 0, 14, 62,
+  0, 63, 0, 0, 13, 17, 0, 0, 0, 56,
+  19, 0, 0, 0, 17, 0, 0, 4, 0, 40,
+  0, 0, 0, 9, 0, 0, 61, 0, 8, 0,
+  37, 0, 3, 0, 29, 10, 44, 0, 0, 14,
+  0, 0, 35, 12, 0, 0, 40, 0, 0, 15,
+  31, 88, 14, 51, 40, 12, 0, 18, 47, 0,
+  19, 50, 3, 20, 0, 2, 0, 0, 0, 0,
+  0, 38, 7, 0, 3, 31, 0, 29, 36, 1,
+  0, 74, 29, 39, 8, 0, 0, 0, 18, 2,
+  39, 14, 0, 6, 37, 0, 0, 0, 0, 4,
+  5, 0, 0, 0, 26, 0, 49, 0, 0, 0,
+  3, 3, 17, 22, 0, 17, 0, 21, 27, 60,
+  0, 26, 24, 3, 57, 0, 52, 33, 0, 62,
+  14, 8, 23, 27, 0, 0, 26, 70, 5, 0,
+  0, 0, 0, 0, 0, 16, 0, 35, 0, 0,
+  0, 12, 0, 0, 17, 3, 26, 0, 0, 0,
+  20, 0, 35, 8, 37, 0, 24, 0, 53, 0,
+  32, 0, 0, 0, 25, 0, 0, 1, 9, 122,
+  15, 0, 27, 21, 0, 8, 41, 13, 69, 7,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 5,
+  0, 0, 0, 4, 0, 26, 14, 10, 0, 48,
+  14, 0, 0, 0, 0, 0, 37, 104, 0, 37,
+  0, 0, 9, 6, 3, 0, 0, 0, 33, 0,
+  50, 22, 0, 0, 24, 22, 0, 1, 0, 0,
+  27, 0, 0, 13, 0, 41, 14, 36, 0, 5,
+  48, 0, 45, 11, 72, 0, 0, 2, 0, 0,
+  0, 25, 0, 0, 41, 57, 0, 0, 0, 0,
+  0, 0, 0, 10, 1, 0, 35, 0, 0, 0,
+  51, 0, 55, 0, 5, 0, 0, 0, 0, 0,
+  28, 1, 16, 0, 0, 17, 0, 0, 21, 28,
+  30, 14, 58, 16, 0, 5, 32, 30, 51, 35,
+  42, 53, 0, 21, 81, 0, 0, 49, 7, 50,
+  21, 0, 0, 19, 0, 0, 2, 16, 18, 0,
+  0, 7, 0, 43, 0, 40, 0, 33, 27, 19,
+  0, 12, 0, 0, 23, 0, 84, 2, 0, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
+  33, 0, 0, 0, 0, 25, 18, 30, 44, 27,
+  0, 0, 0, 44, 47, 23, 14, 0, 26, 7,
+  56, 14, 51, 35, 8, 27, 0, 39, 0, 19,
+  0, 4, 43, 43, 0, 0, 0, 0, 0, 0,
+  8, 13, 9, 61, 0, 0, 0, 0, 12, 0,
+  28, 21, 21, 0, 50, 0, 111, 0, 14, 14,
+  3, 0, 0, 47, 23, 0, 8, 0, 33, 0,
+  55, 0, 0, 17, 28, 56, 45, 66, 49, 49,
+  0, 15, 78, 0, 0, 46, 13, 29, 27, 0,
+  0, 0, 14, 0, 11, 19, 4, 0, 0, 0,
+  0, 33, 12, 13, 0, 55, 6, 0, 0, 0,
+  0, 0, 63, 12, 64, 29, 0, 0, 0, 0,
+  0, 23, 0, 0, 0, 0, 0, 0, 42, 0,
+  0, 0, 0, 0, 0, 41, 36, 0, 0, 29,
+  0, 27, 65, 51, 36, 6, 50, 11, 55, 0,
+  58, 33, 0, 14, 0, 30, 0, 20, 0, 12,
+  43, 51, 0, 0, 0, 0, 0, 0, 5, 6,
+  14, 33, 30, 0, 0, 0, 41, 0, 0, 0,
+  5, 0, 0, 0, 81, 0, 6, 22, 17, 0,
+  0, 43, 70, 0, 11, 0, 9, 0, 57, 6,
+  0, 0, 0, 60, 23, 63, 30, 38, 0, 12,
+  39, 0, 33, 35, 0, 0, 9, 14, 0, 0,
+  27, 0, 0, 0, 0, 0, 0, 17, 0, 12,
+  27, 0, 0, 40, 0, 0, 0, 0, 0, 0,
+  48, 52, 41, 12, 0, 0, 19, 12, 0, 0,
+  0, 0, 0, 0, 24, 0, 45, 0, 11, 4,
+  0, 0, 0, 28, 32, 0, 0, 18, 0, 0,
+  58, 19, 0, 21, 59, 13, 23, 9, 64, 10,
+  0, 32, 0, 0, 0, 0, 0, 0, 40, 51,
+  0, 0, 0, 0, 36, 0, 0, 22, 4, 24,
+  40, 0, 0, 0, 86, 0, 2, 0, 26, 0,
+  0, 1, 21, 0, 0, 24, 22, 0, 0, 24,
+  0, 0, 40, 11, 0, 0, 61, 11, 0, 15,
+  51, 85, 31, 58, 61, 16, 0, 9, 60, 0,
+  0, 53, 11, 51, 1, 8, 0, 10, 0, 0,
+  0, 42, 35, 0, 15, 23, 0, 51, 12, 18,
+  0, 69, 33, 20, 9, 0, 0, 0, 24, 0,
+  57, 28, 0, 0, 0, 2, 0, 18, 0, 0,
+  0, 0, 0, 0, 31, 0, 42, 0, 0, 0,
+  4, 14, 36, 12, 0, 6, 0, 29, 44, 60,
+  4, 0, 34, 12, 53, 16, 53, 25, 0, 50,
+  0, 27, 0, 9, 0, 0, 31, 64, 0, 0,
+  0, 0, 0, 0, 0, 12, 10, 60, 0, 0,
+  0, 0, 0, 0, 10, 13, 32, 0, 25, 0,
+  76, 0, 51, 15, 31, 0, 0, 35, 50, 0,
+  10, 0, 0, 0, 51, 2, 0, 18, 8, 100,
+  10, 27, 39, 26, 2, 4, 44, 0, 34, 24,
+  0, 0, 0, 5, 0, 0, 0, 0, 0, 0,
+  0, 0, 5, 0, 0, 22, 18, 0, 0, 35,
+  0, 0, 0, 0, 0, 0, 52, 66, 0, 34,
+  0, 0, 6, 2, 0, 0, 0, 0, 13, 0,
+  38, 2, 22, 0, 23, 0, 0, 0, 3, 15,
+  29, 0, 0, 37, 0, 21, 32, 48, 11, 18,
+  40, 3, 53, 7, 75, 6, 0, 23, 0, 0,
+  0, 1, 0, 0, 40, 70, 1, 0, 0, 0,
+  7, 0, 0, 9, 0, 8, 32, 0, 0, 0,
+  57, 0, 10, 0, 12, 0, 0, 0, 8, 0,
+  9, 14, 37, 0, 22, 0, 59, 0, 0, 0,
+  0, 0, 23, 0, 0, 0, 0, 116, 1, 0,
+  6, 27, 1, 0, 38, 30, 84, 8, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 2, 0, 0, 28, 17, 0, 30, 0, 0,
+  0, 0, 0, 0, 35, 131, 0, 15, 36, 0,
+  30, 17, 14, 0, 0, 0, 34, 0, 88, 47,
+  7, 2, 16, 67, 0, 0, 0, 0, 11, 0,
+  0, 0, 0, 24, 16, 22, 0, 15, 41, 0,
+  31, 10, 71, 0, 0, 11, 2, 0, 0, 5,
+  0, 0, 62, 66, 0, 0, 0, 0, 12, 10,
+  0, 7, 0, 0, 50, 0, 0, 0, 91, 3,
+  77, 0, 19, 0, 0, 0, 0, 0, 21, 6,
+  10, 0, 0, 14, 0, 0, 35, 12, 0, 0,
+  40, 0, 0, 15, 31, 88, 14, 51, 40, 12,
+  0, 18, 47, 0, 19, 50, 3, 20, 0, 2,
+  0, 0, 0, 0, 0, 38, 7, 0, 3, 31,
+  0, 29, 36, 1, 0, 74, 29, 39, 8, 0,
+  0, 0, 18, 2, 39, 14, 0, 6, 37, 0,
+  0, 0, 0, 4, 5, 0, 0, 0, 26, 0,
+  49, 0, 0, 0, 3, 3, 17, 22, 0, 17,
+  0, 21, 27, 60, 0, 26, 24, 3, 57, 0,
+  52, 33, 0, 62, 14, 8, 23, 27, 0, 0,
+  26, 70, 5, 0, 0, 0, 0, 0, 0, 16,
+  0, 35, 0, 0, 0, 12, 0, 0, 17, 3,
+  26, 0, 0, 0, 20, 0, 35, 8, 37, 0,
+  24, 0, 53, 0, 32, 0, 0, 0, 25, 0,
+  0, 1, 9, 122, 15, 0, 27, 21, 0, 8,
+  41, 13, 69, 7, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 5, 0, 0, 0, 4, 0, 26,
+  14, 10, 0, 48, 14, 0, 0, 0, 0, 0,
+  37, 104, 0, 37, 0, 0, 9, 6, 3, 0,
+  0, 0, 33, 0, 50, 22, 0, 0, 24, 22,
+  0, 1, 0, 0, 27, 0, 0, 13, 0, 41,
+  14, 36, 0, 5, 48, 0, 45, 11, 72, 0,
+  0, 2, 0, 0, 0, 25, 0, 0, 41, 57,
+  0, 0, 0, 0, 0, 0, 0, 10, 1, 0,
+  35, 0, 0, 0, 51, 0, 55, 0, 5, 0,
+  0, 0, 0, 0, 28, 1, 16, 0, 30, 0,
+  17, 10, 31, 0, 0, 0, 35, 0, 0, 3,
+  12, 104, 13, 0, 18, 16, 0, 5, 51, 0,
+  33, 3, 0, 0, 0, 16, 0, 15, 0, 9,
+  0, 7, 0, 0, 0, 0, 0, 7, 0, 12,
+  0, 50, 13, 0, 0, 0, 0, 0, 32, 102,
+  0, 61, 0, 0, 22, 15, 0, 0, 0, 0,
+  29, 0, 32, 22, 10, 15, 12, 12, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 33, 26, 38,
+  0, 3, 31, 0, 30, 10, 63, 12, 0, 0,
+  0, 0, 0, 25, 23, 0, 69, 64, 0, 0,
+  2, 0, 4, 5, 0, 9, 49, 0, 33, 0,
+  0, 3, 60, 0, 68, 0, 0, 0, 8, 0,
+  0, 0, 49, 3, 11, 0, 0, 47, 23, 0,
+  8, 0, 33, 0, 55, 0, 0, 17, 28, 56,
+  45, 66, 49, 49, 0, 15, 78, 0, 0, 46,
+  13, 29, 27, 0, 0, 0, 14, 0, 11, 19,
+  4, 0, 0, 0, 0, 33, 12, 13, 0, 55,
+  6, 0, 0, 0, 0, 0, 63, 12, 64, 29,
+  0, 0, 0, 0, 0, 23, 0, 0, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 0, 0, 41,
+  36, 0, 0, 29, 0, 27, 65, 51, 36, 6,
+  50, 11, 55, 0, 58, 33, 0, 14, 0, 30,
+  0, 20, 0, 12, 43, 51, 0, 0, 0, 0,
+  0, 0, 5, 6, 14, 33, 30, 0, 0, 0,
+  41, 0, 0, 0, 5, 0, 0, 0, 81, 0,
+  6, 22, 17, 0, 0, 43, 70, 0, 11, 0,
+  9, 0, 57, 6, 0, 0, 0, 60, 23, 63,
+  30, 38, 0, 12, 39, 0, 33, 35, 0, 0,
+  9, 14, 0, 0, 27, 0, 0, 0, 0, 0,
+  0, 17, 0, 12, 27, 0, 0, 40, 0, 0,
+  0, 0, 0, 0, 48, 52, 41, 12, 0, 0,
+  19, 12, 0, 0, 0, 0, 0, 0, 24, 0,
+  45, 0, 11, 4, 0, 0, 0, 28, 32, 0,
+  0, 18, 0, 0, 58, 19, 0, 21, 59, 13,
+  23, 9, 64, 10, 0, 32, 0, 0, 0, 0,
+  0, 0, 40, 51, 0, 0, 0, 0, 36, 0,
+  0, 22, 4, 24, 40, 0, 0, 0, 86, 0,
+  2, 0, 26, 0, 0, 1, 21, 0, 0, 24,
+  22, 0, 0, 1, 54, 0, 0, 0, 0, 0,
+  42, 0, 0, 7, 0, 86, 0, 0, 1, 43,
+  0, 15, 50, 15, 93, 16, 0, 0, 0, 18,
+  0, 0, 16, 0, 0, 0, 0, 0, 0, 25,
+  0, 0, 34, 33, 0, 35, 0, 0, 0, 17,
+  0, 0, 34, 96, 0, 0, 21, 0, 40, 0,
+  14, 0, 0, 2, 21, 0, 100, 23, 1, 3,
+  2, 71, 0, 0, 0, 0, 18, 0, 0, 0,
+  0, 0, 25, 5, 0, 25, 63, 0, 32, 16,
+  62, 0, 0, 28, 0, 0, 0, 0, 0, 0,
+  67, 44, 0, 0, 0, 0, 26, 0, 0, 29,
+  0, 5, 41, 0, 0, 0, 99, 0, 45, 0,
+  46, 0, 0, 13, 0, 0, 0, 6, 19, 0,
+  0, 35, 50, 0, 10, 0, 0, 0, 51, 2,
+  0, 18, 8, 100, 10, 27, 39, 26, 2, 4,
+  44, 0, 34, 24, 0, 0, 0, 5, 0, 0,
+  0, 0, 0, 0, 0, 0, 5, 0, 0, 22,
+  18, 0, 0, 35, 0, 0, 0, 0, 0, 0,
+  52, 66, 0, 34, 0, 0, 6, 2, 0, 0,
+  0, 0, 13, 0, 38, 2, 22, 0, 23, 0,
+  0, 0, 3, 15, 29, 0, 0, 37, 0, 21,
+  32, 48, 11, 18, 40, 3, 53, 7, 75, 6,
+  0, 23, 0, 0, 0, 1, 0, 0, 40, 70,
+  1, 0, 0, 0, 7, 0, 0, 9, 0, 8,
+  32, 0, 0, 0, 57, 0, 10, 0, 12, 0,
+  0, 0, 8, 0, 9, 14, 37, 0, 22, 0,
+  59, 0, 0, 0, 0, 0, 23, 0, 0, 0,
+  0, 116, 1, 0, 6, 27, 1, 0, 38, 30,
+  84, 8, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 2, 0, 0, 28, 17,
+  0, 30, 0, 0, 0, 0, 0, 0, 35, 131,
+  0, 15, 36, 0, 30, 17, 14, 0, 0, 0,
+  34, 0, 88, 47, 7, 2, 16, 67, 0, 0,
+  0, 0, 11, 0, 0, 0, 0, 24, 16, 22,
+  0, 15, 41, 0, 31, 10, 71, 0, 0, 11,
+  2, 0, 0, 5, 0, 0, 62, 66, 0, 0,
+  0, 0, 12, 10, 0, 7, 0, 0, 50, 0,
+  0, 0, 91, 3, 77, 0, 19, 0, 0, 0,
+  0, 0, 21, 6, 10, 0, 20, 0, 19, 16,
+  0, 0, 0, 0, 29, 0, 0, 0, 2, 73,
+  0, 0, 0, 28, 8, 5, 49, 5, 52, 6,
+  0, 0, 0, 7, 0, 12, 6, 1, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 29, 0, 45,
+  0, 0, 0, 16, 0, 0, 39, 114, 0, 30,
+  15, 0, 35, 10, 0, 0, 0, 0, 31, 0,
+  77, 23, 0, 26, 0, 48, 0, 8, 0, 0,
+  25, 0, 0, 0, 0, 24, 31, 18, 0, 15,
+  42, 0, 28, 19, 61, 0, 0, 0, 0, 0,
+  0, 9, 24, 0, 72, 41, 0, 0, 3, 0,
+  0, 0, 0, 13, 37, 0, 43, 0, 0, 5,
+  84, 0, 93, 0, 17, 0, 7, 5, 0, 0,
+  42, 4, 0, 0, 24, 0, 53, 0, 32, 0,
+  0, 0, 25, 0, 0, 1, 9, 122, 15, 0,
+  27, 21, 0, 8, 41, 13, 69, 7, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 5, 0, 0,
+  0, 4, 0, 26, 14, 10, 0, 48, 14, 0,
+  0, 0, 0, 0, 37, 104, 0, 37, 0, 0,
+  9, 6, 3, 0, 0, 0, 33, 0, 50, 22,
+  0, 0, 24, 22, 0, 1, 0, 0, 27, 0,
+  0, 13, 0, 41, 14, 36, 0, 5, 48, 0,
+  45, 11, 72, 0, 0, 2, 0, 0, 0, 25,
+  0, 0, 41, 57, 0, 0, 0, 0, 0, 0,
+  0, 10, 1, 0, 35, 0, 0, 0, 51, 0,
+  55, 0, 5, 0, 0, 0, 0, 0, 28, 1,
+  16, 0, 30, 0, 17, 10, 31, 0, 0, 0,
+  35, 0, 0, 3, 12, 104, 13, 0, 18, 16,
+  0, 5, 51, 0, 33, 3, 0, 0, 0, 16,
+  0, 15, 0, 9, 0, 7, 0, 0, 0, 0,
+  0, 7, 0, 12, 0, 50, 13, 0, 0, 0,
+  0, 0, 32, 102, 0, 61, 0, 0, 22, 15,
+  0, 0, 0, 0, 29, 0, 32, 22, 10, 15,
+  12, 12, 0, 0, 0, 0, 42, 0, 0, 0,
+  0, 33, 26, 38, 0, 3, 31, 0, 30, 10,
+  63, 12, 0, 0, 0, 0, 0, 25, 23, 0,
+  69, 64, 0, 0, 2, 0, 4, 5, 0, 9,
+  49, 0, 33, 0, 0, 3, 60, 0, 68, 0,
+  0, 0, 8, 0, 0, 0, 49, 3, 11, 0,
+  0, 22, 0, 46, 29, 0, 0, 10, 69, 0,
+  0, 23, 38, 83, 24, 20, 35, 2, 0, 9,
+  58, 0, 0, 0, 4, 48, 0, 23, 0, 8,
+  10, 0, 0, 43, 1, 0, 0, 4, 0, 24,
+  0, 21, 0, 69, 0, 0, 10, 17, 0, 0,
+  39, 72, 4, 92, 0, 0, 6, 27, 0, 37,
+  0, 0, 0, 0, 0, 8, 23, 24, 37, 0,
+  0, 3, 0, 0, 58, 0, 0, 14, 0, 39,
+  58, 70, 0, 0, 36, 5, 31, 21, 43, 20,
+  8, 4, 0, 16, 0, 28, 38, 0, 72, 48,
+  0, 0, 6, 0, 2, 0, 0, 22, 64, 11,
+  22, 0, 0, 9, 42, 0, 28, 0, 0, 0,
+  25, 29, 79, 0, 79, 5, 10, 0, 0, 43,
+  70, 0, 11, 0, 9, 0, 57, 6, 0, 0,
+  0, 60, 23, 63, 30, 38, 0, 12, 39, 0,
+  33, 35, 0, 0, 9, 14, 0, 0, 27, 0,
+  0, 0, 0, 0, 0, 17, 0, 12, 27, 0,
+  0, 40, 0, 0, 0, 0, 0, 0, 48, 52,
+  41, 12, 0, 0, 19, 12, 0, 0, 0, 0,
+  0, 0, 24, 0, 45, 0, 11, 4, 0, 0,
+  0, 28, 32, 0, 0, 18, 0, 0, 58, 19,
+  0, 21, 59, 13, 23, 9, 64, 10, 0, 32,
+  0, 0, 0, 0, 0, 0, 40, 51, 0, 0,
+  0, 0, 36, 0, 0, 22, 4, 24, 40, 0,
+  0, 0, 86, 0, 2, 0, 26, 0, 0, 1,
+  21, 0, 0, 24, 22, 0, 0, 1, 54, 0,
+  0, 0, 0, 0, 42, 0, 0, 7, 0, 86,
+  0, 0, 1, 43, 0, 15, 50, 15, 93, 16,
+  0, 0, 0, 18, 0, 0, 16, 0, 0, 0,
+  0, 0, 0, 25, 0, 0, 34, 33, 0, 35,
+  0, 0, 0, 17, 0, 0, 34, 96, 0, 0,
+  21, 0, 40, 0, 14, 0, 0, 2, 21, 0,
+  100, 23, 1, 3, 2, 71, 0, 0, 0, 0,
+  18, 0, 0, 0, 0, 0, 25, 5, 0, 25,
+  63, 0, 32, 16, 62, 0, 0, 28, 0, 0,
+  0, 0, 0, 0, 67, 44, 0, 0, 0, 0,
+  26, 0, 0, 29, 0, 5, 41, 0, 0, 0,
+  99, 0, 45, 0, 46, 0, 0, 13, 0, 0,
+  0, 6, 19, 0, 16, 0, 16, 11, 0, 0,
+  0, 0, 35, 0, 0, 25, 4, 106, 0, 0,
+  0, 36, 2, 10, 68, 10, 49, 2, 0, 0,
+  0, 0, 0, 0, 0, 2, 0, 9, 0, 0,
+  0, 0, 0, 0, 5, 41, 0, 45, 0, 0,
+  0, 31, 0, 0, 66, 127, 0, 42, 14, 0,
+  16, 0, 2, 0, 0, 0, 48, 0, 110, 32,
+  0, 9, 0, 60, 0, 11, 0, 0, 22, 0,
+  0, 0, 0, 41, 18, 32, 0, 0, 51, 0,
+  58, 18, 81, 0, 0, 0, 0, 0, 0, 12,
+  11, 0, 73, 49, 0, 0, 0, 0, 6, 0,
+  0, 8, 11, 0, 36, 0, 0, 0, 95, 0,
+  70, 0, 20, 0, 1, 0, 0, 0, 8, 0,
+  11, 0, 22, 0, 59, 0, 0, 0, 0, 0,
+  23, 0, 0, 0, 0, 116, 1, 0, 6, 27,
+  1, 0, 38, 30, 84, 8, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+  0, 0, 28, 17, 0, 30, 0, 0, 0, 0,
+  0, 0, 35, 131, 0, 15, 36, 0, 30, 17,
+  14, 0, 0, 0, 34, 0, 88, 47, 7, 2,
+  16, 67, 0, 0, 0, 0, 11, 0, 0, 0,
+  0, 24, 16, 22, 0, 15, 41, 0, 31, 10,
+  71, 0, 0, 11, 2, 0, 0, 5, 0, 0,
+  62, 66, 0, 0, 0, 0, 12, 10, 0, 7,
+  0, 0, 50, 0, 0, 0, 91, 3, 77, 0,
+  19, 0, 0, 0, 0, 0, 21, 6, 10, 0,
+  20, 0, 19, 16, 0, 0, 0, 0, 29, 0,
+  0, 0, 2, 73, 0, 0, 0, 28, 8, 5,
+  49, 5, 52, 6, 0, 0, 0, 7, 0, 12,
+  6, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 29, 0, 45, 0, 0, 0, 16, 0, 0,
+  39, 114, 0, 30, 15, 0, 35, 10, 0, 0,
+  0, 0, 31, 0, 77, 23, 0, 26, 0, 48,
+  0, 8, 0, 0, 25, 0, 0, 0, 0, 24,
+  31, 18, 0, 15, 42, 0, 28, 19, 61, 0,
+  0, 0, 0, 0, 0, 9, 24, 0, 72, 41,
+  0, 0, 3, 0, 0, 0, 0, 13, 37, 0,
+  43, 0, 0, 5, 84, 0, 93, 0, 17, 0,
+  7, 5, 0, 0, 42, 4, 0, 0, 3, 16,
+  0, 41, 1, 0, 4, 6, 70, 0, 0, 11,
+  25, 55, 18, 0, 14, 4, 17, 0, 52, 0,
+  0, 17, 0, 16, 4, 14, 0, 32, 2, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 25,
+  0, 53, 0, 0, 5, 16, 0, 0, 58, 87,
+  18, 68, 0, 0, 15, 25, 0, 19, 0, 0,
+  0, 0, 0, 11, 7, 13, 8, 0, 0, 9,
+  0, 0, 44, 3, 0, 0, 0, 43, 57, 57,
+  0, 0, 32, 0, 31, 33, 74, 29, 25, 0,
+  0, 0, 0, 11, 45, 0, 71, 48, 0, 0,
+  7, 0, 2, 0, 0, 12, 74, 6, 34, 0,
+  0, 0, 67, 0, 49, 0, 0, 0, 48, 9,
+  63, 0, 76, 0, 5, 0, 30, 0, 17, 10,
+  31, 0, 0, 0, 35, 0, 0, 3, 12, 104,
+  13, 0, 18, 16, 0, 5, 51, 0, 33, 3,
+  0, 0, 0, 16, 0, 15, 0, 9, 0, 7,
+  0, 0, 0, 0, 0, 7, 0, 12, 0, 50,
+  13, 0, 0, 0, 0, 0, 32, 102, 0, 61,
+  0, 0, 22, 15, 0, 0, 0, 0, 29, 0,
+  32, 22, 10, 15, 12, 12, 0, 0, 0, 0,
+  42, 0, 0, 0, 0, 33, 26, 38, 0, 3,
+  31, 0, 30, 10, 63, 12, 0, 0, 0, 0,
+  0, 25, 23, 0, 69, 64, 0, 0, 2, 0,
+  4, 5, 0, 9, 49, 0, 33, 0, 0, 3,
+  60, 0, 68, 0, 0, 0, 8, 0, 0, 0,
+  49, 3, 11, 0, 0, 22, 0, 46, 29, 0,
+  0, 10, 69, 0, 0, 23, 38, 83, 24, 20,
+  35, 2, 0, 9, 58, 0, 0, 0, 4, 48,
+  0, 23, 0, 8, 10, 0, 0, 43, 1, 0,
+  0, 4, 0, 24, 0, 21, 0, 69, 0, 0,
+  10, 17, 0, 0, 39, 72, 4, 92, 0, 0,
+  6, 27, 0, 37, 0, 0, 0, 0, 0, 8,
+  23, 24, 37, 0, 0, 3, 0, 0, 58, 0,
+  0, 14, 0, 39, 58, 70, 0, 0, 36, 5,
+  31, 21, 43, 20, 8, 4, 0, 16, 0, 28,
+  38, 0, 72, 48, 0, 0, 6, 0, 2, 0,
+  0, 22, 64, 11, 22, 0, 0, 9, 42, 0,
+  28, 0, 0, 0, 25, 29, 79, 0, 79, 5,
+  10, 0, 0, 19, 0, 49, 12, 0, 0, 25,
+  85, 2, 1, 7, 23, 85, 32, 34, 52, 0,
+  5, 0, 23, 0, 0, 0, 0, 25, 0, 34,
+  0, 0, 0, 0, 0, 25, 0, 0, 0, 0,
+  0, 23, 0, 6, 0, 46, 0, 0, 22, 18,
+  0, 0, 24, 75, 20, 83, 0, 0, 0, 46,
+  0, 19, 0, 0, 0, 0, 0, 30, 41, 0,
+  59, 0, 0, 0, 0, 12, 50, 0, 0, 9,
+  0, 32, 59, 63, 9, 0, 17, 31, 16, 61,
+  46, 0, 20, 36, 0, 0, 0, 9, 42, 0,
+  48, 63, 0, 0, 0, 0, 9, 0, 0, 19,
+  28, 6, 15, 0, 0, 0, 28, 0, 22, 0,
+  0, 0, 15, 1, 73, 0, 78, 3, 7, 0,
+  0, 1, 54, 0, 0, 0, 0, 0, 42, 0,
+  0, 7, 0, 86, 0, 0, 1, 43, 0, 15,
+  50, 15, 93, 16, 0, 0, 0, 18, 0, 0,
+  16, 0, 0, 0, 0, 0, 0, 25, 0, 0,
+  34, 33, 0, 35, 0, 0, 0, 17, 0, 0,
+  34, 96, 0, 0, 21, 0, 40, 0, 14, 0,
+  0, 2, 21, 0, 100, 23, 1, 3, 2, 71,
+  0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
+  25, 5, 0, 25, 63, 0, 32, 16, 62, 0,
+  0, 28, 0, 0, 0, 0, 0, 0, 67, 44,
+  0, 0, 0, 0, 26, 0, 0, 29, 0, 5,
+  41, 0, 0, 0, 99, 0, 45, 0, 46, 0,
+  0, 13, 0, 0, 0, 6, 19, 0, 16, 0,
+  16, 11, 0, 0, 0, 0, 35, 0, 0, 25,
+  4, 106, 0, 0, 0, 36, 2, 10, 68, 10,
+  49, 2, 0, 0, 0, 0, 0, 0, 0, 2,
+  0, 9, 0, 0, 0, 0, 0, 0, 5, 41,
+  0, 45, 0, 0, 0, 31, 0, 0, 66, 127,
+  0, 42, 14, 0, 16, 0, 2, 0, 0, 0,
+  48, 0, 110, 32, 0, 9, 0, 60, 0, 11,
+  0, 0, 22, 0, 0, 0, 0, 41, 18, 32,
+  0, 0, 51, 0, 58, 18, 81, 0, 0, 0,
+  0, 0, 0, 12, 11, 0, 73, 49, 0, 0,
+  0, 0, 6, 0, 0, 8, 11, 0, 36, 0,
+  0, 0, 95, 0, 70, 0, 20, 0, 1, 0,
+  0, 0, 8, 0, 11, 0, 7, 17, 0, 25,
+  21, 11, 0, 0, 61, 0, 0, 19, 7, 87,
+  0, 0, 0, 20, 13, 16, 69, 0, 0, 19,
+  0, 0, 0, 0, 0, 18, 0, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 18, 0, 55,
+  0, 0, 10, 38, 0, 0, 71, 103, 0, 69,
+  0, 0, 31, 9, 0, 0, 0, 0, 4, 0,
+  42, 20, 0, 14, 0, 7, 0, 2, 0, 0,
+  39, 0, 0, 0, 0, 43, 31, 45, 9, 0,
+  36, 0, 50, 45, 79, 24, 11, 1, 0, 0,
+  0, 13, 32, 0, 65, 65, 1, 23, 0, 0,
+  0, 0, 0, 13, 64, 0, 7, 0, 0, 0,
+  59, 0, 45, 0, 6, 0, 45, 0, 40, 0,
+  47, 0, 8, 0, 20, 0, 19, 16, 0, 0,
+  0, 0, 29, 0, 0, 0, 2, 73, 0, 0,
+  0, 28, 8, 5, 49, 5, 52, 6, 0, 0,
+  0, 7, 0, 12, 6, 1, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 29, 0, 45, 0, 0,
+  0, 16, 0, 0, 39, 114, 0, 30, 15, 0,
+  35, 10, 0, 0, 0, 0, 31, 0, 77, 23,
+  0, 26, 0, 48, 0, 8, 0, 0, 25, 0,
+  0, 0, 0, 24, 31, 18, 0, 15, 42, 0,
+  28, 19, 61, 0, 0, 0, 0, 0, 0, 9,
+  24, 0, 72, 41, 0, 0, 3, 0, 0, 0,
+  0, 13, 37, 0, 43, 0, 0, 5, 84, 0,
+  93, 0, 17, 0, 7, 5, 0, 0, 42, 4,
+  0, 0, 3, 16, 0, 41, 1, 0, 4, 6,
+  70, 0, 0, 11, 25, 55, 18, 0, 14, 4,
+  17, 0, 52, 0, 0, 17, 0, 16, 4, 14,
+  0, 32, 2, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 25, 0, 53, 0, 0, 5, 16,
+  0, 0, 58, 87, 18, 68, 0, 0, 15, 25,
+  0, 19, 0, 0, 0, 0, 0, 11, 7, 13,
+  8, 0, 0, 9, 0, 0, 44, 3, 0, 0,
+  0, 43, 57, 57, 0, 0, 32, 0, 31, 33,
+  74, 29, 25, 0, 0, 0, 0, 11, 45, 0,
+  71, 48, 0, 0, 7, 0, 2, 0, 0, 12,
+  74, 6, 34, 0, 0, 0, 67, 0, 49, 0,
+  0, 0, 48, 9, 63, 0, 76, 0, 5, 0,
+  0, 29, 0, 36, 17, 0, 0, 1, 82, 0,
+  0, 10, 14, 80, 41, 0, 22, 8, 10, 0,
+  47, 0, 0, 23, 0, 13, 0, 15, 0, 5,
+  0, 0, 0, 11, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 51, 0, 0, 23, 16, 0, 0,
+  35, 72, 21, 74, 0, 0, 3, 24, 0, 11,
+  0, 0, 0, 0, 0, 21, 29, 0, 30, 0,
+  0, 0, 0, 0, 58, 0, 0, 0, 0, 30,
+  56, 60, 4, 0, 25, 0, 29, 51, 61, 17,
+  7, 13, 0, 0, 0, 14, 29, 0, 67, 43,
+  0, 16, 0, 0, 10, 1, 0, 7, 54, 13,
+  18, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+  35, 0, 63, 0, 64, 0, 8, 0, 0, 22,
+  0, 46, 29, 0, 0, 10, 69, 0, 0, 23,
+  38, 83, 24, 20, 35, 2, 0, 9, 58, 0,
+  0, 0, 4, 48, 0, 23, 0, 8, 10, 0,
+  0, 43, 1, 0, 0, 4, 0, 24, 0, 21,
+  0, 69, 0, 0, 10, 17, 0, 0, 39, 72,
+  4, 92, 0, 0, 6, 27, 0, 37, 0, 0,
+  0, 0, 0, 8, 23, 24, 37, 0, 0, 3,
+  0, 0, 58, 0, 0, 14, 0, 39, 58, 70,
+  0, 0, 36, 5, 31, 21, 43, 20, 8, 4,
+  0, 16, 0, 28, 38, 0, 72, 48, 0, 0,
+  6, 0, 2, 0, 0, 22, 64, 11, 22, 0,
+  0, 9, 42, 0, 28, 0, 0, 0, 25, 29,
+  79, 0, 79, 5, 10, 0, 0, 19, 0, 49,
+  12, 0, 0, 25, 85, 2, 1, 7, 23, 85,
+  32, 34, 52, 0, 5, 0, 23, 0, 0, 0,
+  0, 25, 0, 34, 0, 0, 0, 0, 0, 25,
+  0, 0, 0, 0, 0, 23, 0, 6, 0, 46,
+  0, 0, 22, 18, 0, 0, 24, 75, 20, 83,
+  0, 0, 0, 46, 0, 19, 0, 0, 0, 0,
+  0, 30, 41, 0, 59, 0, 0, 0, 0, 12,
+  50, 0, 0, 9, 0, 32, 59, 63, 9, 0,
+  17, 31, 16, 61, 46, 0, 20, 36, 0, 0,
+  0, 9, 42, 0, 48, 63, 0, 0, 0, 0,
+  9, 0, 0, 19, 28, 6, 15, 0, 0, 0,
+  28, 0, 22, 0, 0, 0, 15, 1, 73, 0,
+  78, 3, 7, 0, 0, 4, 2, 46, 13, 0,
+  0, 32, 107, 4, 2, 0, 4, 83, 44, 32,
+  46, 4, 0, 0, 3, 0, 0, 10, 0, 0,
+  0, 35, 0, 0, 0, 0, 0, 15, 0, 0,
+  0, 0, 0, 24, 0, 0, 0, 32, 0, 0,
+  49, 17, 0, 0, 0, 80, 25, 73, 0, 0,
+  0, 50, 0, 3, 0, 0, 0, 0, 0, 35,
+  49, 0, 61, 9, 0, 0, 3, 17, 57, 9,
+  0, 0, 0, 10, 48, 46, 9, 0, 7, 32,
+  17, 79, 43, 0, 37, 35, 0, 0, 0, 5,
+  31, 0, 49, 67, 11, 1, 0, 0, 15, 0,
+  0, 19, 8, 3, 5, 0, 0, 0, 19, 0,
+  26, 0, 0, 0, 5, 0, 65, 0, 62, 0,
+  2, 0, 16, 0, 16, 11, 0, 0, 0, 0,
+  35, 0, 0, 25, 4, 106, 0, 0, 0, 36,
+  2, 10, 68, 10, 49, 2, 0, 0, 0, 0,
+  0, 0, 0, 2, 0, 9, 0, 0, 0, 0,
+  0, 0, 5, 41, 0, 45, 0, 0, 0, 31,
+  0, 0, 66, 127, 0, 42, 14, 0, 16, 0,
+  2, 0, 0, 0, 48, 0, 110, 32, 0, 9,
+  0, 60, 0, 11, 0, 0, 22, 0, 0, 0,
+  0, 41, 18, 32, 0, 0, 51, 0, 58, 18,
+  81, 0, 0, 0, 0, 0, 0, 12, 11, 0,
+  73, 49, 0, 0, 0, 0, 6, 0, 0, 8,
+  11, 0, 36, 0, 0, 0, 95, 0, 70, 0,
+  20, 0, 1, 0, 0, 0, 8, 0, 11, 0,
+  7, 17, 0, 25, 21, 11, 0, 0, 61, 0,
+  0, 19, 7, 87, 0, 0, 0, 20, 13, 16,
+  69, 0, 0, 19, 0, 0, 0, 0, 0, 18,
+  0, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 18, 0, 55, 0, 0, 10, 38, 0, 0,
+  71, 103, 0, 69, 0, 0, 31, 9, 0, 0,
+  0, 0, 4, 0, 42, 20, 0, 14, 0, 7,
+  0, 2, 0, 0, 39, 0, 0, 0, 0, 43,
+  31, 45, 9, 0, 36, 0, 50, 45, 79, 24,
+  11, 1, 0, 0, 0, 13, 32, 0, 65, 65,
+  1, 23, 0, 0, 0, 0, 0, 13, 64, 0,
+  7, 0, 0, 0, 59, 0, 45, 0, 6, 0,
+  45, 0, 40, 0, 47, 0, 8, 0, 0, 108,
+  0, 50, 20, 0, 23, 0, 76, 0, 5, 27,
+  31, 30, 12, 0, 0, 17, 12, 30, 55, 0,
+  0, 56, 13, 61, 39, 0, 0, 26, 15, 0,
+  27, 4, 0, 0, 0, 0, 0, 5, 0, 21,
+  0, 47, 11, 0, 10, 19, 0, 0, 54, 49,
+  57, 86, 0, 0, 20, 0, 0, 49, 9, 0,
+  0, 0, 0, 0, 32, 13, 0, 0, 0, 12,
+  0, 0, 51, 32, 0, 0, 0, 19, 65, 67,
+  24, 0, 19, 0, 39, 50, 52, 88, 74, 0,
+  0, 18, 0, 13, 42, 0, 60, 63, 11, 32,
+  0, 0, 0, 0, 14, 25, 123, 40, 2, 0,
+  0, 0, 13, 0, 5, 0, 0, 0, 42, 3,
+  144, 0, 86, 0, 0, 0, 3, 16, 0, 41,
+  1, 0, 4, 6, 70, 0, 0, 11, 25, 55,
+  18, 0, 14, 4, 17, 0, 52, 0, 0, 17,
+  0, 16, 4, 14, 0, 32, 2, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 25, 0, 53,
+  0, 0, 5, 16, 0, 0, 58, 87, 18, 68,
+  0, 0, 15, 25, 0, 19, 0, 0, 0, 0,
+  0, 11, 7, 13, 8, 0, 0, 9, 0, 0,
+  44, 3, 0, 0, 0, 43, 57, 57, 0, 0,
+  32, 0, 31, 33, 74, 29, 25, 0, 0, 0,
+  0, 11, 45, 0, 71, 48, 0, 0, 7, 0,
+  2, 0, 0, 12, 74, 6, 34, 0, 0, 0,
+  67, 0, 49, 0, 0, 0, 48, 9, 63, 0,
+  76, 0, 5, 0, 0, 29, 0, 36, 17, 0,
+  0, 1, 82, 0, 0, 10, 14, 80, 41, 0,
+  22, 8, 10, 0, 47, 0, 0, 23, 0, 13,
+  0, 15, 0, 5, 0, 0, 0, 11, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 51, 0, 0,
+  23, 16, 0, 0, 35, 72, 21, 74, 0, 0,
+  3, 24, 0, 11, 0, 0, 0, 0, 0, 21,
+  29, 0, 30, 0, 0, 0, 0, 0, 58, 0,
+  0, 0, 0, 30, 56, 60, 4, 0, 25, 0,
+  29, 51, 61, 17, 7, 13, 0, 0, 0, 14,
+  29, 0, 67, 43, 0, 16, 0, 0, 10, 1,
+  0, 7, 54, 13, 18, 0, 0, 0, 34, 0,
+  15, 0, 0, 0, 35, 0, 63, 0, 64, 0,
+  8, 0, 0, 64, 0, 40, 20, 0, 10, 0,
+  63, 0, 7, 15, 12, 65, 48, 6, 31, 34,
+  0, 25, 58, 0, 0, 21, 0, 36, 3, 4,
+  0, 0, 0, 0, 0, 32, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 41, 0, 0, 21, 22,
+  0, 0, 26, 26, 28, 76, 0, 0, 10, 4,
+  0, 25, 19, 0, 0, 0, 0, 11, 55, 3,
+  50, 0, 0, 0, 0, 0, 62, 0, 0, 0,
+  0, 3, 57, 69, 4, 0, 25, 19, 41, 29,
+  30, 12, 0, 34, 0, 1, 0, 24, 19, 0,
+  63, 30, 0, 19, 0, 0, 12, 0, 3, 1,
+  34, 21, 0, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 13, 75, 0, 41, 0, 17, 0,
+  0, 19, 0, 49, 12, 0, 0, 25, 85, 2,
+  1, 7, 23, 85, 32, 34, 52, 0, 5, 0,
+  23, 0, 0, 0, 0, 25, 0, 34, 0, 0,
+  0, 0, 0, 25, 0, 0, 0, 0, 0, 23,
+  0, 6, 0, 46, 0, 0, 22, 18, 0, 0,
+  24, 75, 20, 83, 0, 0, 0, 46, 0, 19,
+  0, 0, 0, 0, 0, 30, 41, 0, 59, 0,
+  0, 0, 0, 12, 50, 0, 0, 9, 0, 32,
+  59, 63, 9, 0, 17, 31, 16, 61, 46, 0,
+  20, 36, 0, 0, 0, 9, 42, 0, 48, 63,
+  0, 0, 0, 0, 9, 0, 0, 19, 28, 6,
+  15, 0, 0, 0, 28, 0, 22, 0, 0, 0,
+  15, 1, 73, 0, 78, 3, 7, 0, 0, 4,
+  2, 46, 13, 0, 0, 32, 107, 4, 2, 0,
+  4, 83, 44, 32, 46, 4, 0, 0, 3, 0,
+  0, 10, 0, 0, 0, 35, 0, 0, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 24, 0, 0,
+  0, 32, 0, 0, 49, 17, 0, 0, 0, 80,
+  25, 73, 0, 0, 0, 50, 0, 3, 0, 0,
+  0, 0, 0, 35, 49, 0, 61, 9, 0, 0,
+  3, 17, 57, 9, 0, 0, 0, 10, 48, 46,
+  9, 0, 7, 32, 17, 79, 43, 0, 37, 35,
+  0, 0, 0, 5, 31, 0, 49, 67, 11, 1,
+  0, 0, 15, 0, 0, 19, 8, 3, 5, 0,
+  0, 0, 19, 0, 26, 0, 0, 0, 5, 0,
+  65, 0, 62, 0, 2, 0, 0, 37, 0, 44,
+  22, 0, 8, 20, 82, 0, 25, 11, 12, 56,
+  55, 36, 59, 22, 0, 12, 31, 0, 0, 0,
+  1, 27, 0, 18, 0, 0, 0, 0, 0, 37,
+  0, 0, 0, 0, 0, 14, 0, 0, 0, 28,
+  0, 0, 38, 1, 0, 0, 0, 23, 0, 87,
+  0, 0, 4, 32, 0, 38, 0, 0, 0, 0,
+  0, 27, 62, 7, 79, 0, 0, 0, 0, 8,
+  73, 0, 0, 19, 6, 1, 28, 74, 0, 0,
+  22, 50, 31, 43, 10, 0, 10, 37, 0, 20,
+  0, 33, 31, 10, 59, 36, 0, 0, 0, 0,
+  17, 0, 0, 13, 9, 1, 0, 0, 0, 0,
+  9, 0, 0, 0, 0, 0, 0, 23, 74, 0,
+  31, 0, 36, 0, 7, 17, 0, 25, 21, 11,
+  0, 0, 61, 0, 0, 19, 7, 87, 0, 0,
+  0, 20, 13, 16, 69, 0, 0, 19, 0, 0,
+  0, 0, 0, 18, 0, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 18, 0, 55, 0, 0,
+  10, 38, 0, 0, 71, 103, 0, 69, 0, 0,
+  31, 9, 0, 0, 0, 0, 4, 0, 42, 20,
+  0, 14, 0, 7, 0, 2, 0, 0, 39, 0,
+  0, 0, 0, 43, 31, 45, 9, 0, 36, 0,
+  50, 45, 79, 24, 11, 1, 0, 0, 0, 13,
+  32, 0, 65, 65, 1, 23, 0, 0, 0, 0,
+  0, 13, 64, 0, 7, 0, 0, 0, 59, 0,
+  45, 0, 6, 0, 45, 0, 40, 0, 47, 0,
+  8, 0, 0, 108, 0, 50, 20, 0, 23, 0,
+  76, 0, 5, 27, 31, 30, 12, 0, 0, 17,
+  12, 30, 55, 0, 0, 56, 13, 61, 39, 0,
+  0, 26, 15, 0, 27, 4, 0, 0, 0, 0,
+  0, 5, 0, 21, 0, 47, 11, 0, 10, 19,
+  0, 0, 54, 49, 57, 86, 0, 0, 20, 0,
+  0, 49, 9, 0, 0, 0, 0, 0, 32, 13,
+  0, 0, 0, 12, 0, 0, 51, 32, 0, 0,
+  0, 19, 65, 67, 24, 0, 19, 0, 39, 50,
+  52, 88, 74, 0, 0, 18, 0, 13, 42, 0,
+  60, 63, 11, 32, 0, 0, 0, 0, 14, 25,
+  123, 40, 2, 0, 0, 0, 13, 0, 5, 0,
+  0, 0, 42, 3, 144, 0, 86, 0, 0, 0,
+  0, 155, 0, 57, 4, 0, 35, 0, 65, 0,
+  13, 22, 77, 0, 0, 0, 0, 12, 22, 43,
+  12, 0, 0, 61, 29, 33, 73, 13, 3, 0,
+  36, 0, 52, 0, 38, 0, 0, 0, 0, 0,
+  0, 22, 0, 53, 11, 0, 16, 0, 0, 0,
+  43, 52, 47, 51, 11, 17, 36, 0, 0, 49,
+  1, 0, 0, 0, 0, 0, 2, 16, 0, 0,
+  11, 34, 0, 0, 39, 55, 0, 69, 4, 0,
+  37, 56, 49, 10, 11, 0, 0, 58, 72, 93,
+  137, 0, 0, 11, 0, 0, 57, 0, 44, 81,
+  42, 39, 0, 0, 0, 0, 27, 70, 152, 18,
+  4, 0, 17, 10, 0, 0, 0, 0, 0, 0,
+  3, 0, 133, 2, 119, 5, 0, 0, 0, 29,
+  0, 36, 17, 0, 0, 1, 82, 0, 0, 10,
+  14, 80, 41, 0, 22, 8, 10, 0, 47, 0,
+  0, 23, 0, 13, 0, 15, 0, 5, 0, 0,
+  0, 11, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 51, 0, 0, 23, 16, 0, 0, 35, 72,
+  21, 74, 0, 0, 3, 24, 0, 11, 0, 0,
+  0, 0, 0, 21, 29, 0, 30, 0, 0, 0,
+  0, 0, 58, 0, 0, 0, 0, 30, 56, 60,
+  4, 0, 25, 0, 29, 51, 61, 17, 7, 13,
+  0, 0, 0, 14, 29, 0, 67, 43, 0, 16,
+  0, 0, 10, 1, 0, 7, 54, 13, 18, 0,
+  0, 0, 34, 0, 15, 0, 0, 0, 35, 0,
+  63, 0, 64, 0, 8, 0, 0, 64, 0, 40,
+  20, 0, 10, 0, 63, 0, 7, 15, 12, 65,
+  48, 6, 31, 34, 0, 25, 58, 0, 0, 21,
+  0, 36, 3, 4, 0, 0, 0, 0, 0, 32,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 41,
+  0, 0, 21, 22, 0, 0, 26, 26, 28, 76,
+  0, 0, 10, 4, 0, 25, 19, 0, 0, 0,
+  0, 11, 55, 3, 50, 0, 0, 0, 0, 0,
+  62, 0, 0, 0, 0, 3, 57, 69, 4, 0,
+  25, 19, 41, 29, 30, 12, 0, 34, 0, 1,
+  0, 24, 19, 0, 63, 30, 0, 19, 0, 0,
+  12, 0, 3, 1, 34, 21, 0, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 13, 75, 0,
+  41, 0, 17, 0, 0, 151, 1, 57, 8, 0,
+  17, 0, 42, 0, 26, 0, 19, 37, 38, 18,
+  29, 7, 6, 53, 10, 0, 0, 24, 1, 37,
+  15, 7, 0, 0, 0, 0, 46, 5, 0, 0,
+  0, 0, 0, 1, 0, 2, 0, 21, 0, 0,
+  21, 42, 0, 0, 40, 0, 12, 89, 0, 0,
+  18, 1, 0, 44, 24, 0, 0, 0, 0, 0,
+  73, 21, 53, 0, 0, 0, 0, 8, 68, 12,
+  0, 35, 0, 18, 49, 62, 21, 11, 30, 33,
+  16, 49, 19, 13, 53, 22, 0, 17, 0, 5,
+  44, 0, 24, 80, 3, 46, 0, 0, 12, 0,
+  22, 12, 52, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 89, 0, 51, 0,
+  16, 1, 0, 4, 2, 46, 13, 0, 0, 32,
+  107, 4, 2, 0, 4, 83, 44, 32, 46, 4,
+  0, 0, 3, 0, 0, 10, 0, 0, 0, 35,
+  0, 0, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 24, 0, 0, 0, 32, 0, 0, 49, 17,
+  0, 0, 0, 80, 25, 73, 0, 0, 0, 50,
+  0, 3, 0, 0, 0, 0, 0, 35, 49, 0,
+  61, 9, 0, 0, 3, 17, 57, 9, 0, 0,
+  0, 10, 48, 46, 9, 0, 7, 32, 17, 79,
+  43, 0, 37, 35, 0, 0, 0, 5, 31, 0,
+  49, 67, 11, 1, 0, 0, 15, 0, 0, 19,
+  8, 3, 5, 0, 0, 0, 19, 0, 26, 0,
+  0, 0, 5, 0, 65, 0, 62, 0, 2, 0,
+  0, 37, 0, 44, 22, 0, 8, 20, 82, 0,
+  25, 11, 12, 56, 55, 36, 59, 22, 0, 12,
+  31, 0, 0, 0, 1, 27, 0, 18, 0, 0,
+  0, 0, 0, 37, 0, 0, 0, 0, 0, 14,
+  0, 0, 0, 28, 0, 0, 38, 1, 0, 0,
+  0, 23, 0, 87, 0, 0, 4, 32, 0, 38,
+  0, 0, 0, 0, 0, 27, 62, 7, 79, 0,
+  0, 0, 0, 8, 73, 0, 0, 19, 6, 1,
+  28, 74, 0, 0, 22, 50, 31, 43, 10, 0,
+  10, 37, 0, 20, 0, 33, 31, 10, 59, 36,
+  0, 0, 0, 0, 17, 0, 0, 13, 9, 1,
+  0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+  0, 23, 74, 0, 31, 0, 36, 0, 0, 74,
+  18, 48, 36, 0, 9, 0, 60, 0, 36, 0,
+  0, 63, 66, 33, 53, 1, 1, 40, 5, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
+  0, 33, 0, 0, 0, 0, 0, 13, 0, 0,
+  0, 7, 0, 0, 40, 19, 0, 0, 0, 0,
+  0, 107, 0, 0, 12, 52, 0, 31, 0, 27,
+  0, 0, 0, 19, 66, 8, 85, 0, 0, 0,
+  0, 0, 65, 0, 0, 12, 15, 13, 23, 55,
+  0, 0, 38, 70, 22, 57, 6, 0, 10, 41,
+  0, 20, 0, 27, 34, 9, 25, 65, 0, 0,
+  0, 0, 11, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  46, 0, 22, 0, 42, 0, 0, 108, 0, 50,
+  20, 0, 23, 0, 76, 0, 5, 27, 31, 30,
+  12, 0, 0, 17, 12, 30, 55, 0, 0, 56,
+  13, 61, 39, 0, 0, 26, 15, 0, 27, 4,
+  0, 0, 0, 0, 0, 5, 0, 21, 0, 47,
+  11, 0, 10, 19, 0, 0, 54, 49, 57, 86,
+  0, 0, 20, 0, 0, 49, 9, 0, 0, 0,
+  0, 0, 32, 13, 0, 0, 0, 12, 0, 0,
+  51, 32, 0, 0, 0, 19, 65, 67, 24, 0,
+  19, 0, 39, 50, 52, 88, 74, 0, 0, 18,
+  0, 13, 42, 0, 60, 63, 11, 32, 0, 0,
+  0, 0, 14, 25, 123, 40, 2, 0, 0, 0,
+  13, 0, 5, 0, 0, 0, 42, 3, 144, 0,
+  86, 0, 0, 0, 0, 155, 0, 57, 4, 0,
+  35, 0, 65, 0, 13, 22, 77, 0, 0, 0,
+  0, 12, 22, 43, 12, 0, 0, 61, 29, 33,
+  73, 13, 3, 0, 36, 0, 52, 0, 38, 0,
+  0, 0, 0, 0, 0, 22, 0, 53, 11, 0,
+  16, 0, 0, 0, 43, 52, 47, 51, 11, 17,
+  36, 0, 0, 49, 1, 0, 0, 0, 0, 0,
+  2, 16, 0, 0, 11, 34, 0, 0, 39, 55,
+  0, 69, 4, 0, 37, 56, 49, 10, 11, 0,
+  0, 58, 72, 93, 137, 0, 0, 11, 0, 0,
+  57, 0, 44, 81, 42, 39, 0, 0, 0, 0,
+  27, 70, 152, 18, 4, 0, 17, 10, 0, 0,
+  0, 0, 0, 0, 3, 0, 133, 2, 119, 5,
+  0, 0, 21, 77, 0, 54, 0, 57, 1, 0,
+  24, 0, 0, 9, 43, 0, 0, 0, 0, 20,
+  47, 27, 0, 27, 1, 0, 0, 0, 69, 0,
+  0, 0, 4, 19, 15, 0, 32, 49, 0, 0,
+  3, 0, 0, 7, 0, 34, 8, 10, 16, 0,
+  0, 0, 3, 45, 0, 0, 93, 35, 51, 0,
+  0, 0, 0, 53, 20, 0, 103, 0, 0, 43,
+  0, 68, 175, 29, 22, 0, 0, 35, 0, 61,
+  4, 6, 0, 0, 64, 5, 21, 0, 0, 19,
+  51, 0, 81, 0, 0, 0, 7, 0, 55, 0,
+  12, 95, 28, 106, 1, 0, 0, 0, 4, 67,
+  71, 0, 2, 16, 0, 39, 0, 0, 0, 0,
+  25, 0, 0, 0, 0, 18, 65, 17, 0, 0,
+  0, 64, 0, 40, 20, 0, 10, 0, 63, 0,
+  7, 15, 12, 65, 48, 6, 31, 34, 0, 25,
+  58, 0, 0, 21, 0, 36, 3, 4, 0, 0,
+  0, 0, 0, 32, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 41, 0, 0, 21, 22, 0, 0,
+  26, 26, 28, 76, 0, 0, 10, 4, 0, 25,
+  19, 0, 0, 0, 0, 11, 55, 3, 50, 0,
+  0, 0, 0, 0, 62, 0, 0, 0, 0, 3,
+  57, 69, 4, 0, 25, 19, 41, 29, 30, 12,
+  0, 34, 0, 1, 0, 24, 19, 0, 63, 30,
+  0, 19, 0, 0, 12, 0, 3, 1, 34, 21,
+  0, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 13, 75, 0, 41, 0, 17, 0, 0, 151,
+  1, 57, 8, 0, 17, 0, 42, 0, 26, 0,
+  19, 37, 38, 18, 29, 7, 6, 53, 10, 0,
+  0, 24, 1, 37, 15, 7, 0, 0, 0, 0,
+  46, 5, 0, 0, 0, 0, 0, 1, 0, 2,
+  0, 21, 0, 0, 21, 42, 0, 0, 40, 0,
+  12, 89, 0, 0, 18, 1, 0, 44, 24, 0,
+  0, 0, 0, 0, 73, 21, 53, 0, 0, 0,
+  0, 8, 68, 12, 0, 35, 0, 18, 49, 62,
+  21, 11, 30, 33, 16, 49, 19, 13, 53, 22,
+  0, 17, 0, 5, 44, 0, 24, 80, 3, 46,
+  0, 0, 12, 0, 22, 12, 52, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  89, 0, 51, 0, 16, 1, 6, 145, 0, 66,
+  0, 25, 0, 0, 52, 0, 6, 0, 69, 0,
+  0, 0, 0, 5, 33, 32, 0, 0, 14, 32,
+  3, 0, 70, 0, 0, 0, 0, 0, 77, 0,
+  13, 38, 0, 0, 0, 0, 0, 17, 0, 19,
+  0, 15, 48, 19, 0, 17, 5, 25, 0, 35,
+  17, 0, 54, 0, 0, 16, 0, 0, 0, 0,
+  16, 0, 16, 19, 0, 1, 65, 17, 3, 0,
+  34, 29, 0, 94, 0, 16, 0, 0, 90, 39,
+  0, 18, 0, 41, 51, 18, 99, 0, 0, 0,
+  0, 0, 61, 0, 18, 99, 42, 59, 0, 0,
+  0, 10, 57, 44, 87, 0, 0, 0, 0, 36,
+  0, 0, 0, 0, 5, 0, 3, 0, 48, 0,
+  39, 0, 0, 46, 0, 37, 0, 44, 22, 0,
+  8, 20, 82, 0, 25, 11, 12, 56, 55, 36,
+  59, 22, 0, 12, 31, 0, 0, 0, 1, 27,
+  0, 18, 0, 0, 0, 0, 0, 37, 0, 0,
+  0, 0, 0, 14, 0, 0, 0, 28, 0, 0,
+  38, 1, 0, 0, 0, 23, 0, 87, 0, 0,
+  4, 32, 0, 38, 0, 0, 0, 0, 0, 27,
+  62, 7, 79, 0, 0, 0, 0, 8, 73, 0,
+  0, 19, 6, 1, 28, 74, 0, 0, 22, 50,
+  31, 43, 10, 0, 10, 37, 0, 20, 0, 33,
+  31, 10, 59, 36, 0, 0, 0, 0, 17, 0,
+  0, 13, 9, 1, 0, 0, 0, 0, 9, 0,
+  0, 0, 0, 0, 0, 23, 74, 0, 31, 0,
+  36, 0, 0, 74, 18, 48, 36, 0, 9, 0,
+  60, 0, 36, 0, 0, 63, 66, 33, 53, 1,
+  1, 40, 5, 0, 0, 0, 0, 29, 0, 0,
+  0, 0, 0, 0, 0, 33, 0, 0, 0, 0,
+  0, 13, 0, 0, 0, 7, 0, 0, 40, 19,
+  0, 0, 0, 0, 0, 107, 0, 0, 12, 52,
+  0, 31, 0, 27, 0, 0, 0, 19, 66, 8,
+  85, 0, 0, 0, 0, 0, 65, 0, 0, 12,
+  15, 13, 23, 55, 0, 0, 38, 70, 22, 57,
+  6, 0, 10, 41, 0, 20, 0, 27, 34, 9,
+  25, 65, 0, 0, 0, 0, 11, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 46, 0, 22, 0, 42, 0,
+  0, 120, 19, 74, 27, 0, 31, 0, 61, 0,
+  8, 0, 21, 27, 26, 43, 32, 22, 11, 48,
+  0, 0, 11, 13, 20, 2, 39, 1, 0, 0,
+  0, 0, 45, 5, 15, 2, 0, 0, 0, 0,
+  0, 0, 0, 21, 0, 27, 87, 36, 0, 0,
+  16, 0, 0, 39, 0, 0, 30, 0, 0, 50,
+  0, 22, 0, 0, 0, 0, 32, 15, 38, 0,
+  0, 0, 27, 0, 82, 16, 0, 44, 0, 0,
+  23, 10, 32, 10, 15, 51, 24, 38, 8, 39,
+  22, 24, 0, 47, 0, 0, 15, 0, 42, 41,
+  18, 5, 0, 0, 5, 0, 39, 13, 35, 22,
+  0, 0, 0, 45, 0, 0, 0, 0, 9, 0,
+  0, 0, 49, 0, 6, 0, 21, 9, 0, 155,
+  0, 57, 4, 0, 35, 0, 65, 0, 13, 22,
+  77, 0, 0, 0, 0, 12, 22, 43, 12, 0,
+  0, 61, 29, 33, 73, 13, 3, 0, 36, 0,
+  52, 0, 38, 0, 0, 0, 0, 0, 0, 22,
+  0, 53, 11, 0, 16, 0, 0, 0, 43, 52,
+  47, 51, 11, 17, 36, 0, 0, 49, 1, 0,
+  0, 0, 0, 0, 2, 16, 0, 0, 11, 34,
+  0, 0, 39, 55, 0, 69, 4, 0, 37, 56,
+  49, 10, 11, 0, 0, 58, 72, 93, 137, 0,
+  0, 11, 0, 0, 57, 0, 44, 81, 42, 39,
+  0, 0, 0, 0, 27, 70, 152, 18, 4, 0,
+  17, 10, 0, 0, 0, 0, 0, 0, 3, 0,
+  133, 2, 119, 5, 0, 0, 21, 77, 0, 54,
+  0, 57, 1, 0, 24, 0, 0, 9, 43, 0,
+  0, 0, 0, 20, 47, 27, 0, 27, 1, 0,
+  0, 0, 69, 0, 0, 0, 4, 19, 15, 0,
+  32, 49, 0, 0, 3, 0, 0, 7, 0, 34,
+  8, 10, 16, 0, 0, 0, 3, 45, 0, 0,
+  93, 35, 51, 0, 0, 0, 0, 53, 20, 0,
+  103, 0, 0, 43, 0, 68, 175, 29, 22, 0,
+  0, 35, 0, 61, 4, 6, 0, 0, 64, 5,
+  21, 0, 0, 19, 51, 0, 81, 0, 0, 0,
+  7, 0, 55, 0, 12, 95, 28, 106, 1, 0,
+  0, 0, 4, 67, 71, 0, 2, 16, 0, 39,
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 18,
+  65, 17, 0, 0, 0, 0, 0, 25, 0, 135,
+  0, 7, 42, 0, 0, 4, 0, 6, 0, 0,
+  0, 25, 13, 0, 41, 106, 15, 0, 0, 0,
+  0, 1, 0, 0, 0, 1, 9, 0, 0, 82,
+  0, 40, 0, 0, 45, 0, 0, 46, 0, 80,
+  0, 4, 0, 0, 0, 52, 0, 0, 133, 36,
+  44, 0, 57, 0, 0, 92, 42, 0, 155, 0,
+  0, 30, 0, 77, 196, 0, 59, 34, 0, 31,
+  0, 16, 9, 0, 0, 0, 35, 0, 0, 0,
+  1, 0, 11, 0, 0, 92, 0, 0, 27, 0,
+  0, 0, 7, 76, 78, 108, 0, 0, 0, 0,
+  0, 30, 0, 0, 0, 38, 0, 95, 0, 0,
+  0, 0, 52, 0, 0, 0, 0, 0, 21, 0,
+  0, 6, 0, 151, 1, 57, 8, 0, 17, 0,
+  42, 0, 26, 0, 19, 37, 38, 18, 29, 7,
+  6, 53, 10, 0, 0, 24, 1, 37, 15, 7,
+  0, 0, 0, 0, 46, 5, 0, 0, 0, 0,
+  0, 1, 0, 2, 0, 21, 0, 0, 21, 42,
+  0, 0, 40, 0, 12, 89, 0, 0, 18, 1,
+  0, 44, 24, 0, 0, 0, 0, 0, 73, 21,
+  53, 0, 0, 0, 0, 8, 68, 12, 0, 35,
+  0, 18, 49, 62, 21, 11, 30, 33, 16, 49,
+  19, 13, 53, 22, 0, 17, 0, 5, 44, 0,
+  24, 80, 3, 46, 0, 0, 12, 0, 22, 12,
+  52, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 89, 0, 51, 0, 16, 1,
+  6, 145, 0, 66, 0, 25, 0, 0, 52, 0,
+  6, 0, 69, 0, 0, 0, 0, 5, 33, 32,
+  0, 0, 14, 32, 3, 0, 70, 0, 0, 0,
+  0, 0, 77, 0, 13, 38, 0, 0, 0, 0,
+  0, 17, 0, 19, 0, 15, 48, 19, 0, 17,
+  5, 25, 0, 35, 17, 0, 54, 0, 0, 16,
+  0, 0, 0, 0, 16, 0, 16, 19, 0, 1,
+  65, 17, 3, 0, 34, 29, 0, 94, 0, 16,
+  0, 0, 90, 39, 0, 18, 0, 41, 51, 18,
+  99, 0, 0, 0, 0, 0, 61, 0, 18, 99,
+  42, 59, 0, 0, 0, 10, 57, 44, 87, 0,
+  0, 0, 0, 36, 0, 0, 0, 0, 5, 0,
+  3, 0, 48, 0, 39, 0, 0, 46, 58, 21,
+  0, 68, 2, 105, 0, 4, 38, 0, 0, 0,
+  40, 0, 0, 0, 2, 21, 35, 0, 0, 90,
+  13, 0, 0, 0, 31, 0, 9, 0, 0, 31,
+  3, 0, 67, 72, 9, 0, 27, 0, 20, 14,
+  0, 28, 22, 53, 41, 0, 0, 0, 0, 61,
+  0, 0, 135, 38, 37, 0, 7, 0, 0, 47,
+  34, 0, 96, 0, 0, 31, 0, 47, 198, 6,
+  55, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+  77, 27, 31, 0, 1, 1, 38, 0, 0, 15,
+  0, 0, 17, 0, 39, 0, 26, 71, 33, 77,
+  0, 0, 0, 0, 6, 46, 5, 0, 19, 40,
+  0, 88, 0, 0, 0, 0, 55, 0, 0, 0,
+  0, 0, 28, 0, 0, 16, 0, 74, 18, 48,
+  36, 0, 9, 0, 60, 0, 36, 0, 0, 63,
+  66, 33, 53, 1, 1, 40, 5, 0, 0, 0,
+  0, 29, 0, 0, 0, 0, 0, 0, 0, 33,
+  0, 0, 0, 0, 0, 13, 0, 0, 0, 7,
+  0, 0, 40, 19, 0, 0, 0, 0, 0, 107,
+  0, 0, 12, 52, 0, 31, 0, 27, 0, 0,
+  0, 19, 66, 8, 85, 0, 0, 0, 0, 0,
+  65, 0, 0, 12, 15, 13, 23, 55, 0, 0,
+  38, 70, 22, 57, 6, 0, 10, 41, 0, 20,
+  0, 27, 34, 9, 25, 65, 0, 0, 0, 0,
+  11, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 46, 0,
+  22, 0, 42, 0, 0, 120, 19, 74, 27, 0,
+  31, 0, 61, 0, 8, 0, 21, 27, 26, 43,
+  32, 22, 11, 48, 0, 0, 11, 13, 20, 2,
+  39, 1, 0, 0, 0, 0, 45, 5, 15, 2,
+  0, 0, 0, 0, 0, 0, 0, 21, 0, 27,
+  87, 36, 0, 0, 16, 0, 0, 39, 0, 0,
+  30, 0, 0, 50, 0, 22, 0, 0, 0, 0,
+  32, 15, 38, 0, 0, 0, 27, 0, 82, 16,
+  0, 44, 0, 0, 23, 10, 32, 10, 15, 51,
+  24, 38, 8, 39, 22, 24, 0, 47, 0, 0,
+  15, 0, 42, 41, 18, 5, 0, 0, 5, 0,
+  39, 13, 35, 22, 0, 0, 0, 45, 0, 0,
+  0, 0, 9, 0, 0, 0, 49, 0, 6, 0,
+  21, 9, 64, 56, 7, 47, 47, 23, 0, 2,
+  27, 0, 0, 0, 42, 8, 0, 3, 0, 0,
+  56, 18, 0, 16, 26, 0, 2, 0, 57, 0,
+  1, 54, 0, 27, 23, 0, 74, 44, 54, 0,
+  12, 0, 0, 9, 0, 16, 14, 30, 64, 22,
+  0, 0, 0, 0, 0, 18, 39, 0, 31, 0,
+  0, 0, 0, 41, 29, 0, 11, 5, 0, 39,
+  0, 10, 75, 0, 74, 0, 24, 4, 0, 36,
+  30, 0, 0, 0, 49, 39, 40, 0, 0, 51,
+  36, 6, 0, 6, 0, 16, 0, 0, 38, 0,
+  41, 42, 30, 45, 15, 0, 0, 0, 5, 61,
+  41, 0, 5, 11, 0, 65, 38, 0, 0, 0,
+  29, 0, 0, 0, 0, 0, 0, 0, 8, 29,
+  21, 77, 0, 54, 0, 57, 1, 0, 24, 0,
+  0, 9, 43, 0, 0, 0, 0, 20, 47, 27,
+  0, 27, 1, 0, 0, 0, 69, 0, 0, 0,
+  4, 19, 15, 0, 32, 49, 0, 0, 3, 0,
+  0, 7, 0, 34, 8, 10, 16, 0, 0, 0,
+  3, 45, 0, 0, 93, 35, 51, 0, 0, 0,
+  0, 53, 20, 0, 103, 0, 0, 43, 0, 68,
+  175, 29, 22, 0, 0, 35, 0, 61, 4, 6,
+  0, 0, 64, 5, 21, 0, 0, 19, 51, 0,
+  81, 0, 0, 0, 7, 0, 55, 0, 12, 95,
+  28, 106, 1, 0, 0, 0, 4, 67, 71, 0,
+  2, 16, 0, 39, 0, 0, 0, 0, 25, 0,
+  0, 0, 0, 18, 65, 17, 0, 0, 0, 0,
+  0, 25, 0, 135, 0, 7, 42, 0, 0, 4,
+  0, 6, 0, 0, 0, 25, 13, 0, 41, 106,
+  15, 0, 0, 0, 0, 1, 0, 0, 0, 1,
+  9, 0, 0, 82, 0, 40, 0, 0, 45, 0,
+  0, 46, 0, 80, 0, 4, 0, 0, 0, 52,
+  0, 0, 133, 36, 44, 0, 57, 0, 0, 92,
+  42, 0, 155, 0, 0, 30, 0, 77, 196, 0,
+  59, 34, 0, 31, 0, 16, 9, 0, 0, 0,
+  35, 0, 0, 0, 1, 0, 11, 0, 0, 92,
+  0, 0, 27, 0, 0, 0, 7, 76, 78, 108,
+  0, 0, 0, 0, 0, 30, 0, 0, 0, 38,
+  0, 95, 0, 0, 0, 0, 52, 0, 0, 0,
+  0, 0, 21, 0, 0, 6, 0, 28, 0, 8,
+  0, 24, 24, 29, 104, 12, 0, 37, 106, 0,
+  0, 105, 62, 22, 0, 0, 41, 62, 0, 12,
+  2, 0, 0, 43, 0, 0, 0, 0, 76, 0,
+  33, 0, 0, 91, 0, 53, 32, 0, 4, 39,
+  5, 115, 2, 34, 0, 36, 0, 56, 16, 0,
+  56, 0, 6, 0, 36, 0, 0, 14, 0, 21,
+  0, 0, 0, 0, 27, 0, 37, 0, 47, 52,
+  0, 14, 8, 31, 0, 0, 8, 0, 29, 0,
+  0, 10, 11, 0, 20, 0, 0, 68, 0, 34,
+  0, 0, 0, 0, 26, 84, 90, 0, 0, 0,
+  22, 0, 15, 31, 0, 34, 0, 30, 0, 52,
+  0, 0, 0, 0, 60, 0, 39, 0, 79, 0,
+  69, 0, 34, 16, 6, 145, 0, 66, 0, 25,
+  0, 0, 52, 0, 6, 0, 69, 0, 0, 0,
+  0, 5, 33, 32, 0, 0, 14, 32, 3, 0,
+  70, 0, 0, 0, 0, 0, 77, 0, 13, 38,
+  0, 0, 0, 0, 0, 17, 0, 19, 0, 15,
+  48, 19, 0, 17, 5, 25, 0, 35, 17, 0,
+  54, 0, 0, 16, 0, 0, 0, 0, 16, 0,
+  16, 19, 0, 1, 65, 17, 3, 0, 34, 29,
+  0, 94, 0, 16, 0, 0, 90, 39, 0, 18,
+  0, 41, 51, 18, 99, 0, 0, 0, 0, 0,
+  61, 0, 18, 99, 42, 59, 0, 0, 0, 10,
+  57, 44, 87, 0, 0, 0, 0, 36, 0, 0,
+  0, 0, 5, 0, 3, 0, 48, 0, 39, 0,
+  0, 46, 58, 21, 0, 68, 2, 105, 0, 4,
+  38, 0, 0, 0, 40, 0, 0, 0, 2, 21,
+  35, 0, 0, 90, 13, 0, 0, 0, 31, 0,
+  9, 0, 0, 31, 3, 0, 67, 72, 9, 0,
+  27, 0, 20, 14, 0, 28, 22, 53, 41, 0,
+  0, 0, 0, 61, 0, 0, 135, 38, 37, 0,
+  7, 0, 0, 47, 34, 0, 96, 0, 0, 31,
+  0, 47, 198, 6, 55, 0, 0, 0, 0, 35,
+  0, 0, 0, 0, 77, 27, 31, 0, 1, 1,
+  38, 0, 0, 15, 0, 0, 17, 0, 39, 0,
+  26, 71, 33, 77, 0, 0, 0, 0, 6, 46,
+  5, 0, 19, 40, 0, 88, 0, 0, 0, 0,
+  55, 0, 0, 0, 0, 0, 28, 0, 0, 16,
+  0, 0, 0, 15, 0, 83, 0, 21, 90, 39,
+  0, 48, 26, 0, 0, 60, 13, 28, 16, 0,
+  25, 81, 1, 0, 0, 0, 1, 44, 17, 19,
+  0, 35, 60, 0, 78, 36, 79, 138, 7, 0,
+  76, 0, 2, 0, 0, 129, 0, 4, 0, 11,
+  0, 4, 0, 0, 138, 0, 2, 0, 27, 0,
+  0, 90, 14, 2, 90, 0, 0, 39, 0, 61,
+  111, 0, 118, 35, 0, 31, 35, 22, 25, 0,
+  0, 0, 0, 27, 0, 0, 12, 25, 0, 0,
+  0, 91, 0, 7, 15, 0, 6, 0, 0, 89,
+  131, 18, 0, 0, 39, 0, 0, 48, 0, 0,
+  1, 67, 0, 57, 0, 0, 0, 0, 75, 0,
+  0, 0, 0, 0, 0, 0, 75, 51, 0, 120,
+  19, 74, 27, 0, 31, 0, 61, 0, 8, 0,
+  21, 27, 26, 43, 32, 22, 11, 48, 0, 0,
+  11, 13, 20, 2, 39, 1, 0, 0, 0, 0,
+  45, 5, 15, 2, 0, 0, 0, 0, 0, 0,
+  0, 21, 0, 27, 87, 36, 0, 0, 16, 0,
+  0, 39, 0, 0, 30, 0, 0, 50, 0, 22,
+  0, 0, 0, 0, 32, 15, 38, 0, 0, 0,
+  27, 0, 82, 16, 0, 44, 0, 0, 23, 10,
+  32, 10, 15, 51, 24, 38, 8, 39, 22, 24,
+  0, 47, 0, 0, 15, 0, 42, 41, 18, 5,
+  0, 0, 5, 0, 39, 13, 35, 22, 0, 0,
+  0, 45, 0, 0, 0, 0, 9, 0, 0, 0,
+  49, 0, 6, 0, 21, 9, 64, 56, 7, 47,
+  47, 23, 0, 2, 27, 0, 0, 0, 42, 8,
+  0, 3, 0, 0, 56, 18, 0, 16, 26, 0,
+  2, 0, 57, 0, 1, 54, 0, 27, 23, 0,
+  74, 44, 54, 0, 12, 0, 0, 9, 0, 16,
+  14, 30, 64, 22, 0, 0, 0, 0, 0, 18,
+  39, 0, 31, 0, 0, 0, 0, 41, 29, 0,
+  11, 5, 0, 39, 0, 10, 75, 0, 74, 0,
+  24, 4, 0, 36, 30, 0, 0, 0, 49, 39,
+  40, 0, 0, 51, 36, 6, 0, 6, 0, 16,
+  0, 0, 38, 0, 41, 42, 30, 45, 15, 0,
+  0, 0, 5, 61, 41, 0, 5, 11, 0, 65,
+  38, 0, 0, 0, 29, 0, 0, 0, 0, 0,
+  0, 0, 8, 29, 59, 0, 21, 13, 0, 41,
+  0, 2, 0, 43, 0, 19, 0, 48, 0, 0,
+  0, 0, 56, 0, 3, 89, 5, 0, 0, 0,
+  21, 5, 0, 99, 0, 11, 0, 0, 67, 44,
+  117, 91, 15, 0, 39, 0, 3, 0, 0, 12,
+  0, 18, 5, 1, 0, 35, 0, 23, 119, 0,
+  0, 4, 0, 0, 0, 65, 91, 49, 82, 33,
+  0, 21, 0, 118, 80, 20, 83, 0, 0, 0,
+  0, 0, 100, 0, 0, 0, 15, 22, 26, 0,
+  0, 49, 63, 0, 0, 18, 0, 0, 55, 0,
+  41, 0, 0, 54, 58, 26, 28, 0, 0, 0,
+  0, 29, 0, 0, 19, 18, 0, 23, 56, 7,
+  0, 0, 19, 0, 0, 0, 0, 0, 0, 24,
+  61, 73, 0, 0, 0, 25, 0, 135, 0, 7,
+  42, 0, 0, 4, 0, 6, 0, 0, 0, 25,
+  13, 0, 41, 106, 15, 0, 0, 0, 0, 1,
+  0, 0, 0, 1, 9, 0, 0, 82, 0, 40,
+  0, 0, 45, 0, 0, 46, 0, 80, 0, 4,
+  0, 0, 0, 52, 0, 0, 133, 36, 44, 0,
+  57, 0, 0, 92, 42, 0, 155, 0, 0, 30,
+  0, 77, 196, 0, 59, 34, 0, 31, 0, 16,
+  9, 0, 0, 0, 35, 0, 0, 0, 1, 0,
+  11, 0, 0, 92, 0, 0, 27, 0, 0, 0,
+  7, 76, 78, 108, 0, 0, 0, 0, 0, 30,
+  0, 0, 0, 38, 0, 95, 0, 0, 0, 0,
+  52, 0, 0, 0, 0, 0, 21, 0, 0, 6,
+  0, 28, 0, 8, 0, 24, 24, 29, 104, 12,
+  0, 37, 106, 0, 0, 105, 62, 22, 0, 0,
+  41, 62, 0, 12, 2, 0, 0, 43, 0, 0,
+  0, 0, 76, 0, 33, 0, 0, 91, 0, 53,
+  32, 0, 4, 39, 5, 115, 2, 34, 0, 36,
+  0, 56, 16, 0, 56, 0, 6, 0, 36, 0,
+  0, 14, 0, 21, 0, 0, 0, 0, 27, 0,
+  37, 0, 47, 52, 0, 14, 8, 31, 0, 0,
+  8, 0, 29, 0, 0, 10, 11, 0, 20, 0,
+  0, 68, 0, 34, 0, 0, 0, 0, 26, 84,
+  90, 0, 0, 0, 22, 0, 15, 31, 0, 34,
+  0, 30, 0, 52, 0, 0, 0, 0, 60, 0,
+  39, 0, 79, 0, 69, 0, 34, 16, 0, 39,
+  58, 0, 0, 0, 35, 20, 76, 0, 11, 39,
+  97, 0, 0, 94, 63, 17, 0, 0, 0, 47,
+  11, 21, 63, 0, 0, 58, 0, 0, 0, 24,
+  97, 0, 27, 0, 0, 89, 26, 22, 38, 4,
+  46, 33, 23, 117, 42, 0, 0, 22, 0, 0,
+  14, 0, 32, 0, 5, 0, 47, 0, 0, 49,
+  0, 19, 0, 0, 17, 1, 30, 0, 0, 0,
+  56, 43, 10, 31, 22, 65, 0, 0, 6, 0,
+  19, 88, 0, 42, 0, 0, 0, 23, 0, 11,
+  0, 31, 0, 0, 0, 0, 0, 85, 98, 0,
+  0, 0, 13, 0, 31, 29, 0, 24, 0, 19,
+  0, 5, 0, 0, 0, 12, 70, 0, 0, 0,
+  32, 0, 63, 0, 24, 34, 58, 21, 0, 68,
+  2, 105, 0, 4, 38, 0, 0, 0, 40, 0,
+  0, 0, 2, 21, 35, 0, 0, 90, 13, 0,
+  0, 0, 31, 0, 9, 0, 0, 31, 3, 0,
+  67, 72, 9, 0, 27, 0, 20, 14, 0, 28,
+  22, 53, 41, 0, 0, 0, 0, 61, 0, 0,
+  135, 38, 37, 0, 7, 0, 0, 47, 34, 0,
+  96, 0, 0, 31, 0, 47, 198, 6, 55, 0,
+  0, 0, 0, 35, 0, 0, 0, 0, 77, 27,
+  31, 0, 1, 1, 38, 0, 0, 15, 0, 0,
+  17, 0, 39, 0, 26, 71, 33, 77, 0, 0,
+  0, 0, 6, 46, 5, 0, 19, 40, 0, 88,
+  0, 0, 0, 0, 55, 0, 0, 0, 0, 0,
+  28, 0, 0, 16, 0, 0, 0, 15, 0, 83,
+  0, 21, 90, 39, 0, 48, 26, 0, 0, 60,
+  13, 28, 16, 0, 25, 81, 1, 0, 0, 0,
+  1, 44, 17, 19, 0, 35, 60, 0, 78, 36,
+  79, 138, 7, 0, 76, 0, 2, 0, 0, 129,
+  0, 4, 0, 11, 0, 4, 0, 0, 138, 0,
+  2, 0, 27, 0, 0, 90, 14, 2, 90, 0,
+  0, 39, 0, 61, 111, 0, 118, 35, 0, 31,
+  35, 22, 25, 0, 0, 0, 0, 27, 0, 0,
+  12, 25, 0, 0, 0, 91, 0, 7, 15, 0,
+  6, 0, 0, 89, 131, 18, 0, 0, 39, 0,
+  0, 48, 0, 0, 1, 67, 0, 57, 0, 0,
+  0, 0, 75, 0, 0, 0, 0, 0, 0, 0,
+  75, 51, 0, 0, 95, 9, 0, 0, 0, 24,
+  67, 28, 0, 54, 35, 44, 0, 52, 0, 15,
+  0, 0, 0, 58, 28, 9, 0, 0, 21, 48,
+  6, 84, 0, 37, 76, 0, 22, 0, 105, 123,
+  0, 0, 100, 0, 38, 0, 0, 109, 0, 0,
+  0, 11, 0, 0, 0, 0, 96, 0, 19, 0,
+  47, 0, 0, 83, 53, 15, 66, 0, 7, 34,
+  0, 90, 0, 0, 122, 30, 0, 21, 7, 0,
+  14, 0, 0, 2, 0, 89, 0, 17, 21, 0,
+  35, 0, 0, 36, 0, 3, 0, 0, 0, 0,
+  0, 59, 137, 0, 0, 0, 0, 0, 0, 52,
+  0, 3, 30, 17, 0, 0, 80, 0, 22, 0,
+  52, 0, 0, 0, 0, 0, 0, 14, 61, 73,
+  64, 56, 7, 47, 47, 23, 0, 2, 27, 0,
+  0, 0, 42, 8, 0, 3, 0, 0, 56, 18,
+  0, 16, 26, 0, 2, 0, 57, 0, 1, 54,
+  0, 27, 23, 0, 74, 44, 54, 0, 12, 0,
+  0, 9, 0, 16, 14, 30, 64, 22, 0, 0,
+  0, 0, 0, 18, 39, 0, 31, 0, 0, 0,
+  0, 41, 29, 0, 11, 5, 0, 39, 0, 10,
+  75, 0, 74, 0, 24, 4, 0, 36, 30, 0,
+  0, 0, 49, 39, 40, 0, 0, 51, 36, 6,
+  0, 6, 0, 16, 0, 0, 38, 0, 41, 42,
+  30, 45, 15, 0, 0, 0, 5, 61, 41, 0,
+  5, 11, 0, 65, 38, 0, 0, 0, 29, 0,
+  0, 0, 0, 0, 0, 0, 8, 29, 59, 0,
+  21, 13, 0, 41, 0, 2, 0, 43, 0, 19,
+  0, 48, 0, 0, 0, 0, 56, 0, 3, 89,
+  5, 0, 0, 0, 21, 5, 0, 99, 0, 11,
+  0, 0, 67, 44, 117, 91, 15, 0, 39, 0,
+  3, 0, 0, 12, 0, 18, 5, 1, 0, 35,
+  0, 23, 119, 0, 0, 4, 0, 0, 0, 65,
+  91, 49, 82, 33, 0, 21, 0, 118, 80, 20,
+  83, 0, 0, 0, 0, 0, 100, 0, 0, 0,
+  15, 22, 26, 0, 0, 49, 63, 0, 0, 18,
+  0, 0, 55, 0, 41, 0, 0, 54, 58, 26,
+  28, 0, 0, 0, 0, 29, 0, 0, 19, 18,
+  0, 23, 56, 7, 0, 0, 19, 0, 0, 0,
+  0, 0, 0, 24, 61, 73, 32, 0, 66, 36,
+  9, 0, 0, 0, 5, 21, 0, 26, 30, 124,
+  0, 0, 0, 0, 23, 0, 28, 52, 0, 3,
+  0, 0, 50, 28, 0, 103, 0, 4, 0, 0,
+  39, 0, 82, 66, 0, 0, 35, 0, 2, 0,
+  0, 22, 7, 0, 0, 0, 0, 70, 0, 21,
+  74, 0, 0, 14, 10, 0, 0, 32, 91, 24,
+  64, 1, 0, 2, 0, 95, 0, 13, 72, 0,
+  0, 0, 0, 0, 86, 0, 0, 56, 11, 19,
+  0, 0, 12, 13, 141, 0, 0, 19, 0, 0,
+  4, 0, 38, 0, 0, 38, 31, 0, 0, 0,
+  0, 0, 0, 56, 51, 0, 69, 0, 0, 0,
+  107, 0, 36, 0, 0, 32, 38, 0, 0, 0,
+  0, 37, 0, 81, 0, 28, 0, 8, 0, 24,
+  24, 29, 104, 12, 0, 37, 106, 0, 0, 105,
+  62, 22, 0, 0, 41, 62, 0, 12, 2, 0,
+  0, 43, 0, 0, 0, 0, 76, 0, 33, 0,
+  0, 91, 0, 53, 32, 0, 4, 39, 5, 115,
+  2, 34, 0, 36, 0, 56, 16, 0, 56, 0,
+  6, 0, 36, 0, 0, 14, 0, 21, 0, 0,
+  0, 0, 27, 0, 37, 0, 47, 52, 0, 14,
+  8, 31, 0, 0, 8, 0, 29, 0, 0, 10,
+  11, 0, 20, 0, 0, 68, 0, 34, 0, 0,
+  0, 0, 26, 84, 90, 0, 0, 0, 22, 0,
+  15, 31, 0, 34, 0, 30, 0, 52, 0, 0,
+  0, 0, 60, 0, 39, 0, 79, 0, 69, 0,
+  34, 16, 0, 39, 58, 0, 0, 0, 35, 20,
+  76, 0, 11, 39, 97, 0, 0, 94, 63, 17,
+  0, 0, 0, 47, 11, 21, 63, 0, 0, 58,
+  0, 0, 0, 24, 97, 0, 27, 0, 0, 89,
+  26, 22, 38, 4, 46, 33, 23, 117, 42, 0,
+  0, 22, 0, 0, 14, 0, 32, 0, 5, 0,
+  47, 0, 0, 49, 0, 19, 0, 0, 17, 1,
+  30, 0, 0, 0, 56, 43, 10, 31, 22, 65,
+  0, 0, 6, 0, 19, 88, 0, 42, 0, 0,
+  0, 23, 0, 11, 0, 31, 0, 0, 0, 0,
+  0, 85, 98, 0, 0, 0, 13, 0, 31, 29,
+  0, 24, 0, 19, 0, 5, 0, 0, 0, 12,
+  70, 0, 0, 0, 32, 0, 63, 0, 24, 34,
+  0, 10, 0, 0, 0, 0, 0, 1, 32, 2,
+  16, 56, 0, 30, 0, 9, 3, 0, 2, 0,
+  1, 27, 71, 20, 5, 0, 0, 23, 0, 18,
+  0, 0, 30, 0, 15, 0, 59, 84, 34, 0,
+  85, 0, 0, 5, 0, 98, 39, 10, 0, 0,
+  0, 0, 0, 0, 57, 0, 55, 0, 96, 0,
+  0, 81, 9, 12, 28, 9, 50, 46, 29, 21,
+  0, 0, 85, 58, 7, 94, 37, 18, 0, 0,
+  0, 22, 0, 74, 0, 50, 11, 36, 0, 0,
+  0, 84, 19, 16, 0, 0, 0, 0, 17, 49,
+  89, 0, 0, 0, 0, 27, 5, 0, 0, 3,
+  0, 9, 0, 9, 21, 75, 0, 33, 64, 0,
+  0, 0, 0, 0, 0, 0, 0, 41, 0, 0,
+  0, 15, 0, 83, 0, 21, 90, 39, 0, 48,
+  26, 0, 0, 60, 13, 28, 16, 0, 25, 81,
+  1, 0, 0, 0, 1, 44, 17, 19, 0, 35,
+  60, 0, 78, 36, 79, 138, 7, 0, 76, 0,
+  2, 0, 0, 129, 0, 4, 0, 11, 0, 4,
+  0, 0, 138, 0, 2, 0, 27, 0, 0, 90,
+  14, 2, 90, 0, 0, 39, 0, 61, 111, 0,
+  118, 35, 0, 31, 35, 22, 25, 0, 0, 0,
+  0, 27, 0, 0, 12, 25, 0, 0, 0, 91,
+  0, 7, 15, 0, 6, 0, 0, 89, 131, 18,
+  0, 0, 39, 0, 0, 48, 0, 0, 1, 67,
+  0, 57, 0, 0, 0, 0, 75, 0, 0, 0,
+  0, 0, 0, 0, 75, 51, 0, 0, 95, 9,
+  0, 0, 0, 24, 67, 28, 0, 54, 35, 44,
+  0, 52, 0, 15, 0, 0, 0, 58, 28, 9,
+  0, 0, 21, 48, 6, 84, 0, 37, 76, 0,
+  22, 0, 105, 123, 0, 0, 100, 0, 38, 0,
+  0, 109, 0, 0, 0, 11, 0, 0, 0, 0,
+  96, 0, 19, 0, 47, 0, 0, 83, 53, 15,
+  66, 0, 7, 34, 0, 90, 0, 0, 122, 30,
+  0, 21, 7, 0, 14, 0, 0, 2, 0, 89,
+  0, 17, 21, 0, 35, 0, 0, 36, 0, 3,
+  0, 0, 0, 0, 0, 59, 137, 0, 0, 0,
+  0, 0, 0, 52, 0, 3, 30, 17, 0, 0,
+  80, 0, 22, 0, 52, 0, 0, 0, 0, 0,
+  0, 14, 61, 73, 19, 3, 82, 25, 7, 0,
+  0, 19, 0, 0, 0, 50, 24, 124, 0, 0,
+  0, 0, 0, 0, 16, 66, 70, 4, 0, 0,
+  12, 4, 0, 88, 7, 3, 0, 13, 0, 0,
+  74, 8, 0, 0, 84, 0, 0, 15, 17, 36,
+  17, 22, 4, 0, 9, 49, 0, 0, 86, 0,
+  46, 0, 71, 0, 0, 47, 100, 0, 96, 0,
+  0, 47, 0, 116, 0, 23, 90, 0, 0, 33,
+  0, 0, 23, 0, 0, 55, 0, 76, 0, 1,
+  45, 31, 68, 0, 0, 0, 10, 0, 0, 0,
+  0, 0, 0, 29, 67, 0, 0, 0, 0, 4,
+  0, 42, 0, 0, 54, 0, 0, 0, 124, 74,
+  44, 0, 25, 0, 0, 0, 0, 25, 0, 22,
+  0, 56, 59, 0, 21, 13, 0, 41, 0, 2,
+  0, 43, 0, 19, 0, 48, 0, 0, 0, 0,
+  56, 0, 3, 89, 5, 0, 0, 0, 21, 5,
+  0, 99, 0, 11, 0, 0, 67, 44, 117, 91,
+  15, 0, 39, 0, 3, 0, 0, 12, 0, 18,
+  5, 1, 0, 35, 0, 23, 119, 0, 0, 4,
+  0, 0, 0, 65, 91, 49, 82, 33, 0, 21,
+  0, 118, 80, 20, 83, 0, 0, 0, 0, 0,
+  100, 0, 0, 0, 15, 22, 26, 0, 0, 49,
+  63, 0, 0, 18, 0, 0, 55, 0, 41, 0,
+  0, 54, 58, 26, 28, 0, 0, 0, 0, 29,
+  0, 0, 19, 18, 0, 23, 56, 7, 0, 0,
+  19, 0, 0, 0, 0, 0, 0, 24, 61, 73,
+  32, 0, 66, 36, 9, 0, 0, 0, 5, 21,
+  0, 26, 30, 124, 0, 0, 0, 0, 23, 0,
+  28, 52, 0, 3, 0, 0, 50, 28, 0, 103,
+  0, 4, 0, 0, 39, 0, 82, 66, 0, 0,
+  35, 0, 2, 0, 0, 22, 7, 0, 0, 0,
+  0, 70, 0, 21, 74, 0, 0, 14, 10, 0,
+  0, 32, 91, 24, 64, 1, 0, 2, 0, 95,
+  0, 13, 72, 0, 0, 0, 0, 0, 86, 0,
+  0, 56, 11, 19, 0, 0, 12, 13, 141, 0,
+  0, 19, 0, 0, 4, 0, 38, 0, 0, 38,
+  31, 0, 0, 0, 0, 0, 0, 56, 51, 0,
+  69, 0, 0, 0, 107, 0, 36, 0, 0, 32,
+  38, 0, 0, 0, 0, 37, 0, 81, 51, 46,
+  25, 77, 65, 9, 0, 0, 20, 0, 19, 0,
+  51, 118, 0, 0, 0, 0, 16, 7, 12, 11,
+  0, 26, 0, 0, 55, 19, 0, 69, 20, 7,
+  22, 0, 56, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 31, 31, 30, 33, 0, 0, 23, 35,
+  0, 14, 38, 0, 27, 20, 0, 10, 0, 19,
+  19, 8, 0, 0, 0, 0, 2, 0, 0, 41,
+  51, 0, 0, 22, 0, 0, 35, 8, 0, 53,
+  41, 20, 0, 0, 35, 12, 95, 14, 26, 0,
+  0, 30, 0, 0, 70, 0, 0, 50, 0, 20,
+  0, 0, 0, 25, 0, 43, 127, 0, 82, 0,
+  12, 0, 31, 0, 14, 0, 0, 8, 49, 0,
+  2, 15, 10, 13, 0, 93, 0, 39, 58, 0,
+  0, 0, 35, 20, 76, 0, 11, 39, 97, 0,
+  0, 94, 63, 17, 0, 0, 0, 47, 11, 21,
+  63, 0, 0, 58, 0, 0, 0, 24, 97, 0,
+  27, 0, 0, 89, 26, 22, 38, 4, 46, 33,
+  23, 117, 42, 0, 0, 22, 0, 0, 14, 0,
+  32, 0, 5, 0, 47, 0, 0, 49, 0, 19,
+  0, 0, 17, 1, 30, 0, 0, 0, 56, 43,
+  10, 31, 22, 65, 0, 0, 6, 0, 19, 88,
+  0, 42, 0, 0, 0, 23, 0, 11, 0, 31,
+  0, 0, 0, 0, 0, 85, 98, 0, 0, 0,
+  13, 0, 31, 29, 0, 24, 0, 19, 0, 5,
+  0, 0, 0, 12, 70, 0, 0, 0, 32, 0,
+  63, 0, 24, 34, 0, 10, 0, 0, 0, 0,
+  0, 1, 32, 2, 16, 56, 0, 30, 0, 9,
+  3, 0, 2, 0, 1, 27, 71, 20, 5, 0,
+  0, 23, 0, 18, 0, 0, 30, 0, 15, 0,
+  59, 84, 34, 0, 85, 0, 0, 5, 0, 98,
+  39, 10, 0, 0, 0, 0, 0, 0, 57, 0,
+  55, 0, 96, 0, 0, 81, 9, 12, 28, 9,
+  50, 46, 29, 21, 0, 0, 85, 58, 7, 94,
+  37, 18, 0, 0, 0, 22, 0, 74, 0, 50,
+  11, 36, 0, 0, 0, 84, 19, 16, 0, 0,
+  0, 0, 17, 49, 89, 0, 0, 0, 0, 27,
+  5, 0, 0, 3, 0, 9, 0, 9, 21, 75,
+  0, 33, 64, 0, 0, 0, 0, 0, 0, 0,
+  0, 41, 4, 18, 11, 6, 0, 0, 0, 0,
+  60, 44, 0, 0, 0, 54, 0, 0, 0, 29,
+  17, 0, 3, 11, 34, 17, 0, 0, 58, 48,
+  0, 0, 0, 0, 53, 0, 0, 0, 74, 109,
+  0, 0, 46, 0, 0, 0, 0, 59, 0, 51,
+  0, 23, 0, 0, 0, 0, 78, 7, 34, 8,
+  0, 0, 0, 52, 29, 14, 74, 2, 53, 17,
+  8, 144, 9, 0, 46, 89, 0, 57, 27, 0,
+  12, 0, 0, 0, 31, 87, 0, 30, 0, 43,
+  20, 0, 0, 171, 0, 0, 22, 0, 7, 0,
+  0, 57, 123, 33, 0, 0, 0, 0, 0, 2,
+  0, 0, 0, 24, 0, 10, 20, 24, 0, 0,
+  14, 0, 0, 0, 0, 0, 0, 4, 58, 62,
+  0, 0, 95, 9, 0, 0, 0, 24, 67, 28,
+  0, 54, 35, 44, 0, 52, 0, 15, 0, 0,
+  0, 58, 28, 9, 0, 0, 21, 48, 6, 84,
+  0, 37, 76, 0, 22, 0, 105, 123, 0, 0,
+  100, 0, 38, 0, 0, 109, 0, 0, 0, 11,
+  0, 0, 0, 0, 96, 0, 19, 0, 47, 0,
+  0, 83, 53, 15, 66, 0, 7, 34, 0, 90,
+  0, 0, 122, 30, 0, 21, 7, 0, 14, 0,
+  0, 2, 0, 89, 0, 17, 21, 0, 35, 0,
+  0, 36, 0, 3, 0, 0, 0, 0, 0, 59,
+  137, 0, 0, 0, 0, 0, 0, 52, 0, 3,
+  30, 17, 0, 0, 80, 0, 22, 0, 52, 0,
+  0, 0, 0, 0, 0, 14, 61, 73, 19, 3,
+  82, 25, 7, 0, 0, 19, 0, 0, 0, 50,
+  24, 124, 0, 0, 0, 0, 0, 0, 16, 66,
+  70, 4, 0, 0, 12, 4, 0, 88, 7, 3,
+  0, 13, 0, 0, 74, 8, 0, 0, 84, 0,
+  0, 15, 17, 36, 17, 22, 4, 0, 9, 49,
+  0, 0, 86, 0, 46, 0, 71, 0, 0, 47,
+  100, 0, 96, 0, 0, 47, 0, 116, 0, 23,
+  90, 0, 0, 33, 0, 0, 23, 0, 0, 55,
+  0, 76, 0, 1, 45, 31, 68, 0, 0, 0,
+  10, 0, 0, 0, 0, 0, 0, 29, 67, 0,
+  0, 0, 0, 4, 0, 42, 0, 0, 54, 0,
+  0, 0, 124, 74, 44, 0, 25, 0, 0, 0,
+  0, 25, 0, 22, 0, 56, 83, 83, 12, 72,
+  44, 15, 0, 0, 20, 0, 22, 0, 23, 126,
+  0, 0, 0, 0, 39, 0, 24, 37, 34, 21,
+  0, 0, 35, 11, 0, 34, 52, 81, 0, 0,
+  0, 0, 0, 26, 0, 0, 0, 1, 0, 0,
+  1, 18, 42, 71, 0, 0, 11, 40, 0, 7,
+  106, 0, 38, 4, 10, 0, 0, 34, 61, 26,
+  20, 0, 27, 21, 0, 98, 0, 49, 51, 0,
+  0, 28, 54, 0, 44, 0, 0, 48, 15, 60,
+  0, 1, 2, 45, 68, 0, 14, 0, 0, 25,
+  0, 0, 81, 0, 11, 15, 12, 121, 4, 0,
+  0, 16, 0, 68, 74, 0, 26, 0, 17, 1,
+  24, 87, 0, 0, 20, 2, 10, 0, 0, 0,
+  0, 22, 0, 87, 32, 0, 66, 36, 9, 0,
+  0, 0, 5, 21, 0, 26, 30, 124, 0, 0,
+  0, 0, 23, 0, 28, 52, 0, 3, 0, 0,
+  50, 28, 0, 103, 0, 4, 0, 0, 39, 0,
+  82, 66, 0, 0, 35, 0, 2, 0, 0, 22,
+  7, 0, 0, 0, 0, 70, 0, 21, 74, 0,
+  0, 14, 10, 0, 0, 32, 91, 24, 64, 1,
+  0, 2, 0, 95, 0, 13, 72, 0, 0, 0,
+  0, 0, 86, 0, 0, 56, 11, 19, 0, 0,
+  12, 13, 141, 0, 0, 19, 0, 0, 4, 0,
+  38, 0, 0, 38, 31, 0, 0, 0, 0, 0,
+  0, 56, 51, 0, 69, 0, 0, 0, 107, 0,
+  36, 0, 0, 32, 38, 0, 0, 0, 0, 37,
+  0, 81, 51, 46, 25, 77, 65, 9, 0, 0,
+  20, 0, 19, 0, 51, 118, 0, 0, 0, 0,
+  16, 7, 12, 11, 0, 26, 0, 0, 55, 19,
+  0, 69, 20, 7, 22, 0, 56, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 31, 31, 30, 33,
+  0, 0, 23, 35, 0, 14, 38, 0, 27, 20,
+  0, 10, 0, 19, 19, 8, 0, 0, 0, 0,
+  2, 0, 0, 41, 51, 0, 0, 22, 0, 0,
+  35, 8, 0, 53, 41, 20, 0, 0, 35, 12,
+  95, 14, 26, 0, 0, 30, 0, 0, 70, 0,
+  0, 50, 0, 20, 0, 0, 0, 25, 0, 43,
+  127, 0, 82, 0, 12, 0, 31, 0, 14, 0,
+  0, 8, 49, 0, 2, 15, 10, 13, 0, 93,
+  42, 127, 15, 99, 80, 43, 0, 0, 43, 0,
+  32, 0, 35, 29, 0, 0, 11, 0, 41, 15,
+  0, 0, 0, 47, 24, 0, 52, 29, 0, 37,
+  5, 49, 69, 0, 20, 0, 0, 0, 0, 0,
+  0, 17, 0, 6, 19, 56, 44, 46, 0, 7,
+  4, 0, 0, 17, 32, 0, 50, 2, 0, 29,
+  21, 24, 0, 8, 0, 0, 52, 4, 27, 0,
+  0, 21, 45, 4, 6, 45, 10, 2, 0, 2,
+  0, 19, 40, 73, 0, 17, 5, 38, 21, 49,
+  107, 0, 0, 49, 0, 0, 90, 0, 23, 57,
+  7, 99, 1, 0, 25, 33, 41, 62, 122, 0,
+  7, 22, 36, 0, 0, 0, 0, 0, 0, 0,
+  13, 0, 43, 0, 45, 1, 13, 74, 0, 10,
+  0, 0, 0, 0, 0, 1, 32, 2, 16, 56,
+  0, 30, 0, 9, 3, 0, 2, 0, 1, 27,
+  71, 20, 5, 0, 0, 23, 0, 18, 0, 0,
+  30, 0, 15, 0, 59, 84, 34, 0, 85, 0,
+  0, 5, 0, 98, 39, 10, 0, 0, 0, 0,
+  0, 0, 57, 0, 55, 0, 96, 0, 0, 81,
+  9, 12, 28, 9, 50, 46, 29, 21, 0, 0,
+  85, 58, 7, 94, 37, 18, 0, 0, 0, 22,
+  0, 74, 0, 50, 11, 36, 0, 0, 0, 84,
+  19, 16, 0, 0, 0, 0, 17, 49, 89, 0,
+  0, 0, 0, 27, 5, 0, 0, 3, 0, 9,
+  0, 9, 21, 75, 0, 33, 64, 0, 0, 0,
+  0, 0, 0, 0, 0, 41, 4, 18, 11, 6,
+  0, 0, 0, 0, 60, 44, 0, 0, 0, 54,
+  0, 0, 0, 29, 17, 0, 3, 11, 34, 17,
+  0, 0, 58, 48, 0, 0, 0, 0, 53, 0,
+  0, 0, 74, 109, 0, 0, 46, 0, 0, 0,
+  0, 59, 0, 51, 0, 23, 0, 0, 0, 0,
+  78, 7, 34, 8, 0, 0, 0, 52, 29, 14,
+  74, 2, 53, 17, 8, 144, 9, 0, 46, 89,
+  0, 57, 27, 0, 12, 0, 0, 0, 31, 87,
+  0, 30, 0, 43, 20, 0, 0, 171, 0, 0,
+  22, 0, 7, 0, 0, 57, 123, 33, 0, 0,
+  0, 0, 0, 2, 0, 0, 0, 24, 0, 10,
+  20, 24, 0, 0, 14, 0, 0, 0, 0, 0,
+  0, 4, 58, 62, 28, 0, 51, 0, 0, 127,
+  0, 0, 28, 13, 0, 0, 0, 82, 0, 0,
+  9, 29, 31, 0, 0, 85, 28, 32, 0, 0,
+  13, 55, 0, 0, 0, 43, 0, 0, 0, 17,
+  44, 93, 0, 0, 24, 0, 15, 0, 0, 32,
+  0, 29, 0, 35, 0, 77, 0, 0, 138, 0,
+  12, 0, 0, 0, 0, 64, 0, 0, 81, 0,
+  9, 6, 12, 125, 8, 0, 33, 55, 0, 39,
+  22, 0, 0, 0, 0, 0, 28, 82, 0, 10,
+  0, 46, 0, 0, 0, 123, 0, 0, 55, 0,
+  11, 0, 0, 88, 63, 49, 0, 0, 27, 0,
+  0, 10, 0, 6, 1, 11, 0, 0, 9, 35,
+  24, 0, 11, 0, 0, 0, 0, 0, 0, 3,
+  9, 79, 19, 3, 82, 25, 7, 0, 0, 19,
+  0, 0, 0, 50, 24, 124, 0, 0, 0, 0,
+  0, 0, 16, 66, 70, 4, 0, 0, 12, 4,
+  0, 88, 7, 3, 0, 13, 0, 0, 74, 8,
+  0, 0, 84, 0, 0, 15, 17, 36, 17, 22,
+  4, 0, 9, 49, 0, 0, 86, 0, 46, 0,
+  71, 0, 0, 47, 100, 0, 96, 0, 0, 47,
+  0, 116, 0, 23, 90, 0, 0, 33, 0, 0,
+  23, 0, 0, 55, 0, 76, 0, 1, 45, 31,
+  68, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  0, 29, 67, 0, 0, 0, 0, 4, 0, 42,
+  0, 0, 54, 0, 0, 0, 124, 74, 44, 0,
+  25, 0, 0, 0, 0, 25, 0, 22, 0, 56,
+  83, 83, 12, 72, 44, 15, 0, 0, 20, 0,
+  22, 0, 23, 126, 0, 0, 0, 0, 39, 0,
+  24, 37, 34, 21, 0, 0, 35, 11, 0, 34,
+  52, 81, 0, 0, 0, 0, 0, 26, 0, 0,
+  0, 1, 0, 0, 1, 18, 42, 71, 0, 0,
+  11, 40, 0, 7, 106, 0, 38, 4, 10, 0,
+  0, 34, 61, 26, 20, 0, 27, 21, 0, 98,
+  0, 49, 51, 0, 0, 28, 54, 0, 44, 0,
+  0, 48, 15, 60, 0, 1, 2, 45, 68, 0,
+  14, 0, 0, 25, 0, 0, 81, 0, 11, 15,
+  12, 121, 4, 0, 0, 16, 0, 68, 74, 0,
+  26, 0, 17, 1, 24, 87, 0, 0, 20, 2,
+  10, 0, 0, 0, 0, 22, 0, 87, 35, 0,
+  20, 65, 14, 232, 0, 0, 1, 0, 0, 0,
+  0, 21, 0, 0, 0, 33, 62, 0, 0, 113,
+  15, 0, 0, 0, 0, 6, 0, 17, 8, 99,
+  0, 0, 0, 33, 0, 40, 0, 0, 0, 0,
+  0, 0, 0, 58, 44, 47, 7, 4, 0, 38,
+  0, 0, 142, 0, 48, 0, 21, 0, 27, 92,
+  17, 0, 115, 0, 0, 40, 0, 96, 83, 63,
+  62, 0, 0, 35, 43, 0, 0, 0, 0, 0,
+  46, 65, 0, 0, 0, 31, 0, 0, 7, 7,
+  0, 0, 70, 0, 52, 0, 0, 9, 17, 116,
+  2, 0, 0, 5, 18, 17, 0, 0, 0, 39,
+  0, 0, 0, 45, 36, 0, 13, 16, 0, 19,
+  0, 0, 0, 15, 0, 44, 51, 46, 25, 77,
+  65, 9, 0, 0, 20, 0, 19, 0, 51, 118,
+  0, 0, 0, 0, 16, 7, 12, 11, 0, 26,
+  0, 0, 55, 19, 0, 69, 20, 7, 22, 0,
+  56, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  31, 31, 30, 33, 0, 0, 23, 35, 0, 14,
+  38, 0, 27, 20, 0, 10, 0, 19, 19, 8,
+  0, 0, 0, 0, 2, 0, 0, 41, 51, 0,
+  0, 22, 0, 0, 35, 8, 0, 53, 41, 20,
+  0, 0, 35, 12, 95, 14, 26, 0, 0, 30,
+  0, 0, 70, 0, 0, 50, 0, 20, 0, 0,
+  0, 25, 0, 43, 127, 0, 82, 0, 12, 0,
+  31, 0, 14, 0, 0, 8, 49, 0, 2, 15,
+  10, 13, 0, 93, 42, 127, 15, 99, 80, 43,
+  0, 0, 43, 0, 32, 0, 35, 29, 0, 0,
+  11, 0, 41, 15, 0, 0, 0, 47, 24, 0,
+  52, 29, 0, 37, 5, 49, 69, 0, 20, 0,
+  0, 0, 0, 0, 0, 17, 0, 6, 19, 56,
+  44, 46, 0, 7, 4, 0, 0, 17, 32, 0,
+  50, 2, 0, 29, 21, 24, 0, 8, 0, 0,
+  52, 4, 27, 0, 0, 21, 45, 4, 6, 45,
+  10, 2, 0, 2, 0, 19, 40, 73, 0, 17,
+  5, 38, 21, 49, 107, 0, 0, 49, 0, 0,
+  90, 0, 23, 57, 7, 99, 1, 0, 25, 33,
+  41, 62, 122, 0, 7, 22, 36, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 43, 0, 45, 1,
+  13, 74, 17, 8, 86, 68, 23, 217, 0, 0,
+  29, 0, 0, 0, 32, 0, 0, 0, 31, 18,
+  66, 0, 0, 112, 15, 8, 7, 0, 0, 35,
+  0, 72, 0, 82, 0, 0, 0, 30, 0, 0,
+  1, 0, 0, 19, 0, 19, 0, 50, 59, 42,
+  0, 14, 0, 45, 0, 0, 97, 0, 62, 0,
+  33, 0, 0, 70, 0, 0, 53, 0, 0, 26,
+  12, 6, 27, 25, 76, 0, 0, 26, 25, 0,
+  0, 18, 0, 0, 77, 83, 0, 0, 0, 18,
+  0, 4, 54, 0, 0, 0, 24, 0, 25, 0,
+  15, 39, 25, 35, 17, 0, 0, 31, 47, 29,
+  0, 0, 0, 45, 0, 0, 0, 0, 38, 0,
+  3, 0, 0, 1, 0, 22, 25, 0, 0, 20,
+  4, 18, 11, 6, 0, 0, 0, 0, 60, 44,
+  0, 0, 0, 54, 0, 0, 0, 29, 17, 0,
+  3, 11, 34, 17, 0, 0, 58, 48, 0, 0,
+  0, 0, 53, 0, 0, 0, 74, 109, 0, 0,
+  46, 0, 0, 0, 0, 59, 0, 51, 0, 23,
+  0, 0, 0, 0, 78, 7, 34, 8, 0, 0,
+  0, 52, 29, 14, 74, 2, 53, 17, 8, 144,
+  9, 0, 46, 89, 0, 57, 27, 0, 12, 0,
+  0, 0, 31, 87, 0, 30, 0, 43, 20, 0,
+  0, 171, 0, 0, 22, 0, 7, 0, 0, 57,
+  123, 33, 0, 0, 0, 0, 0, 2, 0, 0,
+  0, 24, 0, 10, 20, 24, 0, 0, 14, 0,
+  0, 0, 0, 0, 0, 4, 58, 62, 28, 0,
+  51, 0, 0, 127, 0, 0, 28, 13, 0, 0,
+  0, 82, 0, 0, 9, 29, 31, 0, 0, 85,
+  28, 32, 0, 0, 13, 55, 0, 0, 0, 43,
+  0, 0, 0, 17, 44, 93, 0, 0, 24, 0,
+  15, 0, 0, 32, 0, 29, 0, 35, 0, 77,
+  0, 0, 138, 0, 12, 0, 0, 0, 0, 64,
+  0, 0, 81, 0, 9, 6, 12, 125, 8, 0,
+  33, 55, 0, 39, 22, 0, 0, 0, 0, 0,
+  28, 82, 0, 10, 0, 46, 0, 0, 0, 123,
+  0, 0, 55, 0, 11, 0, 0, 88, 63, 49,
+  0, 0, 27, 0, 0, 10, 0, 6, 1, 11,
+  0, 0, 9, 35, 24, 0, 11, 0, 0, 0,
+  0, 0, 0, 3, 9, 79, 0, 0, 30, 0,
+  26, 161, 0, 0, 0, 0, 0, 0, 49, 60,
+  0, 0, 11, 55, 0, 0, 7, 16, 0, 50,
+  0, 0, 0, 0, 0, 35, 21, 0, 0, 13,
+  0, 0, 0, 55, 0, 3, 0, 20, 0, 22,
+  0, 12, 34, 22, 0, 0, 13, 103, 4, 0,
+  17, 0, 10, 0, 46, 0, 0, 0, 0, 0,
+  54, 0, 0, 2, 0, 4, 0, 34, 24, 5,
+  0, 40, 0, 0, 0, 10, 0, 0, 18, 36,
+  19, 0, 31, 36, 38, 0, 0, 22, 13, 0,
+  4, 0, 0, 0, 1, 46, 1, 0, 0, 0,
+  0, 10, 0, 22, 0, 25, 23, 0, 0, 0,
+  5, 29, 102, 47, 32, 3, 54, 0, 0, 0,
+  37, 15, 0, 14, 83, 83, 12, 72, 44, 15,
+  0, 0, 20, 0, 22, 0, 23, 126, 0, 0,
+  0, 0, 39, 0, 24, 37, 34, 21, 0, 0,
+  35, 11, 0, 34, 52, 81, 0, 0, 0, 0,
+  0, 26, 0, 0, 0, 1, 0, 0, 1, 18,
+  42, 71, 0, 0, 11, 40, 0, 7, 106, 0,
+  38, 4, 10, 0, 0, 34, 61, 26, 20, 0,
+  27, 21, 0, 98, 0, 49, 51, 0, 0, 28,
+  54, 0, 44, 0, 0, 48, 15, 60, 0, 1,
+  2, 45, 68, 0, 14, 0, 0, 25, 0, 0,
+  81, 0, 11, 15, 12, 121, 4, 0, 0, 16,
+  0, 68, 74, 0, 26, 0, 17, 1, 24, 87,
+  0, 0, 20, 2, 10, 0, 0, 0, 0, 22,
+  0, 87, 35, 0, 20, 65, 14, 232, 0, 0,
+  1, 0, 0, 0, 0, 21, 0, 0, 0, 33,
+  62, 0, 0, 113, 15, 0, 0, 0, 0, 6,
+  0, 17, 8, 99, 0, 0, 0, 33, 0, 40,
+  0, 0, 0, 0, 0, 0, 0, 58, 44, 47,
+  7, 4, 0, 38, 0, 0, 142, 0, 48, 0,
+  21, 0, 27, 92, 17, 0, 115, 0, 0, 40,
+  0, 96, 83, 63, 62, 0, 0, 35, 43, 0,
+  0, 0, 0, 0, 46, 65, 0, 0, 0, 31,
+  0, 0, 7, 7, 0, 0, 70, 0, 52, 0,
+  0, 9, 17, 116, 2, 0, 0, 5, 18, 17,
+  0, 0, 0, 39, 0, 0, 0, 45, 36, 0,
+  13, 16, 0, 19, 0, 0, 0, 15, 0, 44,
+  0, 0, 0, 5, 19, 184, 0, 0, 0, 0,
+  0, 0, 30, 14, 0, 24, 4, 50, 5, 0,
+  21, 0, 0, 62, 18, 19, 0, 0, 0, 10,
+  18, 0, 0, 34, 0, 4, 0, 24, 0, 24,
+  0, 55, 0, 16, 0, 17, 43, 43, 0, 20,
+  0, 38, 14, 0, 0, 0, 9, 0, 19, 12,
+  5, 26, 0, 0, 6, 0, 0, 22, 22, 0,
+  30, 56, 37, 1, 2, 80, 0, 0, 0, 42,
+  0, 0, 13, 12, 24, 0, 22, 14, 2, 28,
+  1, 67, 43, 9, 35, 30, 0, 0, 7, 25,
+  0, 0, 0, 0, 0, 0, 0, 6, 0, 17,
+  0, 1, 0, 13, 0, 7, 81, 29, 34, 0,
+  48, 9, 42, 0, 38, 19, 0, 0, 42, 127,
+  15, 99, 80, 43, 0, 0, 43, 0, 32, 0,
+  35, 29, 0, 0, 11, 0, 41, 15, 0, 0,
+  0, 47, 24, 0, 52, 29, 0, 37, 5, 49,
+  69, 0, 20, 0, 0, 0, 0, 0, 0, 17,
+  0, 6, 19, 56, 44, 46, 0, 7, 4, 0,
+  0, 17, 32, 0, 50, 2, 0, 29, 21, 24,
+  0, 8, 0, 0, 52, 4, 27, 0, 0, 21,
+  45, 4, 6, 45, 10, 2, 0, 2, 0, 19,
+  40, 73, 0, 17, 5, 38, 21, 49, 107, 0,
+  0, 49, 0, 0, 90, 0, 23, 57, 7, 99,
+  1, 0, 25, 33, 41, 62, 122, 0, 7, 22,
+  36, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  43, 0, 45, 1, 13, 74, 17, 8, 86, 68,
+  23, 217, 0, 0, 29, 0, 0, 0, 32, 0,
+  0, 0, 31, 18, 66, 0, 0, 112, 15, 8,
+  7, 0, 0, 35, 0, 72, 0, 82, 0, 0,
+  0, 30, 0, 0, 1, 0, 0, 19, 0, 19,
+  0, 50, 59, 42, 0, 14, 0, 45, 0, 0,
+  97, 0, 62, 0, 33, 0, 0, 70, 0, 0,
+  53, 0, 0, 26, 12, 6, 27, 25, 76, 0,
+  0, 26, 25, 0, 0, 18, 0, 0, 77, 83,
+  0, 0, 0, 18, 0, 4, 54, 0, 0, 0,
+  24, 0, 25, 0, 15, 39, 25, 35, 17, 0,
+  0, 31, 47, 29, 0, 0, 0, 45, 0, 0,
+  0, 0, 38, 0, 3, 0, 0, 1, 0, 22,
+  25, 0, 0, 20, 0, 0, 0, 0, 1, 125,
+  0, 0, 0, 0, 0, 0, 59, 8, 0, 44,
+  12, 40, 18, 0, 40, 6, 0, 49, 0, 0,
+  0, 0, 0, 14, 40, 0, 0, 17, 0, 8,
+  0, 16, 0, 48, 35, 47, 0, 33, 1, 0,
+  7, 27, 0, 35, 0, 77, 28, 0, 14, 0,
+  38, 0, 36, 0, 0, 14, 0, 11, 0, 0,
+  0, 3, 8, 0, 16, 34, 27, 15, 0, 70,
+  0, 0, 0, 26, 7, 0, 14, 12, 42, 0,
+  12, 0, 8, 25, 0, 47, 52, 0, 15, 13,
+  0, 0, 17, 28, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 32, 29, 12, 0, 47, 0, 0,
+  66, 14, 50, 0, 35, 14, 18, 0, 67, 1,
+  0, 0, 28, 0, 51, 0, 0, 127, 0, 0,
+  28, 13, 0, 0, 0, 82, 0, 0, 9, 29,
+  31, 0, 0, 85, 28, 32, 0, 0, 13, 55,
+  0, 0, 0, 43, 0, 0, 0, 17, 44, 93,
+  0, 0, 24, 0, 15, 0, 0, 32, 0, 29,
+  0, 35, 0, 77, 0, 0, 138, 0, 12, 0,
+  0, 0, 0, 64, 0, 0, 81, 0, 9, 6,
+  12, 125, 8, 0, 33, 55, 0, 39, 22, 0,
+  0, 0, 0, 0, 28, 82, 0, 10, 0, 46,
+  0, 0, 0, 123, 0, 0, 55, 0, 11, 0,
+  0, 88, 63, 49, 0, 0, 27, 0, 0, 10,
+  0, 6, 1, 11, 0, 0, 9, 35, 24, 0,
+  11, 0, 0, 0, 0, 0, 0, 3, 9, 79,
+  0, 0, 30, 0, 26, 161, 0, 0, 0, 0,
+  0, 0, 49, 60, 0, 0, 11, 55, 0, 0,
+  7, 16, 0, 50, 0, 0, 0, 0, 0, 35,
+  21, 0, 0, 13, 0, 0, 0, 55, 0, 3,
+  0, 20, 0, 22, 0, 12, 34, 22, 0, 0,
+  13, 103, 4, 0, 17, 0, 10, 0, 46, 0,
+  0, 0, 0, 0, 54, 0, 0, 2, 0, 4,
+  0, 34, 24, 5, 0, 40, 0, 0, 0, 10,
+  0, 0, 18, 36, 19, 0, 31, 36, 38, 0,
+  0, 22, 13, 0, 4, 0, 0, 0, 1, 46,
+  1, 0, 0, 0, 0, 10, 0, 22, 0, 25,
+  23, 0, 0, 0, 5, 29, 102, 47, 32, 3,
+  54, 0, 0, 0, 37, 15, 0, 14, 0, 49,
+  11, 0, 44, 0, 25, 0, 19, 0, 0, 0,
+  81, 51, 5, 17, 15, 0, 0, 0, 3, 0,
+  0, 60, 21, 63, 0, 0, 0, 12, 63, 0,
+  0, 27, 12, 0, 0, 6, 0, 70, 0, 97,
+  10, 75, 53, 0, 0, 0, 0, 6, 0, 65,
+  94, 0, 0, 3, 21, 23, 4, 21, 0, 0,
+  0, 70, 0, 12, 8, 0, 0, 0, 0, 33,
+  0, 19, 20, 29, 0, 0, 0, 27, 44, 20,
+  19, 0, 78, 0, 29, 0, 66, 38, 0, 0,
+  42, 37, 0, 32, 0, 38, 3, 45, 0, 0,
+  0, 0, 0, 0, 3, 5, 71, 72, 88, 0,
+  0, 7, 31, 0, 0, 31, 64, 18, 57, 10,
+  85, 0, 91, 2, 0, 0, 35, 0, 20, 65,
+  14, 232, 0, 0, 1, 0, 0, 0, 0, 21,
+  0, 0, 0, 33, 62, 0, 0, 113, 15, 0,
+  0, 0, 0, 6, 0, 17, 8, 99, 0, 0,
+  0, 33, 0, 40, 0, 0, 0, 0, 0, 0,
+  0, 58, 44, 47, 7, 4, 0, 38, 0, 0,
+  142, 0, 48, 0, 21, 0, 27, 92, 17, 0,
+  115, 0, 0, 40, 0, 96, 83, 63, 62, 0,
+  0, 35, 43, 0, 0, 0, 0, 0, 46, 65,
+  0, 0, 0, 31, 0, 0, 7, 7, 0, 0,
+  70, 0, 52, 0, 0, 9, 17, 116, 2, 0,
+  0, 5, 18, 17, 0, 0, 0, 39, 0, 0,
+  0, 45, 36, 0, 13, 16, 0, 19, 0, 0,
+  0, 15, 0, 44, 0, 0, 0, 5, 19, 184,
+  0, 0, 0, 0, 0, 0, 30, 14, 0, 24,
+  4, 50, 5, 0, 21, 0, 0, 62, 18, 19,
+  0, 0, 0, 10, 18, 0, 0, 34, 0, 4,
+  0, 24, 0, 24, 0, 55, 0, 16, 0, 17,
+  43, 43, 0, 20, 0, 38, 14, 0, 0, 0,
+  9, 0, 19, 12, 5, 26, 0, 0, 6, 0,
+  0, 22, 22, 0, 30, 56, 37, 1, 2, 80,
+  0, 0, 0, 42, 0, 0, 13, 12, 24, 0,
+  22, 14, 2, 28, 1, 67, 43, 9, 35, 30,
+  0, 0, 7, 25, 0, 0, 0, 0, 0, 0,
+  0, 6, 0, 17, 0, 1, 0, 13, 0, 7,
+  81, 29, 34, 0, 48, 9, 42, 0, 38, 19,
+  0, 0, 0, 34, 49, 0, 25, 0, 17, 0,
+  0, 0, 0, 0, 29, 51, 2, 46, 15, 40,
+  0, 20, 33, 0, 79, 40, 0, 20, 0, 0,
+  0, 0, 25, 0, 0, 0, 0, 0, 0, 5,
+  0, 35, 63, 42, 0, 75, 56, 0, 0, 0,
+  0, 4, 0, 42, 63, 0, 1, 0, 44, 5,
+  9, 0, 0, 3, 0, 23, 0, 0, 26, 7,
+  0, 0, 0, 3, 4, 30, 12, 34, 0, 8,
+  0, 0, 40, 0, 0, 0, 68, 13, 0, 0,
+  40, 12, 0, 29, 32, 0, 0, 30, 0, 0,
+  0, 46, 0, 0, 0, 0, 5, 0, 0, 0,
+  0, 29, 58, 4, 0, 15, 30, 0, 26, 17,
+  54, 0, 15, 0, 9, 0, 76, 5, 0, 0,
+  17, 8, 86, 68, 23, 217, 0, 0, 29, 0,
+  0, 0, 32, 0, 0, 0, 31, 18, 66, 0,
+  0, 112, 15, 8, 7, 0, 0, 35, 0, 72,
+  0, 82, 0, 0, 0, 30, 0, 0, 1, 0,
+  0, 19, 0, 19, 0, 50, 59, 42, 0, 14,
+  0, 45, 0, 0, 97, 0, 62, 0, 33, 0,
+  0, 70, 0, 0, 53, 0, 0, 26, 12, 6,
+  27, 25, 76, 0, 0, 26, 25, 0, 0, 18,
+  0, 0, 77, 83, 0, 0, 0, 18, 0, 4,
+  54, 0, 0, 0, 24, 0, 25, 0, 15, 39,
+  25, 35, 17, 0, 0, 31, 47, 29, 0, 0,
+  0, 45, 0, 0, 0, 0, 38, 0, 3, 0,
+  0, 1, 0, 22, 25, 0, 0, 20, 0, 0,
+  0, 0, 1, 125, 0, 0, 0, 0, 0, 0,
+  59, 8, 0, 44, 12, 40, 18, 0, 40, 6,
+  0, 49, 0, 0, 0, 0, 0, 14, 40, 0,
+  0, 17, 0, 8, 0, 16, 0, 48, 35, 47,
+  0, 33, 1, 0, 7, 27, 0, 35, 0, 77,
+  28, 0, 14, 0, 38, 0, 36, 0, 0, 14,
+  0, 11, 0, 0, 0, 3, 8, 0, 16, 34,
+  27, 15, 0, 70, 0, 0, 0, 26, 7, 0,
+  14, 12, 42, 0, 12, 0, 8, 25, 0, 47,
+  52, 0, 15, 13, 0, 0, 17, 28, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 32, 29, 12,
+  0, 47, 0, 0, 66, 14, 50, 0, 35, 14,
+  18, 0, 67, 1, 0, 0, 0, 0, 77, 0,
+  0, 0, 2, 0, 0, 0, 0, 1, 29, 58,
+  0, 41, 0, 69, 29, 7, 59, 19, 117, 17,
+  0, 0, 0, 5, 0, 0, 15, 0, 0, 0,
+  0, 13, 0, 12, 0, 0, 66, 0, 0, 79,
+  32, 0, 0, 0, 0, 6, 0, 87, 7, 0,
+  39, 0, 49, 0, 7, 0, 0, 1, 10, 0,
+  77, 0, 0, 21, 0, 50, 0, 0, 2, 19,
+  0, 7, 0, 0, 0, 0, 19, 0, 2, 0,
+  62, 8, 0, 0, 25, 0, 0, 13, 0, 0,
+  16, 30, 0, 0, 0, 54, 3, 0, 0, 0,
+  20, 0, 0, 0, 0, 0, 62, 11, 0, 38,
+  13, 0, 89, 23, 44, 14, 34, 0, 0, 0,
+  57, 0, 15, 0, 0, 0, 30, 0, 26, 161,
+  0, 0, 0, 0, 0, 0, 49, 60, 0, 0,
+  11, 55, 0, 0, 7, 16, 0, 50, 0, 0,
+  0, 0, 0, 35, 21, 0, 0, 13, 0, 0,
+  0, 55, 0, 3, 0, 20, 0, 22, 0, 12,
+  34, 22, 0, 0, 13, 103, 4, 0, 17, 0,
+  10, 0, 46, 0, 0, 0, 0, 0, 54, 0,
+  0, 2, 0, 4, 0, 34, 24, 5, 0, 40,
+  0, 0, 0, 10, 0, 0, 18, 36, 19, 0,
+  31, 36, 38, 0, 0, 22, 13, 0, 4, 0,
+  0, 0, 1, 46, 1, 0, 0, 0, 0, 10,
+  0, 22, 0, 25, 23, 0, 0, 0, 5, 29,
+  102, 47, 32, 3, 54, 0, 0, 0, 37, 15,
+  0, 14, 0, 49, 11, 0, 44, 0, 25, 0,
+  19, 0, 0, 0, 81, 51, 5, 17, 15, 0,
+  0, 0, 3, 0, 0, 60, 21, 63, 0, 0,
+  0, 12, 63, 0, 0, 27, 12, 0, 0, 6,
+  0, 70, 0, 97, 10, 75, 53, 0, 0, 0,
+  0, 6, 0, 65, 94, 0, 0, 3, 21, 23,
+  4, 21, 0, 0, 0, 70, 0, 12, 8, 0,
+  0, 0, 0, 33, 0, 19, 20, 29, 0, 0,
+  0, 27, 44, 20, 19, 0, 78, 0, 29, 0,
+  66, 38, 0, 0, 42, 37, 0, 32, 0, 38,
+  3, 45, 0, 0, 0, 0, 0, 0, 3, 5,
+  71, 72, 88, 0, 0, 7, 31, 0, 0, 31,
+  64, 18, 57, 10, 85, 0, 91, 2, 0, 0,
+  0, 21, 76, 0, 26, 0, 1, 0, 0, 0,
+  0, 6, 28, 78, 0, 20, 4, 29, 21, 10,
+  35, 34, 113, 11, 0, 0, 0, 0, 0, 0,
+  18, 0, 0, 0, 0, 0, 0, 1, 0, 10,
+  66, 3, 0, 101, 57, 6, 0, 0, 0, 0,
+  0, 90, 1, 0, 17, 0, 40, 0, 25, 0,
+  0, 10, 7, 19, 34, 0, 0, 18, 0, 29,
+  0, 0, 0, 43, 3, 0, 0, 28, 0, 0,
+  37, 0, 22, 0, 65, 9, 0, 0, 20, 0,
+  0, 16, 13, 0, 0, 46, 0, 0, 0, 39,
+  0, 0, 0, 0, 1, 0, 0, 4, 0, 7,
+  72, 14, 0, 12, 20, 0, 52, 13, 51, 13,
+  13, 0, 0, 0, 64, 0, 0, 0, 0, 0,
+  0, 5, 19, 184, 0, 0, 0, 0, 0, 0,
+  30, 14, 0, 24, 4, 50, 5, 0, 21, 0,
+  0, 62, 18, 19, 0, 0, 0, 10, 18, 0,
+  0, 34, 0, 4, 0, 24, 0, 24, 0, 55,
+  0, 16, 0, 17, 43, 43, 0, 20, 0, 38,
+  14, 0, 0, 0, 9, 0, 19, 12, 5, 26,
+  0, 0, 6, 0, 0, 22, 22, 0, 30, 56,
+  37, 1, 2, 80, 0, 0, 0, 42, 0, 0,
+  13, 12, 24, 0, 22, 14, 2, 28, 1, 67,
+  43, 9, 35, 30, 0, 0, 7, 25, 0, 0,
+  0, 0, 0, 0, 0, 6, 0, 17, 0, 1,
+  0, 13, 0, 7, 81, 29, 34, 0, 48, 9,
+  42, 0, 38, 19, 0, 0, 0, 34, 49, 0,
+  25, 0, 17, 0, 0, 0, 0, 0, 29, 51,
+  2, 46, 15, 40, 0, 20, 33, 0, 79, 40,
+  0, 20, 0, 0, 0, 0, 25, 0, 0, 0,
+  0, 0, 0, 5, 0, 35, 63, 42, 0, 75,
+  56, 0, 0, 0, 0, 4, 0, 42, 63, 0,
+  1, 0, 44, 5, 9, 0, 0, 3, 0, 23,
+  0, 0, 26, 7, 0, 0, 0, 3, 4, 30,
+  12, 34, 0, 8, 0, 0, 40, 0, 0, 0,
+  68, 13, 0, 0, 40, 12, 0, 29, 32, 0,
+  0, 30, 0, 0, 0, 46, 0, 0, 0, 0,
+  5, 0, 0, 0, 0, 29, 58, 4, 0, 15,
+  30, 0, 26, 17, 54, 0, 15, 0, 9, 0,
+  76, 5, 0, 0, 10, 0, 77, 0, 9, 10,
+  0, 0, 4, 0, 0, 8, 3, 82, 0, 0,
+  0, 46, 42, 0, 45, 68, 136, 0, 0, 0,
+  0, 0, 0, 0, 3, 0, 0, 0, 0, 9,
+  0, 0, 0, 0, 33, 0, 0, 90, 40, 14,
+  0, 21, 0, 0, 0, 136, 0, 0, 74, 0,
+  41, 0, 36, 0, 0, 0, 35, 0, 125, 0,
+  0, 23, 0, 91, 0, 0, 13, 4, 0, 0,
+  7, 0, 0, 0, 15, 0, 23, 0, 45, 6,
+  0, 0, 20, 0, 0, 0, 0, 0, 24, 27,
+  0, 0, 0, 52, 15, 0, 0, 0, 14, 0,
+  0, 2, 0, 0, 69, 4, 0, 37, 12, 0,
+  118, 0, 23, 19, 24, 0, 0, 0, 53, 0,
+  0, 0, 0, 0, 0, 0, 1, 125, 0, 0,
+  0, 0, 0, 0, 59, 8, 0, 44, 12, 40,
+  18, 0, 40, 6, 0, 49, 0, 0, 0, 0,
+  0, 14, 40, 0, 0, 17, 0, 8, 0, 16,
+  0, 48, 35, 47, 0, 33, 1, 0, 7, 27,
+  0, 35, 0, 77, 28, 0, 14, 0, 38, 0,
+  36, 0, 0, 14, 0, 11, 0, 0, 0, 3,
+  8, 0, 16, 34, 27, 15, 0, 70, 0, 0,
+  0, 26, 7, 0, 14, 12, 42, 0, 12, 0,
+  8, 25, 0, 47, 52, 0, 15, 13, 0, 0,
+  17, 28, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 32, 29, 12, 0, 47, 0, 0, 66, 14,
+  50, 0, 35, 14, 18, 0, 67, 1, 0, 0,
+  0, 0, 77, 0, 0, 0, 2, 0, 0, 0,
+  0, 1, 29, 58, 0, 41, 0, 69, 29, 7,
+  59, 19, 117, 17, 0, 0, 0, 5, 0, 0,
+  15, 0, 0, 0, 0, 13, 0, 12, 0, 0,
+  66, 0, 0, 79, 32, 0, 0, 0, 0, 6,
+  0, 87, 7, 0, 39, 0, 49, 0, 7, 0,
+  0, 1, 10, 0, 77, 0, 0, 21, 0, 50,
+  0, 0, 2, 19, 0, 7, 0, 0, 0, 0,
+  19, 0, 2, 0, 62, 8, 0, 0, 25, 0,
+  0, 13, 0, 0, 16, 30, 0, 0, 0, 54,
+  3, 0, 0, 0, 20, 0, 0, 0, 0, 0,
+  62, 11, 0, 38, 13, 0, 89, 23, 44, 14,
+  34, 0, 0, 0, 57, 0, 15, 0, 25, 0,
+  64, 0, 17, 12, 0, 0, 23, 0, 0, 6,
+  16, 72, 0, 0, 0, 19, 42, 0, 48, 60,
+  61, 0, 0, 0, 0, 26, 0, 41, 0, 0,
+  0, 0, 0, 3, 0, 6, 0, 0, 0, 0,
+  0, 69, 18, 17, 0, 65, 0, 0, 0, 167,
+  0, 0, 66, 0, 29, 0, 4, 0, 0, 0,
+  24, 0, 113, 0, 0, 10, 0, 64, 0, 4,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  12, 0, 32, 1, 0, 15, 43, 0, 26, 0,
+  0, 0, 27, 0, 11, 0, 0, 71, 39, 0,
+  0, 0, 13, 0, 0, 24, 30, 0, 73, 0,
+  0, 44, 14, 0, 155, 0, 5, 26, 74, 0,
+  0, 0, 54, 0, 0, 0, 0, 49, 11, 0,
+  44, 0, 25, 0, 19, 0, 0, 0, 81, 51,
+  5, 17, 15, 0, 0, 0, 3, 0, 0, 60,
+  21, 63, 0, 0, 0, 12, 63, 0, 0, 27,
+  12, 0, 0, 6, 0, 70, 0, 97, 10, 75,
+  53, 0, 0, 0, 0, 6, 0, 65, 94, 0,
+  0, 3, 21, 23, 4, 21, 0, 0, 0, 70,
+  0, 12, 8, 0, 0, 0, 0, 33, 0, 19,
+  20, 29, 0, 0, 0, 27, 44, 20, 19, 0,
+  78, 0, 29, 0, 66, 38, 0, 0, 42, 37,
+  0, 32, 0, 38, 3, 45, 0, 0, 0, 0,
+  0, 0, 3, 5, 71, 72, 88, 0, 0, 7,
+  31, 0, 0, 31, 64, 18, 57, 10, 85, 0,
+  91, 2, 0, 0, 0, 21, 76, 0, 26, 0,
+  1, 0, 0, 0, 0, 6, 28, 78, 0, 20,
+  4, 29, 21, 10, 35, 34, 113, 11, 0, 0,
+  0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
+  0, 1, 0, 10, 66, 3, 0, 101, 57, 6,
+  0, 0, 0, 0, 0, 90, 1, 0, 17, 0,
+  40, 0, 25, 0, 0, 10, 7, 19, 34, 0,
+  0, 18, 0, 29, 0, 0, 0, 43, 3, 0,
+  0, 28, 0, 0, 37, 0, 22, 0, 65, 9,
+  0, 0, 20, 0, 0, 16, 13, 0, 0, 46,
+  0, 0, 0, 39, 0, 0, 0, 0, 1, 0,
+  0, 4, 0, 7, 72, 14, 0, 12, 20, 0,
+  52, 13, 51, 13, 13, 0, 0, 0, 64, 0,
+  0, 0, 4, 0, 79, 3, 6, 0, 0, 0,
+  14, 0, 0, 8, 0, 94, 0, 3, 0, 47,
+  45, 17, 53, 54, 102, 0, 0, 0, 0, 16,
+  0, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+  0, 0, 37, 0, 0, 85, 38, 32, 0, 6,
+  0, 0, 0, 126, 0, 0, 66, 0, 24, 0,
+  20, 0, 0, 0, 29, 0, 99, 0, 0, 10,
+  0, 92, 0, 0, 18, 0, 0, 0, 4, 0,
+  0, 0, 11, 0, 20, 0, 18, 0, 0, 0,
+  39, 0, 0, 7, 0, 0, 22, 29, 2, 0,
+  4, 32, 23, 0, 0, 0, 28, 0, 0, 3,
+  17, 0, 84, 3, 0, 15, 21, 0, 112, 0,
+  10, 16, 55, 0, 0, 0, 57, 15, 0, 0,
+  0, 34, 49, 0, 25, 0, 17, 0, 0, 0,
+  0, 0, 29, 51, 2, 46, 15, 40, 0, 20,
+  33, 0, 79, 40, 0, 20, 0, 0, 0, 0,
+  25, 0, 0, 0, 0, 0, 0, 5, 0, 35,
+  63, 42, 0, 75, 56, 0, 0, 0, 0, 4,
+  0, 42, 63, 0, 1, 0, 44, 5, 9, 0,
+  0, 3, 0, 23, 0, 0, 26, 7, 0, 0,
+  0, 3, 4, 30, 12, 34, 0, 8, 0, 0,
+  40, 0, 0, 0, 68, 13, 0, 0, 40, 12,
+  0, 29, 32, 0, 0, 30, 0, 0, 0, 46,
+  0, 0, 0, 0, 5, 0, 0, 0, 0, 29,
+  58, 4, 0, 15, 30, 0, 26, 17, 54, 0,
+  15, 0, 9, 0, 76, 5, 0, 0, 10, 0,
+  77, 0, 9, 10, 0, 0, 4, 0, 0, 8,
+  3, 82, 0, 0, 0, 46, 42, 0, 45, 68,
+  136, 0, 0, 0, 0, 0, 0, 0, 3, 0,
+  0, 0, 0, 9, 0, 0, 0, 0, 33, 0,
+  0, 90, 40, 14, 0, 21, 0, 0, 0, 136,
+  0, 0, 74, 0, 41, 0, 36, 0, 0, 0,
+  35, 0, 125, 0, 0, 23, 0, 91, 0, 0,
+  13, 4, 0, 0, 7, 0, 0, 0, 15, 0,
+  23, 0, 45, 6, 0, 0, 20, 0, 0, 0,
+  0, 0, 24, 27, 0, 0, 0, 52, 15, 0,
+  0, 0, 14, 0, 0, 2, 0, 0, 69, 4,
+  0, 37, 12, 0, 118, 0, 23, 19, 24, 0,
+  0, 0, 53, 0, 0, 0, 0, 0, 45, 1,
+  17, 0, 0, 0, 31, 0, 0, 0, 20, 82,
+  0, 0, 0, 11, 29, 0, 23, 30, 25, 5,
+  0, 0, 20, 43, 0, 53, 0, 0, 0, 0,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 45,
+  6, 26, 0, 49, 0, 0, 0, 152, 0, 16,
+  45, 0, 12, 0, 0, 0, 0, 0, 8, 0,
+  63, 0, 0, 6, 0, 72, 0, 0, 8, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 1, 0,
+  0, 0, 0, 44, 53, 0, 44, 0, 0, 0,
+  18, 0, 36, 0, 0, 72, 23, 0, 15, 0,
+  42, 0, 1, 20, 65, 0, 81, 0, 0, 14,
+  40, 0, 141, 0, 0, 33, 89, 0, 30, 0,
+  58, 0, 0, 0, 0, 0, 77, 0, 0, 0,
+  2, 0, 0, 0, 0, 1, 29, 58, 0, 41,
+  0, 69, 29, 7, 59, 19, 117, 17, 0, 0,
+  0, 5, 0, 0, 15, 0, 0, 0, 0, 13,
+  0, 12, 0, 0, 66, 0, 0, 79, 32, 0,
+  0, 0, 0, 6, 0, 87, 7, 0, 39, 0,
+  49, 0, 7, 0, 0, 1, 10, 0, 77, 0,
+  0, 21, 0, 50, 0, 0, 2, 19, 0, 7,
+  0, 0, 0, 0, 19, 0, 2, 0, 62, 8,
+  0, 0, 25, 0, 0, 13, 0, 0, 16, 30,
+  0, 0, 0, 54, 3, 0, 0, 0, 20, 0,
+  0, 0, 0, 0, 62, 11, 0, 38, 13, 0,
+  89, 23, 44, 14, 34, 0, 0, 0, 57, 0,
+  15, 0, 25, 0, 64, 0, 17, 12, 0, 0,
+  23, 0, 0, 6, 16, 72, 0, 0, 0, 19,
+  42, 0, 48, 60, 61, 0, 0, 0, 0, 26,
+  0, 41, 0, 0, 0, 0, 0, 3, 0, 6,
+  0, 0, 0, 0, 0, 69, 18, 17, 0, 65,
+  0, 0, 0, 167, 0, 0, 66, 0, 29, 0,
+  4, 0, 0, 0, 24, 0, 113, 0, 0, 10,
+  0, 64, 0, 4, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 12, 0, 32, 1, 0, 15,
+  43, 0, 26, 0, 0, 0, 27, 0, 11, 0,
+  0, 71, 39, 0, 0, 0, 13, 0, 0, 24,
+  30, 0, 73, 0, 0, 44, 14, 0, 155, 0,
+  5, 26, 74, 0, 0, 0, 54, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 0, 14, 34, 15,
+  0, 0, 26, 34, 0, 0, 0, 21, 29, 0,
+  8, 0, 0, 45, 0, 0, 48, 64, 6, 83,
+  0, 0, 55, 0, 0, 0, 0, 1, 0, 5,
+  0, 0, 0, 16, 10, 46, 0, 58, 0, 8,
+  7, 104, 37, 30, 33, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 6, 0, 0, 19,
+  0, 0, 21, 0, 0, 63, 0, 0, 0, 9,
+  39, 0, 0, 13, 0, 0, 0, 59, 43, 21,
+  114, 3, 0, 0, 28, 0, 36, 0, 0, 91,
+  40, 0, 32, 0, 7, 0, 28, 8, 75, 20,
+  37, 0, 0, 8, 5, 0, 131, 0, 0, 37,
+  103, 0, 101, 0, 70, 0, 0, 0, 0, 21,
+  76, 0, 26, 0, 1, 0, 0, 0, 0, 6,
+  28, 78, 0, 20, 4, 29, 21, 10, 35, 34,
+  113, 11, 0, 0, 0, 0, 0, 0, 18, 0,
+  0, 0, 0, 0, 0, 1, 0, 10, 66, 3,
+  0, 101, 57, 6, 0, 0, 0, 0, 0, 90,
+  1, 0, 17, 0, 40, 0, 25, 0, 0, 10,
+  7, 19, 34, 0, 0, 18, 0, 29, 0, 0,
+  0, 43, 3, 0, 0, 28, 0, 0, 37, 0,
+  22, 0, 65, 9, 0, 0, 20, 0, 0, 16,
+  13, 0, 0, 46, 0, 0, 0, 39, 0, 0,
+  0, 0, 1, 0, 0, 4, 0, 7, 72, 14,
+  0, 12, 20, 0, 52, 13, 51, 13, 13, 0,
+  0, 0, 64, 0, 0, 0, 4, 0, 79, 3,
+  6, 0, 0, 0, 14, 0, 0, 8, 0, 94,
+  0, 3, 0, 47, 45, 17, 53, 54, 102, 0,
+  0, 0, 0, 16, 0, 0, 0, 0, 0, 0,
+  0, 14, 0, 0, 0, 0, 37, 0, 0, 85,
+  38, 32, 0, 6, 0, 0, 0, 126, 0, 0,
+  66, 0, 24, 0, 20, 0, 0, 0, 29, 0,
+  99, 0, 0, 10, 0, 92, 0, 0, 18, 0,
+  0, 0, 4, 0, 0, 0, 11, 0, 20, 0,
+  18, 0, 0, 0, 39, 0, 0, 7, 0, 0,
+  22, 29, 2, 0, 4, 32, 23, 0, 0, 0,
+  28, 0, 0, 3, 17, 0, 84, 3, 0, 15,
+  21, 0, 112, 0, 10, 16, 55, 0, 0, 0,
+  57, 15, 0, 0, 2, 0, 42, 31, 0, 0,
+  14, 24, 59, 0, 4, 0, 0, 82, 0, 0,
+  0, 8, 26, 0, 35, 19, 23, 27, 0, 0,
+  38, 57, 187, 16, 19, 10, 32, 0, 0, 0,
+  0, 25, 0, 0, 0, 0, 0, 32, 38, 93,
+  0, 17, 0, 0, 3, 110, 0, 32, 59, 0,
+  9, 0, 14, 0, 0, 22, 8, 0, 4, 0,
+  20, 0, 0, 39, 0, 6, 29, 4, 0, 9,
+  34, 0, 0, 0, 24, 0, 1, 24, 0, 0,
+  0, 30, 103, 45, 40, 0, 0, 0, 18, 12,
+  59, 0, 26, 51, 26, 6, 18, 0, 84, 0,
+  42, 12, 87, 0, 79, 0, 10, 0, 1, 0,
+  115, 0, 0, 34, 41, 0, 5, 0, 59, 9,
+  0, 24, 10, 0, 77, 0, 9, 10, 0, 0,
+  4, 0, 0, 8, 3, 82, 0, 0, 0, 46,
+  42, 0, 45, 68, 136, 0, 0, 0, 0, 0,
+  0, 0, 3, 0, 0, 0, 0, 9, 0, 0,
+  0, 0, 33, 0, 0, 90, 40, 14, 0, 21,
+  0, 0, 0, 136, 0, 0, 74, 0, 41, 0,
+  36, 0, 0, 0, 35, 0, 125, 0, 0, 23,
+  0, 91, 0, 0, 13, 4, 0, 0, 7, 0,
+  0, 0, 15, 0, 23, 0, 45, 6, 0, 0,
+  20, 0, 0, 0, 0, 0, 24, 27, 0, 0,
+  0, 52, 15, 0, 0, 0, 14, 0, 0, 2,
+  0, 0, 69, 4, 0, 37, 12, 0, 118, 0,
+  23, 19, 24, 0, 0, 0, 53, 0, 0, 0,
+  0, 0, 45, 1, 17, 0, 0, 0, 31, 0,
+  0, 0, 20, 82, 0, 0, 0, 11, 29, 0,
+  23, 30, 25, 5, 0, 0, 20, 43, 0, 53,
+  0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 45, 6, 26, 0, 49, 0, 0,
+  0, 152, 0, 16, 45, 0, 12, 0, 0, 0,
+  0, 0, 8, 0, 63, 0, 0, 6, 0, 72,
+  0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+  13, 0, 1, 0, 0, 0, 0, 44, 53, 0,
+  44, 0, 0, 0, 18, 0, 36, 0, 0, 72,
+  23, 0, 15, 0, 42, 0, 1, 20, 65, 0,
+  81, 0, 0, 14, 40, 0, 141, 0, 0, 33,
+  89, 0, 30, 0, 58, 0, 0, 0, 0, 0,
+  24, 23, 0, 0, 18, 24, 50, 29, 0, 0,
+  0, 30, 0, 5, 4, 7, 13, 0, 0, 0,
+  0, 53, 0, 0, 74, 59, 173, 47, 0, 0,
+  71, 0, 19, 0, 0, 20, 0, 24, 0, 0,
+  0, 0, 18, 88, 16, 0, 0, 16, 0, 67,
+  30, 34, 32, 0, 0, 4, 0, 6, 0, 39,
+  0, 0, 0, 0, 33, 0, 0, 14, 6, 12,
+  56, 3, 0, 51, 0, 0, 0, 3, 39, 0,
+  0, 33, 0, 0, 0, 48, 80, 41, 84, 0,
+  0, 0, 23, 0, 51, 0, 2, 59, 14, 2,
+  58, 0, 66, 2, 56, 3, 77, 5, 38, 0,
+  11, 0, 0, 0, 103, 0, 0, 17, 53, 0,
+  50, 0, 60, 0, 7, 11, 25, 0, 64, 0,
+  17, 12, 0, 0, 23, 0, 0, 6, 16, 72,
+  0, 0, 0, 19, 42, 0, 48, 60, 61, 0,
+  0, 0, 0, 26, 0, 41, 0, 0, 0, 0,
+  0, 3, 0, 6, 0, 0, 0, 0, 0, 69,
+  18, 17, 0, 65, 0, 0, 0, 167, 0, 0,
+  66, 0, 29, 0, 4, 0, 0, 0, 24, 0,
+  113, 0, 0, 10, 0, 64, 0, 4, 0, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 12, 0,
+  32, 1, 0, 15, 43, 0, 26, 0, 0, 0,
+  27, 0, 11, 0, 0, 71, 39, 0, 0, 0,
+  13, 0, 0, 24, 30, 0, 73, 0, 0, 44,
+  14, 0, 155, 0, 5, 26, 74, 0, 0, 0,
+  54, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  0, 14, 34, 15, 0, 0, 26, 34, 0, 0,
+  0, 21, 29, 0, 8, 0, 0, 45, 0, 0,
+  48, 64, 6, 83, 0, 0, 55, 0, 0, 0,
+  0, 1, 0, 5, 0, 0, 0, 16, 10, 46,
+  0, 58, 0, 8, 7, 104, 37, 30, 33, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  6, 0, 0, 19, 0, 0, 21, 0, 0, 63,
+  0, 0, 0, 9, 39, 0, 0, 13, 0, 0,
+  0, 59, 43, 21, 114, 3, 0, 0, 28, 0,
+  36, 0, 0, 91, 40, 0, 32, 0, 7, 0,
+  28, 8, 75, 20, 37, 0, 0, 8, 5, 0,
+  131, 0, 0, 37, 103, 0, 101, 0, 70, 0,
+  0, 0, 0, 6, 23, 5, 0, 0, 44, 22,
+  34, 36, 0, 0, 1, 0, 0, 41, 20, 23,
+  3, 8, 0, 0, 0, 69, 18, 19, 51, 49,
+  164, 7, 0, 0, 85, 0, 15, 0, 0, 31,
+  6, 63, 0, 3, 29, 0, 23, 56, 20, 0,
+  0, 47, 0, 43, 48, 47, 7, 0, 0, 20,
+  0, 28, 0, 23, 0, 0, 0, 3, 58, 0,
+  2, 0, 18, 22, 54, 25, 23, 58, 0, 0,
+  0, 13, 76, 0, 7, 17, 0, 0, 4, 37,
+  62, 48, 83, 0, 0, 0, 8, 13, 24, 0,
+  0, 55, 0, 0, 26, 0, 38, 0, 56, 0,
+  44, 17, 29, 0, 10, 0, 0, 0, 37, 0,
+  0, 16, 21, 0, 77, 0, 71, 0, 5, 0,
+  4, 0, 79, 3, 6, 0, 0, 0, 14, 0,
+  0, 8, 0, 94, 0, 3, 0, 47, 45, 17,
+  53, 54, 102, 0, 0, 0, 0, 16, 0, 0,
+  0, 0, 0, 0, 0, 14, 0, 0, 0, 0,
+  37, 0, 0, 85, 38, 32, 0, 6, 0, 0,
+  0, 126, 0, 0, 66, 0, 24, 0, 20, 0,
+  0, 0, 29, 0, 99, 0, 0, 10, 0, 92,
+  0, 0, 18, 0, 0, 0, 4, 0, 0, 0,
+  11, 0, 20, 0, 18, 0, 0, 0, 39, 0,
+  0, 7, 0, 0, 22, 29, 2, 0, 4, 32,
+  23, 0, 0, 0, 28, 0, 0, 3, 17, 0,
+  84, 3, 0, 15, 21, 0, 112, 0, 10, 16,
+  55, 0, 0, 0, 57, 15, 0, 0, 2, 0,
+  42, 31, 0, 0, 14, 24, 59, 0, 4, 0,
+  0, 82, 0, 0, 0, 8, 26, 0, 35, 19,
+  23, 27, 0, 0, 38, 57, 187, 16, 19, 10,
+  32, 0, 0, 0, 0, 25, 0, 0, 0, 0,
+  0, 32, 38, 93, 0, 17, 0, 0, 3, 110,
+  0, 32, 59, 0, 9, 0, 14, 0, 0, 22,
+  8, 0, 4, 0, 20, 0, 0, 39, 0, 6,
+  29, 4, 0, 9, 34, 0, 0, 0, 24, 0,
+  1, 24, 0, 0, 0, 30, 103, 45, 40, 0,
+  0, 0, 18, 12, 59, 0, 26, 51, 26, 6,
+  18, 0, 84, 0, 42, 12, 87, 0, 79, 0,
+  10, 0, 1, 0, 115, 0, 0, 34, 41, 0,
+  5, 0, 59, 9, 0, 24, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 45, 1, 17, 0,
+  0, 0, 31, 0, 0, 0, 20, 82, 0, 0,
+  0, 11, 29, 0, 23, 30, 25, 5, 0, 0,
+  20, 43, 0, 53, 0, 0, 0, 0, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 45, 6, 26,
+  0, 49, 0, 0, 0, 152, 0, 16, 45, 0,
+  12, 0, 0, 0, 0, 0, 8, 0, 63, 0,
+  0, 6, 0, 72, 0, 0, 8, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 1, 0, 0, 0,
+  0, 44, 53, 0, 44, 0, 0, 0, 18, 0,
+  36, 0, 0, 72, 23, 0, 15, 0, 42, 0,
+  1, 20, 65, 0, 81, 0, 0, 14, 40, 0,
+  141, 0, 0, 33, 89, 0, 30, 0, 58, 0,
+  0, 0, 0, 0, 24, 23, 0, 0, 18, 24,
+  50, 29, 0, 0, 0, 30, 0, 5, 4, 7,
+  13, 0, 0, 0, 0, 53, 0, 0, 74, 59,
+  173, 47, 0, 0, 71, 0, 19, 0, 0, 20,
+  0, 24, 0, 0, 0, 0, 18, 88, 16, 0,
+  0, 16, 0, 67, 30, 34, 32, 0, 0, 4,
+  0, 6, 0, 39, 0, 0, 0, 0, 33, 0,
+  0, 14, 6, 12, 56, 3, 0, 51, 0, 0,
+  0, 3, 39, 0, 0, 33, 0, 0, 0, 48,
+  80, 41, 84, 0, 0, 0, 23, 0, 51, 0,
+  2, 59, 14, 2, 58, 0, 66, 2, 56, 3,
+  77, 5, 38, 0, 11, 0, 0, 0, 103, 0,
+  0, 17, 53, 0, 50, 0, 60, 0, 7, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 0, 14, 34, 15, 0, 0,
+  26, 34, 0, 0, 0, 21, 29, 0, 8, 0,
+  0, 45, 0, 0, 48, 64, 6, 83, 0, 0,
+  55, 0, 0, 0, 0, 1, 0, 5, 0, 0,
+  0, 16, 10, 46, 0, 58, 0, 8, 7, 104,
+  37, 30, 33, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 6, 0, 0, 19, 0, 0,
+  21, 0, 0, 63, 0, 0, 0, 9, 39, 0,
+  0, 13, 0, 0, 0, 59, 43, 21, 114, 3,
+  0, 0, 28, 0, 36, 0, 0, 91, 40, 0,
+  32, 0, 7, 0, 28, 8, 75, 20, 37, 0,
+  0, 8, 5, 0, 131, 0, 0, 37, 103, 0,
+  101, 0, 70, 0, 0, 0, 0, 6, 23, 5,
+  0, 0, 44, 22, 34, 36, 0, 0, 1, 0,
+  0, 41, 20, 23, 3, 8, 0, 0, 0, 69,
+  18, 19, 51, 49, 164, 7, 0, 0, 85, 0,
+  15, 0, 0, 31, 6, 63, 0, 3, 29, 0,
+  23, 56, 20, 0, 0, 47, 0, 43, 48, 47,
+  7, 0, 0, 20, 0, 28, 0, 23, 0, 0,
+  0, 3, 58, 0, 2, 0, 18, 22, 54, 25,
+  23, 58, 0, 0, 0, 13, 76, 0, 7, 17,
+  0, 0, 4, 37, 62, 48, 83, 0, 0, 0,
+  8, 13, 24, 0, 0, 55, 0, 0, 26, 0,
+  38, 0, 56, 0, 44, 17, 29, 0, 10, 0,
+  0, 0, 37, 0, 0, 16, 21, 0, 77, 0,
+  71, 0, 5, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 62, 32, 0, 2, 1, 44, 3, 0, 0,
+  16, 4, 12, 0, 5, 53, 33, 30, 0, 74,
+  61, 0, 71, 46, 0, 36, 0, 3, 111, 34,
+  1, 0, 57, 0, 53, 22, 0, 16, 0, 48,
+  40, 30, 5, 36, 99, 16, 0, 12, 0, 8,
+  1, 0, 56, 0, 0, 0, 43, 0, 7, 33,
+  9, 0, 16, 0, 0, 0, 18, 21, 0, 0,
+  8, 32, 42, 43, 43, 31, 0, 15, 0, 0,
+  70, 13, 10, 0, 12, 12, 0, 0, 50, 9,
+  2, 0, 16, 0, 5, 73, 0, 0, 8, 21,
+  2, 0, 0, 16, 17, 0, 77, 9, 0, 22,
+  29, 1, 0, 33, 0, 0, 0, 15, 0, 33,
+  26, 0, 0, 0, 28, 0, 14, 0, 5, 45,
+  49, 8, 0, 13, 12, 23, 0, 0, 0, 49,
+  90, 0, 0, 29, 44, 13, 0, 25, 68, 58,
+  82, 13, 0, 0, 0, 11, 0, 0, 0, 0,
+  81, 0, 34, 31, 0, 20, 0, 59, 2, 29,
+  0, 28, 67, 52, 0, 60, 0, 43, 0, 42,
+  24, 0, 22, 0, 17, 0, 7, 0, 0, 0,
+  0, 9, 8, 0, 0, 0, 16, 0, 14, 13,
+  19, 19, 30, 0, 40, 53, 0, 19, 43, 0,
+  42, 0, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 33, 18, 0, 37, 45, 21, 0,
+  0, 23, 29, 0, 60, 0, 0, 7, 11, 13,
+  0, 17, 0, 0, 0, 0, 1, 9, 37, 0,
+  7, 0, 52, 0, 8, 2, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 74, 43, 0, 0, 0,
+  41, 0, 0, 0, 0, 15, 3, 0, 14, 72,
+  38, 47, 0, 64, 66, 0, 81, 51, 0, 26,
+  10, 14, 118, 35, 2, 0, 62, 0, 42, 8,
+  0, 26, 7, 52, 32, 25, 0, 26, 85, 30,
+  0, 8, 0, 25, 0, 13, 61, 0, 0, 0,
+  25, 0, 4, 20, 16, 0, 7, 0, 0, 0,
+  21, 2, 0, 0, 14, 32, 32, 38, 42, 30,
+  5, 5, 0, 0, 76, 3, 4, 0, 0, 15,
+  0, 0, 64, 23, 0, 0, 7, 0, 8, 49,
+  0, 0, 22, 10, 3, 0, 1, 17, 39, 0,
+  77, 0, 0, 43, 30, 0, 0, 41, 0, 0,
+  0, 3, 0, 15, 30, 0, 0, 0, 22, 0,
+  36, 0, 4, 47, 62, 10, 0, 19, 11, 10,
+  1, 0, 0, 51, 73, 0, 0, 33, 47, 24,
+  0, 20, 69, 64, 93, 12, 0, 0, 0, 23,
+  0, 0, 0, 0, 74, 0, 23, 28, 0, 28,
+  0, 48, 1, 24, 0, 19, 53, 57, 0, 57,
+  0, 37, 0, 54, 25, 0, 42, 0, 29, 0,
+  2, 0, 1, 0, 0, 20, 15, 0, 0, 0,
+  26, 0, 13, 15, 11, 22, 32, 0, 46, 51,
+  0, 12, 44, 0, 35, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 24, 31, 0,
+  40, 41, 11, 0, 10, 24, 51, 0, 57, 0,
+  0, 3, 17, 15, 0, 12, 0, 0, 7, 0,
+  0, 7, 15, 4, 0, 0, 47, 0, 18, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 79,
+  42, 0, 0, 0, 53, 0, 5, 0, 0, 37,
+  2, 1, 18, 62, 41, 51, 0, 55, 86, 0,
+  87, 50, 0, 11, 5, 15, 128, 37, 1, 0,
+  72, 0, 36, 0, 0, 27, 0, 45, 39, 32,
+  0, 35, 80, 55, 0, 7, 0, 21, 12, 25,
+  62, 0, 16, 0, 27, 0, 29, 0, 13, 0,
+  11, 0, 0, 0, 25, 0, 9, 0, 3, 35,
+  41, 39, 37, 34, 23, 0, 0, 8, 79, 22,
+  1, 0, 0, 13, 0, 0, 82, 36, 0, 0,
+  20, 0, 0, 51, 0, 0, 48, 11, 5, 0,
+  0, 23, 29, 0, 77, 0, 0, 50, 18, 0,
+  0, 42, 0, 0, 0, 4, 5, 13, 24, 0,
+  0, 0, 28, 0, 34, 0, 7, 54, 57, 12,
+  0, 23, 17, 14, 2, 0, 0, 54, 68, 12,
+  2, 19, 58, 30, 0, 13, 72, 61, 94, 10,
+  0, 0, 0, 26, 0, 0, 0, 5, 68, 0,
+  20, 19, 0, 31, 0, 50, 4, 41, 0, 19,
+  53, 58, 0, 66, 0, 27, 0, 55, 24, 0,
+  51, 0, 26, 0, 10, 0, 0, 0, 0, 18,
+  3, 0, 0, 0, 34, 0, 14, 26, 9, 11,
+  35, 0, 48, 32, 0, 34, 37, 0, 35, 0,
+  0, 7, 0, 0, 0, 5, 0, 0, 0, 0,
+  0, 28, 25, 0, 59, 36, 0, 0, 14, 23,
+  43, 0, 49, 0, 0, 6, 11, 5, 0, 11,
+  0, 0, 8, 0, 8, 0, 0, 4, 5, 0,
+  45, 0, 20, 0, 0, 62, 32, 0, 2, 1,
+  44, 3, 0, 0, 16, 4, 12, 0, 5, 53,
+  33, 30, 0, 74, 61, 0, 71, 46, 0, 36,
+  0, 3, 111, 34, 1, 0, 57, 0, 53, 22,
+  0, 16, 0, 48, 40, 30, 5, 36, 99, 16,
+  0, 12, 0, 8, 1, 0, 56, 0, 0, 0,
+  43, 0, 7, 33, 9, 0, 16, 0, 0, 0,
+  18, 21, 0, 0, 8, 32, 42, 43, 43, 31,
+  0, 15, 0, 0, 70, 13, 10, 0, 12, 12,
+  0, 0, 50, 9, 2, 0, 16, 0, 5, 73,
+  0, 0, 8, 21, 2, 0, 0, 16, 17, 0,
+  77, 9, 0, 22, 29, 1, 0, 33, 0, 0,
+  0, 15, 0, 33, 26, 0, 0, 0, 28, 0,
+  14, 0, 5, 45, 49, 8, 0, 13, 12, 23,
+  0, 0, 0, 49, 90, 0, 0, 29, 44, 13,
+  0, 25, 68, 58, 82, 13, 0, 0, 0, 11,
+  0, 0, 0, 0, 81, 0, 34, 31, 0, 20,
+  0, 59, 2, 29, 0, 28, 67, 52, 0, 60,
+  0, 43, 0, 42, 24, 0, 22, 0, 17, 0,
+  7, 0, 0, 0, 0, 9, 8, 0, 0, 0,
+  16, 0, 14, 13, 19, 19, 30, 0, 40, 53,
+  0, 19, 43, 0, 42, 0, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 33, 18, 0,
+  37, 45, 21, 0, 0, 23, 29, 0, 60, 0,
+  0, 7, 11, 13, 0, 17, 0, 0, 0, 0,
+  1, 9, 37, 0, 7, 0, 52, 0, 8, 2,
+  2, 29, 35, 14, 0, 2, 25, 15, 25, 0,
+  0, 41, 100, 0, 19, 33, 52, 0, 0, 0,
+  0, 93, 0, 8, 42, 0, 0, 23, 0, 0,
+  0, 43, 78, 0, 33, 0, 0, 18, 0, 68,
+  0, 56, 40, 13, 39, 47, 17, 12, 0, 48,
+  0, 63, 25, 25, 42, 0, 13, 0, 12, 0,
+  4, 7, 0, 68, 0, 15, 1, 0, 32, 0,
+  7, 15, 0, 11, 0, 0, 44, 48, 0, 33,
+  43, 0, 60, 25, 0, 0, 0, 0, 0, 17,
+  0, 0, 0, 3, 0, 32, 43, 0, 2, 82,
+  3, 0, 8, 22, 34, 0, 25, 0, 0, 0,
+  17, 10, 0, 0, 0, 0, 0, 0, 2, 15,
+  15, 5, 38, 0, 55, 0, 13, 0, 0, 74,
+  43, 0, 0, 0, 41, 0, 0, 0, 0, 15,
+  3, 0, 14, 72, 38, 47, 0, 64, 66, 0,
+  81, 51, 0, 26, 10, 14, 118, 35, 2, 0,
+  62, 0, 42, 8, 0, 26, 7, 52, 32, 25,
+  0, 26, 85, 30, 0, 8, 0, 25, 0, 13,
+  61, 0, 0, 0, 25, 0, 4, 20, 16, 0,
+  7, 0, 0, 0, 21, 2, 0, 0, 14, 32,
+  32, 38, 42, 30, 5, 5, 0, 0, 76, 3,
+  4, 0, 0, 15, 0, 0, 64, 23, 0, 0,
+  7, 0, 8, 49, 0, 0, 22, 10, 3, 0,
+  1, 17, 39, 0, 77, 0, 0, 43, 30, 0,
+  0, 41, 0, 0, 0, 3, 0, 15, 30, 0,
+  0, 0, 22, 0, 36, 0, 4, 47, 62, 10,
+  0, 19, 11, 10, 1, 0, 0, 51, 73, 0,
+  0, 33, 47, 24, 0, 20, 69, 64, 93, 12,
+  0, 0, 0, 23, 0, 0, 0, 0, 74, 0,
+  23, 28, 0, 28, 0, 48, 1, 24, 0, 19,
+  53, 57, 0, 57, 0, 37, 0, 54, 25, 0,
+  42, 0, 29, 0, 2, 0, 1, 0, 0, 20,
+  15, 0, 0, 0, 26, 0, 13, 15, 11, 22,
+  32, 0, 46, 51, 0, 12, 44, 0, 35, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 24, 31, 0, 40, 41, 11, 0, 10, 24,
+  51, 0, 57, 0, 0, 3, 17, 15, 0, 12,
+  0, 0, 7, 0, 0, 7, 15, 4, 0, 0,
+  47, 0, 18, 0, 3, 30, 27, 20, 0, 12,
+  23, 23, 27, 0, 0, 40, 83, 0, 11, 31,
+  57, 0, 0, 0, 0, 92, 0, 1, 37, 0,
+  0, 25, 0, 0, 0, 50, 77, 0, 34, 0,
+  0, 19, 0, 54, 0, 46, 24, 10, 34, 52,
+  12, 15, 0, 33, 0, 55, 12, 26, 53, 0,
+  30, 0, 10, 0, 0, 13, 0, 58, 0, 13,
+  0, 0, 32, 0, 13, 16, 12, 11, 0, 0,
+  49, 39, 0, 32, 30, 0, 50, 41, 0, 0,
+  7, 0, 0, 13, 0, 0, 0, 16, 0, 30,
+  52, 0, 6, 80, 2, 0, 18, 20, 43, 0,
+  29, 0, 4, 0, 21, 11, 0, 0, 0, 0,
+  0, 0, 0, 11, 4, 11, 36, 0, 51, 0,
+  18, 0, 0, 79, 42, 0, 0, 0, 53, 0,
+  5, 0, 0, 37, 2, 1, 18, 62, 41, 51,
+  0, 55, 86, 0, 87, 50, 0, 11, 5, 15,
+  128, 37, 1, 0, 72, 0, 36, 0, 0, 27,
+  0, 45, 39, 32, 0, 35, 80, 55, 0, 7,
+  0, 21, 12, 25, 62, 0, 16, 0, 27, 0,
+  29, 0, 13, 0, 11, 0, 0, 0, 25, 0,
+  9, 0, 3, 35, 41, 39, 37, 34, 23, 0,
+  0, 8, 79, 22, 1, 0, 0, 13, 0, 0,
+  82, 36, 0, 0, 20, 0, 0, 51, 0, 0,
+  48, 11, 5, 0, 0, 23, 29, 0, 77, 0,
+  0, 50, 18, 0, 0, 42, 0, 0, 0, 4,
+  5, 13, 24, 0, 0, 0, 28, 0, 34, 0,
+  7, 54, 57, 12, 0, 23, 17, 14, 2, 0,
+  0, 54, 68, 12, 2, 19, 58, 30, 0, 13,
+  72, 61, 94, 10, 0, 0, 0, 26, 0, 0,
+  0, 5, 68, 0, 20, 19, 0, 31, 0, 50,
+  4, 41, 0, 19, 53, 58, 0, 66, 0, 27,
+  0, 55, 24, 0, 51, 0, 26, 0, 10, 0,
+  0, 0, 0, 18, 3, 0, 0, 0, 34, 0,
+  14, 26, 9, 11, 35, 0, 48, 32, 0, 34,
+  37, 0, 35, 0, 0, 7, 0, 0, 0, 5,
+  0, 0, 0, 0, 0, 28, 25, 0, 59, 36,
+  0, 0, 14, 23, 43, 0, 49, 0, 0, 6,
+  11, 5, 0, 11, 0, 0, 8, 0, 8, 0,
+  0, 4, 5, 0, 45, 0, 20, 0, 10, 27,
+  29, 24, 0, 21, 22, 22, 24, 0, 0, 43,
+  79, 0, 6, 26, 56, 0, 0, 0, 0, 87,
+  1, 0, 41, 0, 0, 30, 0, 1, 0, 60,
+  72, 0, 24, 0, 0, 23, 0, 54, 0, 47,
+  13, 10, 23, 49, 26, 18, 0, 30, 0, 52,
+  4, 24, 54, 0, 32, 0, 10, 0, 1, 11,
+  0, 48, 0, 8, 0, 0, 39, 0, 18, 26,
+  11, 0, 0, 2, 47, 27, 0, 46, 24, 0,
+  46, 46, 0, 0, 13, 0, 0, 18, 0, 0,
+  0, 23, 0, 24, 55, 0, 15, 78, 0, 0,
+  25, 19, 40, 0, 26, 0, 5, 0, 17, 8,
+  0, 0, 0, 0, 7, 0, 0, 4, 0, 11,
+  36, 0, 55, 0, 17, 0, 5, 45, 49, 8,
+  0, 13, 12, 23, 0, 0, 0, 49, 90, 0,
+  0, 29, 44, 13, 0, 25, 68, 58, 82, 13,
+  0, 0, 0, 11, 0, 0, 0, 0, 81, 0,
+  34, 31, 0, 20, 0, 59, 2, 29, 0, 28,
+  67, 52, 0, 60, 0, 43, 0, 42, 24, 0,
+  22, 0, 17, 0, 7, 0, 0, 0, 0, 9,
+  8, 0, 0, 0, 16, 0, 14, 13, 19, 19,
+  30, 0, 40, 53, 0, 19, 43, 0, 42, 0,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 33, 18, 0, 37, 45, 21, 0, 0, 23,
+  29, 0, 60, 0, 0, 7, 11, 13, 0, 17,
+  0, 0, 0, 0, 1, 9, 37, 0, 7, 0,
+  52, 0, 8, 2, 2, 29, 35, 14, 0, 2,
+  25, 15, 25, 0, 0, 41, 100, 0, 19, 33,
+  52, 0, 0, 0, 0, 93, 0, 8, 42, 0,
+  0, 23, 0, 0, 0, 43, 78, 0, 33, 0,
+  0, 18, 0, 68, 0, 56, 40, 13, 39, 47,
+  17, 12, 0, 48, 0, 63, 25, 25, 42, 0,
+  13, 0, 12, 0, 4, 7, 0, 68, 0, 15,
+  1, 0, 32, 0, 7, 15, 0, 11, 0, 0,
+  44, 48, 0, 33, 43, 0, 60, 25, 0, 0,
+  0, 0, 0, 17, 0, 0, 0, 3, 0, 32,
+  43, 0, 2, 82, 3, 0, 8, 22, 34, 0,
+  25, 0, 0, 0, 17, 10, 0, 0, 0, 0,
+  0, 0, 2, 15, 15, 5, 38, 0, 55, 0,
+  13, 0, 0, 0, 0, 2, 0, 130, 10, 0,
+  4, 0, 0, 17, 27, 0, 0, 13, 0, 0,
+  0, 0, 39, 101, 22, 12, 0, 0, 0, 0,
+  0, 3, 0, 24, 35, 28, 1, 0, 0, 22,
+  0, 43, 0, 20, 0, 45, 17, 92, 24, 56,
+  0, 1, 0, 50, 0, 0, 17, 0, 51, 0,
+  51, 0, 0, 57, 0, 0, 72, 8, 0, 8,
+  34, 0, 64, 5, 28, 6, 0, 15, 34, 35,
+  0, 21, 42, 0, 36, 58, 0, 0, 16, 0,
+  0, 0, 0, 14, 4, 0, 0, 35, 0, 0,
+  0, 63, 44, 0, 0, 33, 35, 0, 21, 0,
+  0, 0, 3, 0, 0, 32, 0, 0, 109, 11,
+  25, 17, 0, 0, 0, 0, 15, 0, 0, 0,
+  4, 47, 62, 10, 0, 19, 11, 10, 1, 0,
+  0, 51, 73, 0, 0, 33, 47, 24, 0, 20,
+  69, 64, 93, 12, 0, 0, 0, 23, 0, 0,
+  0, 0, 74, 0, 23, 28, 0, 28, 0, 48,
+  1, 24, 0, 19, 53, 57, 0, 57, 0, 37,
+  0, 54, 25, 0, 42, 0, 29, 0, 2, 0,
+  1, 0, 0, 20, 15, 0, 0, 0, 26, 0,
+  13, 15, 11, 22, 32, 0, 46, 51, 0, 12,
+  44, 0, 35, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 24, 31, 0, 40, 41,
+  11, 0, 10, 24, 51, 0, 57, 0, 0, 3,
+  17, 15, 0, 12, 0, 0, 7, 0, 0, 7,
+  15, 4, 0, 0, 47, 0, 18, 0, 3, 30,
+  27, 20, 0, 12, 23, 23, 27, 0, 0, 40,
+  83, 0, 11, 31, 57, 0, 0, 0, 0, 92,
+  0, 1, 37, 0, 0, 25, 0, 0, 0, 50,
+  77, 0, 34, 0, 0, 19, 0, 54, 0, 46,
+  24, 10, 34, 52, 12, 15, 0, 33, 0, 55,
+  12, 26, 53, 0, 30, 0, 10, 0, 0, 13,
+  0, 58, 0, 13, 0, 0, 32, 0, 13, 16,
+  12, 11, 0, 0, 49, 39, 0, 32, 30, 0,
+  50, 41, 0, 0, 7, 0, 0, 13, 0, 0,
+  0, 16, 0, 30, 52, 0, 6, 80, 2, 0,
+  18, 20, 43, 0, 29, 0, 4, 0, 21, 11,
+  0, 0, 0, 0, 0, 0, 0, 11, 4, 11,
+  36, 0, 51, 0, 18, 0, 0, 0, 0, 5,
+  0, 140, 8, 5, 3, 0, 0, 23, 36, 0,
+  0, 10, 2, 0, 0, 0, 35, 102, 17, 9,
+  0, 0, 0, 0, 0, 21, 0, 23, 35, 21,
+  4, 1, 0, 25, 0, 41, 0, 16, 0, 48,
+  13, 84, 13, 57, 0, 3, 0, 61, 0, 0,
+  24, 0, 45, 0, 39, 0, 0, 51, 0, 0,
+  78, 3, 0, 20, 24, 0, 67, 6, 31, 2,
+  0, 19, 16, 27, 0, 18, 39, 0, 33, 59,
+  0, 0, 10, 0, 0, 0, 0, 8, 0, 0,
+  12, 34, 0, 0, 0, 66, 43, 0, 0, 31,
+  31, 0, 26, 0, 0, 0, 14, 0, 0, 24,
+  0, 0, 117, 2, 21, 20, 0, 0, 0, 0,
+  24, 0, 0, 0, 7, 54, 57, 12, 0, 23,
+  17, 14, 2, 0, 0, 54, 68, 12, 2, 19,
+  58, 30, 0, 13, 72, 61, 94, 10, 0, 0,
+  0, 26, 0, 0, 0, 5, 68, 0, 20, 19,
+  0, 31, 0, 50, 4, 41, 0, 19, 53, 58,
+  0, 66, 0, 27, 0, 55, 24, 0, 51, 0,
+  26, 0, 10, 0, 0, 0, 0, 18, 3, 0,
+  0, 0, 34, 0, 14, 26, 9, 11, 35, 0,
+  48, 32, 0, 34, 37, 0, 35, 0, 0, 7,
+  0, 0, 0, 5, 0, 0, 0, 0, 0, 28,
+  25, 0, 59, 36, 0, 0, 14, 23, 43, 0,
+  49, 0, 0, 6, 11, 5, 0, 11, 0, 0,
+  8, 0, 8, 0, 0, 4, 5, 0, 45, 0,
+  20, 0, 10, 27, 29, 24, 0, 21, 22, 22,
+  24, 0, 0, 43, 79, 0, 6, 26, 56, 0,
+  0, 0, 0, 87, 1, 0, 41, 0, 0, 30,
+  0, 1, 0, 60, 72, 0, 24, 0, 0, 23,
+  0, 54, 0, 47, 13, 10, 23, 49, 26, 18,
+  0, 30, 0, 52, 4, 24, 54, 0, 32, 0,
+  10, 0, 1, 11, 0, 48, 0, 8, 0, 0,
+  39, 0, 18, 26, 11, 0, 0, 2, 47, 27,
+  0, 46, 24, 0, 46, 46, 0, 0, 13, 0,
+  0, 18, 0, 0, 0, 23, 0, 24, 55, 0,
+  15, 78, 0, 0, 25, 19, 40, 0, 26, 0,
+  5, 0, 17, 8, 0, 0, 0, 0, 7, 0,
+  0, 4, 0, 11, 36, 0, 55, 0, 17, 0,
+  0, 0, 0, 7, 0, 153, 0, 0, 0, 0,
+  0, 29, 38, 0, 0, 1, 3, 0, 0, 0,
+  24, 93, 13, 16, 0, 0, 0, 0, 0, 19,
+  0, 24, 31, 29, 0, 8, 0, 29, 0, 45,
+  0, 25, 0, 49, 3, 74, 23, 63, 0, 7,
+  0, 55, 0, 0, 19, 0, 43, 0, 36, 0,
+  0, 49, 0, 0, 76, 0, 0, 27, 37, 0,
+  74, 15, 23, 0, 0, 20, 11, 20, 0, 34,
+  35, 0, 40, 53, 0, 0, 16, 0, 0, 0,
+  0, 13, 0, 0, 26, 27, 0, 0, 0, 73,
+  26, 0, 0, 26, 12, 0, 22, 0, 0, 0,
+  6, 0, 0, 16, 0, 0, 114, 0, 19, 9,
+  0, 0, 0, 0, 29, 0, 0, 0, 2, 29,
+  35, 14, 0, 2, 25, 15, 25, 0, 0, 41,
+  100, 0, 19, 33, 52, 0, 0, 0, 0, 93,
+  0, 8, 42, 0, 0, 23, 0, 0, 0, 43,
+  78, 0, 33, 0, 0, 18, 0, 68, 0, 56,
+  40, 13, 39, 47, 17, 12, 0, 48, 0, 63,
+  25, 25, 42, 0, 13, 0, 12, 0, 4, 7,
+  0, 68, 0, 15, 1, 0, 32, 0, 7, 15,
+  0, 11, 0, 0, 44, 48, 0, 33, 43, 0,
+  60, 25, 0, 0, 0, 0, 0, 17, 0, 0,
+  0, 3, 0, 32, 43, 0, 2, 82, 3, 0,
+  8, 22, 34, 0, 25, 0, 0, 0, 17, 10,
+  0, 0, 0, 0, 0, 0, 2, 15, 15, 5,
+  38, 0, 55, 0, 13, 0, 0, 0, 0, 2,
+  0, 130, 10, 0, 4, 0, 0, 17, 27, 0,
+  0, 13, 0, 0, 0, 0, 39, 101, 22, 12,
+  0, 0, 0, 0, 0, 3, 0, 24, 35, 28,
+  1, 0, 0, 22, 0, 43, 0, 20, 0, 45,
+  17, 92, 24, 56, 0, 1, 0, 50, 0, 0,
+  17, 0, 51, 0, 51, 0, 0, 57, 0, 0,
+  72, 8, 0, 8, 34, 0, 64, 5, 28, 6,
+  0, 15, 34, 35, 0, 21, 42, 0, 36, 58,
+  0, 0, 16, 0, 0, 0, 0, 14, 4, 0,
+  0, 35, 0, 0, 0, 63, 44, 0, 0, 33,
+  35, 0, 21, 0, 0, 0, 3, 0, 0, 32,
+  0, 0, 109, 11, 25, 17, 0, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 30,
+  33, 0, 19, 0, 21, 0, 43, 0, 16, 54,
+  29, 19, 0, 10, 66, 0, 0, 44, 0, 21,
+  4, 0, 0, 41, 0, 0, 53, 56, 9, 0,
+  0, 0, 0, 18, 0, 34, 0, 47, 24, 21,
+  4, 29, 0, 18, 41, 0, 75, 14, 0, 0,
+  37, 0, 0, 75, 15, 0, 0, 0, 0, 0,
+  34, 16, 0, 0, 0, 2, 0, 21, 12, 35,
+  14, 9, 0, 42, 59, 0, 15, 48, 23, 0,
+  5, 24, 11, 27, 9, 21, 0, 6, 17, 45,
+  0, 0, 9, 43, 26, 0, 0, 0, 17, 0,
+  51, 8, 2, 21, 33, 2, 0, 20, 0, 0,
+  46, 39, 44, 11, 0, 0, 80, 0, 29, 15,
+  0, 0, 3, 30, 27, 20, 0, 12, 23, 23,
+  27, 0, 0, 40, 83, 0, 11, 31, 57, 0,
+  0, 0, 0, 92, 0, 1, 37, 0, 0, 25,
+  0, 0, 0, 50, 77, 0, 34, 0, 0, 19,
+  0, 54, 0, 46, 24, 10, 34, 52, 12, 15,
+  0, 33, 0, 55, 12, 26, 53, 0, 30, 0,
+  10, 0, 0, 13, 0, 58, 0, 13, 0, 0,
+  32, 0, 13, 16, 12, 11, 0, 0, 49, 39,
+  0, 32, 30, 0, 50, 41, 0, 0, 7, 0,
+  0, 13, 0, 0, 0, 16, 0, 30, 52, 0,
+  6, 80, 2, 0, 18, 20, 43, 0, 29, 0,
+  4, 0, 21, 11, 0, 0, 0, 0, 0, 0,
+  0, 11, 4, 11, 36, 0, 51, 0, 18, 0,
+  0, 0, 0, 5, 0, 140, 8, 5, 3, 0,
+  0, 23, 36, 0, 0, 10, 2, 0, 0, 0,
+  35, 102, 17, 9, 0, 0, 0, 0, 0, 21,
+  0, 23, 35, 21, 4, 1, 0, 25, 0, 41,
+  0, 16, 0, 48, 13, 84, 13, 57, 0, 3,
+  0, 61, 0, 0, 24, 0, 45, 0, 39, 0,
+  0, 51, 0, 0, 78, 3, 0, 20, 24, 0,
+  67, 6, 31, 2, 0, 19, 16, 27, 0, 18,
+  39, 0, 33, 59, 0, 0, 10, 0, 0, 0,
+  0, 8, 0, 0, 12, 34, 0, 0, 0, 66,
+  43, 0, 0, 31, 31, 0, 26, 0, 0, 0,
+  14, 0, 0, 24, 0, 0, 117, 2, 21, 20,
+  0, 0, 0, 0, 24, 0, 0, 0, 0, 8,
+  0, 0, 0, 26, 43, 6, 20, 0, 13, 0,
+  59, 0, 10, 62, 36, 31, 3, 0, 46, 0,
+  0, 38, 0, 42, 6, 2, 0, 34, 0, 0,
+  63, 41, 15, 0, 0, 0, 0, 46, 0, 37,
+  0, 53, 25, 14, 17, 17, 0, 32, 15, 5,
+  91, 14, 0, 0, 28, 0, 0, 70, 0, 0,
+  0, 0, 0, 0, 24, 8, 0, 0, 0, 2,
+  0, 9, 17, 48, 0, 3, 0, 31, 71, 5,
+  13, 36, 17, 0, 4, 23, 26, 35, 36, 0,
+  0, 2, 17, 32, 0, 0, 2, 44, 36, 0,
+  0, 0, 12, 0, 55, 13, 24, 46, 43, 0,
+  0, 24, 0, 0, 42, 41, 44, 0, 0, 0,
+  108, 0, 71, 14, 0, 0, 10, 27, 29, 24,
+  0, 21, 22, 22, 24, 0, 0, 43, 79, 0,
+  6, 26, 56, 0, 0, 0, 0, 87, 1, 0,
+  41, 0, 0, 30, 0, 1, 0, 60, 72, 0,
+  24, 0, 0, 23, 0, 54, 0, 47, 13, 10,
+  23, 49, 26, 18, 0, 30, 0, 52, 4, 24,
+  54, 0, 32, 0, 10, 0, 1, 11, 0, 48,
+  0, 8, 0, 0, 39, 0, 18, 26, 11, 0,
+  0, 2, 47, 27, 0, 46, 24, 0, 46, 46,
+  0, 0, 13, 0, 0, 18, 0, 0, 0, 23,
+  0, 24, 55, 0, 15, 78, 0, 0, 25, 19,
+  40, 0, 26, 0, 5, 0, 17, 8, 0, 0,
+  0, 0, 7, 0, 0, 4, 0, 11, 36, 0,
+  55, 0, 17, 0, 0, 0, 0, 7, 0, 153,
+  0, 0, 0, 0, 0, 29, 38, 0, 0, 1,
+  3, 0, 0, 0, 24, 93, 13, 16, 0, 0,
+  0, 0, 0, 19, 0, 24, 31, 29, 0, 8,
+  0, 29, 0, 45, 0, 25, 0, 49, 3, 74,
+  23, 63, 0, 7, 0, 55, 0, 0, 19, 0,
+  43, 0, 36, 0, 0, 49, 0, 0, 76, 0,
+  0, 27, 37, 0, 74, 15, 23, 0, 0, 20,
+  11, 20, 0, 34, 35, 0, 40, 53, 0, 0,
+  16, 0, 0, 0, 0, 13, 0, 0, 26, 27,
+  0, 0, 0, 73, 26, 0, 0, 26, 12, 0,
+  22, 0, 0, 0, 6, 0, 0, 16, 0, 0,
+  114, 0, 19, 9, 0, 0, 0, 0, 29, 0,
+  0, 0, 0, 17, 0, 0, 0, 31, 35, 0,
+  13, 0, 8, 0, 56, 4, 16, 62, 36, 39,
+  10, 0, 30, 0, 0, 48, 4, 53, 0, 4,
+  0, 15, 0, 0, 72, 44, 0, 0, 0, 0,
+  0, 66, 0, 41, 0, 43, 20, 12, 12, 36,
+  0, 41, 0, 7, 95, 16, 0, 0, 21, 0,
+  0, 55, 9, 0, 0, 0, 0, 0, 32, 12,
+  11, 0, 0, 0, 0, 15, 10, 55, 0, 0,
+  0, 47, 64, 4, 32, 22, 15, 0, 7, 27,
+  13, 34, 54, 16, 0, 11, 39, 32, 0, 0,
+  0, 68, 22, 0, 0, 0, 0, 0, 48, 0,
+  0, 30, 26, 15, 0, 27, 0, 0, 25, 30,
+  24, 3, 1, 0, 121, 0, 65, 2, 0, 0,
+  0, 0, 0, 2, 0, 130, 10, 0, 4, 0,
+  0, 17, 27, 0, 0, 13, 0, 0, 0, 0,
+  39, 101, 22, 12, 0, 0, 0, 0, 0, 3,
+  0, 24, 35, 28, 1, 0, 0, 22, 0, 43,
+  0, 20, 0, 45, 17, 92, 24, 56, 0, 1,
+  0, 50, 0, 0, 17, 0, 51, 0, 51, 0,
+  0, 57, 0, 0, 72, 8, 0, 8, 34, 0,
+  64, 5, 28, 6, 0, 15, 34, 35, 0, 21,
+  42, 0, 36, 58, 0, 0, 16, 0, 0, 0,
+  0, 14, 4, 0, 0, 35, 0, 0, 0, 63,
+  44, 0, 0, 33, 35, 0, 21, 0, 0, 0,
+  3, 0, 0, 32, 0, 0, 109, 11, 25, 17,
+  0, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 30, 33, 0, 19, 0, 21, 0,
+  43, 0, 16, 54, 29, 19, 0, 10, 66, 0,
+  0, 44, 0, 21, 4, 0, 0, 41, 0, 0,
+  53, 56, 9, 0, 0, 0, 0, 18, 0, 34,
+  0, 47, 24, 21, 4, 29, 0, 18, 41, 0,
+  75, 14, 0, 0, 37, 0, 0, 75, 15, 0,
+  0, 0, 0, 0, 34, 16, 0, 0, 0, 2,
+  0, 21, 12, 35, 14, 9, 0, 42, 59, 0,
+  15, 48, 23, 0, 5, 24, 11, 27, 9, 21,
+  0, 6, 17, 45, 0, 0, 9, 43, 26, 0,
+  0, 0, 17, 0, 51, 8, 2, 21, 33, 2,
+  0, 20, 0, 0, 46, 39, 44, 11, 0, 0,
+  80, 0, 29, 15, 0, 0, 0, 47, 63, 0,
+  0, 0, 0, 0, 44, 1, 0, 11, 10, 3,
+  0, 58, 41, 16, 11, 0, 10, 0, 65, 40,
+  0, 0, 36, 16, 0, 0, 0, 0, 20, 0,
+  20, 14, 0, 0, 0, 16, 0, 3, 0, 22,
+  0, 2, 0, 0, 0, 1, 57, 3, 31, 0,
+  0, 0, 29, 0, 0, 14, 3, 0, 0, 0,
+  16, 0, 39, 2, 0, 0, 0, 0, 0, 49,
+  17, 0, 0, 86, 0, 30, 13, 0, 52, 56,
+  3, 30, 0, 29, 23, 24, 50, 0, 0, 0,
+  17, 0, 0, 0, 0, 53, 48, 0, 0, 0,
+  13, 0, 61, 0, 0, 31, 25, 0, 0, 5,
+  0, 0, 7, 0, 0, 16, 0, 0, 30, 0,
+  18, 13, 0, 31, 0, 0, 0, 5, 0, 140,
+  8, 5, 3, 0, 0, 23, 36, 0, 0, 10,
+  2, 0, 0, 0, 35, 102, 17, 9, 0, 0,
+  0, 0, 0, 21, 0, 23, 35, 21, 4, 1,
+  0, 25, 0, 41, 0, 16, 0, 48, 13, 84,
+  13, 57, 0, 3, 0, 61, 0, 0, 24, 0,
+  45, 0, 39, 0, 0, 51, 0, 0, 78, 3,
+  0, 20, 24, 0, 67, 6, 31, 2, 0, 19,
+  16, 27, 0, 18, 39, 0, 33, 59, 0, 0,
+  10, 0, 0, 0, 0, 8, 0, 0, 12, 34,
+  0, 0, 0, 66, 43, 0, 0, 31, 31, 0,
+  26, 0, 0, 0, 14, 0, 0, 24, 0, 0,
+  117, 2, 21, 20, 0, 0, 0, 0, 24, 0,
+  0, 0, 0, 8, 0, 0, 0, 26, 43, 6,
+  20, 0, 13, 0, 59, 0, 10, 62, 36, 31,
+  3, 0, 46, 0, 0, 38, 0, 42, 6, 2,
+  0, 34, 0, 0, 63, 41, 15, 0, 0, 0,
+  0, 46, 0, 37, 0, 53, 25, 14, 17, 17,
+  0, 32, 15, 5, 91, 14, 0, 0, 28, 0,
+  0, 70, 0, 0, 0, 0, 0, 0, 24, 8,
+  0, 0, 0, 2, 0, 9, 17, 48, 0, 3,
+  0, 31, 71, 5, 13, 36, 17, 0, 4, 23,
+  26, 35, 36, 0, 0, 2, 17, 32, 0, 0,
+  2, 44, 36, 0, 0, 0, 12, 0, 55, 13,
+  24, 46, 43, 0, 0, 24, 0, 0, 42, 41,
+  44, 0, 0, 0, 108, 0, 71, 14, 0, 0,
+  0, 44, 70, 0, 0, 0, 0, 9, 53, 0,
+  0, 29, 11, 20, 0, 36, 26, 0, 0, 0,
+  0, 7, 73, 51, 0, 0, 16, 18, 0, 0,
+  0, 0, 0, 0, 29, 22, 0, 0, 0, 40,
+  0, 13, 0, 10, 0, 1, 22, 0, 0, 0,
+  35, 32, 22, 15, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 20, 0, 30, 0, 2, 0,
+  0, 8, 3, 20, 33, 0, 0, 85, 0, 28,
+  19, 0, 42, 48, 0, 18, 0, 36, 33, 9,
+  46, 0, 0, 0, 8, 0, 0, 0, 0, 81,
+  37, 0, 0, 0, 25, 0, 70, 0, 22, 26,
+  14, 0, 0, 8, 0, 0, 28, 0, 0, 18,
+  0, 0, 19, 0, 44, 20, 0, 20, 0, 0,
+  0, 7, 0, 153, 0, 0, 0, 0, 0, 29,
+  38, 0, 0, 1, 3, 0, 0, 0, 24, 93,
+  13, 16, 0, 0, 0, 0, 0, 19, 0, 24,
+  31, 29, 0, 8, 0, 29, 0, 45, 0, 25,
+  0, 49, 3, 74, 23, 63, 0, 7, 0, 55,
+  0, 0, 19, 0, 43, 0, 36, 0, 0, 49,
+  0, 0, 76, 0, 0, 27, 37, 0, 74, 15,
+  23, 0, 0, 20, 11, 20, 0, 34, 35, 0,
+  40, 53, 0, 0, 16, 0, 0, 0, 0, 13,
+  0, 0, 26, 27, 0, 0, 0, 73, 26, 0,
+  0, 26, 12, 0, 22, 0, 0, 0, 6, 0,
+  0, 16, 0, 0, 114, 0, 19, 9, 0, 0,
+  0, 0, 29, 0, 0, 0, 0, 17, 0, 0,
+  0, 31, 35, 0, 13, 0, 8, 0, 56, 4,
+  16, 62, 36, 39, 10, 0, 30, 0, 0, 48,
+  4, 53, 0, 4, 0, 15, 0, 0, 72, 44,
+  0, 0, 0, 0, 0, 66, 0, 41, 0, 43,
+  20, 12, 12, 36, 0, 41, 0, 7, 95, 16,
+  0, 0, 21, 0, 0, 55, 9, 0, 0, 0,
+  0, 0, 32, 12, 11, 0, 0, 0, 0, 15,
+  10, 55, 0, 0, 0, 47, 64, 4, 32, 22,
+  15, 0, 7, 27, 13, 34, 54, 16, 0, 11,
+  39, 32, 0, 0, 0, 68, 22, 0, 0, 0,
+  0, 0, 48, 0, 0, 30, 26, 15, 0, 27,
+  0, 0, 25, 30, 24, 3, 1, 0, 121, 0,
+  65, 2, 0, 0, 0, 31, 59, 0, 8, 0,
+  0, 0, 53, 2, 0, 9, 30, 0, 0, 23,
+  15, 0, 8, 0, 0, 47, 79, 53, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 0, 52, 28,
+  0, 4, 0, 63, 0, 25, 0, 1, 0, 0,
+  25, 4, 0, 6, 0, 48, 20, 26, 0, 0,
+  19, 0, 8, 0, 0, 13, 0, 0, 18, 0,
+  16, 0, 9, 0, 10, 19, 20, 21, 21, 5,
+  0, 89, 0, 46, 12, 0, 50, 44, 4, 2,
+  0, 39, 7, 1, 49, 0, 0, 0, 4, 0,
+  0, 0, 6, 91, 22, 0, 0, 0, 9, 0,
+  71, 0, 0, 9, 0, 0, 0, 14, 0, 0,
+  23, 0, 0, 33, 0, 0, 26, 0, 73, 2,
+  0, 1, 0, 0, 0, 0, 0, 30, 33, 0,
+  19, 0, 21, 0, 43, 0, 16, 54, 29, 19,
+  0, 10, 66, 0, 0, 44, 0, 21, 4, 0,
+  0, 41, 0, 0, 53, 56, 9, 0, 0, 0,
+  0, 18, 0, 34, 0, 47, 24, 21, 4, 29,
+  0, 18, 41, 0, 75, 14, 0, 0, 37, 0,
+  0, 75, 15, 0, 0, 0, 0, 0, 34, 16,
+  0, 0, 0, 2, 0, 21, 12, 35, 14, 9,
+  0, 42, 59, 0, 15, 48, 23, 0, 5, 24,
+  11, 27, 9, 21, 0, 6, 17, 45, 0, 0,
+  9, 43, 26, 0, 0, 0, 17, 0, 51, 8,
+  2, 21, 33, 2, 0, 20, 0, 0, 46, 39,
+  44, 11, 0, 0, 80, 0, 29, 15, 0, 0,
+  0, 47, 63, 0, 0, 0, 0, 0, 44, 1,
+  0, 11, 10, 3, 0, 58, 41, 16, 11, 0,
+  10, 0, 65, 40, 0, 0, 36, 16, 0, 0,
+  0, 0, 20, 0, 20, 14, 0, 0, 0, 16,
+  0, 3, 0, 22, 0, 2, 0, 0, 0, 1,
+  57, 3, 31, 0, 0, 0, 29, 0, 0, 14,
+  3, 0, 0, 0, 16, 0, 39, 2, 0, 0,
+  0, 0, 0, 49, 17, 0, 0, 86, 0, 30,
+  13, 0, 52, 56, 3, 30, 0, 29, 23, 24,
+  50, 0, 0, 0, 17, 0, 0, 0, 0, 53,
+  48, 0, 0, 0, 13, 0, 61, 0, 0, 31,
+  25, 0, 0, 5, 0, 0, 7, 0, 0, 16,
+  0, 0, 30, 0, 18, 13, 0, 31, 103, 0,
+  37, 5, 6, 15, 0, 0, 15, 0, 0, 23,
+  47, 54, 0, 0, 22, 0, 6, 0, 0, 173,
+  80, 13, 0, 0, 0, 33, 0, 0, 2, 56,
+  0, 34, 0, 21, 0, 29, 0, 25, 0, 22,
+  0, 0, 27, 6, 10, 8, 0, 0, 0, 77,
+  0, 0, 89, 0, 43, 20, 45, 0, 35, 11,
+  0, 32, 30, 49, 7, 15, 23, 23, 7, 28,
+  0, 22, 0, 0, 3, 45, 0, 13, 0, 0,
+  4, 42, 8, 27, 0, 9, 0, 0, 0, 0,
+  8, 0, 7, 0, 24, 0, 27, 61, 2, 0,
+  25, 0, 40, 28, 4, 8, 10, 35, 4, 0,
+  0, 0, 0, 15, 78, 0, 23, 10, 0, 35,
+  0, 0, 20, 3, 3, 48, 0, 8, 0, 0,
+  0, 26, 43, 6, 20, 0, 13, 0, 59, 0,
+  10, 62, 36, 31, 3, 0, 46, 0, 0, 38,
+  0, 42, 6, 2, 0, 34, 0, 0, 63, 41,
+  15, 0, 0, 0, 0, 46, 0, 37, 0, 53,
+  25, 14, 17, 17, 0, 32, 15, 5, 91, 14,
+  0, 0, 28, 0, 0, 70, 0, 0, 0, 0,
+  0, 0, 24, 8, 0, 0, 0, 2, 0, 9,
+  17, 48, 0, 3, 0, 31, 71, 5, 13, 36,
+  17, 0, 4, 23, 26, 35, 36, 0, 0, 2,
+  17, 32, 0, 0, 2, 44, 36, 0, 0, 0,
+  12, 0, 55, 13, 24, 46, 43, 0, 0, 24,
+  0, 0, 42, 41, 44, 0, 0, 0, 108, 0,
+  71, 14, 0, 0, 0, 44, 70, 0, 0, 0,
+  0, 9, 53, 0, 0, 29, 11, 20, 0, 36,
+  26, 0, 0, 0, 0, 7, 73, 51, 0, 0,
+  16, 18, 0, 0, 0, 0, 0, 0, 29, 22,
+  0, 0, 0, 40, 0, 13, 0, 10, 0, 1,
+  22, 0, 0, 0, 35, 32, 22, 15, 0, 0,
+  28, 0, 0, 0, 0, 0, 0, 0, 20, 0,
+  30, 0, 2, 0, 0, 8, 3, 20, 33, 0,
+  0, 85, 0, 28, 19, 0, 42, 48, 0, 18,
+  0, 36, 33, 9, 46, 0, 0, 0, 8, 0,
+  0, 0, 0, 81, 37, 0, 0, 0, 25, 0,
+  70, 0, 22, 26, 14, 0, 0, 8, 0, 0,
+  28, 0, 0, 18, 0, 0, 19, 0, 44, 20,
+  0, 20, 102, 0, 40, 4, 0, 12, 0, 0,
+  45, 0, 0, 35, 56, 20, 0, 0, 9, 0,
+  0, 0, 0, 189, 80, 25, 0, 0, 0, 31,
+  0, 0, 16, 61, 0, 11, 0, 30, 0, 40,
+  0, 30, 0, 28, 48, 0, 38, 21, 24, 29,
+  0, 0, 0, 80, 0, 0, 100, 0, 63, 0,
+  47, 0, 14, 23, 0, 56, 27, 66, 0, 1,
+  0, 4, 12, 26, 10, 13, 0, 0, 0, 47,
+  0, 15, 0, 0, 7, 21, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 25, 0,
+  18, 61, 0, 0, 17, 0, 54, 23, 26, 12,
+  6, 14, 8, 6, 0, 0, 0, 2, 87, 0,
+  36, 39, 0, 9, 0, 0, 23, 15, 18, 29,
+  0, 17, 0, 0, 0, 31, 35, 0, 13, 0,
+  8, 0, 56, 4, 16, 62, 36, 39, 10, 0,
+  30, 0, 0, 48, 4, 53, 0, 4, 0, 15,
+  0, 0, 72, 44, 0, 0, 0, 0, 0, 66,
+  0, 41, 0, 43, 20, 12, 12, 36, 0, 41,
+  0, 7, 95, 16, 0, 0, 21, 0, 0, 55,
+  9, 0, 0, 0, 0, 0, 32, 12, 11, 0,
+  0, 0, 0, 15, 10, 55, 0, 0, 0, 47,
+  64, 4, 32, 22, 15, 0, 7, 27, 13, 34,
+  54, 16, 0, 11, 39, 32, 0, 0, 0, 68,
+  22, 0, 0, 0, 0, 0, 48, 0, 0, 30,
+  26, 15, 0, 27, 0, 0, 25, 30, 24, 3,
+  1, 0, 121, 0, 65, 2, 0, 0, 0, 31,
+  59, 0, 8, 0, 0, 0, 53, 2, 0, 9,
+  30, 0, 0, 23, 15, 0, 8, 0, 0, 47,
+  79, 53, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 0, 52, 28, 0, 4, 0, 63, 0, 25,
+  0, 1, 0, 0, 25, 4, 0, 6, 0, 48,
+  20, 26, 0, 0, 19, 0, 8, 0, 0, 13,
+  0, 0, 18, 0, 16, 0, 9, 0, 10, 19,
+  20, 21, 21, 5, 0, 89, 0, 46, 12, 0,
+  50, 44, 4, 2, 0, 39, 7, 1, 49, 0,
+  0, 0, 4, 0, 0, 0, 6, 91, 22, 0,
+  0, 0, 9, 0, 71, 0, 0, 9, 0, 0,
+  0, 14, 0, 0, 23, 0, 0, 33, 0, 0,
+  26, 0, 73, 2, 0, 1, 73, 0, 21, 29,
+  10, 2, 0, 11, 74, 0, 0, 18, 94, 0,
+  0, 0, 36, 0, 0, 0, 0, 148, 91, 19,
+  0, 0, 0, 47, 0, 0, 32, 47, 0, 0,
+  27, 32, 0, 52, 0, 43, 0, 24, 66, 17,
+  51, 51, 13, 28, 0, 0, 0, 63, 0, 0,
+  62, 0, 50, 0, 39, 0, 0, 6, 0, 30,
+  12, 20, 0, 4, 0, 0, 19, 4, 40, 42,
+  0, 0, 0, 87, 0, 19, 0, 0, 16, 26,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 8,
+  0, 0, 35, 0, 15, 55, 0, 0, 22, 0,
+  52, 8, 59, 31, 3, 19, 8, 16, 0, 0,
+  0, 0, 66, 0, 18, 40, 0, 4, 0, 0,
+  51, 0, 18, 14, 0, 47, 63, 0, 0, 0,
+  0, 0, 44, 1, 0, 11, 10, 3, 0, 58,
+  41, 16, 11, 0, 10, 0, 65, 40, 0, 0,
+  36, 16, 0, 0, 0, 0, 20, 0, 20, 14,
+  0, 0, 0, 16, 0, 3, 0, 22, 0, 2,
+  0, 0, 0, 1, 57, 3, 31, 0, 0, 0,
+  29, 0, 0, 14, 3, 0, 0, 0, 16, 0,
+  39, 2, 0, 0, 0, 0, 0, 49, 17, 0,
+  0, 86, 0, 30, 13, 0, 52, 56, 3, 30,
+  0, 29, 23, 24, 50, 0, 0, 0, 17, 0,
+  0, 0, 0, 53, 48, 0, 0, 0, 13, 0,
+  61, 0, 0, 31, 25, 0, 0, 5, 0, 0,
+  7, 0, 0, 16, 0, 0, 30, 0, 18, 13,
+  0, 31, 103, 0, 37, 5, 6, 15, 0, 0,
+  15, 0, 0, 23, 47, 54, 0, 0, 22, 0,
+  6, 0, 0, 173, 80, 13, 0, 0, 0, 33,
+  0, 0, 2, 56, 0, 34, 0, 21, 0, 29,
+  0, 25, 0, 22, 0, 0, 27, 6, 10, 8,
+  0, 0, 0, 77, 0, 0, 89, 0, 43, 20,
+  45, 0, 35, 11, 0, 32, 30, 49, 7, 15,
+  23, 23, 7, 28, 0, 22, 0, 0, 3, 45,
+  0, 13, 0, 0, 4, 42, 8, 27, 0, 9,
+  0, 0, 0, 0, 8, 0, 7, 0, 24, 0,
+  27, 61, 2, 0, 25, 0, 40, 28, 4, 8,
+  10, 35, 4, 0, 0, 0, 0, 15, 78, 0,
+  23, 10, 0, 35, 0, 0, 20, 3, 3, 48,
+  45, 0, 0, 0, 22, 82, 0, 0, 8, 0,
+  0, 0, 29, 61, 0, 8, 48, 0, 0, 0,
+  21, 71, 5, 41, 10, 3, 0, 14, 0, 2,
+  0, 9, 0, 69, 34, 19, 0, 41, 0, 34,
+  7, 20, 0, 34, 59, 23, 26, 10, 5, 0,
+  0, 0, 0, 0, 0, 0, 18, 22, 10, 15,
+  30, 39, 10, 0, 0, 0, 16, 36, 52, 0,
+  27, 32, 3, 0, 12, 28, 0, 21, 0, 48,
+  0, 2, 0, 34, 13, 5, 17, 11, 0, 25,
+  0, 47, 10, 1, 26, 5, 0, 0, 0, 67,
+  13, 0, 12, 0, 16, 0, 0, 15, 0, 51,
+  0, 0, 0, 0, 0, 0, 69, 0, 19, 0,
+  19, 11, 0, 0, 29, 2, 31, 0, 0, 44,
+  70, 0, 0, 0, 0, 9, 53, 0, 0, 29,
+  11, 20, 0, 36, 26, 0, 0, 0, 0, 7,
+  73, 51, 0, 0, 16, 18, 0, 0, 0, 0,
+  0, 0, 29, 22, 0, 0, 0, 40, 0, 13,
+  0, 10, 0, 1, 22, 0, 0, 0, 35, 32,
+  22, 15, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 20, 0, 30, 0, 2, 0, 0, 8,
+  3, 20, 33, 0, 0, 85, 0, 28, 19, 0,
+  42, 48, 0, 18, 0, 36, 33, 9, 46, 0,
+  0, 0, 8, 0, 0, 0, 0, 81, 37, 0,
+  0, 0, 25, 0, 70, 0, 22, 26, 14, 0,
+  0, 8, 0, 0, 28, 0, 0, 18, 0, 0,
+  19, 0, 44, 20, 0, 20, 102, 0, 40, 4,
+  0, 12, 0, 0, 45, 0, 0, 35, 56, 20,
+  0, 0, 9, 0, 0, 0, 0, 189, 80, 25,
+  0, 0, 0, 31, 0, 0, 16, 61, 0, 11,
+  0, 30, 0, 40, 0, 30, 0, 28, 48, 0,
+  38, 21, 24, 29, 0, 0, 0, 80, 0, 0,
+  100, 0, 63, 0, 47, 0, 14, 23, 0, 56,
+  27, 66, 0, 1, 0, 4, 12, 26, 10, 13,
+  0, 0, 0, 47, 0, 15, 0, 0, 7, 21,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 25, 0, 18, 61, 0, 0, 17, 0,
+  54, 23, 26, 12, 6, 14, 8, 6, 0, 0,
+  0, 2, 87, 0, 36, 39, 0, 9, 0, 0,
+  23, 15, 18, 29, 9, 0, 0, 9, 0, 65,
+  0, 0, 41, 0, 0, 0, 45, 38, 0, 38,
+  32, 25, 0, 0, 8, 14, 5, 56, 28, 0,
+  0, 19, 0, 0, 0, 21, 10, 40, 27, 4,
+  0, 33, 0, 8, 9, 4, 50, 58, 50, 77,
+  14, 17, 0, 0, 0, 0, 0, 0, 0, 0,
+  54, 0, 0, 0, 4, 43, 0, 0, 0, 0,
+  0, 0, 12, 0, 54, 0, 14, 11, 0, 28,
+  0, 28, 0, 28, 0, 16, 0, 39, 0, 0,
+  31, 0, 14, 62, 0, 63, 0, 0, 13, 17,
+  0, 0, 0, 56, 19, 0, 0, 0, 17, 0,
+  0, 4, 0, 40, 0, 0, 0, 9, 0, 0,
+  61, 0, 8, 0, 37, 0, 3, 0, 29, 10,
+  44, 0, 0, 31, 59, 0, 8, 0, 0, 0,
+  53, 2, 0, 9, 30, 0, 0, 23, 15, 0,
+  8, 0, 0, 47, 79, 53, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 0, 52, 28, 0, 4,
+  0, 63, 0, 25, 0, 1, 0, 0, 25, 4,
+  0, 6, 0, 48, 20, 26, 0, 0, 19, 0,
+  8, 0, 0, 13, 0, 0, 18, 0, 16, 0,
+  9, 0, 10, 19, 20, 21, 21, 5, 0, 89,
+  0, 46, 12, 0, 50, 44, 4, 2, 0, 39,
+  7, 1, 49, 0, 0, 0, 4, 0, 0, 0,
+  6, 91, 22, 0, 0, 0, 9, 0, 71, 0,
+  0, 9, 0, 0, 0, 14, 0, 0, 23, 0,
+  0, 33, 0, 0, 26, 0, 73, 2, 0, 1,
+  73, 0, 21, 29, 10, 2, 0, 11, 74, 0,
+  0, 18, 94, 0, 0, 0, 36, 0, 0, 0,
+  0, 148, 91, 19, 0, 0, 0, 47, 0, 0,
+  32, 47, 0, 0, 27, 32, 0, 52, 0, 43,
+  0, 24, 66, 17, 51, 51, 13, 28, 0, 0,
+  0, 63, 0, 0, 62, 0, 50, 0, 39, 0,
+  0, 6, 0, 30, 12, 20, 0, 4, 0, 0,
+  19, 4, 40, 42, 0, 0, 0, 87, 0, 19,
+  0, 0, 16, 26, 0, 11, 0, 0, 0, 0,
+  0, 0, 0, 8, 0, 0, 35, 0, 15, 55,
+  0, 0, 22, 0, 52, 8, 59, 31, 3, 19,
+  8, 16, 0, 0, 0, 0, 66, 0, 18, 40,
+  0, 4, 0, 0, 51, 0, 18, 14, 0, 0,
+  0, 29, 1, 29, 8, 0, 54, 0, 0, 0,
+  67, 10, 9, 37, 50, 41, 0, 0, 0, 0,
+  0, 46, 33, 11, 2, 31, 0, 0, 8, 47,
+  45, 22, 0, 0, 0, 51, 0, 0, 0, 0,
+  95, 63, 29, 90, 0, 25, 0, 0, 0, 1,
+  11, 3, 0, 0, 29, 0, 0, 1, 0, 38,
+  0, 0, 3, 0, 26, 25, 4, 0, 48, 0,
+  30, 61, 0, 8, 0, 30, 0, 18, 0, 0,
+  0, 54, 0, 2, 33, 0, 0, 26, 0, 44,
+  0, 32, 0, 43, 0, 0, 0, 39, 13, 0,
+  8, 0, 38, 0, 3, 19, 0, 10, 9, 7,
+  0, 4, 0, 0, 50, 0, 0, 18, 13, 0,
+  27, 0, 42, 0, 53, 0, 103, 0, 37, 5,
+  6, 15, 0, 0, 15, 0, 0, 23, 47, 54,
+  0, 0, 22, 0, 6, 0, 0, 173, 80, 13,
+  0, 0, 0, 33, 0, 0, 2, 56, 0, 34,
+  0, 21, 0, 29, 0, 25, 0, 22, 0, 0,
+  27, 6, 10, 8, 0, 0, 0, 77, 0, 0,
+  89, 0, 43, 20, 45, 0, 35, 11, 0, 32,
+  30, 49, 7, 15, 23, 23, 7, 28, 0, 22,
+  0, 0, 3, 45, 0, 13, 0, 0, 4, 42,
+  8, 27, 0, 9, 0, 0, 0, 0, 8, 0,
+  7, 0, 24, 0, 27, 61, 2, 0, 25, 0,
+  40, 28, 4, 8, 10, 35, 4, 0, 0, 0,
+  0, 15, 78, 0, 23, 10, 0, 35, 0, 0,
+  20, 3, 3, 48, 45, 0, 0, 0, 22, 82,
+  0, 0, 8, 0, 0, 0, 29, 61, 0, 8,
+  48, 0, 0, 0, 21, 71, 5, 41, 10, 3,
+  0, 14, 0, 2, 0, 9, 0, 69, 34, 19,
+  0, 41, 0, 34, 7, 20, 0, 34, 59, 23,
+  26, 10, 5, 0, 0, 0, 0, 0, 0, 0,
+  18, 22, 10, 15, 30, 39, 10, 0, 0, 0,
+  16, 36, 52, 0, 27, 32, 3, 0, 12, 28,
+  0, 21, 0, 48, 0, 2, 0, 34, 13, 5,
+  17, 11, 0, 25, 0, 47, 10, 1, 26, 5,
+  0, 0, 0, 67, 13, 0, 12, 0, 16, 0,
+  0, 15, 0, 51, 0, 0, 0, 0, 0, 0,
+  69, 0, 19, 0, 19, 11, 0, 0, 29, 2,
+  31, 0, 0, 24, 0, 0, 40, 11, 0, 0,
+  61, 11, 0, 15, 51, 85, 31, 58, 61, 16,
+  0, 9, 60, 0, 0, 53, 11, 51, 1, 8,
+  0, 10, 0, 0, 0, 42, 35, 0, 15, 23,
+  0, 51, 12, 18, 0, 69, 33, 20, 9, 0,
+  0, 0, 24, 0, 57, 28, 0, 0, 0, 2,
+  0, 18, 0, 0, 0, 0, 0, 0, 31, 0,
+  42, 0, 0, 0, 4, 14, 36, 12, 0, 6,
+  0, 29, 44, 60, 4, 0, 34, 12, 53, 16,
+  53, 25, 0, 50, 0, 27, 0, 9, 0, 0,
+  31, 64, 0, 0, 0, 0, 0, 0, 0, 12,
+  10, 60, 0, 0, 0, 0, 0, 0, 10, 13,
+  32, 0, 25, 0, 76, 0, 51, 15, 31, 0,
+  102, 0, 40, 4, 0, 12, 0, 0, 45, 0,
+  0, 35, 56, 20, 0, 0, 9, 0, 0, 0,
+  0, 189, 80, 25, 0, 0, 0, 31, 0, 0,
+  16, 61, 0, 11, 0, 30, 0, 40, 0, 30,
+  0, 28, 48, 0, 38, 21, 24, 29, 0, 0,
+  0, 80, 0, 0, 100, 0, 63, 0, 47, 0,
+  14, 23, 0, 56, 27, 66, 0, 1, 0, 4,
+  12, 26, 10, 13, 0, 0, 0, 47, 0, 15,
+  0, 0, 7, 21, 0, 11, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 25, 0, 18, 61,
+  0, 0, 17, 0, 54, 23, 26, 12, 6, 14,
+  8, 6, 0, 0, 0, 2, 87, 0, 36, 39,
+  0, 9, 0, 0, 23, 15, 18, 29, 9, 0,
+  0, 9, 0, 65, 0, 0, 41, 0, 0, 0,
+  45, 38, 0, 38, 32, 25, 0, 0, 8, 14,
+  5, 56, 28, 0, 0, 19, 0, 0, 0, 21,
+  10, 40, 27, 4, 0, 33, 0, 8, 9, 4,
+  50, 58, 50, 77, 14, 17, 0, 0, 0, 0,
+  0, 0, 0, 0, 54, 0, 0, 0, 4, 43,
+  0, 0, 0, 0, 0, 0, 12, 0, 54, 0,
+  14, 11, 0, 28, 0, 28, 0, 28, 0, 16,
+  0, 39, 0, 0, 31, 0, 14, 62, 0, 63,
+  0, 0, 13, 17, 0, 0, 0, 56, 19, 0,
+  0, 0, 17, 0, 0, 4, 0, 40, 0, 0,
+  0, 9, 0, 0, 61, 0, 8, 0, 37, 0,
+  3, 0, 29, 10, 44, 0, 0, 14, 0, 0,
+  35, 12, 0, 0, 40, 0, 0, 15, 31, 88,
+  14, 51, 40, 12, 0, 18, 47, 0, 19, 50,
+  3, 20, 0, 2, 0, 0, 0, 0, 0, 38,
+  7, 0, 3, 31, 0, 29, 36, 1, 0, 74,
+  29, 39, 8, 0, 0, 0, 18, 2, 39, 14,
+  0, 6, 37, 0, 0, 0, 0, 4, 5, 0,
+  0, 0, 26, 0, 49, 0, 0, 0, 3, 3,
+  17, 22, 0, 17, 0, 21, 27, 60, 0, 26,
+  24, 3, 57, 0, 52, 33, 0, 62, 14, 8,
+  23, 27, 0, 0, 26, 70, 5, 0, 0, 0,
+  0, 0, 0, 16, 0, 35, 0, 0, 0, 12,
+  0, 0, 17, 3, 26, 0, 0, 0, 20, 0,
+  35, 8, 37, 0, 73, 0, 21, 29, 10, 2,
+  0, 11, 74, 0, 0, 18, 94, 0, 0, 0,
+  36, 0, 0, 0, 0, 148, 91, 19, 0, 0,
+  0, 47, 0, 0, 32, 47, 0, 0, 27, 32,
+  0, 52, 0, 43, 0, 24, 66, 17, 51, 51,
+  13, 28, 0, 0, 0, 63, 0, 0, 62, 0,
+  50, 0, 39, 0, 0, 6, 0, 30, 12, 20,
+  0, 4, 0, 0, 19, 4, 40, 42, 0, 0,
+  0, 87, 0, 19, 0, 0, 16, 26, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 8, 0, 0,
+  35, 0, 15, 55, 0, 0, 22, 0, 52, 8,
+  59, 31, 3, 19, 8, 16, 0, 0, 0, 0,
+  66, 0, 18, 40, 0, 4, 0, 0, 51, 0,
+  18, 14, 0, 0, 0, 29, 1, 29, 8, 0,
+  54, 0, 0, 0, 67, 10, 9, 37, 50, 41,
+  0, 0, 0, 0, 0, 46, 33, 11, 2, 31,
+  0, 0, 8, 47, 45, 22, 0, 0, 0, 51,
+  0, 0, 0, 0, 95, 63, 29, 90, 0, 25,
+  0, 0, 0, 1, 11, 3, 0, 0, 29, 0,
+  0, 1, 0, 38, 0, 0, 3, 0, 26, 25,
+  4, 0, 48, 0, 30, 61, 0, 8, 0, 30,
+  0, 18, 0, 0, 0, 54, 0, 2, 33, 0,
+  0, 26, 0, 44, 0, 32, 0, 43, 0, 0,
+  0, 39, 13, 0, 8, 0, 38, 0, 3, 19,
+  0, 10, 9, 7, 0, 4, 0, 0, 50, 0,
+  0, 18, 13, 0, 27, 0, 42, 0, 53, 0,
+  0, 0, 0, 5, 36, 43, 0, 0, 0, 0,
+  0, 1, 24, 87, 0, 16, 36, 0, 0, 9,
+  34, 0, 19, 29, 0, 11, 0, 0, 0, 24,
+  7, 0, 0, 36, 0, 0, 0, 26, 0, 8,
+  20, 9, 0, 66, 26, 13, 0, 36, 0, 0,
+  2, 42, 7, 10, 0, 0, 26, 0, 0, 0,
+  0, 31, 20, 0, 10, 0, 10, 15, 33, 0,
+  6, 11, 0, 7, 9, 11, 0, 16, 0, 29,
+  9, 31, 0, 20, 48, 0, 63, 19, 21, 0,
+  0, 52, 14, 4, 22, 50, 0, 0, 0, 71,
+  13, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+  3, 0, 0, 16, 0, 8, 57, 0, 8, 0,
+  0, 0, 0, 0, 20, 1, 25, 0, 45, 0,
+  0, 0, 22, 82, 0, 0, 8, 0, 0, 0,
+  29, 61, 0, 8, 48, 0, 0, 0, 21, 71,
+  5, 41, 10, 3, 0, 14, 0, 2, 0, 9,
+  0, 69, 34, 19, 0, 41, 0, 34, 7, 20,
+  0, 34, 59, 23, 26, 10, 5, 0, 0, 0,
+  0, 0, 0, 0, 18, 22, 10, 15, 30, 39,
+  10, 0, 0, 0, 16, 36, 52, 0, 27, 32,
+  3, 0, 12, 28, 0, 21, 0, 48, 0, 2,
+  0, 34, 13, 5, 17, 11, 0, 25, 0, 47,
+  10, 1, 26, 5, 0, 0, 0, 67, 13, 0,
+  12, 0, 16, 0, 0, 15, 0, 51, 0, 0,
+  0, 0, 0, 0, 69, 0, 19, 0, 19, 11,
+  0, 0, 29, 2, 31, 0, 0, 24, 0, 0,
+  40, 11, 0, 0, 61, 11, 0, 15, 51, 85,
+  31, 58, 61, 16, 0, 9, 60, 0, 0, 53,
+  11, 51, 1, 8, 0, 10, 0, 0, 0, 42,
+  35, 0, 15, 23, 0, 51, 12, 18, 0, 69,
+  33, 20, 9, 0, 0, 0, 24, 0, 57, 28,
+  0, 0, 0, 2, 0, 18, 0, 0, 0, 0,
+  0, 0, 31, 0, 42, 0, 0, 0, 4, 14,
+  36, 12, 0, 6, 0, 29, 44, 60, 4, 0,
+  34, 12, 53, 16, 53, 25, 0, 50, 0, 27,
+  0, 9, 0, 0, 31, 64, 0, 0, 0, 0,
+  0, 0, 0, 12, 10, 60, 0, 0, 0, 0,
+  0, 0, 10, 13, 32, 0, 25, 0, 76, 0,
+  51, 15, 31, 0, 0, 35, 50, 0, 10, 0,
+  0, 0, 51, 2, 0, 18, 8, 100, 10, 27,
+  39, 26, 2, 4, 44, 0, 34, 24, 0, 0,
+  0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+  5, 0, 0, 22, 18, 0, 0, 35, 0, 0,
+  0, 0, 0, 0, 52, 66, 0, 34, 0, 0,
+  6, 2, 0, 0, 0, 0, 13, 0, 38, 2,
+  22, 0, 23, 0, 0, 0, 3, 15, 29, 0,
+  0, 37, 0, 21, 32, 48, 11, 18, 40, 3,
+  53, 7, 75, 6, 0, 23, 0, 0, 0, 1,
+  0, 0, 40, 70, 1, 0, 0, 0, 7, 0,
+  0, 9, 0, 8, 32, 0, 0, 0, 57, 0,
+  10, 0, 12, 0, 0, 0, 8, 0, 9, 14,
+  37, 0, 9, 0, 0, 9, 0, 65, 0, 0,
+  41, 0, 0, 0, 45, 38, 0, 38, 32, 25,
+  0, 0, 8, 14, 5, 56, 28, 0, 0, 19,
+  0, 0, 0, 21, 10, 40, 27, 4, 0, 33,
+  0, 8, 9, 4, 50, 58, 50, 77, 14, 17,
+  0, 0, 0, 0, 0, 0, 0, 0, 54, 0,
+  0, 0, 4, 43, 0, 0, 0, 0, 0, 0,
+  12, 0, 54, 0, 14, 11, 0, 28, 0, 28,
+  0, 28, 0, 16, 0, 39, 0, 0, 31, 0,
+  14, 62, 0, 63, 0, 0, 13, 17, 0, 0,
+  0, 56, 19, 0, 0, 0, 17, 0, 0, 4,
+  0, 40, 0, 0, 0, 9, 0, 0, 61, 0,
+  8, 0, 37, 0, 3, 0, 29, 10, 44, 0,
+  0, 14, 0, 0, 35, 12, 0, 0, 40, 0,
+  0, 15, 31, 88, 14, 51, 40, 12, 0, 18,
+  47, 0, 19, 50, 3, 20, 0, 2, 0, 0,
+  0, 0, 0, 38, 7, 0, 3, 31, 0, 29,
+  36, 1, 0, 74, 29, 39, 8, 0, 0, 0,
+  18, 2, 39, 14, 0, 6, 37, 0, 0, 0,
+  0, 4, 5, 0, 0, 0, 26, 0, 49, 0,
+  0, 0, 3, 3, 17, 22, 0, 17, 0, 21,
+  27, 60, 0, 26, 24, 3, 57, 0, 52, 33,
+  0, 62, 14, 8, 23, 27, 0, 0, 26, 70,
+  5, 0, 0, 0, 0, 0, 0, 16, 0, 35,
+  0, 0, 0, 12, 0, 0, 17, 3, 26, 0,
+  0, 0, 20, 0, 35, 8, 37, 0, 24, 0,
+  53, 0, 32, 0, 0, 0, 25, 0, 0, 1,
+  9, 122, 15, 0, 27, 21, 0, 8, 41, 13,
+  69, 7, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 5, 0, 0, 0, 4, 0, 26, 14, 10,
+  0, 48, 14, 0, 0, 0, 0, 0, 37, 104,
+  0, 37, 0, 0, 9, 6, 3, 0, 0, 0,
+  33, 0, 50, 22, 0, 0, 24, 22, 0, 1,
+  0, 0, 27, 0, 0, 13, 0, 41, 14, 36,
+  0, 5, 48, 0, 45, 11, 72, 0, 0, 2,
+  0, 0, 0, 25, 0, 0, 41, 57, 0, 0,
+  0, 0, 0, 0, 0, 10, 1, 0, 35, 0,
+  0, 0, 51, 0, 55, 0, 5, 0, 0, 0,
+  0, 0, 28, 1, 16, 0, 0, 0, 0, 29,
+  1, 29, 8, 0, 54, 0, 0, 0, 67, 10,
+  9, 37, 50, 41, 0, 0, 0, 0, 0, 46,
+  33, 11, 2, 31, 0, 0, 8, 47, 45, 22,
+  0, 0, 0, 51, 0, 0, 0, 0, 95, 63,
+  29, 90, 0, 25, 0, 0, 0, 1, 11, 3,
+  0, 0, 29, 0, 0, 1, 0, 38, 0, 0,
+  3, 0, 26, 25, 4, 0, 48, 0, 30, 61,
+  0, 8, 0, 30, 0, 18, 0, 0, 0, 54,
+  0, 2, 33, 0, 0, 26, 0, 44, 0, 32,
+  0, 43, 0, 0, 0, 39, 13, 0, 8, 0,
+  38, 0, 3, 19, 0, 10, 9, 7, 0, 4,
+  0, 0, 50, 0, 0, 18, 13, 0, 27, 0,
+  42, 0, 53, 0, 0, 0, 0, 5, 36, 43,
+  0, 0, 0, 0, 0, 1, 24, 87, 0, 16,
+  36, 0, 0, 9, 34, 0, 19, 29, 0, 11,
+  0, 0, 0, 24, 7, 0, 0, 36, 0, 0,
+  0, 26, 0, 8, 20, 9, 0, 66, 26, 13,
+  0, 36, 0, 0, 2, 42, 7, 10, 0, 0,
+  26, 0, 0, 0, 0, 31, 20, 0, 10, 0,
+  10, 15, 33, 0, 6, 11, 0, 7, 9, 11,
+  0, 16, 0, 29, 9, 31, 0, 20, 48, 0,
+  63, 19, 21, 0, 0, 52, 14, 4, 22, 50,
+  0, 0, 0, 71, 13, 0, 0, 0, 0, 0,
+  0, 1, 0, 0, 3, 0, 0, 16, 0, 8,
+  57, 0, 8, 0, 0, 0, 0, 0, 20, 1,
+  25, 0, 15, 8, 22, 22, 74, 0, 0, 1,
+  31, 0, 0, 0, 40, 118, 28, 13, 44, 0,
+  0, 9, 37, 0, 0, 12, 0, 12, 0, 24,
+  0, 17, 2, 0, 0, 38, 0, 0, 0, 6,
+  0, 44, 0, 22, 0, 57, 17, 0, 18, 21,
+  0, 0, 25, 88, 0, 60, 0, 0, 0, 21,
+  0, 0, 0, 0, 0, 0, 0, 3, 13, 0,
+  39, 0, 0, 18, 0, 0, 44, 0, 0, 3,
+  0, 44, 27, 45, 2, 0, 52, 4, 48, 24,
+  64, 0, 0, 0, 0, 16, 0, 45, 3, 2,
+  31, 57, 0, 0, 0, 0, 0, 0, 0, 10,
+  30, 7, 17, 0, 0, 0, 33, 0, 43, 0,
+  0, 0, 30, 0, 35, 0, 54, 0, 0, 0,
+  0, 24, 0, 0, 40, 11, 0, 0, 61, 11,
+  0, 15, 51, 85, 31, 58, 61, 16, 0, 9,
+  60, 0, 0, 53, 11, 51, 1, 8, 0, 10,
+  0, 0, 0, 42, 35, 0, 15, 23, 0, 51,
+  12, 18, 0, 69, 33, 20, 9, 0, 0, 0,
+  24, 0, 57, 28, 0, 0, 0, 2, 0, 18,
+  0, 0, 0, 0, 0, 0, 31, 0, 42, 0,
+  0, 0, 4, 14, 36, 12, 0, 6, 0, 29,
+  44, 60, 4, 0, 34, 12, 53, 16, 53, 25,
+  0, 50, 0, 27, 0, 9, 0, 0, 31, 64,
+  0, 0, 0, 0, 0, 0, 0, 12, 10, 60,
+  0, 0, 0, 0, 0, 0, 10, 13, 32, 0,
+  25, 0, 76, 0, 51, 15, 31, 0, 0, 35,
+  50, 0, 10, 0, 0, 0, 51, 2, 0, 18,
+  8, 100, 10, 27, 39, 26, 2, 4, 44, 0,
+  34, 24, 0, 0, 0, 5, 0, 0, 0, 0,
+  0, 0, 0, 0, 5, 0, 0, 22, 18, 0,
+  0, 35, 0, 0, 0, 0, 0, 0, 52, 66,
+  0, 34, 0, 0, 6, 2, 0, 0, 0, 0,
+  13, 0, 38, 2, 22, 0, 23, 0, 0, 0,
+  3, 15, 29, 0, 0, 37, 0, 21, 32, 48,
+  11, 18, 40, 3, 53, 7, 75, 6, 0, 23,
+  0, 0, 0, 1, 0, 0, 40, 70, 1, 0,
+  0, 0, 7, 0, 0, 9, 0, 8, 32, 0,
+  0, 0, 57, 0, 10, 0, 12, 0, 0, 0,
+  8, 0, 9, 14, 37, 0, 22, 0, 59, 0,
+  0, 0, 0, 0, 23, 0, 0, 0, 0, 116,
+  1, 0, 6, 27, 1, 0, 38, 30, 84, 8,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 2, 0, 0, 28, 17, 0, 30,
+  0, 0, 0, 0, 0, 0, 35, 131, 0, 15,
+  36, 0, 30, 17, 14, 0, 0, 0, 34, 0,
+  88, 47, 7, 2, 16, 67, 0, 0, 0, 0,
+  11, 0, 0, 0, 0, 24, 16, 22, 0, 15,
+  41, 0, 31, 10, 71, 0, 0, 11, 2, 0,
+  0, 5, 0, 0, 62, 66, 0, 0, 0, 0,
+  12, 10, 0, 7, 0, 0, 50, 0, 0, 0,
+  91, 3, 77, 0, 19, 0, 0, 0, 0, 0,
+  21, 6, 10, 0, 0, 14, 0, 0, 35, 12,
+  0, 0, 40, 0, 0, 15, 31, 88, 14, 51,
+  40, 12, 0, 18, 47, 0, 19, 50, 3, 20,
+  0, 2, 0, 0, 0, 0, 0, 38, 7, 0,
+  3, 31, 0, 29, 36, 1, 0, 74, 29, 39,
+  8, 0, 0, 0, 18, 2, 39, 14, 0, 6,
+  37, 0, 0, 0, 0, 4, 5, 0, 0, 0,
+  26, 0, 49, 0, 0, 0, 3, 3, 17, 22,
+  0, 17, 0, 21, 27, 60, 0, 26, 24, 3,
+  57, 0, 52, 33, 0, 62, 14, 8, 23, 27,
+  0, 0, 26, 70, 5, 0, 0, 0, 0, 0,
+  0, 16, 0, 35, 0, 0, 0, 12, 0, 0,
+  17, 3, 26, 0, 0, 0, 20, 0, 35, 8,
+  37, 0, 24, 0, 53, 0, 32, 0, 0, 0,
+  25, 0, 0, 1, 9, 122, 15, 0, 27, 21,
+  0, 8, 41, 13, 69, 7, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 5, 0, 0, 0, 4,
+  0, 26, 14, 10, 0, 48, 14, 0, 0, 0,
+  0, 0, 37, 104, 0, 37, 0, 0, 9, 6,
+  3, 0, 0, 0, 33, 0, 50, 22, 0, 0,
+  24, 22, 0, 1, 0, 0, 27, 0, 0, 13,
+  0, 41, 14, 36, 0, 5, 48, 0, 45, 11,
+  72, 0, 0, 2, 0, 0, 0, 25, 0, 0,
+  41, 57, 0, 0, 0, 0, 0, 0, 0, 10,
+  1, 0, 35, 0, 0, 0, 51, 0, 55, 0,
+  5, 0, 0, 0, 0, 0, 28, 1, 16, 0,
+  30, 0, 17, 10, 31, 0, 0, 0, 35, 0,
+  0, 3, 12, 104, 13, 0, 18, 16, 0, 5,
+  51, 0, 33, 3, 0, 0, 0, 16, 0, 15,
+  0, 9, 0, 7, 0, 0, 0, 0, 0, 7,
+  0, 12, 0, 50, 13, 0, 0, 0, 0, 0,
+  32, 102, 0, 61, 0, 0, 22, 15, 0, 0,
+  0, 0, 29, 0, 32, 22, 10, 15, 12, 12,
+  0, 0, 0, 0, 42, 0, 0, 0, 0, 33,
+  26, 38, 0, 3, 31, 0, 30, 10, 63, 12,
+  0, 0, 0, 0, 0, 25, 23, 0, 69, 64,
+  0, 0, 2, 0, 4, 5, 0, 9, 49, 0,
+  33, 0, 0, 3, 60, 0, 68, 0, 0, 0,
+  8, 0, 0, 0, 49, 3, 11, 0, 0, 0,
+  0, 5, 36, 43, 0, 0, 0, 0, 0, 1,
+  24, 87, 0, 16, 36, 0, 0, 9, 34, 0,
+  19, 29, 0, 11, 0, 0, 0, 24, 7, 0,
+  0, 36, 0, 0, 0, 26, 0, 8, 20, 9,
+  0, 66, 26, 13, 0, 36, 0, 0, 2, 42,
+  7, 10, 0, 0, 26, 0, 0, 0, 0, 31,
+  20, 0, 10, 0, 10, 15, 33, 0, 6, 11,
+  0, 7, 9, 11, 0, 16, 0, 29, 9, 31,
+  0, 20, 48, 0, 63, 19, 21, 0, 0, 52,
+  14, 4, 22, 50, 0, 0, 0, 71, 13, 0,
+  0, 0, 0, 0, 0, 1, 0, 0, 3, 0,
+  0, 16, 0, 8, 57, 0, 8, 0, 0, 0,
+  0, 0, 20, 1, 25, 0, 15, 8, 22, 22,
+  74, 0, 0, 1, 31, 0, 0, 0, 40, 118,
+  28, 13, 44, 0, 0, 9, 37, 0, 0, 12,
+  0, 12, 0, 24, 0, 17, 2, 0, 0, 38,
+  0, 0, 0, 6, 0, 44, 0, 22, 0, 57,
+  17, 0, 18, 21, 0, 0, 25, 88, 0, 60,
+  0, 0, 0, 21, 0, 0, 0, 0, 0, 0,
+  0, 3, 13, 0, 39, 0, 0, 18, 0, 0,
+  44, 0, 0, 3, 0, 44, 27, 45, 2, 0,
+  52, 4, 48, 24, 64, 0, 0, 0, 0, 16,
+  0, 45, 3, 2, 31, 57, 0, 0, 0, 0,
+  0, 0, 0, 10, 30, 7, 17, 0, 0, 0,
+  33, 0, 43, 0, 0, 0, 30, 0, 35, 0,
+  54, 0, 0, 0, 0, 42, 26, 36, 66, 0,
+  0, 14, 62, 8, 0, 3, 37, 89, 51, 42,
+  59, 7, 0, 10, 42, 0, 0, 21, 16, 33,
+  0, 45, 0, 0, 4, 0, 0, 27, 0, 0,
+  0, 13, 0, 62, 0, 3, 0, 70, 16, 0,
+  32, 0, 0, 0, 21, 64, 8, 79, 0, 0,
+  0, 31, 0, 20, 0, 0, 0, 0, 0, 0,
+  49, 0, 44, 0, 0, 0, 0, 2, 62, 0,
+  0, 25, 0, 37, 50, 81, 8, 1, 28, 19,
+  26, 9, 59, 14, 0, 0, 0, 31, 0, 46,
+  17, 31, 61, 56, 0, 0, 3, 0, 4, 0,
+  0, 6, 50, 28, 14, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 7, 1, 83, 0, 80, 2,
+  9, 0, 0, 35, 50, 0, 10, 0, 0, 0,
+  51, 2, 0, 18, 8, 100, 10, 27, 39, 26,
+  2, 4, 44, 0, 34, 24, 0, 0, 0, 5,
+  0, 0, 0, 0, 0, 0, 0, 0, 5, 0,
+  0, 22, 18, 0, 0, 35, 0, 0, 0, 0,
+  0, 0, 52, 66, 0, 34, 0, 0, 6, 2,
+  0, 0, 0, 0, 13, 0, 38, 2, 22, 0,
+  23, 0, 0, 0, 3, 15, 29, 0, 0, 37,
+  0, 21, 32, 48, 11, 18, 40, 3, 53, 7,
+  75, 6, 0, 23, 0, 0, 0, 1, 0, 0,
+  40, 70, 1, 0, 0, 0, 7, 0, 0, 9,
+  0, 8, 32, 0, 0, 0, 57, 0, 10, 0,
+  12, 0, 0, 0, 8, 0, 9, 14, 37, 0,
+  22, 0, 59, 0, 0, 0, 0, 0, 23, 0,
+  0, 0, 0, 116, 1, 0, 6, 27, 1, 0,
+  38, 30, 84, 8, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+  28, 17, 0, 30, 0, 0, 0, 0, 0, 0,
+  35, 131, 0, 15, 36, 0, 30, 17, 14, 0,
+  0, 0, 34, 0, 88, 47, 7, 2, 16, 67,
+  0, 0, 0, 0, 11, 0, 0, 0, 0, 24,
+  16, 22, 0, 15, 41, 0, 31, 10, 71, 0,
+  0, 11, 2, 0, 0, 5, 0, 0, 62, 66,
+  0, 0, 0, 0, 12, 10, 0, 7, 0, 0,
+  50, 0, 0, 0, 91, 3, 77, 0, 19, 0,
+  0, 0, 0, 0, 21, 6, 10, 0, 20, 0,
+  19, 16, 0, 0, 0, 0, 29, 0, 0, 0,
+  2, 73, 0, 0, 0, 28, 8, 5, 49, 5,
+  52, 6, 0, 0, 0, 7, 0, 12, 6, 1,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 29,
+  0, 45, 0, 0, 0, 16, 0, 0, 39, 114,
+  0, 30, 15, 0, 35, 10, 0, 0, 0, 0,
+  31, 0, 77, 23, 0, 26, 0, 48, 0, 8,
+  0, 0, 25, 0, 0, 0, 0, 24, 31, 18,
+  0, 15, 42, 0, 28, 19, 61, 0, 0, 0,
+  0, 0, 0, 9, 24, 0, 72, 41, 0, 0,
+  3, 0, 0, 0, 0, 13, 37, 0, 43, 0,
+  0, 5, 84, 0, 93, 0, 17, 0, 7, 5,
+  0, 0, 42, 4, 0, 0, 24, 0, 53, 0,
+  32, 0, 0, 0, 25, 0, 0, 1, 9, 122,
+  15, 0, 27, 21, 0, 8, 41, 13, 69, 7,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 5,
+  0, 0, 0, 4, 0, 26, 14, 10, 0, 48,
+  14, 0, 0, 0, 0, 0, 37, 104, 0, 37,
+  0, 0, 9, 6, 3, 0, 0, 0, 33, 0,
+  50, 22, 0, 0, 24, 22, 0, 1, 0, 0,
+  27, 0, 0, 13, 0, 41, 14, 36, 0, 5,
+  48, 0, 45, 11, 72, 0, 0, 2, 0, 0,
+  0, 25, 0, 0, 41, 57, 0, 0, 0, 0,
+  0, 0, 0, 10, 1, 0, 35, 0, 0, 0,
+  51, 0, 55, 0, 5, 0, 0, 0, 0, 0,
+  28, 1, 16, 0, 30, 0, 17, 10, 31, 0,
+  0, 0, 35, 0, 0, 3, 12, 104, 13, 0,
+  18, 16, 0, 5, 51, 0, 33, 3, 0, 0,
+  0, 16, 0, 15, 0, 9, 0, 7, 0, 0,
+  0, 0, 0, 7, 0, 12, 0, 50, 13, 0,
+  0, 0, 0, 0, 32, 102, 0, 61, 0, 0,
+  22, 15, 0, 0, 0, 0, 29, 0, 32, 22,
+  10, 15, 12, 12, 0, 0, 0, 0, 42, 0,
+  0, 0, 0, 33, 26, 38, 0, 3, 31, 0,
+  30, 10, 63, 12, 0, 0, 0, 0, 0, 25,
+  23, 0, 69, 64, 0, 0, 2, 0, 4, 5,
+  0, 9, 49, 0, 33, 0, 0, 3, 60, 0,
+  68, 0, 0, 0, 8, 0, 0, 0, 49, 3,
+  11, 0, 0, 22, 0, 46, 29, 0, 0, 10,
+  69, 0, 0, 23, 38, 83, 24, 20, 35, 2,
+  0, 9, 58, 0, 0, 0, 4, 48, 0, 23,
+  0, 8, 10, 0, 0, 43, 1, 0, 0, 4,
+  0, 24, 0, 21, 0, 69, 0, 0, 10, 17,
+  0, 0, 39, 72, 4, 92, 0, 0, 6, 27,
+  0, 37, 0, 0, 0, 0, 0, 8, 23, 24,
+  37, 0, 0, 3, 0, 0, 58, 0, 0, 14,
+  0, 39, 58, 70, 0, 0, 36, 5, 31, 21,
+  43, 20, 8, 4, 0, 16, 0, 28, 38, 0,
+  72, 48, 0, 0, 6, 0, 2, 0, 0, 22,
+  64, 11, 22, 0, 0, 9, 42, 0, 28, 0,
+  0, 0, 25, 29, 79, 0, 79, 5, 10, 0,
+  15, 8, 22, 22, 74, 0, 0, 1, 31, 0,
+  0, 0, 40, 118, 28, 13, 44, 0, 0, 9,
+  37, 0, 0, 12, 0, 12, 0, 24, 0, 17,
+  2, 0, 0, 38, 0, 0, 0, 6, 0, 44,
+  0, 22, 0, 57, 17, 0, 18, 21, 0, 0,
+  25, 88, 0, 60, 0, 0, 0, 21, 0, 0,
+  0, 0, 0, 0, 0, 3, 13, 0, 39, 0,
+  0, 18, 0, 0, 44, 0, 0, 3, 0, 44,
+  27, 45, 2, 0, 52, 4, 48, 24, 64, 0,
+  0, 0, 0, 16, 0, 45, 3, 2, 31, 57,
+  0, 0, 0, 0, 0, 0, 0, 10, 30, 7,
+  17, 0, 0, 0, 33, 0, 43, 0, 0, 0,
+  30, 0, 35, 0, 54, 0, 0, 0, 0, 42,
+  26, 36, 66, 0, 0, 14, 62, 8, 0, 3,
+  37, 89, 51, 42, 59, 7, 0, 10, 42, 0,
+  0, 21, 16, 33, 0, 45, 0, 0, 4, 0,
+  0, 27, 0, 0, 0, 13, 0, 62, 0, 3,
+  0, 70, 16, 0, 32, 0, 0, 0, 21, 64,
+  8, 79, 0, 0, 0, 31, 0, 20, 0, 0,
+  0, 0, 0, 0, 49, 0, 44, 0, 0, 0,
+  0, 2, 62, 0, 0, 25, 0, 37, 50, 81,
+  8, 1, 28, 19, 26, 9, 59, 14, 0, 0,
+  0, 31, 0, 46, 17, 31, 61, 56, 0, 0,
+  3, 0, 4, 0, 0, 6, 50, 28, 14, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 7, 1,
+  83, 0, 80, 2, 9, 0, 0, 25, 11, 47,
+  41, 0, 0, 5, 47, 1, 0, 16, 5, 75,
+  19, 28, 49, 26, 0, 33, 25, 0, 0, 0,
+  18, 25, 0, 34, 0, 0, 0, 0, 0, 42,
+  0, 0, 0, 16, 0, 27, 0, 0, 0, 56,
+  0, 7, 36, 0, 0, 0, 0, 20, 0, 61,
+  0, 0, 3, 18, 0, 21, 2, 0, 0, 0,
+  0, 0, 62, 6, 75, 21, 0, 0, 9, 9,
+  54, 0, 0, 53, 0, 0, 29, 74, 8, 11,
+  30, 30, 27, 34, 17, 0, 0, 29, 0, 0,
+  22, 13, 14, 0, 41, 57, 0, 6, 0, 0,
+  3, 28, 0, 7, 12, 5, 0, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 0, 32, 0,
+  54, 11, 27, 0, 22, 0, 59, 0, 0, 0,
+  0, 0, 23, 0, 0, 0, 0, 116, 1, 0,
+  6, 27, 1, 0, 38, 30, 84, 8, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 2, 0, 0, 28, 17, 0, 30, 0, 0,
+  0, 0, 0, 0, 35, 131, 0, 15, 36, 0,
+  30, 17, 14, 0, 0, 0, 34, 0, 88, 47,
+  7, 2, 16, 67, 0, 0, 0, 0, 11, 0,
+  0, 0, 0, 24, 16, 22, 0, 15, 41, 0,
+  31, 10, 71, 0, 0, 11, 2, 0, 0, 5,
+  0, 0, 62, 66, 0, 0, 0, 0, 12, 10,
+  0, 7, 0, 0, 50, 0, 0, 0, 91, 3,
+  77, 0, 19, 0, 0, 0, 0, 0, 21, 6,
+  10, 0, 20, 0, 19, 16, 0, 0, 0, 0,
+  29, 0, 0, 0, 2, 73, 0, 0, 0, 28,
+  8, 5, 49, 5, 52, 6, 0, 0, 0, 7,
+  0, 12, 6, 1, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 29, 0, 45, 0, 0, 0, 16,
+  0, 0, 39, 114, 0, 30, 15, 0, 35, 10,
+  0, 0, 0, 0, 31, 0, 77, 23, 0, 26,
+  0, 48, 0, 8, 0, 0, 25, 0, 0, 0,
+  0, 24, 31, 18, 0, 15, 42, 0, 28, 19,
+  61, 0, 0, 0, 0, 0, 0, 9, 24, 0,
+  72, 41, 0, 0, 3, 0, 0, 0, 0, 13,
+  37, 0, 43, 0, 0, 5, 84, 0, 93, 0,
+  17, 0, 7, 5, 0, 0, 42, 4, 0, 0,
+  3, 16, 0, 41, 1, 0, 4, 6, 70, 0,
+  0, 11, 25, 55, 18, 0, 14, 4, 17, 0,
+  52, 0, 0, 17, 0, 16, 4, 14, 0, 32,
+  2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 25, 0, 53, 0, 0, 5, 16, 0, 0,
+  58, 87, 18, 68, 0, 0, 15, 25, 0, 19,
+  0, 0, 0, 0, 0, 11, 7, 13, 8, 0,
+  0, 9, 0, 0, 44, 3, 0, 0, 0, 43,
+  57, 57, 0, 0, 32, 0, 31, 33, 74, 29,
+  25, 0, 0, 0, 0, 11, 45, 0, 71, 48,
+  0, 0, 7, 0, 2, 0, 0, 12, 74, 6,
+  34, 0, 0, 0, 67, 0, 49, 0, 0, 0,
+  48, 9, 63, 0, 76, 0, 5, 0, 30, 0,
+  17, 10, 31, 0, 0, 0, 35, 0, 0, 3,
+  12, 104, 13, 0, 18, 16, 0, 5, 51, 0,
+  33, 3, 0, 0, 0, 16, 0, 15, 0, 9,
+  0, 7, 0, 0, 0, 0, 0, 7, 0, 12,
+  0, 50, 13, 0, 0, 0, 0, 0, 32, 102,
+  0, 61, 0, 0, 22, 15, 0, 0, 0, 0,
+  29, 0, 32, 22, 10, 15, 12, 12, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 33, 26, 38,
+  0, 3, 31, 0, 30, 10, 63, 12, 0, 0,
+  0, 0, 0, 25, 23, 0, 69, 64, 0, 0,
+  2, 0, 4, 5, 0, 9, 49, 0, 33, 0,
+  0, 3, 60, 0, 68, 0, 0, 0, 8, 0,
+  0, 0, 49, 3, 11, 0, 0, 22, 0, 46,
+  29, 0, 0, 10, 69, 0, 0, 23, 38, 83,
+  24, 20, 35, 2, 0, 9, 58, 0, 0, 0,
+  4, 48, 0, 23, 0, 8, 10, 0, 0, 43,
+  1, 0, 0, 4, 0, 24, 0, 21, 0, 69,
+  0, 0, 10, 17, 0, 0, 39, 72, 4, 92,
+  0, 0, 6, 27, 0, 37, 0, 0, 0, 0,
+  0, 8, 23, 24, 37, 0, 0, 3, 0, 0,
+  58, 0, 0, 14, 0, 39, 58, 70, 0, 0,
+  36, 5, 31, 21, 43, 20, 8, 4, 0, 16,
+  0, 28, 38, 0, 72, 48, 0, 0, 6, 0,
+  2, 0, 0, 22, 64, 11, 22, 0, 0, 9,
+  42, 0, 28, 0, 0, 0, 25, 29, 79, 0,
+  79, 5, 10, 0, 0, 19, 0, 49, 12, 0,
+  0, 25, 85, 2, 1, 7, 23, 85, 32, 34,
+  52, 0, 5, 0, 23, 0, 0, 0, 0, 25,
+  0, 34, 0, 0, 0, 0, 0, 25, 0, 0,
+  0, 0, 0, 23, 0, 6, 0, 46, 0, 0,
+  22, 18, 0, 0, 24, 75, 20, 83, 0, 0,
+  0, 46, 0, 19, 0, 0, 0, 0, 0, 30,
+  41, 0, 59, 0, 0, 0, 0, 12, 50, 0,
+  0, 9, 0, 32, 59, 63, 9, 0, 17, 31,
+  16, 61, 46, 0, 20, 36, 0, 0, 0, 9,
+  42, 0, 48, 63, 0, 0, 0, 0, 9, 0,
+  0, 19, 28, 6, 15, 0, 0, 0, 28, 0,
+  22, 0, 0, 0, 15, 1, 73, 0, 78, 3,
+  7, 0, 0, 42, 26, 36, 66, 0, 0, 14,
+  62, 8, 0, 3, 37, 89, 51, 42, 59, 7,
+  0, 10, 42, 0, 0, 21, 16, 33, 0, 45,
+  0, 0, 4, 0, 0, 27, 0, 0, 0, 13,
+  0, 62, 0, 3, 0, 70, 16, 0, 32, 0,
+  0, 0, 21, 64, 8, 79, 0, 0, 0, 31,
+  0, 20, 0, 0, 0, 0, 0, 0, 49, 0,
+  44, 0, 0, 0, 0, 2, 62, 0, 0, 25,
+  0, 37, 50, 81, 8, 1, 28, 19, 26, 9,
+  59, 14, 0, 0, 0, 31, 0, 46, 17, 31,
+  61, 56, 0, 0, 3, 0, 4, 0, 0, 6,
+  50, 28, 14, 0, 0, 0, 10, 0, 0, 0,
+  0, 0, 7, 1, 83, 0, 80, 2, 9, 0,
+  0, 25, 11, 47, 41, 0, 0, 5, 47, 1,
+  0, 16, 5, 75, 19, 28, 49, 26, 0, 33,
+  25, 0, 0, 0, 18, 25, 0, 34, 0, 0,
+  0, 0, 0, 42, 0, 0, 0, 16, 0, 27,
+  0, 0, 0, 56, 0, 7, 36, 0, 0, 0,
+  0, 20, 0, 61, 0, 0, 3, 18, 0, 21,
+  2, 0, 0, 0, 0, 0, 62, 6, 75, 21,
+  0, 0, 9, 9, 54, 0, 0, 53, 0, 0,
+  29, 74, 8, 11, 30, 30, 27, 34, 17, 0,
+  0, 29, 0, 0, 22, 13, 14, 0, 41, 57,
+  0, 6, 0, 0, 3, 28, 0, 7, 12, 5,
+  0, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 0, 32, 0, 54, 11, 27, 0, 0, 0,
+  0, 70, 0, 0, 0, 2, 33, 0, 0, 0,
+  0, 43, 0, 6, 22, 39, 0, 28, 7, 0,
+  9, 0, 0, 0, 28, 31, 0, 0, 0, 0,
+  0, 29, 0, 0, 2, 27, 0, 0, 0, 0,
+  0, 6, 0, 5, 36, 29, 18, 0, 0, 0,
+  0, 40, 0, 15, 23, 36, 0, 10, 8, 17,
+  0, 4, 56, 0, 56, 30, 68, 85, 5, 0,
+  19, 21, 32, 0, 0, 9, 20, 0, 0, 41,
+  10, 0, 11, 39, 17, 55, 0, 0, 0, 81,
+  0, 0, 54, 0, 6, 0, 21, 50, 24, 33,
+  0, 0, 0, 40, 0, 5, 0, 0, 0, 0,
+  0, 0, 7, 0, 7, 0, 0, 0, 0, 0,
+  0, 0, 0, 21, 20, 0, 20, 0, 19, 16,
+  0, 0, 0, 0, 29, 0, 0, 0, 2, 73,
+  0, 0, 0, 28, 8, 5, 49, 5, 52, 6,
+  0, 0, 0, 7, 0, 12, 6, 1, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 29, 0, 45,
+  0, 0, 0, 16, 0, 0, 39, 114, 0, 30,
+  15, 0, 35, 10, 0, 0, 0, 0, 31, 0,
+  77, 23, 0, 26, 0, 48, 0, 8, 0, 0,
+  25, 0, 0, 0, 0, 24, 31, 18, 0, 15,
+  42, 0, 28, 19, 61, 0, 0, 0, 0, 0,
+  0, 9, 24, 0, 72, 41, 0, 0, 3, 0,
+  0, 0, 0, 13, 37, 0, 43, 0, 0, 5,
+  84, 0, 93, 0, 17, 0, 7, 5, 0, 0,
+  42, 4, 0, 0, 3, 16, 0, 41, 1, 0,
+  4, 6, 70, 0, 0, 11, 25, 55, 18, 0,
+  14, 4, 17, 0, 52, 0, 0, 17, 0, 16,
+  4, 14, 0, 32, 2, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 25, 0, 53, 0, 0,
+  5, 16, 0, 0, 58, 87, 18, 68, 0, 0,
+  15, 25, 0, 19, 0, 0, 0, 0, 0, 11,
+  7, 13, 8, 0, 0, 9, 0, 0, 44, 3,
+  0, 0, 0, 43, 57, 57, 0, 0, 32, 0,
+  31, 33, 74, 29, 25, 0, 0, 0, 0, 11,
+  45, 0, 71, 48, 0, 0, 7, 0, 2, 0,
+  0, 12, 74, 6, 34, 0, 0, 0, 67, 0,
+  49, 0, 0, 0, 48, 9, 63, 0, 76, 0,
+  5, 0, 0, 29, 0, 36, 17, 0, 0, 1,
+  82, 0, 0, 10, 14, 80, 41, 0, 22, 8,
+  10, 0, 47, 0, 0, 23, 0, 13, 0, 15,
+  0, 5, 0, 0, 0, 11, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 51, 0, 0, 23, 16,
+  0, 0, 35, 72, 21, 74, 0, 0, 3, 24,
+  0, 11, 0, 0, 0, 0, 0, 21, 29, 0,
+  30, 0, 0, 0, 0, 0, 58, 0, 0, 0,
+  0, 30, 56, 60, 4, 0, 25, 0, 29, 51,
+  61, 17, 7, 13, 0, 0, 0, 14, 29, 0,
+  67, 43, 0, 16, 0, 0, 10, 1, 0, 7,
+  54, 13, 18, 0, 0, 0, 34, 0, 15, 0,
+  0, 0, 35, 0, 63, 0, 64, 0, 8, 0,
+  0, 22, 0, 46, 29, 0, 0, 10, 69, 0,
+  0, 23, 38, 83, 24, 20, 35, 2, 0, 9,
+  58, 0, 0, 0, 4, 48, 0, 23, 0, 8,
+  10, 0, 0, 43, 1, 0, 0, 4, 0, 24,
+  0, 21, 0, 69, 0, 0, 10, 17, 0, 0,
+  39, 72, 4, 92, 0, 0, 6, 27, 0, 37,
+  0, 0, 0, 0, 0, 8, 23, 24, 37, 0,
+  0, 3, 0, 0, 58, 0, 0, 14, 0, 39,
+  58, 70, 0, 0, 36, 5, 31, 21, 43, 20,
+  8, 4, 0, 16, 0, 28, 38, 0, 72, 48,
+  0, 0, 6, 0, 2, 0, 0, 22, 64, 11,
+  22, 0, 0, 9, 42, 0, 28, 0, 0, 0,
+  25, 29, 79, 0, 79, 5, 10, 0, 0, 19,
+  0, 49, 12, 0, 0, 25, 85, 2, 1, 7,
+  23, 85, 32, 34, 52, 0, 5, 0, 23, 0,
+  0, 0, 0, 25, 0, 34, 0, 0, 0, 0,
+  0, 25, 0, 0, 0, 0, 0, 23, 0, 6,
+  0, 46, 0, 0, 22, 18, 0, 0, 24, 75,
+  20, 83, 0, 0, 0, 46, 0, 19, 0, 0,
+  0, 0, 0, 30, 41, 0, 59, 0, 0, 0,
+  0, 12, 50, 0, 0, 9, 0, 32, 59, 63,
+  9, 0, 17, 31, 16, 61, 46, 0, 20, 36,
+  0, 0, 0, 9, 42, 0, 48, 63, 0, 0,
+  0, 0, 9, 0, 0, 19, 28, 6, 15, 0,
+  0, 0, 28, 0, 22, 0, 0, 0, 15, 1,
+  73, 0, 78, 3, 7, 0, 0, 4, 2, 46,
+  13, 0, 0, 32, 107, 4, 2, 0, 4, 83,
+  44, 32, 46, 4, 0, 0, 3, 0, 0, 10,
+  0, 0, 0, 35, 0, 0, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 24, 0, 0, 0, 32,
+  0, 0, 49, 17, 0, 0, 0, 80, 25, 73,
+  0, 0, 0, 50, 0, 3, 0, 0, 0, 0,
+  0, 35, 49, 0, 61, 9, 0, 0, 3, 17,
+  57, 9, 0, 0, 0, 10, 48, 46, 9, 0,
+  7, 32, 17, 79, 43, 0, 37, 35, 0, 0,
+  0, 5, 31, 0, 49, 67, 11, 1, 0, 0,
+  15, 0, 0, 19, 8, 3, 5, 0, 0, 0,
+  19, 0, 26, 0, 0, 0, 5, 0, 65, 0,
+  62, 0, 2, 0, 0, 25, 11, 47, 41, 0,
+  0, 5, 47, 1, 0, 16, 5, 75, 19, 28,
+  49, 26, 0, 33, 25, 0, 0, 0, 18, 25,
+  0, 34, 0, 0, 0, 0, 0, 42, 0, 0,
+  0, 16, 0, 27, 0, 0, 0, 56, 0, 7,
+  36, 0, 0, 0, 0, 20, 0, 61, 0, 0,
+  3, 18, 0, 21, 2, 0, 0, 0, 0, 0,
+  62, 6, 75, 21, 0, 0, 9, 9, 54, 0,
+  0, 53, 0, 0, 29, 74, 8, 11, 30, 30,
+  27, 34, 17, 0, 0, 29, 0, 0, 22, 13,
+  14, 0, 41, 57, 0, 6, 0, 0, 3, 28,
+  0, 7, 12, 5, 0, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 0, 32, 0, 54, 11,
+  27, 0, 0, 0, 0, 70, 0, 0, 0, 2,
+  33, 0, 0, 0, 0, 43, 0, 6, 22, 39,
+  0, 28, 7, 0, 9, 0, 0, 0, 28, 31,
+  0, 0, 0, 0, 0, 29, 0, 0, 2, 27,
+  0, 0, 0, 0, 0, 6, 0, 5, 36, 29,
+  18, 0, 0, 0, 0, 40, 0, 15, 23, 36,
+  0, 10, 8, 17, 0, 4, 56, 0, 56, 30,
+  68, 85, 5, 0, 19, 21, 32, 0, 0, 9,
+  20, 0, 0, 41, 10, 0, 11, 39, 17, 55,
+  0, 0, 0, 81, 0, 0, 54, 0, 6, 0,
+  21, 50, 24, 33, 0, 0, 0, 40, 0, 5,
+  0, 0, 0, 0, 0, 0, 7, 0, 7, 0,
+  0, 0, 0, 0, 0, 0, 0, 21, 20, 0,
+  0, 8, 0, 102, 1, 0, 0, 14, 69, 27,
+  0, 0, 0, 1, 0, 66, 27, 37, 0, 17,
+  6, 0, 0, 0, 2, 0, 52, 58, 12, 0,
+  0, 0, 14, 27, 0, 0, 6, 45, 0, 0,
+  2, 0, 0, 11, 0, 17, 56, 34, 0, 0,
+  0, 0, 2, 38, 0, 25, 6, 68, 0, 37,
+  0, 16, 0, 2, 22, 0, 50, 18, 67, 47,
+  0, 0, 22, 50, 27, 21, 0, 3, 14, 0,
+  29, 40, 11, 0, 0, 47, 18, 59, 13, 0,
+  37, 101, 0, 22, 37, 0, 12, 0, 20, 34,
+  37, 0, 0, 0, 4, 0, 0, 14, 0, 6,
+  0, 13, 0, 0, 10, 0, 0, 0, 0, 0,
+  4, 0, 56, 0, 21, 28, 9, 0, 3, 16,
+  0, 41, 1, 0, 4, 6, 70, 0, 0, 11,
+  25, 55, 18, 0, 14, 4, 17, 0, 52, 0,
+  0, 17, 0, 16, 4, 14, 0, 32, 2, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 25,
+  0, 53, 0, 0, 5, 16, 0, 0, 58, 87,
+  18, 68, 0, 0, 15, 25, 0, 19, 0, 0,
+  0, 0, 0, 11, 7, 13, 8, 0, 0, 9,
+  0, 0, 44, 3, 0, 0, 0, 43, 57, 57,
+  0, 0, 32, 0, 31, 33, 74, 29, 25, 0,
+  0, 0, 0, 11, 45, 0, 71, 48, 0, 0,
+  7, 0, 2, 0, 0, 12, 74, 6, 34, 0,
+  0, 0, 67, 0, 49, 0, 0, 0, 48, 9,
+  63, 0, 76, 0, 5, 0, 0, 29, 0, 36,
+  17, 0, 0, 1, 82, 0, 0, 10, 14, 80,
+  41, 0, 22, 8, 10, 0, 47, 0, 0, 23,
+  0, 13, 0, 15, 0, 5, 0, 0, 0, 11,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 51,
+  0, 0, 23, 16, 0, 0, 35, 72, 21, 74,
+  0, 0, 3, 24, 0, 11, 0, 0, 0, 0,
+  0, 21, 29, 0, 30, 0, 0, 0, 0, 0,
+  58, 0, 0, 0, 0, 30, 56, 60, 4, 0,
+  25, 0, 29, 51, 61, 17, 7, 13, 0, 0,
+  0, 14, 29, 0, 67, 43, 0, 16, 0, 0,
+  10, 1, 0, 7, 54, 13, 18, 0, 0, 0,
+  34, 0, 15, 0, 0, 0, 35, 0, 63, 0,
+  64, 0, 8, 0, 0, 64, 0, 40, 20, 0,
+  10, 0, 63, 0, 7, 15, 12, 65, 48, 6,
+  31, 34, 0, 25, 58, 0, 0, 21, 0, 36,
+  3, 4, 0, 0, 0, 0, 0, 32, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 41, 0, 0,
+  21, 22, 0, 0, 26, 26, 28, 76, 0, 0,
+  10, 4, 0, 25, 19, 0, 0, 0, 0, 11,
+  55, 3, 50, 0, 0, 0, 0, 0, 62, 0,
+  0, 0, 0, 3, 57, 69, 4, 0, 25, 19,
+  41, 29, 30, 12, 0, 34, 0, 1, 0, 24,
+  19, 0, 63, 30, 0, 19, 0, 0, 12, 0,
+  3, 1, 34, 21, 0, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 13, 75, 0, 41, 0,
+  17, 0, 0, 19, 0, 49, 12, 0, 0, 25,
+  85, 2, 1, 7, 23, 85, 32, 34, 52, 0,
+  5, 0, 23, 0, 0, 0, 0, 25, 0, 34,
+  0, 0, 0, 0, 0, 25, 0, 0, 0, 0,
+  0, 23, 0, 6, 0, 46, 0, 0, 22, 18,
+  0, 0, 24, 75, 20, 83, 0, 0, 0, 46,
+  0, 19, 0, 0, 0, 0, 0, 30, 41, 0,
+  59, 0, 0, 0, 0, 12, 50, 0, 0, 9,
+  0, 32, 59, 63, 9, 0, 17, 31, 16, 61,
+  46, 0, 20, 36, 0, 0, 0, 9, 42, 0,
+  48, 63, 0, 0, 0, 0, 9, 0, 0, 19,
+  28, 6, 15, 0, 0, 0, 28, 0, 22, 0,
+  0, 0, 15, 1, 73, 0, 78, 3, 7, 0,
+  0, 4, 2, 46, 13, 0, 0, 32, 107, 4,
+  2, 0, 4, 83, 44, 32, 46, 4, 0, 0,
+  3, 0, 0, 10, 0, 0, 0, 35, 0, 0,
+  0, 0, 0, 15, 0, 0, 0, 0, 0, 24,
+  0, 0, 0, 32, 0, 0, 49, 17, 0, 0,
+  0, 80, 25, 73, 0, 0, 0, 50, 0, 3,
+  0, 0, 0, 0, 0, 35, 49, 0, 61, 9,
+  0, 0, 3, 17, 57, 9, 0, 0, 0, 10,
+  48, 46, 9, 0, 7, 32, 17, 79, 43, 0,
+  37, 35, 0, 0, 0, 5, 31, 0, 49, 67,
+  11, 1, 0, 0, 15, 0, 0, 19, 8, 3,
+  5, 0, 0, 0, 19, 0, 26, 0, 0, 0,
+  5, 0, 65, 0, 62, 0, 2, 0, 0, 37,
+  0, 44, 22, 0, 8, 20, 82, 0, 25, 11,
+  12, 56, 55, 36, 59, 22, 0, 12, 31, 0,
+  0, 0, 1, 27, 0, 18, 0, 0, 0, 0,
+  0, 37, 0, 0, 0, 0, 0, 14, 0, 0,
+  0, 28, 0, 0, 38, 1, 0, 0, 0, 23,
+  0, 87, 0, 0, 4, 32, 0, 38, 0, 0,
+  0, 0, 0, 27, 62, 7, 79, 0, 0, 0,
+  0, 8, 73, 0, 0, 19, 6, 1, 28, 74,
+  0, 0, 22, 50, 31, 43, 10, 0, 10, 37,
+  0, 20, 0, 33, 31, 10, 59, 36, 0, 0,
+  0, 0, 17, 0, 0, 13, 9, 1, 0, 0,
+  0, 0, 9, 0, 0, 0, 0, 0, 0, 23,
+  74, 0, 31, 0, 36, 0, 0, 0, 0, 70,
+  0, 0, 0, 2, 33, 0, 0, 0, 0, 43,
+  0, 6, 22, 39, 0, 28, 7, 0, 9, 0,
+  0, 0, 28, 31, 0, 0, 0, 0, 0, 29,
+  0, 0, 2, 27, 0, 0, 0, 0, 0, 6,
+  0, 5, 36, 29, 18, 0, 0, 0, 0, 40,
+  0, 15, 23, 36, 0, 10, 8, 17, 0, 4,
+  56, 0, 56, 30, 68, 85, 5, 0, 19, 21,
+  32, 0, 0, 9, 20, 0, 0, 41, 10, 0,
+  11, 39, 17, 55, 0, 0, 0, 81, 0, 0,
+  54, 0, 6, 0, 21, 50, 24, 33, 0, 0,
+  0, 40, 0, 5, 0, 0, 0, 0, 0, 0,
+  7, 0, 7, 0, 0, 0, 0, 0, 0, 0,
+  0, 21, 20, 0, 0, 8, 0, 102, 1, 0,
+  0, 14, 69, 27, 0, 0, 0, 1, 0, 66,
+  27, 37, 0, 17, 6, 0, 0, 0, 2, 0,
+  52, 58, 12, 0, 0, 0, 14, 27, 0, 0,
+  6, 45, 0, 0, 2, 0, 0, 11, 0, 17,
+  56, 34, 0, 0, 0, 0, 2, 38, 0, 25,
+  6, 68, 0, 37, 0, 16, 0, 2, 22, 0,
+  50, 18, 67, 47, 0, 0, 22, 50, 27, 21,
+  0, 3, 14, 0, 29, 40, 11, 0, 0, 47,
+  18, 59, 13, 0, 37, 101, 0, 22, 37, 0,
+  12, 0, 20, 34, 37, 0, 0, 0, 4, 0,
+  0, 14, 0, 6, 0, 13, 0, 0, 10, 0,
+  0, 0, 0, 0, 4, 0, 56, 0, 21, 28,
+  9, 0, 0, 56, 17, 88, 0, 0, 31, 9,
+  81, 2, 5, 0, 0, 6, 2, 91, 38, 27,
+  0, 41, 0, 0, 0, 0, 13, 0, 37, 42,
+  0, 0, 0, 2, 9, 19, 0, 0, 16, 37,
+  0, 0, 16, 0, 0, 26, 0, 16, 70, 3,
+  0, 0, 0, 0, 0, 52, 0, 0, 15, 62,
+  0, 58, 0, 17, 0, 7, 22, 0, 63, 23,
+  93, 25, 0, 0, 31, 35, 54, 3, 0, 8,
+  19, 0, 32, 63, 17, 6, 25, 64, 9, 35,
+  25, 0, 32, 85, 0, 27, 5, 0, 11, 0,
+  41, 54, 31, 0, 0, 0, 12, 3, 0, 31,
+  0, 0, 0, 17, 0, 0, 32, 0, 0, 0,
+  0, 0, 0, 0, 65, 0, 25, 16, 30, 0,
+  0, 29, 0, 36, 17, 0, 0, 1, 82, 0,
+  0, 10, 14, 80, 41, 0, 22, 8, 10, 0,
+  47, 0, 0, 23, 0, 13, 0, 15, 0, 5,
+  0, 0, 0, 11, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 51, 0, 0, 23, 16, 0, 0,
+  35, 72, 21, 74, 0, 0, 3, 24, 0, 11,
+  0, 0, 0, 0, 0, 21, 29, 0, 30, 0,
+  0, 0, 0, 0, 58, 0, 0, 0, 0, 30,
+  56, 60, 4, 0, 25, 0, 29, 51, 61, 17,
+  7, 13, 0, 0, 0, 14, 29, 0, 67, 43,
+  0, 16, 0, 0, 10, 1, 0, 7, 54, 13,
+  18, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+  35, 0, 63, 0, 64, 0, 8, 0, 0, 64,
+  0, 40, 20, 0, 10, 0, 63, 0, 7, 15,
+  12, 65, 48, 6, 31, 34, 0, 25, 58, 0,
+  0, 21, 0, 36, 3, 4, 0, 0, 0, 0,
+  0, 32, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 41, 0, 0, 21, 22, 0, 0, 26, 26,
+  28, 76, 0, 0, 10, 4, 0, 25, 19, 0,
+  0, 0, 0, 11, 55, 3, 50, 0, 0, 0,
+  0, 0, 62, 0, 0, 0, 0, 3, 57, 69,
+  4, 0, 25, 19, 41, 29, 30, 12, 0, 34,
+  0, 1, 0, 24, 19, 0, 63, 30, 0, 19,
+  0, 0, 12, 0, 3, 1, 34, 21, 0, 0,
+  0, 0, 15, 0, 0, 0, 0, 0, 0, 13,
+  75, 0, 41, 0, 17, 0, 0, 151, 1, 57,
+  8, 0, 17, 0, 42, 0, 26, 0, 19, 37,
+  38, 18, 29, 7, 6, 53, 10, 0, 0, 24,
+  1, 37, 15, 7, 0, 0, 0, 0, 46, 5,
+  0, 0, 0, 0, 0, 1, 0, 2, 0, 21,
+  0, 0, 21, 42, 0, 0, 40, 0, 12, 89,
+  0, 0, 18, 1, 0, 44, 24, 0, 0, 0,
+  0, 0, 73, 21, 53, 0, 0, 0, 0, 8,
+  68, 12, 0, 35, 0, 18, 49, 62, 21, 11,
+  30, 33, 16, 49, 19, 13, 53, 22, 0, 17,
+  0, 5, 44, 0, 24, 80, 3, 46, 0, 0,
+  12, 0, 22, 12, 52, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 89, 0,
+  51, 0, 16, 1, 0, 4, 2, 46, 13, 0,
+  0, 32, 107, 4, 2, 0, 4, 83, 44, 32,
+  46, 4, 0, 0, 3, 0, 0, 10, 0, 0,
+  0, 35, 0, 0, 0, 0, 0, 15, 0, 0,
+  0, 0, 0, 24, 0, 0, 0, 32, 0, 0,
+  49, 17, 0, 0, 0, 80, 25, 73, 0, 0,
+  0, 50, 0, 3, 0, 0, 0, 0, 0, 35,
+  49, 0, 61, 9, 0, 0, 3, 17, 57, 9,
+  0, 0, 0, 10, 48, 46, 9, 0, 7, 32,
+  17, 79, 43, 0, 37, 35, 0, 0, 0, 5,
+  31, 0, 49, 67, 11, 1, 0, 0, 15, 0,
+  0, 19, 8, 3, 5, 0, 0, 0, 19, 0,
+  26, 0, 0, 0, 5, 0, 65, 0, 62, 0,
+  2, 0, 0, 37, 0, 44, 22, 0, 8, 20,
+  82, 0, 25, 11, 12, 56, 55, 36, 59, 22,
+  0, 12, 31, 0, 0, 0, 1, 27, 0, 18,
+  0, 0, 0, 0, 0, 37, 0, 0, 0, 0,
+  0, 14, 0, 0, 0, 28, 0, 0, 38, 1,
+  0, 0, 0, 23, 0, 87, 0, 0, 4, 32,
+  0, 38, 0, 0, 0, 0, 0, 27, 62, 7,
+  79, 0, 0, 0, 0, 8, 73, 0, 0, 19,
+  6, 1, 28, 74, 0, 0, 22, 50, 31, 43,
+  10, 0, 10, 37, 0, 20, 0, 33, 31, 10,
+  59, 36, 0, 0, 0, 0, 17, 0, 0, 13,
+  9, 1, 0, 0, 0, 0, 9, 0, 0, 0,
+  0, 0, 0, 23, 74, 0, 31, 0, 36, 0,
+  0, 74, 18, 48, 36, 0, 9, 0, 60, 0,
+  36, 0, 0, 63, 66, 33, 53, 1, 1, 40,
+  5, 0, 0, 0, 0, 29, 0, 0, 0, 0,
+  0, 0, 0, 33, 0, 0, 0, 0, 0, 13,
+  0, 0, 0, 7, 0, 0, 40, 19, 0, 0,
+  0, 0, 0, 107, 0, 0, 12, 52, 0, 31,
+  0, 27, 0, 0, 0, 19, 66, 8, 85, 0,
+  0, 0, 0, 0, 65, 0, 0, 12, 15, 13,
+  23, 55, 0, 0, 38, 70, 22, 57, 6, 0,
+  10, 41, 0, 20, 0, 27, 34, 9, 25, 65,
+  0, 0, 0, 0, 11, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 46, 0, 22, 0, 42, 0, 0, 8,
+  0, 102, 1, 0, 0, 14, 69, 27, 0, 0,
+  0, 1, 0, 66, 27, 37, 0, 17, 6, 0,
+  0, 0, 2, 0, 52, 58, 12, 0, 0, 0,
+  14, 27, 0, 0, 6, 45, 0, 0, 2, 0,
+  0, 11, 0, 17, 56, 34, 0, 0, 0, 0,
+  2, 38, 0, 25, 6, 68, 0, 37, 0, 16,
+  0, 2, 22, 0, 50, 18, 67, 47, 0, 0,
+  22, 50, 27, 21, 0, 3, 14, 0, 29, 40,
+  11, 0, 0, 47, 18, 59, 13, 0, 37, 101,
+  0, 22, 37, 0, 12, 0, 20, 34, 37, 0,
+  0, 0, 4, 0, 0, 14, 0, 6, 0, 13,
+  0, 0, 10, 0, 0, 0, 0, 0, 4, 0,
+  56, 0, 21, 28, 9, 0, 0, 56, 17, 88,
+  0, 0, 31, 9, 81, 2, 5, 0, 0, 6,
+  2, 91, 38, 27, 0, 41, 0, 0, 0, 0,
+  13, 0, 37, 42, 0, 0, 0, 2, 9, 19,
+  0, 0, 16, 37, 0, 0, 16, 0, 0, 26,
+  0, 16, 70, 3, 0, 0, 0, 0, 0, 52,
+  0, 0, 15, 62, 0, 58, 0, 17, 0, 7,
+  22, 0, 63, 23, 93, 25, 0, 0, 31, 35,
+  54, 3, 0, 8, 19, 0, 32, 63, 17, 6,
+  25, 64, 9, 35, 25, 0, 32, 85, 0, 27,
+  5, 0, 11, 0, 41, 54, 31, 0, 0, 0,
+  12, 3, 0, 31, 0, 0, 0, 17, 0, 0,
+  32, 0, 0, 0, 0, 0, 0, 0, 65, 0,
+  25, 16, 30, 0, 0, 28, 8, 32, 27, 0,
+  2, 0, 68, 0, 19, 0, 0, 42, 7, 49,
+  43, 15, 20, 47, 0, 0, 0, 0, 0, 0,
+  3, 32, 0, 0, 0, 6, 4, 23, 0, 12,
+  7, 21, 0, 0, 2, 0, 0, 18, 0, 11,
+  54, 50, 0, 0, 0, 0, 0, 40, 0, 0,
+  45, 53, 0, 11, 0, 42, 0, 0, 22, 4,
+  38, 14, 110, 11, 16, 0, 30, 15, 57, 0,
+  0, 0, 2, 0, 0, 18, 21, 0, 59, 45,
+  0, 63, 2, 0, 3, 85, 0, 10, 16, 0,
+  9, 0, 31, 80, 7, 29, 0, 0, 22, 22,
+  0, 19, 0, 0, 0, 25, 0, 0, 16, 0,
+  0, 0, 0, 0, 0, 0, 11, 0, 0, 5,
+  46, 8, 0, 64, 0, 40, 20, 0, 10, 0,
+  63, 0, 7, 15, 12, 65, 48, 6, 31, 34,
+  0, 25, 58, 0, 0, 21, 0, 36, 3, 4,
+  0, 0, 0, 0, 0, 32, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 41, 0, 0, 21, 22,
+  0, 0, 26, 26, 28, 76, 0, 0, 10, 4,
+  0, 25, 19, 0, 0, 0, 0, 11, 55, 3,
+  50, 0, 0, 0, 0, 0, 62, 0, 0, 0,
+  0, 3, 57, 69, 4, 0, 25, 19, 41, 29,
+  30, 12, 0, 34, 0, 1, 0, 24, 19, 0,
+  63, 30, 0, 19, 0, 0, 12, 0, 3, 1,
+  34, 21, 0, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 13, 75, 0, 41, 0, 17, 0,
+  0, 151, 1, 57, 8, 0, 17, 0, 42, 0,
+  26, 0, 19, 37, 38, 18, 29, 7, 6, 53,
+  10, 0, 0, 24, 1, 37, 15, 7, 0, 0,
+  0, 0, 46, 5, 0, 0, 0, 0, 0, 1,
+  0, 2, 0, 21, 0, 0, 21, 42, 0, 0,
+  40, 0, 12, 89, 0, 0, 18, 1, 0, 44,
+  24, 0, 0, 0, 0, 0, 73, 21, 53, 0,
+  0, 0, 0, 8, 68, 12, 0, 35, 0, 18,
+  49, 62, 21, 11, 30, 33, 16, 49, 19, 13,
+  53, 22, 0, 17, 0, 5, 44, 0, 24, 80,
+  3, 46, 0, 0, 12, 0, 22, 12, 52, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 89, 0, 51, 0, 16, 1, 6, 145,
+  0, 66, 0, 25, 0, 0, 52, 0, 6, 0,
+  69, 0, 0, 0, 0, 5, 33, 32, 0, 0,
+  14, 32, 3, 0, 70, 0, 0, 0, 0, 0,
+  77, 0, 13, 38, 0, 0, 0, 0, 0, 17,
+  0, 19, 0, 15, 48, 19, 0, 17, 5, 25,
+  0, 35, 17, 0, 54, 0, 0, 16, 0, 0,
+  0, 0, 16, 0, 16, 19, 0, 1, 65, 17,
+  3, 0, 34, 29, 0, 94, 0, 16, 0, 0,
+  90, 39, 0, 18, 0, 41, 51, 18, 99, 0,
+  0, 0, 0, 0, 61, 0, 18, 99, 42, 59,
+  0, 0, 0, 10, 57, 44, 87, 0, 0, 0,
+  0, 36, 0, 0, 0, 0, 5, 0, 3, 0,
+  48, 0, 39, 0, 0, 46, 0, 37, 0, 44,
+  22, 0, 8, 20, 82, 0, 25, 11, 12, 56,
+  55, 36, 59, 22, 0, 12, 31, 0, 0, 0,
+  1, 27, 0, 18, 0, 0, 0, 0, 0, 37,
+  0, 0, 0, 0, 0, 14, 0, 0, 0, 28,
+  0, 0, 38, 1, 0, 0, 0, 23, 0, 87,
+  0, 0, 4, 32, 0, 38, 0, 0, 0, 0,
+  0, 27, 62, 7, 79, 0, 0, 0, 0, 8,
+  73, 0, 0, 19, 6, 1, 28, 74, 0, 0,
+  22, 50, 31, 43, 10, 0, 10, 37, 0, 20,
+  0, 33, 31, 10, 59, 36, 0, 0, 0, 0,
+  17, 0, 0, 13, 9, 1, 0, 0, 0, 0,
+  9, 0, 0, 0, 0, 0, 0, 23, 74, 0,
+  31, 0, 36, 0, 0, 74, 18, 48, 36, 0,
+  9, 0, 60, 0, 36, 0, 0, 63, 66, 33,
+  53, 1, 1, 40, 5, 0, 0, 0, 0, 29,
+  0, 0, 0, 0, 0, 0, 0, 33, 0, 0,
+  0, 0, 0, 13, 0, 0, 0, 7, 0, 0,
+  40, 19, 0, 0, 0, 0, 0, 107, 0, 0,
+  12, 52, 0, 31, 0, 27, 0, 0, 0, 19,
+  66, 8, 85, 0, 0, 0, 0, 0, 65, 0,
+  0, 12, 15, 13, 23, 55, 0, 0, 38, 70,
+  22, 57, 6, 0, 10, 41, 0, 20, 0, 27,
+  34, 9, 25, 65, 0, 0, 0, 0, 11, 0,
+  0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 46, 0, 22, 0,
+  42, 0, 0, 120, 19, 74, 27, 0, 31, 0,
+  61, 0, 8, 0, 21, 27, 26, 43, 32, 22,
+  11, 48, 0, 0, 11, 13, 20, 2, 39, 1,
+  0, 0, 0, 0, 45, 5, 15, 2, 0, 0,
+  0, 0, 0, 0, 0, 21, 0, 27, 87, 36,
+  0, 0, 16, 0, 0, 39, 0, 0, 30, 0,
+  0, 50, 0, 22, 0, 0, 0, 0, 32, 15,
+  38, 0, 0, 0, 27, 0, 82, 16, 0, 44,
+  0, 0, 23, 10, 32, 10, 15, 51, 24, 38,
+  8, 39, 22, 24, 0, 47, 0, 0, 15, 0,
+  42, 41, 18, 5, 0, 0, 5, 0, 39, 13,
+  35, 22, 0, 0, 0, 45, 0, 0, 0, 0,
+  9, 0, 0, 0, 49, 0, 6, 0, 21, 9,
+  0, 56, 17, 88, 0, 0, 31, 9, 81, 2,
+  5, 0, 0, 6, 2, 91, 38, 27, 0, 41,
+  0, 0, 0, 0, 13, 0, 37, 42, 0, 0,
+  0, 2, 9, 19, 0, 0, 16, 37, 0, 0,
+  16, 0, 0, 26, 0, 16, 70, 3, 0, 0,
+  0, 0, 0, 52, 0, 0, 15, 62, 0, 58,
+  0, 17, 0, 7, 22, 0, 63, 23, 93, 25,
+  0, 0, 31, 35, 54, 3, 0, 8, 19, 0,
+  32, 63, 17, 6, 25, 64, 9, 35, 25, 0,
+  32, 85, 0, 27, 5, 0, 11, 0, 41, 54,
+  31, 0, 0, 0, 12, 3, 0, 31, 0, 0,
+  0, 17, 0, 0, 32, 0, 0, 0, 0, 0,
+  0, 0, 65, 0, 25, 16, 30, 0, 0, 28,
+  8, 32, 27, 0, 2, 0, 68, 0, 19, 0,
+  0, 42, 7, 49, 43, 15, 20, 47, 0, 0,
+  0, 0, 0, 0, 3, 32, 0, 0, 0, 6,
+  4, 23, 0, 12, 7, 21, 0, 0, 2, 0,
+  0, 18, 0, 11, 54, 50, 0, 0, 0, 0,
+  0, 40, 0, 0, 45, 53, 0, 11, 0, 42,
+  0, 0, 22, 4, 38, 14, 110, 11, 16, 0,
+  30, 15, 57, 0, 0, 0, 2, 0, 0, 18,
+  21, 0, 59, 45, 0, 63, 2, 0, 3, 85,
+  0, 10, 16, 0, 9, 0, 31, 80, 7, 29,
+  0, 0, 22, 22, 0, 19, 0, 0, 0, 25,
+  0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
+  11, 0, 0, 5, 46, 8, 7, 49, 61, 23,
+  56, 0, 23, 0, 71, 0, 0, 0, 14, 98,
+  16, 58, 20, 15, 28, 30, 7, 0, 10, 8,
+  0, 0, 0, 49, 0, 0, 0, 0, 0, 27,
+  0, 0, 0, 0, 0, 0, 17, 10, 0, 57,
+  0, 0, 54, 50, 0, 0, 31, 38, 0, 36,
+  0, 0, 23, 53, 0, 29, 0, 9, 0, 0,
+  24, 18, 14, 0, 53, 0, 0, 0, 18, 6,
+  59, 0, 0, 0, 0, 0, 21, 44, 0, 0,
+  68, 38, 3, 47, 64, 0, 0, 40, 0, 20,
+  0, 9, 7, 0, 28, 55, 0, 0, 1, 0,
+  35, 0, 0, 37, 14, 0, 22, 0, 0, 15,
+  86, 0, 0, 0, 20, 0, 12, 0, 13, 0,
+  9, 8, 46, 0, 0, 151, 1, 57, 8, 0,
+  17, 0, 42, 0, 26, 0, 19, 37, 38, 18,
+  29, 7, 6, 53, 10, 0, 0, 24, 1, 37,
+  15, 7, 0, 0, 0, 0, 46, 5, 0, 0,
+  0, 0, 0, 1, 0, 2, 0, 21, 0, 0,
+  21, 42, 0, 0, 40, 0, 12, 89, 0, 0,
+  18, 1, 0, 44, 24, 0, 0, 0, 0, 0,
+  73, 21, 53, 0, 0, 0, 0, 8, 68, 12,
+  0, 35, 0, 18, 49, 62, 21, 11, 30, 33,
+  16, 49, 19, 13, 53, 22, 0, 17, 0, 5,
+  44, 0, 24, 80, 3, 46, 0, 0, 12, 0,
+  22, 12, 52, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 89, 0, 51, 0,
+  16, 1, 6, 145, 0, 66, 0, 25, 0, 0,
+  52, 0, 6, 0, 69, 0, 0, 0, 0, 5,
+  33, 32, 0, 0, 14, 32, 3, 0, 70, 0,
+  0, 0, 0, 0, 77, 0, 13, 38, 0, 0,
+  0, 0, 0, 17, 0, 19, 0, 15, 48, 19,
+  0, 17, 5, 25, 0, 35, 17, 0, 54, 0,
+  0, 16, 0, 0, 0, 0, 16, 0, 16, 19,
+  0, 1, 65, 17, 3, 0, 34, 29, 0, 94,
+  0, 16, 0, 0, 90, 39, 0, 18, 0, 41,
+  51, 18, 99, 0, 0, 0, 0, 0, 61, 0,
+  18, 99, 42, 59, 0, 0, 0, 10, 57, 44,
+  87, 0, 0, 0, 0, 36, 0, 0, 0, 0,
+  5, 0, 3, 0, 48, 0, 39, 0, 0, 46,
+  58, 21, 0, 68, 2, 105, 0, 4, 38, 0,
+  0, 0, 40, 0, 0, 0, 2, 21, 35, 0,
+  0, 90, 13, 0, 0, 0, 31, 0, 9, 0,
+  0, 31, 3, 0, 67, 72, 9, 0, 27, 0,
+  20, 14, 0, 28, 22, 53, 41, 0, 0, 0,
+  0, 61, 0, 0, 135, 38, 37, 0, 7, 0,
+  0, 47, 34, 0, 96, 0, 0, 31, 0, 47,
+  198, 6, 55, 0, 0, 0, 0, 35, 0, 0,
+  0, 0, 77, 27, 31, 0, 1, 1, 38, 0,
+  0, 15, 0, 0, 17, 0, 39, 0, 26, 71,
+  33, 77, 0, 0, 0, 0, 6, 46, 5, 0,
+  19, 40, 0, 88, 0, 0, 0, 0, 55, 0,
+  0, 0, 0, 0, 28, 0, 0, 16, 0, 74,
+  18, 48, 36, 0, 9, 0, 60, 0, 36, 0,
+  0, 63, 66, 33, 53, 1, 1, 40, 5, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
+  0, 33, 0, 0, 0, 0, 0, 13, 0, 0,
+  0, 7, 0, 0, 40, 19, 0, 0, 0, 0,
+  0, 107, 0, 0, 12, 52, 0, 31, 0, 27,
+  0, 0, 0, 19, 66, 8, 85, 0, 0, 0,
+  0, 0, 65, 0, 0, 12, 15, 13, 23, 55,
+  0, 0, 38, 70, 22, 57, 6, 0, 10, 41,
+  0, 20, 0, 27, 34, 9, 25, 65, 0, 0,
+  0, 0, 11, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  46, 0, 22, 0, 42, 0, 0, 120, 19, 74,
+  27, 0, 31, 0, 61, 0, 8, 0, 21, 27,
+  26, 43, 32, 22, 11, 48, 0, 0, 11, 13,
+  20, 2, 39, 1, 0, 0, 0, 0, 45, 5,
+  15, 2, 0, 0, 0, 0, 0, 0, 0, 21,
+  0, 27, 87, 36, 0, 0, 16, 0, 0, 39,
+  0, 0, 30, 0, 0, 50, 0, 22, 0, 0,
+  0, 0, 32, 15, 38, 0, 0, 0, 27, 0,
+  82, 16, 0, 44, 0, 0, 23, 10, 32, 10,
+  15, 51, 24, 38, 8, 39, 22, 24, 0, 47,
+  0, 0, 15, 0, 42, 41, 18, 5, 0, 0,
+  5, 0, 39, 13, 35, 22, 0, 0, 0, 45,
+  0, 0, 0, 0, 9, 0, 0, 0, 49, 0,
+  6, 0, 21, 9, 64, 56, 7, 47, 47, 23,
+  0, 2, 27, 0, 0, 0, 42, 8, 0, 3,
+  0, 0, 56, 18, 0, 16, 26, 0, 2, 0,
+  57, 0, 1, 54, 0, 27, 23, 0, 74, 44,
+  54, 0, 12, 0, 0, 9, 0, 16, 14, 30,
+  64, 22, 0, 0, 0, 0, 0, 18, 39, 0,
+  31, 0, 0, 0, 0, 41, 29, 0, 11, 5,
+  0, 39, 0, 10, 75, 0, 74, 0, 24, 4,
+  0, 36, 30, 0, 0, 0, 49, 39, 40, 0,
+  0, 51, 36, 6, 0, 6, 0, 16, 0, 0,
+  38, 0, 41, 42, 30, 45, 15, 0, 0, 0,
+  5, 61, 41, 0, 5, 11, 0, 65, 38, 0,
+  0, 0, 29, 0, 0, 0, 0, 0, 0, 0,
+  8, 29, 0, 28, 8, 32, 27, 0, 2, 0,
+  68, 0, 19, 0, 0, 42, 7, 49, 43, 15,
+  20, 47, 0, 0, 0, 0, 0, 0, 3, 32,
+  0, 0, 0, 6, 4, 23, 0, 12, 7, 21,
+  0, 0, 2, 0, 0, 18, 0, 11, 54, 50,
+  0, 0, 0, 0, 0, 40, 0, 0, 45, 53,
+  0, 11, 0, 42, 0, 0, 22, 4, 38, 14,
+  110, 11, 16, 0, 30, 15, 57, 0, 0, 0,
+  2, 0, 0, 18, 21, 0, 59, 45, 0, 63,
+  2, 0, 3, 85, 0, 10, 16, 0, 9, 0,
+  31, 80, 7, 29, 0, 0, 22, 22, 0, 19,
+  0, 0, 0, 25, 0, 0, 16, 0, 0, 0,
+  0, 0, 0, 0, 11, 0, 0, 5, 46, 8,
+  7, 49, 61, 23, 56, 0, 23, 0, 71, 0,
+  0, 0, 14, 98, 16, 58, 20, 15, 28, 30,
+  7, 0, 10, 8, 0, 0, 0, 49, 0, 0,
+  0, 0, 0, 27, 0, 0, 0, 0, 0, 0,
+  17, 10, 0, 57, 0, 0, 54, 50, 0, 0,
+  31, 38, 0, 36, 0, 0, 23, 53, 0, 29,
+  0, 9, 0, 0, 24, 18, 14, 0, 53, 0,
+  0, 0, 18, 6, 59, 0, 0, 0, 0, 0,
+  21, 44, 0, 0, 68, 38, 3, 47, 64, 0,
+  0, 40, 0, 20, 0, 9, 7, 0, 28, 55,
+  0, 0, 1, 0, 35, 0, 0, 37, 14, 0,
+  22, 0, 0, 15, 86, 0, 0, 0, 20, 0,
+  12, 0, 13, 0, 9, 8, 46, 0, 51, 65,
+  87, 26, 42, 0, 0, 0, 24, 1, 1, 1,
+  40, 128, 0, 10, 0, 0, 20, 34, 11, 2,
+  7, 22, 0, 0, 0, 18, 0, 18, 19, 8,
+  0, 36, 8, 0, 36, 0, 0, 0, 19, 59,
+  0, 24, 0, 0, 22, 33, 0, 0, 46, 60,
+  0, 37, 0, 0, 0, 36, 0, 23, 0, 0,
+  20, 0, 14, 43, 0, 0, 6, 10, 0, 33,
+  9, 0, 41, 0, 0, 0, 32, 7, 0, 63,
+  13, 0, 60, 24, 16, 45, 93, 12, 0, 0,
+  0, 1, 0, 0, 27, 0, 35, 36, 0, 2,
+  17, 0, 23, 17, 0, 42, 39, 0, 25, 0,
+  0, 19, 110, 2, 0, 0, 0, 0, 14, 0,
+  0, 0, 0, 15, 6, 19, 6, 145, 0, 66,
+  0, 25, 0, 0, 52, 0, 6, 0, 69, 0,
+  0, 0, 0, 5, 33, 32, 0, 0, 14, 32,
+  3, 0, 70, 0, 0, 0, 0, 0, 77, 0,
+  13, 38, 0, 0, 0, 0, 0, 17, 0, 19,
+  0, 15, 48, 19, 0, 17, 5, 25, 0, 35,
+  17, 0, 54, 0, 0, 16, 0, 0, 0, 0,
+  16, 0, 16, 19, 0, 1, 65, 17, 3, 0,
+  34, 29, 0, 94, 0, 16, 0, 0, 90, 39,
+  0, 18, 0, 41, 51, 18, 99, 0, 0, 0,
+  0, 0, 61, 0, 18, 99, 42, 59, 0, 0,
+  0, 10, 57, 44, 87, 0, 0, 0, 0, 36,
+  0, 0, 0, 0, 5, 0, 3, 0, 48, 0,
+  39, 0, 0, 46, 58, 21, 0, 68, 2, 105,
+  0, 4, 38, 0, 0, 0, 40, 0, 0, 0,
+  2, 21, 35, 0, 0, 90, 13, 0, 0, 0,
+  31, 0, 9, 0, 0, 31, 3, 0, 67, 72,
+  9, 0, 27, 0, 20, 14, 0, 28, 22, 53,
+  41, 0, 0, 0, 0, 61, 0, 0, 135, 38,
+  37, 0, 7, 0, 0, 47, 34, 0, 96, 0,
+  0, 31, 0, 47, 198, 6, 55, 0, 0, 0,
+  0, 35, 0, 0, 0, 0, 77, 27, 31, 0,
+  1, 1, 38, 0, 0, 15, 0, 0, 17, 0,
+  39, 0, 26, 71, 33, 77, 0, 0, 0, 0,
+  6, 46, 5, 0, 19, 40, 0, 88, 0, 0,
+  0, 0, 55, 0, 0, 0, 0, 0, 28, 0,
+  0, 16, 0, 0, 0, 15, 0, 83, 0, 21,
+  90, 39, 0, 48, 26, 0, 0, 60, 13, 28,
+  16, 0, 25, 81, 1, 0, 0, 0, 1, 44,
+  17, 19, 0, 35, 60, 0, 78, 36, 79, 138,
+  7, 0, 76, 0, 2, 0, 0, 129, 0, 4,
+  0, 11, 0, 4, 0, 0, 138, 0, 2, 0,
+  27, 0, 0, 90, 14, 2, 90, 0, 0, 39,
+  0, 61, 111, 0, 118, 35, 0, 31, 35, 22,
+  25, 0, 0, 0, 0, 27, 0, 0, 12, 25,
+  0, 0, 0, 91, 0, 7, 15, 0, 6, 0,
+  0, 89, 131, 18, 0, 0, 39, 0, 0, 48,
+  0, 0, 1, 67, 0, 57, 0, 0, 0, 0,
+  75, 0, 0, 0, 0, 0, 0, 0, 75, 51,
+  0, 120, 19, 74, 27, 0, 31, 0, 61, 0,
+  8, 0, 21, 27, 26, 43, 32, 22, 11, 48,
+  0, 0, 11, 13, 20, 2, 39, 1, 0, 0,
+  0, 0, 45, 5, 15, 2, 0, 0, 0, 0,
+  0, 0, 0, 21, 0, 27, 87, 36, 0, 0,
+  16, 0, 0, 39, 0, 0, 30, 0, 0, 50,
+  0, 22, 0, 0, 0, 0, 32, 15, 38, 0,
+  0, 0, 27, 0, 82, 16, 0, 44, 0, 0,
+  23, 10, 32, 10, 15, 51, 24, 38, 8, 39,
+  22, 24, 0, 47, 0, 0, 15, 0, 42, 41,
+  18, 5, 0, 0, 5, 0, 39, 13, 35, 22,
+  0, 0, 0, 45, 0, 0, 0, 0, 9, 0,
+  0, 0, 49, 0, 6, 0, 21, 9, 64, 56,
+  7, 47, 47, 23, 0, 2, 27, 0, 0, 0,
+  42, 8, 0, 3, 0, 0, 56, 18, 0, 16,
+  26, 0, 2, 0, 57, 0, 1, 54, 0, 27,
+  23, 0, 74, 44, 54, 0, 12, 0, 0, 9,
+  0, 16, 14, 30, 64, 22, 0, 0, 0, 0,
+  0, 18, 39, 0, 31, 0, 0, 0, 0, 41,
+  29, 0, 11, 5, 0, 39, 0, 10, 75, 0,
+  74, 0, 24, 4, 0, 36, 30, 0, 0, 0,
+  49, 39, 40, 0, 0, 51, 36, 6, 0, 6,
+  0, 16, 0, 0, 38, 0, 41, 42, 30, 45,
+  15, 0, 0, 0, 5, 61, 41, 0, 5, 11,
+  0, 65, 38, 0, 0, 0, 29, 0, 0, 0,
+  0, 0, 0, 0, 8, 29, 59, 0, 21, 13,
+  0, 41, 0, 2, 0, 43, 0, 19, 0, 48,
+  0, 0, 0, 0, 56, 0, 3, 89, 5, 0,
+  0, 0, 21, 5, 0, 99, 0, 11, 0, 0,
+  67, 44, 117, 91, 15, 0, 39, 0, 3, 0,
+  0, 12, 0, 18, 5, 1, 0, 35, 0, 23,
+  119, 0, 0, 4, 0, 0, 0, 65, 91, 49,
+  82, 33, 0, 21, 0, 118, 80, 20, 83, 0,
+  0, 0, 0, 0, 100, 0, 0, 0, 15, 22,
+  26, 0, 0, 49, 63, 0, 0, 18, 0, 0,
+  55, 0, 41, 0, 0, 54, 58, 26, 28, 0,
+  0, 0, 0, 29, 0, 0, 19, 18, 0, 23,
+  56, 7, 0, 0, 19, 0, 0, 0, 0, 0,
+  0, 24, 61, 73, 7, 49, 61, 23, 56, 0,
+  23, 0, 71, 0, 0, 0, 14, 98, 16, 58,
+  20, 15, 28, 30, 7, 0, 10, 8, 0, 0,
+  0, 49, 0, 0, 0, 0, 0, 27, 0, 0,
+  0, 0, 0, 0, 17, 10, 0, 57, 0, 0,
+  54, 50, 0, 0, 31, 38, 0, 36, 0, 0,
+  23, 53, 0, 29, 0, 9, 0, 0, 24, 18,
+  14, 0, 53, 0, 0, 0, 18, 6, 59, 0,
+  0, 0, 0, 0, 21, 44, 0, 0, 68, 38,
+  3, 47, 64, 0, 0, 40, 0, 20, 0, 9,
+  7, 0, 28, 55, 0, 0, 1, 0, 35, 0,
+  0, 37, 14, 0, 22, 0, 0, 15, 86, 0,
+  0, 0, 20, 0, 12, 0, 13, 0, 9, 8,
+  46, 0, 51, 65, 87, 26, 42, 0, 0, 0,
+  24, 1, 1, 1, 40, 128, 0, 10, 0, 0,
+  20, 34, 11, 2, 7, 22, 0, 0, 0, 18,
+  0, 18, 19, 8, 0, 36, 8, 0, 36, 0,
+  0, 0, 19, 59, 0, 24, 0, 0, 22, 33,
+  0, 0, 46, 60, 0, 37, 0, 0, 0, 36,
+  0, 23, 0, 0, 20, 0, 14, 43, 0, 0,
+  6, 10, 0, 33, 9, 0, 41, 0, 0, 0,
+  32, 7, 0, 63, 13, 0, 60, 24, 16, 45,
+  93, 12, 0, 0, 0, 1, 0, 0, 27, 0,
+  35, 36, 0, 2, 17, 0, 23, 17, 0, 42,
+  39, 0, 25, 0, 0, 19, 110, 2, 0, 0,
+  0, 0, 14, 0, 0, 0, 0, 15, 6, 19,
+  58, 29, 70, 32, 22, 7, 0, 0, 38, 0,
+  7, 32, 60, 93, 0, 0, 0, 0, 38, 0,
+  64, 26, 0, 33, 0, 0, 30, 14, 0, 67,
+  47, 0, 0, 0, 6, 0, 43, 9, 0, 0,
+  0, 21, 0, 0, 0, 0, 0, 24, 0, 6,
+  13, 86, 0, 24, 27, 0, 0, 48, 0, 0,
+  0, 0, 12, 26, 3, 21, 0, 0, 0, 30,
+  0, 44, 10, 2, 0, 0, 0, 0, 48, 0,
+  0, 39, 61, 0, 1, 12, 0, 35, 123, 0,
+  0, 0, 0, 0, 0, 0, 63, 0, 17, 39,
+  26, 0, 0, 0, 0, 26, 0, 33, 42, 10,
+  39, 0, 4, 0, 83, 0, 0, 0, 0, 28,
+  67, 0, 0, 0, 0, 33, 0, 82, 58, 21,
+  0, 68, 2, 105, 0, 4, 38, 0, 0, 0,
+  40, 0, 0, 0, 2, 21, 35, 0, 0, 90,
+  13, 0, 0, 0, 31, 0, 9, 0, 0, 31,
+  3, 0, 67, 72, 9, 0, 27, 0, 20, 14,
+  0, 28, 22, 53, 41, 0, 0, 0, 0, 61,
+  0, 0, 135, 38, 37, 0, 7, 0, 0, 47,
+  34, 0, 96, 0, 0, 31, 0, 47, 198, 6,
+  55, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+  77, 27, 31, 0, 1, 1, 38, 0, 0, 15,
+  0, 0, 17, 0, 39, 0, 26, 71, 33, 77,
+  0, 0, 0, 0, 6, 46, 5, 0, 19, 40,
+  0, 88, 0, 0, 0, 0, 55, 0, 0, 0,
+  0, 0, 28, 0, 0, 16, 0, 0, 0, 15,
+  0, 83, 0, 21, 90, 39, 0, 48, 26, 0,
+  0, 60, 13, 28, 16, 0, 25, 81, 1, 0,
+  0, 0, 1, 44, 17, 19, 0, 35, 60, 0,
+  78, 36, 79, 138, 7, 0, 76, 0, 2, 0,
+  0, 129, 0, 4, 0, 11, 0, 4, 0, 0,
+  138, 0, 2, 0, 27, 0, 0, 90, 14, 2,
+  90, 0, 0, 39, 0, 61, 111, 0, 118, 35,
+  0, 31, 35, 22, 25, 0, 0, 0, 0, 27,
+  0, 0, 12, 25, 0, 0, 0, 91, 0, 7,
+  15, 0, 6, 0, 0, 89, 131, 18, 0, 0,
+  39, 0, 0, 48, 0, 0, 1, 67, 0, 57,
+  0, 0, 0, 0, 75, 0, 0, 0, 0, 0,
+  0, 0, 75, 51, 0, 0, 95, 9, 0, 0,
+  0, 24, 67, 28, 0, 54, 35, 44, 0, 52,
+  0, 15, 0, 0, 0, 58, 28, 9, 0, 0,
+  21, 48, 6, 84, 0, 37, 76, 0, 22, 0,
+  105, 123, 0, 0, 100, 0, 38, 0, 0, 109,
+  0, 0, 0, 11, 0, 0, 0, 0, 96, 0,
+  19, 0, 47, 0, 0, 83, 53, 15, 66, 0,
+  7, 34, 0, 90, 0, 0, 122, 30, 0, 21,
+  7, 0, 14, 0, 0, 2, 0, 89, 0, 17,
+  21, 0, 35, 0, 0, 36, 0, 3, 0, 0,
+  0, 0, 0, 59, 137, 0, 0, 0, 0, 0,
+  0, 52, 0, 3, 30, 17, 0, 0, 80, 0,
+  22, 0, 52, 0, 0, 0, 0, 0, 0, 14,
+  61, 73, 64, 56, 7, 47, 47, 23, 0, 2,
+  27, 0, 0, 0, 42, 8, 0, 3, 0, 0,
+  56, 18, 0, 16, 26, 0, 2, 0, 57, 0,
+  1, 54, 0, 27, 23, 0, 74, 44, 54, 0,
+  12, 0, 0, 9, 0, 16, 14, 30, 64, 22,
+  0, 0, 0, 0, 0, 18, 39, 0, 31, 0,
+  0, 0, 0, 41, 29, 0, 11, 5, 0, 39,
+  0, 10, 75, 0, 74, 0, 24, 4, 0, 36,
+  30, 0, 0, 0, 49, 39, 40, 0, 0, 51,
+  36, 6, 0, 6, 0, 16, 0, 0, 38, 0,
+  41, 42, 30, 45, 15, 0, 0, 0, 5, 61,
+  41, 0, 5, 11, 0, 65, 38, 0, 0, 0,
+  29, 0, 0, 0, 0, 0, 0, 0, 8, 29,
+  59, 0, 21, 13, 0, 41, 0, 2, 0, 43,
+  0, 19, 0, 48, 0, 0, 0, 0, 56, 0,
+  3, 89, 5, 0, 0, 0, 21, 5, 0, 99,
+  0, 11, 0, 0, 67, 44, 117, 91, 15, 0,
+  39, 0, 3, 0, 0, 12, 0, 18, 5, 1,
+  0, 35, 0, 23, 119, 0, 0, 4, 0, 0,
+  0, 65, 91, 49, 82, 33, 0, 21, 0, 118,
+  80, 20, 83, 0, 0, 0, 0, 0, 100, 0,
+  0, 0, 15, 22, 26, 0, 0, 49, 63, 0,
+  0, 18, 0, 0, 55, 0, 41, 0, 0, 54,
+  58, 26, 28, 0, 0, 0, 0, 29, 0, 0,
+  19, 18, 0, 23, 56, 7, 0, 0, 19, 0,
+  0, 0, 0, 0, 0, 24, 61, 73, 32, 0,
+  66, 36, 9, 0, 0, 0, 5, 21, 0, 26,
+  30, 124, 0, 0, 0, 0, 23, 0, 28, 52,
+  0, 3, 0, 0, 50, 28, 0, 103, 0, 4,
+  0, 0, 39, 0, 82, 66, 0, 0, 35, 0,
+  2, 0, 0, 22, 7, 0, 0, 0, 0, 70,
+  0, 21, 74, 0, 0, 14, 10, 0, 0, 32,
+  91, 24, 64, 1, 0, 2, 0, 95, 0, 13,
+  72, 0, 0, 0, 0, 0, 86, 0, 0, 56,
+  11, 19, 0, 0, 12, 13, 141, 0, 0, 19,
+  0, 0, 4, 0, 38, 0, 0, 38, 31, 0,
+  0, 0, 0, 0, 0, 56, 51, 0, 69, 0,
+  0, 0, 107, 0, 36, 0, 0, 32, 38, 0,
+  0, 0, 0, 37, 0, 81, 51, 65, 87, 26,
+  42, 0, 0, 0, 24, 1, 1, 1, 40, 128,
+  0, 10, 0, 0, 20, 34, 11, 2, 7, 22,
+  0, 0, 0, 18, 0, 18, 19, 8, 0, 36,
+  8, 0, 36, 0, 0, 0, 19, 59, 0, 24,
+  0, 0, 22, 33, 0, 0, 46, 60, 0, 37,
+  0, 0, 0, 36, 0, 23, 0, 0, 20, 0,
+  14, 43, 0, 0, 6, 10, 0, 33, 9, 0,
+  41, 0, 0, 0, 32, 7, 0, 63, 13, 0,
+  60, 24, 16, 45, 93, 12, 0, 0, 0, 1,
+  0, 0, 27, 0, 35, 36, 0, 2, 17, 0,
+  23, 17, 0, 42, 39, 0, 25, 0, 0, 19,
+  110, 2, 0, 0, 0, 0, 14, 0, 0, 0,
+  0, 15, 6, 19, 58, 29, 70, 32, 22, 7,
+  0, 0, 38, 0, 7, 32, 60, 93, 0, 0,
+  0, 0, 38, 0, 64, 26, 0, 33, 0, 0,
+  30, 14, 0, 67, 47, 0, 0, 0, 6, 0,
+  43, 9, 0, 0, 0, 21, 0, 0, 0, 0,
+  0, 24, 0, 6, 13, 86, 0, 24, 27, 0,
+  0, 48, 0, 0, 0, 0, 12, 26, 3, 21,
+  0, 0, 0, 30, 0, 44, 10, 2, 0, 0,
+  0, 0, 48, 0, 0, 39, 61, 0, 1, 12,
+  0, 35, 123, 0, 0, 0, 0, 0, 0, 0,
+  63, 0, 17, 39, 26, 0, 0, 0, 0, 26,
+  0, 33, 42, 10, 39, 0, 4, 0, 83, 0,
+  0, 0, 0, 28, 67, 0, 0, 0, 0, 33,
+  0, 82, 37, 48, 54, 46, 22, 17, 0, 0,
+  75, 0, 31, 10, 55, 60, 0, 21, 0, 0,
+  43, 0, 38, 0, 0, 48, 0, 0, 41, 28,
+  0, 38, 57, 0, 0, 0, 24, 0, 32, 0,
+  0, 0, 0, 80, 0, 0, 0, 0, 14, 21,
+  0, 28, 36, 67, 0, 12, 53, 0, 1, 49,
+  0, 34, 0, 0, 0, 41, 0, 12, 9, 0,
+  0, 0, 0, 43, 25, 31, 0, 22, 14, 0,
+  16, 22, 0, 32, 73, 0, 0, 30, 3, 13,
+  122, 5, 40, 0, 0, 1, 0, 0, 93, 0,
+  14, 55, 0, 0, 0, 0, 0, 54, 0, 32,
+  56, 22, 48, 0, 15, 0, 63, 0, 0, 0,
+  0, 46, 59, 0, 14, 0, 6, 28, 0, 93,
+  0, 0, 0, 15, 0, 83, 0, 21, 90, 39,
+  0, 48, 26, 0, 0, 60, 13, 28, 16, 0,
+  25, 81, 1, 0, 0, 0, 1, 44, 17, 19,
+  0, 35, 60, 0, 78, 36, 79, 138, 7, 0,
+  76, 0, 2, 0, 0, 129, 0, 4, 0, 11,
+  0, 4, 0, 0, 138, 0, 2, 0, 27, 0,
+  0, 90, 14, 2, 90, 0, 0, 39, 0, 61,
+  111, 0, 118, 35, 0, 31, 35, 22, 25, 0,
+  0, 0, 0, 27, 0, 0, 12, 25, 0, 0,
+  0, 91, 0, 7, 15, 0, 6, 0, 0, 89,
+  131, 18, 0, 0, 39, 0, 0, 48, 0, 0,
+  1, 67, 0, 57, 0, 0, 0, 0, 75, 0,
+  0, 0, 0, 0, 0, 0, 75, 51, 0, 0,
+  95, 9, 0, 0, 0, 24, 67, 28, 0, 54,
+  35, 44, 0, 52, 0, 15, 0, 0, 0, 58,
+  28, 9, 0, 0, 21, 48, 6, 84, 0, 37,
+  76, 0, 22, 0, 105, 123, 0, 0, 100, 0,
+  38, 0, 0, 109, 0, 0, 0, 11, 0, 0,
+  0, 0, 96, 0, 19, 0, 47, 0, 0, 83,
+  53, 15, 66, 0, 7, 34, 0, 90, 0, 0,
+  122, 30, 0, 21, 7, 0, 14, 0, 0, 2,
+  0, 89, 0, 17, 21, 0, 35, 0, 0, 36,
+  0, 3, 0, 0, 0, 0, 0, 59, 137, 0,
+  0, 0, 0, 0, 0, 52, 0, 3, 30, 17,
+  0, 0, 80, 0, 22, 0, 52, 0, 0, 0,
+  0, 0, 0, 14, 61, 73, 19, 3, 82, 25,
+  7, 0, 0, 19, 0, 0, 0, 50, 24, 124,
+  0, 0, 0, 0, 0, 0, 16, 66, 70, 4,
+  0, 0, 12, 4, 0, 88, 7, 3, 0, 13,
+  0, 0, 74, 8, 0, 0, 84, 0, 0, 15,
+  17, 36, 17, 22, 4, 0, 9, 49, 0, 0,
+  86, 0, 46, 0, 71, 0, 0, 47, 100, 0,
+  96, 0, 0, 47, 0, 116, 0, 23, 90, 0,
+  0, 33, 0, 0, 23, 0, 0, 55, 0, 76,
+  0, 1, 45, 31, 68, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 0, 29, 67, 0, 0, 0,
+  0, 4, 0, 42, 0, 0, 54, 0, 0, 0,
+  124, 74, 44, 0, 25, 0, 0, 0, 0, 25,
+  0, 22, 0, 56, 59, 0, 21, 13, 0, 41,
+  0, 2, 0, 43, 0, 19, 0, 48, 0, 0,
+  0, 0, 56, 0, 3, 89, 5, 0, 0, 0,
+  21, 5, 0, 99, 0, 11, 0, 0, 67, 44,
+  117, 91, 15, 0, 39, 0, 3, 0, 0, 12,
+  0, 18, 5, 1, 0, 35, 0, 23, 119, 0,
+  0, 4, 0, 0, 0, 65, 91, 49, 82, 33,
+  0, 21, 0, 118, 80, 20, 83, 0, 0, 0,
+  0, 0, 100, 0, 0, 0, 15, 22, 26, 0,
+  0, 49, 63, 0, 0, 18, 0, 0, 55, 0,
+  41, 0, 0, 54, 58, 26, 28, 0, 0, 0,
+  0, 29, 0, 0, 19, 18, 0, 23, 56, 7,
+  0, 0, 19, 0, 0, 0, 0, 0, 0, 24,
+  61, 73, 32, 0, 66, 36, 9, 0, 0, 0,
+  5, 21, 0, 26, 30, 124, 0, 0, 0, 0,
+  23, 0, 28, 52, 0, 3, 0, 0, 50, 28,
+  0, 103, 0, 4, 0, 0, 39, 0, 82, 66,
+  0, 0, 35, 0, 2, 0, 0, 22, 7, 0,
+  0, 0, 0, 70, 0, 21, 74, 0, 0, 14,
+  10, 0, 0, 32, 91, 24, 64, 1, 0, 2,
+  0, 95, 0, 13, 72, 0, 0, 0, 0, 0,
+  86, 0, 0, 56, 11, 19, 0, 0, 12, 13,
+  141, 0, 0, 19, 0, 0, 4, 0, 38, 0,
+  0, 38, 31, 0, 0, 0, 0, 0, 0, 56,
+  51, 0, 69, 0, 0, 0, 107, 0, 36, 0,
+  0, 32, 38, 0, 0, 0, 0, 37, 0, 81,
+  51, 46, 25, 77, 65, 9, 0, 0, 20, 0,
+  19, 0, 51, 118, 0, 0, 0, 0, 16, 7,
+  12, 11, 0, 26, 0, 0, 55, 19, 0, 69,
+  20, 7, 22, 0, 56, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 31, 31, 30, 33, 0, 0,
+  23, 35, 0, 14, 38, 0, 27, 20, 0, 10,
+  0, 19, 19, 8, 0, 0, 0, 0, 2, 0,
+  0, 41, 51, 0, 0, 22, 0, 0, 35, 8,
+  0, 53, 41, 20, 0, 0, 35, 12, 95, 14,
+  26, 0, 0, 30, 0, 0, 70, 0, 0, 50,
+  0, 20, 0, 0, 0, 25, 0, 43, 127, 0,
+  82, 0, 12, 0, 31, 0, 14, 0, 0, 8,
+  49, 0, 2, 15, 10, 13, 0, 93, 58, 29,
+  70, 32, 22, 7, 0, 0, 38, 0, 7, 32,
+  60, 93, 0, 0, 0, 0, 38, 0, 64, 26,
+  0, 33, 0, 0, 30, 14, 0, 67, 47, 0,
+  0, 0, 6, 0, 43, 9, 0, 0, 0, 21,
+  0, 0, 0, 0, 0, 24, 0, 6, 13, 86,
+  0, 24, 27, 0, 0, 48, 0, 0, 0, 0,
+  12, 26, 3, 21, 0, 0, 0, 30, 0, 44,
+  10, 2, 0, 0, 0, 0, 48, 0, 0, 39,
+  61, 0, 1, 12, 0, 35, 123, 0, 0, 0,
+  0, 0, 0, 0, 63, 0, 17, 39, 26, 0,
+  0, 0, 0, 26, 0, 33, 42, 10, 39, 0,
+  4, 0, 83, 0, 0, 0, 0, 28, 67, 0,
+  0, 0, 0, 33, 0, 82, 37, 48, 54, 46,
+  22, 17, 0, 0, 75, 0, 31, 10, 55, 60,
+  0, 21, 0, 0, 43, 0, 38, 0, 0, 48,
+  0, 0, 41, 28, 0, 38, 57, 0, 0, 0,
+  24, 0, 32, 0, 0, 0, 0, 80, 0, 0,
+  0, 0, 14, 21, 0, 28, 36, 67, 0, 12,
+  53, 0, 1, 49, 0, 34, 0, 0, 0, 41,
+  0, 12, 9, 0, 0, 0, 0, 43, 25, 31,
+  0, 22, 14, 0, 16, 22, 0, 32, 73, 0,
+  0, 30, 3, 13, 122, 5, 40, 0, 0, 1,
+  0, 0, 93, 0, 14, 55, 0, 0, 0, 0,
+  0, 54, 0, 32, 56, 22, 48, 0, 15, 0,
+  63, 0, 0, 0, 0, 46, 59, 0, 14, 0,
+  6, 28, 0, 93, 18, 58, 66, 69, 39, 34,
+  0, 0, 61, 0, 24, 0, 24, 41, 11, 21,
+  49, 14, 29, 7, 0, 0, 0, 34, 1, 0,
+  22, 29, 0, 26, 0, 5, 31, 0, 36, 0,
+  13, 0, 0, 0, 0, 34, 0, 0, 10, 55,
+  10, 6, 0, 0, 30, 0, 0, 0, 35, 0,
+  20, 14, 0, 4, 0, 6, 0, 0, 0, 0,
+  31, 0, 49, 0, 0, 0, 64, 30, 0, 37,
+  0, 10, 0, 53, 0, 8, 43, 93, 0, 42,
+  5, 3, 30, 39, 93, 5, 0, 0, 11, 0,
+  68, 0, 0, 79, 5, 0, 0, 0, 30, 61,
+  0, 15, 39, 0, 23, 0, 0, 0, 0, 0,
+  12, 0, 0, 0, 11, 0, 7, 0, 19, 17,
+  24, 37, 0, 0, 95, 9, 0, 0, 0, 24,
+  67, 28, 0, 54, 35, 44, 0, 52, 0, 15,
+  0, 0, 0, 58, 28, 9, 0, 0, 21, 48,
+  6, 84, 0, 37, 76, 0, 22, 0, 105, 123,
+  0, 0, 100, 0, 38, 0, 0, 109, 0, 0,
+  0, 11, 0, 0, 0, 0, 96, 0, 19, 0,
+  47, 0, 0, 83, 53, 15, 66, 0, 7, 34,
+  0, 90, 0, 0, 122, 30, 0, 21, 7, 0,
+  14, 0, 0, 2, 0, 89, 0, 17, 21, 0,
+  35, 0, 0, 36, 0, 3, 0, 0, 0, 0,
+  0, 59, 137, 0, 0, 0, 0, 0, 0, 52,
+  0, 3, 30, 17, 0, 0, 80, 0, 22, 0,
+  52, 0, 0, 0, 0, 0, 0, 14, 61, 73,
+  19, 3, 82, 25, 7, 0, 0, 19, 0, 0,
+  0, 50, 24, 124, 0, 0, 0, 0, 0, 0,
+  16, 66, 70, 4, 0, 0, 12, 4, 0, 88,
+  7, 3, 0, 13, 0, 0, 74, 8, 0, 0,
+  84, 0, 0, 15, 17, 36, 17, 22, 4, 0,
+  9, 49, 0, 0, 86, 0, 46, 0, 71, 0,
+  0, 47, 100, 0, 96, 0, 0, 47, 0, 116,
+  0, 23, 90, 0, 0, 33, 0, 0, 23, 0,
+  0, 55, 0, 76, 0, 1, 45, 31, 68, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 0, 29,
+  67, 0, 0, 0, 0, 4, 0, 42, 0, 0,
+  54, 0, 0, 0, 124, 74, 44, 0, 25, 0,
+  0, 0, 0, 25, 0, 22, 0, 56, 83, 83,
+  12, 72, 44, 15, 0, 0, 20, 0, 22, 0,
+  23, 126, 0, 0, 0, 0, 39, 0, 24, 37,
+  34, 21, 0, 0, 35, 11, 0, 34, 52, 81,
+  0, 0, 0, 0, 0, 26, 0, 0, 0, 1,
+  0, 0, 1, 18, 42, 71, 0, 0, 11, 40,
+  0, 7, 106, 0, 38, 4, 10, 0, 0, 34,
+  61, 26, 20, 0, 27, 21, 0, 98, 0, 49,
+  51, 0, 0, 28, 54, 0, 44, 0, 0, 48,
+  15, 60, 0, 1, 2, 45, 68, 0, 14, 0,
+  0, 25, 0, 0, 81, 0, 11, 15, 12, 121,
+  4, 0, 0, 16, 0, 68, 74, 0, 26, 0,
+  17, 1, 24, 87, 0, 0, 20, 2, 10, 0,
+  0, 0, 0, 22, 0, 87, 32, 0, 66, 36,
+  9, 0, 0, 0, 5, 21, 0, 26, 30, 124,
+  0, 0, 0, 0, 23, 0, 28, 52, 0, 3,
+  0, 0, 50, 28, 0, 103, 0, 4, 0, 0,
+  39, 0, 82, 66, 0, 0, 35, 0, 2, 0,
+  0, 22, 7, 0, 0, 0, 0, 70, 0, 21,
+  74, 0, 0, 14, 10, 0, 0, 32, 91, 24,
+  64, 1, 0, 2, 0, 95, 0, 13, 72, 0,
+  0, 0, 0, 0, 86, 0, 0, 56, 11, 19,
+  0, 0, 12, 13, 141, 0, 0, 19, 0, 0,
+  4, 0, 38, 0, 0, 38, 31, 0, 0, 0,
+  0, 0, 0, 56, 51, 0, 69, 0, 0, 0,
+  107, 0, 36, 0, 0, 32, 38, 0, 0, 0,
+  0, 37, 0, 81, 51, 46, 25, 77, 65, 9,
+  0, 0, 20, 0, 19, 0, 51, 118, 0, 0,
+  0, 0, 16, 7, 12, 11, 0, 26, 0, 0,
+  55, 19, 0, 69, 20, 7, 22, 0, 56, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 31, 31,
+  30, 33, 0, 0, 23, 35, 0, 14, 38, 0,
+  27, 20, 0, 10, 0, 19, 19, 8, 0, 0,
+  0, 0, 2, 0, 0, 41, 51, 0, 0, 22,
+  0, 0, 35, 8, 0, 53, 41, 20, 0, 0,
+  35, 12, 95, 14, 26, 0, 0, 30, 0, 0,
+  70, 0, 0, 50, 0, 20, 0, 0, 0, 25,
+  0, 43, 127, 0, 82, 0, 12, 0, 31, 0,
+  14, 0, 0, 8, 49, 0, 2, 15, 10, 13,
+  0, 93, 42, 127, 15, 99, 80, 43, 0, 0,
+  43, 0, 32, 0, 35, 29, 0, 0, 11, 0,
+  41, 15, 0, 0, 0, 47, 24, 0, 52, 29,
+  0, 37, 5, 49, 69, 0, 20, 0, 0, 0,
+  0, 0, 0, 17, 0, 6, 19, 56, 44, 46,
+  0, 7, 4, 0, 0, 17, 32, 0, 50, 2,
+  0, 29, 21, 24, 0, 8, 0, 0, 52, 4,
+  27, 0, 0, 21, 45, 4, 6, 45, 10, 2,
+  0, 2, 0, 19, 40, 73, 0, 17, 5, 38,
+  21, 49, 107, 0, 0, 49, 0, 0, 90, 0,
+  23, 57, 7, 99, 1, 0, 25, 33, 41, 62,
+  122, 0, 7, 22, 36, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 43, 0, 45, 1, 13, 74,
+  37, 48, 54, 46, 22, 17, 0, 0, 75, 0,
+  31, 10, 55, 60, 0, 21, 0, 0, 43, 0,
+  38, 0, 0, 48, 0, 0, 41, 28, 0, 38,
+  57, 0, 0, 0, 24, 0, 32, 0, 0, 0,
+  0, 80, 0, 0, 0, 0, 14, 21, 0, 28,
+  36, 67, 0, 12, 53, 0, 1, 49, 0, 34,
+  0, 0, 0, 41, 0, 12, 9, 0, 0, 0,
+  0, 43, 25, 31, 0, 22, 14, 0, 16, 22,
+  0, 32, 73, 0, 0, 30, 3, 13, 122, 5,
+  40, 0, 0, 1, 0, 0, 93, 0, 14, 55,
+  0, 0, 0, 0, 0, 54, 0, 32, 56, 22,
+  48, 0, 15, 0, 63, 0, 0, 0, 0, 46,
+  59, 0, 14, 0, 6, 28, 0, 93, 18, 58,
+  66, 69, 39, 34, 0, 0, 61, 0, 24, 0,
+  24, 41, 11, 21, 49, 14, 29, 7, 0, 0,
+  0, 34, 1, 0, 22, 29, 0, 26, 0, 5,
+  31, 0, 36, 0, 13, 0, 0, 0, 0, 34,
+  0, 0, 10, 55, 10, 6, 0, 0, 30, 0,
+  0, 0, 35, 0, 20, 14, 0, 4, 0, 6,
+  0, 0, 0, 0, 31, 0, 49, 0, 0, 0,
+  64, 30, 0, 37, 0, 10, 0, 53, 0, 8,
+  43, 93, 0, 42, 5, 3, 30, 39, 93, 5,
+  0, 0, 11, 0, 68, 0, 0, 79, 5, 0,
+  0, 0, 30, 61, 0, 15, 39, 0, 23, 0,
+  0, 0, 0, 0, 12, 0, 0, 0, 11, 0,
+  7, 0, 19, 17, 24, 37, 19, 83, 100, 57,
+  60, 86, 0, 0, 16, 0, 0, 0, 1, 37,
+  9, 22, 45, 0, 3, 24, 0, 9, 0, 26,
+  12, 0, 0, 30, 0, 58, 0, 45, 5, 36,
+  29, 8, 0, 14, 0, 6, 0, 0, 0, 30,
+  1, 47, 31, 38, 0, 0, 15, 0, 0, 0,
+  7, 0, 28, 11, 0, 0, 0, 19, 0, 0,
+  0, 0, 25, 0, 71, 0, 0, 0, 48, 11,
+  37, 0, 0, 0, 0, 14, 0, 10, 19, 113,
+  22, 41, 0, 37, 0, 20, 39, 0, 0, 0,
+  11, 0, 10, 0, 0, 52, 9, 11, 0, 0,
+  76, 50, 5, 16, 33, 0, 25, 22, 0, 4,
+  0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+  34, 0, 47, 18, 19, 3, 82, 25, 7, 0,
+  0, 19, 0, 0, 0, 50, 24, 124, 0, 0,
+  0, 0, 0, 0, 16, 66, 70, 4, 0, 0,
+  12, 4, 0, 88, 7, 3, 0, 13, 0, 0,
+  74, 8, 0, 0, 84, 0, 0, 15, 17, 36,
+  17, 22, 4, 0, 9, 49, 0, 0, 86, 0,
+  46, 0, 71, 0, 0, 47, 100, 0, 96, 0,
+  0, 47, 0, 116, 0, 23, 90, 0, 0, 33,
+  0, 0, 23, 0, 0, 55, 0, 76, 0, 1,
+  45, 31, 68, 0, 0, 0, 10, 0, 0, 0,
+  0, 0, 0, 29, 67, 0, 0, 0, 0, 4,
+  0, 42, 0, 0, 54, 0, 0, 0, 124, 74,
+  44, 0, 25, 0, 0, 0, 0, 25, 0, 22,
+  0, 56, 83, 83, 12, 72, 44, 15, 0, 0,
+  20, 0, 22, 0, 23, 126, 0, 0, 0, 0,
+  39, 0, 24, 37, 34, 21, 0, 0, 35, 11,
+  0, 34, 52, 81, 0, 0, 0, 0, 0, 26,
+  0, 0, 0, 1, 0, 0, 1, 18, 42, 71,
+  0, 0, 11, 40, 0, 7, 106, 0, 38, 4,
+  10, 0, 0, 34, 61, 26, 20, 0, 27, 21,
+  0, 98, 0, 49, 51, 0, 0, 28, 54, 0,
+  44, 0, 0, 48, 15, 60, 0, 1, 2, 45,
+  68, 0, 14, 0, 0, 25, 0, 0, 81, 0,
+  11, 15, 12, 121, 4, 0, 0, 16, 0, 68,
+  74, 0, 26, 0, 17, 1, 24, 87, 0, 0,
+  20, 2, 10, 0, 0, 0, 0, 22, 0, 87,
+  35, 0, 20, 65, 14, 232, 0, 0, 1, 0,
+  0, 0, 0, 21, 0, 0, 0, 33, 62, 0,
+  0, 113, 15, 0, 0, 0, 0, 6, 0, 17,
+  8, 99, 0, 0, 0, 33, 0, 40, 0, 0,
+  0, 0, 0, 0, 0, 58, 44, 47, 7, 4,
+  0, 38, 0, 0, 142, 0, 48, 0, 21, 0,
+  27, 92, 17, 0, 115, 0, 0, 40, 0, 96,
+  83, 63, 62, 0, 0, 35, 43, 0, 0, 0,
+  0, 0, 46, 65, 0, 0, 0, 31, 0, 0,
+  7, 7, 0, 0, 70, 0, 52, 0, 0, 9,
+  17, 116, 2, 0, 0, 5, 18, 17, 0, 0,
+  0, 39, 0, 0, 0, 45, 36, 0, 13, 16,
+  0, 19, 0, 0, 0, 15, 0, 44, 51, 46,
+  25, 77, 65, 9, 0, 0, 20, 0, 19, 0,
+  51, 118, 0, 0, 0, 0, 16, 7, 12, 11,
+  0, 26, 0, 0, 55, 19, 0, 69, 20, 7,
+  22, 0, 56, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 31, 31, 30, 33, 0, 0, 23, 35,
+  0, 14, 38, 0, 27, 20, 0, 10, 0, 19,
+  19, 8, 0, 0, 0, 0, 2, 0, 0, 41,
+  51, 0, 0, 22, 0, 0, 35, 8, 0, 53,
+  41, 20, 0, 0, 35, 12, 95, 14, 26, 0,
+  0, 30, 0, 0, 70, 0, 0, 50, 0, 20,
+  0, 0, 0, 25, 0, 43, 127, 0, 82, 0,
+  12, 0, 31, 0, 14, 0, 0, 8, 49, 0,
+  2, 15, 10, 13, 0, 93, 42, 127, 15, 99,
+  80, 43, 0, 0, 43, 0, 32, 0, 35, 29,
+  0, 0, 11, 0, 41, 15, 0, 0, 0, 47,
+  24, 0, 52, 29, 0, 37, 5, 49, 69, 0,
+  20, 0, 0, 0, 0, 0, 0, 17, 0, 6,
+  19, 56, 44, 46, 0, 7, 4, 0, 0, 17,
+  32, 0, 50, 2, 0, 29, 21, 24, 0, 8,
+  0, 0, 52, 4, 27, 0, 0, 21, 45, 4,
+  6, 45, 10, 2, 0, 2, 0, 19, 40, 73,
+  0, 17, 5, 38, 21, 49, 107, 0, 0, 49,
+  0, 0, 90, 0, 23, 57, 7, 99, 1, 0,
+  25, 33, 41, 62, 122, 0, 7, 22, 36, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 43, 0,
+  45, 1, 13, 74, 17, 8, 86, 68, 23, 217,
+  0, 0, 29, 0, 0, 0, 32, 0, 0, 0,
+  31, 18, 66, 0, 0, 112, 15, 8, 7, 0,
+  0, 35, 0, 72, 0, 82, 0, 0, 0, 30,
+  0, 0, 1, 0, 0, 19, 0, 19, 0, 50,
+  59, 42, 0, 14, 0, 45, 0, 0, 97, 0,
+  62, 0, 33, 0, 0, 70, 0, 0, 53, 0,
+  0, 26, 12, 6, 27, 25, 76, 0, 0, 26,
+  25, 0, 0, 18, 0, 0, 77, 83, 0, 0,
+  0, 18, 0, 4, 54, 0, 0, 0, 24, 0,
+  25, 0, 15, 39, 25, 35, 17, 0, 0, 31,
+  47, 29, 0, 0, 0, 45, 0, 0, 0, 0,
+  38, 0, 3, 0, 0, 1, 0, 22, 25, 0,
+  0, 20, 18, 58, 66, 69, 39, 34, 0, 0,
+  61, 0, 24, 0, 24, 41, 11, 21, 49, 14,
+  29, 7, 0, 0, 0, 34, 1, 0, 22, 29,
+  0, 26, 0, 5, 31, 0, 36, 0, 13, 0,
+  0, 0, 0, 34, 0, 0, 10, 55, 10, 6,
+  0, 0, 30, 0, 0, 0, 35, 0, 20, 14,
+  0, 4, 0, 6, 0, 0, 0, 0, 31, 0,
+  49, 0, 0, 0, 64, 30, 0, 37, 0, 10,
+  0, 53, 0, 8, 43, 93, 0, 42, 5, 3,
+  30, 39, 93, 5, 0, 0, 11, 0, 68, 0,
+  0, 79, 5, 0, 0, 0, 30, 61, 0, 15,
+  39, 0, 23, 0, 0, 0, 0, 0, 12, 0,
+  0, 0, 11, 0, 7, 0, 19, 17, 24, 37,
+  19, 83, 100, 57, 60, 86, 0, 0, 16, 0,
+  0, 0, 1, 37, 9, 22, 45, 0, 3, 24,
+  0, 9, 0, 26, 12, 0, 0, 30, 0, 58,
+  0, 45, 5, 36, 29, 8, 0, 14, 0, 6,
+  0, 0, 0, 30, 1, 47, 31, 38, 0, 0,
+  15, 0, 0, 0, 7, 0, 28, 11, 0, 0,
+  0, 19, 0, 0, 0, 0, 25, 0, 71, 0,
+  0, 0, 48, 11, 37, 0, 0, 0, 0, 14,
+  0, 10, 19, 113, 22, 41, 0, 37, 0, 20,
+  39, 0, 0, 0, 11, 0, 10, 0, 0, 52,
+  9, 11, 0, 0, 76, 50, 5, 16, 33, 0,
+  25, 22, 0, 4, 0, 0, 10, 0, 0, 0,
+  0, 0, 0, 0, 34, 0, 47, 18, 11, 11,
+  105, 33, 25, 144, 0, 0, 0, 0, 0, 0,
+  17, 0, 0, 0, 17, 5, 23, 0, 0, 94,
+  8, 12, 0, 0, 0, 0, 0, 52, 0, 26,
+  0, 34, 0, 30, 0, 0, 0, 25, 0, 0,
+  0, 39, 0, 0, 23, 37, 0, 0, 0, 86,
+  0, 0, 64, 0, 59, 0, 41, 0, 0, 32,
+  0, 17, 51, 3, 0, 0, 41, 0, 4, 7,
+  56, 0, 27, 0, 0, 0, 0, 10, 0, 0,
+  45, 50, 55, 11, 0, 9, 2, 0, 0, 0,
+  20, 0, 18, 0, 0, 0, 20, 19, 0, 0,
+  0, 0, 22, 38, 4, 0, 0, 0, 37, 28,
+  0, 0, 0, 0, 63, 0, 8, 0, 0, 0,
+  0, 12, 39, 5, 0, 0, 83, 83, 12, 72,
+  44, 15, 0, 0, 20, 0, 22, 0, 23, 126,
+  0, 0, 0, 0, 39, 0, 24, 37, 34, 21,
+  0, 0, 35, 11, 0, 34, 52, 81, 0, 0,
+  0, 0, 0, 26, 0, 0, 0, 1, 0, 0,
+  1, 18, 42, 71, 0, 0, 11, 40, 0, 7,
+  106, 0, 38, 4, 10, 0, 0, 34, 61, 26,
+  20, 0, 27, 21, 0, 98, 0, 49, 51, 0,
+  0, 28, 54, 0, 44, 0, 0, 48, 15, 60,
+  0, 1, 2, 45, 68, 0, 14, 0, 0, 25,
+  0, 0, 81, 0, 11, 15, 12, 121, 4, 0,
+  0, 16, 0, 68, 74, 0, 26, 0, 17, 1,
+  24, 87, 0, 0, 20, 2, 10, 0, 0, 0,
+  0, 22, 0, 87, 35, 0, 20, 65, 14, 232,
+  0, 0, 1, 0, 0, 0, 0, 21, 0, 0,
+  0, 33, 62, 0, 0, 113, 15, 0, 0, 0,
+  0, 6, 0, 17, 8, 99, 0, 0, 0, 33,
+  0, 40, 0, 0, 0, 0, 0, 0, 0, 58,
+  44, 47, 7, 4, 0, 38, 0, 0, 142, 0,
+  48, 0, 21, 0, 27, 92, 17, 0, 115, 0,
+  0, 40, 0, 96, 83, 63, 62, 0, 0, 35,
+  43, 0, 0, 0, 0, 0, 46, 65, 0, 0,
+  0, 31, 0, 0, 7, 7, 0, 0, 70, 0,
+  52, 0, 0, 9, 17, 116, 2, 0, 0, 5,
+  18, 17, 0, 0, 0, 39, 0, 0, 0, 45,
+  36, 0, 13, 16, 0, 19, 0, 0, 0, 15,
+  0, 44, 0, 0, 0, 5, 19, 184, 0, 0,
+  0, 0, 0, 0, 30, 14, 0, 24, 4, 50,
+  5, 0, 21, 0, 0, 62, 18, 19, 0, 0,
+  0, 10, 18, 0, 0, 34, 0, 4, 0, 24,
+  0, 24, 0, 55, 0, 16, 0, 17, 43, 43,
+  0, 20, 0, 38, 14, 0, 0, 0, 9, 0,
+  19, 12, 5, 26, 0, 0, 6, 0, 0, 22,
+  22, 0, 30, 56, 37, 1, 2, 80, 0, 0,
+  0, 42, 0, 0, 13, 12, 24, 0, 22, 14,
+  2, 28, 1, 67, 43, 9, 35, 30, 0, 0,
+  7, 25, 0, 0, 0, 0, 0, 0, 0, 6,
+  0, 17, 0, 1, 0, 13, 0, 7, 81, 29,
+  34, 0, 48, 9, 42, 0, 38, 19, 0, 0,
+  42, 127, 15, 99, 80, 43, 0, 0, 43, 0,
+  32, 0, 35, 29, 0, 0, 11, 0, 41, 15,
+  0, 0, 0, 47, 24, 0, 52, 29, 0, 37,
+  5, 49, 69, 0, 20, 0, 0, 0, 0, 0,
+  0, 17, 0, 6, 19, 56, 44, 46, 0, 7,
+  4, 0, 0, 17, 32, 0, 50, 2, 0, 29,
+  21, 24, 0, 8, 0, 0, 52, 4, 27, 0,
+  0, 21, 45, 4, 6, 45, 10, 2, 0, 2,
+  0, 19, 40, 73, 0, 17, 5, 38, 21, 49,
+  107, 0, 0, 49, 0, 0, 90, 0, 23, 57,
+  7, 99, 1, 0, 25, 33, 41, 62, 122, 0,
+  7, 22, 36, 0, 0, 0, 0, 0, 0, 0,
+  13, 0, 43, 0, 45, 1, 13, 74, 17, 8,
+  86, 68, 23, 217, 0, 0, 29, 0, 0, 0,
+  32, 0, 0, 0, 31, 18, 66, 0, 0, 112,
+  15, 8, 7, 0, 0, 35, 0, 72, 0, 82,
+  0, 0, 0, 30, 0, 0, 1, 0, 0, 19,
+  0, 19, 0, 50, 59, 42, 0, 14, 0, 45,
+  0, 0, 97, 0, 62, 0, 33, 0, 0, 70,
+  0, 0, 53, 0, 0, 26, 12, 6, 27, 25,
+  76, 0, 0, 26, 25, 0, 0, 18, 0, 0,
+  77, 83, 0, 0, 0, 18, 0, 4, 54, 0,
+  0, 0, 24, 0, 25, 0, 15, 39, 25, 35,
+  17, 0, 0, 31, 47, 29, 0, 0, 0, 45,
+  0, 0, 0, 0, 38, 0, 3, 0, 0, 1,
+  0, 22, 25, 0, 0, 20, 0, 0, 0, 0,
+  1, 125, 0, 0, 0, 0, 0, 0, 59, 8,
+  0, 44, 12, 40, 18, 0, 40, 6, 0, 49,
+  0, 0, 0, 0, 0, 14, 40, 0, 0, 17,
+  0, 8, 0, 16, 0, 48, 35, 47, 0, 33,
+  1, 0, 7, 27, 0, 35, 0, 77, 28, 0,
+  14, 0, 38, 0, 36, 0, 0, 14, 0, 11,
+  0, 0, 0, 3, 8, 0, 16, 34, 27, 15,
+  0, 70, 0, 0, 0, 26, 7, 0, 14, 12,
+  42, 0, 12, 0, 8, 25, 0, 47, 52, 0,
+  15, 13, 0, 0, 17, 28, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 32, 29, 12, 0, 47,
+  0, 0, 66, 14, 50, 0, 35, 14, 18, 0,
+  67, 1, 0, 0, 19, 83, 100, 57, 60, 86,
+  0, 0, 16, 0, 0, 0, 1, 37, 9, 22,
+  45, 0, 3, 24, 0, 9, 0, 26, 12, 0,
+  0, 30, 0, 58, 0, 45, 5, 36, 29, 8,
+  0, 14, 0, 6, 0, 0, 0, 30, 1, 47,
+  31, 38, 0, 0, 15, 0, 0, 0, 7, 0,
+  28, 11, 0, 0, 0, 19, 0, 0, 0, 0,
+  25, 0, 71, 0, 0, 0, 48, 11, 37, 0,
+  0, 0, 0, 14, 0, 10, 19, 113, 22, 41,
+  0, 37, 0, 20, 39, 0, 0, 0, 11, 0,
+  10, 0, 0, 52, 9, 11, 0, 0, 76, 50,
+  5, 16, 33, 0, 25, 22, 0, 4, 0, 0,
+  10, 0, 0, 0, 0, 0, 0, 0, 34, 0,
+  47, 18, 11, 11, 105, 33, 25, 144, 0, 0,
+  0, 0, 0, 0, 17, 0, 0, 0, 17, 5,
+  23, 0, 0, 94, 8, 12, 0, 0, 0, 0,
+  0, 52, 0, 26, 0, 34, 0, 30, 0, 0,
+  0, 25, 0, 0, 0, 39, 0, 0, 23, 37,
+  0, 0, 0, 86, 0, 0, 64, 0, 59, 0,
+  41, 0, 0, 32, 0, 17, 51, 3, 0, 0,
+  41, 0, 4, 7, 56, 0, 27, 0, 0, 0,
+  0, 10, 0, 0, 45, 50, 55, 11, 0, 9,
+  2, 0, 0, 0, 20, 0, 18, 0, 0, 0,
+  20, 19, 0, 0, 0, 0, 22, 38, 4, 0,
+  0, 0, 37, 28, 0, 0, 0, 0, 63, 0,
+  8, 0, 0, 0, 0, 12, 39, 5, 0, 0,
+  0, 2, 46, 0, 14, 18, 11, 0, 12, 0,
+  0, 11, 59, 26, 0, 39, 3, 30, 27, 0,
+  68, 23, 33, 23, 0, 0, 0, 0, 0, 0,
+  61, 0, 0, 0, 0, 7, 0, 8, 0, 25,
+  64, 32, 0, 78, 13, 0, 0, 10, 0, 12,
+  0, 114, 19, 0, 44, 0, 53, 0, 52, 0,
+  0, 0, 0, 20, 19, 0, 0, 11, 0, 0,
+  0, 19, 15, 39, 5, 36, 0, 0, 0, 0,
+  27, 0, 8, 0, 65, 1, 0, 0, 39, 0,
+  0, 25, 36, 0, 0, 17, 0, 0, 33, 36,
+  0, 0, 0, 0, 22, 0, 0, 0, 0, 13,
+  66, 18, 0, 34, 0, 0, 63, 12, 74, 5,
+  47, 3, 0, 0, 82, 14, 12, 0, 35, 0,
+  20, 65, 14, 232, 0, 0, 1, 0, 0, 0,
+  0, 21, 0, 0, 0, 33, 62, 0, 0, 113,
+  15, 0, 0, 0, 0, 6, 0, 17, 8, 99,
+  0, 0, 0, 33, 0, 40, 0, 0, 0, 0,
+  0, 0, 0, 58, 44, 47, 7, 4, 0, 38,
+  0, 0, 142, 0, 48, 0, 21, 0, 27, 92,
+  17, 0, 115, 0, 0, 40, 0, 96, 83, 63,
+  62, 0, 0, 35, 43, 0, 0, 0, 0, 0,
+  46, 65, 0, 0, 0, 31, 0, 0, 7, 7,
+  0, 0, 70, 0, 52, 0, 0, 9, 17, 116,
+  2, 0, 0, 5, 18, 17, 0, 0, 0, 39,
+  0, 0, 0, 45, 36, 0, 13, 16, 0, 19,
+  0, 0, 0, 15, 0, 44, 0, 0, 0, 5,
+  19, 184, 0, 0, 0, 0, 0, 0, 30, 14,
+  0, 24, 4, 50, 5, 0, 21, 0, 0, 62,
+  18, 19, 0, 0, 0, 10, 18, 0, 0, 34,
+  0, 4, 0, 24, 0, 24, 0, 55, 0, 16,
+  0, 17, 43, 43, 0, 20, 0, 38, 14, 0,
+  0, 0, 9, 0, 19, 12, 5, 26, 0, 0,
+  6, 0, 0, 22, 22, 0, 30, 56, 37, 1,
+  2, 80, 0, 0, 0, 42, 0, 0, 13, 12,
+  24, 0, 22, 14, 2, 28, 1, 67, 43, 9,
+  35, 30, 0, 0, 7, 25, 0, 0, 0, 0,
+  0, 0, 0, 6, 0, 17, 0, 1, 0, 13,
+  0, 7, 81, 29, 34, 0, 48, 9, 42, 0,
+  38, 19, 0, 0, 0, 34, 49, 0, 25, 0,
+  17, 0, 0, 0, 0, 0, 29, 51, 2, 46,
+  15, 40, 0, 20, 33, 0, 79, 40, 0, 20,
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 0,
+  0, 5, 0, 35, 63, 42, 0, 75, 56, 0,
+  0, 0, 0, 4, 0, 42, 63, 0, 1, 0,
+  44, 5, 9, 0, 0, 3, 0, 23, 0, 0,
+  26, 7, 0, 0, 0, 3, 4, 30, 12, 34,
+  0, 8, 0, 0, 40, 0, 0, 0, 68, 13,
+  0, 0, 40, 12, 0, 29, 32, 0, 0, 30,
+  0, 0, 0, 46, 0, 0, 0, 0, 5, 0,
+  0, 0, 0, 29, 58, 4, 0, 15, 30, 0,
+  26, 17, 54, 0, 15, 0, 9, 0, 76, 5,
+  0, 0, 17, 8, 86, 68, 23, 217, 0, 0,
+  29, 0, 0, 0, 32, 0, 0, 0, 31, 18,
+  66, 0, 0, 112, 15, 8, 7, 0, 0, 35,
+  0, 72, 0, 82, 0, 0, 0, 30, 0, 0,
+  1, 0, 0, 19, 0, 19, 0, 50, 59, 42,
+  0, 14, 0, 45, 0, 0, 97, 0, 62, 0,
+  33, 0, 0, 70, 0, 0, 53, 0, 0, 26,
+  12, 6, 27, 25, 76, 0, 0, 26, 25, 0,
+  0, 18, 0, 0, 77, 83, 0, 0, 0, 18,
+  0, 4, 54, 0, 0, 0, 24, 0, 25, 0,
+  15, 39, 25, 35, 17, 0, 0, 31, 47, 29,
+  0, 0, 0, 45, 0, 0, 0, 0, 38, 0,
+  3, 0, 0, 1, 0, 22, 25, 0, 0, 20,
+  0, 0, 0, 0, 1, 125, 0, 0, 0, 0,
+  0, 0, 59, 8, 0, 44, 12, 40, 18, 0,
+  40, 6, 0, 49, 0, 0, 0, 0, 0, 14,
+  40, 0, 0, 17, 0, 8, 0, 16, 0, 48,
+  35, 47, 0, 33, 1, 0, 7, 27, 0, 35,
+  0, 77, 28, 0, 14, 0, 38, 0, 36, 0,
+  0, 14, 0, 11, 0, 0, 0, 3, 8, 0,
+  16, 34, 27, 15, 0, 70, 0, 0, 0, 26,
+  7, 0, 14, 12, 42, 0, 12, 0, 8, 25,
+  0, 47, 52, 0, 15, 13, 0, 0, 17, 28,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 32,
+  29, 12, 0, 47, 0, 0, 66, 14, 50, 0,
+  35, 14, 18, 0, 67, 1, 0, 0, 0, 0,
+  77, 0, 0, 0, 2, 0, 0, 0, 0, 1,
+  29, 58, 0, 41, 0, 69, 29, 7, 59, 19,
+  117, 17, 0, 0, 0, 5, 0, 0, 15, 0,
+  0, 0, 0, 13, 0, 12, 0, 0, 66, 0,
+  0, 79, 32, 0, 0, 0, 0, 6, 0, 87,
+  7, 0, 39, 0, 49, 0, 7, 0, 0, 1,
+  10, 0, 77, 0, 0, 21, 0, 50, 0, 0,
+  2, 19, 0, 7, 0, 0, 0, 0, 19, 0,
+  2, 0, 62, 8, 0, 0, 25, 0, 0, 13,
+  0, 0, 16, 30, 0, 0, 0, 54, 3, 0,
+  0, 0, 20, 0, 0, 0, 0, 0, 62, 11,
+  0, 38, 13, 0, 89, 23, 44, 14, 34, 0,
+  0, 0, 57, 0, 15, 0, 11, 11, 105, 33,
+  25, 144, 0, 0, 0, 0, 0, 0, 17, 0,
+  0, 0, 17, 5, 23, 0, 0, 94, 8, 12,
+  0, 0, 0, 0, 0, 52, 0, 26, 0, 34,
+  0, 30, 0, 0, 0, 25, 0, 0, 0, 39,
+  0, 0, 23, 37, 0, 0, 0, 86, 0, 0,
+  64, 0, 59, 0, 41, 0, 0, 32, 0, 17,
+  51, 3, 0, 0, 41, 0, 4, 7, 56, 0,
+  27, 0, 0, 0, 0, 10, 0, 0, 45, 50,
+  55, 11, 0, 9, 2, 0, 0, 0, 20, 0,
+  18, 0, 0, 0, 20, 19, 0, 0, 0, 0,
+  22, 38, 4, 0, 0, 0, 37, 28, 0, 0,
+  0, 0, 63, 0, 8, 0, 0, 0, 0, 12,
+  39, 5, 0, 0, 0, 2, 46, 0, 14, 18,
+  11, 0, 12, 0, 0, 11, 59, 26, 0, 39,
+  3, 30, 27, 0, 68, 23, 33, 23, 0, 0,
+  0, 0, 0, 0, 61, 0, 0, 0, 0, 7,
+  0, 8, 0, 25, 64, 32, 0, 78, 13, 0,
+  0, 10, 0, 12, 0, 114, 19, 0, 44, 0,
+  53, 0, 52, 0, 0, 0, 0, 20, 19, 0,
+  0, 11, 0, 0, 0, 19, 15, 39, 5, 36,
+  0, 0, 0, 0, 27, 0, 8, 0, 65, 1,
+  0, 0, 39, 0, 0, 25, 36, 0, 0, 17,
+  0, 0, 33, 36, 0, 0, 0, 0, 22, 0,
+  0, 0, 0, 13, 66, 18, 0, 34, 0, 0,
+  63, 12, 74, 5, 47, 3, 0, 0, 82, 14,
+  12, 0, 5, 0, 69, 0, 12, 8, 0, 0,
+  19, 0, 0, 0, 40, 75, 0, 7, 0, 50,
+  40, 0, 68, 50, 83, 1, 0, 0, 0, 31,
+  0, 3, 20, 0, 0, 0, 0, 5, 0, 22,
+  0, 0, 22, 4, 0, 91, 26, 21, 0, 48,
+  0, 0, 1, 153, 0, 0, 66, 0, 33, 0,
+  18, 0, 0, 0, 11, 0, 112, 0, 0, 0,
+  0, 59, 0, 0, 0, 7, 0, 0, 0, 0,
+  0, 0, 9, 0, 15, 0, 36, 8, 0, 0,
+  45, 0, 0, 0, 0, 0, 6, 8, 0, 0,
+  1, 53, 30, 0, 0, 0, 16, 0, 0, 5,
+  5, 0, 72, 5, 0, 42, 10, 0, 150, 0,
+  30, 25, 71, 0, 0, 0, 50, 0, 12, 0,
+  0, 0, 0, 5, 19, 184, 0, 0, 0, 0,
+  0, 0, 30, 14, 0, 24, 4, 50, 5, 0,
+  21, 0, 0, 62, 18, 19, 0, 0, 0, 10,
+  18, 0, 0, 34, 0, 4, 0, 24, 0, 24,
+  0, 55, 0, 16, 0, 17, 43, 43, 0, 20,
+  0, 38, 14, 0, 0, 0, 9, 0, 19, 12,
+  5, 26, 0, 0, 6, 0, 0, 22, 22, 0,
+  30, 56, 37, 1, 2, 80, 0, 0, 0, 42,
+  0, 0, 13, 12, 24, 0, 22, 14, 2, 28,
+  1, 67, 43, 9, 35, 30, 0, 0, 7, 25,
+  0, 0, 0, 0, 0, 0, 0, 6, 0, 17,
+  0, 1, 0, 13, 0, 7, 81, 29, 34, 0,
+  48, 9, 42, 0, 38, 19, 0, 0, 0, 34,
+  49, 0, 25, 0, 17, 0, 0, 0, 0, 0,
+  29, 51, 2, 46, 15, 40, 0, 20, 33, 0,
+  79, 40, 0, 20, 0, 0, 0, 0, 25, 0,
+  0, 0, 0, 0, 0, 5, 0, 35, 63, 42,
+  0, 75, 56, 0, 0, 0, 0, 4, 0, 42,
+  63, 0, 1, 0, 44, 5, 9, 0, 0, 3,
+  0, 23, 0, 0, 26, 7, 0, 0, 0, 3,
+  4, 30, 12, 34, 0, 8, 0, 0, 40, 0,
+  0, 0, 68, 13, 0, 0, 40, 12, 0, 29,
+  32, 0, 0, 30, 0, 0, 0, 46, 0, 0,
+  0, 0, 5, 0, 0, 0, 0, 29, 58, 4,
+  0, 15, 30, 0, 26, 17, 54, 0, 15, 0,
+  9, 0, 76, 5, 0, 0, 10, 0, 77, 0,
+  9, 10, 0, 0, 4, 0, 0, 8, 3, 82,
+  0, 0, 0, 46, 42, 0, 45, 68, 136, 0,
+  0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+  0, 9, 0, 0, 0, 0, 33, 0, 0, 90,
+  40, 14, 0, 21, 0, 0, 0, 136, 0, 0,
+  74, 0, 41, 0, 36, 0, 0, 0, 35, 0,
+  125, 0, 0, 23, 0, 91, 0, 0, 13, 4,
+  0, 0, 7, 0, 0, 0, 15, 0, 23, 0,
+  45, 6, 0, 0, 20, 0, 0, 0, 0, 0,
+  24, 27, 0, 0, 0, 52, 15, 0, 0, 0,
+  14, 0, 0, 2, 0, 0, 69, 4, 0, 37,
+  12, 0, 118, 0, 23, 19, 24, 0, 0, 0,
+  53, 0, 0, 0, 0, 0, 0, 0, 1, 125,
+  0, 0, 0, 0, 0, 0, 59, 8, 0, 44,
+  12, 40, 18, 0, 40, 6, 0, 49, 0, 0,
+  0, 0, 0, 14, 40, 0, 0, 17, 0, 8,
+  0, 16, 0, 48, 35, 47, 0, 33, 1, 0,
+  7, 27, 0, 35, 0, 77, 28, 0, 14, 0,
+  38, 0, 36, 0, 0, 14, 0, 11, 0, 0,
+  0, 3, 8, 0, 16, 34, 27, 15, 0, 70,
+  0, 0, 0, 26, 7, 0, 14, 12, 42, 0,
+  12, 0, 8, 25, 0, 47, 52, 0, 15, 13,
+  0, 0, 17, 28, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 32, 29, 12, 0, 47, 0, 0,
+  66, 14, 50, 0, 35, 14, 18, 0, 67, 1,
+  0, 0, 0, 0, 77, 0, 0, 0, 2, 0,
+  0, 0, 0, 1, 29, 58, 0, 41, 0, 69,
+  29, 7, 59, 19, 117, 17, 0, 0, 0, 5,
+  0, 0, 15, 0, 0, 0, 0, 13, 0, 12,
+  0, 0, 66, 0, 0, 79, 32, 0, 0, 0,
+  0, 6, 0, 87, 7, 0, 39, 0, 49, 0,
+  7, 0, 0, 1, 10, 0, 77, 0, 0, 21,
+  0, 50, 0, 0, 2, 19, 0, 7, 0, 0,
+  0, 0, 19, 0, 2, 0, 62, 8, 0, 0,
+  25, 0, 0, 13, 0, 0, 16, 30, 0, 0,
+  0, 54, 3, 0, 0, 0, 20, 0, 0, 0,
+  0, 0, 62, 11, 0, 38, 13, 0, 89, 23,
+  44, 14, 34, 0, 0, 0, 57, 0, 15, 0,
+  25, 0, 64, 0, 17, 12, 0, 0, 23, 0,
+  0, 6, 16, 72, 0, 0, 0, 19, 42, 0,
+  48, 60, 61, 0, 0, 0, 0, 26, 0, 41,
+  0, 0, 0, 0, 0, 3, 0, 6, 0, 0,
+  0, 0, 0, 69, 18, 17, 0, 65, 0, 0,
+  0, 167, 0, 0, 66, 0, 29, 0, 4, 0,
+  0, 0, 24, 0, 113, 0, 0, 10, 0, 64,
+  0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 12, 0, 32, 1, 0, 15, 43, 0,
+  26, 0, 0, 0, 27, 0, 11, 0, 0, 71,
+  39, 0, 0, 0, 13, 0, 0, 24, 30, 0,
+  73, 0, 0, 44, 14, 0, 155, 0, 5, 26,
+  74, 0, 0, 0, 54, 0, 0, 0, 0, 2,
+  46, 0, 14, 18, 11, 0, 12, 0, 0, 11,
+  59, 26, 0, 39, 3, 30, 27, 0, 68, 23,
+  33, 23, 0, 0, 0, 0, 0, 0, 61, 0,
+  0, 0, 0, 7, 0, 8, 0, 25, 64, 32,
+  0, 78, 13, 0, 0, 10, 0, 12, 0, 114,
+  19, 0, 44, 0, 53, 0, 52, 0, 0, 0,
+  0, 20, 19, 0, 0, 11, 0, 0, 0, 19,
+  15, 39, 5, 36, 0, 0, 0, 0, 27, 0,
+  8, 0, 65, 1, 0, 0, 39, 0, 0, 25,
+  36, 0, 0, 17, 0, 0, 33, 36, 0, 0,
+  0, 0, 22, 0, 0, 0, 0, 13, 66, 18,
+  0, 34, 0, 0, 63, 12, 74, 5, 47, 3,
+  0, 0, 82, 14, 12, 0, 5, 0, 69, 0,
+  12, 8, 0, 0, 19, 0, 0, 0, 40, 75,
+  0, 7, 0, 50, 40, 0, 68, 50, 83, 1,
+  0, 0, 0, 31, 0, 3, 20, 0, 0, 0,
+  0, 5, 0, 22, 0, 0, 22, 4, 0, 91,
+  26, 21, 0, 48, 0, 0, 1, 153, 0, 0,
+  66, 0, 33, 0, 18, 0, 0, 0, 11, 0,
+  112, 0, 0, 0, 0, 59, 0, 0, 0, 7,
+  0, 0, 0, 0, 0, 0, 9, 0, 15, 0,
+  36, 8, 0, 0, 45, 0, 0, 0, 0, 0,
+  6, 8, 0, 0, 1, 53, 30, 0, 0, 0,
+  16, 0, 0, 5, 5, 0, 72, 5, 0, 42,
+  10, 0, 150, 0, 30, 25, 71, 0, 0, 0,
+  50, 0, 12, 0, 0, 0, 9, 0, 23, 7,
+  0, 0, 42, 0, 0, 0, 8, 47, 0, 0,
+  0, 0, 32, 0, 34, 11, 0, 18, 0, 0,
+  19, 48, 0, 74, 0, 0, 9, 0, 0, 0,
+  0, 14, 0, 0, 0, 0, 0, 37, 0, 40,
+  0, 86, 0, 0, 8, 140, 13, 21, 34, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 51, 0,
+  0, 0, 0, 14, 0, 9, 0, 0, 0, 24,
+  0, 0, 0, 11, 28, 0, 0, 0, 0, 0,
+  0, 47, 50, 10, 57, 0, 0, 0, 10, 0,
+  28, 0, 0, 84, 46, 0, 26, 0, 7, 0,
+  21, 14, 59, 0, 50, 0, 0, 36, 7, 0,
+  152, 0, 0, 31, 100, 6, 74, 0, 41, 0,
+  0, 0, 0, 34, 49, 0, 25, 0, 17, 0,
+  0, 0, 0, 0, 29, 51, 2, 46, 15, 40,
+  0, 20, 33, 0, 79, 40, 0, 20, 0, 0,
+  0, 0, 25, 0, 0, 0, 0, 0, 0, 5,
+  0, 35, 63, 42, 0, 75, 56, 0, 0, 0,
+  0, 4, 0, 42, 63, 0, 1, 0, 44, 5,
+  9, 0, 0, 3, 0, 23, 0, 0, 26, 7,
+  0, 0, 0, 3, 4, 30, 12, 34, 0, 8,
+  0, 0, 40, 0, 0, 0, 68, 13, 0, 0,
+  40, 12, 0, 29, 32, 0, 0, 30, 0, 0,
+  0, 46, 0, 0, 0, 0, 5, 0, 0, 0,
+  0, 29, 58, 4, 0, 15, 30, 0, 26, 17,
+  54, 0, 15, 0, 9, 0, 76, 5, 0, 0,
+  10, 0, 77, 0, 9, 10, 0, 0, 4, 0,
+  0, 8, 3, 82, 0, 0, 0, 46, 42, 0,
+  45, 68, 136, 0, 0, 0, 0, 0, 0, 0,
+  3, 0, 0, 0, 0, 9, 0, 0, 0, 0,
+  33, 0, 0, 90, 40, 14, 0, 21, 0, 0,
+  0, 136, 0, 0, 74, 0, 41, 0, 36, 0,
+  0, 0, 35, 0, 125, 0, 0, 23, 0, 91,
+  0, 0, 13, 4, 0, 0, 7, 0, 0, 0,
+  15, 0, 23, 0, 45, 6, 0, 0, 20, 0,
+  0, 0, 0, 0, 24, 27, 0, 0, 0, 52,
+  15, 0, 0, 0, 14, 0, 0, 2, 0, 0,
+  69, 4, 0, 37, 12, 0, 118, 0, 23, 19,
+  24, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+  45, 1, 17, 0, 0, 0, 31, 0, 0, 0,
+  20, 82, 0, 0, 0, 11, 29, 0, 23, 30,
+  25, 5, 0, 0, 20, 43, 0, 53, 0, 0,
+  0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 45, 6, 26, 0, 49, 0, 0, 0, 152,
+  0, 16, 45, 0, 12, 0, 0, 0, 0, 0,
+  8, 0, 63, 0, 0, 6, 0, 72, 0, 0,
+  8, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  1, 0, 0, 0, 0, 44, 53, 0, 44, 0,
+  0, 0, 18, 0, 36, 0, 0, 72, 23, 0,
+  15, 0, 42, 0, 1, 20, 65, 0, 81, 0,
+  0, 14, 40, 0, 141, 0, 0, 33, 89, 0,
+  30, 0, 58, 0, 0, 0, 0, 0, 77, 0,
+  0, 0, 2, 0, 0, 0, 0, 1, 29, 58,
+  0, 41, 0, 69, 29, 7, 59, 19, 117, 17,
+  0, 0, 0, 5, 0, 0, 15, 0, 0, 0,
+  0, 13, 0, 12, 0, 0, 66, 0, 0, 79,
+  32, 0, 0, 0, 0, 6, 0, 87, 7, 0,
+  39, 0, 49, 0, 7, 0, 0, 1, 10, 0,
+  77, 0, 0, 21, 0, 50, 0, 0, 2, 19,
+  0, 7, 0, 0, 0, 0, 19, 0, 2, 0,
+  62, 8, 0, 0, 25, 0, 0, 13, 0, 0,
+  16, 30, 0, 0, 0, 54, 3, 0, 0, 0,
+  20, 0, 0, 0, 0, 0, 62, 11, 0, 38,
+  13, 0, 89, 23, 44, 14, 34, 0, 0, 0,
+  57, 0, 15, 0, 25, 0, 64, 0, 17, 12,
+  0, 0, 23, 0, 0, 6, 16, 72, 0, 0,
+  0, 19, 42, 0, 48, 60, 61, 0, 0, 0,
+  0, 26, 0, 41, 0, 0, 0, 0, 0, 3,
+  0, 6, 0, 0, 0, 0, 0, 69, 18, 17,
+  0, 65, 0, 0, 0, 167, 0, 0, 66, 0,
+  29, 0, 4, 0, 0, 0, 24, 0, 113, 0,
+  0, 10, 0, 64, 0, 4, 0, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 12, 0, 32, 1,
+  0, 15, 43, 0, 26, 0, 0, 0, 27, 0,
+  11, 0, 0, 71, 39, 0, 0, 0, 13, 0,
+  0, 24, 30, 0, 73, 0, 0, 44, 14, 0,
+  155, 0, 5, 26, 74, 0, 0, 0, 54, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 0, 14,
+  34, 15, 0, 0, 26, 34, 0, 0, 0, 21,
+  29, 0, 8, 0, 0, 45, 0, 0, 48, 64,
+  6, 83, 0, 0, 55, 0, 0, 0, 0, 1,
+  0, 5, 0, 0, 0, 16, 10, 46, 0, 58,
+  0, 8, 7, 104, 37, 30, 33, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 6, 0,
+  0, 19, 0, 0, 21, 0, 0, 63, 0, 0,
+  0, 9, 39, 0, 0, 13, 0, 0, 0, 59,
+  43, 21, 114, 3, 0, 0, 28, 0, 36, 0,
+  0, 91, 40, 0, 32, 0, 7, 0, 28, 8,
+  75, 20, 37, 0, 0, 8, 5, 0, 131, 0,
+  0, 37, 103, 0, 101, 0, 70, 0, 0, 0,
+  5, 0, 69, 0, 12, 8, 0, 0, 19, 0,
+  0, 0, 40, 75, 0, 7, 0, 50, 40, 0,
+  68, 50, 83, 1, 0, 0, 0, 31, 0, 3,
+  20, 0, 0, 0, 0, 5, 0, 22, 0, 0,
+  22, 4, 0, 91, 26, 21, 0, 48, 0, 0,
+  1, 153, 0, 0, 66, 0, 33, 0, 18, 0,
+  0, 0, 11, 0, 112, 0, 0, 0, 0, 59,
+  0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+  9, 0, 15, 0, 36, 8, 0, 0, 45, 0,
+  0, 0, 0, 0, 6, 8, 0, 0, 1, 53,
+  30, 0, 0, 0, 16, 0, 0, 5, 5, 0,
+  72, 5, 0, 42, 10, 0, 150, 0, 30, 25,
+  71, 0, 0, 0, 50, 0, 12, 0, 0, 0,
+  9, 0, 23, 7, 0, 0, 42, 0, 0, 0,
+  8, 47, 0, 0, 0, 0, 32, 0, 34, 11,
+  0, 18, 0, 0, 19, 48, 0, 74, 0, 0,
+  9, 0, 0, 0, 0, 14, 0, 0, 0, 0,
+  0, 37, 0, 40, 0, 86, 0, 0, 8, 140,
+  13, 21, 34, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 51, 0, 0, 0, 0, 14, 0, 9,
+  0, 0, 0, 24, 0, 0, 0, 11, 28, 0,
+  0, 0, 0, 0, 0, 47, 50, 10, 57, 0,
+  0, 0, 10, 0, 28, 0, 0, 84, 46, 0,
+  26, 0, 7, 0, 21, 14, 59, 0, 50, 0,
+  0, 36, 7, 0, 152, 0, 0, 31, 100, 6,
+  74, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 24, 26, 15, 20, 0, 5, 0, 0,
+  4, 23, 15, 29, 19, 5, 0, 0, 0, 56,
+  21, 39, 37, 55, 0, 52, 0, 0, 82, 0,
+  11, 0, 0, 14, 0, 19, 0, 6, 0, 1,
+  10, 45, 30, 46, 0, 40, 24, 27, 55, 43,
+  0, 0, 9, 0, 0, 42, 0, 0, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 2, 11, 0,
+  20, 67, 0, 0, 0, 27, 69, 0, 0, 21,
+  0, 0, 2, 43, 16, 39, 82, 7, 0, 0,
+  15, 0, 21, 0, 0, 53, 8, 0, 42, 0,
+  0, 0, 48, 0, 67, 45, 15, 0, 2, 4,
+  0, 0, 73, 0, 0, 11, 69, 15, 131, 0,
+  65, 0, 0, 0, 10, 0, 77, 0, 9, 10,
+  0, 0, 4, 0, 0, 8, 3, 82, 0, 0,
+  0, 46, 42, 0, 45, 68, 136, 0, 0, 0,
+  0, 0, 0, 0, 3, 0, 0, 0, 0, 9,
+  0, 0, 0, 0, 33, 0, 0, 90, 40, 14,
+  0, 21, 0, 0, 0, 136, 0, 0, 74, 0,
+  41, 0, 36, 0, 0, 0, 35, 0, 125, 0,
+  0, 23, 0, 91, 0, 0, 13, 4, 0, 0,
+  7, 0, 0, 0, 15, 0, 23, 0, 45, 6,
+  0, 0, 20, 0, 0, 0, 0, 0, 24, 27,
+  0, 0, 0, 52, 15, 0, 0, 0, 14, 0,
+  0, 2, 0, 0, 69, 4, 0, 37, 12, 0,
+  118, 0, 23, 19, 24, 0, 0, 0, 53, 0,
+  0, 0, 0, 0, 45, 1, 17, 0, 0, 0,
+  31, 0, 0, 0, 20, 82, 0, 0, 0, 11,
+  29, 0, 23, 30, 25, 5, 0, 0, 20, 43,
+  0, 53, 0, 0, 0, 0, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 45, 6, 26, 0, 49,
+  0, 0, 0, 152, 0, 16, 45, 0, 12, 0,
+  0, 0, 0, 0, 8, 0, 63, 0, 0, 6,
+  0, 72, 0, 0, 8, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 1, 0, 0, 0, 0, 44,
+  53, 0, 44, 0, 0, 0, 18, 0, 36, 0,
+  0, 72, 23, 0, 15, 0, 42, 0, 1, 20,
+  65, 0, 81, 0, 0, 14, 40, 0, 141, 0,
+  0, 33, 89, 0, 30, 0, 58, 0, 0, 0,
+  0, 0, 24, 23, 0, 0, 18, 24, 50, 29,
+  0, 0, 0, 30, 0, 5, 4, 7, 13, 0,
+  0, 0, 0, 53, 0, 0, 74, 59, 173, 47,
+  0, 0, 71, 0, 19, 0, 0, 20, 0, 24,
+  0, 0, 0, 0, 18, 88, 16, 0, 0, 16,
+  0, 67, 30, 34, 32, 0, 0, 4, 0, 6,
+  0, 39, 0, 0, 0, 0, 33, 0, 0, 14,
+  6, 12, 56, 3, 0, 51, 0, 0, 0, 3,
+  39, 0, 0, 33, 0, 0, 0, 48, 80, 41,
+  84, 0, 0, 0, 23, 0, 51, 0, 2, 59,
+  14, 2, 58, 0, 66, 2, 56, 3, 77, 5,
+  38, 0, 11, 0, 0, 0, 103, 0, 0, 17,
+  53, 0, 50, 0, 60, 0, 7, 11, 25, 0,
+  64, 0, 17, 12, 0, 0, 23, 0, 0, 6,
+  16, 72, 0, 0, 0, 19, 42, 0, 48, 60,
+  61, 0, 0, 0, 0, 26, 0, 41, 0, 0,
+  0, 0, 0, 3, 0, 6, 0, 0, 0, 0,
+  0, 69, 18, 17, 0, 65, 0, 0, 0, 167,
+  0, 0, 66, 0, 29, 0, 4, 0, 0, 0,
+  24, 0, 113, 0, 0, 10, 0, 64, 0, 4,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  12, 0, 32, 1, 0, 15, 43, 0, 26, 0,
+  0, 0, 27, 0, 11, 0, 0, 71, 39, 0,
+  0, 0, 13, 0, 0, 24, 30, 0, 73, 0,
+  0, 44, 14, 0, 155, 0, 5, 26, 74, 0,
+  0, 0, 54, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 0, 14, 34, 15, 0, 0, 26, 34,
+  0, 0, 0, 21, 29, 0, 8, 0, 0, 45,
+  0, 0, 48, 64, 6, 83, 0, 0, 55, 0,
+  0, 0, 0, 1, 0, 5, 0, 0, 0, 16,
+  10, 46, 0, 58, 0, 8, 7, 104, 37, 30,
+  33, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 6, 0, 0, 19, 0, 0, 21, 0,
+  0, 63, 0, 0, 0, 9, 39, 0, 0, 13,
+  0, 0, 0, 59, 43, 21, 114, 3, 0, 0,
+  28, 0, 36, 0, 0, 91, 40, 0, 32, 0,
+  7, 0, 28, 8, 75, 20, 37, 0, 0, 8,
+  5, 0, 131, 0, 0, 37, 103, 0, 101, 0,
+  70, 0, 0, 0, 0, 6, 23, 5, 0, 0,
+  44, 22, 34, 36, 0, 0, 1, 0, 0, 41,
+  20, 23, 3, 8, 0, 0, 0, 69, 18, 19,
+  51, 49, 164, 7, 0, 0, 85, 0, 15, 0,
+  0, 31, 6, 63, 0, 3, 29, 0, 23, 56,
+  20, 0, 0, 47, 0, 43, 48, 47, 7, 0,
+  0, 20, 0, 28, 0, 23, 0, 0, 0, 3,
+  58, 0, 2, 0, 18, 22, 54, 25, 23, 58,
+  0, 0, 0, 13, 76, 0, 7, 17, 0, 0,
+  4, 37, 62, 48, 83, 0, 0, 0, 8, 13,
+  24, 0, 0, 55, 0, 0, 26, 0, 38, 0,
+  56, 0, 44, 17, 29, 0, 10, 0, 0, 0,
+  37, 0, 0, 16, 21, 0, 77, 0, 71, 0,
+  5, 0, 0, 0, 9, 0, 23, 7, 0, 0,
+  42, 0, 0, 0, 8, 47, 0, 0, 0, 0,
+  32, 0, 34, 11, 0, 18, 0, 0, 19, 48,
+  0, 74, 0, 0, 9, 0, 0, 0, 0, 14,
+  0, 0, 0, 0, 0, 37, 0, 40, 0, 86,
+  0, 0, 8, 140, 13, 21, 34, 0, 22, 0,
+  0, 0, 0, 0, 0, 0, 51, 0, 0, 0,
+  0, 14, 0, 9, 0, 0, 0, 24, 0, 0,
+  0, 11, 28, 0, 0, 0, 0, 0, 0, 47,
+  50, 10, 57, 0, 0, 0, 10, 0, 28, 0,
+  0, 84, 46, 0, 26, 0, 7, 0, 21, 14,
+  59, 0, 50, 0, 0, 36, 7, 0, 152, 0,
+  0, 31, 100, 6, 74, 0, 41, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 24, 26, 15, 20,
+  0, 5, 0, 0, 4, 23, 15, 29, 19, 5,
+  0, 0, 0, 56, 21, 39, 37, 55, 0, 52,
+  0, 0, 82, 0, 11, 0, 0, 14, 0, 19,
+  0, 6, 0, 1, 10, 45, 30, 46, 0, 40,
+  24, 27, 55, 43, 0, 0, 9, 0, 0, 42,
+  0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+  0, 2, 11, 0, 20, 67, 0, 0, 0, 27,
+  69, 0, 0, 21, 0, 0, 2, 43, 16, 39,
+  82, 7, 0, 0, 15, 0, 21, 0, 0, 53,
+  8, 0, 42, 0, 0, 0, 48, 0, 67, 45,
+  15, 0, 2, 4, 0, 0, 73, 0, 0, 11,
+  69, 15, 131, 0, 65, 0, 0, 0, 0, 21,
+  39, 0, 0, 0, 39, 17, 22, 19, 5, 0,
+  0, 0, 20, 45, 30, 23, 5, 22, 0, 0,
+  0, 63, 27, 30, 38, 35, 115, 0, 0, 0,
+  74, 0, 11, 0, 0, 35, 3, 71, 0, 30,
+  31, 0, 4, 24, 50, 0, 0, 63, 18, 33,
+  32, 49, 0, 0, 0, 28, 0, 17, 6, 0,
+  0, 0, 0, 3, 73, 0, 42, 0, 0, 21,
+  39, 30, 32, 29, 0, 11, 0, 17, 87, 0,
+  23, 13, 0, 0, 7, 29, 62, 11, 41, 0,
+  0, 0, 0, 12, 26, 0, 0, 45, 0, 0,
+  5, 0, 19, 0, 45, 0, 16, 20, 23, 0,
+  12, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+  66, 0, 50, 0, 0, 0, 0, 0, 45, 1,
+  17, 0, 0, 0, 31, 0, 0, 0, 20, 82,
+  0, 0, 0, 11, 29, 0, 23, 30, 25, 5,
+  0, 0, 20, 43, 0, 53, 0, 0, 0, 0,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 45,
+  6, 26, 0, 49, 0, 0, 0, 152, 0, 16,
+  45, 0, 12, 0, 0, 0, 0, 0, 8, 0,
+  63, 0, 0, 6, 0, 72, 0, 0, 8, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 1, 0,
+  0, 0, 0, 44, 53, 0, 44, 0, 0, 0,
+  18, 0, 36, 0, 0, 72, 23, 0, 15, 0,
+  42, 0, 1, 20, 65, 0, 81, 0, 0, 14,
+  40, 0, 141, 0, 0, 33, 89, 0, 30, 0,
+  58, 0, 0, 0, 0, 0, 24, 23, 0, 0,
+  18, 24, 50, 29, 0, 0, 0, 30, 0, 5,
+  4, 7, 13, 0, 0, 0, 0, 53, 0, 0,
+  74, 59, 173, 47, 0, 0, 71, 0, 19, 0,
+  0, 20, 0, 24, 0, 0, 0, 0, 18, 88,
+  16, 0, 0, 16, 0, 67, 30, 34, 32, 0,
+  0, 4, 0, 6, 0, 39, 0, 0, 0, 0,
+  33, 0, 0, 14, 6, 12, 56, 3, 0, 51,
+  0, 0, 0, 3, 39, 0, 0, 33, 0, 0,
+  0, 48, 80, 41, 84, 0, 0, 0, 23, 0,
+  51, 0, 2, 59, 14, 2, 58, 0, 66, 2,
+  56, 3, 77, 5, 38, 0, 11, 0, 0, 0,
+  103, 0, 0, 17, 53, 0, 50, 0, 60, 0,
+  7, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 0, 14, 34, 15,
+  0, 0, 26, 34, 0, 0, 0, 21, 29, 0,
+  8, 0, 0, 45, 0, 0, 48, 64, 6, 83,
+  0, 0, 55, 0, 0, 0, 0, 1, 0, 5,
+  0, 0, 0, 16, 10, 46, 0, 58, 0, 8,
+  7, 104, 37, 30, 33, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 6, 0, 0, 19,
+  0, 0, 21, 0, 0, 63, 0, 0, 0, 9,
+  39, 0, 0, 13, 0, 0, 0, 59, 43, 21,
+  114, 3, 0, 0, 28, 0, 36, 0, 0, 91,
+  40, 0, 32, 0, 7, 0, 28, 8, 75, 20,
+  37, 0, 0, 8, 5, 0, 131, 0, 0, 37,
+  103, 0, 101, 0, 70, 0, 0, 0, 0, 6,
+  23, 5, 0, 0, 44, 22, 34, 36, 0, 0,
+  1, 0, 0, 41, 20, 23, 3, 8, 0, 0,
+  0, 69, 18, 19, 51, 49, 164, 7, 0, 0,
+  85, 0, 15, 0, 0, 31, 6, 63, 0, 3,
+  29, 0, 23, 56, 20, 0, 0, 47, 0, 43,
+  48, 47, 7, 0, 0, 20, 0, 28, 0, 23,
+  0, 0, 0, 3, 58, 0, 2, 0, 18, 22,
+  54, 25, 23, 58, 0, 0, 0, 13, 76, 0,
+  7, 17, 0, 0, 4, 37, 62, 48, 83, 0,
+  0, 0, 8, 13, 24, 0, 0, 55, 0, 0,
+  26, 0, 38, 0, 56, 0, 44, 17, 29, 0,
+  10, 0, 0, 0, 37, 0, 0, 16, 21, 0,
+  77, 0, 71, 0, 5, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  24, 26, 15, 20, 0, 5, 0, 0, 4, 23,
+  15, 29, 19, 5, 0, 0, 0, 56, 21, 39,
+  37, 55, 0, 52, 0, 0, 82, 0, 11, 0,
+  0, 14, 0, 19, 0, 6, 0, 1, 10, 45,
+  30, 46, 0, 40, 24, 27, 55, 43, 0, 0,
+  9, 0, 0, 42, 0, 0, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 2, 11, 0, 20, 67,
+  0, 0, 0, 27, 69, 0, 0, 21, 0, 0,
+  2, 43, 16, 39, 82, 7, 0, 0, 15, 0,
+  21, 0, 0, 53, 8, 0, 42, 0, 0, 0,
+  48, 0, 67, 45, 15, 0, 2, 4, 0, 0,
+  73, 0, 0, 11, 69, 15, 131, 0, 65, 0,
+  0, 0, 0, 21, 39, 0, 0, 0, 39, 17,
+  22, 19, 5, 0, 0, 0, 20, 45, 30, 23,
+  5, 22, 0, 0, 0, 63, 27, 30, 38, 35,
+  115, 0, 0, 0, 74, 0, 11, 0, 0, 35,
+  3, 71, 0, 30, 31, 0, 4, 24, 50, 0,
+  0, 63, 18, 33, 32, 49, 0, 0, 0, 28,
+  0, 17, 6, 0, 0, 0, 0, 3, 73, 0,
+  42, 0, 0, 21, 39, 30, 32, 29, 0, 11,
+  0, 17, 87, 0, 23, 13, 0, 0, 7, 29,
+  62, 11, 41, 0, 0, 0, 0, 12, 26, 0,
+  0, 45, 0, 0, 5, 0, 19, 0, 45, 0,
+  16, 20, 23, 0, 12, 0, 0, 0, 0, 0,
+  0, 4, 0, 0, 66, 0, 50, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 74, 43, 0,
+  0, 0, 41, 0, 0, 0, 0, 15, 3, 0,
+  14, 72, 38, 47, 0, 64, 66, 0, 81, 51,
+  0, 26, 10, 14, 118, 35, 2, 0, 62, 0,
+  42, 8, 0, 26, 7, 52, 32, 25, 0, 26,
+  85, 30, 0, 8, 0, 25, 0, 13, 61, 0,
+  0, 0, 25, 0, 4, 20, 16, 0, 7, 0,
+  0, 0, 21, 2, 0, 0, 14, 32, 32, 38,
+  42, 30, 5, 5, 0, 0, 76, 3, 4, 0,
+  0, 15, 0, 0, 64, 23, 0, 0, 7, 0,
+  8, 49, 0, 0, 22, 10, 3, 0, 1, 17,
+  39, 0, 77, 0, 0, 43, 30, 0, 0, 41,
+  0, 0, 0, 3, 0, 15, 30, 0, 0, 0,
+  22, 0, 36, 0, 4, 47, 62, 10, 0, 19,
+  11, 10, 1, 0, 0, 51, 73, 0, 0, 33,
+  47, 24, 0, 20, 69, 64, 93, 12, 0, 0,
+  0, 23, 0, 0, 0, 0, 74, 0, 23, 28,
+  0, 28, 0, 48, 1, 24, 0, 19, 53, 57,
+  0, 57, 0, 37, 0, 54, 25, 0, 42, 0,
+  29, 0, 2, 0, 1, 0, 0, 20, 15, 0,
+  0, 0, 26, 0, 13, 15, 11, 22, 32, 0,
+  46, 51, 0, 12, 44, 0, 35, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
+  31, 0, 40, 41, 11, 0, 10, 24, 51, 0,
+  57, 0, 0, 3, 17, 15, 0, 12, 0, 0,
+  7, 0, 0, 7, 15, 4, 0, 0, 47, 0,
+  18, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 79, 42, 0, 0, 0, 53, 0, 5, 0,
+  0, 37, 2, 1, 18, 62, 41, 51, 0, 55,
+  86, 0, 87, 50, 0, 11, 5, 15, 128, 37,
+  1, 0, 72, 0, 36, 0, 0, 27, 0, 45,
+  39, 32, 0, 35, 80, 55, 0, 7, 0, 21,
+  12, 25, 62, 0, 16, 0, 27, 0, 29, 0,
+  13, 0, 11, 0, 0, 0, 25, 0, 9, 0,
+  3, 35, 41, 39, 37, 34, 23, 0, 0, 8,
+  79, 22, 1, 0, 0, 13, 0, 0, 82, 36,
+  0, 0, 20, 0, 0, 51, 0, 0, 48, 11,
+  5, 0, 0, 23, 29, 0, 77, 0, 0, 50,
+  18, 0, 0, 42, 0, 0, 0, 4, 5, 13,
+  24, 0, 0, 0, 28, 0, 34, 0, 7, 54,
+  57, 12, 0, 23, 17, 14, 2, 0, 0, 54,
+  68, 12, 2, 19, 58, 30, 0, 13, 72, 61,
+  94, 10, 0, 0, 0, 26, 0, 0, 0, 5,
+  68, 0, 20, 19, 0, 31, 0, 50, 4, 41,
+  0, 19, 53, 58, 0, 66, 0, 27, 0, 55,
+  24, 0, 51, 0, 26, 0, 10, 0, 0, 0,
+  0, 18, 3, 0, 0, 0, 34, 0, 14, 26,
+  9, 11, 35, 0, 48, 32, 0, 34, 37, 0,
+  35, 0, 0, 7, 0, 0, 0, 5, 0, 0,
+  0, 0, 0, 28, 25, 0, 59, 36, 0, 0,
+  14, 23, 43, 0, 49, 0, 0, 6, 11, 5,
+  0, 11, 0, 0, 8, 0, 8, 0, 0, 4,
+  5, 0, 45, 0, 20, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 59, 38, 0, 0, 0,
+  51, 10, 0, 0, 0, 39, 16, 14, 0, 31,
+  37, 50, 8, 52, 96, 0, 89, 33, 0, 0,
+  10, 17, 130, 11, 0, 0, 60, 0, 23, 5,
+  0, 27, 0, 39, 18, 30, 0, 52, 72, 74,
+  0, 1, 0, 9, 3, 38, 49, 0, 21, 0,
+  26, 0, 35, 0, 7, 0, 20, 0, 0, 0,
+  28, 0, 11, 0, 19, 32, 48, 45, 30, 15,
+  29, 8, 0, 9, 64, 8, 4, 0, 0, 0,
+  0, 0, 71, 23, 0, 0, 12, 0, 0, 61,
+  0, 0, 46, 11, 0, 0, 7, 26, 31, 0,
+  76, 0, 0, 36, 15, 0, 0, 53, 0, 0,
+  0, 21, 21, 27, 13, 0, 0, 0, 35, 0,
+  35, 0, 5, 41, 42, 14, 0, 10, 22, 17,
+  7, 0, 0, 59, 79, 18, 12, 8, 57, 30,
+  0, 8, 80, 64, 78, 4, 4, 0, 0, 27,
+  0, 0, 0, 6, 69, 0, 21, 17, 0, 41,
+  0, 56, 0, 45, 0, 25, 49, 58, 0, 46,
+  0, 36, 0, 53, 24, 7, 45, 0, 22, 0,
+  8, 0, 0, 0, 0, 27, 0, 6, 0, 0,
+  31, 0, 5, 23, 14, 9, 30, 0, 48, 35,
+  0, 35, 39, 0, 24, 0, 2, 0, 0, 0,
+  0, 6, 0, 0, 0, 3, 0, 41, 26, 0,
+  61, 31, 0, 0, 30, 12, 49, 0, 50, 0,
+  0, 4, 7, 3, 0, 14, 0, 0, 14, 0,
+  21, 1, 1, 11, 20, 0, 59, 0, 36, 0,
+  0, 74, 43, 0, 0, 0, 41, 0, 0, 0,
+  0, 15, 3, 0, 14, 72, 38, 47, 0, 64,
+  66, 0, 81, 51, 0, 26, 10, 14, 118, 35,
+  2, 0, 62, 0, 42, 8, 0, 26, 7, 52,
+  32, 25, 0, 26, 85, 30, 0, 8, 0, 25,
+  0, 13, 61, 0, 0, 0, 25, 0, 4, 20,
+  16, 0, 7, 0, 0, 0, 21, 2, 0, 0,
+  14, 32, 32, 38, 42, 30, 5, 5, 0, 0,
+  76, 3, 4, 0, 0, 15, 0, 0, 64, 23,
+  0, 0, 7, 0, 8, 49, 0, 0, 22, 10,
+  3, 0, 1, 17, 39, 0, 77, 0, 0, 43,
+  30, 0, 0, 41, 0, 0, 0, 3, 0, 15,
+  30, 0, 0, 0, 22, 0, 36, 0, 4, 47,
+  62, 10, 0, 19, 11, 10, 1, 0, 0, 51,
+  73, 0, 0, 33, 47, 24, 0, 20, 69, 64,
+  93, 12, 0, 0, 0, 23, 0, 0, 0, 0,
+  74, 0, 23, 28, 0, 28, 0, 48, 1, 24,
+  0, 19, 53, 57, 0, 57, 0, 37, 0, 54,
+  25, 0, 42, 0, 29, 0, 2, 0, 1, 0,
+  0, 20, 15, 0, 0, 0, 26, 0, 13, 15,
+  11, 22, 32, 0, 46, 51, 0, 12, 44, 0,
+  35, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 24, 31, 0, 40, 41, 11, 0,
+  10, 24, 51, 0, 57, 0, 0, 3, 17, 15,
+  0, 12, 0, 0, 7, 0, 0, 7, 15, 4,
+  0, 0, 47, 0, 18, 0, 3, 30, 27, 20,
+  0, 12, 23, 23, 27, 0, 0, 40, 83, 0,
+  11, 31, 57, 0, 0, 0, 0, 92, 0, 1,
+  37, 0, 0, 25, 0, 0, 0, 50, 77, 0,
+  34, 0, 0, 19, 0, 54, 0, 46, 24, 10,
+  34, 52, 12, 15, 0, 33, 0, 55, 12, 26,
+  53, 0, 30, 0, 10, 0, 0, 13, 0, 58,
+  0, 13, 0, 0, 32, 0, 13, 16, 12, 11,
+  0, 0, 49, 39, 0, 32, 30, 0, 50, 41,
+  0, 0, 7, 0, 0, 13, 0, 0, 0, 16,
+  0, 30, 52, 0, 6, 80, 2, 0, 18, 20,
+  43, 0, 29, 0, 4, 0, 21, 11, 0, 0,
+  0, 0, 0, 0, 0, 11, 4, 11, 36, 0,
+  51, 0, 18, 0, 0, 79, 42, 0, 0, 0,
+  53, 0, 5, 0, 0, 37, 2, 1, 18, 62,
+  41, 51, 0, 55, 86, 0, 87, 50, 0, 11,
+  5, 15, 128, 37, 1, 0, 72, 0, 36, 0,
+  0, 27, 0, 45, 39, 32, 0, 35, 80, 55,
+  0, 7, 0, 21, 12, 25, 62, 0, 16, 0,
+  27, 0, 29, 0, 13, 0, 11, 0, 0, 0,
+  25, 0, 9, 0, 3, 35, 41, 39, 37, 34,
+  23, 0, 0, 8, 79, 22, 1, 0, 0, 13,
+  0, 0, 82, 36, 0, 0, 20, 0, 0, 51,
+  0, 0, 48, 11, 5, 0, 0, 23, 29, 0,
+  77, 0, 0, 50, 18, 0, 0, 42, 0, 0,
+  0, 4, 5, 13, 24, 0, 0, 0, 28, 0,
+  34, 0, 7, 54, 57, 12, 0, 23, 17, 14,
+  2, 0, 0, 54, 68, 12, 2, 19, 58, 30,
+  0, 13, 72, 61, 94, 10, 0, 0, 0, 26,
+  0, 0, 0, 5, 68, 0, 20, 19, 0, 31,
+  0, 50, 4, 41, 0, 19, 53, 58, 0, 66,
+  0, 27, 0, 55, 24, 0, 51, 0, 26, 0,
+  10, 0, 0, 0, 0, 18, 3, 0, 0, 0,
+  34, 0, 14, 26, 9, 11, 35, 0, 48, 32,
+  0, 34, 37, 0, 35, 0, 0, 7, 0, 0,
+  0, 5, 0, 0, 0, 0, 0, 28, 25, 0,
+  59, 36, 0, 0, 14, 23, 43, 0, 49, 0,
+  0, 6, 11, 5, 0, 11, 0, 0, 8, 0,
+  8, 0, 0, 4, 5, 0, 45, 0, 20, 0,
+  10, 27, 29, 24, 0, 21, 22, 22, 24, 0,
+  0, 43, 79, 0, 6, 26, 56, 0, 0, 0,
+  0, 87, 1, 0, 41, 0, 0, 30, 0, 1,
+  0, 60, 72, 0, 24, 0, 0, 23, 0, 54,
+  0, 47, 13, 10, 23, 49, 26, 18, 0, 30,
+  0, 52, 4, 24, 54, 0, 32, 0, 10, 0,
+  1, 11, 0, 48, 0, 8, 0, 0, 39, 0,
+  18, 26, 11, 0, 0, 2, 47, 27, 0, 46,
+  24, 0, 46, 46, 0, 0, 13, 0, 0, 18,
+  0, 0, 0, 23, 0, 24, 55, 0, 15, 78,
+  0, 0, 25, 19, 40, 0, 26, 0, 5, 0,
+  17, 8, 0, 0, 0, 0, 7, 0, 0, 4,
+  0, 11, 36, 0, 55, 0, 17, 0, 0, 59,
+  38, 0, 0, 0, 51, 10, 0, 0, 0, 39,
+  16, 14, 0, 31, 37, 50, 8, 52, 96, 0,
+  89, 33, 0, 0, 10, 17, 130, 11, 0, 0,
+  60, 0, 23, 5, 0, 27, 0, 39, 18, 30,
+  0, 52, 72, 74, 0, 1, 0, 9, 3, 38,
+  49, 0, 21, 0, 26, 0, 35, 0, 7, 0,
+  20, 0, 0, 0, 28, 0, 11, 0, 19, 32,
+  48, 45, 30, 15, 29, 8, 0, 9, 64, 8,
+  4, 0, 0, 0, 0, 0, 71, 23, 0, 0,
+  12, 0, 0, 61, 0, 0, 46, 11, 0, 0,
+  7, 26, 31, 0, 76, 0, 0, 36, 15, 0,
+  0, 53, 0, 0, 0, 21, 21, 27, 13, 0,
+  0, 0, 35, 0, 35, 0, 5, 41, 42, 14,
+  0, 10, 22, 17, 7, 0, 0, 59, 79, 18,
+  12, 8, 57, 30, 0, 8, 80, 64, 78, 4,
+  4, 0, 0, 27, 0, 0, 0, 6, 69, 0,
+  21, 17, 0, 41, 0, 56, 0, 45, 0, 25,
+  49, 58, 0, 46, 0, 36, 0, 53, 24, 7,
+  45, 0, 22, 0, 8, 0, 0, 0, 0, 27,
+  0, 6, 0, 0, 31, 0, 5, 23, 14, 9,
+  30, 0, 48, 35, 0, 35, 39, 0, 24, 0,
+  2, 0, 0, 0, 0, 6, 0, 0, 0, 3,
+  0, 41, 26, 0, 61, 31, 0, 0, 30, 12,
+  49, 0, 50, 0, 0, 4, 7, 3, 0, 14,
+  0, 0, 14, 0, 21, 1, 1, 11, 20, 0,
+  59, 0, 36, 0, 7, 20, 30, 33, 0, 25,
+  20, 19, 31, 0, 0, 42, 85, 0, 9, 30,
+  51, 0, 0, 0, 0, 86, 1, 3, 48, 0,
+  0, 38, 0, 0, 0, 59, 74, 0, 25, 0,
+  0, 26, 0, 62, 0, 45, 16, 10, 25, 48,
+  31, 10, 0, 42, 0, 48, 3, 27, 52, 0,
+  29, 0, 9, 0, 0, 10, 0, 42, 0, 8,
+  0, 0, 37, 0, 14, 27, 13, 0, 0, 2,
+  45, 38, 0, 45, 25, 0, 49, 45, 0, 0,
+  20, 0, 0, 19, 0, 0, 0, 17, 0, 27,
+  57, 0, 16, 73, 0, 0, 26, 12, 40, 0,
+  28, 0, 0, 0, 14, 3, 0, 0, 0, 0,
+  11, 0, 0, 9, 2, 6, 37, 0, 65, 0,
+  15, 0, 4, 47, 62, 10, 0, 19, 11, 10,
+  1, 0, 0, 51, 73, 0, 0, 33, 47, 24,
+  0, 20, 69, 64, 93, 12, 0, 0, 0, 23,
+  0, 0, 0, 0, 74, 0, 23, 28, 0, 28,
+  0, 48, 1, 24, 0, 19, 53, 57, 0, 57,
+  0, 37, 0, 54, 25, 0, 42, 0, 29, 0,
+  2, 0, 1, 0, 0, 20, 15, 0, 0, 0,
+  26, 0, 13, 15, 11, 22, 32, 0, 46, 51,
+  0, 12, 44, 0, 35, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 24, 31, 0,
+  40, 41, 11, 0, 10, 24, 51, 0, 57, 0,
+  0, 3, 17, 15, 0, 12, 0, 0, 7, 0,
+  0, 7, 15, 4, 0, 0, 47, 0, 18, 0,
+  3, 30, 27, 20, 0, 12, 23, 23, 27, 0,
+  0, 40, 83, 0, 11, 31, 57, 0, 0, 0,
+  0, 92, 0, 1, 37, 0, 0, 25, 0, 0,
+  0, 50, 77, 0, 34, 0, 0, 19, 0, 54,
+  0, 46, 24, 10, 34, 52, 12, 15, 0, 33,
+  0, 55, 12, 26, 53, 0, 30, 0, 10, 0,
+  0, 13, 0, 58, 0, 13, 0, 0, 32, 0,
+  13, 16, 12, 11, 0, 0, 49, 39, 0, 32,
+  30, 0, 50, 41, 0, 0, 7, 0, 0, 13,
+  0, 0, 0, 16, 0, 30, 52, 0, 6, 80,
+  2, 0, 18, 20, 43, 0, 29, 0, 4, 0,
+  21, 11, 0, 0, 0, 0, 0, 0, 0, 11,
+  4, 11, 36, 0, 51, 0, 18, 0, 0, 0,
+  0, 5, 0, 140, 8, 5, 3, 0, 0, 23,
+  36, 0, 0, 10, 2, 0, 0, 0, 35, 102,
+  17, 9, 0, 0, 0, 0, 0, 21, 0, 23,
+  35, 21, 4, 1, 0, 25, 0, 41, 0, 16,
+  0, 48, 13, 84, 13, 57, 0, 3, 0, 61,
+  0, 0, 24, 0, 45, 0, 39, 0, 0, 51,
+  0, 0, 78, 3, 0, 20, 24, 0, 67, 6,
+  31, 2, 0, 19, 16, 27, 0, 18, 39, 0,
+  33, 59, 0, 0, 10, 0, 0, 0, 0, 8,
+  0, 0, 12, 34, 0, 0, 0, 66, 43, 0,
+  0, 31, 31, 0, 26, 0, 0, 0, 14, 0,
+  0, 24, 0, 0, 117, 2, 21, 20, 0, 0,
+  0, 0, 24, 0, 0, 0, 7, 54, 57, 12,
+  0, 23, 17, 14, 2, 0, 0, 54, 68, 12,
+  2, 19, 58, 30, 0, 13, 72, 61, 94, 10,
+  0, 0, 0, 26, 0, 0, 0, 5, 68, 0,
+  20, 19, 0, 31, 0, 50, 4, 41, 0, 19,
+  53, 58, 0, 66, 0, 27, 0, 55, 24, 0,
+  51, 0, 26, 0, 10, 0, 0, 0, 0, 18,
+  3, 0, 0, 0, 34, 0, 14, 26, 9, 11,
+  35, 0, 48, 32, 0, 34, 37, 0, 35, 0,
+  0, 7, 0, 0, 0, 5, 0, 0, 0, 0,
+  0, 28, 25, 0, 59, 36, 0, 0, 14, 23,
+  43, 0, 49, 0, 0, 6, 11, 5, 0, 11,
+  0, 0, 8, 0, 8, 0, 0, 4, 5, 0,
+  45, 0, 20, 0, 10, 27, 29, 24, 0, 21,
+  22, 22, 24, 0, 0, 43, 79, 0, 6, 26,
+  56, 0, 0, 0, 0, 87, 1, 0, 41, 0,
+  0, 30, 0, 1, 0, 60, 72, 0, 24, 0,
+  0, 23, 0, 54, 0, 47, 13, 10, 23, 49,
+  26, 18, 0, 30, 0, 52, 4, 24, 54, 0,
+  32, 0, 10, 0, 1, 11, 0, 48, 0, 8,
+  0, 0, 39, 0, 18, 26, 11, 0, 0, 2,
+  47, 27, 0, 46, 24, 0, 46, 46, 0, 0,
+  13, 0, 0, 18, 0, 0, 0, 23, 0, 24,
+  55, 0, 15, 78, 0, 0, 25, 19, 40, 0,
+  26, 0, 5, 0, 17, 8, 0, 0, 0, 0,
+  7, 0, 0, 4, 0, 11, 36, 0, 55, 0,
+  17, 0, 0, 0, 0, 7, 0, 153, 0, 0,
+  0, 0, 0, 29, 38, 0, 0, 1, 3, 0,
+  0, 0, 24, 93, 13, 16, 0, 0, 0, 0,
+  0, 19, 0, 24, 31, 29, 0, 8, 0, 29,
+  0, 45, 0, 25, 0, 49, 3, 74, 23, 63,
+  0, 7, 0, 55, 0, 0, 19, 0, 43, 0,
+  36, 0, 0, 49, 0, 0, 76, 0, 0, 27,
+  37, 0, 74, 15, 23, 0, 0, 20, 11, 20,
+  0, 34, 35, 0, 40, 53, 0, 0, 16, 0,
+  0, 0, 0, 13, 0, 0, 26, 27, 0, 0,
+  0, 73, 26, 0, 0, 26, 12, 0, 22, 0,
+  0, 0, 6, 0, 0, 16, 0, 0, 114, 0,
+  19, 9, 0, 0, 0, 0, 29, 0, 0, 0,
+  5, 41, 42, 14, 0, 10, 22, 17, 7, 0,
+  0, 59, 79, 18, 12, 8, 57, 30, 0, 8,
+  80, 64, 78, 4, 4, 0, 0, 27, 0, 0,
+  0, 6, 69, 0, 21, 17, 0, 41, 0, 56,
+  0, 45, 0, 25, 49, 58, 0, 46, 0, 36,
+  0, 53, 24, 7, 45, 0, 22, 0, 8, 0,
+  0, 0, 0, 27, 0, 6, 0, 0, 31, 0,
+  5, 23, 14, 9, 30, 0, 48, 35, 0, 35,
+  39, 0, 24, 0, 2, 0, 0, 0, 0, 6,
+  0, 0, 0, 3, 0, 41, 26, 0, 61, 31,
+  0, 0, 30, 12, 49, 0, 50, 0, 0, 4,
+  7, 3, 0, 14, 0, 0, 14, 0, 21, 1,
+  1, 11, 20, 0, 59, 0, 36, 0, 7, 20,
+  30, 33, 0, 25, 20, 19, 31, 0, 0, 42,
+  85, 0, 9, 30, 51, 0, 0, 0, 0, 86,
+  1, 3, 48, 0, 0, 38, 0, 0, 0, 59,
+  74, 0, 25, 0, 0, 26, 0, 62, 0, 45,
+  16, 10, 25, 48, 31, 10, 0, 42, 0, 48,
+  3, 27, 52, 0, 29, 0, 9, 0, 0, 10,
+  0, 42, 0, 8, 0, 0, 37, 0, 14, 27,
+  13, 0, 0, 2, 45, 38, 0, 45, 25, 0,
+  49, 45, 0, 0, 20, 0, 0, 19, 0, 0,
+  0, 17, 0, 27, 57, 0, 16, 73, 0, 0,
+  26, 12, 40, 0, 28, 0, 0, 0, 14, 3,
+  0, 0, 0, 0, 11, 0, 0, 9, 2, 6,
+  37, 0, 65, 0, 15, 0, 0, 0, 0, 14,
+  0, 156, 0, 0, 5, 0, 0, 33, 46, 0,
+  0, 1, 2, 0, 0, 0, 35, 87, 15, 22,
+  9, 0, 0, 0, 0, 4, 0, 26, 27, 34,
+  0, 10, 0, 25, 0, 45, 0, 20, 0, 52,
+  5, 80, 36, 57, 0, 13, 0, 53, 0, 0,
+  18, 0, 38, 0, 42, 0, 0, 46, 0, 0,
+  78, 0, 0, 21, 42, 0, 77, 17, 26, 0,
+  0, 15, 17, 17, 0, 33, 33, 0, 40, 55,
+  0, 0, 30, 0, 0, 0, 0, 21, 0, 0,
+  19, 31, 0, 0, 3, 65, 28, 0, 0, 21,
+  9, 0, 22, 0, 0, 0, 0, 0, 0, 12,
+  0, 0, 106, 0, 25, 11, 0, 0, 0, 0,
+  36, 0, 0, 0, 3, 30, 27, 20, 0, 12,
+  23, 23, 27, 0, 0, 40, 83, 0, 11, 31,
+  57, 0, 0, 0, 0, 92, 0, 1, 37, 0,
+  0, 25, 0, 0, 0, 50, 77, 0, 34, 0,
+  0, 19, 0, 54, 0, 46, 24, 10, 34, 52,
+  12, 15, 0, 33, 0, 55, 12, 26, 53, 0,
+  30, 0, 10, 0, 0, 13, 0, 58, 0, 13,
+  0, 0, 32, 0, 13, 16, 12, 11, 0, 0,
+  49, 39, 0, 32, 30, 0, 50, 41, 0, 0,
+  7, 0, 0, 13, 0, 0, 0, 16, 0, 30,
+  52, 0, 6, 80, 2, 0, 18, 20, 43, 0,
+  29, 0, 4, 0, 21, 11, 0, 0, 0, 0,
+  0, 0, 0, 11, 4, 11, 36, 0, 51, 0,
+  18, 0, 0, 0, 0, 5, 0, 140, 8, 5,
+  3, 0, 0, 23, 36, 0, 0, 10, 2, 0,
+  0, 0, 35, 102, 17, 9, 0, 0, 0, 0,
+  0, 21, 0, 23, 35, 21, 4, 1, 0, 25,
+  0, 41, 0, 16, 0, 48, 13, 84, 13, 57,
+  0, 3, 0, 61, 0, 0, 24, 0, 45, 0,
+  39, 0, 0, 51, 0, 0, 78, 3, 0, 20,
+  24, 0, 67, 6, 31, 2, 0, 19, 16, 27,
+  0, 18, 39, 0, 33, 59, 0, 0, 10, 0,
+  0, 0, 0, 8, 0, 0, 12, 34, 0, 0,
+  0, 66, 43, 0, 0, 31, 31, 0, 26, 0,
+  0, 0, 14, 0, 0, 24, 0, 0, 117, 2,
+  21, 20, 0, 0, 0, 0, 24, 0, 0, 0,
+  0, 8, 0, 0, 0, 26, 43, 6, 20, 0,
+  13, 0, 59, 0, 10, 62, 36, 31, 3, 0,
+  46, 0, 0, 38, 0, 42, 6, 2, 0, 34,
+  0, 0, 63, 41, 15, 0, 0, 0, 0, 46,
+  0, 37, 0, 53, 25, 14, 17, 17, 0, 32,
+  15, 5, 91, 14, 0, 0, 28, 0, 0, 70,
+  0, 0, 0, 0, 0, 0, 24, 8, 0, 0,
+  0, 2, 0, 9, 17, 48, 0, 3, 0, 31,
+  71, 5, 13, 36, 17, 0, 4, 23, 26, 35,
+  36, 0, 0, 2, 17, 32, 0, 0, 2, 44,
+  36, 0, 0, 0, 12, 0, 55, 13, 24, 46,
+  43, 0, 0, 24, 0, 0, 42, 41, 44, 0,
+  0, 0, 108, 0, 71, 14, 0, 0, 10, 27,
+  29, 24, 0, 21, 22, 22, 24, 0, 0, 43,
+  79, 0, 6, 26, 56, 0, 0, 0, 0, 87,
+  1, 0, 41, 0, 0, 30, 0, 1, 0, 60,
+  72, 0, 24, 0, 0, 23, 0, 54, 0, 47,
+  13, 10, 23, 49, 26, 18, 0, 30, 0, 52,
+  4, 24, 54, 0, 32, 0, 10, 0, 1, 11,
+  0, 48, 0, 8, 0, 0, 39, 0, 18, 26,
+  11, 0, 0, 2, 47, 27, 0, 46, 24, 0,
+  46, 46, 0, 0, 13, 0, 0, 18, 0, 0,
+  0, 23, 0, 24, 55, 0, 15, 78, 0, 0,
+  25, 19, 40, 0, 26, 0, 5, 0, 17, 8,
+  0, 0, 0, 0, 7, 0, 0, 4, 0, 11,
+  36, 0, 55, 0, 17, 0, 0, 0, 0, 7,
+  0, 153, 0, 0, 0, 0, 0, 29, 38, 0,
+  0, 1, 3, 0, 0, 0, 24, 93, 13, 16,
+  0, 0, 0, 0, 0, 19, 0, 24, 31, 29,
+  0, 8, 0, 29, 0, 45, 0, 25, 0, 49,
+  3, 74, 23, 63, 0, 7, 0, 55, 0, 0,
+  19, 0, 43, 0, 36, 0, 0, 49, 0, 0,
+  76, 0, 0, 27, 37, 0, 74, 15, 23, 0,
+  0, 20, 11, 20, 0, 34, 35, 0, 40, 53,
+  0, 0, 16, 0, 0, 0, 0, 13, 0, 0,
+  26, 27, 0, 0, 0, 73, 26, 0, 0, 26,
+  12, 0, 22, 0, 0, 0, 6, 0, 0, 16,
+  0, 0, 114, 0, 19, 9, 0, 0, 0, 0,
+  29, 0, 0, 0, 0, 17, 0, 0, 0, 31,
+  35, 0, 13, 0, 8, 0, 56, 4, 16, 62,
+  36, 39, 10, 0, 30, 0, 0, 48, 4, 53,
+  0, 4, 0, 15, 0, 0, 72, 44, 0, 0,
+  0, 0, 0, 66, 0, 41, 0, 43, 20, 12,
+  12, 36, 0, 41, 0, 7, 95, 16, 0, 0,
+  21, 0, 0, 55, 9, 0, 0, 0, 0, 0,
+  32, 12, 11, 0, 0, 0, 0, 15, 10, 55,
+  0, 0, 0, 47, 64, 4, 32, 22, 15, 0,
+  7, 27, 13, 34, 54, 16, 0, 11, 39, 32,
+  0, 0, 0, 68, 22, 0, 0, 0, 0, 0,
+  48, 0, 0, 30, 26, 15, 0, 27, 0, 0,
+  25, 30, 24, 3, 1, 0, 121, 0, 65, 2,
+  0, 0, 7, 20, 30, 33, 0, 25, 20, 19,
+  31, 0, 0, 42, 85, 0, 9, 30, 51, 0,
+  0, 0, 0, 86, 1, 3, 48, 0, 0, 38,
+  0, 0, 0, 59, 74, 0, 25, 0, 0, 26,
+  0, 62, 0, 45, 16, 10, 25, 48, 31, 10,
+  0, 42, 0, 48, 3, 27, 52, 0, 29, 0,
+  9, 0, 0, 10, 0, 42, 0, 8, 0, 0,
+  37, 0, 14, 27, 13, 0, 0, 2, 45, 38,
+  0, 45, 25, 0, 49, 45, 0, 0, 20, 0,
+  0, 19, 0, 0, 0, 17, 0, 27, 57, 0,
+  16, 73, 0, 0, 26, 12, 40, 0, 28, 0,
+  0, 0, 14, 3, 0, 0, 0, 0, 11, 0,
+  0, 9, 2, 6, 37, 0, 65, 0, 15, 0,
+  0, 0, 0, 14, 0, 156, 0, 0, 5, 0,
+  0, 33, 46, 0, 0, 1, 2, 0, 0, 0,
+  35, 87, 15, 22, 9, 0, 0, 0, 0, 4,
+  0, 26, 27, 34, 0, 10, 0, 25, 0, 45,
+  0, 20, 0, 52, 5, 80, 36, 57, 0, 13,
+  0, 53, 0, 0, 18, 0, 38, 0, 42, 0,
+  0, 46, 0, 0, 78, 0, 0, 21, 42, 0,
+  77, 17, 26, 0, 0, 15, 17, 17, 0, 33,
+  33, 0, 40, 55, 0, 0, 30, 0, 0, 0,
+  0, 21, 0, 0, 19, 31, 0, 0, 3, 65,
+  28, 0, 0, 21, 9, 0, 22, 0, 0, 0,
+  0, 0, 0, 12, 0, 0, 106, 0, 25, 11,
+  0, 0, 0, 0, 36, 0, 0, 0, 0, 20,
+  0, 0, 0, 35, 28, 0, 25, 0, 6, 0,
+  68, 1, 9, 53, 37, 38, 8, 0, 43, 0,
+  0, 43, 7, 56, 0, 4, 0, 13, 10, 0,
+  65, 53, 0, 0, 0, 0, 0, 56, 0, 63,
+  0, 42, 23, 10, 1, 49, 0, 48, 0, 7,
+  80, 24, 0, 0, 14, 0, 0, 62, 18, 0,
+  0, 0, 0, 0, 30, 19, 15, 0, 0, 0,
+  0, 17, 1, 53, 0, 0, 0, 49, 63, 0,
+  24, 24, 20, 0, 11, 25, 0, 37, 36, 32,
+  0, 13, 32, 35, 0, 0, 0, 66, 17, 0,
+  0, 0, 0, 0, 37, 0, 0, 36, 37, 19,
+  0, 29, 0, 0, 14, 20, 42, 8, 3, 0,
+  121, 0, 63, 0, 10, 0, 0, 0, 0, 5,
+  0, 140, 8, 5, 3, 0, 0, 23, 36, 0,
+  0, 10, 2, 0, 0, 0, 35, 102, 17, 9,
+  0, 0, 0, 0, 0, 21, 0, 23, 35, 21,
+  4, 1, 0, 25, 0, 41, 0, 16, 0, 48,
+  13, 84, 13, 57, 0, 3, 0, 61, 0, 0,
+  24, 0, 45, 0, 39, 0, 0, 51, 0, 0,
+  78, 3, 0, 20, 24, 0, 67, 6, 31, 2,
+  0, 19, 16, 27, 0, 18, 39, 0, 33, 59,
+  0, 0, 10, 0, 0, 0, 0, 8, 0, 0,
+  12, 34, 0, 0, 0, 66, 43, 0, 0, 31,
+  31, 0, 26, 0, 0, 0, 14, 0, 0, 24,
+  0, 0, 117, 2, 21, 20, 0, 0, 0, 0,
+  24, 0, 0, 0, 0, 8, 0, 0, 0, 26,
+  43, 6, 20, 0, 13, 0, 59, 0, 10, 62,
+  36, 31, 3, 0, 46, 0, 0, 38, 0, 42,
+  6, 2, 0, 34, 0, 0, 63, 41, 15, 0,
+  0, 0, 0, 46, 0, 37, 0, 53, 25, 14,
+  17, 17, 0, 32, 15, 5, 91, 14, 0, 0,
+  28, 0, 0, 70, 0, 0, 0, 0, 0, 0,
+  24, 8, 0, 0, 0, 2, 0, 9, 17, 48,
+  0, 3, 0, 31, 71, 5, 13, 36, 17, 0,
+  4, 23, 26, 35, 36, 0, 0, 2, 17, 32,
+  0, 0, 2, 44, 36, 0, 0, 0, 12, 0,
+  55, 13, 24, 46, 43, 0, 0, 24, 0, 0,
+  42, 41, 44, 0, 0, 0, 108, 0, 71, 14,
+  0, 0, 0, 44, 70, 0, 0, 0, 0, 9,
+  53, 0, 0, 29, 11, 20, 0, 36, 26, 0,
+  0, 0, 0, 7, 73, 51, 0, 0, 16, 18,
+  0, 0, 0, 0, 0, 0, 29, 22, 0, 0,
+  0, 40, 0, 13, 0, 10, 0, 1, 22, 0,
+  0, 0, 35, 32, 22, 15, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 20, 0, 30, 0,
+  2, 0, 0, 8, 3, 20, 33, 0, 0, 85,
+  0, 28, 19, 0, 42, 48, 0, 18, 0, 36,
+  33, 9, 46, 0, 0, 0, 8, 0, 0, 0,
+  0, 81, 37, 0, 0, 0, 25, 0, 70, 0,
+  22, 26, 14, 0, 0, 8, 0, 0, 28, 0,
+  0, 18, 0, 0, 19, 0, 44, 20, 0, 20,
+  0, 0, 0, 7, 0, 153, 0, 0, 0, 0,
+  0, 29, 38, 0, 0, 1, 3, 0, 0, 0,
+  24, 93, 13, 16, 0, 0, 0, 0, 0, 19,
+  0, 24, 31, 29, 0, 8, 0, 29, 0, 45,
+  0, 25, 0, 49, 3, 74, 23, 63, 0, 7,
+  0, 55, 0, 0, 19, 0, 43, 0, 36, 0,
+  0, 49, 0, 0, 76, 0, 0, 27, 37, 0,
+  74, 15, 23, 0, 0, 20, 11, 20, 0, 34,
+  35, 0, 40, 53, 0, 0, 16, 0, 0, 0,
+  0, 13, 0, 0, 26, 27, 0, 0, 0, 73,
+  26, 0, 0, 26, 12, 0, 22, 0, 0, 0,
+  6, 0, 0, 16, 0, 0, 114, 0, 19, 9,
+  0, 0, 0, 0, 29, 0, 0, 0, 0, 17,
+  0, 0, 0, 31, 35, 0, 13, 0, 8, 0,
+  56, 4, 16, 62, 36, 39, 10, 0, 30, 0,
+  0, 48, 4, 53, 0, 4, 0, 15, 0, 0,
+  72, 44, 0, 0, 0, 0, 0, 66, 0, 41,
+  0, 43, 20, 12, 12, 36, 0, 41, 0, 7,
+  95, 16, 0, 0, 21, 0, 0, 55, 9, 0,
+  0, 0, 0, 0, 32, 12, 11, 0, 0, 0,
+  0, 15, 10, 55, 0, 0, 0, 47, 64, 4,
+  32, 22, 15, 0, 7, 27, 13, 34, 54, 16,
+  0, 11, 39, 32, 0, 0, 0, 68, 22, 0,
+  0, 0, 0, 0, 48, 0, 0, 30, 26, 15,
+  0, 27, 0, 0, 25, 30, 24, 3, 1, 0,
+  121, 0, 65, 2, 0, 0, 0, 31, 59, 0,
+  8, 0, 0, 0, 53, 2, 0, 9, 30, 0,
+  0, 23, 15, 0, 8, 0, 0, 47, 79, 53,
+  0, 0, 0, 15, 0, 0, 0, 0, 0, 0,
+  52, 28, 0, 4, 0, 63, 0, 25, 0, 1,
+  0, 0, 25, 4, 0, 6, 0, 48, 20, 26,
+  0, 0, 19, 0, 8, 0, 0, 13, 0, 0,
+  18, 0, 16, 0, 9, 0, 10, 19, 20, 21,
+  21, 5, 0, 89, 0, 46, 12, 0, 50, 44,
+  4, 2, 0, 39, 7, 1, 49, 0, 0, 0,
+  4, 0, 0, 0, 6, 91, 22, 0, 0, 0,
+  9, 0, 71, 0, 0, 9, 0, 0, 0, 14,
+  0, 0, 23, 0, 0, 33, 0, 0, 26, 0,
+  73, 2, 0, 1, 0, 0, 0, 14, 0, 156,
+  0, 0, 5, 0, 0, 33, 46, 0, 0, 1,
+  2, 0, 0, 0, 35, 87, 15, 22, 9, 0,
+  0, 0, 0, 4, 0, 26, 27, 34, 0, 10,
+  0, 25, 0, 45, 0, 20, 0, 52, 5, 80,
+  36, 57, 0, 13, 0, 53, 0, 0, 18, 0,
+  38, 0, 42, 0, 0, 46, 0, 0, 78, 0,
+  0, 21, 42, 0, 77, 17, 26, 0, 0, 15,
+  17, 17, 0, 33, 33, 0, 40, 55, 0, 0,
+  30, 0, 0, 0, 0, 21, 0, 0, 19, 31,
+  0, 0, 3, 65, 28, 0, 0, 21, 9, 0,
+  22, 0, 0, 0, 0, 0, 0, 12, 0, 0,
+  106, 0, 25, 11, 0, 0, 0, 0, 36, 0,
+  0, 0, 0, 20, 0, 0, 0, 35, 28, 0,
+  25, 0, 6, 0, 68, 1, 9, 53, 37, 38,
+  8, 0, 43, 0, 0, 43, 7, 56, 0, 4,
+  0, 13, 10, 0, 65, 53, 0, 0, 0, 0,
+  0, 56, 0, 63, 0, 42, 23, 10, 1, 49,
+  0, 48, 0, 7, 80, 24, 0, 0, 14, 0,
+  0, 62, 18, 0, 0, 0, 0, 0, 30, 19,
+  15, 0, 0, 0, 0, 17, 1, 53, 0, 0,
+  0, 49, 63, 0, 24, 24, 20, 0, 11, 25,
+  0, 37, 36, 32, 0, 13, 32, 35, 0, 0,
+  0, 66, 17, 0, 0, 0, 0, 0, 37, 0,
+  0, 36, 37, 19, 0, 29, 0, 0, 14, 20,
+  42, 8, 3, 0, 121, 0, 63, 0, 10, 0,
+  0, 30, 54, 0, 0, 0, 0, 0, 58, 0,
+  7, 0, 28, 0, 0, 22, 10, 0, 2, 0,
+  0, 34, 90, 48, 0, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 60, 31, 0, 15, 0, 34,
+  0, 38, 22, 0, 0, 0, 0, 13, 0, 15,
+  0, 42, 9, 20, 3, 0, 31, 0, 11, 0,
+  0, 30, 0, 0, 11, 0, 36, 0, 0, 0,
+  39, 7, 39, 28, 0, 24, 0, 100, 0, 56,
+  6, 0, 40, 58, 4, 14, 0, 33, 0, 7,
+  54, 0, 0, 0, 20, 0, 0, 0, 0, 89,
+  27, 0, 0, 0, 2, 0, 51, 2, 0, 7,
+  14, 14, 0, 14, 0, 0, 0, 0, 9, 47,
+  0, 0, 11, 0, 57, 2, 5, 8, 0, 8,
+  0, 0, 0, 26, 43, 6, 20, 0, 13, 0,
+  59, 0, 10, 62, 36, 31, 3, 0, 46, 0,
+  0, 38, 0, 42, 6, 2, 0, 34, 0, 0,
+  63, 41, 15, 0, 0, 0, 0, 46, 0, 37,
+  0, 53, 25, 14, 17, 17, 0, 32, 15, 5,
+  91, 14, 0, 0, 28, 0, 0, 70, 0, 0,
+  0, 0, 0, 0, 24, 8, 0, 0, 0, 2,
+  0, 9, 17, 48, 0, 3, 0, 31, 71, 5,
+  13, 36, 17, 0, 4, 23, 26, 35, 36, 0,
+  0, 2, 17, 32, 0, 0, 2, 44, 36, 0,
+  0, 0, 12, 0, 55, 13, 24, 46, 43, 0,
+  0, 24, 0, 0, 42, 41, 44, 0, 0, 0,
+  108, 0, 71, 14, 0, 0, 0, 44, 70, 0,
+  0, 0, 0, 9, 53, 0, 0, 29, 11, 20,
+  0, 36, 26, 0, 0, 0, 0, 7, 73, 51,
+  0, 0, 16, 18, 0, 0, 0, 0, 0, 0,
+  29, 22, 0, 0, 0, 40, 0, 13, 0, 10,
+  0, 1, 22, 0, 0, 0, 35, 32, 22, 15,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  20, 0, 30, 0, 2, 0, 0, 8, 3, 20,
+  33, 0, 0, 85, 0, 28, 19, 0, 42, 48,
+  0, 18, 0, 36, 33, 9, 46, 0, 0, 0,
+  8, 0, 0, 0, 0, 81, 37, 0, 0, 0,
+  25, 0, 70, 0, 22, 26, 14, 0, 0, 8,
+  0, 0, 28, 0, 0, 18, 0, 0, 19, 0,
+  44, 20, 0, 20, 102, 0, 40, 4, 0, 12,
+  0, 0, 45, 0, 0, 35, 56, 20, 0, 0,
+  9, 0, 0, 0, 0, 189, 80, 25, 0, 0,
+  0, 31, 0, 0, 16, 61, 0, 11, 0, 30,
+  0, 40, 0, 30, 0, 28, 48, 0, 38, 21,
+  24, 29, 0, 0, 0, 80, 0, 0, 100, 0,
+  63, 0, 47, 0, 14, 23, 0, 56, 27, 66,
+  0, 1, 0, 4, 12, 26, 10, 13, 0, 0,
+  0, 47, 0, 15, 0, 0, 7, 21, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  25, 0, 18, 61, 0, 0, 17, 0, 54, 23,
+  26, 12, 6, 14, 8, 6, 0, 0, 0, 2,
+  87, 0, 36, 39, 0, 9, 0, 0, 23, 15,
+  18, 29, 0, 17, 0, 0, 0, 31, 35, 0,
+  13, 0, 8, 0, 56, 4, 16, 62, 36, 39,
+  10, 0, 30, 0, 0, 48, 4, 53, 0, 4,
+  0, 15, 0, 0, 72, 44, 0, 0, 0, 0,
+  0, 66, 0, 41, 0, 43, 20, 12, 12, 36,
+  0, 41, 0, 7, 95, 16, 0, 0, 21, 0,
+  0, 55, 9, 0, 0, 0, 0, 0, 32, 12,
+  11, 0, 0, 0, 0, 15, 10, 55, 0, 0,
+  0, 47, 64, 4, 32, 22, 15, 0, 7, 27,
+  13, 34, 54, 16, 0, 11, 39, 32, 0, 0,
+  0, 68, 22, 0, 0, 0, 0, 0, 48, 0,
+  0, 30, 26, 15, 0, 27, 0, 0, 25, 30,
+  24, 3, 1, 0, 121, 0, 65, 2, 0, 0,
+  0, 31, 59, 0, 8, 0, 0, 0, 53, 2,
+  0, 9, 30, 0, 0, 23, 15, 0, 8, 0,
+  0, 47, 79, 53, 0, 0, 0, 15, 0, 0,
+  0, 0, 0, 0, 52, 28, 0, 4, 0, 63,
+  0, 25, 0, 1, 0, 0, 25, 4, 0, 6,
+  0, 48, 20, 26, 0, 0, 19, 0, 8, 0,
+  0, 13, 0, 0, 18, 0, 16, 0, 9, 0,
+  10, 19, 20, 21, 21, 5, 0, 89, 0, 46,
+  12, 0, 50, 44, 4, 2, 0, 39, 7, 1,
+  49, 0, 0, 0, 4, 0, 0, 0, 6, 91,
+  22, 0, 0, 0, 9, 0, 71, 0, 0, 9,
+  0, 0, 0, 14, 0, 0, 23, 0, 0, 33,
+  0, 0, 26, 0, 73, 2, 0, 1, 73, 0,
+  21, 29, 10, 2, 0, 11, 74, 0, 0, 18,
+  94, 0, 0, 0, 36, 0, 0, 0, 0, 148,
+  91, 19, 0, 0, 0, 47, 0, 0, 32, 47,
+  0, 0, 27, 32, 0, 52, 0, 43, 0, 24,
+  66, 17, 51, 51, 13, 28, 0, 0, 0, 63,
+  0, 0, 62, 0, 50, 0, 39, 0, 0, 6,
+  0, 30, 12, 20, 0, 4, 0, 0, 19, 4,
+  40, 42, 0, 0, 0, 87, 0, 19, 0, 0,
+  16, 26, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 8, 0, 0, 35, 0, 15, 55, 0, 0,
+  22, 0, 52, 8, 59, 31, 3, 19, 8, 16,
+  0, 0, 0, 0, 66, 0, 18, 40, 0, 4,
+  0, 0, 51, 0, 18, 14, 0, 20, 0, 0,
+  0, 35, 28, 0, 25, 0, 6, 0, 68, 1,
+  9, 53, 37, 38, 8, 0, 43, 0, 0, 43,
+  7, 56, 0, 4, 0, 13, 10, 0, 65, 53,
+  0, 0, 0, 0, 0, 56, 0, 63, 0, 42,
+  23, 10, 1, 49, 0, 48, 0, 7, 80, 24,
+  0, 0, 14, 0, 0, 62, 18, 0, 0, 0,
+  0, 0, 30, 19, 15, 0, 0, 0, 0, 17,
+  1, 53, 0, 0, 0, 49, 63, 0, 24, 24,
+  20, 0, 11, 25, 0, 37, 36, 32, 0, 13,
+  32, 35, 0, 0, 0, 66, 17, 0, 0, 0,
+  0, 0, 37, 0, 0, 36, 37, 19, 0, 29,
+  0, 0, 14, 20, 42, 8, 3, 0, 121, 0,
+  63, 0, 10, 0, 0, 30, 54, 0, 0, 0,
+  0, 0, 58, 0, 7, 0, 28, 0, 0, 22,
+  10, 0, 2, 0, 0, 34, 90, 48, 0, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 60, 31,
+  0, 15, 0, 34, 0, 38, 22, 0, 0, 0,
+  0, 13, 0, 15, 0, 42, 9, 20, 3, 0,
+  31, 0, 11, 0, 0, 30, 0, 0, 11, 0,
+  36, 0, 0, 0, 39, 7, 39, 28, 0, 24,
+  0, 100, 0, 56, 6, 0, 40, 58, 4, 14,
+  0, 33, 0, 7, 54, 0, 0, 0, 20, 0,
+  0, 0, 0, 89, 27, 0, 0, 0, 2, 0,
+  51, 2, 0, 7, 14, 14, 0, 14, 0, 0,
+  0, 0, 9, 47, 0, 0, 11, 0, 57, 2,
+  5, 8, 47, 0, 20, 39, 5, 0, 0, 0,
+  62, 0, 0, 14, 68, 0, 0, 21, 35, 5,
+  0, 0, 0, 128, 114, 15, 0, 0, 0, 47,
+  0, 0, 20, 52, 0, 0, 50, 20, 0, 61,
+  4, 20, 4, 18, 55, 0, 26, 27, 3, 14,
+  0, 0, 0, 37, 0, 16, 61, 0, 47, 0,
+  41, 0, 0, 22, 0, 3, 20, 0, 11, 19,
+  19, 0, 54, 9, 49, 31, 0, 0, 0, 94,
+  0, 41, 0, 0, 7, 31, 0, 19, 0, 0,
+  0, 0, 0, 0, 0, 7, 19, 0, 43, 0,
+  15, 77, 0, 0, 32, 0, 35, 20, 15, 28,
+  0, 0, 0, 17, 0, 0, 0, 0, 32, 0,
+  4, 45, 0, 0, 0, 0, 48, 0, 19, 13,
+  0, 44, 70, 0, 0, 0, 0, 9, 53, 0,
+  0, 29, 11, 20, 0, 36, 26, 0, 0, 0,
+  0, 7, 73, 51, 0, 0, 16, 18, 0, 0,
+  0, 0, 0, 0, 29, 22, 0, 0, 0, 40,
+  0, 13, 0, 10, 0, 1, 22, 0, 0, 0,
+  35, 32, 22, 15, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 20, 0, 30, 0, 2, 0,
+  0, 8, 3, 20, 33, 0, 0, 85, 0, 28,
+  19, 0, 42, 48, 0, 18, 0, 36, 33, 9,
+  46, 0, 0, 0, 8, 0, 0, 0, 0, 81,
+  37, 0, 0, 0, 25, 0, 70, 0, 22, 26,
+  14, 0, 0, 8, 0, 0, 28, 0, 0, 18,
+  0, 0, 19, 0, 44, 20, 0, 20, 102, 0,
+  40, 4, 0, 12, 0, 0, 45, 0, 0, 35,
+  56, 20, 0, 0, 9, 0, 0, 0, 0, 189,
+  80, 25, 0, 0, 0, 31, 0, 0, 16, 61,
+  0, 11, 0, 30, 0, 40, 0, 30, 0, 28,
+  48, 0, 38, 21, 24, 29, 0, 0, 0, 80,
+  0, 0, 100, 0, 63, 0, 47, 0, 14, 23,
+  0, 56, 27, 66, 0, 1, 0, 4, 12, 26,
+  10, 13, 0, 0, 0, 47, 0, 15, 0, 0,
+  7, 21, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 25, 0, 18, 61, 0, 0,
+  17, 0, 54, 23, 26, 12, 6, 14, 8, 6,
+  0, 0, 0, 2, 87, 0, 36, 39, 0, 9,
+  0, 0, 23, 15, 18, 29, 9, 0, 0, 9,
+  0, 65, 0, 0, 41, 0, 0, 0, 45, 38,
+  0, 38, 32, 25, 0, 0, 8, 14, 5, 56,
+  28, 0, 0, 19, 0, 0, 0, 21, 10, 40,
+  27, 4, 0, 33, 0, 8, 9, 4, 50, 58,
+  50, 77, 14, 17, 0, 0, 0, 0, 0, 0,
+  0, 0, 54, 0, 0, 0, 4, 43, 0, 0,
+  0, 0, 0, 0, 12, 0, 54, 0, 14, 11,
+  0, 28, 0, 28, 0, 28, 0, 16, 0, 39,
+  0, 0, 31, 0, 14, 62, 0, 63, 0, 0,
+  13, 17, 0, 0, 0, 56, 19, 0, 0, 0,
+  17, 0, 0, 4, 0, 40, 0, 0, 0, 9,
+  0, 0, 61, 0, 8, 0, 37, 0, 3, 0,
+  29, 10, 44, 0, 0, 31, 59, 0, 8, 0,
+  0, 0, 53, 2, 0, 9, 30, 0, 0, 23,
+  15, 0, 8, 0, 0, 47, 79, 53, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 0, 52, 28,
+  0, 4, 0, 63, 0, 25, 0, 1, 0, 0,
+  25, 4, 0, 6, 0, 48, 20, 26, 0, 0,
+  19, 0, 8, 0, 0, 13, 0, 0, 18, 0,
+  16, 0, 9, 0, 10, 19, 20, 21, 21, 5,
+  0, 89, 0, 46, 12, 0, 50, 44, 4, 2,
+  0, 39, 7, 1, 49, 0, 0, 0, 4, 0,
+  0, 0, 6, 91, 22, 0, 0, 0, 9, 0,
+  71, 0, 0, 9, 0, 0, 0, 14, 0, 0,
+  23, 0, 0, 33, 0, 0, 26, 0, 73, 2,
+  0, 1, 73, 0, 21, 29, 10, 2, 0, 11,
+  74, 0, 0, 18, 94, 0, 0, 0, 36, 0,
+  0, 0, 0, 148, 91, 19, 0, 0, 0, 47,
+  0, 0, 32, 47, 0, 0, 27, 32, 0, 52,
+  0, 43, 0, 24, 66, 17, 51, 51, 13, 28,
+  0, 0, 0, 63, 0, 0, 62, 0, 50, 0,
+  39, 0, 0, 6, 0, 30, 12, 20, 0, 4,
+  0, 0, 19, 4, 40, 42, 0, 0, 0, 87,
+  0, 19, 0, 0, 16, 26, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 8, 0, 0, 35, 0,
+  15, 55, 0, 0, 22, 0, 52, 8, 59, 31,
+  3, 19, 8, 16, 0, 0, 0, 0, 66, 0,
+  18, 40, 0, 4, 0, 0, 51, 0, 18, 14,
+  0, 0, 0, 29, 1, 29, 8, 0, 54, 0,
+  0, 0, 67, 10, 9, 37, 50, 41, 0, 0,
+  0, 0, 0, 46, 33, 11, 2, 31, 0, 0,
+  8, 47, 45, 22, 0, 0, 0, 51, 0, 0,
+  0, 0, 95, 63, 29, 90, 0, 25, 0, 0,
+  0, 1, 11, 3, 0, 0, 29, 0, 0, 1,
+  0, 38, 0, 0, 3, 0, 26, 25, 4, 0,
+  48, 0, 30, 61, 0, 8, 0, 30, 0, 18,
+  0, 0, 0, 54, 0, 2, 33, 0, 0, 26,
+  0, 44, 0, 32, 0, 43, 0, 0, 0, 39,
+  13, 0, 8, 0, 38, 0, 3, 19, 0, 10,
+  9, 7, 0, 4, 0, 0, 50, 0, 0, 18,
+  13, 0, 27, 0, 42, 0, 53, 0, 0, 30,
+  54, 0, 0, 0, 0, 0, 58, 0, 7, 0,
+  28, 0, 0, 22, 10, 0, 2, 0, 0, 34,
+  90, 48, 0, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 60, 31, 0, 15, 0, 34, 0, 38,
+  22, 0, 0, 0, 0, 13, 0, 15, 0, 42,
+  9, 20, 3, 0, 31, 0, 11, 0, 0, 30,
+  0, 0, 11, 0, 36, 0, 0, 0, 39, 7,
+  39, 28, 0, 24, 0, 100, 0, 56, 6, 0,
+  40, 58, 4, 14, 0, 33, 0, 7, 54, 0,
+  0, 0, 20, 0, 0, 0, 0, 89, 27, 0,
+  0, 0, 2, 0, 51, 2, 0, 7, 14, 14,
+  0, 14, 0, 0, 0, 0, 9, 47, 0, 0,
+  11, 0, 57, 2, 5, 8, 47, 0, 20, 39,
+  5, 0, 0, 0, 62, 0, 0, 14, 68, 0,
+  0, 21, 35, 5, 0, 0, 0, 128, 114, 15,
+  0, 0, 0, 47, 0, 0, 20, 52, 0, 0,
+  50, 20, 0, 61, 4, 20, 4, 18, 55, 0,
+  26, 27, 3, 14, 0, 0, 0, 37, 0, 16,
+  61, 0, 47, 0, 41, 0, 0, 22, 0, 3,
+  20, 0, 11, 19, 19, 0, 54, 9, 49, 31,
+  0, 0, 0, 94, 0, 41, 0, 0, 7, 31,
+  0, 19, 0, 0, 0, 0, 0, 0, 0, 7,
+  19, 0, 43, 0, 15, 77, 0, 0, 32, 0,
+  35, 20, 15, 28, 0, 0, 0, 17, 0, 0,
+  0, 0, 32, 0, 4, 45, 0, 0, 0, 0,
+  48, 0, 19, 13, 7, 0, 3, 44, 17, 25,
+  0, 0, 33, 5, 0, 0, 79, 30, 6, 52,
+  69, 29, 0, 5, 0, 0, 0, 27, 43, 42,
+  0, 35, 0, 15, 23, 80, 17, 52, 0, 11,
+  0, 71, 0, 0, 0, 0, 79, 35, 26, 18,
+  0, 33, 18, 0, 0, 0, 0, 36, 0, 0,
+  12, 0, 0, 50, 0, 25, 11, 0, 0, 0,
+  34, 59, 45, 0, 6, 16, 27, 39, 11, 5,
+  0, 27, 0, 41, 0, 6, 0, 50, 30, 18,
+  19, 0, 0, 8, 0, 13, 0, 78, 0, 51,
+  3, 0, 0, 35, 0, 0, 32, 0, 33, 0,
+  0, 19, 0, 0, 22, 0, 0, 0, 0, 0,
+  41, 0, 0, 2, 9, 6, 34, 0, 46, 1,
+  49, 0, 102, 0, 40, 4, 0, 12, 0, 0,
+  45, 0, 0, 35, 56, 20, 0, 0, 9, 0,
+  0, 0, 0, 189, 80, 25, 0, 0, 0, 31,
+  0, 0, 16, 61, 0, 11, 0, 30, 0, 40,
+  0, 30, 0, 28, 48, 0, 38, 21, 24, 29,
+  0, 0, 0, 80, 0, 0, 100, 0, 63, 0,
+  47, 0, 14, 23, 0, 56, 27, 66, 0, 1,
+  0, 4, 12, 26, 10, 13, 0, 0, 0, 47,
+  0, 15, 0, 0, 7, 21, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 25, 0,
+  18, 61, 0, 0, 17, 0, 54, 23, 26, 12,
+  6, 14, 8, 6, 0, 0, 0, 2, 87, 0,
+  36, 39, 0, 9, 0, 0, 23, 15, 18, 29,
+  9, 0, 0, 9, 0, 65, 0, 0, 41, 0,
+  0, 0, 45, 38, 0, 38, 32, 25, 0, 0,
+  8, 14, 5, 56, 28, 0, 0, 19, 0, 0,
+  0, 21, 10, 40, 27, 4, 0, 33, 0, 8,
+  9, 4, 50, 58, 50, 77, 14, 17, 0, 0,
+  0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
+  4, 43, 0, 0, 0, 0, 0, 0, 12, 0,
+  54, 0, 14, 11, 0, 28, 0, 28, 0, 28,
+  0, 16, 0, 39, 0, 0, 31, 0, 14, 62,
+  0, 63, 0, 0, 13, 17, 0, 0, 0, 56,
+  19, 0, 0, 0, 17, 0, 0, 4, 0, 40,
+  0, 0, 0, 9, 0, 0, 61, 0, 8, 0,
+  37, 0, 3, 0, 29, 10, 44, 0, 0, 14,
+  0, 0, 35, 12, 0, 0, 40, 0, 0, 15,
+  31, 88, 14, 51, 40, 12, 0, 18, 47, 0,
+  19, 50, 3, 20, 0, 2, 0, 0, 0, 0,
+  0, 38, 7, 0, 3, 31, 0, 29, 36, 1,
+  0, 74, 29, 39, 8, 0, 0, 0, 18, 2,
+  39, 14, 0, 6, 37, 0, 0, 0, 0, 4,
+  5, 0, 0, 0, 26, 0, 49, 0, 0, 0,
+  3, 3, 17, 22, 0, 17, 0, 21, 27, 60,
+  0, 26, 24, 3, 57, 0, 52, 33, 0, 62,
+  14, 8, 23, 27, 0, 0, 26, 70, 5, 0,
+  0, 0, 0, 0, 0, 16, 0, 35, 0, 0,
+  0, 12, 0, 0, 17, 3, 26, 0, 0, 0,
+  20, 0, 35, 8, 37, 0, 73, 0, 21, 29,
+  10, 2, 0, 11, 74, 0, 0, 18, 94, 0,
+  0, 0, 36, 0, 0, 0, 0, 148, 91, 19,
+  0, 0, 0, 47, 0, 0, 32, 47, 0, 0,
+  27, 32, 0, 52, 0, 43, 0, 24, 66, 17,
+  51, 51, 13, 28, 0, 0, 0, 63, 0, 0,
+  62, 0, 50, 0, 39, 0, 0, 6, 0, 30,
+  12, 20, 0, 4, 0, 0, 19, 4, 40, 42,
+  0, 0, 0, 87, 0, 19, 0, 0, 16, 26,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 8,
+  0, 0, 35, 0, 15, 55, 0, 0, 22, 0,
+  52, 8, 59, 31, 3, 19, 8, 16, 0, 0,
+  0, 0, 66, 0, 18, 40, 0, 4, 0, 0,
+  51, 0, 18, 14, 0, 0, 0, 29, 1, 29,
+  8, 0, 54, 0, 0, 0, 67, 10, 9, 37,
+  50, 41, 0, 0, 0, 0, 0, 46, 33, 11,
+  2, 31, 0, 0, 8, 47, 45, 22, 0, 0,
+  0, 51, 0, 0, 0, 0, 95, 63, 29, 90,
+  0, 25, 0, 0, 0, 1, 11, 3, 0, 0,
+  29, 0, 0, 1, 0, 38, 0, 0, 3, 0,
+  26, 25, 4, 0, 48, 0, 30, 61, 0, 8,
+  0, 30, 0, 18, 0, 0, 0, 54, 0, 2,
+  33, 0, 0, 26, 0, 44, 0, 32, 0, 43,
+  0, 0, 0, 39, 13, 0, 8, 0, 38, 0,
+  3, 19, 0, 10, 9, 7, 0, 4, 0, 0,
+  50, 0, 0, 18, 13, 0, 27, 0, 42, 0,
+  53, 0, 0, 0, 0, 5, 36, 43, 0, 0,
+  0, 0, 0, 1, 24, 87, 0, 16, 36, 0,
+  0, 9, 34, 0, 19, 29, 0, 11, 0, 0,
+  0, 24, 7, 0, 0, 36, 0, 0, 0, 26,
+  0, 8, 20, 9, 0, 66, 26, 13, 0, 36,
+  0, 0, 2, 42, 7, 10, 0, 0, 26, 0,
+  0, 0, 0, 31, 20, 0, 10, 0, 10, 15,
+  33, 0, 6, 11, 0, 7, 9, 11, 0, 16,
+  0, 29, 9, 31, 0, 20, 48, 0, 63, 19,
+  21, 0, 0, 52, 14, 4, 22, 50, 0, 0,
+  0, 71, 13, 0, 0, 0, 0, 0, 0, 1,
+  0, 0, 3, 0, 0, 16, 0, 8, 57, 0,
+  8, 0, 0, 0, 0, 0, 20, 1, 25, 0,
+  47, 0, 20, 39, 5, 0, 0, 0, 62, 0,
+  0, 14, 68, 0, 0, 21, 35, 5, 0, 0,
+  0, 128, 114, 15, 0, 0, 0, 47, 0, 0,
+  20, 52, 0, 0, 50, 20, 0, 61, 4, 20,
+  4, 18, 55, 0, 26, 27, 3, 14, 0, 0,
+  0, 37, 0, 16, 61, 0, 47, 0, 41, 0,
+  0, 22, 0, 3, 20, 0, 11, 19, 19, 0,
+  54, 9, 49, 31, 0, 0, 0, 94, 0, 41,
+  0, 0, 7, 31, 0, 19, 0, 0, 0, 0,
+  0, 0, 0, 7, 19, 0, 43, 0, 15, 77,
+  0, 0, 32, 0, 35, 20, 15, 28, 0, 0,
+  0, 17, 0, 0, 0, 0, 32, 0, 4, 45,
+  0, 0, 0, 0, 48, 0, 19, 13, 7, 0,
+  3, 44, 17, 25, 0, 0, 33, 5, 0, 0,
+  79, 30, 6, 52, 69, 29, 0, 5, 0, 0,
+  0, 27, 43, 42, 0, 35, 0, 15, 23, 80,
+  17, 52, 0, 11, 0, 71, 0, 0, 0, 0,
+  79, 35, 26, 18, 0, 33, 18, 0, 0, 0,
+  0, 36, 0, 0, 12, 0, 0, 50, 0, 25,
+  11, 0, 0, 0, 34, 59, 45, 0, 6, 16,
+  27, 39, 11, 5, 0, 27, 0, 41, 0, 6,
+  0, 50, 30, 18, 19, 0, 0, 8, 0, 13,
+  0, 78, 0, 51, 3, 0, 0, 35, 0, 0,
+  32, 0, 33, 0, 0, 19, 0, 0, 22, 0,
+  0, 0, 0, 0, 41, 0, 0, 2, 9, 6,
+  34, 0, 46, 1, 49, 0, 0, 0, 10, 17,
+  54, 56, 0, 0, 20, 0, 5, 0, 53, 99,
+  5, 43, 52, 0, 0, 5, 28, 0, 0, 23,
+  0, 24, 0, 5, 0, 39, 8, 0, 0, 50,
+  0, 0, 0, 26, 0, 39, 0, 24, 13, 63,
+  23, 0, 2, 41, 6, 0, 11, 51, 3, 40,
+  0, 0, 3, 3, 2, 3, 0, 28, 5, 0,
+  0, 0, 3, 0, 53, 0, 0, 21, 8, 0,
+  22, 6, 0, 28, 0, 59, 6, 44, 0, 0,
+  63, 6, 53, 24, 33, 0, 0, 30, 0, 30,
+  0, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+  0, 0, 0, 1, 0, 0, 20, 0, 0, 6,
+  0, 0, 60, 0, 0, 0, 34, 0, 15, 0,
+  39, 0, 0, 0, 9, 0, 0, 9, 0, 65,
+  0, 0, 41, 0, 0, 0, 45, 38, 0, 38,
+  32, 25, 0, 0, 8, 14, 5, 56, 28, 0,
+  0, 19, 0, 0, 0, 21, 10, 40, 27, 4,
+  0, 33, 0, 8, 9, 4, 50, 58, 50, 77,
+  14, 17, 0, 0, 0, 0, 0, 0, 0, 0,
+  54, 0, 0, 0, 4, 43, 0, 0, 0, 0,
+  0, 0, 12, 0, 54, 0, 14, 11, 0, 28,
+  0, 28, 0, 28, 0, 16, 0, 39, 0, 0,
+  31, 0, 14, 62, 0, 63, 0, 0, 13, 17,
+  0, 0, 0, 56, 19, 0, 0, 0, 17, 0,
+  0, 4, 0, 40, 0, 0, 0, 9, 0, 0,
+  61, 0, 8, 0, 37, 0, 3, 0, 29, 10,
+  44, 0, 0, 14, 0, 0, 35, 12, 0, 0,
+  40, 0, 0, 15, 31, 88, 14, 51, 40, 12,
+  0, 18, 47, 0, 19, 50, 3, 20, 0, 2,
+  0, 0, 0, 0, 0, 38, 7, 0, 3, 31,
+  0, 29, 36, 1, 0, 74, 29, 39, 8, 0,
+  0, 0, 18, 2, 39, 14, 0, 6, 37, 0,
+  0, 0, 0, 4, 5, 0, 0, 0, 26, 0,
+  49, 0, 0, 0, 3, 3, 17, 22, 0, 17,
+  0, 21, 27, 60, 0, 26, 24, 3, 57, 0,
+  52, 33, 0, 62, 14, 8, 23, 27, 0, 0,
+  26, 70, 5, 0, 0, 0, 0, 0, 0, 16,
+  0, 35, 0, 0, 0, 12, 0, 0, 17, 3,
+  26, 0, 0, 0, 20, 0, 35, 8, 37, 0,
+  24, 0, 53, 0, 32, 0, 0, 0, 25, 0,
+  0, 1, 9, 122, 15, 0, 27, 21, 0, 8,
+  41, 13, 69, 7, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 5, 0, 0, 0, 4, 0, 26,
+  14, 10, 0, 48, 14, 0, 0, 0, 0, 0,
+  37, 104, 0, 37, 0, 0, 9, 6, 3, 0,
+  0, 0, 33, 0, 50, 22, 0, 0, 24, 22,
+  0, 1, 0, 0, 27, 0, 0, 13, 0, 41,
+  14, 36, 0, 5, 48, 0, 45, 11, 72, 0,
+  0, 2, 0, 0, 0, 25, 0, 0, 41, 57,
+  0, 0, 0, 0, 0, 0, 0, 10, 1, 0,
+  35, 0, 0, 0, 51, 0, 55, 0, 5, 0,
+  0, 0, 0, 0, 28, 1, 16, 0, 0, 0,
+  0, 29, 1, 29, 8, 0, 54, 0, 0, 0,
+  67, 10, 9, 37, 50, 41, 0, 0, 0, 0,
+  0, 46, 33, 11, 2, 31, 0, 0, 8, 47,
+  45, 22, 0, 0, 0, 51, 0, 0, 0, 0,
+  95, 63, 29, 90, 0, 25, 0, 0, 0, 1,
+  11, 3, 0, 0, 29, 0, 0, 1, 0, 38,
+  0, 0, 3, 0, 26, 25, 4, 0, 48, 0,
+  30, 61, 0, 8, 0, 30, 0, 18, 0, 0,
+  0, 54, 0, 2, 33, 0, 0, 26, 0, 44,
+  0, 32, 0, 43, 0, 0, 0, 39, 13, 0,
+  8, 0, 38, 0, 3, 19, 0, 10, 9, 7,
+  0, 4, 0, 0, 50, 0, 0, 18, 13, 0,
+  27, 0, 42, 0, 53, 0, 0, 0, 0, 5,
+  36, 43, 0, 0, 0, 0, 0, 1, 24, 87,
+  0, 16, 36, 0, 0, 9, 34, 0, 19, 29,
+  0, 11, 0, 0, 0, 24, 7, 0, 0, 36,
+  0, 0, 0, 26, 0, 8, 20, 9, 0, 66,
+  26, 13, 0, 36, 0, 0, 2, 42, 7, 10,
+  0, 0, 26, 0, 0, 0, 0, 31, 20, 0,
+  10, 0, 10, 15, 33, 0, 6, 11, 0, 7,
+  9, 11, 0, 16, 0, 29, 9, 31, 0, 20,
+  48, 0, 63, 19, 21, 0, 0, 52, 14, 4,
+  22, 50, 0, 0, 0, 71, 13, 0, 0, 0,
+  0, 0, 0, 1, 0, 0, 3, 0, 0, 16,
+  0, 8, 57, 0, 8, 0, 0, 0, 0, 0,
+  20, 1, 25, 0, 15, 8, 22, 22, 74, 0,
+  0, 1, 31, 0, 0, 0, 40, 118, 28, 13,
+  44, 0, 0, 9, 37, 0, 0, 12, 0, 12,
+  0, 24, 0, 17, 2, 0, 0, 38, 0, 0,
+  0, 6, 0, 44, 0, 22, 0, 57, 17, 0,
+  18, 21, 0, 0, 25, 88, 0, 60, 0, 0,
+  0, 21, 0, 0, 0, 0, 0, 0, 0, 3,
+  13, 0, 39, 0, 0, 18, 0, 0, 44, 0,
+  0, 3, 0, 44, 27, 45, 2, 0, 52, 4,
+  48, 24, 64, 0, 0, 0, 0, 16, 0, 45,
+  3, 2, 31, 57, 0, 0, 0, 0, 0, 0,
+  0, 10, 30, 7, 17, 0, 0, 0, 33, 0,
+  43, 0, 0, 0, 30, 0, 35, 0, 54, 0,
+  0, 0, 7, 0, 3, 44, 17, 25, 0, 0,
+  33, 5, 0, 0, 79, 30, 6, 52, 69, 29,
+  0, 5, 0, 0, 0, 27, 43, 42, 0, 35,
+  0, 15, 23, 80, 17, 52, 0, 11, 0, 71,
+  0, 0, 0, 0, 79, 35, 26, 18, 0, 33,
+  18, 0, 0, 0, 0, 36, 0, 0, 12, 0,
+  0, 50, 0, 25, 11, 0, 0, 0, 34, 59,
+  45, 0, 6, 16, 27, 39, 11, 5, 0, 27,
+  0, 41, 0, 6, 0, 50, 30, 18, 19, 0,
+  0, 8, 0, 13, 0, 78, 0, 51, 3, 0,
+  0, 35, 0, 0, 32, 0, 33, 0, 0, 19,
+  0, 0, 22, 0, 0, 0, 0, 0, 41, 0,
+  0, 2, 9, 6, 34, 0, 46, 1, 49, 0,
+  0, 0, 10, 17, 54, 56, 0, 0, 20, 0,
+  5, 0, 53, 99, 5, 43, 52, 0, 0, 5,
+  28, 0, 0, 23, 0, 24, 0, 5, 0, 39,
+  8, 0, 0, 50, 0, 0, 0, 26, 0, 39,
+  0, 24, 13, 63, 23, 0, 2, 41, 6, 0,
+  11, 51, 3, 40, 0, 0, 3, 3, 2, 3,
+  0, 28, 5, 0, 0, 0, 3, 0, 53, 0,
+  0, 21, 8, 0, 22, 6, 0, 28, 0, 59,
+  6, 44, 0, 0, 63, 6, 53, 24, 33, 0,
+  0, 30, 0, 30, 0, 66, 0, 0, 0, 63,
+  0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+  20, 0, 0, 6, 0, 0, 60, 0, 0, 0,
+  34, 0, 15, 0, 39, 0, 0, 0, 0, 16,
+  49, 37, 80, 0, 0, 1, 64, 3, 2, 0,
+  54, 91, 27, 51, 45, 0, 0, 9, 23, 0,
+  0, 27, 0, 25, 0, 38, 0, 3, 12, 0,
+  0, 38, 0, 0, 0, 15, 0, 58, 0, 15,
+  0, 46, 0, 0, 33, 9, 0, 0, 4, 73,
+  21, 61, 0, 0, 0, 51, 0, 15, 0, 0,
+  0, 0, 0, 0, 58, 0, 53, 0, 0, 0,
+  0, 25, 36, 0, 0, 19, 0, 23, 49, 49,
+  13, 0, 41, 40, 36, 29, 68, 0, 0, 29,
+  0, 26, 0, 29, 0, 0, 3, 71, 0, 0,
+  0, 0, 0, 0, 0, 17, 24, 30, 27, 0,
+  0, 0, 28, 0, 19, 0, 0, 0, 24, 0,
+  70, 0, 63, 3, 0, 0, 0, 14, 0, 0,
+  35, 12, 0, 0, 40, 0, 0, 15, 31, 88,
+  14, 51, 40, 12, 0, 18, 47, 0, 19, 50,
+  3, 20, 0, 2, 0, 0, 0, 0, 0, 38,
+  7, 0, 3, 31, 0, 29, 36, 1, 0, 74,
+  29, 39, 8, 0, 0, 0, 18, 2, 39, 14,
+  0, 6, 37, 0, 0, 0, 0, 4, 5, 0,
+  0, 0, 26, 0, 49, 0, 0, 0, 3, 3,
+  17, 22, 0, 17, 0, 21, 27, 60, 0, 26,
+  24, 3, 57, 0, 52, 33, 0, 62, 14, 8,
+  23, 27, 0, 0, 26, 70, 5, 0, 0, 0,
+  0, 0, 0, 16, 0, 35, 0, 0, 0, 12,
+  0, 0, 17, 3, 26, 0, 0, 0, 20, 0,
+  35, 8, 37, 0, 24, 0, 53, 0, 32, 0,
+  0, 0, 25, 0, 0, 1, 9, 122, 15, 0,
+  27, 21, 0, 8, 41, 13, 69, 7, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 5, 0, 0,
+  0, 4, 0, 26, 14, 10, 0, 48, 14, 0,
+  0, 0, 0, 0, 37, 104, 0, 37, 0, 0,
+  9, 6, 3, 0, 0, 0, 33, 0, 50, 22,
+  0, 0, 24, 22, 0, 1, 0, 0, 27, 0,
+  0, 13, 0, 41, 14, 36, 0, 5, 48, 0,
+  45, 11, 72, 0, 0, 2, 0, 0, 0, 25,
+  0, 0, 41, 57, 0, 0, 0, 0, 0, 0,
+  0, 10, 1, 0, 35, 0, 0, 0, 51, 0,
+  55, 0, 5, 0, 0, 0, 0, 0, 28, 1,
+  16, 0, 30, 0, 17, 10, 31, 0, 0, 0,
+  35, 0, 0, 3, 12, 104, 13, 0, 18, 16,
+  0, 5, 51, 0, 33, 3, 0, 0, 0, 16,
+  0, 15, 0, 9, 0, 7, 0, 0, 0, 0,
+  0, 7, 0, 12, 0, 50, 13, 0, 0, 0,
+  0, 0, 32, 102, 0, 61, 0, 0, 22, 15,
+  0, 0, 0, 0, 29, 0, 32, 22, 10, 15,
+  12, 12, 0, 0, 0, 0, 42, 0, 0, 0,
+  0, 33, 26, 38, 0, 3, 31, 0, 30, 10,
+  63, 12, 0, 0, 0, 0, 0, 25, 23, 0,
+  69, 64, 0, 0, 2, 0, 4, 5, 0, 9,
+  49, 0, 33, 0, 0, 3, 60, 0, 68, 0,
+  0, 0, 8, 0, 0, 0, 49, 3, 11, 0,
+  0, 0, 0, 5, 36, 43, 0, 0, 0, 0,
+  0, 1, 24, 87, 0, 16, 36, 0, 0, 9,
+  34, 0, 19, 29, 0, 11, 0, 0, 0, 24,
+  7, 0, 0, 36, 0, 0, 0, 26, 0, 8,
+  20, 9, 0, 66, 26, 13, 0, 36, 0, 0,
+  2, 42, 7, 10, 0, 0, 26, 0, 0, 0,
+  0, 31, 20, 0, 10, 0, 10, 15, 33, 0,
+  6, 11, 0, 7, 9, 11, 0, 16, 0, 29,
+  9, 31, 0, 20, 48, 0, 63, 19, 21, 0,
+  0, 52, 14, 4, 22, 50, 0, 0, 0, 71,
+  13, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+  3, 0, 0, 16, 0, 8, 57, 0, 8, 0,
+  0, 0, 0, 0, 20, 1, 25, 0, 15, 8,
+  22, 22, 74, 0, 0, 1, 31, 0, 0, 0,
+  40, 118, 28, 13, 44, 0, 0, 9, 37, 0,
+  0, 12, 0, 12, 0, 24, 0, 17, 2, 0,
+  0, 38, 0, 0, 0, 6, 0, 44, 0, 22,
+  0, 57, 17, 0, 18, 21, 0, 0, 25, 88,
+  0, 60, 0, 0, 0, 21, 0, 0, 0, 0,
+  0, 0, 0, 3, 13, 0, 39, 0, 0, 18,
+  0, 0, 44, 0, 0, 3, 0, 44, 27, 45,
+  2, 0, 52, 4, 48, 24, 64, 0, 0, 0,
+  0, 16, 0, 45, 3, 2, 31, 57, 0, 0,
+  0, 0, 0, 0, 0, 10, 30, 7, 17, 0,
+  0, 0, 33, 0, 43, 0, 0, 0, 30, 0,
+  35, 0, 54, 0, 0, 0, 0, 42, 26, 36,
+  66, 0, 0, 14, 62, 8, 0, 3, 37, 89,
+  51, 42, 59, 7, 0, 10, 42, 0, 0, 21,
+  16, 33, 0, 45, 0, 0, 4, 0, 0, 27,
+  0, 0, 0, 13, 0, 62, 0, 3, 0, 70,
+  16, 0, 32, 0, 0, 0, 21, 64, 8, 79,
+  0, 0, 0, 31, 0, 20, 0, 0, 0, 0,
+  0, 0, 49, 0, 44, 0, 0, 0, 0, 2,
+  62, 0, 0, 25, 0, 37, 50, 81, 8, 1,
+  28, 19, 26, 9, 59, 14, 0, 0, 0, 31,
+  0, 46, 17, 31, 61, 56, 0, 0, 3, 0,
+  4, 0, 0, 6, 50, 28, 14, 0, 0, 0,
+  10, 0, 0, 0, 0, 0, 7, 1, 83, 0,
+  80, 2, 9, 0, 0, 0, 10, 17, 54, 56,
+  0, 0, 20, 0, 5, 0, 53, 99, 5, 43,
+  52, 0, 0, 5, 28, 0, 0, 23, 0, 24,
+  0, 5, 0, 39, 8, 0, 0, 50, 0, 0,
+  0, 26, 0, 39, 0, 24, 13, 63, 23, 0,
+  2, 41, 6, 0, 11, 51, 3, 40, 0, 0,
+  3, 3, 2, 3, 0, 28, 5, 0, 0, 0,
+  3, 0, 53, 0, 0, 21, 8, 0, 22, 6,
+  0, 28, 0, 59, 6, 44, 0, 0, 63, 6,
+  53, 24, 33, 0, 0, 30, 0, 30, 0, 66,
+  0, 0, 0, 63, 0, 0, 0, 0, 0, 0,
+  0, 1, 0, 0, 20, 0, 0, 6, 0, 0,
+  60, 0, 0, 0, 34, 0, 15, 0, 39, 0,
+  0, 0, 0, 16, 49, 37, 80, 0, 0, 1,
+  64, 3, 2, 0, 54, 91, 27, 51, 45, 0,
+  0, 9, 23, 0, 0, 27, 0, 25, 0, 38,
+  0, 3, 12, 0, 0, 38, 0, 0, 0, 15,
+  0, 58, 0, 15, 0, 46, 0, 0, 33, 9,
+  0, 0, 4, 73, 21, 61, 0, 0, 0, 51,
+  0, 15, 0, 0, 0, 0, 0, 0, 58, 0,
+  53, 0, 0, 0, 0, 25, 36, 0, 0, 19,
+  0, 23, 49, 49, 13, 0, 41, 40, 36, 29,
+  68, 0, 0, 29, 0, 26, 0, 29, 0, 0,
+  3, 71, 0, 0, 0, 0, 0, 0, 0, 17,
+  24, 30, 27, 0, 0, 0, 28, 0, 19, 0,
+  0, 0, 24, 0, 70, 0, 63, 3, 0, 0,
+  0, 17, 93, 43, 53, 0, 0, 8, 55, 26,
+  0, 0, 17, 57, 20, 55, 57, 27, 0, 29,
+  14, 0, 0, 5, 16, 11, 6, 56, 0, 0,
+  0, 0, 0, 8, 0, 0, 0, 41, 0, 41,
+  0, 0, 0, 42, 0, 5, 36, 0, 0, 0,
+  2, 40, 0, 36, 0, 0, 0, 42, 0, 17,
+  0, 0, 0, 0, 0, 0, 82, 0, 42, 17,
+  0, 0, 1, 48, 33, 0, 0, 61, 0, 0,
+  38, 68, 6, 58, 20, 52, 28, 25, 45, 0,
+  0, 24, 0, 24, 0, 8, 0, 6, 4, 57,
+  8, 0, 0, 0, 0, 2, 0, 5, 16, 36,
+  9, 0, 0, 0, 13, 0, 5, 0, 0, 0,
+  0, 0, 58, 0, 58, 12, 0, 0, 24, 0,
+  53, 0, 32, 0, 0, 0, 25, 0, 0, 1,
+  9, 122, 15, 0, 27, 21, 0, 8, 41, 13,
+  69, 7, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 5, 0, 0, 0, 4, 0, 26, 14, 10,
+  0, 48, 14, 0, 0, 0, 0, 0, 37, 104,
+  0, 37, 0, 0, 9, 6, 3, 0, 0, 0,
+  33, 0, 50, 22, 0, 0, 24, 22, 0, 1,
+  0, 0, 27, 0, 0, 13, 0, 41, 14, 36,
+  0, 5, 48, 0, 45, 11, 72, 0, 0, 2,
+  0, 0, 0, 25, 0, 0, 41, 57, 0, 0,
+  0, 0, 0, 0, 0, 10, 1, 0, 35, 0,
+  0, 0, 51, 0, 55, 0, 5, 0, 0, 0,
+  0, 0, 28, 1, 16, 0, 30, 0, 17, 10,
+  31, 0, 0, 0, 35, 0, 0, 3, 12, 104,
+  13, 0, 18, 16, 0, 5, 51, 0, 33, 3,
+  0, 0, 0, 16, 0, 15, 0, 9, 0, 7,
+  0, 0, 0, 0, 0, 7, 0, 12, 0, 50,
+  13, 0, 0, 0, 0, 0, 32, 102, 0, 61,
+  0, 0, 22, 15, 0, 0, 0, 0, 29, 0,
+  32, 22, 10, 15, 12, 12, 0, 0, 0, 0,
+  42, 0, 0, 0, 0, 33, 26, 38, 0, 3,
+  31, 0, 30, 10, 63, 12, 0, 0, 0, 0,
+  0, 25, 23, 0, 69, 64, 0, 0, 2, 0,
+  4, 5, 0, 9, 49, 0, 33, 0, 0, 3,
+  60, 0, 68, 0, 0, 0, 8, 0, 0, 0,
+  49, 3, 11, 0, 0, 22, 0, 46, 29, 0,
+  0, 10, 69, 0, 0, 23, 38, 83, 24, 20,
+  35, 2, 0, 9, 58, 0, 0, 0, 4, 48,
+  0, 23, 0, 8, 10, 0, 0, 43, 1, 0,
+  0, 4, 0, 24, 0, 21, 0, 69, 0, 0,
+  10, 17, 0, 0, 39, 72, 4, 92, 0, 0,
+  6, 27, 0, 37, 0, 0, 0, 0, 0, 8,
+  23, 24, 37, 0, 0, 3, 0, 0, 58, 0,
+  0, 14, 0, 39, 58, 70, 0, 0, 36, 5,
+  31, 21, 43, 20, 8, 4, 0, 16, 0, 28,
+  38, 0, 72, 48, 0, 0, 6, 0, 2, 0,
+  0, 22, 64, 11, 22, 0, 0, 9, 42, 0,
+  28, 0, 0, 0, 25, 29, 79, 0, 79, 5,
+  10, 0, 15, 8, 22, 22, 74, 0, 0, 1,
+  31, 0, 0, 0, 40, 118, 28, 13, 44, 0,
+  0, 9, 37, 0, 0, 12, 0, 12, 0, 24,
+  0, 17, 2, 0, 0, 38, 0, 0, 0, 6,
+  0, 44, 0, 22, 0, 57, 17, 0, 18, 21,
+  0, 0, 25, 88, 0, 60, 0, 0, 0, 21,
+  0, 0, 0, 0, 0, 0, 0, 3, 13, 0,
+  39, 0, 0, 18, 0, 0, 44, 0, 0, 3,
+  0, 44, 27, 45, 2, 0, 52, 4, 48, 24,
+  64, 0, 0, 0, 0, 16, 0, 45, 3, 2,
+  31, 57, 0, 0, 0, 0, 0, 0, 0, 10,
+  30, 7, 17, 0, 0, 0, 33, 0, 43, 0,
+  0, 0, 30, 0, 35, 0, 54, 0, 0, 0,
+  0, 42, 26, 36, 66, 0, 0, 14, 62, 8,
+  0, 3, 37, 89, 51, 42, 59, 7, 0, 10,
+  42, 0, 0, 21, 16, 33, 0, 45, 0, 0,
+  4, 0, 0, 27, 0, 0, 0, 13, 0, 62,
+  0, 3, 0, 70, 16, 0, 32, 0, 0, 0,
+  21, 64, 8, 79, 0, 0, 0, 31, 0, 20,
+  0, 0, 0, 0, 0, 0, 49, 0, 44, 0,
+  0, 0, 0, 2, 62, 0, 0, 25, 0, 37,
+  50, 81, 8, 1, 28, 19, 26, 9, 59, 14,
+  0, 0, 0, 31, 0, 46, 17, 31, 61, 56,
+  0, 0, 3, 0, 4, 0, 0, 6, 50, 28,
+  14, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  7, 1, 83, 0, 80, 2, 9, 0, 0, 25,
+  11, 47, 41, 0, 0, 5, 47, 1, 0, 16,
+  5, 75, 19, 28, 49, 26, 0, 33, 25, 0,
+  0, 0, 18, 25, 0, 34, 0, 0, 0, 0,
+  0, 42, 0, 0, 0, 16, 0, 27, 0, 0,
+  0, 56, 0, 7, 36, 0, 0, 0, 0, 20,
+  0, 61, 0, 0, 3, 18, 0, 21, 2, 0,
+  0, 0, 0, 0, 62, 6, 75, 21, 0, 0,
+  9, 9, 54, 0, 0, 53, 0, 0, 29, 74,
+  8, 11, 30, 30, 27, 34, 17, 0, 0, 29,
+  0, 0, 22, 13, 14, 0, 41, 57, 0, 6,
+  0, 0, 3, 28, 0, 7, 12, 5, 0, 0,
+  0, 6, 0, 0, 0, 0, 0, 0, 0, 0,
+  32, 0, 54, 11, 27, 0, 0, 16, 49, 37,
+  80, 0, 0, 1, 64, 3, 2, 0, 54, 91,
+  27, 51, 45, 0, 0, 9, 23, 0, 0, 27,
+  0, 25, 0, 38, 0, 3, 12, 0, 0, 38,
+  0, 0, 0, 15, 0, 58, 0, 15, 0, 46,
+  0, 0, 33, 9, 0, 0, 4, 73, 21, 61,
+  0, 0, 0, 51, 0, 15, 0, 0, 0, 0,
+  0, 0, 58, 0, 53, 0, 0, 0, 0, 25,
+  36, 0, 0, 19, 0, 23, 49, 49, 13, 0,
+  41, 40, 36, 29, 68, 0, 0, 29, 0, 26,
+  0, 29, 0, 0, 3, 71, 0, 0, 0, 0,
+  0, 0, 0, 17, 24, 30, 27, 0, 0, 0,
+  28, 0, 19, 0, 0, 0, 24, 0, 70, 0,
+  63, 3, 0, 0, 0, 17, 93, 43, 53, 0,
+  0, 8, 55, 26, 0, 0, 17, 57, 20, 55,
+  57, 27, 0, 29, 14, 0, 0, 5, 16, 11,
+  6, 56, 0, 0, 0, 0, 0, 8, 0, 0,
+  0, 41, 0, 41, 0, 0, 0, 42, 0, 5,
+  36, 0, 0, 0, 2, 40, 0, 36, 0, 0,
+  0, 42, 0, 17, 0, 0, 0, 0, 0, 0,
+  82, 0, 42, 17, 0, 0, 1, 48, 33, 0,
+  0, 61, 0, 0, 38, 68, 6, 58, 20, 52,
+  28, 25, 45, 0, 0, 24, 0, 24, 0, 8,
+  0, 6, 4, 57, 8, 0, 0, 0, 0, 2,
+  0, 5, 16, 36, 9, 0, 0, 0, 13, 0,
+  5, 0, 0, 0, 0, 0, 58, 0, 58, 12,
+  0, 0, 0, 24, 81, 40, 49, 0, 0, 0,
+  33, 2, 0, 17, 6, 77, 0, 0, 23, 56,
+  0, 52, 2, 0, 2, 1, 41, 13, 0, 29,
+  0, 0, 0, 10, 0, 43, 0, 0, 0, 63,
+  12, 17, 0, 0, 3, 48, 0, 11, 71, 0,
+  0, 0, 6, 7, 0, 21, 0, 0, 0, 19,
+  2, 14, 27, 0, 4, 0, 42, 0, 75, 3,
+  41, 71, 0, 0, 6, 9, 38, 0, 0, 42,
+  14, 0, 7, 92, 0, 60, 38, 46, 56, 57,
+  34, 0, 0, 15, 0, 1, 11, 17, 0, 0,
+  0, 26, 10, 3, 0, 0, 0, 39, 0, 3,
+  0, 23, 0, 0, 0, 14, 4, 15, 2, 36,
+  0, 0, 0, 0, 0, 0, 48, 33, 15, 0,
+  30, 0, 17, 10, 31, 0, 0, 0, 35, 0,
+  0, 3, 12, 104, 13, 0, 18, 16, 0, 5,
+  51, 0, 33, 3, 0, 0, 0, 16, 0, 15,
+  0, 9, 0, 7, 0, 0, 0, 0, 0, 7,
+  0, 12, 0, 50, 13, 0, 0, 0, 0, 0,
+  32, 102, 0, 61, 0, 0, 22, 15, 0, 0,
+  0, 0, 29, 0, 32, 22, 10, 15, 12, 12,
+  0, 0, 0, 0, 42, 0, 0, 0, 0, 33,
+  26, 38, 0, 3, 31, 0, 30, 10, 63, 12,
+  0, 0, 0, 0, 0, 25, 23, 0, 69, 64,
+  0, 0, 2, 0, 4, 5, 0, 9, 49, 0,
+  33, 0, 0, 3, 60, 0, 68, 0, 0, 0,
+  8, 0, 0, 0, 49, 3, 11, 0, 0, 22,
+  0, 46, 29, 0, 0, 10, 69, 0, 0, 23,
+  38, 83, 24, 20, 35, 2, 0, 9, 58, 0,
+  0, 0, 4, 48, 0, 23, 0, 8, 10, 0,
+  0, 43, 1, 0, 0, 4, 0, 24, 0, 21,
+  0, 69, 0, 0, 10, 17, 0, 0, 39, 72,
+  4, 92, 0, 0, 6, 27, 0, 37, 0, 0,
+  0, 0, 0, 8, 23, 24, 37, 0, 0, 3,
+  0, 0, 58, 0, 0, 14, 0, 39, 58, 70,
+  0, 0, 36, 5, 31, 21, 43, 20, 8, 4,
+  0, 16, 0, 28, 38, 0, 72, 48, 0, 0,
+  6, 0, 2, 0, 0, 22, 64, 11, 22, 0,
+  0, 9, 42, 0, 28, 0, 0, 0, 25, 29,
+  79, 0, 79, 5, 10, 0, 0, 19, 0, 49,
+  12, 0, 0, 25, 85, 2, 1, 7, 23, 85,
+  32, 34, 52, 0, 5, 0, 23, 0, 0, 0,
+  0, 25, 0, 34, 0, 0, 0, 0, 0, 25,
+  0, 0, 0, 0, 0, 23, 0, 6, 0, 46,
+  0, 0, 22, 18, 0, 0, 24, 75, 20, 83,
+  0, 0, 0, 46, 0, 19, 0, 0, 0, 0,
+  0, 30, 41, 0, 59, 0, 0, 0, 0, 12,
+  50, 0, 0, 9, 0, 32, 59, 63, 9, 0,
+  17, 31, 16, 61, 46, 0, 20, 36, 0, 0,
+  0, 9, 42, 0, 48, 63, 0, 0, 0, 0,
+  9, 0, 0, 19, 28, 6, 15, 0, 0, 0,
+  28, 0, 22, 0, 0, 0, 15, 1, 73, 0,
+  78, 3, 7, 0, 0, 42, 26, 36, 66, 0,
+  0, 14, 62, 8, 0, 3, 37, 89, 51, 42,
+  59, 7, 0, 10, 42, 0, 0, 21, 16, 33,
+  0, 45, 0, 0, 4, 0, 0, 27, 0, 0,
+  0, 13, 0, 62, 0, 3, 0, 70, 16, 0,
+  32, 0, 0, 0, 21, 64, 8, 79, 0, 0,
+  0, 31, 0, 20, 0, 0, 0, 0, 0, 0,
+  49, 0, 44, 0, 0, 0, 0, 2, 62, 0,
+  0, 25, 0, 37, 50, 81, 8, 1, 28, 19,
+  26, 9, 59, 14, 0, 0, 0, 31, 0, 46,
+  17, 31, 61, 56, 0, 0, 3, 0, 4, 0,
+  0, 6, 50, 28, 14, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 7, 1, 83, 0, 80, 2,
+  9, 0, 0, 25, 11, 47, 41, 0, 0, 5,
+  47, 1, 0, 16, 5, 75, 19, 28, 49, 26,
+  0, 33, 25, 0, 0, 0, 18, 25, 0, 34,
+  0, 0, 0, 0, 0, 42, 0, 0, 0, 16,
+  0, 27, 0, 0, 0, 56, 0, 7, 36, 0,
+  0, 0, 0, 20, 0, 61, 0, 0, 3, 18,
+  0, 21, 2, 0, 0, 0, 0, 0, 62, 6,
+  75, 21, 0, 0, 9, 9, 54, 0, 0, 53,
+  0, 0, 29, 74, 8, 11, 30, 30, 27, 34,
+  17, 0, 0, 29, 0, 0, 22, 13, 14, 0,
+  41, 57, 0, 6, 0, 0, 3, 28, 0, 7,
+  12, 5, 0, 0, 0, 6, 0, 0, 0, 0,
+  0, 0, 0, 0, 32, 0, 54, 11, 27, 0,
+  0, 0, 0, 70, 0, 0, 0, 2, 33, 0,
+  0, 0, 0, 43, 0, 6, 22, 39, 0, 28,
+  7, 0, 9, 0, 0, 0, 28, 31, 0, 0,
+  0, 0, 0, 29, 0, 0, 2, 27, 0, 0,
+  0, 0, 0, 6, 0, 5, 36, 29, 18, 0,
+  0, 0, 0, 40, 0, 15, 23, 36, 0, 10,
+  8, 17, 0, 4, 56, 0, 56, 30, 68, 85,
+  5, 0, 19, 21, 32, 0, 0, 9, 20, 0,
+  0, 41, 10, 0, 11, 39, 17, 55, 0, 0,
+  0, 81, 0, 0, 54, 0, 6, 0, 21, 50,
+  24, 33, 0, 0, 0, 40, 0, 5, 0, 0,
+  0, 0, 0, 0, 7, 0, 7, 0, 0, 0,
+  0, 0, 0, 0, 0, 21, 20, 0, 0, 17,
+  93, 43, 53, 0, 0, 8, 55, 26, 0, 0,
+  17, 57, 20, 55, 57, 27, 0, 29, 14, 0,
+  0, 5, 16, 11, 6, 56, 0, 0, 0, 0,
+  0, 8, 0, 0, 0, 41, 0, 41, 0, 0,
+  0, 42, 0, 5, 36, 0, 0, 0, 2, 40,
+  0, 36, 0, 0, 0, 42, 0, 17, 0, 0,
+  0, 0, 0, 0, 82, 0, 42, 17, 0, 0,
+  1, 48, 33, 0, 0, 61, 0, 0, 38, 68,
+  6, 58, 20, 52, 28, 25, 45, 0, 0, 24,
+  0, 24, 0, 8, 0, 6, 4, 57, 8, 0,
+  0, 0, 0, 2, 0, 5, 16, 36, 9, 0,
+  0, 0, 13, 0, 5, 0, 0, 0, 0, 0,
+  58, 0, 58, 12, 0, 0, 0, 24, 81, 40,
+  49, 0, 0, 0, 33, 2, 0, 17, 6, 77,
+  0, 0, 23, 56, 0, 52, 2, 0, 2, 1,
+  41, 13, 0, 29, 0, 0, 0, 10, 0, 43,
+  0, 0, 0, 63, 12, 17, 0, 0, 3, 48,
+  0, 11, 71, 0, 0, 0, 6, 7, 0, 21,
+  0, 0, 0, 19, 2, 14, 27, 0, 4, 0,
+  42, 0, 75, 3, 41, 71, 0, 0, 6, 9,
+  38, 0, 0, 42, 14, 0, 7, 92, 0, 60,
+  38, 46, 56, 57, 34, 0, 0, 15, 0, 1,
+  11, 17, 0, 0, 0, 26, 10, 3, 0, 0,
+  0, 39, 0, 3, 0, 23, 0, 0, 0, 14,
+  4, 15, 2, 36, 0, 0, 0, 0, 0, 0,
+  48, 33, 15, 0, 8, 39, 11, 59, 13, 4,
+  0, 0, 0, 0, 0, 12, 0, 75, 0, 0,
+  1, 65, 7, 50, 0, 0, 29, 0, 35, 15,
+  32, 17, 0, 0, 0, 20, 0, 56, 0, 0,
+  11, 51, 0, 0, 0, 0, 4, 4, 0, 24,
+  76, 35, 6, 0, 0, 0, 0, 0, 0, 0,
+  3, 20, 4, 30, 67, 17, 10, 0, 41, 0,
+  49, 47, 42, 68, 0, 0, 19, 0, 53, 0,
+  0, 1, 65, 0, 0, 87, 0, 24, 26, 31,
+  55, 42, 0, 0, 0, 24, 7, 17, 41, 0,
+  0, 12, 27, 0, 0, 75, 0, 0, 0, 65,
+  4, 0, 0, 51, 0, 13, 0, 12, 0, 43,
+  0, 36, 11, 0, 10, 5, 0, 0, 0, 42,
+  34, 0, 0, 22, 0, 46, 29, 0, 0, 10,
+  69, 0, 0, 23, 38, 83, 24, 20, 35, 2,
+  0, 9, 58, 0, 0, 0, 4, 48, 0, 23,
+  0, 8, 10, 0, 0, 43, 1, 0, 0, 4,
+  0, 24, 0, 21, 0, 69, 0, 0, 10, 17,
+  0, 0, 39, 72, 4, 92, 0, 0, 6, 27,
+  0, 37, 0, 0, 0, 0, 0, 8, 23, 24,
+  37, 0, 0, 3, 0, 0, 58, 0, 0, 14,
+  0, 39, 58, 70, 0, 0, 36, 5, 31, 21,
+  43, 20, 8, 4, 0, 16, 0, 28, 38, 0,
+  72, 48, 0, 0, 6, 0, 2, 0, 0, 22,
+  64, 11, 22, 0, 0, 9, 42, 0, 28, 0,
+  0, 0, 25, 29, 79, 0, 79, 5, 10, 0,
+  0, 19, 0, 49, 12, 0, 0, 25, 85, 2,
+  1, 7, 23, 85, 32, 34, 52, 0, 5, 0,
+  23, 0, 0, 0, 0, 25, 0, 34, 0, 0,
+  0, 0, 0, 25, 0, 0, 0, 0, 0, 23,
+  0, 6, 0, 46, 0, 0, 22, 18, 0, 0,
+  24, 75, 20, 83, 0, 0, 0, 46, 0, 19,
+  0, 0, 0, 0, 0, 30, 41, 0, 59, 0,
+  0, 0, 0, 12, 50, 0, 0, 9, 0, 32,
+  59, 63, 9, 0, 17, 31, 16, 61, 46, 0,
+  20, 36, 0, 0, 0, 9, 42, 0, 48, 63,
+  0, 0, 0, 0, 9, 0, 0, 19, 28, 6,
+  15, 0, 0, 0, 28, 0, 22, 0, 0, 0,
+  15, 1, 73, 0, 78, 3, 7, 0, 0, 4,
+  2, 46, 13, 0, 0, 32, 107, 4, 2, 0,
+  4, 83, 44, 32, 46, 4, 0, 0, 3, 0,
+  0, 10, 0, 0, 0, 35, 0, 0, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 24, 0, 0,
+  0, 32, 0, 0, 49, 17, 0, 0, 0, 80,
+  25, 73, 0, 0, 0, 50, 0, 3, 0, 0,
+  0, 0, 0, 35, 49, 0, 61, 9, 0, 0,
+  3, 17, 57, 9, 0, 0, 0, 10, 48, 46,
+  9, 0, 7, 32, 17, 79, 43, 0, 37, 35,
+  0, 0, 0, 5, 31, 0, 49, 67, 11, 1,
+  0, 0, 15, 0, 0, 19, 8, 3, 5, 0,
+  0, 0, 19, 0, 26, 0, 0, 0, 5, 0,
+  65, 0, 62, 0, 2, 0, 0, 25, 11, 47,
+  41, 0, 0, 5, 47, 1, 0, 16, 5, 75,
+  19, 28, 49, 26, 0, 33, 25, 0, 0, 0,
+  18, 25, 0, 34, 0, 0, 0, 0, 0, 42,
+  0, 0, 0, 16, 0, 27, 0, 0, 0, 56,
+  0, 7, 36, 0, 0, 0, 0, 20, 0, 61,
+  0, 0, 3, 18, 0, 21, 2, 0, 0, 0,
+  0, 0, 62, 6, 75, 21, 0, 0, 9, 9,
+  54, 0, 0, 53, 0, 0, 29, 74, 8, 11,
+  30, 30, 27, 34, 17, 0, 0, 29, 0, 0,
+  22, 13, 14, 0, 41, 57, 0, 6, 0, 0,
+  3, 28, 0, 7, 12, 5, 0, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 0, 32, 0,
+  54, 11, 27, 0, 0, 0, 0, 70, 0, 0,
+  0, 2, 33, 0, 0, 0, 0, 43, 0, 6,
+  22, 39, 0, 28, 7, 0, 9, 0, 0, 0,
+  28, 31, 0, 0, 0, 0, 0, 29, 0, 0,
+  2, 27, 0, 0, 0, 0, 0, 6, 0, 5,
+  36, 29, 18, 0, 0, 0, 0, 40, 0, 15,
+  23, 36, 0, 10, 8, 17, 0, 4, 56, 0,
+  56, 30, 68, 85, 5, 0, 19, 21, 32, 0,
+  0, 9, 20, 0, 0, 41, 10, 0, 11, 39,
+  17, 55, 0, 0, 0, 81, 0, 0, 54, 0,
+  6, 0, 21, 50, 24, 33, 0, 0, 0, 40,
+  0, 5, 0, 0, 0, 0, 0, 0, 7, 0,
+  7, 0, 0, 0, 0, 0, 0, 0, 0, 21,
+  20, 0, 0, 8, 0, 102, 1, 0, 0, 14,
+  69, 27, 0, 0, 0, 1, 0, 66, 27, 37,
+  0, 17, 6, 0, 0, 0, 2, 0, 52, 58,
+  12, 0, 0, 0, 14, 27, 0, 0, 6, 45,
+  0, 0, 2, 0, 0, 11, 0, 17, 56, 34,
+  0, 0, 0, 0, 2, 38, 0, 25, 6, 68,
+  0, 37, 0, 16, 0, 2, 22, 0, 50, 18,
+  67, 47, 0, 0, 22, 50, 27, 21, 0, 3,
+  14, 0, 29, 40, 11, 0, 0, 47, 18, 59,
+  13, 0, 37, 101, 0, 22, 37, 0, 12, 0,
+  20, 34, 37, 0, 0, 0, 4, 0, 0, 14,
+  0, 6, 0, 13, 0, 0, 10, 0, 0, 0,
+  0, 0, 4, 0, 56, 0, 21, 28, 9, 0,
+  0, 24, 81, 40, 49, 0, 0, 0, 33, 2,
+  0, 17, 6, 77, 0, 0, 23, 56, 0, 52,
+  2, 0, 2, 1, 41, 13, 0, 29, 0, 0,
+  0, 10, 0, 43, 0, 0, 0, 63, 12, 17,
+  0, 0, 3, 48, 0, 11, 71, 0, 0, 0,
+  6, 7, 0, 21, 0, 0, 0, 19, 2, 14,
+  27, 0, 4, 0, 42, 0, 75, 3, 41, 71,
+  0, 0, 6, 9, 38, 0, 0, 42, 14, 0,
+  7, 92, 0, 60, 38, 46, 56, 57, 34, 0,
+  0, 15, 0, 1, 11, 17, 0, 0, 0, 26,
+  10, 3, 0, 0, 0, 39, 0, 3, 0, 23,
+  0, 0, 0, 14, 4, 15, 2, 36, 0, 0,
+  0, 0, 0, 0, 48, 33, 15, 0, 8, 39,
+  11, 59, 13, 4, 0, 0, 0, 0, 0, 12,
+  0, 75, 0, 0, 1, 65, 7, 50, 0, 0,
+  29, 0, 35, 15, 32, 17, 0, 0, 0, 20,
+  0, 56, 0, 0, 11, 51, 0, 0, 0, 0,
+  4, 4, 0, 24, 76, 35, 6, 0, 0, 0,
+  0, 0, 0, 0, 3, 20, 4, 30, 67, 17,
+  10, 0, 41, 0, 49, 47, 42, 68, 0, 0,
+  19, 0, 53, 0, 0, 1, 65, 0, 0, 87,
+  0, 24, 26, 31, 55, 42, 0, 0, 0, 24,
+  7, 17, 41, 0, 0, 12, 27, 0, 0, 75,
+  0, 0, 0, 65, 4, 0, 0, 51, 0, 13,
+  0, 12, 0, 43, 0, 36, 11, 0, 10, 5,
+  0, 0, 0, 42, 34, 0, 17, 15, 0, 79,
+  44, 0, 0, 0, 5, 0, 0, 0, 0, 55,
+  0, 0, 0, 35, 37, 28, 4, 0, 0, 0,
+  32, 0, 63, 0, 0, 0, 16, 16, 0, 50,
+  0, 12, 49, 23, 0, 0, 6, 0, 13, 0,
+  0, 14, 60, 14, 0, 0, 0, 0, 0, 1,
+  0, 30, 1, 49, 0, 8, 60, 30, 25, 6,
+  43, 0, 30, 41, 42, 56, 0, 0, 32, 5,
+  13, 0, 0, 18, 85, 0, 0, 46, 31, 7,
+  39, 35, 18, 32, 4, 0, 0, 59, 8, 21,
+  49, 0, 0, 0, 34, 1, 3, 39, 0, 0,
+  0, 65, 0, 8, 0, 14, 0, 11, 0, 5,
+  35, 42, 0, 21, 0, 9, 13, 0, 0, 0,
+  0, 31, 11, 3, 0, 19, 0, 49, 12, 0,
+  0, 25, 85, 2, 1, 7, 23, 85, 32, 34,
+  52, 0, 5, 0, 23, 0, 0, 0, 0, 25,
+  0, 34, 0, 0, 0, 0, 0, 25, 0, 0,
+  0, 0, 0, 23, 0, 6, 0, 46, 0, 0,
+  22, 18, 0, 0, 24, 75, 20, 83, 0, 0,
+  0, 46, 0, 19, 0, 0, 0, 0, 0, 30,
+  41, 0, 59, 0, 0, 0, 0, 12, 50, 0,
+  0, 9, 0, 32, 59, 63, 9, 0, 17, 31,
+  16, 61, 46, 0, 20, 36, 0, 0, 0, 9,
+  42, 0, 48, 63, 0, 0, 0, 0, 9, 0,
+  0, 19, 28, 6, 15, 0, 0, 0, 28, 0,
+  22, 0, 0, 0, 15, 1, 73, 0, 78, 3,
+  7, 0, 0, 4, 2, 46, 13, 0, 0, 32,
+  107, 4, 2, 0, 4, 83, 44, 32, 46, 4,
+  0, 0, 3, 0, 0, 10, 0, 0, 0, 35,
+  0, 0, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 24, 0, 0, 0, 32, 0, 0, 49, 17,
+  0, 0, 0, 80, 25, 73, 0, 0, 0, 50,
+  0, 3, 0, 0, 0, 0, 0, 35, 49, 0,
+  61, 9, 0, 0, 3, 17, 57, 9, 0, 0,
+  0, 10, 48, 46, 9, 0, 7, 32, 17, 79,
+  43, 0, 37, 35, 0, 0, 0, 5, 31, 0,
+  49, 67, 11, 1, 0, 0, 15, 0, 0, 19,
+  8, 3, 5, 0, 0, 0, 19, 0, 26, 0,
+  0, 0, 5, 0, 65, 0, 62, 0, 2, 0,
+  0, 37, 0, 44, 22, 0, 8, 20, 82, 0,
+  25, 11, 12, 56, 55, 36, 59, 22, 0, 12,
+  31, 0, 0, 0, 1, 27, 0, 18, 0, 0,
+  0, 0, 0, 37, 0, 0, 0, 0, 0, 14,
+  0, 0, 0, 28, 0, 0, 38, 1, 0, 0,
+  0, 23, 0, 87, 0, 0, 4, 32, 0, 38,
+  0, 0, 0, 0, 0, 27, 62, 7, 79, 0,
+  0, 0, 0, 8, 73, 0, 0, 19, 6, 1,
+  28, 74, 0, 0, 22, 50, 31, 43, 10, 0,
+  10, 37, 0, 20, 0, 33, 31, 10, 59, 36,
+  0, 0, 0, 0, 17, 0, 0, 13, 9, 1,
+  0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+  0, 23, 74, 0, 31, 0, 36, 0, 0, 0,
+  0, 70, 0, 0, 0, 2, 33, 0, 0, 0,
+  0, 43, 0, 6, 22, 39, 0, 28, 7, 0,
+  9, 0, 0, 0, 28, 31, 0, 0, 0, 0,
+  0, 29, 0, 0, 2, 27, 0, 0, 0, 0,
+  0, 6, 0, 5, 36, 29, 18, 0, 0, 0,
+  0, 40, 0, 15, 23, 36, 0, 10, 8, 17,
+  0, 4, 56, 0, 56, 30, 68, 85, 5, 0,
+  19, 21, 32, 0, 0, 9, 20, 0, 0, 41,
+  10, 0, 11, 39, 17, 55, 0, 0, 0, 81,
+  0, 0, 54, 0, 6, 0, 21, 50, 24, 33,
+  0, 0, 0, 40, 0, 5, 0, 0, 0, 0,
+  0, 0, 7, 0, 7, 0, 0, 0, 0, 0,
+  0, 0, 0, 21, 20, 0, 0, 8, 0, 102,
+  1, 0, 0, 14, 69, 27, 0, 0, 0, 1,
+  0, 66, 27, 37, 0, 17, 6, 0, 0, 0,
+  2, 0, 52, 58, 12, 0, 0, 0, 14, 27,
+  0, 0, 6, 45, 0, 0, 2, 0, 0, 11,
+  0, 17, 56, 34, 0, 0, 0, 0, 2, 38,
+  0, 25, 6, 68, 0, 37, 0, 16, 0, 2,
+  22, 0, 50, 18, 67, 47, 0, 0, 22, 50,
+  27, 21, 0, 3, 14, 0, 29, 40, 11, 0,
+  0, 47, 18, 59, 13, 0, 37, 101, 0, 22,
+  37, 0, 12, 0, 20, 34, 37, 0, 0, 0,
+  4, 0, 0, 14, 0, 6, 0, 13, 0, 0,
+  10, 0, 0, 0, 0, 0, 4, 0, 56, 0,
+  21, 28, 9, 0, 0, 56, 17, 88, 0, 0,
+  31, 9, 81, 2, 5, 0, 0, 6, 2, 91,
+  38, 27, 0, 41, 0, 0, 0, 0, 13, 0,
+  37, 42, 0, 0, 0, 2, 9, 19, 0, 0,
+  16, 37, 0, 0, 16, 0, 0, 26, 0, 16,
+  70, 3, 0, 0, 0, 0, 0, 52, 0, 0,
+  15, 62, 0, 58, 0, 17, 0, 7, 22, 0,
+  63, 23, 93, 25, 0, 0, 31, 35, 54, 3,
+  0, 8, 19, 0, 32, 63, 17, 6, 25, 64,
+  9, 35, 25, 0, 32, 85, 0, 27, 5, 0,
+  11, 0, 41, 54, 31, 0, 0, 0, 12, 3,
+  0, 31, 0, 0, 0, 17, 0, 0, 32, 0,
+  0, 0, 0, 0, 0, 0, 65, 0, 25, 16,
+  30, 0, 8, 39, 11, 59, 13, 4, 0, 0,
+  0, 0, 0, 12, 0, 75, 0, 0, 1, 65,
+  7, 50, 0, 0, 29, 0, 35, 15, 32, 17,
+  0, 0, 0, 20, 0, 56, 0, 0, 11, 51,
+  0, 0, 0, 0, 4, 4, 0, 24, 76, 35,
+  6, 0, 0, 0, 0, 0, 0, 0, 3, 20,
+  4, 30, 67, 17, 10, 0, 41, 0, 49, 47,
+  42, 68, 0, 0, 19, 0, 53, 0, 0, 1,
+  65, 0, 0, 87, 0, 24, 26, 31, 55, 42,
+  0, 0, 0, 24, 7, 17, 41, 0, 0, 12,
+  27, 0, 0, 75, 0, 0, 0, 65, 4, 0,
+  0, 51, 0, 13, 0, 12, 0, 43, 0, 36,
+  11, 0, 10, 5, 0, 0, 0, 42, 34, 0,
+  17, 15, 0, 79, 44, 0, 0, 0, 5, 0,
+  0, 0, 0, 55, 0, 0, 0, 35, 37, 28,
+  4, 0, 0, 0, 32, 0, 63, 0, 0, 0,
+  16, 16, 0, 50, 0, 12, 49, 23, 0, 0,
+  6, 0, 13, 0, 0, 14, 60, 14, 0, 0,
+  0, 0, 0, 1, 0, 30, 1, 49, 0, 8,
+  60, 30, 25, 6, 43, 0, 30, 41, 42, 56,
+  0, 0, 32, 5, 13, 0, 0, 18, 85, 0,
+  0, 46, 31, 7, 39, 35, 18, 32, 4, 0,
+  0, 59, 8, 21, 49, 0, 0, 0, 34, 1,
+  3, 39, 0, 0, 0, 65, 0, 8, 0, 14,
+  0, 11, 0, 5, 35, 42, 0, 21, 0, 9,
+  13, 0, 0, 0, 0, 31, 11, 3, 0, 52,
+  10, 53, 45, 0, 0, 0, 8, 0, 0, 0,
+  0, 74, 0, 0, 0, 0, 17, 52, 3, 0,
+  18, 7, 0, 0, 31, 0, 0, 0, 23, 43,
+  0, 29, 0, 19, 52, 39, 0, 0, 56, 0,
+  8, 9, 0, 0, 56, 49, 5, 0, 28, 0,
+  0, 0, 24, 0, 37, 43, 61, 0, 18, 41,
+  48, 0, 82, 16, 8, 42, 39, 40, 0, 0,
+  47, 0, 25, 13, 0, 0, 67, 0, 0, 21,
+  0, 18, 51, 32, 4, 15, 16, 0, 0, 74,
+  15, 0, 13, 0, 0, 0, 53, 45, 10, 84,
+  0, 0, 0, 82, 0, 44, 0, 0, 0, 0,
+  0, 19, 65, 68, 0, 14, 8, 17, 0, 0,
+  0, 0, 0, 9, 3, 4, 0, 4, 2, 46,
+  13, 0, 0, 32, 107, 4, 2, 0, 4, 83,
+  44, 32, 46, 4, 0, 0, 3, 0, 0, 10,
+  0, 0, 0, 35, 0, 0, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 24, 0, 0, 0, 32,
+  0, 0, 49, 17, 0, 0, 0, 80, 25, 73,
+  0, 0, 0, 50, 0, 3, 0, 0, 0, 0,
+  0, 35, 49, 0, 61, 9, 0, 0, 3, 17,
+  57, 9, 0, 0, 0, 10, 48, 46, 9, 0,
+  7, 32, 17, 79, 43, 0, 37, 35, 0, 0,
+  0, 5, 31, 0, 49, 67, 11, 1, 0, 0,
+  15, 0, 0, 19, 8, 3, 5, 0, 0, 0,
+  19, 0, 26, 0, 0, 0, 5, 0, 65, 0,
+  62, 0, 2, 0, 0, 37, 0, 44, 22, 0,
+  8, 20, 82, 0, 25, 11, 12, 56, 55, 36,
+  59, 22, 0, 12, 31, 0, 0, 0, 1, 27,
+  0, 18, 0, 0, 0, 0, 0, 37, 0, 0,
+  0, 0, 0, 14, 0, 0, 0, 28, 0, 0,
+  38, 1, 0, 0, 0, 23, 0, 87, 0, 0,
+  4, 32, 0, 38, 0, 0, 0, 0, 0, 27,
+  62, 7, 79, 0, 0, 0, 0, 8, 73, 0,
+  0, 19, 6, 1, 28, 74, 0, 0, 22, 50,
+  31, 43, 10, 0, 10, 37, 0, 20, 0, 33,
+  31, 10, 59, 36, 0, 0, 0, 0, 17, 0,
+  0, 13, 9, 1, 0, 0, 0, 0, 9, 0,
+  0, 0, 0, 0, 0, 23, 74, 0, 31, 0,
+  36, 0, 0, 74, 18, 48, 36, 0, 9, 0,
+  60, 0, 36, 0, 0, 63, 66, 33, 53, 1,
+  1, 40, 5, 0, 0, 0, 0, 29, 0, 0,
+  0, 0, 0, 0, 0, 33, 0, 0, 0, 0,
+  0, 13, 0, 0, 0, 7, 0, 0, 40, 19,
+  0, 0, 0, 0, 0, 107, 0, 0, 12, 52,
+  0, 31, 0, 27, 0, 0, 0, 19, 66, 8,
+  85, 0, 0, 0, 0, 0, 65, 0, 0, 12,
+  15, 13, 23, 55, 0, 0, 38, 70, 22, 57,
+  6, 0, 10, 41, 0, 20, 0, 27, 34, 9,
+  25, 65, 0, 0, 0, 0, 11, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 46, 0, 22, 0, 42, 0,
+  0, 8, 0, 102, 1, 0, 0, 14, 69, 27,
+  0, 0, 0, 1, 0, 66, 27, 37, 0, 17,
+  6, 0, 0, 0, 2, 0, 52, 58, 12, 0,
+  0, 0, 14, 27, 0, 0, 6, 45, 0, 0,
+  2, 0, 0, 11, 0, 17, 56, 34, 0, 0,
+  0, 0, 2, 38, 0, 25, 6, 68, 0, 37,
+  0, 16, 0, 2, 22, 0, 50, 18, 67, 47,
+  0, 0, 22, 50, 27, 21, 0, 3, 14, 0,
+  29, 40, 11, 0, 0, 47, 18, 59, 13, 0,
+  37, 101, 0, 22, 37, 0, 12, 0, 20, 34,
+  37, 0, 0, 0, 4, 0, 0, 14, 0, 6,
+  0, 13, 0, 0, 10, 0, 0, 0, 0, 0,
+  4, 0, 56, 0, 21, 28, 9, 0, 0, 56,
+  17, 88, 0, 0, 31, 9, 81, 2, 5, 0,
+  0, 6, 2, 91, 38, 27, 0, 41, 0, 0,
+  0, 0, 13, 0, 37, 42, 0, 0, 0, 2,
+  9, 19, 0, 0, 16, 37, 0, 0, 16, 0,
+  0, 26, 0, 16, 70, 3, 0, 0, 0, 0,
+  0, 52, 0, 0, 15, 62, 0, 58, 0, 17,
+  0, 7, 22, 0, 63, 23, 93, 25, 0, 0,
+  31, 35, 54, 3, 0, 8, 19, 0, 32, 63,
+  17, 6, 25, 64, 9, 35, 25, 0, 32, 85,
+  0, 27, 5, 0, 11, 0, 41, 54, 31, 0,
+  0, 0, 12, 3, 0, 31, 0, 0, 0, 17,
+  0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+  65, 0, 25, 16, 30, 0, 0, 28, 8, 32,
+  27, 0, 2, 0, 68, 0, 19, 0, 0, 42,
+  7, 49, 43, 15, 20, 47, 0, 0, 0, 0,
+  0, 0, 3, 32, 0, 0, 0, 6, 4, 23,
+  0, 12, 7, 21, 0, 0, 2, 0, 0, 18,
+  0, 11, 54, 50, 0, 0, 0, 0, 0, 40,
+  0, 0, 45, 53, 0, 11, 0, 42, 0, 0,
+  22, 4, 38, 14, 110, 11, 16, 0, 30, 15,
+  57, 0, 0, 0, 2, 0, 0, 18, 21, 0,
+  59, 45, 0, 63, 2, 0, 3, 85, 0, 10,
+  16, 0, 9, 0, 31, 80, 7, 29, 0, 0,
+  22, 22, 0, 19, 0, 0, 0, 25, 0, 0,
+  16, 0, 0, 0, 0, 0, 0, 0, 11, 0,
+  0, 5, 46, 8, 17, 15, 0, 79, 44, 0,
+  0, 0, 5, 0, 0, 0, 0, 55, 0, 0,
+  0, 35, 37, 28, 4, 0, 0, 0, 32, 0,
+  63, 0, 0, 0, 16, 16, 0, 50, 0, 12,
+  49, 23, 0, 0, 6, 0, 13, 0, 0, 14,
+  60, 14, 0, 0, 0, 0, 0, 1, 0, 30,
+  1, 49, 0, 8, 60, 30, 25, 6, 43, 0,
+  30, 41, 42, 56, 0, 0, 32, 5, 13, 0,
+  0, 18, 85, 0, 0, 46, 31, 7, 39, 35,
+  18, 32, 4, 0, 0, 59, 8, 21, 49, 0,
+  0, 0, 34, 1, 3, 39, 0, 0, 0, 65,
+  0, 8, 0, 14, 0, 11, 0, 5, 35, 42,
+  0, 21, 0, 9, 13, 0, 0, 0, 0, 31,
+  11, 3, 0, 52, 10, 53, 45, 0, 0, 0,
+  8, 0, 0, 0, 0, 74, 0, 0, 0, 0,
+  17, 52, 3, 0, 18, 7, 0, 0, 31, 0,
+  0, 0, 23, 43, 0, 29, 0, 19, 52, 39,
+  0, 0, 56, 0, 8, 9, 0, 0, 56, 49,
+  5, 0, 28, 0, 0, 0, 24, 0, 37, 43,
+  61, 0, 18, 41, 48, 0, 82, 16, 8, 42,
+  39, 40, 0, 0, 47, 0, 25, 13, 0, 0,
+  67, 0, 0, 21, 0, 18, 51, 32, 4, 15,
+  16, 0, 0, 74, 15, 0, 13, 0, 0, 0,
+  53, 45, 10, 84, 0, 0, 0, 82, 0, 44,
+  0, 0, 0, 0, 0, 19, 65, 68, 0, 14,
+  8, 17, 0, 0, 0, 0, 0, 9, 3, 4,
+  0, 23, 27, 4, 12, 35, 0, 0, 0, 0,
+  7, 0, 0, 120, 0, 0, 0, 0, 0, 71,
+  1, 19, 66, 22, 0, 0, 0, 5, 0, 8,
+  4, 39, 0, 29, 0, 44, 65, 31, 0, 0,
+  54, 58, 0, 12, 0, 0, 47, 155, 11, 0,
+  50, 0, 0, 0, 45, 0, 62, 10, 71, 0,
+  0, 39, 35, 0, 91, 27, 0, 65, 34, 36,
+  0, 34, 14, 0, 51, 0, 0, 0, 19, 4,
+  0, 0, 14, 6, 95, 9, 0, 30, 0, 0,
+  0, 23, 0, 0, 8, 0, 0, 0, 51, 94,
+  0, 92, 0, 0, 16, 61, 0, 33, 0, 0,
+  0, 0, 0, 0, 47, 97, 0, 7, 27, 0,
+  4, 0, 0, 0, 0, 0, 0, 77, 0, 37,
+  0, 44, 22, 0, 8, 20, 82, 0, 25, 11,
+  12, 56, 55, 36, 59, 22, 0, 12, 31, 0,
+  0, 0, 1, 27, 0, 18, 0, 0, 0, 0,
+  0, 37, 0, 0, 0, 0, 0, 14, 0, 0,
+  0, 28, 0, 0, 38, 1, 0, 0, 0, 23,
+  0, 87, 0, 0, 4, 32, 0, 38, 0, 0,
+  0, 0, 0, 27, 62, 7, 79, 0, 0, 0,
+  0, 8, 73, 0, 0, 19, 6, 1, 28, 74,
+  0, 0, 22, 50, 31, 43, 10, 0, 10, 37,
+  0, 20, 0, 33, 31, 10, 59, 36, 0, 0,
+  0, 0, 17, 0, 0, 13, 9, 1, 0, 0,
+  0, 0, 9, 0, 0, 0, 0, 0, 0, 23,
+  74, 0, 31, 0, 36, 0, 0, 74, 18, 48,
+  36, 0, 9, 0, 60, 0, 36, 0, 0, 63,
+  66, 33, 53, 1, 1, 40, 5, 0, 0, 0,
+  0, 29, 0, 0, 0, 0, 0, 0, 0, 33,
+  0, 0, 0, 0, 0, 13, 0, 0, 0, 7,
+  0, 0, 40, 19, 0, 0, 0, 0, 0, 107,
+  0, 0, 12, 52, 0, 31, 0, 27, 0, 0,
+  0, 19, 66, 8, 85, 0, 0, 0, 0, 0,
+  65, 0, 0, 12, 15, 13, 23, 55, 0, 0,
+  38, 70, 22, 57, 6, 0, 10, 41, 0, 20,
+  0, 27, 34, 9, 25, 65, 0, 0, 0, 0,
+  11, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 46, 0,
+  22, 0, 42, 0, 0, 120, 19, 74, 27, 0,
+  31, 0, 61, 0, 8, 0, 21, 27, 26, 43,
+  32, 22, 11, 48, 0, 0, 11, 13, 20, 2,
+  39, 1, 0, 0, 0, 0, 45, 5, 15, 2,
+  0, 0, 0, 0, 0, 0, 0, 21, 0, 27,
+  87, 36, 0, 0, 16, 0, 0, 39, 0, 0,
+  30, 0, 0, 50, 0, 22, 0, 0, 0, 0,
+  32, 15, 38, 0, 0, 0, 27, 0, 82, 16,
+  0, 44, 0, 0, 23, 10, 32, 10, 15, 51,
+  24, 38, 8, 39, 22, 24, 0, 47, 0, 0,
+  15, 0, 42, 41, 18, 5, 0, 0, 5, 0,
+  39, 13, 35, 22, 0, 0, 0, 45, 0, 0,
+  0, 0, 9, 0, 0, 0, 49, 0, 6, 0,
+  21, 9, 0, 56, 17, 88, 0, 0, 31, 9,
+  81, 2, 5, 0, 0, 6, 2, 91, 38, 27,
+  0, 41, 0, 0, 0, 0, 13, 0, 37, 42,
+  0, 0, 0, 2, 9, 19, 0, 0, 16, 37,
+  0, 0, 16, 0, 0, 26, 0, 16, 70, 3,
+  0, 0, 0, 0, 0, 52, 0, 0, 15, 62,
+  0, 58, 0, 17, 0, 7, 22, 0, 63, 23,
+  93, 25, 0, 0, 31, 35, 54, 3, 0, 8,
+  19, 0, 32, 63, 17, 6, 25, 64, 9, 35,
+  25, 0, 32, 85, 0, 27, 5, 0, 11, 0,
+  41, 54, 31, 0, 0, 0, 12, 3, 0, 31,
+  0, 0, 0, 17, 0, 0, 32, 0, 0, 0,
+  0, 0, 0, 0, 65, 0, 25, 16, 30, 0,
+  0, 28, 8, 32, 27, 0, 2, 0, 68, 0,
+  19, 0, 0, 42, 7, 49, 43, 15, 20, 47,
+  0, 0, 0, 0, 0, 0, 3, 32, 0, 0,
+  0, 6, 4, 23, 0, 12, 7, 21, 0, 0,
+  2, 0, 0, 18, 0, 11, 54, 50, 0, 0,
+  0, 0, 0, 40, 0, 0, 45, 53, 0, 11,
+  0, 42, 0, 0, 22, 4, 38, 14, 110, 11,
+  16, 0, 30, 15, 57, 0, 0, 0, 2, 0,
+  0, 18, 21, 0, 59, 45, 0, 63, 2, 0,
+  3, 85, 0, 10, 16, 0, 9, 0, 31, 80,
+  7, 29, 0, 0, 22, 22, 0, 19, 0, 0,
+  0, 25, 0, 0, 16, 0, 0, 0, 0, 0,
+  0, 0, 11, 0, 0, 5, 46, 8, 7, 49,
+  61, 23, 56, 0, 23, 0, 71, 0, 0, 0,
+  14, 98, 16, 58, 20, 15, 28, 30, 7, 0,
+  10, 8, 0, 0, 0, 49, 0, 0, 0, 0,
+  0, 27, 0, 0, 0, 0, 0, 0, 17, 10,
+  0, 57, 0, 0, 54, 50, 0, 0, 31, 38,
+  0, 36, 0, 0, 23, 53, 0, 29, 0, 9,
+  0, 0, 24, 18, 14, 0, 53, 0, 0, 0,
+  18, 6, 59, 0, 0, 0, 0, 0, 21, 44,
+  0, 0, 68, 38, 3, 47, 64, 0, 0, 40,
+  0, 20, 0, 9, 7, 0, 28, 55, 0, 0,
+  1, 0, 35, 0, 0, 37, 14, 0, 22, 0,
+  0, 15, 86, 0, 0, 0, 20, 0, 12, 0,
+  13, 0, 9, 8, 46, 0, 0, 52, 10, 53,
+  45, 0, 0, 0, 8, 0, 0, 0, 0, 74,
+  0, 0, 0, 0, 17, 52, 3, 0, 18, 7,
+  0, 0, 31, 0, 0, 0, 23, 43, 0, 29,
+  0, 19, 52, 39, 0, 0, 56, 0, 8, 9,
+  0, 0, 56, 49, 5, 0, 28, 0, 0, 0,
+  24, 0, 37, 43, 61, 0, 18, 41, 48, 0,
+  82, 16, 8, 42, 39, 40, 0, 0, 47, 0,
+  25, 13, 0, 0, 67, 0, 0, 21, 0, 18,
+  51, 32, 4, 15, 16, 0, 0, 74, 15, 0,
+  13, 0, 0, 0, 53, 45, 10, 84, 0, 0,
+  0, 82, 0, 44, 0, 0, 0, 0, 0, 19,
+  65, 68, 0, 14, 8, 17, 0, 0, 0, 0,
+  0, 9, 3, 4, 0, 23, 27, 4, 12, 35,
+  0, 0, 0, 0, 7, 0, 0, 120, 0, 0,
+  0, 0, 0, 71, 1, 19, 66, 22, 0, 0,
+  0, 5, 0, 8, 4, 39, 0, 29, 0, 44,
+  65, 31, 0, 0, 54, 58, 0, 12, 0, 0,
+  47, 155, 11, 0, 50, 0, 0, 0, 45, 0,
+  62, 10, 71, 0, 0, 39, 35, 0, 91, 27,
+  0, 65, 34, 36, 0, 34, 14, 0, 51, 0,
+  0, 0, 19, 4, 0, 0, 14, 6, 95, 9,
+  0, 30, 0, 0, 0, 23, 0, 0, 8, 0,
+  0, 0, 51, 94, 0, 92, 0, 0, 16, 61,
+  0, 33, 0, 0, 0, 0, 0, 0, 47, 97,
+  0, 7, 27, 0, 4, 0, 0, 0, 0, 0,
+  0, 77, 45, 0, 33, 19, 45, 9, 0, 0,
+  4, 0, 2, 0, 45, 137, 0, 0, 0, 2,
+  10, 33, 44, 5, 15, 24, 0, 0, 11, 35,
+  0, 0, 0, 12, 0, 13, 0, 1, 6, 12,
+  0, 0, 8, 68, 0, 25, 0, 0, 28, 111,
+  8, 0, 44, 66, 0, 5, 0, 0, 15, 16,
+  0, 6, 0, 0, 27, 0, 53, 12, 0, 7,
+  33, 35, 0, 38, 0, 0, 31, 0, 0, 0,
+  0, 40, 0, 23, 24, 0, 54, 8, 0, 37,
+  61, 0, 0, 16, 0, 0, 0, 0, 30, 0,
+  25, 59, 0, 21, 4, 0, 13, 17, 0, 39,
+  33, 0, 20, 0, 0, 1, 63, 23, 29, 0,
+  0, 0, 72, 0, 0, 0, 0, 0, 0, 50,
+  0, 74, 18, 48, 36, 0, 9, 0, 60, 0,
+  36, 0, 0, 63, 66, 33, 53, 1, 1, 40,
+  5, 0, 0, 0, 0, 29, 0, 0, 0, 0,
+  0, 0, 0, 33, 0, 0, 0, 0, 0, 13,
+  0, 0, 0, 7, 0, 0, 40, 19, 0, 0,
+  0, 0, 0, 107, 0, 0, 12, 52, 0, 31,
+  0, 27, 0, 0, 0, 19, 66, 8, 85, 0,
+  0, 0, 0, 0, 65, 0, 0, 12, 15, 13,
+  23, 55, 0, 0, 38, 70, 22, 57, 6, 0,
+  10, 41, 0, 20, 0, 27, 34, 9, 25, 65,
+  0, 0, 0, 0, 11, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 46, 0, 22, 0, 42, 0, 0, 120,
+  19, 74, 27, 0, 31, 0, 61, 0, 8, 0,
+  21, 27, 26, 43, 32, 22, 11, 48, 0, 0,
+  11, 13, 20, 2, 39, 1, 0, 0, 0, 0,
+  45, 5, 15, 2, 0, 0, 0, 0, 0, 0,
+  0, 21, 0, 27, 87, 36, 0, 0, 16, 0,
+  0, 39, 0, 0, 30, 0, 0, 50, 0, 22,
+  0, 0, 0, 0, 32, 15, 38, 0, 0, 0,
+  27, 0, 82, 16, 0, 44, 0, 0, 23, 10,
+  32, 10, 15, 51, 24, 38, 8, 39, 22, 24,
+  0, 47, 0, 0, 15, 0, 42, 41, 18, 5,
+  0, 0, 5, 0, 39, 13, 35, 22, 0, 0,
+  0, 45, 0, 0, 0, 0, 9, 0, 0, 0,
+  49, 0, 6, 0, 21, 9, 64, 56, 7, 47,
+  47, 23, 0, 2, 27, 0, 0, 0, 42, 8,
+  0, 3, 0, 0, 56, 18, 0, 16, 26, 0,
+  2, 0, 57, 0, 1, 54, 0, 27, 23, 0,
+  74, 44, 54, 0, 12, 0, 0, 9, 0, 16,
+  14, 30, 64, 22, 0, 0, 0, 0, 0, 18,
+  39, 0, 31, 0, 0, 0, 0, 41, 29, 0,
+  11, 5, 0, 39, 0, 10, 75, 0, 74, 0,
+  24, 4, 0, 36, 30, 0, 0, 0, 49, 39,
+  40, 0, 0, 51, 36, 6, 0, 6, 0, 16,
+  0, 0, 38, 0, 41, 42, 30, 45, 15, 0,
+  0, 0, 5, 61, 41, 0, 5, 11, 0, 65,
+  38, 0, 0, 0, 29, 0, 0, 0, 0, 0,
+  0, 0, 8, 29, 0, 28, 8, 32, 27, 0,
+  2, 0, 68, 0, 19, 0, 0, 42, 7, 49,
+  43, 15, 20, 47, 0, 0, 0, 0, 0, 0,
+  3, 32, 0, 0, 0, 6, 4, 23, 0, 12,
+  7, 21, 0, 0, 2, 0, 0, 18, 0, 11,
+  54, 50, 0, 0, 0, 0, 0, 40, 0, 0,
+  45, 53, 0, 11, 0, 42, 0, 0, 22, 4,
+  38, 14, 110, 11, 16, 0, 30, 15, 57, 0,
+  0, 0, 2, 0, 0, 18, 21, 0, 59, 45,
+  0, 63, 2, 0, 3, 85, 0, 10, 16, 0,
+  9, 0, 31, 80, 7, 29, 0, 0, 22, 22,
+  0, 19, 0, 0, 0, 25, 0, 0, 16, 0,
+  0, 0, 0, 0, 0, 0, 11, 0, 0, 5,
+  46, 8, 7, 49, 61, 23, 56, 0, 23, 0,
+  71, 0, 0, 0, 14, 98, 16, 58, 20, 15,
+  28, 30, 7, 0, 10, 8, 0, 0, 0, 49,
+  0, 0, 0, 0, 0, 27, 0, 0, 0, 0,
+  0, 0, 17, 10, 0, 57, 0, 0, 54, 50,
+  0, 0, 31, 38, 0, 36, 0, 0, 23, 53,
+  0, 29, 0, 9, 0, 0, 24, 18, 14, 0,
+  53, 0, 0, 0, 18, 6, 59, 0, 0, 0,
+  0, 0, 21, 44, 0, 0, 68, 38, 3, 47,
+  64, 0, 0, 40, 0, 20, 0, 9, 7, 0,
+  28, 55, 0, 0, 1, 0, 35, 0, 0, 37,
+  14, 0, 22, 0, 0, 15, 86, 0, 0, 0,
+  20, 0, 12, 0, 13, 0, 9, 8, 46, 0,
+  51, 65, 87, 26, 42, 0, 0, 0, 24, 1,
+  1, 1, 40, 128, 0, 10, 0, 0, 20, 34,
+  11, 2, 7, 22, 0, 0, 0, 18, 0, 18,
+  19, 8, 0, 36, 8, 0, 36, 0, 0, 0,
+  19, 59, 0, 24, 0, 0, 22, 33, 0, 0,
+  46, 60, 0, 37, 0, 0, 0, 36, 0, 23,
+  0, 0, 20, 0, 14, 43, 0, 0, 6, 10,
+  0, 33, 9, 0, 41, 0, 0, 0, 32, 7,
+  0, 63, 13, 0, 60, 24, 16, 45, 93, 12,
+  0, 0, 0, 1, 0, 0, 27, 0, 35, 36,
+  0, 2, 17, 0, 23, 17, 0, 42, 39, 0,
+  25, 0, 0, 19, 110, 2, 0, 0, 0, 0,
+  14, 0, 0, 0, 0, 15, 6, 19, 0, 23,
+  27, 4, 12, 35, 0, 0, 0, 0, 7, 0,
+  0, 120, 0, 0, 0, 0, 0, 71, 1, 19,
+  66, 22, 0, 0, 0, 5, 0, 8, 4, 39,
+  0, 29, 0, 44, 65, 31, 0, 0, 54, 58,
+  0, 12, 0, 0, 47, 155, 11, 0, 50, 0,
+  0, 0, 45, 0, 62, 10, 71, 0, 0, 39,
+  35, 0, 91, 27, 0, 65, 34, 36, 0, 34,
+  14, 0, 51, 0, 0, 0, 19, 4, 0, 0,
+  14, 6, 95, 9, 0, 30, 0, 0, 0, 23,
+  0, 0, 8, 0, 0, 0, 51, 94, 0, 92,
+  0, 0, 16, 61, 0, 33, 0, 0, 0, 0,
+  0, 0, 47, 97, 0, 7, 27, 0, 4, 0,
+  0, 0, 0, 0, 0, 77, 45, 0, 33, 19,
+  45, 9, 0, 0, 4, 0, 2, 0, 45, 137,
+  0, 0, 0, 2, 10, 33, 44, 5, 15, 24,
+  0, 0, 11, 35, 0, 0, 0, 12, 0, 13,
+  0, 1, 6, 12, 0, 0, 8, 68, 0, 25,
+  0, 0, 28, 111, 8, 0, 44, 66, 0, 5,
+  0, 0, 15, 16, 0, 6, 0, 0, 27, 0,
+  53, 12, 0, 7, 33, 35, 0, 38, 0, 0,
+  31, 0, 0, 0, 0, 40, 0, 23, 24, 0,
+  54, 8, 0, 37, 61, 0, 0, 16, 0, 0,
+  0, 0, 30, 0, 25, 59, 0, 21, 4, 0,
+  13, 17, 0, 39, 33, 0, 20, 0, 0, 1,
+  63, 23, 29, 0, 0, 0, 72, 0, 0, 0,
+  0, 0, 0, 50, 46, 31, 46, 68, 33, 0,
+  0, 0, 66, 0, 8, 9, 61, 76, 4, 9,
+  2, 0, 9, 16, 52, 0, 0, 39, 0, 0,
+  46, 32, 0, 0, 28, 0, 0, 0, 1, 0,
+  0, 0, 0, 0, 0, 77, 0, 9, 0, 0,
+  10, 32, 0, 0, 39, 72, 0, 16, 9, 0,
+  2, 31, 0, 8, 0, 0, 0, 4, 0, 26,
+  19, 0, 10, 7, 0, 32, 9, 31, 6, 0,
+  0, 38, 0, 38, 15, 46, 46, 0, 9, 55,
+  0, 11, 92, 0, 0, 0, 0, 12, 0, 0,
+  74, 0, 27, 39, 0, 0, 0, 0, 18, 45,
+  0, 35, 42, 11, 31, 0, 15, 0, 62, 0,
+  3, 0, 0, 6, 60, 0, 0, 0, 0, 12,
+  0, 66, 0, 120, 19, 74, 27, 0, 31, 0,
+  61, 0, 8, 0, 21, 27, 26, 43, 32, 22,
+  11, 48, 0, 0, 11, 13, 20, 2, 39, 1,
+  0, 0, 0, 0, 45, 5, 15, 2, 0, 0,
+  0, 0, 0, 0, 0, 21, 0, 27, 87, 36,
+  0, 0, 16, 0, 0, 39, 0, 0, 30, 0,
+  0, 50, 0, 22, 0, 0, 0, 0, 32, 15,
+  38, 0, 0, 0, 27, 0, 82, 16, 0, 44,
+  0, 0, 23, 10, 32, 10, 15, 51, 24, 38,
+  8, 39, 22, 24, 0, 47, 0, 0, 15, 0,
+  42, 41, 18, 5, 0, 0, 5, 0, 39, 13,
+  35, 22, 0, 0, 0, 45, 0, 0, 0, 0,
+  9, 0, 0, 0, 49, 0, 6, 0, 21, 9,
+  64, 56, 7, 47, 47, 23, 0, 2, 27, 0,
+  0, 0, 42, 8, 0, 3, 0, 0, 56, 18,
+  0, 16, 26, 0, 2, 0, 57, 0, 1, 54,
+  0, 27, 23, 0, 74, 44, 54, 0, 12, 0,
+  0, 9, 0, 16, 14, 30, 64, 22, 0, 0,
+  0, 0, 0, 18, 39, 0, 31, 0, 0, 0,
+  0, 41, 29, 0, 11, 5, 0, 39, 0, 10,
+  75, 0, 74, 0, 24, 4, 0, 36, 30, 0,
+  0, 0, 49, 39, 40, 0, 0, 51, 36, 6,
+  0, 6, 0, 16, 0, 0, 38, 0, 41, 42,
+  30, 45, 15, 0, 0, 0, 5, 61, 41, 0,
+  5, 11, 0, 65, 38, 0, 0, 0, 29, 0,
+  0, 0, 0, 0, 0, 0, 8, 29, 59, 0,
+  21, 13, 0, 41, 0, 2, 0, 43, 0, 19,
+  0, 48, 0, 0, 0, 0, 56, 0, 3, 89,
+  5, 0, 0, 0, 21, 5, 0, 99, 0, 11,
+  0, 0, 67, 44, 117, 91, 15, 0, 39, 0,
+  3, 0, 0, 12, 0, 18, 5, 1, 0, 35,
+  0, 23, 119, 0, 0, 4, 0, 0, 0, 65,
+  91, 49, 82, 33, 0, 21, 0, 118, 80, 20,
+  83, 0, 0, 0, 0, 0, 100, 0, 0, 0,
+  15, 22, 26, 0, 0, 49, 63, 0, 0, 18,
+  0, 0, 55, 0, 41, 0, 0, 54, 58, 26,
+  28, 0, 0, 0, 0, 29, 0, 0, 19, 18,
+  0, 23, 56, 7, 0, 0, 19, 0, 0, 0,
+  0, 0, 0, 24, 61, 73, 7, 49, 61, 23,
+  56, 0, 23, 0, 71, 0, 0, 0, 14, 98,
+  16, 58, 20, 15, 28, 30, 7, 0, 10, 8,
+  0, 0, 0, 49, 0, 0, 0, 0, 0, 27,
+  0, 0, 0, 0, 0, 0, 17, 10, 0, 57,
+  0, 0, 54, 50, 0, 0, 31, 38, 0, 36,
+  0, 0, 23, 53, 0, 29, 0, 9, 0, 0,
+  24, 18, 14, 0, 53, 0, 0, 0, 18, 6,
+  59, 0, 0, 0, 0, 0, 21, 44, 0, 0,
+  68, 38, 3, 47, 64, 0, 0, 40, 0, 20,
+  0, 9, 7, 0, 28, 55, 0, 0, 1, 0,
+  35, 0, 0, 37, 14, 0, 22, 0, 0, 15,
+  86, 0, 0, 0, 20, 0, 12, 0, 13, 0,
+  9, 8, 46, 0, 51, 65, 87, 26, 42, 0,
+  0, 0, 24, 1, 1, 1, 40, 128, 0, 10,
+  0, 0, 20, 34, 11, 2, 7, 22, 0, 0,
+  0, 18, 0, 18, 19, 8, 0, 36, 8, 0,
+  36, 0, 0, 0, 19, 59, 0, 24, 0, 0,
+  22, 33, 0, 0, 46, 60, 0, 37, 0, 0,
+  0, 36, 0, 23, 0, 0, 20, 0, 14, 43,
+  0, 0, 6, 10, 0, 33, 9, 0, 41, 0,
+  0, 0, 32, 7, 0, 63, 13, 0, 60, 24,
+  16, 45, 93, 12, 0, 0, 0, 1, 0, 0,
+  27, 0, 35, 36, 0, 2, 17, 0, 23, 17,
+  0, 42, 39, 0, 25, 0, 0, 19, 110, 2,
+  0, 0, 0, 0, 14, 0, 0, 0, 0, 15,
+  6, 19, 58, 29, 70, 32, 22, 7, 0, 0,
+  38, 0, 7, 32, 60, 93, 0, 0, 0, 0,
+  38, 0, 64, 26, 0, 33, 0, 0, 30, 14,
+  0, 67, 47, 0, 0, 0, 6, 0, 43, 9,
+  0, 0, 0, 21, 0, 0, 0, 0, 0, 24,
+  0, 6, 13, 86, 0, 24, 27, 0, 0, 48,
+  0, 0, 0, 0, 12, 26, 3, 21, 0, 0,
+  0, 30, 0, 44, 10, 2, 0, 0, 0, 0,
+  48, 0, 0, 39, 61, 0, 1, 12, 0, 35,
+  123, 0, 0, 0, 0, 0, 0, 0, 63, 0,
+  17, 39, 26, 0, 0, 0, 0, 26, 0, 33,
+  42, 10, 39, 0, 4, 0, 83, 0, 0, 0,
+  0, 28, 67, 0, 0, 0, 0, 33, 0, 82,
+  45, 0, 33, 19, 45, 9, 0, 0, 4, 0,
+  2, 0, 45, 137, 0, 0, 0, 2, 10, 33,
+  44, 5, 15, 24, 0, 0, 11, 35, 0, 0,
+  0, 12, 0, 13, 0, 1, 6, 12, 0, 0,
+  8, 68, 0, 25, 0, 0, 28, 111, 8, 0,
+  44, 66, 0, 5, 0, 0, 15, 16, 0, 6,
+  0, 0, 27, 0, 53, 12, 0, 7, 33, 35,
+  0, 38, 0, 0, 31, 0, 0, 0, 0, 40,
+  0, 23, 24, 0, 54, 8, 0, 37, 61, 0,
+  0, 16, 0, 0, 0, 0, 30, 0, 25, 59,
+  0, 21, 4, 0, 13, 17, 0, 39, 33, 0,
+  20, 0, 0, 1, 63, 23, 29, 0, 0, 0,
+  72, 0, 0, 0, 0, 0, 0, 50, 46, 31,
+  46, 68, 33, 0, 0, 0, 66, 0, 8, 9,
+  61, 76, 4, 9, 2, 0, 9, 16, 52, 0,
+  0, 39, 0, 0, 46, 32, 0, 0, 28, 0,
+  0, 0, 1, 0, 0, 0, 0, 0, 0, 77,
+  0, 9, 0, 0, 10, 32, 0, 0, 39, 72,
+  0, 16, 9, 0, 2, 31, 0, 8, 0, 0,
+  0, 4, 0, 26, 19, 0, 10, 7, 0, 32,
+  9, 31, 6, 0, 0, 38, 0, 38, 15, 46,
+  46, 0, 9, 55, 0, 11, 92, 0, 0, 0,
+  0, 12, 0, 0, 74, 0, 27, 39, 0, 0,
+  0, 0, 18, 45, 0, 35, 42, 11, 31, 0,
+  15, 0, 62, 0, 3, 0, 0, 6, 60, 0,
+  0, 0, 0, 12, 0, 66, 23, 5, 71, 73,
+  1, 0, 0, 8, 79, 0, 18, 35, 49, 54,
+  0, 0, 0, 6, 44, 0, 41, 8, 0, 24,
+  0, 0, 55, 8, 0, 0, 32, 0, 5, 0,
+  0, 0, 12, 0, 0, 0, 0, 38, 0, 0,
+  0, 8, 0, 0, 0, 0, 32, 89, 0, 0,
+  52, 0, 19, 21, 0, 9, 0, 0, 0, 30,
+  3, 0, 40, 0, 15, 64, 0, 0, 41, 76,
+  0, 0, 9, 58, 0, 26, 12, 24, 95, 17,
+  0, 70, 0, 25, 100, 0, 27, 15, 0, 0,
+  8, 0, 68, 0, 16, 62, 13, 0, 0, 0,
+  0, 91, 0, 16, 1, 6, 23, 0, 3, 0,
+  73, 0, 19, 0, 0, 35, 21, 0, 0, 0,
+  0, 16, 0, 69, 64, 56, 7, 47, 47, 23,
+  0, 2, 27, 0, 0, 0, 42, 8, 0, 3,
+  0, 0, 56, 18, 0, 16, 26, 0, 2, 0,
+  57, 0, 1, 54, 0, 27, 23, 0, 74, 44,
+  54, 0, 12, 0, 0, 9, 0, 16, 14, 30,
+  64, 22, 0, 0, 0, 0, 0, 18, 39, 0,
+  31, 0, 0, 0, 0, 41, 29, 0, 11, 5,
+  0, 39, 0, 10, 75, 0, 74, 0, 24, 4,
+  0, 36, 30, 0, 0, 0, 49, 39, 40, 0,
+  0, 51, 36, 6, 0, 6, 0, 16, 0, 0,
+  38, 0, 41, 42, 30, 45, 15, 0, 0, 0,
+  5, 61, 41, 0, 5, 11, 0, 65, 38, 0,
+  0, 0, 29, 0, 0, 0, 0, 0, 0, 0,
+  8, 29, 59, 0, 21, 13, 0, 41, 0, 2,
+  0, 43, 0, 19, 0, 48, 0, 0, 0, 0,
+  56, 0, 3, 89, 5, 0, 0, 0, 21, 5,
+  0, 99, 0, 11, 0, 0, 67, 44, 117, 91,
+  15, 0, 39, 0, 3, 0, 0, 12, 0, 18,
+  5, 1, 0, 35, 0, 23, 119, 0, 0, 4,
+  0, 0, 0, 65, 91, 49, 82, 33, 0, 21,
+  0, 118, 80, 20, 83, 0, 0, 0, 0, 0,
+  100, 0, 0, 0, 15, 22, 26, 0, 0, 49,
+  63, 0, 0, 18, 0, 0, 55, 0, 41, 0,
+  0, 54, 58, 26, 28, 0, 0, 0, 0, 29,
+  0, 0, 19, 18, 0, 23, 56, 7, 0, 0,
+  19, 0, 0, 0, 0, 0, 0, 24, 61, 73,
+  32, 0, 66, 36, 9, 0, 0, 0, 5, 21,
+  0, 26, 30, 124, 0, 0, 0, 0, 23, 0,
+  28, 52, 0, 3, 0, 0, 50, 28, 0, 103,
+  0, 4, 0, 0, 39, 0, 82, 66, 0, 0,
+  35, 0, 2, 0, 0, 22, 7, 0, 0, 0,
+  0, 70, 0, 21, 74, 0, 0, 14, 10, 0,
+  0, 32, 91, 24, 64, 1, 0, 2, 0, 95,
+  0, 13, 72, 0, 0, 0, 0, 0, 86, 0,
+  0, 56, 11, 19, 0, 0, 12, 13, 141, 0,
+  0, 19, 0, 0, 4, 0, 38, 0, 0, 38,
+  31, 0, 0, 0, 0, 0, 0, 56, 51, 0,
+  69, 0, 0, 0, 107, 0, 36, 0, 0, 32,
+  38, 0, 0, 0, 0, 37, 0, 81, 51, 65,
+  87, 26, 42, 0, 0, 0, 24, 1, 1, 1,
+  40, 128, 0, 10, 0, 0, 20, 34, 11, 2,
+  7, 22, 0, 0, 0, 18, 0, 18, 19, 8,
+  0, 36, 8, 0, 36, 0, 0, 0, 19, 59,
+  0, 24, 0, 0, 22, 33, 0, 0, 46, 60,
+  0, 37, 0, 0, 0, 36, 0, 23, 0, 0,
+  20, 0, 14, 43, 0, 0, 6, 10, 0, 33,
+  9, 0, 41, 0, 0, 0, 32, 7, 0, 63,
+  13, 0, 60, 24, 16, 45, 93, 12, 0, 0,
+  0, 1, 0, 0, 27, 0, 35, 36, 0, 2,
+  17, 0, 23, 17, 0, 42, 39, 0, 25, 0,
+  0, 19, 110, 2, 0, 0, 0, 0, 14, 0,
+  0, 0, 0, 15, 6, 19, 58, 29, 70, 32,
+  22, 7, 0, 0, 38, 0, 7, 32, 60, 93,
+  0, 0, 0, 0, 38, 0, 64, 26, 0, 33,
+  0, 0, 30, 14, 0, 67, 47, 0, 0, 0,
+  6, 0, 43, 9, 0, 0, 0, 21, 0, 0,
+  0, 0, 0, 24, 0, 6, 13, 86, 0, 24,
+  27, 0, 0, 48, 0, 0, 0, 0, 12, 26,
+  3, 21, 0, 0, 0, 30, 0, 44, 10, 2,
+  0, 0, 0, 0, 48, 0, 0, 39, 61, 0,
+  1, 12, 0, 35, 123, 0, 0, 0, 0, 0,
+  0, 0, 63, 0, 17, 39, 26, 0, 0, 0,
+  0, 26, 0, 33, 42, 10, 39, 0, 4, 0,
+  83, 0, 0, 0, 0, 28, 67, 0, 0, 0,
+  0, 33, 0, 82, 37, 48, 54, 46, 22, 17,
+  0, 0, 75, 0, 31, 10, 55, 60, 0, 21,
+  0, 0, 43, 0, 38, 0, 0, 48, 0, 0,
+  41, 28, 0, 38, 57, 0, 0, 0, 24, 0,
+  32, 0, 0, 0, 0, 80, 0, 0, 0, 0,
+  14, 21, 0, 28, 36, 67, 0, 12, 53, 0,
+  1, 49, 0, 34, 0, 0, 0, 41, 0, 12,
+  9, 0, 0, 0, 0, 43, 25, 31, 0, 22,
+  14, 0, 16, 22, 0, 32, 73, 0, 0, 30,
+  3, 13, 122, 5, 40, 0, 0, 1, 0, 0,
+  93, 0, 14, 55, 0, 0, 0, 0, 0, 54,
+  0, 32, 56, 22, 48, 0, 15, 0, 63, 0,
+  0, 0, 0, 46, 59, 0, 14, 0, 6, 28,
+  0, 93, 46, 31, 46, 68, 33, 0, 0, 0,
+  66, 0, 8, 9, 61, 76, 4, 9, 2, 0,
+  9, 16, 52, 0, 0, 39, 0, 0, 46, 32,
+  0, 0, 28, 0, 0, 0, 1, 0, 0, 0,
+  0, 0, 0, 77, 0, 9, 0, 0, 10, 32,
+  0, 0, 39, 72, 0, 16, 9, 0, 2, 31,
+  0, 8, 0, 0, 0, 4, 0, 26, 19, 0,
+  10, 7, 0, 32, 9, 31, 6, 0, 0, 38,
+  0, 38, 15, 46, 46, 0, 9, 55, 0, 11,
+  92, 0, 0, 0, 0, 12, 0, 0, 74, 0,
+  27, 39, 0, 0, 0, 0, 18, 45, 0, 35,
+  42, 11, 31, 0, 15, 0, 62, 0, 3, 0,
+  0, 6, 60, 0, 0, 0, 0, 12, 0, 66,
+  23, 5, 71, 73, 1, 0, 0, 8, 79, 0,
+  18, 35, 49, 54, 0, 0, 0, 6, 44, 0,
+  41, 8, 0, 24, 0, 0, 55, 8, 0, 0,
+  32, 0, 5, 0, 0, 0, 12, 0, 0, 0,
+  0, 38, 0, 0, 0, 8, 0, 0, 0, 0,
+  32, 89, 0, 0, 52, 0, 19, 21, 0, 9,
+  0, 0, 0, 30, 3, 0, 40, 0, 15, 64,
+  0, 0, 41, 76, 0, 0, 9, 58, 0, 26,
+  12, 24, 95, 17, 0, 70, 0, 25, 100, 0,
+  27, 15, 0, 0, 8, 0, 68, 0, 16, 62,
+  13, 0, 0, 0, 0, 91, 0, 16, 1, 6,
+  23, 0, 3, 0, 73, 0, 19, 0, 0, 35,
+  21, 0, 0, 0, 0, 16, 0, 69, 0, 0,
+  76, 61, 0, 18, 0, 0, 58, 0, 2, 25,
+  0, 40, 0, 0, 19, 37, 29, 4, 20, 9,
+  0, 8, 0, 0, 28, 9, 0, 0, 7, 0,
+  8, 0, 0, 19, 34, 4, 0, 0, 0, 7,
+  0, 0, 0, 37, 0, 0, 0, 0, 40, 40,
+  0, 0, 62, 0, 3, 11, 0, 0, 0, 0,
+  0, 0, 17, 0, 43, 0, 29, 88, 0, 0,
+  53, 71, 0, 0, 0, 29, 0, 20, 2, 10,
+  49, 67, 0, 66, 3, 6, 58, 0, 34, 42,
+  0, 0, 38, 0, 45, 5, 0, 65, 19, 0,
+  0, 0, 12, 109, 0, 0, 0, 0, 12, 0,
+  0, 0, 66, 0, 15, 0, 0, 45, 0, 0,
+  0, 0, 0, 21, 19, 34, 59, 0, 21, 13,
+  0, 41, 0, 2, 0, 43, 0, 19, 0, 48,
+  0, 0, 0, 0, 56, 0, 3, 89, 5, 0,
+  0, 0, 21, 5, 0, 99, 0, 11, 0, 0,
+  67, 44, 117, 91, 15, 0, 39, 0, 3, 0,
+  0, 12, 0, 18, 5, 1, 0, 35, 0, 23,
+  119, 0, 0, 4, 0, 0, 0, 65, 91, 49,
+  82, 33, 0, 21, 0, 118, 80, 20, 83, 0,
+  0, 0, 0, 0, 100, 0, 0, 0, 15, 22,
+  26, 0, 0, 49, 63, 0, 0, 18, 0, 0,
+  55, 0, 41, 0, 0, 54, 58, 26, 28, 0,
+  0, 0, 0, 29, 0, 0, 19, 18, 0, 23,
+  56, 7, 0, 0, 19, 0, 0, 0, 0, 0,
+  0, 24, 61, 73, 32, 0, 66, 36, 9, 0,
+  0, 0, 5, 21, 0, 26, 30, 124, 0, 0,
+  0, 0, 23, 0, 28, 52, 0, 3, 0, 0,
+  50, 28, 0, 103, 0, 4, 0, 0, 39, 0,
+  82, 66, 0, 0, 35, 0, 2, 0, 0, 22,
+  7, 0, 0, 0, 0, 70, 0, 21, 74, 0,
+  0, 14, 10, 0, 0, 32, 91, 24, 64, 1,
+  0, 2, 0, 95, 0, 13, 72, 0, 0, 0,
+  0, 0, 86, 0, 0, 56, 11, 19, 0, 0,
+  12, 13, 141, 0, 0, 19, 0, 0, 4, 0,
+  38, 0, 0, 38, 31, 0, 0, 0, 0, 0,
+  0, 56, 51, 0, 69, 0, 0, 0, 107, 0,
+  36, 0, 0, 32, 38, 0, 0, 0, 0, 37,
+  0, 81, 51, 46, 25, 77, 65, 9, 0, 0,
+  20, 0, 19, 0, 51, 118, 0, 0, 0, 0,
+  16, 7, 12, 11, 0, 26, 0, 0, 55, 19,
+  0, 69, 20, 7, 22, 0, 56, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 31, 31, 30, 33,
+  0, 0, 23, 35, 0, 14, 38, 0, 27, 20,
+  0, 10, 0, 19, 19, 8, 0, 0, 0, 0,
+  2, 0, 0, 41, 51, 0, 0, 22, 0, 0,
+  35, 8, 0, 53, 41, 20, 0, 0, 35, 12,
+  95, 14, 26, 0, 0, 30, 0, 0, 70, 0,
+  0, 50, 0, 20, 0, 0, 0, 25, 0, 43,
+  127, 0, 82, 0, 12, 0, 31, 0, 14, 0,
+  0, 8, 49, 0, 2, 15, 10, 13, 0, 93,
+  58, 29, 70, 32, 22, 7, 0, 0, 38, 0,
+  7, 32, 60, 93, 0, 0, 0, 0, 38, 0,
+  64, 26, 0, 33, 0, 0, 30, 14, 0, 67,
+  47, 0, 0, 0, 6, 0, 43, 9, 0, 0,
+  0, 21, 0, 0, 0, 0, 0, 24, 0, 6,
+  13, 86, 0, 24, 27, 0, 0, 48, 0, 0,
+  0, 0, 12, 26, 3, 21, 0, 0, 0, 30,
+  0, 44, 10, 2, 0, 0, 0, 0, 48, 0,
+  0, 39, 61, 0, 1, 12, 0, 35, 123, 0,
+  0, 0, 0, 0, 0, 0, 63, 0, 17, 39,
+  26, 0, 0, 0, 0, 26, 0, 33, 42, 10,
+  39, 0, 4, 0, 83, 0, 0, 0, 0, 28,
+  67, 0, 0, 0, 0, 33, 0, 82, 37, 48,
+  54, 46, 22, 17, 0, 0, 75, 0, 31, 10,
+  55, 60, 0, 21, 0, 0, 43, 0, 38, 0,
+  0, 48, 0, 0, 41, 28, 0, 38, 57, 0,
+  0, 0, 24, 0, 32, 0, 0, 0, 0, 80,
+  0, 0, 0, 0, 14, 21, 0, 28, 36, 67,
+  0, 12, 53, 0, 1, 49, 0, 34, 0, 0,
+  0, 41, 0, 12, 9, 0, 0, 0, 0, 43,
+  25, 31, 0, 22, 14, 0, 16, 22, 0, 32,
+  73, 0, 0, 30, 3, 13, 122, 5, 40, 0,
+  0, 1, 0, 0, 93, 0, 14, 55, 0, 0,
+  0, 0, 0, 54, 0, 32, 56, 22, 48, 0,
+  15, 0, 63, 0, 0, 0, 0, 46, 59, 0,
+  14, 0, 6, 28, 0, 93, 18, 58, 66, 69,
+  39, 34, 0, 0, 61, 0, 24, 0, 24, 41,
+  11, 21, 49, 14, 29, 7, 0, 0, 0, 34,
+  1, 0, 22, 29, 0, 26, 0, 5, 31, 0,
+  36, 0, 13, 0, 0, 0, 0, 34, 0, 0,
+  10, 55, 10, 6, 0, 0, 30, 0, 0, 0,
+  35, 0, 20, 14, 0, 4, 0, 6, 0, 0,
+  0, 0, 31, 0, 49, 0, 0, 0, 64, 30,
+  0, 37, 0, 10, 0, 53, 0, 8, 43, 93,
+  0, 42, 5, 3, 30, 39, 93, 5, 0, 0,
+  11, 0, 68, 0, 0, 79, 5, 0, 0, 0,
+  30, 61, 0, 15, 39, 0, 23, 0, 0, 0,
+  0, 0, 12, 0, 0, 0, 11, 0, 7, 0,
+  19, 17, 24, 37, 23, 5, 71, 73, 1, 0,
+  0, 8, 79, 0, 18, 35, 49, 54, 0, 0,
+  0, 6, 44, 0, 41, 8, 0, 24, 0, 0,
+  55, 8, 0, 0, 32, 0, 5, 0, 0, 0,
+  12, 0, 0, 0, 0, 38, 0, 0, 0, 8,
+  0, 0, 0, 0, 32, 89, 0, 0, 52, 0,
+  19, 21, 0, 9, 0, 0, 0, 30, 3, 0,
+  40, 0, 15, 64, 0, 0, 41, 76, 0, 0,
+  9, 58, 0, 26, 12, 24, 95, 17, 0, 70,
+  0, 25, 100, 0, 27, 15, 0, 0, 8, 0,
+  68, 0, 16, 62, 13, 0, 0, 0, 0, 91,
+  0, 16, 1, 6, 23, 0, 3, 0, 73, 0,
+  19, 0, 0, 35, 21, 0, 0, 0, 0, 16,
+  0, 69, 0, 0, 76, 61, 0, 18, 0, 0,
+  58, 0, 2, 25, 0, 40, 0, 0, 19, 37,
+  29, 4, 20, 9, 0, 8, 0, 0, 28, 9,
+  0, 0, 7, 0, 8, 0, 0, 19, 34, 4,
+  0, 0, 0, 7, 0, 0, 0, 37, 0, 0,
+  0, 0, 40, 40, 0, 0, 62, 0, 3, 11,
+  0, 0, 0, 0, 0, 0, 17, 0, 43, 0,
+  29, 88, 0, 0, 53, 71, 0, 0, 0, 29,
+  0, 20, 2, 10, 49, 67, 0, 66, 3, 6,
+  58, 0, 34, 42, 0, 0, 38, 0, 45, 5,
+  0, 65, 19, 0, 0, 0, 12, 109, 0, 0,
+  0, 0, 12, 0, 0, 0, 66, 0, 15, 0,
+  0, 45, 0, 0, 0, 0, 0, 21, 19, 34,
+  21, 49, 94, 59, 0, 40, 0, 0, 37, 0,
+  0, 2, 0, 53, 10, 6, 39, 18, 0, 5,
+  0, 0, 0, 10, 0, 0, 0, 12, 0, 36,
+  18, 54, 0, 12, 26, 2, 59, 42, 0, 0,
+  0, 6, 17, 0, 0, 42, 0, 10, 0, 0,
+  60, 0, 0, 0, 47, 0, 14, 4, 5, 0,
+  0, 0, 0, 0, 0, 0, 19, 0, 49, 8,
+  0, 0, 50, 31, 0, 14, 0, 0, 0, 49,
+  0, 39, 0, 93, 0, 53, 2, 0, 47, 10,
+  28, 14, 0, 0, 7, 0, 11, 20, 0, 63,
+  0, 0, 0, 0, 64, 95, 0, 0, 0, 0,
+  42, 0, 0, 0, 37, 0, 0, 0, 0, 29,
+  0, 0, 0, 0, 8, 31, 58, 8, 32, 0,
+  66, 36, 9, 0, 0, 0, 5, 21, 0, 26,
+  30, 124, 0, 0, 0, 0, 23, 0, 28, 52,
+  0, 3, 0, 0, 50, 28, 0, 103, 0, 4,
+  0, 0, 39, 0, 82, 66, 0, 0, 35, 0,
+  2, 0, 0, 22, 7, 0, 0, 0, 0, 70,
+  0, 21, 74, 0, 0, 14, 10, 0, 0, 32,
+  91, 24, 64, 1, 0, 2, 0, 95, 0, 13,
+  72, 0, 0, 0, 0, 0, 86, 0, 0, 56,
+  11, 19, 0, 0, 12, 13, 141, 0, 0, 19,
+  0, 0, 4, 0, 38, 0, 0, 38, 31, 0,
+  0, 0, 0, 0, 0, 56, 51, 0, 69, 0,
+  0, 0, 107, 0, 36, 0, 0, 32, 38, 0,
+  0, 0, 0, 37, 0, 81, 51, 46, 25, 77,
+  65, 9, 0, 0, 20, 0, 19, 0, 51, 118,
+  0, 0, 0, 0, 16, 7, 12, 11, 0, 26,
+  0, 0, 55, 19, 0, 69, 20, 7, 22, 0,
+  56, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  31, 31, 30, 33, 0, 0, 23, 35, 0, 14,
+  38, 0, 27, 20, 0, 10, 0, 19, 19, 8,
+  0, 0, 0, 0, 2, 0, 0, 41, 51, 0,
+  0, 22, 0, 0, 35, 8, 0, 53, 41, 20,
+  0, 0, 35, 12, 95, 14, 26, 0, 0, 30,
+  0, 0, 70, 0, 0, 50, 0, 20, 0, 0,
+  0, 25, 0, 43, 127, 0, 82, 0, 12, 0,
+  31, 0, 14, 0, 0, 8, 49, 0, 2, 15,
+  10, 13, 0, 93, 42, 127, 15, 99, 80, 43,
+  0, 0, 43, 0, 32, 0, 35, 29, 0, 0,
+  11, 0, 41, 15, 0, 0, 0, 47, 24, 0,
+  52, 29, 0, 37, 5, 49, 69, 0, 20, 0,
+  0, 0, 0, 0, 0, 17, 0, 6, 19, 56,
+  44, 46, 0, 7, 4, 0, 0, 17, 32, 0,
+  50, 2, 0, 29, 21, 24, 0, 8, 0, 0,
+  52, 4, 27, 0, 0, 21, 45, 4, 6, 45,
+  10, 2, 0, 2, 0, 19, 40, 73, 0, 17,
+  5, 38, 21, 49, 107, 0, 0, 49, 0, 0,
+  90, 0, 23, 57, 7, 99, 1, 0, 25, 33,
+  41, 62, 122, 0, 7, 22, 36, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 43, 0, 45, 1,
+  13, 74, 37, 48, 54, 46, 22, 17, 0, 0,
+  75, 0, 31, 10, 55, 60, 0, 21, 0, 0,
+  43, 0, 38, 0, 0, 48, 0, 0, 41, 28,
+  0, 38, 57, 0, 0, 0, 24, 0, 32, 0,
+  0, 0, 0, 80, 0, 0, 0, 0, 14, 21,
+  0, 28, 36, 67, 0, 12, 53, 0, 1, 49,
+  0, 34, 0, 0, 0, 41, 0, 12, 9, 0,
+  0, 0, 0, 43, 25, 31, 0, 22, 14, 0,
+  16, 22, 0, 32, 73, 0, 0, 30, 3, 13,
+  122, 5, 40, 0, 0, 1, 0, 0, 93, 0,
+  14, 55, 0, 0, 0, 0, 0, 54, 0, 32,
+  56, 22, 48, 0, 15, 0, 63, 0, 0, 0,
+  0, 46, 59, 0, 14, 0, 6, 28, 0, 93,
+  18, 58, 66, 69, 39, 34, 0, 0, 61, 0,
+  24, 0, 24, 41, 11, 21, 49, 14, 29, 7,
+  0, 0, 0, 34, 1, 0, 22, 29, 0, 26,
+  0, 5, 31, 0, 36, 0, 13, 0, 0, 0,
+  0, 34, 0, 0, 10, 55, 10, 6, 0, 0,
+  30, 0, 0, 0, 35, 0, 20, 14, 0, 4,
+  0, 6, 0, 0, 0, 0, 31, 0, 49, 0,
+  0, 0, 64, 30, 0, 37, 0, 10, 0, 53,
+  0, 8, 43, 93, 0, 42, 5, 3, 30, 39,
+  93, 5, 0, 0, 11, 0, 68, 0, 0, 79,
+  5, 0, 0, 0, 30, 61, 0, 15, 39, 0,
+  23, 0, 0, 0, 0, 0, 12, 0, 0, 0,
+  11, 0, 7, 0, 19, 17, 24, 37, 19, 83,
+  100, 57, 60, 86, 0, 0, 16, 0, 0, 0,
+  1, 37, 9, 22, 45, 0, 3, 24, 0, 9,
+  0, 26, 12, 0, 0, 30, 0, 58, 0, 45,
+  5, 36, 29, 8, 0, 14, 0, 6, 0, 0,
+  0, 30, 1, 47, 31, 38, 0, 0, 15, 0,
+  0, 0, 7, 0, 28, 11, 0, 0, 0, 19,
+  0, 0, 0, 0, 25, 0, 71, 0, 0, 0,
+  48, 11, 37, 0, 0, 0, 0, 14, 0, 10,
+  19, 113, 22, 41, 0, 37, 0, 20, 39, 0,
+  0, 0, 11, 0, 10, 0, 0, 52, 9, 11,
+  0, 0, 76, 50, 5, 16, 33, 0, 25, 22,
+  0, 4, 0, 0, 10, 0, 0, 0, 0, 0,
+  0, 0, 34, 0, 47, 18, 0, 0, 76, 61,
+  0, 18, 0, 0, 58, 0, 2, 25, 0, 40,
+  0, 0, 19, 37, 29, 4, 20, 9, 0, 8,
+  0, 0, 28, 9, 0, 0, 7, 0, 8, 0,
+  0, 19, 34, 4, 0, 0, 0, 7, 0, 0,
+  0, 37, 0, 0, 0, 0, 40, 40, 0, 0,
+  62, 0, 3, 11, 0, 0, 0, 0, 0, 0,
+  17, 0, 43, 0, 29, 88, 0, 0, 53, 71,
+  0, 0, 0, 29, 0, 20, 2, 10, 49, 67,
+  0, 66, 3, 6, 58, 0, 34, 42, 0, 0,
+  38, 0, 45, 5, 0, 65, 19, 0, 0, 0,
+  12, 109, 0, 0, 0, 0, 12, 0, 0, 0,
+  66, 0, 15, 0, 0, 45, 0, 0, 0, 0,
+  0, 21, 19, 34, 21, 49, 94, 59, 0, 40,
+  0, 0, 37, 0, 0, 2, 0, 53, 10, 6,
+  39, 18, 0, 5, 0, 0, 0, 10, 0, 0,
+  0, 12, 0, 36, 18, 54, 0, 12, 26, 2,
+  59, 42, 0, 0, 0, 6, 17, 0, 0, 42,
+  0, 10, 0, 0, 60, 0, 0, 0, 47, 0,
+  14, 4, 5, 0, 0, 0, 0, 0, 0, 0,
+  19, 0, 49, 8, 0, 0, 50, 31, 0, 14,
+  0, 0, 0, 49, 0, 39, 0, 93, 0, 53,
+  2, 0, 47, 10, 28, 14, 0, 0, 7, 0,
+  11, 20, 0, 63, 0, 0, 0, 0, 64, 95,
+  0, 0, 0, 0, 42, 0, 0, 0, 37, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 8, 31,
+  58, 8, 24, 50, 130, 56, 9, 113, 0, 0,
+  0, 0, 0, 0, 18, 53, 0, 15, 32, 9,
+  0, 14, 0, 26, 0, 12, 0, 0, 0, 0,
+  0, 68, 18, 55, 0, 60, 43, 18, 30, 1,
+  0, 18, 0, 0, 0, 3, 0, 17, 0, 39,
+  0, 0, 36, 38, 0, 0, 41, 0, 32, 16,
+  29, 0, 0, 0, 0, 0, 31, 0, 0, 0,
+  41, 0, 0, 0, 42, 0, 0, 3, 0, 0,
+  2, 46, 0, 22, 20, 94, 27, 22, 13, 1,
+  28, 26, 6, 0, 0, 0, 15, 0, 0, 0,
+  0, 25, 2, 0, 0, 0, 20, 67, 0, 0,
+  0, 2, 64, 0, 0, 16, 0, 0, 21, 0,
+  0, 13, 0, 0, 0, 18, 28, 25, 23, 8,
+  51, 46, 25, 77, 65, 9, 0, 0, 20, 0,
+  19, 0, 51, 118, 0, 0, 0, 0, 16, 7,
+  12, 11, 0, 26, 0, 0, 55, 19, 0, 69,
+  20, 7, 22, 0, 56, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 31, 31, 30, 33, 0, 0,
+  23, 35, 0, 14, 38, 0, 27, 20, 0, 10,
+  0, 19, 19, 8, 0, 0, 0, 0, 2, 0,
+  0, 41, 51, 0, 0, 22, 0, 0, 35, 8,
+  0, 53, 41, 20, 0, 0, 35, 12, 95, 14,
+  26, 0, 0, 30, 0, 0, 70, 0, 0, 50,
+  0, 20, 0, 0, 0, 25, 0, 43, 127, 0,
+  82, 0, 12, 0, 31, 0, 14, 0, 0, 8,
+  49, 0, 2, 15, 10, 13, 0, 93, 42, 127,
+  15, 99, 80, 43, 0, 0, 43, 0, 32, 0,
+  35, 29, 0, 0, 11, 0, 41, 15, 0, 0,
+  0, 47, 24, 0, 52, 29, 0, 37, 5, 49,
+  69, 0, 20, 0, 0, 0, 0, 0, 0, 17,
+  0, 6, 19, 56, 44, 46, 0, 7, 4, 0,
+  0, 17, 32, 0, 50, 2, 0, 29, 21, 24,
+  0, 8, 0, 0, 52, 4, 27, 0, 0, 21,
+  45, 4, 6, 45, 10, 2, 0, 2, 0, 19,
+  40, 73, 0, 17, 5, 38, 21, 49, 107, 0,
+  0, 49, 0, 0, 90, 0, 23, 57, 7, 99,
+  1, 0, 25, 33, 41, 62, 122, 0, 7, 22,
+  36, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  43, 0, 45, 1, 13, 74, 17, 8, 86, 68,
+  23, 217, 0, 0, 29, 0, 0, 0, 32, 0,
+  0, 0, 31, 18, 66, 0, 0, 112, 15, 8,
+  7, 0, 0, 35, 0, 72, 0, 82, 0, 0,
+  0, 30, 0, 0, 1, 0, 0, 19, 0, 19,
+  0, 50, 59, 42, 0, 14, 0, 45, 0, 0,
+  97, 0, 62, 0, 33, 0, 0, 70, 0, 0,
+  53, 0, 0, 26, 12, 6, 27, 25, 76, 0,
+  0, 26, 25, 0, 0, 18, 0, 0, 77, 83,
+  0, 0, 0, 18, 0, 4, 54, 0, 0, 0,
+  24, 0, 25, 0, 15, 39, 25, 35, 17, 0,
+  0, 31, 47, 29, 0, 0, 0, 45, 0, 0,
+  0, 0, 38, 0, 3, 0, 0, 1, 0, 22,
+  25, 0, 0, 20, 18, 58, 66, 69, 39, 34,
+  0, 0, 61, 0, 24, 0, 24, 41, 11, 21,
+  49, 14, 29, 7, 0, 0, 0, 34, 1, 0,
+  22, 29, 0, 26, 0, 5, 31, 0, 36, 0,
+  13, 0, 0, 0, 0, 34, 0, 0, 10, 55,
+  10, 6, 0, 0, 30, 0, 0, 0, 35, 0,
+  20, 14, 0, 4, 0, 6, 0, 0, 0, 0,
+  31, 0, 49, 0, 0, 0, 64, 30, 0, 37,
+  0, 10, 0, 53, 0, 8, 43, 93, 0, 42,
+  5, 3, 30, 39, 93, 5, 0, 0, 11, 0,
+  68, 0, 0, 79, 5, 0, 0, 0, 30, 61,
+  0, 15, 39, 0, 23, 0, 0, 0, 0, 0,
+  12, 0, 0, 0, 11, 0, 7, 0, 19, 17,
+  24, 37, 19, 83, 100, 57, 60, 86, 0, 0,
+  16, 0, 0, 0, 1, 37, 9, 22, 45, 0,
+  3, 24, 0, 9, 0, 26, 12, 0, 0, 30,
+  0, 58, 0, 45, 5, 36, 29, 8, 0, 14,
+  0, 6, 0, 0, 0, 30, 1, 47, 31, 38,
+  0, 0, 15, 0, 0, 0, 7, 0, 28, 11,
+  0, 0, 0, 19, 0, 0, 0, 0, 25, 0,
+  71, 0, 0, 0, 48, 11, 37, 0, 0, 0,
+  0, 14, 0, 10, 19, 113, 22, 41, 0, 37,
+  0, 20, 39, 0, 0, 0, 11, 0, 10, 0,
+  0, 52, 9, 11, 0, 0, 76, 50, 5, 16,
+  33, 0, 25, 22, 0, 4, 0, 0, 10, 0,
+  0, 0, 0, 0, 0, 0, 34, 0, 47, 18,
+  11, 11, 105, 33, 25, 144, 0, 0, 0, 0,
+  0, 0, 17, 0, 0, 0, 17, 5, 23, 0,
+  0, 94, 8, 12, 0, 0, 0, 0, 0, 52,
+  0, 26, 0, 34, 0, 30, 0, 0, 0, 25,
+  0, 0, 0, 39, 0, 0, 23, 37, 0, 0,
+  0, 86, 0, 0, 64, 0, 59, 0, 41, 0,
+  0, 32, 0, 17, 51, 3, 0, 0, 41, 0,
+  4, 7, 56, 0, 27, 0, 0, 0, 0, 10,
+  0, 0, 45, 50, 55, 11, 0, 9, 2, 0,
+  0, 0, 20, 0, 18, 0, 0, 0, 20, 19,
+  0, 0, 0, 0, 22, 38, 4, 0, 0, 0,
+  37, 28, 0, 0, 0, 0, 63, 0, 8, 0,
+  0, 0, 0, 12, 39, 5, 0, 0, 21, 49,
+  94, 59, 0, 40, 0, 0, 37, 0, 0, 2,
+  0, 53, 10, 6, 39, 18, 0, 5, 0, 0,
+  0, 10, 0, 0, 0, 12, 0, 36, 18, 54,
+  0, 12, 26, 2, 59, 42, 0, 0, 0, 6,
+  17, 0, 0, 42, 0, 10, 0, 0, 60, 0,
+  0, 0, 47, 0, 14, 4, 5, 0, 0, 0,
+  0, 0, 0, 0, 19, 0, 49, 8, 0, 0,
+  50, 31, 0, 14, 0, 0, 0, 49, 0, 39,
+  0, 93, 0, 53, 2, 0, 47, 10, 28, 14,
+  0, 0, 7, 0, 11, 20, 0, 63, 0, 0,
+  0, 0, 64, 95, 0, 0, 0, 0, 42, 0,
+  0, 0, 37, 0, 0, 0, 0, 29, 0, 0,
+  0, 0, 8, 31, 58, 8, 24, 50, 130, 56,
+  9, 113, 0, 0, 0, 0, 0, 0, 18, 53,
+  0, 15, 32, 9, 0, 14, 0, 26, 0, 12,
+  0, 0, 0, 0, 0, 68, 18, 55, 0, 60,
+  43, 18, 30, 1, 0, 18, 0, 0, 0, 3,
+  0, 17, 0, 39, 0, 0, 36, 38, 0, 0,
+  41, 0, 32, 16, 29, 0, 0, 0, 0, 0,
+  31, 0, 0, 0, 41, 0, 0, 0, 42, 0,
+  0, 3, 0, 0, 2, 46, 0, 22, 20, 94,
+  27, 22, 13, 1, 28, 26, 6, 0, 0, 0,
+  15, 0, 0, 0, 0, 25, 2, 0, 0, 0,
+  20, 67, 0, 0, 0, 2, 64, 0, 0, 16,
+  0, 0, 21, 0, 0, 13, 0, 0, 0, 18,
+  28, 25, 23, 8, 18, 29, 81, 2, 20, 83,
+  0, 0, 0, 0, 0, 0, 29, 22, 0, 0,
+  11, 0, 22, 0, 16, 80, 7, 25, 0, 0,
+  0, 0, 0, 50, 53, 0, 0, 40, 19, 7,
+  0, 0, 0, 34, 18, 28, 0, 28, 19, 0,
+  0, 38, 0, 0, 0, 100, 0, 0, 72, 0,
+  56, 27, 67, 0, 0, 10, 0, 45, 0, 38,
+  0, 0, 0, 0, 0, 13, 35, 21, 7, 22,
+  0, 0, 0, 14, 4, 0, 18, 9, 61, 9,
+  0, 0, 33, 0, 0, 2, 69, 0, 11, 0,
+  0, 0, 29, 21, 0, 0, 0, 0, 26, 25,
+  0, 0, 0, 32, 64, 0, 0, 16, 0, 0,
+  50, 0, 17, 27, 16, 8, 0, 0, 53, 22,
+  0, 8, 42, 127, 15, 99, 80, 43, 0, 0,
+  43, 0, 32, 0, 35, 29, 0, 0, 11, 0,
+  41, 15, 0, 0, 0, 47, 24, 0, 52, 29,
+  0, 37, 5, 49, 69, 0, 20, 0, 0, 0,
+  0, 0, 0, 17, 0, 6, 19, 56, 44, 46,
+  0, 7, 4, 0, 0, 17, 32, 0, 50, 2,
+  0, 29, 21, 24, 0, 8, 0, 0, 52, 4,
+  27, 0, 0, 21, 45, 4, 6, 45, 10, 2,
+  0, 2, 0, 19, 40, 73, 0, 17, 5, 38,
+  21, 49, 107, 0, 0, 49, 0, 0, 90, 0,
+  23, 57, 7, 99, 1, 0, 25, 33, 41, 62,
+  122, 0, 7, 22, 36, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 43, 0, 45, 1, 13, 74,
+  17, 8, 86, 68, 23, 217, 0, 0, 29, 0,
+  0, 0, 32, 0, 0, 0, 31, 18, 66, 0,
+  0, 112, 15, 8, 7, 0, 0, 35, 0, 72,
+  0, 82, 0, 0, 0, 30, 0, 0, 1, 0,
+  0, 19, 0, 19, 0, 50, 59, 42, 0, 14,
+  0, 45, 0, 0, 97, 0, 62, 0, 33, 0,
+  0, 70, 0, 0, 53, 0, 0, 26, 12, 6,
+  27, 25, 76, 0, 0, 26, 25, 0, 0, 18,
+  0, 0, 77, 83, 0, 0, 0, 18, 0, 4,
+  54, 0, 0, 0, 24, 0, 25, 0, 15, 39,
+  25, 35, 17, 0, 0, 31, 47, 29, 0, 0,
+  0, 45, 0, 0, 0, 0, 38, 0, 3, 0,
+  0, 1, 0, 22, 25, 0, 0, 20, 0, 0,
+  0, 0, 1, 125, 0, 0, 0, 0, 0, 0,
+  59, 8, 0, 44, 12, 40, 18, 0, 40, 6,
+  0, 49, 0, 0, 0, 0, 0, 14, 40, 0,
+  0, 17, 0, 8, 0, 16, 0, 48, 35, 47,
+  0, 33, 1, 0, 7, 27, 0, 35, 0, 77,
+  28, 0, 14, 0, 38, 0, 36, 0, 0, 14,
+  0, 11, 0, 0, 0, 3, 8, 0, 16, 34,
+  27, 15, 0, 70, 0, 0, 0, 26, 7, 0,
+  14, 12, 42, 0, 12, 0, 8, 25, 0, 47,
+  52, 0, 15, 13, 0, 0, 17, 28, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 32, 29, 12,
+  0, 47, 0, 0, 66, 14, 50, 0, 35, 14,
+  18, 0, 67, 1, 0, 0, 19, 83, 100, 57,
+  60, 86, 0, 0, 16, 0, 0, 0, 1, 37,
+  9, 22, 45, 0, 3, 24, 0, 9, 0, 26,
+  12, 0, 0, 30, 0, 58, 0, 45, 5, 36,
+  29, 8, 0, 14, 0, 6, 0, 0, 0, 30,
+  1, 47, 31, 38, 0, 0, 15, 0, 0, 0,
+  7, 0, 28, 11, 0, 0, 0, 19, 0, 0,
+  0, 0, 25, 0, 71, 0, 0, 0, 48, 11,
+  37, 0, 0, 0, 0, 14, 0, 10, 19, 113,
+  22, 41, 0, 37, 0, 20, 39, 0, 0, 0,
+  11, 0, 10, 0, 0, 52, 9, 11, 0, 0,
+  76, 50, 5, 16, 33, 0, 25, 22, 0, 4,
+  0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+  34, 0, 47, 18, 11, 11, 105, 33, 25, 144,
+  0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+  17, 5, 23, 0, 0, 94, 8, 12, 0, 0,
+  0, 0, 0, 52, 0, 26, 0, 34, 0, 30,
+  0, 0, 0, 25, 0, 0, 0, 39, 0, 0,
+  23, 37, 0, 0, 0, 86, 0, 0, 64, 0,
+  59, 0, 41, 0, 0, 32, 0, 17, 51, 3,
+  0, 0, 41, 0, 4, 7, 56, 0, 27, 0,
+  0, 0, 0, 10, 0, 0, 45, 50, 55, 11,
+  0, 9, 2, 0, 0, 0, 20, 0, 18, 0,
+  0, 0, 20, 19, 0, 0, 0, 0, 22, 38,
+  4, 0, 0, 0, 37, 28, 0, 0, 0, 0,
+  63, 0, 8, 0, 0, 0, 0, 12, 39, 5,
+  0, 0, 0, 2, 46, 0, 14, 18, 11, 0,
+  12, 0, 0, 11, 59, 26, 0, 39, 3, 30,
+  27, 0, 68, 23, 33, 23, 0, 0, 0, 0,
+  0, 0, 61, 0, 0, 0, 0, 7, 0, 8,
+  0, 25, 64, 32, 0, 78, 13, 0, 0, 10,
+  0, 12, 0, 114, 19, 0, 44, 0, 53, 0,
+  52, 0, 0, 0, 0, 20, 19, 0, 0, 11,
+  0, 0, 0, 19, 15, 39, 5, 36, 0, 0,
+  0, 0, 27, 0, 8, 0, 65, 1, 0, 0,
+  39, 0, 0, 25, 36, 0, 0, 17, 0, 0,
+  33, 36, 0, 0, 0, 0, 22, 0, 0, 0,
+  0, 13, 66, 18, 0, 34, 0, 0, 63, 12,
+  74, 5, 47, 3, 0, 0, 82, 14, 12, 0,
+  24, 50, 130, 56, 9, 113, 0, 0, 0, 0,
+  0, 0, 18, 53, 0, 15, 32, 9, 0, 14,
+  0, 26, 0, 12, 0, 0, 0, 0, 0, 68,
+  18, 55, 0, 60, 43, 18, 30, 1, 0, 18,
+  0, 0, 0, 3, 0, 17, 0, 39, 0, 0,
+  36, 38, 0, 0, 41, 0, 32, 16, 29, 0,
+  0, 0, 0, 0, 31, 0, 0, 0, 41, 0,
+  0, 0, 42, 0, 0, 3, 0, 0, 2, 46,
+  0, 22, 20, 94, 27, 22, 13, 1, 28, 26,
+  6, 0, 0, 0, 15, 0, 0, 0, 0, 25,
+  2, 0, 0, 0, 20, 67, 0, 0, 0, 2,
+  64, 0, 0, 16, 0, 0, 21, 0, 0, 13,
+  0, 0, 0, 18, 28, 25, 23, 8, 18, 29,
+  81, 2, 20, 83, 0, 0, 0, 0, 0, 0,
+  29, 22, 0, 0, 11, 0, 22, 0, 16, 80,
+  7, 25, 0, 0, 0, 0, 0, 50, 53, 0,
+  0, 40, 19, 7, 0, 0, 0, 34, 18, 28,
+  0, 28, 19, 0, 0, 38, 0, 0, 0, 100,
+  0, 0, 72, 0, 56, 27, 67, 0, 0, 10,
+  0, 45, 0, 38, 0, 0, 0, 0, 0, 13,
+  35, 21, 7, 22, 0, 0, 0, 14, 4, 0,
+  18, 9, 61, 9, 0, 0, 33, 0, 0, 2,
+  69, 0, 11, 0, 0, 0, 29, 21, 0, 0,
+  0, 0, 26, 25, 0, 0, 0, 32, 64, 0,
+  0, 16, 0, 0, 50, 0, 17, 27, 16, 8,
+  0, 0, 53, 22, 0, 8, 0, 3, 48, 0,
+  28, 0, 0, 0, 12, 0, 0, 8, 33, 45,
+  0, 3, 0, 28, 37, 0, 73, 40, 75, 3,
+  0, 0, 0, 6, 0, 0, 38, 0, 0, 0,
+  0, 17, 0, 11, 18, 0, 45, 20, 0, 94,
+  30, 2, 0, 37, 0, 0, 0, 118, 0, 0,
+  57, 0, 32, 0, 52, 0, 0, 0, 6, 0,
+  65, 0, 0, 28, 0, 6, 0, 7, 0, 28,
+  10, 0, 0, 0, 0, 0, 20, 0, 18, 0,
+  66, 3, 0, 0, 33, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 33, 47, 0, 0, 0, 0,
+  30, 0, 0, 0, 0, 0, 68, 9, 0, 32,
+  0, 0, 91, 10, 53, 25, 59, 0, 0, 0,
+  63, 11, 16, 0, 17, 8, 86, 68, 23, 217,
+  0, 0, 29, 0, 0, 0, 32, 0, 0, 0,
+  31, 18, 66, 0, 0, 112, 15, 8, 7, 0,
+  0, 35, 0, 72, 0, 82, 0, 0, 0, 30,
+  0, 0, 1, 0, 0, 19, 0, 19, 0, 50,
+  59, 42, 0, 14, 0, 45, 0, 0, 97, 0,
+  62, 0, 33, 0, 0, 70, 0, 0, 53, 0,
+  0, 26, 12, 6, 27, 25, 76, 0, 0, 26,
+  25, 0, 0, 18, 0, 0, 77, 83, 0, 0,
+  0, 18, 0, 4, 54, 0, 0, 0, 24, 0,
+  25, 0, 15, 39, 25, 35, 17, 0, 0, 31,
+  47, 29, 0, 0, 0, 45, 0, 0, 0, 0,
+  38, 0, 3, 0, 0, 1, 0, 22, 25, 0,
+  0, 20, 0, 0, 0, 0, 1, 125, 0, 0,
+  0, 0, 0, 0, 59, 8, 0, 44, 12, 40,
+  18, 0, 40, 6, 0, 49, 0, 0, 0, 0,
+  0, 14, 40, 0, 0, 17, 0, 8, 0, 16,
+  0, 48, 35, 47, 0, 33, 1, 0, 7, 27,
+  0, 35, 0, 77, 28, 0, 14, 0, 38, 0,
+  36, 0, 0, 14, 0, 11, 0, 0, 0, 3,
+  8, 0, 16, 34, 27, 15, 0, 70, 0, 0,
+  0, 26, 7, 0, 14, 12, 42, 0, 12, 0,
+  8, 25, 0, 47, 52, 0, 15, 13, 0, 0,
+  17, 28, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 32, 29, 12, 0, 47, 0, 0, 66, 14,
+  50, 0, 35, 14, 18, 0, 67, 1, 0, 0,
+  0, 0, 77, 0, 0, 0, 2, 0, 0, 0,
+  0, 1, 29, 58, 0, 41, 0, 69, 29, 7,
+  59, 19, 117, 17, 0, 0, 0, 5, 0, 0,
+  15, 0, 0, 0, 0, 13, 0, 12, 0, 0,
+  66, 0, 0, 79, 32, 0, 0, 0, 0, 6,
+  0, 87, 7, 0, 39, 0, 49, 0, 7, 0,
+  0, 1, 10, 0, 77, 0, 0, 21, 0, 50,
+  0, 0, 2, 19, 0, 7, 0, 0, 0, 0,
+  19, 0, 2, 0, 62, 8, 0, 0, 25, 0,
+  0, 13, 0, 0, 16, 30, 0, 0, 0, 54,
+  3, 0, 0, 0, 20, 0, 0, 0, 0, 0,
+  62, 11, 0, 38, 13, 0, 89, 23, 44, 14,
+  34, 0, 0, 0, 57, 0, 15, 0, 11, 11,
+  105, 33, 25, 144, 0, 0, 0, 0, 0, 0,
+  17, 0, 0, 0, 17, 5, 23, 0, 0, 94,
+  8, 12, 0, 0, 0, 0, 0, 52, 0, 26,
+  0, 34, 0, 30, 0, 0, 0, 25, 0, 0,
+  0, 39, 0, 0, 23, 37, 0, 0, 0, 86,
+  0, 0, 64, 0, 59, 0, 41, 0, 0, 32,
+  0, 17, 51, 3, 0, 0, 41, 0, 4, 7,
+  56, 0, 27, 0, 0, 0, 0, 10, 0, 0,
+  45, 50, 55, 11, 0, 9, 2, 0, 0, 0,
+  20, 0, 18, 0, 0, 0, 20, 19, 0, 0,
+  0, 0, 22, 38, 4, 0, 0, 0, 37, 28,
+  0, 0, 0, 0, 63, 0, 8, 0, 0, 0,
+  0, 12, 39, 5, 0, 0, 0, 2, 46, 0,
+  14, 18, 11, 0, 12, 0, 0, 11, 59, 26,
+  0, 39, 3, 30, 27, 0, 68, 23, 33, 23,
+  0, 0, 0, 0, 0, 0, 61, 0, 0, 0,
+  0, 7, 0, 8, 0, 25, 64, 32, 0, 78,
+  13, 0, 0, 10, 0, 12, 0, 114, 19, 0,
+  44, 0, 53, 0, 52, 0, 0, 0, 0, 20,
+  19, 0, 0, 11, 0, 0, 0, 19, 15, 39,
+  5, 36, 0, 0, 0, 0, 27, 0, 8, 0,
+  65, 1, 0, 0, 39, 0, 0, 25, 36, 0,
+  0, 17, 0, 0, 33, 36, 0, 0, 0, 0,
+  22, 0, 0, 0, 0, 13, 66, 18, 0, 34,
+  0, 0, 63, 12, 74, 5, 47, 3, 0, 0,
+  82, 14, 12, 0, 5, 0, 69, 0, 12, 8,
+  0, 0, 19, 0, 0, 0, 40, 75, 0, 7,
+  0, 50, 40, 0, 68, 50, 83, 1, 0, 0,
+  0, 31, 0, 3, 20, 0, 0, 0, 0, 5,
+  0, 22, 0, 0, 22, 4, 0, 91, 26, 21,
+  0, 48, 0, 0, 1, 153, 0, 0, 66, 0,
+  33, 0, 18, 0, 0, 0, 11, 0, 112, 0,
+  0, 0, 0, 59, 0, 0, 0, 7, 0, 0,
+  0, 0, 0, 0, 9, 0, 15, 0, 36, 8,
+  0, 0, 45, 0, 0, 0, 0, 0, 6, 8,
+  0, 0, 1, 53, 30, 0, 0, 0, 16, 0,
+  0, 5, 5, 0, 72, 5, 0, 42, 10, 0,
+  150, 0, 30, 25, 71, 0, 0, 0, 50, 0,
+  12, 0, 18, 29, 81, 2, 20, 83, 0, 0,
+  0, 0, 0, 0, 29, 22, 0, 0, 11, 0,
+  22, 0, 16, 80, 7, 25, 0, 0, 0, 0,
+  0, 50, 53, 0, 0, 40, 19, 7, 0, 0,
+  0, 34, 18, 28, 0, 28, 19, 0, 0, 38,
+  0, 0, 0, 100, 0, 0, 72, 0, 56, 27,
+  67, 0, 0, 10, 0, 45, 0, 38, 0, 0,
+  0, 0, 0, 13, 35, 21, 7, 22, 0, 0,
+  0, 14, 4, 0, 18, 9, 61, 9, 0, 0,
+  33, 0, 0, 2, 69, 0, 11, 0, 0, 0,
+  29, 21, 0, 0, 0, 0, 26, 25, 0, 0,
+  0, 32, 64, 0, 0, 16, 0, 0, 50, 0,
+  17, 27, 16, 8, 0, 0, 53, 22, 0, 8,
+  0, 3, 48, 0, 28, 0, 0, 0, 12, 0,
+  0, 8, 33, 45, 0, 3, 0, 28, 37, 0,
+  73, 40, 75, 3, 0, 0, 0, 6, 0, 0,
+  38, 0, 0, 0, 0, 17, 0, 11, 18, 0,
+  45, 20, 0, 94, 30, 2, 0, 37, 0, 0,
+  0, 118, 0, 0, 57, 0, 32, 0, 52, 0,
+  0, 0, 6, 0, 65, 0, 0, 28, 0, 6,
+  0, 7, 0, 28, 10, 0, 0, 0, 0, 0,
+  20, 0, 18, 0, 66, 3, 0, 0, 33, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 33, 47,
+  0, 0, 0, 0, 30, 0, 0, 0, 0, 0,
+  68, 9, 0, 32, 0, 0, 91, 10, 53, 25,
+  59, 0, 0, 0, 63, 11, 16, 0, 8, 0,
+  33, 0, 50, 5, 0, 0, 41, 0, 0, 0,
+  30, 75, 0, 0, 0, 14, 33, 0, 50, 46,
+  16, 2, 0, 0, 0, 31, 0, 34, 0, 0,
+  0, 0, 0, 2, 0, 20, 0, 0, 0, 0,
+  0, 77, 19, 41, 0, 85, 0, 0, 0, 170,
+  0, 6, 47, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 84, 0, 0, 0, 0, 41, 0, 0,
+  0, 17, 0, 0, 0, 0, 0, 0, 22, 0,
+  8, 0, 16, 0, 0, 30, 54, 0, 23, 0,
+  0, 0, 0, 0, 8, 0, 0, 58, 30, 0,
+  2, 0, 14, 0, 12, 18, 40, 0, 63, 5,
+  0, 35, 4, 0, 159, 0, 5, 42, 83, 1,
+  29, 0, 53, 0, 1, 0, 0, 0, 0, 0,
+  1, 125, 0, 0, 0, 0, 0, 0, 59, 8,
+  0, 44, 12, 40, 18, 0, 40, 6, 0, 49,
+  0, 0, 0, 0, 0, 14, 40, 0, 0, 17,
+  0, 8, 0, 16, 0, 48, 35, 47, 0, 33,
+  1, 0, 7, 27, 0, 35, 0, 77, 28, 0,
+  14, 0, 38, 0, 36, 0, 0, 14, 0, 11,
+  0, 0, 0, 3, 8, 0, 16, 34, 27, 15,
+  0, 70, 0, 0, 0, 26, 7, 0, 14, 12,
+  42, 0, 12, 0, 8, 25, 0, 47, 52, 0,
+  15, 13, 0, 0, 17, 28, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 32, 29, 12, 0, 47,
+  0, 0, 66, 14, 50, 0, 35, 14, 18, 0,
+  67, 1, 0, 0, 0, 0, 77, 0, 0, 0,
+  2, 0, 0, 0, 0, 1, 29, 58, 0, 41,
+  0, 69, 29, 7, 59, 19, 117, 17, 0, 0,
+  0, 5, 0, 0, 15, 0, 0, 0, 0, 13,
+  0, 12, 0, 0, 66, 0, 0, 79, 32, 0,
+  0, 0, 0, 6, 0, 87, 7, 0, 39, 0,
+  49, 0, 7, 0, 0, 1, 10, 0, 77, 0,
+  0, 21, 0, 50, 0, 0, 2, 19, 0, 7,
+  0, 0, 0, 0, 19, 0, 2, 0, 62, 8,
+  0, 0, 25, 0, 0, 13, 0, 0, 16, 30,
+  0, 0, 0, 54, 3, 0, 0, 0, 20, 0,
+  0, 0, 0, 0, 62, 11, 0, 38, 13, 0,
+  89, 23, 44, 14, 34, 0, 0, 0, 57, 0,
+  15, 0, 25, 0, 64, 0, 17, 12, 0, 0,
+  23, 0, 0, 6, 16, 72, 0, 0, 0, 19,
+  42, 0, 48, 60, 61, 0, 0, 0, 0, 26,
+  0, 41, 0, 0, 0, 0, 0, 3, 0, 6,
+  0, 0, 0, 0, 0, 69, 18, 17, 0, 65,
+  0, 0, 0, 167, 0, 0, 66, 0, 29, 0,
+  4, 0, 0, 0, 24, 0, 113, 0, 0, 10,
+  0, 64, 0, 4, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 12, 0, 32, 1, 0, 15,
+  43, 0, 26, 0, 0, 0, 27, 0, 11, 0,
+  0, 71, 39, 0, 0, 0, 13, 0, 0, 24,
+  30, 0, 73, 0, 0, 44, 14, 0, 155, 0,
+  5, 26, 74, 0, 0, 0, 54, 0, 0, 0,
+  0, 2, 46, 0, 14, 18, 11, 0, 12, 0,
+  0, 11, 59, 26, 0, 39, 3, 30, 27, 0,
+  68, 23, 33, 23, 0, 0, 0, 0, 0, 0,
+  61, 0, 0, 0, 0, 7, 0, 8, 0, 25,
+  64, 32, 0, 78, 13, 0, 0, 10, 0, 12,
+  0, 114, 19, 0, 44, 0, 53, 0, 52, 0,
+  0, 0, 0, 20, 19, 0, 0, 11, 0, 0,
+  0, 19, 15, 39, 5, 36, 0, 0, 0, 0,
+  27, 0, 8, 0, 65, 1, 0, 0, 39, 0,
+  0, 25, 36, 0, 0, 17, 0, 0, 33, 36,
+  0, 0, 0, 0, 22, 0, 0, 0, 0, 13,
+  66, 18, 0, 34, 0, 0, 63, 12, 74, 5,
+  47, 3, 0, 0, 82, 14, 12, 0, 5, 0,
+  69, 0, 12, 8, 0, 0, 19, 0, 0, 0,
+  40, 75, 0, 7, 0, 50, 40, 0, 68, 50,
+  83, 1, 0, 0, 0, 31, 0, 3, 20, 0,
+  0, 0, 0, 5, 0, 22, 0, 0, 22, 4,
+  0, 91, 26, 21, 0, 48, 0, 0, 1, 153,
+  0, 0, 66, 0, 33, 0, 18, 0, 0, 0,
+  11, 0, 112, 0, 0, 0, 0, 59, 0, 0,
+  0, 7, 0, 0, 0, 0, 0, 0, 9, 0,
+  15, 0, 36, 8, 0, 0, 45, 0, 0, 0,
+  0, 0, 6, 8, 0, 0, 1, 53, 30, 0,
+  0, 0, 16, 0, 0, 5, 5, 0, 72, 5,
+  0, 42, 10, 0, 150, 0, 30, 25, 71, 0,
+  0, 0, 50, 0, 12, 0, 0, 0, 9, 0,
+  23, 7, 0, 0, 42, 0, 0, 0, 8, 47,
+  0, 0, 0, 0, 32, 0, 34, 11, 0, 18,
+  0, 0, 19, 48, 0, 74, 0, 0, 9, 0,
+  0, 0, 0, 14, 0, 0, 0, 0, 0, 37,
+  0, 40, 0, 86, 0, 0, 8, 140, 13, 21,
+  34, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+  51, 0, 0, 0, 0, 14, 0, 9, 0, 0,
+  0, 24, 0, 0, 0, 11, 28, 0, 0, 0,
+  0, 0, 0, 47, 50, 10, 57, 0, 0, 0,
+  10, 0, 28, 0, 0, 84, 46, 0, 26, 0,
+  7, 0, 21, 14, 59, 0, 50, 0, 0, 36,
+  7, 0, 152, 0, 0, 31, 100, 6, 74, 0,
+  41, 0, 0, 0, 0, 3, 48, 0, 28, 0,
+  0, 0, 12, 0, 0, 8, 33, 45, 0, 3,
+  0, 28, 37, 0, 73, 40, 75, 3, 0, 0,
+  0, 6, 0, 0, 38, 0, 0, 0, 0, 17,
+  0, 11, 18, 0, 45, 20, 0, 94, 30, 2,
+  0, 37, 0, 0, 0, 118, 0, 0, 57, 0,
+  32, 0, 52, 0, 0, 0, 6, 0, 65, 0,
+  0, 28, 0, 6, 0, 7, 0, 28, 10, 0,
+  0, 0, 0, 0, 20, 0, 18, 0, 66, 3,
+  0, 0, 33, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 33, 47, 0, 0, 0, 0, 30, 0,
+  0, 0, 0, 0, 68, 9, 0, 32, 0, 0,
+  91, 10, 53, 25, 59, 0, 0, 0, 63, 11,
+  16, 0, 8, 0, 33, 0, 50, 5, 0, 0,
+  41, 0, 0, 0, 30, 75, 0, 0, 0, 14,
+  33, 0, 50, 46, 16, 2, 0, 0, 0, 31,
+  0, 34, 0, 0, 0, 0, 0, 2, 0, 20,
+  0, 0, 0, 0, 0, 77, 19, 41, 0, 85,
+  0, 0, 0, 170, 0, 6, 47, 0, 22, 0,
+  0, 0, 0, 0, 0, 0, 84, 0, 0, 0,
+  0, 41, 0, 0, 0, 17, 0, 0, 0, 0,
+  0, 0, 22, 0, 8, 0, 16, 0, 0, 30,
+  54, 0, 23, 0, 0, 0, 0, 0, 8, 0,
+  0, 58, 30, 0, 2, 0, 14, 0, 12, 18,
+  40, 0, 63, 5, 0, 35, 4, 0, 159, 0,
+  5, 42, 83, 1, 29, 0, 53, 0, 1, 0,
+  0, 0, 0, 0, 8, 8, 0, 23, 35, 18,
+  0, 1, 2, 8, 0, 7, 6, 22, 10, 0,
+  3, 0, 0, 46, 0, 0, 38, 57, 0, 84,
+  0, 0, 66, 0, 0, 0, 0, 16, 0, 0,
+  0, 0, 1, 25, 24, 69, 0, 69, 0, 1,
+  25, 65, 56, 29, 12, 5, 16, 0, 0, 0,
+  0, 6, 0, 0, 0, 0, 12, 0, 0, 0,
+  0, 0, 13, 10, 0, 63, 0, 0, 0, 19,
+  57, 0, 0, 20, 0, 0, 0, 46, 34, 26,
+  87, 1, 0, 0, 7, 0, 9, 0, 0, 65,
+  36, 0, 32, 0, 1, 0, 50, 0, 55, 43,
+  17, 0, 0, 23, 0, 0, 119, 0, 0, 38,
+  90, 12, 104, 0, 46, 0, 0, 0, 0, 0,
+  77, 0, 0, 0, 2, 0, 0, 0, 0, 1,
+  29, 58, 0, 41, 0, 69, 29, 7, 59, 19,
+  117, 17, 0, 0, 0, 5, 0, 0, 15, 0,
+  0, 0, 0, 13, 0, 12, 0, 0, 66, 0,
+  0, 79, 32, 0, 0, 0, 0, 6, 0, 87,
+  7, 0, 39, 0, 49, 0, 7, 0, 0, 1,
+  10, 0, 77, 0, 0, 21, 0, 50, 0, 0,
+  2, 19, 0, 7, 0, 0, 0, 0, 19, 0,
+  2, 0, 62, 8, 0, 0, 25, 0, 0, 13,
+  0, 0, 16, 30, 0, 0, 0, 54, 3, 0,
+  0, 0, 20, 0, 0, 0, 0, 0, 62, 11,
+  0, 38, 13, 0, 89, 23, 44, 14, 34, 0,
+  0, 0, 57, 0, 15, 0, 25, 0, 64, 0,
+  17, 12, 0, 0, 23, 0, 0, 6, 16, 72,
+  0, 0, 0, 19, 42, 0, 48, 60, 61, 0,
+  0, 0, 0, 26, 0, 41, 0, 0, 0, 0,
+  0, 3, 0, 6, 0, 0, 0, 0, 0, 69,
+  18, 17, 0, 65, 0, 0, 0, 167, 0, 0,
+  66, 0, 29, 0, 4, 0, 0, 0, 24, 0,
+  113, 0, 0, 10, 0, 64, 0, 4, 0, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 12, 0,
+  32, 1, 0, 15, 43, 0, 26, 0, 0, 0,
+  27, 0, 11, 0, 0, 71, 39, 0, 0, 0,
+  13, 0, 0, 24, 30, 0, 73, 0, 0, 44,
+  14, 0, 155, 0, 5, 26, 74, 0, 0, 0,
+  54, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  0, 14, 34, 15, 0, 0, 26, 34, 0, 0,
+  0, 21, 29, 0, 8, 0, 0, 45, 0, 0,
+  48, 64, 6, 83, 0, 0, 55, 0, 0, 0,
+  0, 1, 0, 5, 0, 0, 0, 16, 10, 46,
+  0, 58, 0, 8, 7, 104, 37, 30, 33, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  6, 0, 0, 19, 0, 0, 21, 0, 0, 63,
+  0, 0, 0, 9, 39, 0, 0, 13, 0, 0,
+  0, 59, 43, 21, 114, 3, 0, 0, 28, 0,
+  36, 0, 0, 91, 40, 0, 32, 0, 7, 0,
+  28, 8, 75, 20, 37, 0, 0, 8, 5, 0,
+  131, 0, 0, 37, 103, 0, 101, 0, 70, 0,
+  0, 0, 5, 0, 69, 0, 12, 8, 0, 0,
+  19, 0, 0, 0, 40, 75, 0, 7, 0, 50,
+  40, 0, 68, 50, 83, 1, 0, 0, 0, 31,
+  0, 3, 20, 0, 0, 0, 0, 5, 0, 22,
+  0, 0, 22, 4, 0, 91, 26, 21, 0, 48,
+  0, 0, 1, 153, 0, 0, 66, 0, 33, 0,
+  18, 0, 0, 0, 11, 0, 112, 0, 0, 0,
+  0, 59, 0, 0, 0, 7, 0, 0, 0, 0,
+  0, 0, 9, 0, 15, 0, 36, 8, 0, 0,
+  45, 0, 0, 0, 0, 0, 6, 8, 0, 0,
+  1, 53, 30, 0, 0, 0, 16, 0, 0, 5,
+  5, 0, 72, 5, 0, 42, 10, 0, 150, 0,
+  30, 25, 71, 0, 0, 0, 50, 0, 12, 0,
+  0, 0, 9, 0, 23, 7, 0, 0, 42, 0,
+  0, 0, 8, 47, 0, 0, 0, 0, 32, 0,
+  34, 11, 0, 18, 0, 0, 19, 48, 0, 74,
+  0, 0, 9, 0, 0, 0, 0, 14, 0, 0,
+  0, 0, 0, 37, 0, 40, 0, 86, 0, 0,
+  8, 140, 13, 21, 34, 0, 22, 0, 0, 0,
+  0, 0, 0, 0, 51, 0, 0, 0, 0, 14,
+  0, 9, 0, 0, 0, 24, 0, 0, 0, 11,
+  28, 0, 0, 0, 0, 0, 0, 47, 50, 10,
+  57, 0, 0, 0, 10, 0, 28, 0, 0, 84,
+  46, 0, 26, 0, 7, 0, 21, 14, 59, 0,
+  50, 0, 0, 36, 7, 0, 152, 0, 0, 31,
+  100, 6, 74, 0, 41, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 24, 26, 15, 20, 0, 5,
+  0, 0, 4, 23, 15, 29, 19, 5, 0, 0,
+  0, 56, 21, 39, 37, 55, 0, 52, 0, 0,
+  82, 0, 11, 0, 0, 14, 0, 19, 0, 6,
+  0, 1, 10, 45, 30, 46, 0, 40, 24, 27,
+  55, 43, 0, 0, 9, 0, 0, 42, 0, 0,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 2,
+  11, 0, 20, 67, 0, 0, 0, 27, 69, 0,
+  0, 21, 0, 0, 2, 43, 16, 39, 82, 7,
+  0, 0, 15, 0, 21, 0, 0, 53, 8, 0,
+  42, 0, 0, 0, 48, 0, 67, 45, 15, 0,
+  2, 4, 0, 0, 73, 0, 0, 11, 69, 15,
+  131, 0, 65, 0, 0, 0, 8, 0, 33, 0,
+  50, 5, 0, 0, 41, 0, 0, 0, 30, 75,
+  0, 0, 0, 14, 33, 0, 50, 46, 16, 2,
+  0, 0, 0, 31, 0, 34, 0, 0, 0, 0,
+  0, 2, 0, 20, 0, 0, 0, 0, 0, 77,
+  19, 41, 0, 85, 0, 0, 0, 170, 0, 6,
+  47, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+  84, 0, 0, 0, 0, 41, 0, 0, 0, 17,
+  0, 0, 0, 0, 0, 0, 22, 0, 8, 0,
+  16, 0, 0, 30, 54, 0, 23, 0, 0, 0,
+  0, 0, 8, 0, 0, 58, 30, 0, 2, 0,
+  14, 0, 12, 18, 40, 0, 63, 5, 0, 35,
+  4, 0, 159, 0, 5, 42, 83, 1, 29, 0,
+  53, 0, 1, 0, 0, 0, 0, 0, 8, 8,
+  0, 23, 35, 18, 0, 1, 2, 8, 0, 7,
+  6, 22, 10, 0, 3, 0, 0, 46, 0, 0,
+  38, 57, 0, 84, 0, 0, 66, 0, 0, 0,
+  0, 16, 0, 0, 0, 0, 1, 25, 24, 69,
+  0, 69, 0, 1, 25, 65, 56, 29, 12, 5,
+  16, 0, 0, 0, 0, 6, 0, 0, 0, 0,
+  12, 0, 0, 0, 0, 0, 13, 10, 0, 63,
+  0, 0, 0, 19, 57, 0, 0, 20, 0, 0,
+  0, 46, 34, 26, 87, 1, 0, 0, 7, 0,
+  9, 0, 0, 65, 36, 0, 32, 0, 1, 0,
+  50, 0, 55, 43, 17, 0, 0, 23, 0, 0,
+  119, 0, 0, 38, 90, 12, 104, 0, 46, 0,
+  0, 0, 0, 20, 0, 0, 0, 0, 29, 14,
+  2, 19, 0, 0, 0, 0, 38, 41, 27, 40,
+  14, 6, 0, 0, 0, 54, 43, 60, 8, 44,
+  0, 27, 0, 0, 65, 7, 13, 0, 0, 22,
+  3, 41, 0, 34, 37, 0, 17, 26, 31, 26,
+  0, 52, 14, 29, 52, 44, 0, 0, 0, 0,
+  0, 20, 0, 0, 0, 0, 0, 10, 54, 0,
+  11, 0, 0, 0, 18, 12, 28, 41, 0, 0,
+  0, 31, 87, 0, 6, 24, 0, 0, 7, 23,
+  21, 17, 38, 3, 0, 3, 0, 15, 11, 0,
+  0, 33, 0, 2, 25, 0, 0, 0, 36, 0,
+  28, 44, 10, 0, 0, 0, 0, 0, 17, 0,
+  0, 11, 27, 15, 97, 0, 59, 0, 0, 0,
+  25, 0, 64, 0, 17, 12, 0, 0, 23, 0,
+  0, 6, 16, 72, 0, 0, 0, 19, 42, 0,
+  48, 60, 61, 0, 0, 0, 0, 26, 0, 41,
+  0, 0, 0, 0, 0, 3, 0, 6, 0, 0,
+  0, 0, 0, 69, 18, 17, 0, 65, 0, 0,
+  0, 167, 0, 0, 66, 0, 29, 0, 4, 0,
+  0, 0, 24, 0, 113, 0, 0, 10, 0, 64,
+  0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 12, 0, 32, 1, 0, 15, 43, 0,
+  26, 0, 0, 0, 27, 0, 11, 0, 0, 71,
+  39, 0, 0, 0, 13, 0, 0, 24, 30, 0,
+  73, 0, 0, 44, 14, 0, 155, 0, 5, 26,
+  74, 0, 0, 0, 54, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 0, 14, 34, 15, 0, 0,
+  26, 34, 0, 0, 0, 21, 29, 0, 8, 0,
+  0, 45, 0, 0, 48, 64, 6, 83, 0, 0,
+  55, 0, 0, 0, 0, 1, 0, 5, 0, 0,
+  0, 16, 10, 46, 0, 58, 0, 8, 7, 104,
+  37, 30, 33, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 6, 0, 0, 19, 0, 0,
+  21, 0, 0, 63, 0, 0, 0, 9, 39, 0,
+  0, 13, 0, 0, 0, 59, 43, 21, 114, 3,
+  0, 0, 28, 0, 36, 0, 0, 91, 40, 0,
+  32, 0, 7, 0, 28, 8, 75, 20, 37, 0,
+  0, 8, 5, 0, 131, 0, 0, 37, 103, 0,
+  101, 0, 70, 0, 0, 0, 0, 6, 23, 5,
+  0, 0, 44, 22, 34, 36, 0, 0, 1, 0,
+  0, 41, 20, 23, 3, 8, 0, 0, 0, 69,
+  18, 19, 51, 49, 164, 7, 0, 0, 85, 0,
+  15, 0, 0, 31, 6, 63, 0, 3, 29, 0,
+  23, 56, 20, 0, 0, 47, 0, 43, 48, 47,
+  7, 0, 0, 20, 0, 28, 0, 23, 0, 0,
+  0, 3, 58, 0, 2, 0, 18, 22, 54, 25,
+  23, 58, 0, 0, 0, 13, 76, 0, 7, 17,
+  0, 0, 4, 37, 62, 48, 83, 0, 0, 0,
+  8, 13, 24, 0, 0, 55, 0, 0, 26, 0,
+  38, 0, 56, 0, 44, 17, 29, 0, 10, 0,
+  0, 0, 37, 0, 0, 16, 21, 0, 77, 0,
+  71, 0, 5, 0, 0, 0, 9, 0, 23, 7,
+  0, 0, 42, 0, 0, 0, 8, 47, 0, 0,
+  0, 0, 32, 0, 34, 11, 0, 18, 0, 0,
+  19, 48, 0, 74, 0, 0, 9, 0, 0, 0,
+  0, 14, 0, 0, 0, 0, 0, 37, 0, 40,
+  0, 86, 0, 0, 8, 140, 13, 21, 34, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 51, 0,
+  0, 0, 0, 14, 0, 9, 0, 0, 0, 24,
+  0, 0, 0, 11, 28, 0, 0, 0, 0, 0,
+  0, 47, 50, 10, 57, 0, 0, 0, 10, 0,
+  28, 0, 0, 84, 46, 0, 26, 0, 7, 0,
+  21, 14, 59, 0, 50, 0, 0, 36, 7, 0,
+  152, 0, 0, 31, 100, 6, 74, 0, 41, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 24, 26,
+  15, 20, 0, 5, 0, 0, 4, 23, 15, 29,
+  19, 5, 0, 0, 0, 56, 21, 39, 37, 55,
+  0, 52, 0, 0, 82, 0, 11, 0, 0, 14,
+  0, 19, 0, 6, 0, 1, 10, 45, 30, 46,
+  0, 40, 24, 27, 55, 43, 0, 0, 9, 0,
+  0, 42, 0, 0, 0, 0, 0, 0, 32, 0,
+  0, 0, 0, 2, 11, 0, 20, 67, 0, 0,
+  0, 27, 69, 0, 0, 21, 0, 0, 2, 43,
+  16, 39, 82, 7, 0, 0, 15, 0, 21, 0,
+  0, 53, 8, 0, 42, 0, 0, 0, 48, 0,
+  67, 45, 15, 0, 2, 4, 0, 0, 73, 0,
+  0, 11, 69, 15, 131, 0, 65, 0, 0, 0,
+  0, 21, 39, 0, 0, 0, 39, 17, 22, 19,
+  5, 0, 0, 0, 20, 45, 30, 23, 5, 22,
+  0, 0, 0, 63, 27, 30, 38, 35, 115, 0,
+  0, 0, 74, 0, 11, 0, 0, 35, 3, 71,
+  0, 30, 31, 0, 4, 24, 50, 0, 0, 63,
+  18, 33, 32, 49, 0, 0, 0, 28, 0, 17,
+  6, 0, 0, 0, 0, 3, 73, 0, 42, 0,
+  0, 21, 39, 30, 32, 29, 0, 11, 0, 17,
+  87, 0, 23, 13, 0, 0, 7, 29, 62, 11,
+  41, 0, 0, 0, 0, 12, 26, 0, 0, 45,
+  0, 0, 5, 0, 19, 0, 45, 0, 16, 20,
+  23, 0, 12, 0, 0, 0, 0, 0, 0, 4,
+  0, 0, 66, 0, 50, 0, 0, 0, 0, 0,
+  0, 0, 8, 8, 0, 23, 35, 18, 0, 1,
+  2, 8, 0, 7, 6, 22, 10, 0, 3, 0,
+  0, 46, 0, 0, 38, 57, 0, 84, 0, 0,
+  66, 0, 0, 0, 0, 16, 0, 0, 0, 0,
+  1, 25, 24, 69, 0, 69, 0, 1, 25, 65,
+  56, 29, 12, 5, 16, 0, 0, 0, 0, 6,
+  0, 0, 0, 0, 12, 0, 0, 0, 0, 0,
+  13, 10, 0, 63, 0, 0, 0, 19, 57, 0,
+  0, 20, 0, 0, 0, 46, 34, 26, 87, 1,
+  0, 0, 7, 0, 9, 0, 0, 65, 36, 0,
+  32, 0, 1, 0, 50, 0, 55, 43, 17, 0,
+  0, 23, 0, 0, 119, 0, 0, 38, 90, 12,
+  104, 0, 46, 0, 0, 0, 0, 20, 0, 0,
+  0, 0, 29, 14, 2, 19, 0, 0, 0, 0,
+  38, 41, 27, 40, 14, 6, 0, 0, 0, 54,
+  43, 60, 8, 44, 0, 27, 0, 0, 65, 7,
+  13, 0, 0, 22, 3, 41, 0, 34, 37, 0,
+  17, 26, 31, 26, 0, 52, 14, 29, 52, 44,
+  0, 0, 0, 0, 0, 20, 0, 0, 0, 0,
+  0, 10, 54, 0, 11, 0, 0, 0, 18, 12,
+  28, 41, 0, 0, 0, 31, 87, 0, 6, 24,
+  0, 0, 7, 23, 21, 17, 38, 3, 0, 3,
+  0, 15, 11, 0, 0, 33, 0, 2, 25, 0,
+  0, 0, 36, 0, 28, 44, 10, 0, 0, 0,
+  0, 0, 17, 0, 0, 11, 27, 15, 97, 0,
+  59, 0, 0, 0, 0, 21, 41, 0, 0, 0,
+  50, 5, 27, 32, 0, 1, 0, 0, 18, 51,
+  26, 23, 10, 10, 0, 0, 3, 61, 32, 20,
+  24, 36, 100, 0, 0, 0, 68, 0, 15, 0,
+  0, 32, 0, 80, 0, 23, 33, 0, 0, 37,
+  49, 0, 0, 55, 6, 38, 34, 25, 3, 0,
+  7, 18, 0, 1, 6, 9, 0, 0, 0, 11,
+  56, 0, 58, 0, 18, 17, 48, 23, 33, 39,
+  0, 9, 0, 17, 86, 0, 20, 4, 0, 0,
+  14, 27, 46, 6, 34, 0, 0, 0, 0, 10,
+  3, 0, 0, 48, 0, 0, 5, 0, 21, 0,
+  43, 0, 0, 22, 7, 0, 0, 0, 0, 0,
+  0, 3, 4, 1, 0, 0, 46, 0, 47, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 0, 14,
+  34, 15, 0, 0, 26, 34, 0, 0, 0, 21,
+  29, 0, 8, 0, 0, 45, 0, 0, 48, 64,
+  6, 83, 0, 0, 55, 0, 0, 0, 0, 1,
+  0, 5, 0, 0, 0, 16, 10, 46, 0, 58,
+  0, 8, 7, 104, 37, 30, 33, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 6, 0,
+  0, 19, 0, 0, 21, 0, 0, 63, 0, 0,
+  0, 9, 39, 0, 0, 13, 0, 0, 0, 59,
+  43, 21, 114, 3, 0, 0, 28, 0, 36, 0,
+  0, 91, 40, 0, 32, 0, 7, 0, 28, 8,
+  75, 20, 37, 0, 0, 8, 5, 0, 131, 0,
+  0, 37, 103, 0, 101, 0, 70, 0, 0, 0,
+  0, 6, 23, 5, 0, 0, 44, 22, 34, 36,
+  0, 0, 1, 0, 0, 41, 20, 23, 3, 8,
+  0, 0, 0, 69, 18, 19, 51, 49, 164, 7,
+  0, 0, 85, 0, 15, 0, 0, 31, 6, 63,
+  0, 3, 29, 0, 23, 56, 20, 0, 0, 47,
+  0, 43, 48, 47, 7, 0, 0, 20, 0, 28,
+  0, 23, 0, 0, 0, 3, 58, 0, 2, 0,
+  18, 22, 54, 25, 23, 58, 0, 0, 0, 13,
+  76, 0, 7, 17, 0, 0, 4, 37, 62, 48,
+  83, 0, 0, 0, 8, 13, 24, 0, 0, 55,
+  0, 0, 26, 0, 38, 0, 56, 0, 44, 17,
+  29, 0, 10, 0, 0, 0, 37, 0, 0, 16,
+  21, 0, 77, 0, 71, 0, 5, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 24, 26, 15, 20, 0, 5, 0, 0,
+  4, 23, 15, 29, 19, 5, 0, 0, 0, 56,
+  21, 39, 37, 55, 0, 52, 0, 0, 82, 0,
+  11, 0, 0, 14, 0, 19, 0, 6, 0, 1,
+  10, 45, 30, 46, 0, 40, 24, 27, 55, 43,
+  0, 0, 9, 0, 0, 42, 0, 0, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 2, 11, 0,
+  20, 67, 0, 0, 0, 27, 69, 0, 0, 21,
+  0, 0, 2, 43, 16, 39, 82, 7, 0, 0,
+  15, 0, 21, 0, 0, 53, 8, 0, 42, 0,
+  0, 0, 48, 0, 67, 45, 15, 0, 2, 4,
+  0, 0, 73, 0, 0, 11, 69, 15, 131, 0,
+  65, 0, 0, 0, 0, 21, 39, 0, 0, 0,
+  39, 17, 22, 19, 5, 0, 0, 0, 20, 45,
+  30, 23, 5, 22, 0, 0, 0, 63, 27, 30,
+  38, 35, 115, 0, 0, 0, 74, 0, 11, 0,
+  0, 35, 3, 71, 0, 30, 31, 0, 4, 24,
+  50, 0, 0, 63, 18, 33, 32, 49, 0, 0,
+  0, 28, 0, 17, 6, 0, 0, 0, 0, 3,
+  73, 0, 42, 0, 0, 21, 39, 30, 32, 29,
+  0, 11, 0, 17, 87, 0, 23, 13, 0, 0,
+  7, 29, 62, 11, 41, 0, 0, 0, 0, 12,
+  26, 0, 0, 45, 0, 0, 5, 0, 19, 0,
+  45, 0, 16, 20, 23, 0, 12, 0, 0, 0,
+  0, 0, 0, 4, 0, 0, 66, 0, 50, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 20, 0, 0, 0, 0, 29, 14, 2, 19,
+  0, 0, 0, 0, 38, 41, 27, 40, 14, 6,
+  0, 0, 0, 54, 43, 60, 8, 44, 0, 27,
+  0, 0, 65, 7, 13, 0, 0, 22, 3, 41,
+  0, 34, 37, 0, 17, 26, 31, 26, 0, 52,
+  14, 29, 52, 44, 0, 0, 0, 0, 0, 20,
+  0, 0, 0, 0, 0, 10, 54, 0, 11, 0,
+  0, 0, 18, 12, 28, 41, 0, 0, 0, 31,
+  87, 0, 6, 24, 0, 0, 7, 23, 21, 17,
+  38, 3, 0, 3, 0, 15, 11, 0, 0, 33,
+  0, 2, 25, 0, 0, 0, 36, 0, 28, 44,
+  10, 0, 0, 0, 0, 0, 17, 0, 0, 11,
+  27, 15, 97, 0, 59, 0, 0, 0, 0, 21,
+  41, 0, 0, 0, 50, 5, 27, 32, 0, 1,
+  0, 0, 18, 51, 26, 23, 10, 10, 0, 0,
+  3, 61, 32, 20, 24, 36, 100, 0, 0, 0,
+  68, 0, 15, 0, 0, 32, 0, 80, 0, 23,
+  33, 0, 0, 37, 49, 0, 0, 55, 6, 38,
+  34, 25, 3, 0, 7, 18, 0, 1, 6, 9,
+  0, 0, 0, 11, 56, 0, 58, 0, 18, 17,
+  48, 23, 33, 39, 0, 9, 0, 17, 86, 0,
+  20, 4, 0, 0, 14, 27, 46, 6, 34, 0,
+  0, 0, 0, 10, 3, 0, 0, 48, 0, 0,
+  5, 0, 21, 0, 43, 0, 0, 22, 7, 0,
+  0, 0, 0, 0, 0, 3, 4, 1, 0, 0,
+  46, 0, 47, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 79, 42, 0, 0, 0, 53, 0,
+  5, 0, 0, 37, 2, 1, 18, 62, 41, 51,
+  0, 55, 86, 0, 87, 50, 0, 11, 5, 15,
+  128, 37, 1, 0, 72, 0, 36, 0, 0, 27,
+  0, 45, 39, 32, 0, 35, 80, 55, 0, 7,
+  0, 21, 12, 25, 62, 0, 16, 0, 27, 0,
+  29, 0, 13, 0, 11, 0, 0, 0, 25, 0,
+  9, 0, 3, 35, 41, 39, 37, 34, 23, 0,
+  0, 8, 79, 22, 1, 0, 0, 13, 0, 0,
+  82, 36, 0, 0, 20, 0, 0, 51, 0, 0,
+  48, 11, 5, 0, 0, 23, 29, 0, 77, 0,
+  0, 50, 18, 0, 0, 42, 0, 0, 0, 4,
+  5, 13, 24, 0, 0, 0, 28, 0, 34, 0,
+  7, 54, 57, 12, 0, 23, 17, 14, 2, 0,
+  0, 54, 68, 12, 2, 19, 58, 30, 0, 13,
+  72, 61, 94, 10, 0, 0, 0, 26, 0, 0,
+  0, 5, 68, 0, 20, 19, 0, 31, 0, 50,
+  4, 41, 0, 19, 53, 58, 0, 66, 0, 27,
+  0, 55, 24, 0, 51, 0, 26, 0, 10, 0,
+  0, 0, 0, 18, 3, 0, 0, 0, 34, 0,
+  14, 26, 9, 11, 35, 0, 48, 32, 0, 34,
+  37, 0, 35, 0, 0, 7, 0, 0, 0, 5,
+  0, 0, 0, 0, 0, 28, 25, 0, 59, 36,
+  0, 0, 14, 23, 43, 0, 49, 0, 0, 6,
+  11, 5, 0, 11, 0, 0, 8, 0, 8, 0,
+  0, 4, 5, 0, 45, 0, 20, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 59, 38, 0,
+  0, 0, 51, 10, 0, 0, 0, 39, 16, 14,
+  0, 31, 37, 50, 8, 52, 96, 0, 89, 33,
+  0, 0, 10, 17, 130, 11, 0, 0, 60, 0,
+  23, 5, 0, 27, 0, 39, 18, 30, 0, 52,
+  72, 74, 0, 1, 0, 9, 3, 38, 49, 0,
+  21, 0, 26, 0, 35, 0, 7, 0, 20, 0,
+  0, 0, 28, 0, 11, 0, 19, 32, 48, 45,
+  30, 15, 29, 8, 0, 9, 64, 8, 4, 0,
+  0, 0, 0, 0, 71, 23, 0, 0, 12, 0,
+  0, 61, 0, 0, 46, 11, 0, 0, 7, 26,
+  31, 0, 76, 0, 0, 36, 15, 0, 0, 53,
+  0, 0, 0, 21, 21, 27, 13, 0, 0, 0,
+  35, 0, 35, 0, 5, 41, 42, 14, 0, 10,
+  22, 17, 7, 0, 0, 59, 79, 18, 12, 8,
+  57, 30, 0, 8, 80, 64, 78, 4, 4, 0,
+  0, 27, 0, 0, 0, 6, 69, 0, 21, 17,
+  0, 41, 0, 56, 0, 45, 0, 25, 49, 58,
+  0, 46, 0, 36, 0, 53, 24, 7, 45, 0,
+  22, 0, 8, 0, 0, 0, 0, 27, 0, 6,
+  0, 0, 31, 0, 5, 23, 14, 9, 30, 0,
+  48, 35, 0, 35, 39, 0, 24, 0, 2, 0,
+  0, 0, 0, 6, 0, 0, 0, 3, 0, 41,
+  26, 0, 61, 31, 0, 0, 30, 12, 49, 0,
+  50, 0, 0, 4, 7, 3, 0, 14, 0, 0,
+  14, 0, 21, 1, 1, 11, 20, 0, 59, 0,
+  36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 63, 25, 0, 12, 14, 50, 13, 5, 0,
+  0, 23, 35, 0, 0, 30, 38, 31, 5, 54,
+  55, 9, 80, 28, 0, 3, 10, 13, 116, 5,
+  0, 0, 52, 0, 36, 23, 0, 31, 3, 61,
+  0, 33, 0, 63, 55, 73, 9, 21, 0, 8,
+  0, 36, 57, 0, 2, 0, 23, 0, 17, 0,
+  5, 0, 0, 0, 6, 0, 4, 2, 29, 0,
+  67, 27, 41, 25, 49, 11, 15, 14, 0, 5,
+  68, 0, 19, 0, 11, 0, 0, 0, 45, 8,
+  0, 0, 0, 0, 0, 59, 0, 0, 45, 19,
+  0, 0, 13, 20, 31, 0, 79, 0, 0, 21,
+  1, 0, 0, 69, 0, 0, 0, 20, 30, 19,
+  9, 0, 0, 0, 44, 0, 32, 0, 1, 40,
+  20, 13, 0, 4, 30, 19, 7, 0, 0, 51,
+  83, 2, 5, 14, 52, 26, 0, 4, 59, 63,
+  73, 10, 9, 0, 0, 21, 0, 0, 0, 8,
+  79, 0, 30, 22, 0, 58, 0, 53, 0, 36,
+  0, 25, 34, 72, 4, 34, 0, 41, 0, 48,
+  26, 0, 42, 0, 22, 0, 6, 0, 0, 0,
+  0, 29, 9, 0, 0, 4, 44, 0, 36, 14,
+  25, 13, 34, 0, 45, 43, 0, 22, 40, 0,
+  24, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+  0, 6, 0, 37, 22, 0, 63, 32, 0, 0,
+  27, 13, 56, 0, 49, 0, 0, 3, 0, 25,
+  0, 17, 0, 0, 5, 0, 25, 4, 6, 5,
+  11, 0, 60, 0, 35, 0, 0, 79, 42, 0,
+  0, 0, 53, 0, 5, 0, 0, 37, 2, 1,
+  18, 62, 41, 51, 0, 55, 86, 0, 87, 50,
+  0, 11, 5, 15, 128, 37, 1, 0, 72, 0,
+  36, 0, 0, 27, 0, 45, 39, 32, 0, 35,
+  80, 55, 0, 7, 0, 21, 12, 25, 62, 0,
+  16, 0, 27, 0, 29, 0, 13, 0, 11, 0,
+  0, 0, 25, 0, 9, 0, 3, 35, 41, 39,
+  37, 34, 23, 0, 0, 8, 79, 22, 1, 0,
+  0, 13, 0, 0, 82, 36, 0, 0, 20, 0,
+  0, 51, 0, 0, 48, 11, 5, 0, 0, 23,
+  29, 0, 77, 0, 0, 50, 18, 0, 0, 42,
+  0, 0, 0, 4, 5, 13, 24, 0, 0, 0,
+  28, 0, 34, 0, 7, 54, 57, 12, 0, 23,
+  17, 14, 2, 0, 0, 54, 68, 12, 2, 19,
+  58, 30, 0, 13, 72, 61, 94, 10, 0, 0,
+  0, 26, 0, 0, 0, 5, 68, 0, 20, 19,
+  0, 31, 0, 50, 4, 41, 0, 19, 53, 58,
+  0, 66, 0, 27, 0, 55, 24, 0, 51, 0,
+  26, 0, 10, 0, 0, 0, 0, 18, 3, 0,
+  0, 0, 34, 0, 14, 26, 9, 11, 35, 0,
+  48, 32, 0, 34, 37, 0, 35, 0, 0, 7,
+  0, 0, 0, 5, 0, 0, 0, 0, 0, 28,
+  25, 0, 59, 36, 0, 0, 14, 23, 43, 0,
+  49, 0, 0, 6, 11, 5, 0, 11, 0, 0,
+  8, 0, 8, 0, 0, 4, 5, 0, 45, 0,
+  20, 0, 10, 27, 29, 24, 0, 21, 22, 22,
+  24, 0, 0, 43, 79, 0, 6, 26, 56, 0,
+  0, 0, 0, 87, 1, 0, 41, 0, 0, 30,
+  0, 1, 0, 60, 72, 0, 24, 0, 0, 23,
+  0, 54, 0, 47, 13, 10, 23, 49, 26, 18,
+  0, 30, 0, 52, 4, 24, 54, 0, 32, 0,
+  10, 0, 1, 11, 0, 48, 0, 8, 0, 0,
+  39, 0, 18, 26, 11, 0, 0, 2, 47, 27,
+  0, 46, 24, 0, 46, 46, 0, 0, 13, 0,
+  0, 18, 0, 0, 0, 23, 0, 24, 55, 0,
+  15, 78, 0, 0, 25, 19, 40, 0, 26, 0,
+  5, 0, 17, 8, 0, 0, 0, 0, 7, 0,
+  0, 4, 0, 11, 36, 0, 55, 0, 17, 0,
+  0, 59, 38, 0, 0, 0, 51, 10, 0, 0,
+  0, 39, 16, 14, 0, 31, 37, 50, 8, 52,
+  96, 0, 89, 33, 0, 0, 10, 17, 130, 11,
+  0, 0, 60, 0, 23, 5, 0, 27, 0, 39,
+  18, 30, 0, 52, 72, 74, 0, 1, 0, 9,
+  3, 38, 49, 0, 21, 0, 26, 0, 35, 0,
+  7, 0, 20, 0, 0, 0, 28, 0, 11, 0,
+  19, 32, 48, 45, 30, 15, 29, 8, 0, 9,
+  64, 8, 4, 0, 0, 0, 0, 0, 71, 23,
+  0, 0, 12, 0, 0, 61, 0, 0, 46, 11,
+  0, 0, 7, 26, 31, 0, 76, 0, 0, 36,
+  15, 0, 0, 53, 0, 0, 0, 21, 21, 27,
+  13, 0, 0, 0, 35, 0, 35, 0, 5, 41,
+  42, 14, 0, 10, 22, 17, 7, 0, 0, 59,
+  79, 18, 12, 8, 57, 30, 0, 8, 80, 64,
+  78, 4, 4, 0, 0, 27, 0, 0, 0, 6,
+  69, 0, 21, 17, 0, 41, 0, 56, 0, 45,
+  0, 25, 49, 58, 0, 46, 0, 36, 0, 53,
+  24, 7, 45, 0, 22, 0, 8, 0, 0, 0,
+  0, 27, 0, 6, 0, 0, 31, 0, 5, 23,
+  14, 9, 30, 0, 48, 35, 0, 35, 39, 0,
+  24, 0, 2, 0, 0, 0, 0, 6, 0, 0,
+  0, 3, 0, 41, 26, 0, 61, 31, 0, 0,
+  30, 12, 49, 0, 50, 0, 0, 4, 7, 3,
+  0, 14, 0, 0, 14, 0, 21, 1, 1, 11,
+  20, 0, 59, 0, 36, 0, 7, 20, 30, 33,
+  0, 25, 20, 19, 31, 0, 0, 42, 85, 0,
+  9, 30, 51, 0, 0, 0, 0, 86, 1, 3,
+  48, 0, 0, 38, 0, 0, 0, 59, 74, 0,
+  25, 0, 0, 26, 0, 62, 0, 45, 16, 10,
+  25, 48, 31, 10, 0, 42, 0, 48, 3, 27,
+  52, 0, 29, 0, 9, 0, 0, 10, 0, 42,
+  0, 8, 0, 0, 37, 0, 14, 27, 13, 0,
+  0, 2, 45, 38, 0, 45, 25, 0, 49, 45,
+  0, 0, 20, 0, 0, 19, 0, 0, 0, 17,
+  0, 27, 57, 0, 16, 73, 0, 0, 26, 12,
+  40, 0, 28, 0, 0, 0, 14, 3, 0, 0,
+  0, 0, 11, 0, 0, 9, 2, 6, 37, 0,
+  65, 0, 15, 0, 0, 63, 25, 0, 12, 14,
+  50, 13, 5, 0, 0, 23, 35, 0, 0, 30,
+  38, 31, 5, 54, 55, 9, 80, 28, 0, 3,
+  10, 13, 116, 5, 0, 0, 52, 0, 36, 23,
+  0, 31, 3, 61, 0, 33, 0, 63, 55, 73,
+  9, 21, 0, 8, 0, 36, 57, 0, 2, 0,
+  23, 0, 17, 0, 5, 0, 0, 0, 6, 0,
+  4, 2, 29, 0, 67, 27, 41, 25, 49, 11,
+  15, 14, 0, 5, 68, 0, 19, 0, 11, 0,
+  0, 0, 45, 8, 0, 0, 0, 0, 0, 59,
+  0, 0, 45, 19, 0, 0, 13, 20, 31, 0,
+  79, 0, 0, 21, 1, 0, 0, 69, 0, 0,
+  0, 20, 30, 19, 9, 0, 0, 0, 44, 0,
+  32, 0, 1, 40, 20, 13, 0, 4, 30, 19,
+  7, 0, 0, 51, 83, 2, 5, 14, 52, 26,
+  0, 4, 59, 63, 73, 10, 9, 0, 0, 21,
+  0, 0, 0, 8, 79, 0, 30, 22, 0, 58,
+  0, 53, 0, 36, 0, 25, 34, 72, 4, 34,
+  0, 41, 0, 48, 26, 0, 42, 0, 22, 0,
+  6, 0, 0, 0, 0, 29, 9, 0, 0, 4,
+  44, 0, 36, 14, 25, 13, 34, 0, 45, 43,
+  0, 22, 40, 0, 24, 0, 0, 0, 0, 0,
+  0, 2, 0, 0, 0, 6, 0, 37, 22, 0,
+  63, 32, 0, 0, 27, 13, 56, 0, 49, 0,
+  0, 3, 0, 25, 0, 17, 0, 0, 5, 0,
+  25, 4, 6, 5, 11, 0, 60, 0, 35, 0,
+  2, 21, 34, 36, 0, 20, 23, 15, 27, 0,
+  0, 35, 85, 0, 12, 34, 49, 0, 0, 0,
+  0, 85, 1, 4, 48, 0, 0, 34, 0, 0,
+  0, 54, 82, 0, 29, 0, 0, 33, 0, 60,
+  0, 43, 14, 7, 23, 47, 31, 6, 0, 53,
+  0, 47, 6, 21, 54, 0, 28, 0, 6, 0,
+  3, 7, 0, 44, 0, 7, 0, 0, 39, 0,
+  13, 26, 14, 0, 0, 6, 45, 37, 0, 39,
+  28, 0, 49, 43, 0, 0, 21, 0, 0, 21,
+  1, 0, 0, 13, 0, 26, 58, 0, 13, 70,
+  1, 0, 22, 11, 31, 0, 26, 0, 0, 0,
+  14, 14, 0, 0, 0, 0, 7, 0, 0, 13,
+  6, 6, 31, 0, 67, 0, 13, 0, 7, 54,
+  57, 12, 0, 23, 17, 14, 2, 0, 0, 54,
+  68, 12, 2, 19, 58, 30, 0, 13, 72, 61,
+  94, 10, 0, 0, 0, 26, 0, 0, 0, 5,
+  68, 0, 20, 19, 0, 31, 0, 50, 4, 41,
+  0, 19, 53, 58, 0, 66, 0, 27, 0, 55,
+  24, 0, 51, 0, 26, 0, 10, 0, 0, 0,
+  0, 18, 3, 0, 0, 0, 34, 0, 14, 26,
+  9, 11, 35, 0, 48, 32, 0, 34, 37, 0,
+  35, 0, 0, 7, 0, 0, 0, 5, 0, 0,
+  0, 0, 0, 28, 25, 0, 59, 36, 0, 0,
+  14, 23, 43, 0, 49, 0, 0, 6, 11, 5,
+  0, 11, 0, 0, 8, 0, 8, 0, 0, 4,
+  5, 0, 45, 0, 20, 0, 10, 27, 29, 24,
+  0, 21, 22, 22, 24, 0, 0, 43, 79, 0,
+  6, 26, 56, 0, 0, 0, 0, 87, 1, 0,
+  41, 0, 0, 30, 0, 1, 0, 60, 72, 0,
+  24, 0, 0, 23, 0, 54, 0, 47, 13, 10,
+  23, 49, 26, 18, 0, 30, 0, 52, 4, 24,
+  54, 0, 32, 0, 10, 0, 1, 11, 0, 48,
+  0, 8, 0, 0, 39, 0, 18, 26, 11, 0,
+  0, 2, 47, 27, 0, 46, 24, 0, 46, 46,
+  0, 0, 13, 0, 0, 18, 0, 0, 0, 23,
+  0, 24, 55, 0, 15, 78, 0, 0, 25, 19,
+  40, 0, 26, 0, 5, 0, 17, 8, 0, 0,
+  0, 0, 7, 0, 0, 4, 0, 11, 36, 0,
+  55, 0, 17, 0, 0, 0, 0, 7, 0, 153,
+  0, 0, 0, 0, 0, 29, 38, 0, 0, 1,
+  3, 0, 0, 0, 24, 93, 13, 16, 0, 0,
+  0, 0, 0, 19, 0, 24, 31, 29, 0, 8,
+  0, 29, 0, 45, 0, 25, 0, 49, 3, 74,
+  23, 63, 0, 7, 0, 55, 0, 0, 19, 0,
+  43, 0, 36, 0, 0, 49, 0, 0, 76, 0,
+  0, 27, 37, 0, 74, 15, 23, 0, 0, 20,
+  11, 20, 0, 34, 35, 0, 40, 53, 0, 0,
+  16, 0, 0, 0, 0, 13, 0, 0, 26, 27,
+  0, 0, 0, 73, 26, 0, 0, 26, 12, 0,
+  22, 0, 0, 0, 6, 0, 0, 16, 0, 0,
+  114, 0, 19, 9, 0, 0, 0, 0, 29, 0,
+  0, 0, 5, 41, 42, 14, 0, 10, 22, 17,
+  7, 0, 0, 59, 79, 18, 12, 8, 57, 30,
+  0, 8, 80, 64, 78, 4, 4, 0, 0, 27,
+  0, 0, 0, 6, 69, 0, 21, 17, 0, 41,
+  0, 56, 0, 45, 0, 25, 49, 58, 0, 46,
+  0, 36, 0, 53, 24, 7, 45, 0, 22, 0,
+  8, 0, 0, 0, 0, 27, 0, 6, 0, 0,
+  31, 0, 5, 23, 14, 9, 30, 0, 48, 35,
+  0, 35, 39, 0, 24, 0, 2, 0, 0, 0,
+  0, 6, 0, 0, 0, 3, 0, 41, 26, 0,
+  61, 31, 0, 0, 30, 12, 49, 0, 50, 0,
+  0, 4, 7, 3, 0, 14, 0, 0, 14, 0,
+  21, 1, 1, 11, 20, 0, 59, 0, 36, 0,
+  7, 20, 30, 33, 0, 25, 20, 19, 31, 0,
+  0, 42, 85, 0, 9, 30, 51, 0, 0, 0,
+  0, 86, 1, 3, 48, 0, 0, 38, 0, 0,
+  0, 59, 74, 0, 25, 0, 0, 26, 0, 62,
+  0, 45, 16, 10, 25, 48, 31, 10, 0, 42,
+  0, 48, 3, 27, 52, 0, 29, 0, 9, 0,
+  0, 10, 0, 42, 0, 8, 0, 0, 37, 0,
+  14, 27, 13, 0, 0, 2, 45, 38, 0, 45,
+  25, 0, 49, 45, 0, 0, 20, 0, 0, 19,
+  0, 0, 0, 17, 0, 27, 57, 0, 16, 73,
+  0, 0, 26, 12, 40, 0, 28, 0, 0, 0,
+  14, 3, 0, 0, 0, 0, 11, 0, 0, 9,
+  2, 6, 37, 0, 65, 0, 15, 0, 0, 0,
+  0, 14, 0, 156, 0, 0, 5, 0, 0, 33,
+  46, 0, 0, 1, 2, 0, 0, 0, 35, 87,
+  15, 22, 9, 0, 0, 0, 0, 4, 0, 26,
+  27, 34, 0, 10, 0, 25, 0, 45, 0, 20,
+  0, 52, 5, 80, 36, 57, 0, 13, 0, 53,
+  0, 0, 18, 0, 38, 0, 42, 0, 0, 46,
+  0, 0, 78, 0, 0, 21, 42, 0, 77, 17,
+  26, 0, 0, 15, 17, 17, 0, 33, 33, 0,
+  40, 55, 0, 0, 30, 0, 0, 0, 0, 21,
+  0, 0, 19, 31, 0, 0, 3, 65, 28, 0,
+  0, 21, 9, 0, 22, 0, 0, 0, 0, 0,
+  0, 12, 0, 0, 106, 0, 25, 11, 0, 0,
+  0, 0, 36, 0, 0, 0, 1, 40, 20, 13,
+  0, 4, 30, 19, 7, 0, 0, 51, 83, 2,
+  5, 14, 52, 26, 0, 4, 59, 63, 73, 10,
+  9, 0, 0, 21, 0, 0, 0, 8, 79, 0,
+  30, 22, 0, 58, 0, 53, 0, 36, 0, 25,
+  34, 72, 4, 34, 0, 41, 0, 48, 26, 0,
+  42, 0, 22, 0, 6, 0, 0, 0, 0, 29,
+  9, 0, 0, 4, 44, 0, 36, 14, 25, 13,
+  34, 0, 45, 43, 0, 22, 40, 0, 24, 0,
+  0, 0, 0, 0, 0, 2, 0, 0, 0, 6,
+  0, 37, 22, 0, 63, 32, 0, 0, 27, 13,
+  56, 0, 49, 0, 0, 3, 0, 25, 0, 17,
+  0, 0, 5, 0, 25, 4, 6, 5, 11, 0,
+  60, 0, 35, 0, 2, 21, 34, 36, 0, 20,
+  23, 15, 27, 0, 0, 35, 85, 0, 12, 34,
+  49, 0, 0, 0, 0, 85, 1, 4, 48, 0,
+  0, 34, 0, 0, 0, 54, 82, 0, 29, 0,
+  0, 33, 0, 60, 0, 43, 14, 7, 23, 47,
+  31, 6, 0, 53, 0, 47, 6, 21, 54, 0,
+  28, 0, 6, 0, 3, 7, 0, 44, 0, 7,
+  0, 0, 39, 0, 13, 26, 14, 0, 0, 6,
+  45, 37, 0, 39, 28, 0, 49, 43, 0, 0,
+  21, 0, 0, 21, 1, 0, 0, 13, 0, 26,
+  58, 0, 13, 70, 1, 0, 22, 11, 31, 0,
+  26, 0, 0, 0, 14, 14, 0, 0, 0, 0,
+  7, 0, 0, 13, 6, 6, 31, 0, 67, 0,
+  13, 0, 0, 0, 0, 11, 0, 155, 2, 0,
+  5, 0, 0, 33, 42, 0, 0, 4, 0, 0,
+  0, 0, 32, 92, 22, 17, 9, 0, 0, 0,
+  0, 2, 0, 29, 24, 28, 0, 10, 0, 29,
+  0, 42, 0, 20, 0, 60, 3, 77, 36, 51,
+  0, 12, 0, 54, 0, 0, 17, 0, 44, 0,
+  43, 0, 0, 51, 0, 0, 85, 0, 0, 21,
+  43, 0, 79, 15, 29, 0, 0, 19, 21, 15,
+  0, 25, 34, 0, 39, 58, 0, 0, 33, 0,
+  0, 0, 0, 21, 2, 0, 11, 36, 0, 0,
+  0, 60, 36, 0, 0, 18, 9, 0, 23, 0,
+  0, 0, 0, 0, 0, 9, 0, 0, 107, 0,
+  27, 18, 0, 1, 0, 0, 40, 0, 0, 0,
+  10, 27, 29, 24, 0, 21, 22, 22, 24, 0,
+  0, 43, 79, 0, 6, 26, 56, 0, 0, 0,
+  0, 87, 1, 0, 41, 0, 0, 30, 0, 1,
+  0, 60, 72, 0, 24, 0, 0, 23, 0, 54,
+  0, 47, 13, 10, 23, 49, 26, 18, 0, 30,
+  0, 52, 4, 24, 54, 0, 32, 0, 10, 0,
+  1, 11, 0, 48, 0, 8, 0, 0, 39, 0,
+  18, 26, 11, 0, 0, 2, 47, 27, 0, 46,
+  24, 0, 46, 46, 0, 0, 13, 0, 0, 18,
+  0, 0, 0, 23, 0, 24, 55, 0, 15, 78,
+  0, 0, 25, 19, 40, 0, 26, 0, 5, 0,
+  17, 8, 0, 0, 0, 0, 7, 0, 0, 4,
+  0, 11, 36, 0, 55, 0, 17, 0, 0, 0,
+  0, 7, 0, 153, 0, 0, 0, 0, 0, 29,
+  38, 0, 0, 1, 3, 0, 0, 0, 24, 93,
+  13, 16, 0, 0, 0, 0, 0, 19, 0, 24,
+  31, 29, 0, 8, 0, 29, 0, 45, 0, 25,
+  0, 49, 3, 74, 23, 63, 0, 7, 0, 55,
+  0, 0, 19, 0, 43, 0, 36, 0, 0, 49,
+  0, 0, 76, 0, 0, 27, 37, 0, 74, 15,
+  23, 0, 0, 20, 11, 20, 0, 34, 35, 0,
+  40, 53, 0, 0, 16, 0, 0, 0, 0, 13,
+  0, 0, 26, 27, 0, 0, 0, 73, 26, 0,
+  0, 26, 12, 0, 22, 0, 0, 0, 6, 0,
+  0, 16, 0, 0, 114, 0, 19, 9, 0, 0,
+  0, 0, 29, 0, 0, 0, 0, 17, 0, 0,
+  0, 31, 35, 0, 13, 0, 8, 0, 56, 4,
+  16, 62, 36, 39, 10, 0, 30, 0, 0, 48,
+  4, 53, 0, 4, 0, 15, 0, 0, 72, 44,
+  0, 0, 0, 0, 0, 66, 0, 41, 0, 43,
+  20, 12, 12, 36, 0, 41, 0, 7, 95, 16,
+  0, 0, 21, 0, 0, 55, 9, 0, 0, 0,
+  0, 0, 32, 12, 11, 0, 0, 0, 0, 15,
+  10, 55, 0, 0, 0, 47, 64, 4, 32, 22,
+  15, 0, 7, 27, 13, 34, 54, 16, 0, 11,
+  39, 32, 0, 0, 0, 68, 22, 0, 0, 0,
+  0, 0, 48, 0, 0, 30, 26, 15, 0, 27,
+  0, 0, 25, 30, 24, 3, 1, 0, 121, 0,
+  65, 2, 0, 0, 7, 20, 30, 33, 0, 25,
+  20, 19, 31, 0, 0, 42, 85, 0, 9, 30,
+  51, 0, 0, 0, 0, 86, 1, 3, 48, 0,
+  0, 38, 0, 0, 0, 59, 74, 0, 25, 0,
+  0, 26, 0, 62, 0, 45, 16, 10, 25, 48,
+  31, 10, 0, 42, 0, 48, 3, 27, 52, 0,
+  29, 0, 9, 0, 0, 10, 0, 42, 0, 8,
+  0, 0, 37, 0, 14, 27, 13, 0, 0, 2,
+  45, 38, 0, 45, 25, 0, 49, 45, 0, 0,
+  20, 0, 0, 19, 0, 0, 0, 17, 0, 27,
+  57, 0, 16, 73, 0, 0, 26, 12, 40, 0,
+  28, 0, 0, 0, 14, 3, 0, 0, 0, 0,
+  11, 0, 0, 9, 2, 6, 37, 0, 65, 0,
+  15, 0, 0, 0, 0, 14, 0, 156, 0, 0,
+  5, 0, 0, 33, 46, 0, 0, 1, 2, 0,
+  0, 0, 35, 87, 15, 22, 9, 0, 0, 0,
+  0, 4, 0, 26, 27, 34, 0, 10, 0, 25,
+  0, 45, 0, 20, 0, 52, 5, 80, 36, 57,
+  0, 13, 0, 53, 0, 0, 18, 0, 38, 0,
+  42, 0, 0, 46, 0, 0, 78, 0, 0, 21,
+  42, 0, 77, 17, 26, 0, 0, 15, 17, 17,
+  0, 33, 33, 0, 40, 55, 0, 0, 30, 0,
+  0, 0, 0, 21, 0, 0, 19, 31, 0, 0,
+  3, 65, 28, 0, 0, 21, 9, 0, 22, 0,
+  0, 0, 0, 0, 0, 12, 0, 0, 106, 0,
+  25, 11, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 20, 0, 0, 0, 35, 28, 0, 25, 0,
+  6, 0, 68, 1, 9, 53, 37, 38, 8, 0,
+  43, 0, 0, 43, 7, 56, 0, 4, 0, 13,
+  10, 0, 65, 53, 0, 0, 0, 0, 0, 56,
+  0, 63, 0, 42, 23, 10, 1, 49, 0, 48,
+  0, 7, 80, 24, 0, 0, 14, 0, 0, 62,
+  18, 0, 0, 0, 0, 0, 30, 19, 15, 0,
+  0, 0, 0, 17, 1, 53, 0, 0, 0, 49,
+  63, 0, 24, 24, 20, 0, 11, 25, 0, 37,
+  36, 32, 0, 13, 32, 35, 0, 0, 0, 66,
+  17, 0, 0, 0, 0, 0, 37, 0, 0, 36,
+  37, 19, 0, 29, 0, 0, 14, 20, 42, 8,
+  3, 0, 121, 0, 63, 0, 10, 0, 2, 21,
+  34, 36, 0, 20, 23, 15, 27, 0, 0, 35,
+  85, 0, 12, 34, 49, 0, 0, 0, 0, 85,
+  1, 4, 48, 0, 0, 34, 0, 0, 0, 54,
+  82, 0, 29, 0, 0, 33, 0, 60, 0, 43,
+  14, 7, 23, 47, 31, 6, 0, 53, 0, 47,
+  6, 21, 54, 0, 28, 0, 6, 0, 3, 7,
+  0, 44, 0, 7, 0, 0, 39, 0, 13, 26,
+  14, 0, 0, 6, 45, 37, 0, 39, 28, 0,
+  49, 43, 0, 0, 21, 0, 0, 21, 1, 0,
+  0, 13, 0, 26, 58, 0, 13, 70, 1, 0,
+  22, 11, 31, 0, 26, 0, 0, 0, 14, 14,
+  0, 0, 0, 0, 7, 0, 0, 13, 6, 6,
+  31, 0, 67, 0, 13, 0, 0, 0, 0, 11,
+  0, 155, 2, 0, 5, 0, 0, 33, 42, 0,
+  0, 4, 0, 0, 0, 0, 32, 92, 22, 17,
+  9, 0, 0, 0, 0, 2, 0, 29, 24, 28,
+  0, 10, 0, 29, 0, 42, 0, 20, 0, 60,
+  3, 77, 36, 51, 0, 12, 0, 54, 0, 0,
+  17, 0, 44, 0, 43, 0, 0, 51, 0, 0,
+  85, 0, 0, 21, 43, 0, 79, 15, 29, 0,
+  0, 19, 21, 15, 0, 25, 34, 0, 39, 58,
+  0, 0, 33, 0, 0, 0, 0, 21, 2, 0,
+  11, 36, 0, 0, 0, 60, 36, 0, 0, 18,
+  9, 0, 23, 0, 0, 0, 0, 0, 0, 9,
+  0, 0, 107, 0, 27, 18, 0, 1, 0, 0,
+  40, 0, 0, 0, 0, 14, 0, 0, 0, 35,
+  30, 0, 24, 0, 0, 0, 74, 10, 3, 49,
+  34, 40, 11, 0, 46, 0, 0, 43, 6, 57,
+  0, 0, 0, 6, 17, 0, 60, 46, 0, 0,
+  0, 6, 0, 50, 0, 54, 0, 49, 22, 10,
+  0, 35, 0, 41, 0, 4, 78, 9, 0, 0,
+  19, 0, 0, 64, 27, 0, 0, 0, 0, 0,
+  28, 16, 10, 0, 0, 1, 0, 26, 0, 65,
+  0, 0, 0, 35, 53, 4, 18, 31, 20, 0,
+  14, 26, 7, 35, 30, 32, 0, 14, 17, 31,
+  0, 0, 0, 53, 24, 0, 0, 0, 0, 0,
+  40, 0, 0, 48, 34, 9, 0, 29, 0, 0,
+  32, 21, 47, 17, 0, 5, 113, 0, 63, 0,
+  10, 0,
+};
+
+unsigned char b_data[b_count] = {
+  82, 81, 82, 72, 70, 90, 88, 77, 85, 68,
+  76, 88, 77, 90, 86, 94, 88, 88, 78, 74,
+  89, 80, 75, 81, 70, 89, 81, 77, 93, 95,
+  70, 81, 109, 71, 77, 80, 80, 94, 95, 95,
+  87, 87, 77, 73, 97, 75, 91, 92, 80, 90,
+  92, 79, 162, 95, 75, 87, 99, 86, 82, 72,
+  70, 84, 85, 80, 86, 75, 79, 68, 90, 94,
+  84, 79, 81, 75, 84, 94, 91, 88, 90, 87,
+  101, 72, 84, 76, 62, 82, 80, 81, 81, 65,
+  90, 85, 83, 72, 80, 81, 85, 88, 79, 101,
+  85, 86, 81, 70, 84, 89, 79, 72, 90, 62,
+  97, 90, 70, 79, 80, 83, 78, 86, 78, 88,
+  73, 85, 71, 68, 87, 66, 65, 83, 83, 77,
+  80, 77, 68, 81, 87, 81, 88, 68, 71, 89,
+  88, 85, 88, 94, 87, 93, 75, 76, 87, 80,
+  79, 80, 73, 96, 83, 74, 87, 88, 73, 80,
+  107, 71, 80, 84, 78, 93, 93, 93, 88, 86,
+  88, 71, 96, 78, 94, 85, 78, 91, 86, 77,
+  167, 91, 77, 86, 99, 83, 85, 76, 67, 88,
+  85, 81, 83, 76, 81, 76, 89, 92, 83, 74,
+  83, 75, 86, 89, 87, 90, 92, 87, 93, 64,
+  84, 79, 66, 81, 80, 80, 82, 65, 85, 84,
+  76, 75, 81, 82, 82, 88, 83, 97, 79, 87,
+  95, 71, 90, 86, 83, 76, 89, 57, 94, 89,
+  75, 82, 84, 84, 83, 86, 85, 92, 73, 83,
+  72, 70, 89, 66, 65, 83, 83, 68, 79, 74,
+  71, 80, 90, 76, 83, 67, 75, 86, 81, 88,
+  92, 93, 86, 91, 76, 74, 81, 81, 88, 78,
+  74, 91, 82, 75, 92, 83, 74, 77, 107, 73,
+  79, 76, 76, 91, 92, 87, 88, 86, 90, 71,
+  93, 74, 86, 88, 82, 89, 90, 75, 157, 90,
+  75, 87, 94, 89, 82, 74, 70, 83, 85, 79,
+  88, 76, 79, 71, 87, 91, 87, 79, 79, 78,
+  83, 96, 90, 93, 92, 86, 101, 69, 80, 75,
+  60, 79, 83, 84, 80, 64, 85, 87, 85, 74,
+  81, 84, 84, 90, 78, 96, 86, 85, 82, 70,
+  90, 85, 80, 73, 87, 63, 90, 90, 67, 78,
+  85, 79, 87, 86, 75, 86, 72, 84, 73, 70,
+  86, 68, 67, 82, 84, 86, 80, 69, 69, 90,
+  80, 72, 88, 70, 77, 85, 82, 83, 84, 93,
+  91, 84, 77, 77, 84, 79, 78, 86, 74, 84,
+  79, 77, 86, 92, 78, 79, 105, 73, 82, 80,
+  83, 86, 91, 92, 86, 87, 80, 76, 96, 78,
+  97, 93, 78, 93, 96, 81, 169, 88, 72, 91,
+  100, 88, 79, 74, 74, 87, 81, 80, 84, 74,
+  77, 72, 83, 94, 86, 78, 84, 72, 86, 94,
+  86, 88, 82, 86, 97, 73, 82, 79, 64, 77,
+  78, 83, 79, 73, 94, 85, 82, 68, 78, 75,
+  80, 90, 85, 93, 83, 89, 94, 68, 87, 80,
+  80, 76, 93, 70, 87, 91, 75, 85, 85, 82,
+  85, 82, 84, 92, 77, 86, 70, 71, 83, 79,
+  69, 80, 83, 83, 84, 73, 64, 82, 81, 73,
+  94, 73, 75, 85, 91, 81, 88, 99, 90, 94,
+  72, 81, 88, 80, 82, 87, 77, 89, 82, 76,
+  80, 85, 82, 77, 103, 72, 82, 85, 86, 90,
+  85, 89, 90, 85, 85, 76, 94, 77, 100, 85,
+  75, 97, 92, 77, 183, 83, 76, 89, 101, 85,
+  81, 79, 70, 89, 81, 80, 79, 70, 79, 78,
+  79, 92, 83, 73, 84, 67, 86, 91, 83, 92,
+  78, 84, 90, 65, 82, 77, 68, 76, 78, 81,
+  79, 79, 95, 83, 73, 67, 81, 74, 74, 89,
+  89, 91, 74, 88, 110, 70, 90, 81, 85, 81,
+  92, 66, 82, 88, 78, 85, 88, 84, 86, 83,
+  95, 96, 77, 83, 76, 74, 86, 79, 69, 77,
+  84, 76, 85, 73, 71, 78, 84, 71, 87, 71,
+  76, 82, 81, 87, 94, 90, 89, 87, 75, 78,
+  83, 81, 89, 86, 77, 85, 83, 75, 86, 87,
+  85, 74, 102, 74, 84, 80, 82, 85, 87, 86,
+  89, 87, 81, 72, 91, 71, 92, 87, 82, 92,
+  94, 77, 162, 86, 73, 88, 93, 92, 79, 77,
+  74, 83, 81, 81, 83, 75, 83, 73, 82, 93,
+  85, 76, 81, 79, 85, 95, 88, 95, 80, 87,
+  97, 72, 79, 79, 65, 78, 85, 86, 80, 73,
+  90, 86, 84, 71, 79, 79, 80, 92, 82, 89,
+  89, 85, 93, 69, 89, 79, 83, 76, 90, 69,
+  82, 91, 72, 79, 88, 82, 87, 81, 83, 92,
+  76, 87, 73, 73, 84, 81, 72, 81, 83, 91,
+  85, 74, 76, 89, 85, 67, 84, 71, 85, 82,
+  78, 89, 91, 88, 96, 75, 81, 74, 69, 76,
+  85, 84, 74, 80, 75, 76, 91, 86, 73, 82,
+  102, 73, 81, 78, 86, 87, 92, 97, 84, 91,
+  81, 80, 96, 78, 93, 92, 81, 88, 94, 80,
+  163, 88, 68, 87, 101, 90, 76, 68, 83, 90,
+  81, 83, 83, 73, 85, 72, 81, 97, 92, 84,
+  85, 79, 84, 96, 89, 89, 84, 89, 97, 81,
+  80, 76, 63, 80, 81, 88, 81, 78, 84, 96,
+  85, 66, 75, 83, 84, 93, 84, 96, 92, 89,
+  81, 71, 82, 82, 77, 74, 91, 70, 84, 91,
+  68, 83, 81, 79, 84, 77, 74, 83, 80, 88,
+  69, 71, 82, 85, 70, 84, 85, 85, 90, 76,
+  73, 86, 81, 70, 87, 71, 84, 84, 84, 92,
+  95, 92, 98, 83, 79, 76, 78, 78, 90, 84,
+  79, 81, 80, 77, 86, 82, 76, 78, 103, 76,
+  82, 83, 92, 88, 89, 94, 84, 88, 77, 76,
+  94, 74, 95, 91, 78, 95, 93, 77, 164, 86,
+  74, 86, 101, 87, 76, 74, 83, 90, 85, 86,
+  77, 73, 89, 76, 77, 102, 83, 81, 86, 76,
+  83, 95, 88, 93, 83, 89, 90, 77, 81, 82,
+  66, 82, 80, 86, 81, 82, 87, 94, 80, 67,
+  77, 82, 77, 91, 89, 94, 92, 90, 87, 73,
+  81, 79, 78, 79, 90, 68, 81, 86, 69, 85,
+  80, 82, 85, 79, 85, 86, 79, 89, 74, 71,
+  83, 90, 72, 83, 86, 77, 91, 78, 76, 83,
+  87, 69, 83, 73, 82, 80, 78, 93, 100, 86,
+  97, 79, 77, 73, 77, 79, 89, 86, 85, 80,
+  80, 78, 89, 85, 76, 76, 103, 75, 83, 79,
+  84, 87, 90, 90, 85, 89, 71, 76, 91, 71,
+  92, 88, 83, 87, 93, 73, 159, 88, 69, 94,
+  96, 92, 73, 71, 83, 88, 81, 86, 84, 76,
+  90, 76, 80, 101, 87, 81, 80, 82, 84, 92,
+  89, 93, 84, 91, 93, 81, 76, 85, 65, 81,
+  82, 88, 83, 77, 81, 90, 85, 69, 75, 85,
+  83, 93, 83, 91, 96, 87, 83, 71, 84, 81,
+  77, 77, 91, 67, 84, 88, 68, 80, 81, 79,
+  85, 79, 76, 84, 76, 89, 72, 72, 82, 89,
+  73, 85, 78, 81, 90, 85, 58, 89, 95, 79,
+  67, 75, 82, 81, 80, 73, 85, 84, 84, 89,
+  73, 81, 73, 81, 87, 83, 81, 89, 81, 95,
+  98, 87, 108, 86, 96, 90, 82, 98, 84, 106,
+  71, 79, 99, 86, 73, 73, 80, 63, 77, 73,
+  94, 83, 73, 72, 65, 85, 73, 68, 85, 80,
+  70, 97, 100, 94, 80, 99, 79, 79, 76, 103,
+  85, 87, 92, 98, 74, 86, 89, 73, 82, 83,
+  86, 80, 69, 78, 87, 91, 81, 80, 88, 93,
+  69, 107, 81, 84, 93, 85, 71, 98, 97, 110,
+  89, 70, 78, 80, 87, 93, 89, 97, 77, 76,
+  83, 77, 83, 105, 86, 89, 94, 89, 86, 87,
+  76, 94, 87, 82, 69, 69, 73, 78, 85, 71,
+  90, 82, 77, 82, 57, 80, 92, 73, 68, 70,
+  76, 83, 83, 67, 88, 75, 86, 99, 86, 70,
+  74, 83, 88, 78, 83, 95, 81, 99, 93, 88,
+  110, 85, 92, 82, 81, 79, 79, 103, 75, 77,
+  87, 95, 78, 77, 81, 68, 74, 79, 90, 77,
+  70, 68, 68, 87, 79, 81, 82, 80, 76, 81,
+  101, 96, 73, 96, 65, 90, 77, 92, 84, 77,
+  82, 88, 77, 86, 91, 71, 76, 80, 79, 86,
+  73, 72, 84, 76, 85, 72, 88, 85, 66, 107,
+  74, 91, 98, 92, 69, 103, 100, 120, 95, 65,
+  62, 71, 85, 95, 84, 96, 76, 72, 78, 82,
+  88, 106, 82, 83, 84, 81, 76, 89, 80, 89,
+  86, 76, 71, 66, 72, 79, 93, 67, 80, 83,
+  80, 89, 65, 82, 92, 80, 70, 78, 86, 80,
+  79, 74, 85, 88, 84, 90, 75, 81, 77, 80,
+  85, 79, 86, 85, 85, 93, 92, 87, 96, 91,
+  96, 90, 89, 86, 90, 105, 76, 78, 94, 86,
+  79, 76, 85, 76, 79, 90, 96, 84, 71, 78,
+  69, 84, 77, 92, 89, 77, 77, 93, 90, 86,
+  84, 93, 92, 80, 78, 107, 85, 73, 93, 97,
+  83, 83, 90, 81, 86, 80, 76, 78, 71, 73,
+  86, 82, 86, 83, 95, 93, 73, 104, 80, 105,
+  95, 86, 93, 101, 94, 102, 87, 72, 86, 86,
+  85, 92, 88, 94, 76, 85, 85, 79, 88, 102,
+  87, 84, 76, 86, 93, 88, 81, 90, 90, 81,
+  71, 74, 72, 79, 86, 67, 79, 77, 69, 91,
+  86, 76, 86, 83, 67, 83, 89, 78, 74, 66,
+  86, 78, 63, 80, 82, 87, 88, 78, 91, 91,
+  91, 81, 93, 83, 101, 95, 90, 92, 96, 87,
+  72, 90, 103, 97, 85, 75, 104, 71, 74, 75,
+  83, 78, 81, 68, 83, 78, 68, 76, 69, 92,
+  71, 101, 89, 83, 71, 92, 78, 82, 88, 88,
+  81, 78, 82, 95, 78, 72, 114, 100, 74, 82,
+  78, 75, 93, 84, 105, 73, 78, 96, 95, 88,
+  74, 79, 92, 80, 91, 91, 72, 68, 84, 90,
+  75, 94, 87, 93, 82, 69, 82, 79, 76, 85,
+  80, 80, 86, 80, 90, 65, 71, 79, 85, 84,
+  88, 103, 83, 84, 69, 88, 90, 71, 91, 72,
+  76, 84, 82, 75, 81, 78, 71, 94, 86, 69,
+  81, 74, 69, 79, 92, 80, 70, 81, 83, 80,
+  60, 81, 86, 80, 77, 77, 82, 84, 87, 80,
+  93, 83, 97, 85, 86, 99, 95, 85, 77, 79,
+  98, 94, 71, 73, 101, 66, 83, 73, 72, 71,
+  75, 71, 79, 77, 63, 73, 72, 106, 69, 83,
+  86, 90, 63, 84, 82, 89, 87, 87, 67, 86,
+  83, 90, 84, 65, 83, 98, 80, 77, 82, 75,
+  83, 75, 94, 76, 81, 99, 88, 80, 82, 77,
+  89, 77, 78, 89, 72, 71, 79, 88, 71, 99,
+  89, 102, 79, 68, 82, 84, 75, 84, 78, 82,
+  85, 70, 88, 61, 75, 76, 79, 85, 98, 97,
+  73, 84, 72, 92, 90, 66, 102, 67, 79, 88,
+  85, 66, 78, 82, 86, 91, 87, 78, 83, 78,
+  69, 83, 90, 79, 77, 99, 86, 75, 72, 79,
+  78, 89, 73, 85, 78, 87, 85, 77, 92, 83,
+  96, 80, 89, 97, 91, 84, 87, 83, 99, 94,
+  69, 76, 99, 77, 88, 78, 85, 78, 81, 91,
+  79, 78, 67, 91, 72, 91, 72, 66, 91, 86,
+  70, 90, 75, 82, 87, 88, 87, 80, 78, 93,
+  86, 69, 71, 102, 75, 80, 83, 76, 90, 78,
+  80, 77, 77, 98, 94, 74, 87, 81, 86, 83,
+  94, 88, 73, 76, 84, 90, 74, 91, 87, 97,
+  81, 64, 82, 89, 80, 84, 79, 82, 82, 83,
+  89, 68, 80, 84, 82, 88, 93, 98, 93, 84,
+  77, 88, 89, 70, 94, 74, 77, 81, 84, 73,
+  83, 83, 85, 82, 98, 89, 75, 98, 87, 90,
+  81, 92, 89, 97, 76, 76, 75, 87, 84, 90,
+  94, 89, 94, 111, 85, 72, 100, 80, 74, 106,
+  70, 78, 95, 80, 86, 84, 94, 79, 82, 83,
+  99, 70, 76, 91, 82, 98, 94, 84, 79, 76,
+  89, 99, 84, 82, 80, 96, 106, 77, 93, 73,
+  68, 69, 79, 76, 82, 85, 88, 89, 73, 90,
+  97, 72, 97, 79, 75, 74, 89, 94, 86, 67,
+  102, 88, 102, 85, 73, 78, 85, 76, 122, 68,
+  78, 73, 80, 74, 91, 70, 66, 71, 82, 88,
+  81, 89, 83, 80, 73, 91, 91, 95, 106, 90,
+  77, 67, 93, 74, 78, 102, 101, 78, 69, 83,
+  97, 84, 89, 96, 92, 82, 73, 104, 78, 86,
+  87, 81, 95, 82, 75, 96, 86, 89, 86, 93,
+  85, 99, 75, 76, 75, 85, 81, 93, 85, 86,
+  87, 109, 86, 68, 104, 81, 67, 94, 69, 76,
+  99, 86, 98, 76, 96, 67, 82, 82, 97, 67,
+  83, 87, 75, 90, 90, 84, 81, 86, 84, 111,
+  91, 80, 75, 99, 93, 75, 89, 70, 72, 69,
+  86, 69, 84, 85, 91, 88, 71, 97, 96, 82,
+  92, 81, 74, 76, 77, 85, 94, 73, 105, 90,
+  103, 89, 73, 77, 84, 82, 127, 71, 86, 75,
+  79, 67, 86, 72, 60, 70, 75, 93, 87, 96,
+  83, 77, 71, 90, 88, 92, 106, 92, 83, 63,
+  96, 82, 85, 99, 93, 76, 63, 97, 92, 82,
+  100, 96, 94, 82, 68, 103, 79, 84, 84, 77,
+  99, 91, 76, 93, 85, 92, 81, 93, 88, 88,
+  74, 75, 79, 84, 78, 93, 74, 90, 80, 109,
+  91, 67, 101, 82, 65, 85, 71, 81, 90, 87,
+  101, 76, 93, 79, 84, 85, 96, 75, 88, 95,
+  78, 97, 91, 93, 78, 78, 86, 107, 88, 79,
+  79, 82, 96, 80, 93, 72, 67, 71, 86, 75,
+  85, 86, 83, 83, 72, 89, 85, 78, 92, 77,
+  77, 73, 84, 82, 95, 73, 100, 91, 103, 94,
+  75, 75, 77, 80, 121, 77, 74, 73, 82, 77,
+  85, 69, 69, 70, 80, 85, 84, 89, 87, 81,
+  80, 88, 88, 96, 101, 92, 85, 68, 91, 88,
+  84, 90, 96, 79, 71, 87, 82, 83, 92, 91,
+  87, 79, 77, 104, 86, 78, 84, 86, 84, 84,
+  82, 82, 93, 83, 76, 95, 99, 84, 66, 93,
+  80, 89, 84, 105, 73, 89, 74, 80, 81, 84,
+  95, 84, 95, 79, 84, 82, 83, 81, 86, 86,
+  87, 94, 115, 86, 82, 87, 91, 85, 87, 80,
+  88, 87, 75, 84, 83, 83, 83, 78, 81, 94,
+  93, 90, 86, 77, 86, 72, 87, 128, 71, 82,
+  67, 85, 77, 87, 87, 78, 88, 85, 85, 80,
+  85, 70, 75, 94, 89, 84, 86, 83, 92, 94,
+  79, 72, 86, 82, 85, 91, 82, 83, 85, 88,
+  87, 79, 87, 77, 89, 74, 89, 80, 83, 83,
+  86, 85, 83, 79, 86, 73, 90, 86, 79, 85,
+  74, 76, 85, 93, 86, 87, 83, 81, 82, 87,
+  84, 75, 84, 76, 85, 78, 86, 71, 81, 70,
+  91, 89, 85, 99, 87, 80, 68, 81, 81, 85,
+  87, 82, 79, 89, 81, 86, 80, 73, 83, 82,
+  74, 82, 75, 84, 91, 82, 80, 94, 71, 84,
+  86, 71, 70, 88, 75, 86, 79, 78, 91, 85,
+  81, 90, 88, 78, 85, 71, 80, 78, 99, 81,
+  88, 77, 83, 66, 74, 128, 71, 62, 73, 105,
+  69, 91, 89, 98, 86, 81, 84, 84, 92, 88,
+  70, 100, 89, 79, 85, 88, 85, 81, 70, 96,
+  77, 83, 79, 78, 80, 76, 86, 80, 83, 79,
+  86, 78, 91, 101, 91, 80, 70, 79, 81, 88,
+  89, 88, 90, 79, 87, 76, 82, 84, 72, 79,
+  86, 85, 75, 80, 73, 79, 100, 74, 84, 73,
+  88, 73, 91, 89, 94, 74, 80, 86, 85, 84,
+  74, 91, 78, 95, 63, 91, 80, 89, 85, 86,
+  94, 89, 88, 84, 80, 80, 92, 84, 92, 84,
+  87, 79, 88, 93, 74, 82, 77, 100, 75, 88,
+  85, 81, 75, 88, 84, 95, 88, 76, 82, 77,
+  88, 83, 86, 74, 81, 89, 90, 83, 84, 80,
+  85, 77, 86, 113, 75, 77, 68, 89, 79, 83,
+  81, 69, 85, 85, 86, 89, 82, 94, 82, 93,
+  85, 88, 86, 91, 87, 88, 98, 74, 83, 83,
+  87, 96, 87, 80, 104, 86, 85, 77, 82, 79,
+  91, 72, 86, 82, 90, 83, 91, 86, 90, 80,
+  100, 75, 92, 87, 93, 83, 81, 72, 80, 89,
+  87, 85, 86, 82, 83, 92, 85, 81, 72, 78,
+  82, 89, 74, 93, 69, 80, 88, 77, 66, 93,
+  73, 91, 65, 92, 79, 99, 79, 109, 71, 66,
+  94, 75, 72, 80, 96, 85, 103, 83, 67, 92,
+  91, 73, 86, 94, 74, 87, 75, 69, 79, 43,
+  88, 81, 77, 96, 84, 86, 73, 82, 89, 79,
+  81, 70, 78, 76, 88, 71, 85, 77, 79, 84,
+  92, 62, 79, 44, 62, 75, 87, 98, 86, 64,
+  89, 92, 87, 69, 78, 82, 81, 80, 82, 77,
+  81, 108, 68, 90, 85, 68, 81, 87, 90, 93,
+  77, 73, 95, 82, 82, 66, 74, 69, 86, 83,
+  77, 85, 86, 79, 87, 85, 69, 74, 85, 80,
+  84, 93, 71, 72, 91, 69, 60, 91, 83, 80,
+  73, 71, 72, 95, 79, 75, 98, 89, 76, 80,
+  82, 42, 93, 68, 82, 95, 99, 111, 111, 93,
+  78, 79, 87, 65, 94, 68, 69, 101, 55, 102,
+  91, 83, 71, 88, 72, 96, 107, 83, 92, 109,
+  91, 76, 87, 87, 129, 64, 92, 155, 72, 81,
+  96, 57, 96, 88, 96, 101, 81, 83, 85, 64,
+  97, 97, 103, 97, 92, 76, 96, 84, 65, 255,
+  39, 112, 73, 95, 88, 68, 73, 120, 59, 90,
+  76, 78, 102, 74, 66, 111, 96, 83, 97, 60,
+  122, 92, 30, 108, 81, 73, 82, 59, 94, 102,
+  68, 89, 84, 85, 98, 81, 70, 87, 110, 79,
+  69, 80, 79, 88, 96, 93, 106, 84, 88, 32,
+  86, 94, 60, 92, 117, 96, 55, 86, 90, 90,
+  105, 61, 93, 90, 76, 76, 92, 90, 80, 97,
+  68, 85, 82, 76, 64, 90, 66, 87, 66, 96,
+  85, 99, 81, 85, 94, 62, 94, 81, 74, 77,
+  88, 81, 104, 91, 70, 79, 93, 83, 76, 84,
+  66, 92, 71, 70, 79, 56, 79, 86, 78, 93,
+  83, 85, 80, 77, 89, 72, 82, 70, 81, 88,
+  81, 70, 84, 82, 82, 81, 90, 62, 71, 50,
+  61, 86, 91, 85, 85, 66, 87, 90, 86, 75,
+  79, 103, 83, 83, 81, 75, 76, 89, 72, 82,
+  90, 70, 74, 81, 90, 105, 82, 74, 108, 81,
+  82, 68, 78, 73, 89, 84, 80, 86, 92, 83,
+  89, 88, 77, 79, 87, 81, 91, 84, 75, 87,
+  95, 68, 67, 88, 88, 81, 82, 72, 76, 96,
+  81, 82, 84, 77, 70, 89, 97, 86, 76, 84,
+  88, 82, 73, 90, 79, 98, 69, 90, 78, 95,
+  95, 107, 75, 91, 91, 80, 83, 87, 91, 88,
+  96, 79, 86, 90, 89, 76, 72, 88, 69, 88,
+  77, 85, 83, 78, 78, 79, 82, 89, 89, 84,
+  87, 81, 88, 87, 85, 76, 86, 80, 92, 83,
+  85, 80, 77, 76, 92, 109, 91, 76, 73, 86,
+  86, 90, 82, 77, 81, 87, 91, 81, 83, 87,
+  80, 91, 84, 71, 89, 93, 83, 86, 79, 74,
+  88, 81, 88, 87, 82, 85, 91, 84, 86, 79,
+  78, 74, 78, 88, 82, 86, 94, 78, 101, 86,
+  81, 85, 90, 71, 92, 89, 84, 82, 82, 77,
+  79, 85, 86, 86, 83, 78, 80, 92, 83, 80,
+  83, 76, 86, 87, 94, 72, 78, 70, 82, 85,
+  86, 97, 89, 85, 64, 85, 76, 83, 89, 92,
+  74, 73, 81, 96, 78, 72, 87, 88, 66, 85,
+  74, 84, 88, 95, 76, 84, 83, 76, 87, 70,
+  92, 94, 74, 80, 79, 74, 91, 76, 88, 91,
+  86, 86, 83, 66, 92, 76, 93, 81, 73, 80,
+  92, 71, 80, 145, 76, 66, 72, 91, 82, 81,
+  87, 103, 69, 92, 79, 82, 92, 85, 83, 104,
+  91, 78, 90, 87, 81, 90, 62, 92, 78, 72,
+  95, 76, 89, 90, 79, 86, 82, 82, 78, 79,
+  77, 86, 87, 82, 75, 74, 90, 88, 71, 90,
+  86, 73, 84, 69, 77, 75, 79, 84, 89, 95,
+  74, 80, 74, 82, 98, 76, 81, 79, 86, 92,
+  77, 92, 95, 87, 75, 82, 86, 81, 73, 91,
+  80, 85, 68, 91, 85, 95, 92, 93, 84, 78,
+  87, 86, 81, 83, 90, 88, 92, 83, 76, 83,
+  88, 87, 71, 79, 62, 84, 96, 83, 88, 83,
+  78, 86, 82, 83, 86, 79, 87, 82, 88, 86,
+  83, 79, 88, 90, 88, 82, 82, 83, 83, 77,
+  88, 108, 82, 71, 65, 92, 87, 87, 81, 82,
+  81, 88, 88, 85, 79, 88, 85, 93, 86, 72,
+  86, 87, 89, 84, 86, 73, 83, 82, 93, 101,
+  82, 88, 94, 81, 85, 77, 92, 77, 79, 93,
+  86, 86, 98, 77, 99, 93, 84, 84, 79, 74,
+  95, 75, 75, 83, 98, 75, 84, 83, 80, 84,
+  88, 79, 82, 87, 83, 80, 101, 80, 92, 98,
+  85, 82, 69, 77, 84, 81, 77, 90, 84, 109,
+  86, 71, 97, 82, 101, 82, 89, 92, 102, 80,
+  94, 66, 97, 79, 100, 88, 89, 81, 92, 64,
+  82, 92, 79, 67, 100, 76, 88, 76, 79, 86,
+  79, 97, 83, 84, 74, 82, 102, 84, 85, 97,
+  107, 100, 92, 55, 77, 95, 78, 91, 98, 95,
+  62, 92, 72, 97, 86, 55, 98, 76, 102, 87,
+  86, 78, 96, 95, 90, 80, 91, 78, 107, 85,
+  89, 82, 99, 69, 89, 86, 49, 84, 78, 87,
+  96, 71, 90, 89, 98, 64, 66, 85, 58, 85,
+  83, 100, 95, 80, 66, 73, 85, 101, 69, 88,
+  98, 112, 89, 70, 91, 88, 96, 83, 83, 73,
+  90, 85, 112, 84, 102, 87, 79, 93, 83, 95,
+  66, 80, 80, 79, 74, 94, 81, 100, 86, 66,
+  108, 86, 113, 80, 74, 103, 77, 72, 111, 66,
+  97, 73, 110, 94, 90, 91, 99, 73, 89, 91,
+  74, 59, 107, 73, 78, 78, 93, 91, 76, 100,
+  90, 88, 72, 75, 98, 88, 85, 102, 95, 86,
+  93, 54, 80, 88, 88, 93, 99, 85, 50, 93,
+  66, 96, 90, 61, 98, 74, 98, 78, 75, 73,
+  96, 78, 82, 80, 89, 79, 123, 109, 91, 74,
+  86, 73, 82, 91, 51, 83, 82, 85, 94, 73,
+  85, 93, 77, 65, 68, 85, 54, 93, 69, 98,
+  101, 78, 70, 66, 81, 102, 73, 97, 97, 102,
+  105, 62, 88, 82, 89, 88, 78, 73, 81, 83,
+  118, 82, 71, 92, 89, 87, 73, 93, 78, 82,
+  81, 86, 73, 88, 88, 87, 92, 83, 86, 79,
+  88, 87, 80, 80, 80, 102, 91, 86, 74, 92,
+  91, 93, 83, 75, 81, 91, 81, 92, 84, 89,
+  96, 86, 83, 84, 87, 81, 84, 86, 77, 98,
+  101, 80, 88, 90, 77, 76, 86, 82, 79, 71,
+  73, 89, 84, 84, 90, 67, 67, 83, 74, 83,
+  87, 85, 95, 83, 86, 89, 90, 83, 85, 73,
+  85, 82, 82, 80, 86, 98, 84, 74, 77, 88,
+  85, 89, 82, 88, 91, 92, 81, 84, 85, 85,
+  75, 79, 91, 100, 85, 85, 107, 89, 81, 84,
+  72, 69, 92, 81, 77, 96, 98, 88, 99, 90,
+  83, 80, 81, 85, 71, 87, 94, 83, 89, 86,
+  89, 82, 71, 75, 86, 77, 67, 87, 87, 83,
+  65, 83, 73, 91, 83, 78, 85, 74, 84, 77,
+  71, 86, 77, 91, 86, 79, 92, 92, 82, 91,
+  81, 79, 88, 69, 92, 84, 89, 61, 90, 83,
+  83, 67, 76, 71, 57, 73, 82, 76, 83, 82,
+  96, 86, 91, 87, 90, 103, 86, 68, 75, 95,
+  71, 79, 100, 89, 58, 85, 72, 88, 96, 66,
+  98, 96, 95, 77, 90, 85, 86, 90, 103, 76,
+  91, 75, 100, 83, 98, 74, 93, 81, 82, 82,
+  68, 75, 78, 78, 84, 71, 82, 83, 94, 72,
+  73, 91, 74, 79, 99, 93, 79, 81, 70, 71,
+  67, 95, 82, 79, 101, 89, 79, 77, 95, 76,
+  82, 84, 73, 91, 82, 79, 94, 80, 90, 77,
+  81, 75, 82, 70, 67, 87, 80, 76, 66, 83,
+  72, 97, 86, 73, 86, 79, 79, 77, 67, 90,
+  79, 84, 99, 77, 85, 86, 94, 108, 87, 79,
+  89, 72, 90, 79, 86, 54, 91, 79, 80, 65,
+  73, 79, 52, 74, 87, 86, 84, 81, 88, 90,
+  89, 83, 79, 83, 84, 69, 83, 86, 77, 82,
+  95, 82, 50, 83, 77, 86, 94, 70, 80, 92,
+  89, 72, 86, 79, 87, 80, 92, 68, 89, 78,
+  97, 95, 101, 83, 77, 85, 82, 79, 65, 73,
+  82, 77, 74, 73, 78, 87, 77, 74, 76, 79,
+  73, 83, 92, 95, 80, 82, 69, 72, 68, 95,
+  87, 86, 109, 88, 92, 75, 91, 73, 83, 89,
+  70, 91, 79, 83, 95, 80, 72, 80, 89, 82,
+  79, 79, 84, 78, 85, 77, 72, 82, 80, 83,
+  92, 89, 77, 77, 79, 83, 86, 83, 86, 108,
+  92, 88, 75, 95, 75, 84, 82, 75, 81, 88,
+  79, 82, 85, 87, 87, 100, 80, 82, 76, 83,
+  77, 77, 79, 91, 101, 85, 84, 84, 86, 72,
+  82, 78, 78, 87, 71, 78, 84, 82, 89, 65,
+  72, 83, 91, 68, 87, 83, 77, 82, 83, 83,
+  88, 81, 85, 79, 73, 82, 89, 75, 82, 83,
+  79, 77, 68, 87, 86, 77, 90, 75, 83, 77,
+  75, 85, 81, 80, 74, 86, 82, 79, 90, 79,
+  108, 89, 70, 88, 83, 79, 87, 80, 84, 85,
+  103, 85, 89, 90, 79, 81, 82, 83, 85, 87,
+  95, 80, 82, 89, 84, 83, 76, 73, 89, 85,
+  85, 80, 89, 79, 76, 81, 84, 85, 84, 84,
+  74, 81, 83, 81, 84, 79, 85, 109, 83, 90,
+  78, 103, 88, 89, 86, 78, 80, 85, 86, 79,
+  90, 80, 87, 92, 91, 75, 82, 71, 81, 73,
+  91, 83, 93, 91, 90, 83, 79, 71, 87, 93,
+  82, 85, 70, 79, 83, 76, 93, 81, 63, 83,
+  86, 74, 87, 80, 96, 85, 91, 83, 98, 85,
+  86, 83, 84, 76, 85, 75, 81, 88, 91, 78,
+  79, 93, 78, 78, 85, 79, 77, 74, 84, 81,
+  84, 81, 90, 82, 78, 95, 90, 81, 107, 81,
+  67, 91, 87, 80, 89, 84, 87, 80, 95, 87,
+  85, 99, 88, 87, 79, 83, 78, 89, 84, 79,
+  84, 94, 84, 79, 85, 78, 85, 77, 90, 81,
+  87, 76, 78, 86, 80, 88, 92, 84, 75, 81,
+  79, 89, 84, 76, 85, 102, 89, 90, 81, 98,
+  89, 89, 87, 81, 82, 84, 86, 72, 89, 74,
+  85, 89, 87, 77, 82, 78, 78, 69, 88, 82,
+  94, 90, 88, 82, 81, 68, 84, 90, 81, 84,
+  77, 78, 83, 78, 91, 80, 69, 86, 91, 72,
+  84, 82, 75, 82, 90, 82, 100, 78, 86, 81,
+  84, 72, 88, 80, 77, 84, 91, 83, 80, 91,
+  80, 74, 81, 79, 83, 76, 77, 82, 86, 84,
+  84, 84, 81, 94, 93, 83, 111, 82, 70, 94,
+  91, 80, 93, 81, 91, 76, 95, 81, 87, 96,
+  83, 87, 84, 85, 83, 90, 83, 82, 86, 92,
+  76, 75, 85, 88, 83, 86, 91, 76, 90, 75,
+  84, 92, 87, 81, 85, 87, 76, 84, 90, 86,
+  89, 86, 85, 107, 87, 88, 79, 92, 75, 78,
+  83, 82, 84, 85, 87, 79, 83, 87, 84, 96,
+  84, 85, 90, 85, 90, 82, 82, 84, 87, 88,
+  85, 84, 77, 75, 89, 80, 83, 90, 81, 82,
+  90, 89, 86, 81, 89, 89, 87, 78, 84, 87,
+  78, 78, 95, 79, 95, 81, 83, 82, 79, 84,
+  83, 79, 83, 82, 84, 74, 80, 89, 76, 75,
+  91, 76, 89, 81, 79, 84, 85, 82, 88, 91,
+  91, 93, 84, 81, 91, 88, 78, 94, 86, 83,
+  95, 86, 84, 80, 91, 84, 88, 98, 84, 87,
+  84, 83, 81, 82, 89, 77, 77, 90, 80, 79,
+  78, 82, 112, 83, 77, 68, 81, 96, 88, 87,
+  81, 87, 83, 70, 72, 75, 67, 88, 87, 82,
+  74, 88, 94, 97, 83, 80, 86, 97, 74, 76,
+  80, 88, 71, 70, 74, 79, 86, 104, 88, 94,
+  76, 99, 79, 91, 77, 78, 64, 77, 87, 75,
+  84, 97, 86, 82, 79, 95, 69, 87, 71, 89,
+  75, 87, 100, 82, 77, 73, 84, 96, 80, 86,
+  86, 76, 70, 84, 82, 65, 76, 107, 65, 85,
+  90, 83, 95, 74, 89, 88, 90, 67, 74, 88,
+  78, 81, 79, 115, 75, 93, 89, 86, 92, 85,
+  90, 80, 85, 81, 78, 80, 94, 77, 77, 84,
+  93, 86, 97, 84, 95, 85, 78, 78, 81, 81,
+  86, 92, 84, 84, 80, 82, 77, 89, 79, 84,
+  116, 75, 88, 74, 79, 98, 82, 83, 78, 88,
+  88, 68, 72, 79, 69, 94, 77, 78, 73, 92,
+  92, 97, 87, 82, 90, 87, 78, 69, 79, 78,
+  75, 77, 82, 76, 86, 103, 88, 101, 81, 96,
+  82, 82, 76, 69, 66, 77, 93, 66, 86, 90,
+  87, 87, 83, 86, 64, 90, 71, 94, 79, 89,
+  89, 79, 70, 71, 83, 94, 81, 91, 88, 81,
+  76, 80, 79, 65, 85, 101, 65, 88, 96, 74,
+  112, 75, 82, 88, 92, 61, 79, 88, 74, 80,
+  71, 118, 71, 87, 84, 86, 88, 78, 86, 81,
+  76, 80, 78, 80, 93, 76, 90, 92, 94, 86,
+  95, 81, 73, 87, 74, 83, 75, 75, 83, 92,
+  75, 83, 79, 77, 81, 97, 84, 83, 110, 75,
+  79, 74, 83, 95, 87, 87, 79, 94, 79, 72,
+  72, 78, 72, 101, 77, 86, 87, 85, 97, 98,
+  85, 78, 85, 74, 76, 75, 80, 69, 86, 86,
+  77, 78, 94, 102, 86, 91, 85, 93, 80, 90,
+  74, 67, 65, 76, 86, 69, 82, 96, 88, 90,
+  80, 95, 72, 81, 74, 91, 76, 89, 99, 80,
+  74, 74, 89, 95, 84, 89, 92, 79, 78, 85,
+  83, 74, 79, 109, 64, 85, 90, 77, 90, 82,
+  84, 88, 85, 74, 78, 88, 82, 84, 69, 113,
+  74, 92, 88, 93, 95, 93, 85, 78, 87, 82,
+  81, 77, 91, 76, 81, 84, 91, 90, 89, 83,
+  71, 86, 77, 82, 78, 83, 80, 92, 84, 80,
+  79, 82, 79, 74, 71, 78, 101, 91, 82, 69,
+  80, 92, 94, 81, 87, 91, 92, 83, 89, 76,
+  70, 83, 85, 89, 76, 88, 102, 95, 76, 84,
+  81, 95, 75, 82, 77, 97, 73, 71, 73, 73,
+  91, 96, 87, 99, 78, 98, 83, 85, 75, 83,
+  68, 75, 94, 78, 81, 94, 84, 82, 85, 96,
+  63, 92, 75, 89, 80, 100, 95, 80, 73, 62,
+  88, 84, 78, 93, 84, 79, 68, 85, 84, 60,
+  73, 112, 68, 107, 90, 77, 105, 77, 92, 87,
+  87, 69, 71, 89, 72, 80, 85, 117, 76, 100,
+  96, 97, 80, 87, 82, 86, 75, 86, 76, 82,
+  88, 78, 80, 89, 94, 78, 84, 84, 87, 86,
+  82, 76, 78, 82, 93, 92, 82, 81, 74, 83,
+  79, 92, 74, 79, 115, 73, 90, 75, 79, 93,
+  94, 78, 88, 93, 96, 90, 88, 75, 70, 81,
+  74, 87, 71, 96, 107, 102, 76, 87, 83, 77,
+  86, 80, 75, 89, 73, 71, 72, 63, 96, 104,
+  84, 112, 79, 99, 89, 74, 76, 69, 67, 77,
+  101, 74, 83, 95, 85, 83, 85, 91, 56, 92,
+  75, 93, 81, 115, 78, 84, 74, 58, 92, 82,
+  74, 101, 81, 84, 76, 79, 81, 63, 74, 112,
+  75, 119, 102, 66, 123, 85, 74, 87, 99, 64,
+  74, 79, 67, 76, 68, 124, 73, 91, 83, 96,
+  78, 78, 77, 85, 67, 84, 73, 80, 92, 79,
+  89, 95, 95, 77, 85, 80, 66, 87, 78, 77,
+  75, 75, 99, 95, 83, 79, 70, 74, 78, 94,
+  88, 79, 97, 78, 82, 72, 80, 91, 91, 83,
+  84, 92, 87, 84, 86, 80, 75, 101, 78, 93,
+  93, 84, 108, 95, 79, 84, 80, 74, 81, 86,
+  76, 73, 90, 87, 75, 71, 99, 94, 84, 91,
+  85, 92, 83, 83, 78, 67, 66, 75, 94, 74,
+  79, 92, 84, 76, 83, 100, 66, 89, 78, 94,
+  79, 98, 93, 81, 70, 65, 90, 88, 78, 93,
+  87, 80, 82, 83, 85, 82, 76, 109, 67, 102,
+  91, 72, 102, 85, 73, 88, 82, 73, 74, 80,
+  76, 76, 71, 114, 75, 102, 82, 100, 78, 82,
+  80, 84, 74, 85, 80, 78, 85, 80, 83, 93,
+  92, 93, 81, 80, 71, 87, 82, 79, 78, 87,
+  82, 92, 86, 80, 77, 86, 77, 72, 68, 87,
+  95, 90, 74, 65, 73, 93, 90, 77, 83, 88,
+  87, 95, 90, 82, 72, 81, 82, 84, 81, 78,
+  93, 88, 84, 81, 85, 84, 78, 87, 80, 94,
+  77, 73, 74, 70, 86, 92, 85, 83, 83, 92,
+  82, 85, 80, 85, 65, 75, 92, 66, 76, 98,
+  88, 76, 87, 100, 78, 79, 86, 76, 84, 91,
+  95, 78, 77, 64, 90, 90, 78, 84, 82, 79,
+  72, 77, 88, 69, 87, 97, 70, 88, 86, 79,
+  92, 74, 97, 87, 81, 84, 73, 94, 81, 71,
+  92, 103, 79, 97, 100, 93, 87, 93, 83, 85,
+  84, 80, 82, 77, 80, 87, 82, 86, 85, 80,
+  89, 87, 83, 83, 83, 83, 79, 85, 84, 91,
+  78, 83, 83, 87, 78, 80, 75, 85, 100, 80,
+  78, 66, 70, 91, 90, 74, 84, 91, 88, 92,
+  89, 84, 67, 82, 82, 82, 84, 84, 94, 96,
+  82, 83, 87, 77, 83, 87, 75, 88, 73, 80,
+  70, 68, 88, 91, 89, 88, 80, 94, 88, 73,
+  81, 78, 65, 73, 92, 68, 74, 93, 87, 81,
+  87, 89, 74, 79, 91, 84, 85, 89, 87, 75,
+  86, 68, 89, 96, 76, 90, 79, 84, 76, 72,
+  93, 72, 84, 100, 74, 93, 88, 67, 100, 84,
+  82, 93, 85, 77, 74, 94, 78, 69, 77, 109,
+  75, 92, 86, 96, 81, 95, 79, 86, 76, 80,
+  81, 78, 82, 84, 86, 94, 87, 80, 86, 90,
+  72, 84, 82, 83, 81, 86, 82, 91, 78, 85,
+  83, 77, 74, 85, 87, 85, 97, 81, 74, 69,
+  74, 92, 88, 79, 82, 87, 85, 93, 87, 88,
+  76, 95, 85, 87, 90, 77, 97, 86, 83, 83,
+  82, 78, 82, 86, 78, 77, 80, 85, 76, 70,
+  83, 90, 89, 83, 81, 90, 86, 83, 84, 72,
+  65, 77, 90, 62, 74, 94, 85, 78, 83, 105,
+  83, 79, 87, 80, 83, 91, 87, 77, 77, 70,
+  86, 92, 74, 86, 85, 82, 84, 79, 87, 79,
+  87, 99, 70, 87, 86, 71, 89, 82, 75, 84,
+  78, 82, 74, 83, 84, 68, 75, 103, 76, 99,
+  79, 96, 86, 85, 80, 84, 84, 81, 88, 73,
+  80, 88, 83, 89, 85, 92, 86, 87, 68, 85,
+  84, 82, 88, 89, 76, 91, 80, 85, 84, 88,
+  90, 69, 70, 81, 97, 84, 64, 90, 66, 79,
+  84, 85, 67, 77, 80, 84, 77, 78, 76, 88,
+  72, 69, 74, 75, 74, 91, 88, 88, 97, 100,
+  75, 85, 70, 93, 86, 94, 93, 86, 76, 72,
+  79, 87, 72, 118, 89, 89, 72, 95, 92, 83,
+  86, 77, 88, 73, 82, 85, 71, 62, 74, 71,
+  74, 91, 80, 92, 78, 74, 82, 91, 83, 92,
+  68, 88, 96, 94, 88, 75, 93, 74, 78, 52,
+  100, 100, 89, 86, 84, 83, 77, 105, 85, 78,
+  76, 83, 77, 73, 89, 79, 92, 87, 82, 90,
+  82, 77, 98, 99, 79, 78, 101, 138, 81, 76,
+  71, 76, 75, 73, 89, 78, 81, 93, 82, 89,
+  80, 91, 78, 81, 113, 85, 76, 77, 83, 73,
+  65, 85, 102, 79, 58, 95, 69, 78, 83, 87,
+  74, 88, 85, 85, 76, 79, 73, 94, 70, 61,
+  82, 72, 68, 95, 84, 88, 92, 93, 67, 83,
+  70, 81, 95, 90, 90, 81, 76, 65, 76, 81,
+  72, 136, 83, 84, 79, 85, 80, 81, 88, 90,
+  92, 79, 76, 92, 70, 70, 89, 67, 70, 78,
+  75, 88, 86, 77, 87, 81, 79, 96, 77, 81,
+  99, 90, 95, 68, 89, 82, 78, 48, 98, 100,
+  88, 90, 68, 81, 73, 107, 95, 82, 81, 80,
+  78, 68, 87, 77, 91, 90, 80, 90, 81, 78,
+  95, 100, 80, 89, 107, 148, 85, 76, 68, 75,
+  76, 77, 74, 85, 72, 87, 80, 95, 85, 94,
+  77, 80, 117, 84, 75, 78, 91, 79, 66, 82,
+  81, 73, 67, 89, 68, 75, 83, 80, 76, 87,
+  82, 86, 80, 82, 79, 89, 77, 73, 83, 73,
+  78, 98, 89, 84, 92, 82, 79, 81, 76, 79,
+  93, 98, 91, 88, 77, 72, 79, 82, 79, 95,
+  89, 86, 74, 89, 93, 87, 85, 82, 83, 75,
+  83, 91, 75, 58, 73, 78, 79, 93, 78, 88,
+  70, 80, 85, 90, 84, 95, 75, 93, 95, 93,
+  96, 79, 97, 88, 84, 59, 84, 95, 92, 85,
+  86, 84, 72, 92, 79, 79, 77, 80, 83, 80,
+  87, 76, 89, 82, 74, 99, 80, 75, 96, 99,
+  77, 83, 96, 116, 86, 75, 69, 76, 79, 76,
+  67, 92, 81, 92, 85, 91, 86, 87, 78, 84,
+  97, 89, 82, 84, 92, 61, 65, 89, 87, 99,
+  49, 79, 86, 76, 82, 82, 73, 81, 81, 92,
+  91, 70, 82, 77, 78, 74, 76, 82, 76, 111,
+  72, 90, 96, 94, 78, 89, 68, 98, 93, 86,
+  76, 88, 68, 87, 77, 91, 81, 158, 94, 92,
+  83, 99, 70, 79, 89, 85, 94, 81, 72, 86,
+  68, 72, 85, 59, 72, 94, 74, 96, 80, 77,
+  76, 89, 80, 85, 70, 76, 83, 85, 89, 66,
+  89, 83, 65, 71, 123, 120, 84, 87, 73, 74,
+  81, 111, 94, 88, 69, 84, 81, 69, 82, 85,
+  95, 94, 83, 84, 83, 77, 92, 93, 82, 77,
+  100, 173, 62, 79, 71, 71, 76, 78, 83, 75,
+  75, 87, 89, 84, 85, 85, 65, 82, 129, 78,
+  76, 73, 82, 79, 65, 92, 94, 84, 43, 78,
+  95, 84, 79, 87, 83, 71, 93, 84, 94, 66,
+  80, 83, 74, 63, 84, 83, 76, 116, 66, 99,
+  90, 91, 81, 85, 60, 80, 92, 78, 74, 103,
+  74, 84, 81, 101, 80, 187, 95, 77, 91, 80,
+  61, 73, 93, 92, 101, 92, 71, 88, 74, 85,
+  100, 50, 59, 80, 70, 109, 73, 83, 85, 89,
+  77, 76, 64, 80, 81, 84, 96, 64, 84, 87,
+  64, 82, 129, 129, 81, 82, 65, 76, 74, 114,
+  105, 85, 70, 69, 87, 67, 71, 92, 96, 112,
+  88, 80, 74, 69, 93, 93, 89, 79, 102, 181,
+  69, 79, 80, 69, 80, 73, 84, 82, 68, 87,
+  95, 80, 81, 88, 57, 87, 150, 75, 85, 73,
+  97, 83, 76, 90, 77, 78, 57, 77, 83, 74,
+  81, 79, 73, 73, 85, 89, 86, 77, 80, 91,
+  75, 80, 97, 79, 79, 103, 81, 86, 90, 87,
+  82, 82, 72, 81, 94, 92, 78, 88, 74, 82,
+  77, 87, 83, 129, 89, 90, 86, 89, 76, 82,
+  86, 82, 87, 81, 72, 80, 73, 67, 85, 64,
+  76, 96, 69, 84, 78, 79, 78, 91, 81, 88,
+  81, 82, 90, 89, 97, 67, 98, 92, 74, 75,
+  105, 117, 85, 84, 76, 76, 79, 106, 90, 83,
+  73, 73, 84, 75, 83, 80, 94, 93, 78, 89,
+  86, 74, 88, 94, 80, 84, 97, 147, 71, 78,
+  82, 75, 80, 79, 84, 85, 89, 91, 84, 90,
+  84, 83, 69, 84, 109, 83, 77, 75, 91, 70,
+  65, 91, 94, 90, 63, 84, 79, 80, 90, 74,
+  70, 82, 77, 98, 89, 70, 84, 84, 83, 69,
+  78, 89, 83, 103, 79, 84, 94, 91, 89, 86,
+  77, 105, 90, 85, 96, 80, 74, 78, 86, 83,
+  79, 107, 87, 95, 82, 93, 88, 95, 85, 74,
+  90, 83, 78, 89, 78, 62, 86, 76, 76, 99,
+  84, 94, 79, 82, 80, 91, 74, 75, 74, 82,
+  84, 70, 84, 78, 94, 82, 77, 52, 110, 87,
+  88, 87, 82, 79, 82, 97, 79, 104, 78, 94,
+  88, 74, 91, 72, 91, 79, 89, 96, 80, 88,
+  92, 94, 85, 84, 88, 125, 70, 89, 67, 72,
+  81, 81, 79, 87, 68, 87, 91, 86, 84, 91,
+  71, 84, 98, 85, 73, 87, 92, 74, 71, 94,
+  97, 81, 60, 80, 83, 83, 86, 77, 77, 78,
+  81, 95, 90, 74, 84, 86, 74, 58, 84, 85,
+  78, 96, 79, 87, 87, 91, 90, 85, 67, 88,
+  87, 77, 90, 86, 74, 71, 92, 81, 79, 123,
+  80, 92, 90, 76, 76, 83, 87, 83, 88, 82,
+  79, 80, 77, 72, 93, 67, 71, 91, 87, 94,
+  87, 77, 88, 81, 74, 89, 64, 80, 81, 73,
+  79, 67, 89, 87, 76, 53, 113, 93, 87, 89,
+  77, 82, 79, 105, 86, 95, 74, 89, 84, 73,
+  86, 71, 92, 89, 84, 90, 79, 86, 89, 93,
+  87, 87, 85, 136, 65, 88, 75, 71, 76, 83,
+  93, 90, 74, 84, 91, 90, 86, 88, 63, 82,
+  108, 86, 77, 86, 94, 83, 86, 87, 87, 81,
+  66, 77, 80, 83, 90, 71, 71, 81, 78, 98,
+  84, 72, 84, 90, 72, 76, 91, 87, 85, 97,
+  84, 86, 86, 85, 92, 83, 78, 85, 89, 88,
+  98, 80, 78, 79, 86, 88, 82, 92, 83, 93,
+  82, 81, 89, 97, 80, 80, 80, 82, 78, 66,
+  76, 60, 84, 80, 76, 97, 81, 88, 82, 80,
+  83, 92, 83, 75, 68, 85, 86, 75, 84, 76,
+  97, 95, 74, 61, 96, 93, 89, 86, 83, 80,
+  78, 91, 82, 91, 80, 82, 89, 81, 87, 68,
+  90, 79, 80, 96, 81, 80, 89, 94, 89, 85,
+  82, 111, 69, 86, 80, 72, 79, 83, 94, 87,
+  90, 92, 89, 89, 95, 86, 72, 84, 88, 87,
+  80, 88, 86, 82, 97, 87, 81, 98, 94, 78,
+  78, 88, 81, 92, 100, 97, 87, 88, 98, 102,
+  70, 83, 88, 101, 96, 81, 86, 92, 87, 83,
+  93, 78, 78, 83, 89, 89, 68, 78, 91, 92,
+  78, 92, 83, 85, 88, 90, 80, 89, 86, 84,
+  80, 95, 56, 100, 84, 63, 83, 77, 89, 75,
+  81, 87, 97, 75, 77, 76, 90, 67, 77, 86,
+  74, 91, 84, 84, 81, 88, 79, 91, 85, 83,
+  83, 76, 87, 72, 81, 83, 92, 72, 89, 73,
+  75, 80, 78, 71, 81, 88, 76, 83, 84, 86,
+  86, 86, 64, 69, 81, 74, 81, 69, 68, 99,
+  75, 82, 74, 85, 93, 89, 92, 81, 98, 81,
+  81, 79, 80, 84, 89, 90, 83, 78, 79, 96,
+  89, 91, 85, 88, 68, 88, 92, 83, 84, 90,
+  82, 99, 117, 71, 88, 99, 103, 112, 67, 90,
+  100, 83, 79, 83, 82, 88, 100, 91, 85, 62,
+  83, 78, 82, 85, 72, 67, 90, 96, 81, 104,
+  79, 88, 93, 96, 83, 91, 85, 67, 65, 97,
+  45, 94, 97, 56, 88, 86, 90, 75, 74, 88,
+  102, 66, 75, 86, 87, 65, 82, 86, 65, 88,
+  105, 72, 80, 96, 81, 83, 78, 81, 89, 74,
+  84, 67, 85, 77, 95, 67, 85, 68, 77, 84,
+  88, 70, 70, 86, 73, 89, 85, 83, 84, 84,
+  61, 72, 86, 71, 84, 68, 72, 102, 69, 83,
+  80, 90, 104, 87, 84, 77, 94, 76, 78, 87,
+  83, 80, 87, 99, 78, 77, 90, 95, 84, 83,
+  82, 80, 79, 96, 92, 82, 74, 83, 85, 85,
+  94, 70, 92, 89, 96, 91, 75, 93, 85, 102,
+  90, 81, 82, 93, 83, 85, 86, 68, 77, 89,
+  92, 86, 84, 89, 99, 88, 82, 92, 82, 86,
+  83, 84, 81, 85, 86, 77, 84, 99, 66, 85,
+  81, 69, 81, 80, 86, 80, 84, 89, 96, 75,
+  81, 71, 88, 71, 77, 86, 77, 79, 108, 90,
+  89, 86, 80, 91, 87, 87, 85, 83, 91, 82,
+  83, 81, 85, 65, 90, 79, 81, 79, 77, 84,
+  82, 81, 81, 85, 90, 87, 84, 89, 70, 85,
+  81, 75, 78, 66, 69, 87, 74, 82, 77, 84,
+  84, 91, 77, 82, 89, 81, 83, 74, 78, 86,
+  90, 82, 91, 77, 78, 95, 88, 94, 71, 89,
+  86, 93, 81, 72, 81, 87, 91, 92, 88, 77,
+  80, 94, 115, 90, 82, 78, 94, 91, 83, 88,
+  63, 83, 75, 81, 84, 66, 99, 76, 84, 90,
+  80, 82, 91, 91, 99, 79, 72, 81, 89, 80,
+  65, 80, 71, 91, 74, 84, 91, 81, 96, 70,
+  81, 94, 79, 86, 88, 91, 83, 72, 62, 74,
+  67, 80, 81, 92, 81, 62, 91, 78, 89, 91,
+  72, 87, 89, 104, 77, 82, 86, 76, 79, 78,
+  88, 81, 93, 82, 80, 77, 91, 75, 74, 82,
+  92, 73, 84, 76, 93, 88, 56, 75, 86, 79,
+  83, 96, 86, 86, 68, 77, 77, 82, 83, 81,
+  81, 93, 85, 83, 78, 91, 86, 78, 96, 88,
+  76, 77, 87, 88, 79, 90, 87, 95, 75, 81,
+  69, 74, 96, 86, 93, 104, 110, 75, 77, 99,
+  131, 97, 83, 81, 97, 71, 74, 89, 67, 70,
+  83, 86, 76, 67, 115, 79, 75, 87, 68, 73,
+  94, 94, 82, 79, 65, 82, 98, 85, 59, 79,
+  62, 76, 57, 77, 95, 78, 109, 68, 75, 79,
+  85, 75, 73, 93, 87, 64, 53, 81, 58, 77,
+  81, 101, 72, 63, 77, 59, 98, 96, 64, 80,
+  90, 93, 76, 78, 83, 75, 83, 86, 86, 82,
+  84, 79, 74, 77, 95, 73, 60, 74, 95, 70,
+  91, 72, 76, 88, 57, 71, 90, 82, 72, 112,
+  94, 95, 70, 74, 85, 79, 91, 81, 91, 88,
+  83, 79, 69, 87, 89, 78, 86, 96, 67, 76,
+  95, 84, 81, 78, 102, 84, 92, 97, 83, 73,
+  78, 84, 90, 80, 82, 98, 84, 95, 104, 81,
+  81, 79, 84, 97, 90, 89, 87, 84, 71, 81,
+  81, 86, 99, 87, 87, 93, 78, 98, 104, 89,
+  83, 77, 79, 83, 93, 81, 72, 85, 86, 102,
+  85, 85, 88, 84, 91, 74, 81, 64, 81, 84,
+  86, 83, 82, 74, 67, 73, 69, 83, 84, 84,
+  85, 65, 85, 83, 93, 86, 71, 81, 86, 87,
+  78, 86, 90, 86, 78, 91, 85, 82, 79, 90,
+  82, 75, 84, 71, 83, 77, 81, 77, 89, 74,
+  71, 91, 65, 80, 84, 81, 81, 92, 78, 82,
+  67, 75, 88, 84, 75, 89, 91, 89, 90, 82,
+  84, 90, 83, 80, 100, 81, 85, 74, 82, 86,
+  81, 88, 79, 86, 89, 78, 69, 80, 73, 74,
+  84, 77, 74, 96, 69, 89, 106, 59, 73, 72,
+  83, 86, 74, 82, 63, 76, 75, 79, 95, 68,
+  96, 91, 80, 86, 108, 92, 100, 96, 112, 77,
+  89, 61, 86, 64, 74, 77, 88, 77, 99, 76,
+  113, 78, 84, 84, 75, 81, 66, 100, 86, 89,
+  81, 93, 93, 80, 62, 85, 82, 88, 103, 85,
+  94, 91, 89, 79, 68, 81, 96, 92, 95, 95,
+  81, 93, 73, 89, 72, 97, 92, 87, 82, 77,
+  88, 101, 85, 79, 91, 86, 91, 83, 83, 99,
+  77, 97, 78, 87, 91, 94, 87, 53, 71, 73,
+  87, 80, 75, 78, 88, 104, 66, 85, 100, 91,
+  76, 89, 78, 79, 84, 95, 82, 76, 68, 77,
+  90, 79, 86, 74, 63, 73, 67, 71, 90, 81,
+  83, 123, 74, 68, 109, 56, 66, 68, 81, 84,
+  85, 77, 72, 72, 70, 77, 104, 94, 102, 81,
+  79, 87, 91, 83, 105, 89, 107, 74, 101, 61,
+  80, 68, 77, 67, 88, 74, 96, 75, 128, 86,
+  83, 85, 69, 101, 61, 93, 92, 94, 77, 91,
+  93, 85, 56, 102, 86, 105, 105, 90, 83, 91,
+  79, 74, 71, 80, 97, 85, 98, 102, 79, 99,
+  61, 83, 73, 102, 84, 90, 78, 69, 74, 90,
+  86, 73, 89, 94, 87, 83, 85, 108, 79, 95,
+  74, 91, 92, 114, 98, 60, 71, 67, 91, 74,
+  72, 78, 97, 115, 77, 90, 103, 91, 82, 84,
+  70, 78, 83, 91, 76, 77, 78, 68, 93, 85,
+  95, 78, 70, 77, 72, 80, 81, 67, 74, 111,
+  74, 87, 99, 65, 75, 72, 86, 78, 98, 82,
+  77, 79, 79, 80, 90, 108, 91, 87, 79, 85,
+  79, 95, 98, 97, 94, 74, 89, 71, 84, 72,
+  82, 77, 90, 93, 108, 77, 105, 69, 85, 82,
+  78, 87, 73, 89, 82, 81, 80, 89, 94, 82,
+  66, 84, 89, 81, 93, 80, 80, 90, 89, 85,
+  74, 80, 91, 87, 84, 92, 84, 88, 69, 87,
+  74, 103, 79, 89, 78, 75, 85, 78, 90, 79,
+  88, 86, 93, 86, 77, 89, 78, 86, 79, 85,
+  92, 91, 79, 63, 73, 77, 87, 84, 76, 89,
+  77, 89, 99, 83, 103, 89, 93, 83, 81, 77,
+  85, 90, 85, 75, 81, 70, 93, 72, 90, 79,
+  87, 82, 84, 82, 80, 72, 83, 94, 75, 91,
+  78, 69, 63, 76, 78, 106, 97, 102, 78, 76,
+  71, 81, 96, 86, 84, 88, 92, 69, 83, 95,
+  87, 85, 96, 90, 79, 104, 81, 71, 78, 91,
+  97, 88, 84, 88, 80, 83, 82, 80, 79, 86,
+  97, 71, 89, 81, 72, 153, 81, 115, 46, 98,
+  72, 74, 102, 79, 108, 87, 80, 74, 74, 83,
+  96, 81, 87, 99, 83, 76, 93, 71, 83, 70,
+  73, 74, 88, 81, 80, 77, 93, 79, 75, 91,
+  70, 71, 86, 106, 73, 79, 82, 84, 78, 74,
+  72, 71, 70, 82, 84, 70, 73, 73, 88, 87,
+  74, 91, 90, 90, 85, 75, 80, 78, 78, 98,
+  71, 91, 86, 69, 80, 93, 88, 66, 82, 83,
+  75, 80, 85, 81, 90, 106, 76, 86, 83, 83,
+  80, 72, 116, 109, 89, 92, 80, 92, 72, 84,
+  93, 76, 88, 85, 91, 91, 84, 73, 73, 94,
+  69, 85, 82, 92, 75, 87, 79, 89, 81, 82,
+  80, 87, 73, 100, 83, 83, 79, 73, 80, 70,
+  87, 93, 72, 97, 90, 87, 74, 79, 78, 83,
+  91, 89, 64, 85, 73, 81, 83, 68, 83, 88,
+  80, 80, 87, 83, 83, 78, 87, 74, 84, 79,
+  73, 89, 77, 75, 87, 85, 69, 89, 87, 71,
+  88, 74, 80, 69, 84, 83, 92, 71, 91, 98,
+  86, 83, 94, 82, 88, 85, 92, 92, 101, 86,
+  84, 93, 84, 81, 92, 82, 77, 93, 83, 80,
+  80, 78, 76, 104, 91, 81, 92, 88, 80, 89,
+  94, 92, 90, 76, 90, 85, 92, 101, 98, 98,
+  82, 74, 77, 80, 95, 99, 87, 95, 90, 79,
+  83, 89, 97, 88, 89, 74, 86, 95, 82, 75,
+  75, 61, 100, 107, 82, 89, 79, 71, 71, 78,
+  89, 89, 79, 90, 83, 85, 72, 90, 74, 93,
+  73, 67, 93, 73, 103, 71, 77, 94, 72, 97,
+  87, 70, 81, 92, 87, 72, 68, 88, 93, 74,
+  101, 92, 76, 76, 88, 84, 88, 82, 85, 93,
+  68, 86, 72, 80, 80, 95, 91, 88, 73, 66,
+  101, 93, 87, 82, 105, 75, 108, 101, 95, 97,
+  87, 83, 109, 96, 86, 82, 87, 84, 74, 94,
+  84, 90, 87, 91, 86, 96, 95, 84, 85, 80,
+  86, 70, 80, 88, 84, 84, 80, 82, 87, 70,
+  71, 89, 75, 72, 70, 65, 67, 79, 79, 109,
+  98, 94, 81, 86, 67, 80, 90, 73, 82, 87,
+  83, 70, 66, 96, 105, 85, 103, 75, 81, 104,
+  94, 72, 89, 76, 74, 100, 87, 85, 81, 86,
+  82, 82, 87, 97, 98, 75, 95, 82, 82, 133,
+  95, 115, 47, 103, 71, 72, 89, 81, 92, 91,
+  87, 86, 72, 87, 92, 76, 73, 99, 82, 66,
+  88, 78, 85, 81, 68, 82, 83, 75, 79, 76,
+  92, 76, 68, 92, 77, 71, 72, 111, 78, 93,
+  93, 83, 71, 81, 80, 71, 73, 77, 82, 63,
+  71, 66, 78, 81, 82, 84, 93, 97, 75, 72,
+  78, 79, 81, 79, 72, 93, 85, 64, 61, 91,
+  86, 74, 85, 80, 88, 80, 83, 77, 80, 70,
+  79, 89, 80, 75, 78, 73, 104, 90, 74, 91,
+  80, 91, 71, 79, 93, 71, 77, 88, 92, 89,
+  89, 77, 84, 88, 94, 84, 79, 82, 66, 81,
+  83, 92, 78, 85, 79, 86, 79, 73, 90, 83,
+  82, 110, 81, 78, 91, 87, 75, 101, 88, 89,
+  67, 89, 73, 81, 100, 77, 100, 86, 70, 72,
+  80, 79, 91, 92, 75, 83, 80, 81, 87, 73,
+  85, 77, 79, 79, 73, 89, 79, 86, 87, 83,
+  68, 87, 81, 74, 101, 84, 79, 78, 78, 83,
+  81, 81, 89, 90, 82, 85, 79, 78, 76, 82,
+  74, 90, 77, 84, 85, 77, 83, 78, 90, 79,
+  82, 79, 80, 81, 73, 78, 100, 107, 93, 73,
+  90, 75, 79, 93, 87, 90, 84, 86, 91, 96,
+  92, 96, 94, 94, 73, 77, 79, 86, 86, 98,
+  81, 91, 82, 91, 89, 88, 96, 87, 85, 67,
+  92, 101, 70, 81, 82, 67, 81, 95, 75, 86,
+  83, 75, 71, 81, 79, 81, 86, 91, 83, 90,
+  69, 97, 83, 87, 70, 75, 81, 80, 94, 83,
+  81, 88, 81, 97, 67, 73, 68, 74, 86, 73,
+  75, 78, 88, 76, 96, 92, 80, 81, 85, 85,
+  84, 79, 86, 95, 72, 83, 74, 83, 73, 83,
+  84, 87, 84, 62, 93, 76, 78, 82, 103, 86,
+  100, 97, 91, 99, 85, 79, 98, 93, 90, 88,
+  80, 84, 81, 76, 84, 87, 87, 87, 88, 90,
+  95, 86, 89, 95, 97, 95, 84, 87, 86, 101,
+  75, 87, 80, 72, 79, 87, 82, 82, 85, 90,
+  86, 97, 84, 98, 97, 89, 97, 108, 81, 91,
+  77, 76, 93, 79, 84, 83, 77, 82, 90, 97,
+  88, 75, 79, 92, 90, 86, 87, 61, 86, 97,
+  83, 82, 91, 86, 81, 93, 84, 71, 82, 88,
+  79, 103, 88, 75, 86, 92, 66, 72, 79, 80,
+  90, 92, 68, 83, 85, 95, 84, 82, 83, 81,
+  74, 83, 87, 85, 74, 90, 90, 87, 85, 88,
+  87, 78, 78, 88, 88, 86, 81, 80, 81, 76,
+  70, 69, 89, 82, 90, 82, 93, 72, 97, 83,
+  90, 98, 80, 80, 88, 72, 76, 79, 91, 81,
+  98, 82, 82, 94, 105, 89, 91, 82, 86, 91,
+  89, 73, 68, 84, 81, 87, 86, 85, 79, 87,
+  82, 75, 82, 73, 83, 74, 76, 74, 80, 85,
+  75, 93, 80, 92, 90, 93, 83, 84, 81, 69,
+  82, 95, 82, 78, 85, 87, 88, 83, 98, 87,
+  79, 99, 98, 78, 88, 76, 76, 86, 89, 81,
+  88, 79, 87, 82, 81, 85, 87, 81, 87, 84,
+  85, 100, 90, 96, 68, 86, 77, 76, 90, 84,
+  111, 95, 82, 84, 74, 88, 90, 86, 78, 90,
+  78, 86, 82, 79, 88, 80, 79, 86, 86, 83,
+  82, 89, 101, 76, 73, 88, 79, 80, 72, 86,
+  81, 106, 88, 85, 81, 78, 86, 80, 82, 91,
+  75, 77, 77, 72, 74, 91, 74, 88, 93, 88,
+  81, 79, 88, 78, 85, 78, 82, 89, 84, 64,
+  78, 88, 86, 81, 86, 71, 73, 93, 87, 82,
+  86, 86, 86, 83, 79, 79, 83, 86, 80, 85,
+  85, 99, 82, 84, 85, 88, 74, 79, 90, 90,
+  85, 80, 83, 74, 80, 84, 79, 87, 79, 89,
+  83, 82, 80, 80, 76, 75, 92, 82, 78, 83,
+  90, 72, 85, 93, 86, 88, 92, 83, 79, 92,
+  90, 87, 84, 84, 86, 84, 90, 94, 82, 95,
+  82, 76, 78, 85, 90, 85, 90, 87, 81, 94,
+  85, 79, 83, 79, 81, 84, 90, 88, 79, 87,
+  95, 74, 73, 94, 76, 82, 91, 73, 83, 84,
+  82, 84, 90, 81, 86, 81, 76, 96, 76, 74,
+  84, 81, 83, 108, 86, 90, 85, 92, 84, 79,
+  79, 79, 84, 86, 85, 93, 87, 88, 78, 86,
+  73, 90, 76, 65, 69, 73, 79, 74, 87, 78,
+  75, 92, 75, 96, 88, 87, 103, 85, 75, 77,
+  70, 89, 61, 105, 98, 78, 90, 74, 73, 74,
+  66, 71, 81, 88, 90, 76, 59, 55, 89, 88,
+  117, 73, 82, 102, 86, 95, 80, 75, 91, 83,
+  87, 76, 73, 77, 83, 82, 95, 70, 75, 81,
+  80, 82, 76, 86, 67, 92, 72, 72, 101, 95,
+  91, 84, 71, 83, 89, 71, 81, 82, 93, 89,
+  89, 95, 88, 103, 91, 104, 100, 78, 63, 73,
+  80, 102, 78, 97, 66, 85, 92, 74, 79, 76,
+  87, 94, 79, 93, 74, 84, 113, 96, 90, 76,
+  73, 77, 89, 92, 80, 119, 100, 86, 87, 72,
+  93, 85, 86, 89, 85, 91, 68, 87, 75, 86,
+  76, 69, 70, 73, 76, 77, 86, 83, 75, 87,
+  70, 93, 83, 86, 90, 85, 80, 77, 73, 89,
+  55, 105, 100, 72, 91, 68, 73, 72, 71, 78,
+  85, 86, 85, 75, 62, 67, 94, 86, 120, 71,
+  85, 98, 85, 99, 83, 73, 90, 84, 89, 76,
+  71, 75, 94, 82, 100, 74, 79, 84, 69, 88,
+  74, 85, 72, 85, 74, 75, 97, 85, 92, 77,
+  73, 85, 82, 69, 82, 84, 94, 80, 86, 93,
+  85, 97, 89, 98, 92, 78, 75, 75, 79, 103,
+  80, 97, 70, 81, 88, 77, 77, 77, 87, 95,
+  71, 91, 69, 90, 109, 99, 92, 79, 72, 82,
+  75, 93, 88, 112, 97, 87, 72, 76, 89, 86,
+  85, 92, 85, 91, 71, 82, 69, 83, 75, 79,
+  73, 75, 77, 73, 80, 88, 77, 96, 79, 90,
+  82, 93, 79, 78, 85, 76, 75, 94, 68, 99,
+  89, 68, 87, 72, 73, 70, 78, 86, 86, 85,
+  75, 74, 66, 61, 105, 86, 110, 75, 86, 88,
+  88, 91, 88, 76, 86, 80, 83, 82, 71, 88,
+  80, 84, 97, 73, 79, 76, 85, 85, 82, 83,
+  75, 80, 85, 72, 100, 90, 91, 85, 77, 83,
+  90, 75, 81, 84, 93, 86, 86, 90, 81, 92,
+  91, 100, 96, 85, 64, 77, 86, 97, 77, 104,
+  71, 93, 97, 83, 76, 76, 90, 91, 73, 92,
+  71, 86, 104, 92, 85, 84, 76, 79, 81, 89,
+  86, 114, 94, 87, 78, 73, 89, 89, 83, 88,
+  85, 82, 75, 89, 86, 84, 81, 71, 77, 74,
+  88, 79, 90, 77, 89, 101, 77, 93, 76, 83,
+  116, 82, 75, 79, 78, 77, 56, 102, 96, 81,
+  93, 70, 81, 79, 71, 75, 71, 90, 96, 70,
+  62, 69, 118, 93, 109, 84, 72, 105, 76, 88,
+  91, 72, 87, 86, 80, 86, 66, 82, 83, 86,
+  94, 66, 72, 75, 77, 76, 83, 81, 63, 68,
+  86, 71, 91, 113, 97, 73, 74, 88, 81, 70,
+  89, 84, 93, 83, 84, 93, 89, 95, 84, 98,
+  89, 63, 72, 80, 73, 94, 91, 90, 69, 75,
+  80, 83, 77, 72, 93, 84, 78, 86, 55, 84,
+  93, 89, 89, 82, 73, 78, 75, 90, 82, 101,
+  90, 82, 74, 77, 87, 93, 89, 85, 82, 94,
+  72, 91, 91, 83, 82, 72, 78, 76, 84, 79,
+  92, 88, 85, 105, 68, 88, 71, 86, 115, 81,
+  74, 78, 75, 75, 54, 102, 93, 77, 96, 70,
+  80, 78, 74, 80, 71, 81, 88, 65, 67, 76,
+  126, 91, 112, 83, 73, 95, 73, 89, 92, 70,
+  82, 86, 77, 77, 63, 76, 87, 84, 103, 72,
+  77, 76, 68, 77, 74, 77, 68, 65, 74, 64,
+  88, 104, 99, 60, 75, 91, 80, 67, 91, 85,
+  96, 82, 81, 92, 89, 87, 80, 99, 87, 62,
+  73, 78, 73, 95, 87, 90, 74, 65, 79, 77,
+  77, 73, 102, 78, 70, 85, 58, 90, 97, 93,
+  86, 83, 74, 79, 74, 86, 86, 98, 88, 87,
+  55, 79, 80, 93, 89, 87, 85, 96, 76, 83,
+  81, 89, 78, 78, 74, 76, 85, 80, 82, 96,
+  87, 99, 81, 87, 77, 87, 92, 82, 80, 80,
+  78, 78, 66, 96, 89, 75, 89, 72, 77, 75,
+  83, 86, 72, 88, 79, 72, 70, 72, 111, 90,
+  103, 79, 76, 86, 80, 88, 91, 82, 83, 85,
+  84, 76, 71, 90, 80, 84, 95, 73, 78, 70,
+  80, 80, 85, 80, 72, 75, 77, 74, 87, 95,
+  94, 82, 79, 89, 82, 72, 88, 81, 92, 88,
+  85, 86, 90, 92, 82, 92, 88, 70, 72, 80,
+  83, 92, 90, 94, 73, 85, 82, 87, 78, 73,
+  92, 88, 71, 84, 61, 82, 97, 90, 84, 86,
+  85, 85, 91, 87, 87, 100, 82, 84, 70, 78,
+  86, 90, 89, 87, 80, 76, 84, 85, 78, 83,
+  78, 78, 80, 73, 90, 94, 92, 88, 95, 96,
+  81, 86, 81, 85, 120, 84, 75, 81, 83, 74,
+  79, 88, 88, 74, 93, 73, 76, 83, 75, 86,
+  82, 78, 92, 76, 68, 73, 121, 94, 109, 92,
+  77, 101, 72, 85, 92, 71, 90, 88, 87, 100,
+  78, 77, 83, 89, 94, 71, 71, 79, 84, 73,
+  86, 83, 67, 79, 93, 86, 92, 121, 90, 78,
+  81, 89, 82, 77, 88, 87, 101, 80, 81, 91,
+  92, 92, 85, 97, 79, 72, 70, 76, 78, 104,
+  93, 86, 79, 86, 74, 96, 78, 75, 90, 102,
+  80, 80, 52, 83, 98, 85, 88, 89, 85, 81,
+  75, 91, 89, 98, 94, 82, 74, 80, 83, 87,
+  86, 76, 78, 84, 78, 87, 79, 81, 81, 76,
+  80, 77, 91, 86, 95, 95, 98, 96, 77, 82,
+  81, 83, 120, 86, 73, 84, 84, 73, 80, 91,
+  80, 75, 96, 76, 72, 83, 74, 84, 81, 71,
+  90, 75, 64, 77, 126, 90, 107, 99, 78, 98,
+  69, 84, 94, 72, 83, 84, 80, 90, 74, 76,
+  85, 89, 103, 71, 75, 81, 77, 72, 85, 83,
+  67, 78, 83, 81, 90, 120, 94, 69, 82, 89,
+  81, 79, 88, 86, 100, 87, 80, 92, 90, 85,
+  83, 94, 83, 69, 69, 75, 73, 96, 85, 88,
+  88, 77, 73, 87, 81, 77, 101, 98, 70, 81,
+  50, 86, 99, 88, 81, 84, 88, 85, 84, 88,
+  96, 96, 91, 82, 59, 82, 80, 84, 86, 83,
+  77, 90, 79, 83, 76, 86, 74, 80, 82, 78,
+  87, 93, 87, 92, 90, 96, 88, 83, 83, 80,
+  101, 79, 81, 83, 85, 77, 83, 82, 80, 82,
+  86, 78, 79, 83, 81, 85, 81, 81, 83, 77,
+  65, 72, 108, 91, 103, 87, 79, 87, 75, 89,
+  90, 79, 87, 85, 88, 86, 80, 87, 80, 87,
+  97, 74, 82, 73, 80, 75, 89, 83, 72, 90,
+  77, 84, 88, 107, 90, 85, 83, 90, 79, 77,
+  90, 83, 94, 93, 80, 85, 94, 93, 85, 96,
+  80, 72, 72, 81, 84, 99, 89, 87, 83, 89,
+  78, 85, 76, 75, 89, 96, 78, 81, 58, 84,
+  98, 84, 84, 88, 96, 87, 98, 92, 94, 95,
+  80, 83, 74, 83, 83, 81, 86, 79, 87, 89,
+  66, 77, 75, 94, 93, 76, 85, 90, 75, 78,
+  87, 86, 86, 87, 80, 86, 65, 80, 104, 78,
+  95, 107, 69, 94, 80, 85, 89, 81, 89, 77,
+  84, 82, 80, 83, 83, 92, 97, 84, 93, 103,
+  71, 87, 116, 84, 61, 88, 82, 92, 79, 76,
+  86, 75, 78, 79, 99, 91, 86, 76, 83, 85,
+  97, 89, 89, 96, 77, 84, 72, 87, 85, 83,
+  101, 94, 82, 89, 87, 92, 79, 82, 94, 83,
+  81, 94, 79, 80, 77, 79, 93, 83, 76, 88,
+  99, 76, 82, 93, 62, 80, 84, 91, 90, 85,
+  74, 82, 87, 90, 89, 87, 69, 94, 93, 91,
+  87, 73, 80, 92, 70, 94, 89, 96, 90, 88,
+  73, 84, 85, 84, 91, 90, 86, 90, 67, 77,
+  83, 63, 83, 91, 85, 87, 87, 78, 77, 85,
+  90, 80, 86, 83, 84, 81, 103, 78, 94, 99,
+  76, 92, 83, 85, 74, 89, 91, 73, 73, 83,
+  80, 78, 86, 83, 97, 84, 82, 82, 38, 79,
+  89, 78, 72, 88, 92, 90, 79, 82, 82, 86,
+  77, 76, 81, 92, 66, 88, 92, 87, 85, 104,
+  74, 96, 81, 82, 93, 69, 68, 81, 85, 80,
+  84, 75, 90, 87, 82, 86, 88, 90, 81, 92,
+  83, 92, 76, 82, 88, 84, 80, 74, 77, 80,
+  84, 73, 81, 88, 85, 88, 79, 79, 83, 85,
+  86, 88, 82, 84, 80, 90, 91, 84, 86, 71,
+  83, 78, 79, 88, 84, 82, 87, 88, 70, 84,
+  78, 90, 92, 89, 84, 93, 83, 81, 91, 70,
+  72, 106, 81, 84, 94, 85, 72, 93, 79, 76,
+  86, 92, 100, 89, 77, 68, 89, 91, 86, 78,
+  91, 87, 81, 80, 92, 83, 64, 79, 99, 100,
+  86, 72, 95, 73, 78, 64, 40, 76, 59, 77,
+  107, 83, 88, 91, 75, 87, 82, 104, 81, 81,
+  75, 94, 68, 95, 98, 88, 84, 87, 75, 80,
+  80, 77, 119, 80, 76, 73, 71, 73, 91, 73,
+  91, 99, 97, 79, 88, 89, 89, 90, 94, 95,
+  78, 94, 86, 77, 89, 76, 61, 79, 92, 63,
+  101, 87, 89, 83, 81, 77, 86, 81, 85, 89,
+  89, 79, 84, 83, 69, 89, 79, 81, 88, 81,
+  91, 79, 73, 69, 88, 92, 76, 84, 81, 98,
+  85, 81, 80, 79, 82, 82, 80, 89, 87, 94,
+  73, 87, 90, 80, 82, 90, 81, 88, 87, 96,
+  84, 75, 81, 72, 83, 88, 79, 96, 82, 95,
+  87, 88, 91, 82, 77, 68, 72, 87, 88, 83,
+  99, 76, 87, 89, 98, 80, 114, 78, 51, 77,
+  88, 86, 78, 79, 83, 90, 72, 75, 84, 77,
+  64, 74, 78, 84, 95, 78, 75, 90, 78, 86,
+  61, 75, 76, 72, 93, 103, 71, 78, 84, 99,
+  72, 91, 93, 77, 81, 96, 83, 79, 85, 83,
+  82, 81, 79, 80, 66, 83, 82, 92, 89, 92,
+  59, 95, 88, 82, 86, 85, 82, 75, 81, 94,
+  83, 88, 108, 89, 89, 80, 83, 92, 81, 84,
+  76, 92, 90, 89, 73, 89, 76, 84, 92, 92,
+  80, 77, 109, 80, 80, 78, 81, 91, 77, 87,
+  89, 83, 71, 89, 88, 80, 89, 76, 82, 74,
+  72, 85, 80, 91, 98, 86, 75, 86, 88, 90,
+  87, 92, 78, 72, 75, 89, 88, 76, 93, 69,
+  88, 75, 71, 83, 86, 84, 84, 77, 91, 84,
+  85, 79, 85, 91, 88, 72, 81, 72, 82, 85,
+  85, 90, 91, 80, 66, 82, 94, 83, 86, 66,
+  62, 81, 76, 79, 80, 80, 81, 95, 59, 85,
+  88, 86, 80, 91, 84, 92, 76, 81, 77, 83,
+  77, 66, 67, 77, 81, 71, 88, 88, 59, 88,
+  71, 69, 89, 83, 82, 95, 85, 89, 82, 81,
+  86, 74, 79, 81, 88, 90, 86, 83, 78, 76,
+  87, 82, 82, 81, 81, 86, 89, 82, 83, 83,
+  109, 83, 85, 85, 80, 83, 87, 83, 78, 80,
+  78, 93, 91, 80, 88, 82, 75, 86, 64, 87,
+  77, 94, 102, 66, 84, 80, 94, 78, 83, 93,
+  86, 80, 88, 90, 87, 77, 88, 69, 81, 74,
+  59, 86, 64, 87, 129, 85, 84, 92, 78, 86,
+  88, 86, 95, 87, 84, 85, 113, 89, 90, 94,
+  83, 81, 68, 79, 89, 76, 122, 69, 72, 84,
+  68, 68, 100, 82, 76, 87, 81, 75, 88, 92,
+  88, 81, 88, 92, 72, 87, 89, 82, 88, 80,
+  87, 73, 81, 67, 84, 92, 90, 80, 81, 76,
+  81, 79, 101, 104, 94, 83, 80, 80, 58, 81,
+  71, 80, 88, 86, 78, 88, 84, 66, 96, 86,
+  88, 74, 98, 90, 76, 76, 80, 80, 99, 83,
+  92, 90, 79, 98, 72, 83, 104, 85, 85, 88,
+  74, 82, 96, 101, 99, 76, 68, 69, 82, 82,
+  87, 90, 81, 95, 86, 78, 89, 91, 71, 75,
+  71, 95, 94, 74, 96, 81, 84, 77, 91, 76,
+  89, 74, 67, 80, 88, 84, 79, 82, 82, 106,
+  80, 85, 78, 75, 63, 84, 95, 83, 82, 70,
+  77, 80, 81, 77, 73, 80, 74, 74, 81, 86,
+  77, 76, 77, 101, 82, 96, 93, 78, 81, 84,
+  91, 86, 90, 91, 76, 75, 77, 86, 58, 84,
+  84, 86, 112, 98, 56, 89, 85, 92, 87, 83,
+  86, 73, 78, 90, 78, 81, 94, 83, 82, 85,
+  83, 84, 80, 79, 77, 75, 82, 91, 75, 86,
+  71, 98, 89, 94, 79, 71, 115, 81, 88, 98,
+  80, 84, 79, 87, 87, 89, 88, 91, 79, 83,
+  90, 87, 83, 73, 67, 98, 72, 83, 103, 82,
+  84, 81, 93, 74, 82, 99, 80, 78, 71, 100,
+  88, 74, 91, 77, 90, 84, 115, 88, 76, 90,
+  84, 75, 86, 85, 82, 86, 87, 91, 97, 89,
+  87, 71, 99, 75, 85, 93, 86, 65, 72, 72,
+  89, 75, 78, 81, 78, 77, 76, 79, 71, 81,
+  80, 102, 77, 86, 91, 77, 94, 79, 90, 88,
+  81, 86, 76, 80, 84, 72, 81, 76, 75, 80,
+  92, 87, 56, 83, 77, 82, 82, 82, 87, 84,
+  92, 90, 78, 76, 73, 79, 76, 92, 84, 87,
+  85, 85, 81, 80, 78, 84, 87, 76, 88, 88,
+  82, 80, 82, 77, 100, 83, 82, 97, 91, 73,
+  86, 91, 72, 87, 91, 90, 85, 84, 91, 81,
+  60, 82, 80, 89, 63, 92, 105, 68, 82, 74,
+  101, 79, 80, 94, 90, 81, 82, 89, 78, 89,
+  84, 81, 80, 84, 104, 99, 69, 99, 109, 77,
+  81, 98, 82, 76, 87, 69, 99, 91, 98, 83,
+  133, 76, 74, 101, 86, 72, 73, 77, 91, 83,
+  94, 82, 84, 89, 85, 80, 77, 90, 74, 91,
+  86, 79, 92, 84, 102, 82, 82, 91, 71, 82,
+  82, 86, 87, 80, 98, 73, 73, 79, 76, 90,
+  86, 88, 78, 82, 77, 85, 99, 89, 92, 85,
+  76, 80, 59, 83, 86, 86, 90, 92, 77, 99,
+  83, 85, 93, 82, 93, 75, 104, 81, 78, 73,
+  76, 71, 84, 83, 78, 85, 69, 94, 82, 83,
+  77, 92, 97, 91, 73, 65, 84, 94, 79, 99,
+  88, 94, 74, 82, 85, 74, 81, 76, 95, 99,
+  85, 76, 91, 65, 97, 80, 76, 79, 69, 77,
+  91, 64, 94, 62, 88, 92, 80, 80, 87, 82,
+  82, 76, 85, 77, 83, 99, 74, 97, 73, 74,
+  92, 76, 83, 85, 75, 85, 79, 90, 85, 83,
+  87, 92, 93, 94, 76, 94, 72, 78, 83, 75,
+  71, 85, 83, 81, 98, 74, 81, 74, 66, 79,
+  78, 77, 81, 95, 91, 90, 83, 84, 89, 75,
+  93, 87, 101, 97, 82, 85, 82, 91, 88, 89,
+  72, 80, 87, 77, 100, 74, 90, 74, 89, 83,
+  76, 98, 94, 78, 97, 87, 84, 66, 82, 81,
+  89, 81, 74, 81, 73, 98, 82, 86, 74, 91,
+  87, 77, 80, 59, 82, 98, 81, 92, 83, 92,
+  89, 83, 83, 64, 82, 78, 98, 96, 84, 81,
+  97, 58, 106, 66, 82, 84, 77, 67, 91, 61,
+  91, 64, 82, 87, 84, 82, 77, 85, 92, 75,
+  86, 74, 87, 90, 77, 86, 75, 68, 88, 81,
+  84, 78, 81, 83, 84, 85, 84, 86, 91, 86,
+  104, 94, 80, 88, 73, 76, 92, 72, 77, 86,
+  80, 96, 92, 69, 77, 83, 75, 78, 71, 83,
+  86, 88, 90, 87, 84, 72, 93, 77, 90, 71,
+  99, 93, 80, 87, 82, 94, 87, 94, 83, 86,
+  86, 80, 110, 84, 81, 75, 87, 81, 79, 95,
+  94, 80, 89, 85, 85, 73, 86, 88, 90, 83,
+  69, 81, 69, 93, 90, 79, 75, 86, 79, 72,
+  76, 70, 81, 92, 80, 94, 86, 93, 84, 85,
+  84, 76, 79, 74, 90, 76, 92, 79, 89, 72,
+  94, 73, 74, 77, 92, 82, 89, 66, 92, 70,
+  89, 93, 80, 85, 92, 85, 77, 79, 87, 81,
+  87, 73, 65, 92, 74, 77, 83, 78, 85, 79,
+  71, 89, 79, 85, 88, 82, 78, 94, 94, 86,
+  76, 90, 73, 74, 93, 79, 71, 92, 89, 80,
+  95, 78, 80, 85, 69, 75, 83, 77, 75, 95,
+  92, 89, 82, 89, 85, 87, 86, 82, 99, 93,
+  80, 87, 81, 78, 84, 91, 89, 77, 87, 84,
+  110, 81, 87, 74, 84, 85, 79, 95, 90, 80,
+  91, 79, 79, 72, 68, 71, 81, 77, 105, 87,
+  70, 75, 59, 84, 106, 75, 93, 64, 76, 69,
+  87, 77, 90, 144, 88, 87, 86, 75, 85, 59,
+  75, 82, 104, 92, 106, 74, 90, 99, 95, 57,
+  48, 81, 69, 64, 83, 80, 91, 77, 77, 73,
+  89, 79, 69, 72, 86, 73, 66, 74, 56, 113,
+  88, 134, 61, 91, 83, 74, 75, 74, 78, 64,
+  87, 72, 88, 80, 112, 87, 77, 89, 76, 86,
+  70, 81, 79, 78, 64, 64, 77, 79, 131, 81,
+  86, 83, 65, 85, 61, 80, 79, 76, 87, 83,
+  85, 74, 88, 76, 73, 93, 98, 102, 81, 83,
+  89, 138, 89, 76, 87, 97, 82, 76, 161, 67,
+  87, 77, 96, 75, 74, 99, 69, 64, 89, 80,
+  90, 67, 70, 98, 85, 73, 111, 82, 77, 72,
+  65, 85, 114, 78, 106, 65, 80, 78, 98, 77,
+  93, 162, 80, 87, 77, 78, 85, 56, 64, 78,
+  98, 76, 120, 78, 83, 84, 83, 55, 48, 78,
+  65, 58, 86, 96, 89, 96, 83, 67, 87, 74,
+  60, 62, 92, 67, 68, 79, 49, 124, 90, 150,
+  48, 76, 76, 71, 76, 79, 67, 70, 91, 76,
+  89, 72, 99, 81, 72, 78, 87, 72, 66, 69,
+  80, 84, 78, 69, 69, 51, 169, 83, 74, 90,
+  69, 80, 57, 72, 66, 70, 70, 97, 82, 68,
+  87, 79, 59, 79, 98, 98, 78, 77, 86, 147,
+  97, 69, 90, 94, 80, 75, 168, 66, 77, 72,
+  97, 71, 73, 99, 65, 60, 99, 77, 95, 51,
+  75, 100, 94, 81, 75, 99, 66, 80, 71, 82,
+  94, 75, 85, 82, 81, 74, 82, 80, 85, 140,
+  81, 90, 78, 83, 83, 68, 85, 86, 97, 84,
+  98, 79, 96, 69, 96, 76, 75, 81, 71, 72,
+  78, 79, 90, 66, 78, 76, 89, 95, 78, 87,
+  76, 86, 63, 77, 74, 92, 81, 106, 75, 90,
+  82, 76, 75, 61, 70, 72, 88, 79, 81, 91,
+  87, 96, 91, 85, 85, 92, 80, 78, 81, 78,
+  61, 69, 83, 60, 99, 90, 75, 87, 69, 83,
+  75, 88, 85, 82, 76, 78, 88, 76, 86, 83,
+  79, 85, 96, 100, 82, 84, 87, 109, 79, 90,
+  82, 85, 84, 87, 111, 84, 99, 75, 90, 85,
+  92, 105, 73, 68, 75, 79, 83, 88, 74, 81,
+  77, 84, 64, 89, 81, 83, 87, 86, 76, 99,
+  90, 76, 78, 87, 74, 83, 85, 96, 93, 91,
+  78, 99, 96, 64, 94, 82, 93, 87, 80, 88,
+  93, 91, 86, 85, 60, 87, 91, 77, 77, 61,
+  94, 64, 77, 99, 79, 91, 86, 90, 80, 80,
+  93, 89, 86, 79, 87, 78, 95, 81, 91, 85,
+  90, 81, 86, 74, 80, 76, 81, 78, 88, 83,
+  87, 78, 71, 87, 86, 82, 78, 73, 72, 88,
+  90, 75, 91, 86, 87, 78, 81, 98, 88, 84,
+  87, 82, 98, 74, 75, 80, 84, 91, 78, 95,
+  90, 91, 87, 82, 84, 82, 69, 94, 99, 79,
+  92, 91, 109, 92, 92, 82, 90, 77, 90, 89,
+  91, 76, 85, 94, 80, 67, 73, 93, 74, 82,
+  66, 82, 82, 79, 91, 89, 80, 98, 101, 93,
+  77, 90, 76, 86, 81, 94, 93, 88, 88, 102,
+  89, 57, 94, 84, 89, 88, 75, 85, 99, 91,
+  86, 76, 67, 83, 77, 67, 79, 57, 98, 68,
+  78, 86, 77, 84, 82, 89, 83, 89, 92, 85,
+  83, 95, 89, 80, 94, 78, 92, 86, 93, 75,
+  89, 75, 91, 76, 76, 90, 97, 77, 82, 76,
+  71, 83, 87, 79, 77, 70, 78, 84, 87, 84,
+  87, 90, 83, 76, 84, 101, 90, 80, 84, 74,
+  97, 69, 79, 71, 85, 93, 88, 95, 89, 88,
+  84, 93, 83, 94, 74, 94, 89, 83, 93, 81,
+  82, 94, 93, 78, 89, 83, 94, 90, 87, 73,
+  85, 92, 80, 72, 73, 92, 73, 84, 75, 79,
+  78, 81, 91, 85, 81, 94, 93, 97, 76, 90,
+  69, 80, 82, 98, 84, 94, 88, 95, 88, 71,
+  93, 82, 84, 86, 79, 85, 86, 86, 81, 87,
+  77, 85, 72, 84, 81, 63, 90, 73, 83, 83,
+  78, 84, 92, 87, 75, 86, 86, 96, 90, 89,
+  84, 85, 89, 83, 91, 89, 92, 77, 83, 84,
+  85, 86, 81, 80, 86, 89, 83, 77, 79, 86,
+  87, 74, 77, 74, 71, 82, 89, 75, 96, 91,
+  82, 71, 77, 95, 89, 80, 82, 81, 85, 70,
+  80, 84, 83, 94, 77, 82, 95, 90, 83, 83,
+  84, 81, 72, 91, 82, 77, 95, 80, 77, 88,
+  95, 77, 92, 82, 85, 93, 89, 76, 89, 91,
+  79, 73, 97, 78, 73, 89, 91, 86, 84, 87,
+  78, 86, 98, 82, 82, 96, 64, 68, 82, 83,
+  100, 76, 85, 84, 81, 83, 91, 70, 85, 107,
+  89, 79, 86, 79, 79, 70, 82, 93, 74, 69,
+  90, 73, 81, 81, 82, 75, 91, 97, 82, 75,
+  105, 86, 111, 72, 82, 81, 95, 81, 82, 72,
+  88, 72, 92, 81, 84, 85, 90, 106, 70, 83,
+  96, 82, 75, 76, 85, 73, 84, 88, 76, 93,
+  90, 95, 106, 80, 70, 81, 72, 81, 85, 75,
+  87, 98, 73, 74, 74, 72, 78, 90, 57, 95,
+  95, 85, 89, 78, 71, 77, 88, 96, 86, 68,
+  89, 95, 74, 80, 129, 84, 78, 103, 94, 87,
+  74, 71, 117, 79, 76, 110, 93, 91, 99, 83,
+  108, 91, 72, 91, 96, 73, 88, 81, 75, 84,
+  102, 74, 85, 94, 70, 71, 90, 80, 98, 71,
+  85, 83, 75, 91, 93, 73, 81, 106, 86, 82,
+  91, 85, 75, 63, 82, 81, 71, 69, 94, 61,
+  84, 86, 84, 77, 98, 100, 81, 73, 108, 81,
+  105, 76, 88, 79, 99, 84, 91, 73, 84, 65,
+  95, 84, 83, 84, 82, 111, 69, 84, 99, 75,
+  74, 76, 79, 72, 86, 86, 72, 80, 98, 96,
+  107, 82, 68, 86, 78, 73, 72, 70, 93, 113,
+  73, 68, 68, 78, 74, 96, 57, 95, 92, 82,
+  86, 83, 70, 77, 84, 104, 79, 67, 99, 90,
+  77, 79, 132, 75, 79, 106, 81, 93, 68, 70,
+  94, 79, 75, 108, 93, 86, 103, 80, 91, 92,
+  78, 94, 89, 81, 84, 82, 79, 85, 95, 86,
+  83, 87, 64, 73, 82, 83, 101, 77, 79, 86,
+  87, 81, 85, 71, 81, 105, 86, 84, 89, 86,
+  80, 77, 82, 93, 77, 68, 88, 77, 82, 81,
+  82, 79, 88, 100, 86, 90, 102, 86, 101, 72,
+  82, 81, 91, 84, 84, 68, 94, 71, 96, 84,
+  82, 81, 93, 104, 68, 90, 96, 79, 77, 74,
+  81, 72, 90, 86, 81, 75, 99, 92, 104, 79,
+  74, 102, 74, 76, 88, 80, 84, 104, 72, 74,
+  76, 74, 79, 90, 58, 92, 83, 82, 89, 89,
+  71, 77, 86, 89, 85, 71, 87, 92, 85, 79,
+  127, 94, 72, 96, 81, 90, 73, 74, 78, 80,
+  76, 105, 91, 85, 97, 86, 94, 79, 73, 84,
+  77, 87, 88, 93, 81, 80, 96, 77, 83, 91,
+  64, 71, 91, 84, 104, 75, 87, 82, 83, 83,
+  86, 74, 89, 97, 92, 80, 88, 81, 89, 76,
+  87, 90, 78, 69, 86, 70, 94, 86, 86, 80,
+  82, 94, 84, 77, 103, 85, 113, 77, 86, 82,
+  94, 88, 88, 64, 87, 70, 86, 83, 87, 88,
+  81, 104, 69, 78, 96, 75, 82, 77, 95, 78,
+  83, 78, 74, 87, 78, 107, 101, 83, 72, 77,
+  77, 87, 83, 73, 86, 81, 78, 76, 77, 72,
+  79, 100, 61, 93, 92, 97, 85, 81, 66, 78,
+  75, 80, 83, 73, 89, 97, 86, 88, 121, 73,
+  80, 96, 87, 92, 76, 80, 101, 81, 80, 113,
+  87, 75, 99, 89, 108, 88, 76, 82, 83, 77,
+  94, 86, 76, 76, 94, 73, 85, 89, 64, 68,
+  102, 79, 102, 70, 87, 84, 77, 87, 88, 77,
+  86, 91, 94, 88, 93, 83, 82, 72, 87, 82,
+  78, 68, 100, 62, 98, 94, 87, 83, 88, 97,
+  80, 73, 107, 78, 107, 82, 94, 82, 97, 92,
+  97, 64, 83, 62, 92, 88, 88, 86, 72, 111,
+  73, 73, 102, 76, 77, 75, 90, 74, 81, 68,
+  72, 82, 74, 114, 101, 88, 73, 76, 87, 88,
+  68, 69, 92, 82, 76, 67, 63, 77, 72, 109,
+  63, 93, 87, 96, 77, 77, 69, 79, 66, 87,
+  77, 72, 88, 91, 92, 89, 122, 66, 87, 98,
+  83, 93, 68, 84, 73, 81, 73, 108, 88, 68,
+  100, 85, 87, 90, 86, 89, 78, 83, 89, 87,
+  81, 83, 92, 78, 83, 82, 62, 74, 84, 81,
+  103, 73, 79, 81, 88, 81, 82, 76, 85, 100,
+  86, 95, 89, 88, 89, 79, 85, 93, 81, 68,
+  93, 76, 88, 84, 81, 82, 83, 97, 85, 82,
+  104, 88, 102, 77, 81, 80, 90, 79, 85, 67,
+  88, 74, 90, 77, 85, 82, 83, 102, 77, 82,
+  96, 81, 74, 79, 87, 79, 87, 79, 79, 81,
+  77, 101, 98, 83, 76, 99, 78, 88, 78, 78,
+  84, 91, 78, 72, 79, 78, 75, 96, 63, 89,
+  80, 94, 86, 77, 69, 79, 76, 77, 78, 74,
+  92, 95, 95, 86, 121, 87, 75, 91, 85, 93,
+  75, 83, 69, 87, 79, 108, 89, 77, 97, 92,
+  93, 77, 66, 91, 77, 84, 84, 97, 87, 78,
+  89, 78, 85, 86, 69, 74, 84, 81, 94, 81,
+  82, 92, 78, 80, 82, 80, 93, 89, 89, 83,
+  80, 78, 92, 71, 85, 86, 86, 81, 88, 66,
+  94, 90, 76, 84, 79, 91, 90, 83, 92, 93,
+  91, 77, 87, 82, 98, 84, 91, 62, 92, 71,
+  79, 81, 91, 87, 88, 99, 70, 84, 83, 87,
+  96, 73, 97, 78, 85, 80, 77, 92, 88, 85,
+  91, 65, 78, 75, 78, 80, 87, 87, 88, 71,
+  84, 89, 82, 81, 81, 78, 67, 76, 87, 89,
+  97, 85, 77, 79, 82, 77, 88, 83, 82, 90,
+  86, 89, 110, 80, 83, 94, 83, 85, 77, 73,
+  93, 76, 85, 109, 88, 77, 95, 83, 99, 79,
+  78, 87, 76, 79, 87, 94, 90, 77, 87, 81,
+  82, 90, 69, 74, 98, 83, 93, 75, 79, 89,
+  82, 81, 80, 79, 91, 85, 92, 85, 80, 81,
+  92, 69, 82, 81, 78, 75, 93, 58, 100, 90,
+  84, 83, 80, 91, 87, 77, 87, 91, 93, 75,
+  95, 81, 97, 80, 102, 62, 92, 65, 81, 87,
+  89, 83, 76, 98, 71, 78, 82, 83, 77, 68,
+  99, 75, 79, 76, 80, 86, 85, 89, 91, 69,
+  84, 83, 83, 81, 77, 81, 94, 75, 96, 85,
+  77, 85, 73, 78, 71, 80, 82, 88, 90, 74,
+  77, 81, 76, 81, 91, 79, 80, 90, 85, 89,
+  109, 75, 85, 94, 81, 82, 70, 75, 75, 80,
+  85, 105, 89, 74, 95, 78, 87, 80, 90, 90,
+  81, 78, 87, 89, 87, 84, 84, 80, 82, 86,
+  70, 77, 79, 78, 90, 72, 72, 94, 88, 82,
+  76, 80, 88, 92, 85, 93, 81, 81, 91, 79,
+  79, 92, 83, 79, 88, 73, 94, 92, 83, 82,
+  80, 91, 89, 80, 91, 96, 88, 79, 85, 83,
+  93, 77, 87, 66, 91, 72, 82, 85, 85, 88,
+  87, 96, 77, 83, 84, 94, 72, 74, 92, 83,
+  85, 80, 81, 79, 79, 86, 91, 68, 85, 102,
+  81, 83, 82, 87, 88, 80, 84, 81, 82, 80,
+  69, 81, 66, 74, 78, 87, 98, 79, 75, 80,
+  86, 79, 84, 81, 85, 91, 91, 88, 109, 88,
+  79, 92, 81, 85, 80, 77, 66, 76, 85, 101,
+  90, 81, 93, 84, 75, 66, 87, 71, 71, 71,
+  83, 83, 94, 95, 79, 71, 82, 67, 61, 72,
+  79, 116, 75, 72, 81, 85, 90, 86, 72, 78,
+  95, 88, 110, 72, 94, 78, 87, 72, 59, 80,
+  61, 81, 90, 82, 81, 85, 76, 71, 88, 74,
+  78, 80, 97, 87, 84, 62, 77, 77, 88, 66,
+  82, 63, 73, 78, 96, 90, 87, 97, 49, 74,
+  106, 125, 76, 124, 78, 81, 110, 73, 93, 79,
+  81, 57, 79, 68, 78, 62, 88, 109, 93, 86,
+  82, 94, 53, 101, 95, 91, 85, 84, 90, 82,
+  77, 84, 96, 65, 87, 85, 100, 98, 78, 106,
+  74, 82, 75, 86, 73, 149, 86, 84, 98, 105,
+  94, 76, 105, 78, 81, 66, 72, 76, 67, 84,
+  78, 77, 70, 74, 81, 71, 71, 85, 80, 87,
+  93, 100, 75, 89, 68, 79, 63, 71, 90, 119,
+  74, 77, 80, 85, 65, 84, 69, 77, 101, 88,
+  108, 65, 86, 82, 94, 74, 65, 92, 65, 80,
+  59, 68, 83, 74, 82, 76, 89, 74, 71, 88,
+  91, 87, 81, 61, 79, 77, 91, 61, 82, 59,
+  65, 74, 98, 88, 78, 96, 54, 69, 92, 136,
+  80, 109, 75, 70, 112, 75, 95, 72, 82, 62,
+  86, 59, 83, 60, 88, 75, 89, 80, 84, 94,
+  50, 100, 91, 122, 78, 83, 107, 86, 79, 82,
+  85, 66, 91, 126, 101, 97, 88, 109, 67, 79,
+  73, 83, 76, 151, 90, 82, 91, 88, 71, 73,
+  98, 71, 70, 66, 73, 72, 64, 85, 76, 74,
+  91, 81, 96, 72, 82, 82, 67, 104, 85, 92,
+  80, 84, 85, 88, 57, 81, 94, 100, 79, 77,
+  92, 87, 69, 78, 73, 82, 98, 83, 105, 71,
+  84, 84, 112, 77, 70, 90, 72, 88, 83, 96,
+  85, 76, 75, 77, 88, 97, 80, 85, 89, 90,
+  92, 92, 79, 75, 102, 78, 92, 62, 90, 71,
+  81, 93, 83, 75, 45, 88, 81, 105, 83, 74,
+  67, 74, 127, 81, 76, 81, 75, 75, 75, 80,
+  89, 71, 91, 80, 85, 82, 89, 81, 68, 88,
+  100, 118, 82, 88, 109, 83, 71, 82, 93, 78,
+  80, 92, 93, 87, 68, 101, 76, 88, 70, 95,
+  82, 104, 89, 88, 89, 99, 76, 77, 91, 72,
+  87, 77, 90, 88, 74, 75, 90, 98, 80, 80,
+  91, 88, 86, 80, 97, 76, 78, 85, 86, 75,
+  90, 77, 82, 75, 70, 80, 76, 74, 88, 85,
+  81, 87, 80, 79, 82, 91, 91, 84, 95, 79,
+  76, 98, 73, 85, 73, 79, 92, 91, 78, 76,
+  74, 85, 77, 75, 86, 83, 82, 77, 79, 86,
+  75, 91, 78, 87, 65, 82, 81, 82, 93, 79,
+  92, 95, 87, 61, 73, 69, 82, 108, 77, 97,
+  76, 77, 97, 68, 88, 69, 90, 80, 91, 73,
+  79, 89, 99, 86, 84, 98, 77, 82, 78, 68,
+  84, 88, 72, 69, 87, 99, 86, 84, 80, 75,
+  93, 88, 94, 84, 89, 84, 98, 84, 95, 100,
+  87, 81, 88, 102, 97, 79, 93, 99, 89, 71,
+  91, 82, 81, 88, 77, 72, 79, 95, 76, 87,
+  94, 77, 103, 71, 81, 87, 84, 89, 94, 93,
+  91, 80, 74, 77, 81, 73, 73, 84, 71, 91,
+  82, 82, 82, 99, 90, 61, 105, 73, 75, 99,
+  80, 82, 70, 75, 72, 89, 79, 77, 102, 90,
+  71, 69, 86, 79, 86, 81, 83, 84, 76, 98,
+  80, 94, 58, 86, 79, 89, 94, 73, 77, 95,
+  78, 58, 65, 63, 78, 80, 95, 96, 62, 74,
+  113, 63, 90, 87, 107, 72, 94, 83, 85, 58,
+  99, 85, 83, 91, 72, 94, 70, 76, 75, 94,
+  65, 71, 95, 105, 95, 81, 72, 88, 92, 91,
+  104, 80, 81, 82, 109, 85, 99, 96, 93, 84,
+  81, 90, 72, 81, 94, 93, 71, 66, 92, 77,
+  81, 86, 67, 70, 77, 92, 77, 78, 77, 103,
+  84, 83, 77, 99, 86, 82, 68, 101, 68, 69,
+  86, 88, 78, 90, 86, 79, 68, 82, 82, 81,
+  98, 93, 88, 73, 84, 74, 83, 79, 78, 98,
+  74, 80, 67, 75, 84, 78, 83, 79, 80, 85,
+  82, 97, 82, 78, 80, 75, 69, 78, 91, 72,
+  90, 74, 75, 74, 93, 97, 93, 85, 70, 67,
+  70, 99, 82, 86, 94, 81, 94, 86, 103, 82,
+  88, 88, 100, 77, 82, 66, 79, 63, 95, 77,
+  91, 84, 73, 90, 78, 104, 78, 86, 92, 75,
+  81, 93, 82, 76, 84, 120, 98, 92, 76, 91,
+  74, 76, 86, 81, 88, 114, 84, 86, 89, 88,
+  83, 77, 86, 76, 81, 69, 78, 80, 76, 73,
+  84, 79, 80, 84, 87, 86, 88, 91, 86, 84,
+  67, 85, 88, 90, 91, 80, 90, 72, 75, 82,
+  78, 80, 90, 91, 81, 86, 87, 81, 79, 80,
+  85, 88, 77, 80, 82, 98, 80, 90, 86, 85,
+  88, 93, 81, 66, 77, 86, 83, 77, 86, 79,
+  71, 74, 85, 107, 75, 90, 75, 84, 77, 77,
+  92, 80, 79, 89, 96, 87, 86, 74, 84, 79,
+  87, 85, 81, 91, 85, 76, 87, 71, 94, 83,
+  75, 86, 96, 80, 85, 85, 83, 82, 92, 80,
+  105, 81, 87, 78, 95, 97, 82, 77, 73, 92,
+  76, 92, 87, 78, 82, 75, 75, 85, 93, 89,
+  98, 90, 87, 80, 87, 81, 77, 85, 88, 81,
+  90, 101, 91, 87, 85, 87, 92, 79, 91, 83,
+  78, 89, 91, 86, 90, 81, 87, 79, 76, 81,
+  88, 99, 101, 89, 93, 77, 78, 84, 79, 79,
+  80, 90, 82, 93, 83, 76, 78, 84, 83, 77,
+  81, 83, 86, 92, 78, 86, 90, 92, 83, 96,
+  86, 72, 93, 88, 79, 76, 83, 74, 67, 80,
+  95, 108, 75, 92, 77, 85, 73, 73, 97, 78,
+  77, 86, 88, 86, 84, 74, 79, 76, 89, 82,
+  93, 90, 86, 78, 86, 76, 93, 89, 76, 90,
+  97, 86, 90, 80, 75, 83, 87, 81, 97, 89,
+  84, 77, 94, 96, 75, 74, 80, 98, 89, 99,
+  85, 80, 76, 76, 68, 84, 85, 89, 91, 95,
+  86, 75, 87, 89, 81, 76, 85, 82, 91, 98,
+  86, 83, 85, 84, 90, 76, 87, 84, 83, 108,
+  93, 83, 86, 98, 84, 86, 77, 85, 88, 86,
+  79, 98, 78, 72, 82, 85, 79, 80, 89, 81,
+  80, 87, 86, 85, 81, 85, 77, 72, 83, 83,
+  86, 85, 85, 96, 84, 82, 79, 83, 89, 78,
+  88, 78, 79, 84, 84, 88, 81, 76, 86, 85,
+  71, 82, 85, 86, 86, 82, 77, 76, 86, 91,
+  97, 93, 74, 76, 83, 84, 95, 76, 88, 82,
+  88, 77, 98, 81, 86, 90, 90, 83, 87, 78,
+  80, 70, 80, 79, 87, 80, 90, 88, 82, 80,
+  89, 95, 90, 74, 78, 96, 94, 81, 86, 92,
+  83, 80, 67, 87, 83, 79, 97, 90, 89, 84,
+  87, 91, 80, 81, 97, 80, 86, 82, 82, 77,
+  87, 86, 81, 81, 88, 85, 82, 79, 79, 105,
+  90, 79, 81, 71, 82, 70, 71, 90, 85, 82,
+  81, 80, 87, 93, 60, 81, 86, 81, 99, 77,
+  77, 65, 83, 116, 94, 79, 84, 85, 76, 85,
+  79, 82, 78, 79, 86, 82, 86, 82, 82, 85,
+  89, 75, 83, 94, 81, 82, 82, 78, 82, 94,
+  85, 90, 65, 83, 78, 83, 87, 104, 85, 88,
+  96, 75, 78, 92, 79, 97, 75, 88, 88, 84,
+  82, 77, 85, 86, 80, 82, 69, 83, 72, 93,
+  89, 82, 79, 79, 77, 77, 80, 88, 86, 77,
+  88, 81, 103, 90, 94, 82, 82, 81, 101, 90,
+  89, 92, 75, 105, 95, 80, 78, 81, 76, 77,
+  99, 90, 94, 77, 67, 78, 85, 75, 84, 71,
+  87, 80, 70, 99, 81, 87, 83, 114, 100, 92,
+  84, 63, 88, 60, 68, 82, 87, 82, 89, 87,
+  90, 94, 55, 83, 86, 74, 87, 79, 86, 65,
+  80, 129, 97, 85, 85, 95, 78, 83, 83, 84,
+  84, 69, 84, 84, 90, 85, 87, 89, 94, 74,
+  84, 83, 81, 83, 84, 76, 79, 96, 90, 85,
+  64, 79, 77, 80, 87, 98, 86, 81, 86, 67,
+  72, 89, 74, 97, 82, 90, 81, 85, 84, 75,
+  81, 87, 80, 90, 70, 80, 78, 77, 91, 81,
+  80, 83, 76, 88, 75, 87, 86, 80, 80, 90,
+  107, 89, 89, 81, 76, 87, 97, 90, 85, 90,
+  77, 110, 100, 85, 79, 89, 77, 75, 99, 88,
+  77, 72, 58, 83, 79, 75, 84, 78, 94, 76,
+  60, 102, 83, 92, 87, 103, 84, 95, 81, 72,
+  82, 73, 72, 89, 81, 82, 80, 84, 86, 86,
+  60, 83, 80, 74, 73, 78, 84, 71, 84, 114,
+  91, 77, 86, 91, 76, 77, 76, 91, 84, 81,
+  81, 84, 81, 85, 85, 83, 89, 79, 86, 82,
+  77, 79, 82, 77, 83, 91, 85, 83, 67, 88,
+  76, 84, 90, 101, 86, 90, 96, 75, 77, 90,
+  77, 91, 93, 85, 90, 85, 83, 81, 80, 89,
+  84, 85, 71, 84, 72, 83, 89, 80, 85, 77,
+  82, 86, 80, 96, 83, 78, 76, 80, 102, 92,
+  81, 87, 82, 98, 106, 89, 85, 89, 79, 100,
+  99, 82, 78, 82, 82, 79, 95, 85, 77, 79,
+  68, 78, 78, 74, 77, 74, 89, 79, 68, 95,
+  77, 75, 85, 118, 86, 88, 76, 75, 83, 67,
+  75, 81, 84, 84, 78, 94, 88, 86, 57, 81,
+  85, 77, 98, 77, 82, 66, 75, 132, 97, 89,
+  81, 86, 79, 80, 86, 80, 79, 86, 85, 77,
+  81, 85, 77, 89, 86, 75, 79, 101, 74, 81,
+  73, 84, 79, 94, 89, 93, 62, 93, 76, 84,
+  78, 99, 84, 84, 89, 73, 83, 86, 87, 86,
+  91, 81, 77, 80, 83, 72, 83, 81, 78, 76,
+  75, 95, 66, 80, 89, 80, 76, 85, 81, 71,
+  82, 87, 86, 79, 86, 83, 110, 89, 88, 87,
+  74, 79, 101, 85, 87, 93, 80, 106, 92, 72,
+  86, 86, 83, 83, 93, 87, 85, 80, 64, 81,
+  82, 75, 88, 73, 98, 79, 59, 99, 92, 90,
+  93, 123, 95, 88, 78, 78, 100, 58, 79, 76,
+  103, 80, 84, 105, 91, 82, 53, 80, 81, 68,
+  84, 86, 88, 70, 75, 148, 97, 83, 81, 99,
+  83, 74, 91, 74, 87, 82, 88, 87, 77, 107,
+  84, 86, 92, 66, 81, 86, 73, 83, 83, 85,
+  79, 97, 91, 93, 61, 90, 66, 75, 71, 88,
+  83, 98, 68, 76, 80, 72, 85, 73, 81, 86,
+  70, 87, 79, 70, 82, 90, 74, 93, 77, 100,
+  77, 72, 89, 83, 72, 85, 80, 76, 85, 82,
+  85, 74, 69, 88, 118, 85, 91, 92, 69, 74,
+  89, 82, 77, 92, 82, 112, 100, 79, 92, 82,
+  84, 66, 91, 85, 69, 77, 57, 81, 75, 74,
+  98, 86, 111, 72, 51, 107, 79, 92, 98, 116,
+  81, 98, 76, 74, 80, 71, 74, 83, 78, 81,
+  79, 91, 86, 83, 59, 91, 78, 77, 82, 77,
+  85, 72, 78, 126, 93, 76, 82, 90, 77, 73,
+  86, 89, 85, 86, 82, 80, 79, 85, 83, 84,
+  84, 75, 79, 82, 70, 77, 77, 79, 81, 91,
+  90, 88, 66, 94, 77, 85, 83, 96, 86, 84,
+  92, 73, 82, 87, 85, 90, 89, 81, 83, 81,
+  86, 74, 81, 93, 88, 79, 75, 94, 72, 84,
+  87, 80, 86, 82, 81, 82, 79, 89, 84, 79,
+  78, 83, 107, 90, 87, 91, 75, 88, 102, 85,
+  81, 92, 81, 99, 93, 73, 84, 85, 87, 75,
+  88, 84, 89, 84, 65, 81, 74, 76, 81, 72,
+  98, 80, 61, 92, 73, 75, 86, 121, 83, 82,
+  72, 75, 81, 74, 82, 85, 81, 78, 77, 91,
+  88, 82, 58, 85, 90, 77, 89, 76, 85, 78,
+  73, 114, 92, 82, 86, 89, 80, 88, 84, 84,
+  83, 101, 84, 85, 81, 87, 78, 82, 87, 91,
+  71, 96, 72, 85, 77, 79, 86, 90, 91, 91,
+  72, 87, 88, 78, 80, 89, 81, 83, 97, 82,
+  91, 87, 94, 79, 95, 92, 85, 84, 77, 83,
+  79, 86, 80, 84, 74, 84, 66, 79, 88, 85,
+  75, 75, 77, 76, 94, 83, 82, 83, 93, 75,
+  102, 87, 84, 101, 82, 81, 100, 84, 85, 94,
+  84, 95, 84, 65, 82, 85, 78, 94, 92, 85,
+  81, 87, 73, 94, 77, 74, 80, 66, 88, 84,
+  65, 94, 73, 83, 102, 124, 85, 90, 75, 74,
+  85, 73, 82, 79, 90, 80, 78, 92, 88, 85,
+  50, 89, 83, 67, 87, 79, 85, 83, 71, 130,
+  88, 77, 83, 97, 78, 87, 85, 82, 89, 115,
+  83, 90, 79, 86, 86, 81, 87, 80, 63, 91,
+  74, 84, 79, 81, 86, 91, 86, 90, 69, 73,
+  78, 71, 74, 88, 84, 78, 88, 77, 87, 82,
+  100, 88, 84, 95, 83, 87, 75, 79, 80, 96,
+  73, 94, 76, 83, 63, 78, 88, 85, 76, 82,
+  66, 74, 93, 88, 81, 83, 89, 78, 106, 84,
+  84, 102, 73, 80, 93, 83, 77, 101, 82, 99,
+  76, 67, 82, 83, 77, 79, 90, 88, 82, 91,
+  65, 88, 74, 74, 85, 63, 95, 81, 61, 90,
+  77, 83, 92, 117, 81, 89, 75, 78, 78, 76,
+  80, 88, 81, 84, 77, 86, 89, 83, 60, 86,
+  82, 76, 83, 75, 84, 80, 71, 109, 88, 76,
+  89, 90, 79, 90, 80, 87, 86, 98, 80, 84,
+  80, 83, 90, 82, 86, 84, 71, 88, 67, 83,
+  77, 79, 85, 87, 88, 86, 78, 86, 86, 80,
+  83, 84, 83, 84, 93, 84, 87, 86, 97, 85,
+  77, 87, 88, 85, 79, 84, 83, 95, 80, 81,
+  73, 83, 72, 78, 89, 77, 92, 77, 70, 80,
+  92, 92, 83, 86, 83, 74, 98, 89, 85, 96,
+  84, 81, 101, 85, 75, 91, 84, 88, 83, 70,
+  78, 83, 78, 77, 92, 83, 98, 89, 78, 92,
+  82, 77, 80, 69, 86, 88, 70, 90, 85, 76,
+  95, 78, 81, 92, 73, 91, 73, 81, 83, 83,
+  103, 78, 96, 73, 94, 82, 79, 113, 101, 88,
+  86, 86, 82, 78, 79, 83, 81, 80, 79, 79,
+  98, 67, 65, 86, 71, 74, 70, 97, 88, 80,
+  81, 74, 86, 78, 94, 83, 84, 64, 75, 98,
+  87, 80, 89, 77, 76, 80, 81, 124, 93, 76,
+  98, 89, 95, 88, 95, 81, 83, 87, 68, 87,
+  84, 96, 79, 77, 56, 87, 105, 75, 78, 78,
+  87, 90, 87, 72, 89, 85, 76, 89, 83, 94,
+  76, 87, 78, 75, 78, 70, 89, 83, 53, 46,
+  80, 126, 82, 83, 83, 97, 95, 90, 78, 86,
+  93, 92, 92, 80, 94, 80, 65, 94, 96, 88,
+  78, 82, 60, 98, 81, 80, 82, 77, 70, 76,
+  66, 75, 62, 82, 64, 82, 87, 76, 107, 76,
+  111, 52, 111, 80, 81, 121, 86, 63, 84, 79,
+  78, 75, 86, 82, 105, 80, 68, 81, 105, 70,
+  77, 64, 81, 76, 80, 77, 76, 88, 100, 60,
+  86, 64, 78, 79, 77, 65, 75, 70, 64, 79,
+  76, 83, 73, 72, 73, 139, 91, 75, 81, 91,
+  80, 82, 108, 112, 73, 83, 81, 90, 78, 98,
+  75, 70, 60, 63, 102, 71, 66, 68, 89, 102,
+  94, 68, 80, 87, 52, 69, 89, 110, 80, 89,
+  78, 79, 80, 58, 83, 85, 53, 92, 89, 119,
+  104, 76, 92, 104, 98, 85, 75, 86, 83, 81,
+  77, 85, 69, 88, 75, 77, 99, 104, 74, 69,
+  34, 91, 92, 102, 86, 105, 81, 85, 94, 78,
+  82, 87, 99, 84, 70, 92, 72, 74, 86, 83,
+  90, 92, 82, 76, 88, 87, 84, 91, 86, 81,
+  87, 82, 79, 69, 89, 76, 88, 89, 85, 88,
+  90, 77, 76, 97, 93, 87, 97, 95, 93, 81,
+  101, 95, 82, 71, 76, 103, 108, 85, 119, 89,
+  80, 79, 94, 88, 81, 89, 91, 64, 81, 92,
+  83, 75, 92, 87, 106, 84, 84, 83, 79, 82,
+  67, 85, 103, 83, 110, 71, 85, 85, 83, 77,
+  96, 81, 101, 80, 90, 92, 76, 91, 97, 80,
+  74, 81, 80, 85, 63, 64, 82, 115, 75, 91,
+  80, 91, 84, 94, 77, 79, 98, 88, 67, 81,
+  91, 78, 70, 92, 102, 65, 87, 98, 80, 87,
+  80, 85, 91, 57, 82, 77, 85, 80, 79, 88,
+  63, 84, 99, 69, 97, 62, 96, 77, 83, 72,
+  87, 111, 89, 83, 89, 81, 69, 88, 90, 88,
+  97, 70, 74, 82, 91, 83, 88, 87, 55, 82,
+  76, 86, 81, 83, 96, 69, 84, 78, 97, 86,
+  71, 65, 77, 81, 68, 84, 84, 91, 83, 81,
+  83, 148, 81, 87, 86, 89, 85, 75, 88, 81,
+  86, 63, 95, 107, 94, 84, 81, 81, 66, 86,
+  86, 86, 58, 71, 84, 103, 97, 77, 89, 83,
+  84, 103, 84, 88, 71, 82, 95, 82, 74, 56,
+  83, 79, 54, 87, 82, 120, 75, 79, 77, 100,
+  95, 92, 86, 78, 87, 87, 80, 77, 78, 85,
+  74, 80, 77, 106, 69, 73, 59, 79, 92, 73,
+  82, 76, 79, 78, 70, 72, 67, 76, 46, 88,
+  99, 67, 99, 77, 107, 65, 93, 65, 81, 138,
+  80, 68, 83, 74, 75, 87, 92, 86, 110, 104,
+  65, 86, 86, 77, 83, 75, 79, 95, 72, 69,
+  91, 89, 81, 55, 90, 55, 77, 74, 75, 72,
+  70, 50, 40, 85, 57, 71, 81, 72, 62, 162,
+  95, 81, 78, 97, 68, 67, 92, 102, 80, 64,
+  66, 128, 86, 74, 73, 76, 78, 69, 79, 81,
+  41, 68, 77, 95, 103, 92, 79, 89, 51, 93,
+  79, 90, 84, 75, 90, 85, 75, 44, 84, 85,
+  64, 79, 94, 114, 82, 69, 75, 108, 89, 86,
+  82, 74, 77, 80, 89, 85, 66, 97, 77, 78,
+  104, 120, 52, 63, 27, 70, 100, 94, 85, 107,
+  88, 86, 88, 89, 86, 86, 100, 84, 75, 85,
+  73, 91, 85, 91, 80, 94, 83, 68, 87, 103,
+  87, 85, 75, 78, 95, 87, 88, 74, 85, 81,
+  84, 77, 89, 85, 76, 82, 80, 95, 87, 88,
+  89, 89, 91, 80, 96, 76, 73, 74, 75, 104,
+  96, 83, 120, 74, 79, 72, 93, 91, 81, 90,
+  84, 53, 81, 87, 82, 70, 90, 82, 93, 89,
+  97, 86, 77, 80, 75, 81, 72, 94, 103, 65,
+  87, 90, 79, 83, 90, 83, 101, 76, 92, 84,
+  74, 81, 90, 81, 79, 75, 93, 76, 63, 46,
+  80, 111, 70, 88, 82, 85, 81, 92, 87, 83,
+  91, 88, 75, 95, 101, 78, 76, 88, 101, 73,
+  78, 90, 76, 85, 82, 84, 94, 68, 93, 93,
+  78, 90, 82, 89, 86, 93, 86, 86, 99, 80,
+  94, 88, 81, 87, 86, 80, 97, 78, 82, 92,
+  86, 85, 77, 85, 81, 81, 93, 92, 83, 78,
+  72, 87, 72, 87, 85, 87, 89, 68, 92, 97,
+  80, 97, 89, 93, 72, 89, 80, 101, 97, 93,
+  108, 88, 79, 83, 98, 96, 73, 91, 96, 85,
+  91, 78, 91, 83, 84, 85, 85, 76, 95, 90,
+  87, 82, 84, 83, 80, 74, 90, 94, 87, 82,
+  89, 85, 89, 82, 94, 108, 86, 97, 71, 74,
+  91, 71, 79, 84, 78, 80, 59, 108, 85, 109,
+  87, 89, 91, 78, 83, 89, 86, 77, 96, 83,
+  92, 95, 80, 84, 78, 84, 87, 81, 86, 86,
+  94, 87, 90, 68, 89, 83, 82, 93, 75, 77,
+  78, 79, 90, 88, 86, 84, 103, 95, 97, 90,
+  84, 91, 86, 74, 89, 82, 88, 99, 87, 75,
+  82, 90, 90, 86, 86, 81, 82, 70, 68, 67,
+  74, 84, 84, 84, 82, 72, 85, 88, 73, 101,
+  82, 69, 68, 98, 77, 100, 93, 92, 111, 91,
+  78, 88, 94, 78, 74, 87, 91, 82, 92, 76,
+  80, 71, 77, 93, 71, 69, 87, 87, 79, 79,
+  75, 77, 75, 67, 85, 88, 95, 87, 89, 87,
+  84, 82, 105, 119, 85, 95, 77, 62, 85, 66,
+  81, 73, 94, 83, 66, 101, 78, 105, 81, 96,
+  90, 81, 78, 88, 83, 79, 90, 86, 93, 98,
+  79, 80, 71, 89, 87, 83, 82, 81, 76, 81,
+  90, 78, 88, 101, 83, 90, 83, 83, 80, 87,
+  89, 94, 86, 89, 86, 85, 89, 96, 88, 82,
+  82, 80, 83, 84, 83, 87, 82, 79, 85, 78,
+  78, 80, 87, 81, 76, 83, 87, 92, 83, 85,
+  78, 89, 89, 79, 89, 99, 84, 85, 76, 87,
+  77, 79, 80, 85, 95, 90, 100, 82, 83, 84,
+  88, 97, 81, 89, 87, 72, 91, 88, 87, 89,
+  94, 83, 78, 82, 84, 84, 88, 82, 77, 87,
+  69, 85, 98, 82, 83, 92, 88, 84, 86, 84,
+  82, 99, 79, 98, 78, 79, 96, 78, 81, 89,
+  95, 75, 70, 88, 87, 103, 86, 83, 90, 86,
+  92, 77, 89, 79, 92, 89, 76, 94, 92, 84,
+  78, 86, 86, 81, 77, 89, 89, 87, 87, 73,
+  103, 83, 91, 88, 111, 80, 73, 88, 70, 89,
+  89, 85, 92, 90, 77, 69, 85, 82, 93, 102,
+  76, 79, 76, 73, 95, 92, 69, 79, 92, 87,
+  87, 87, 86, 86, 86, 94, 74, 71, 77, 92,
+  75, 76, 97, 71, 84, 75, 75, 83, 87, 74,
+  80, 70, 70, 95, 60, 87, 77, 89, 69, 98,
+  88, 88, 106, 68, 69, 79, 82, 105, 89, 81,
+  84, 93, 86, 79, 106, 76, 76, 75, 86, 87,
+  72, 88, 82, 74, 89, 71, 91, 96, 82, 81,
+  82, 88, 82, 102, 71, 107, 93, 94, 92, 89,
+  86, 93, 95, 90, 81, 74, 83, 91, 94, 77,
+  80, 82, 95, 89, 94, 70, 84, 84, 77, 81,
+  101, 78, 73, 80, 75, 79, 88, 67, 90, 91,
+  83, 89, 100, 93, 76, 90, 78, 94, 91, 91,
+  87, 94, 76, 71, 86, 78, 90, 104, 73, 73,
+  70, 80, 90, 85, 87, 84, 95, 88, 84, 92,
+  89, 73, 90, 108, 85, 78, 81, 80, 77, 75,
+  101, 75, 90, 90, 77, 87, 79, 78, 78, 83,
+  70, 86, 80, 99, 87, 83, 82, 101, 79, 79,
+  93, 58, 66, 71, 79, 102, 75, 72, 109, 86,
+  92, 87, 103, 77, 74, 79, 83, 71, 81, 77,
+  86, 72, 82, 77, 83, 85, 80, 75, 77, 101,
+  81, 102, 80, 95, 87, 84, 78, 87, 82, 105,
+  93, 86, 84, 79, 87, 87, 99, 78, 80, 85,
+  91, 84, 89, 72, 74, 79, 81, 79, 86, 86,
+  82, 81, 73, 77, 85, 82, 80, 97, 91, 86,
+  76, 103, 81, 79, 94, 89, 79, 90, 95, 87,
+  61, 78, 80, 83, 72, 90, 84, 94, 72, 91,
+  87, 78, 107, 88, 100, 84, 88, 91, 91, 63,
+  88, 94, 83, 84, 93, 74, 86, 74, 93, 90,
+  88, 129, 97, 92, 80, 97, 79, 110, 92, 71,
+  129, 106, 104, 71, 105, 85, 71, 80, 84, 65,
+  53, 73, 65, 77, 78, 93, 91, 75, 103, 99,
+  81, 85, 94, 94, 82, 62, 91, 68, 94, 76,
+  63, 87, 88, 70, 77, 65, 92, 108, 98, 85,
+  90, 71, 66, 77, 82, 90, 89, 88, 81, 83,
+  87, 89, 90, 81, 87, 96, 79, 85, 78, 81,
+  81, 100, 101, 83, 91, 85, 95, 100, 87, 76,
+  88, 85, 75, 112, 94, 78, 85, 89, 78, 82,
+  79, 91, 78, 89, 83, 90, 81, 85, 93, 71,
+  84, 91, 87, 76, 82, 79, 79, 77, 86, 85,
+  73, 78, 81, 80, 84, 88, 75, 83, 92, 81,
+  79, 82, 77, 87, 82, 90, 92, 78, 76, 79,
+  83, 84, 84, 71, 95, 73, 78, 91, 71, 80,
+  75, 87, 72, 68, 81, 91, 90, 80, 77, 93,
+  79, 69, 94, 85, 87, 89, 85, 84, 98, 70,
+  93, 75, 80, 109, 73, 88, 80, 64, 83, 72,
+  85, 91, 87, 76, 73, 85, 92, 83, 69, 103,
+  91, 96, 102, 94, 84, 83, 83, 87, 79, 78,
+  75, 83, 68, 83, 83, 84, 90, 77, 84, 73,
+  74, 84, 85, 93, 97, 75, 69, 74, 64, 77,
+  83, 68, 91, 89, 83, 88, 94, 83, 80, 92,
+  76, 93, 93, 89, 77, 96, 88, 79, 92, 81,
+  94, 91, 72, 73, 72, 81, 84, 92, 70, 80,
+  74, 79, 87, 91, 77, 86, 88, 95, 87, 82,
+  78, 84, 86, 85, 94, 78, 83, 73, 77, 85,
+  82, 70, 95, 71, 70, 95, 71, 85, 81, 85,
+  78, 89, 80, 78, 92, 66, 68, 81, 79, 86,
+  91, 78, 84, 87, 83, 80, 103, 72, 78, 76,
+  74, 94, 81, 86, 76, 67, 96, 82, 81, 90,
+  81, 73, 70, 79, 81, 98, 76, 103, 91, 95,
+  86, 83, 78, 86, 89, 83, 77, 72, 81, 85,
+  80, 75, 83, 83, 89, 83, 78, 73, 78, 77,
+  81, 85, 83, 75, 80, 82, 63, 76, 85, 67,
+  88, 96, 87, 84, 75, 108, 84, 83, 82, 97,
+  88, 87, 85, 88, 75, 80, 86, 86, 78, 91,
+  78, 81, 71, 80, 84, 85, 91, 86, 85, 74,
+  84, 92, 80, 64, 93, 97, 85, 76, 84, 73,
+  82, 73, 84, 84, 86, 106, 91, 89, 77, 92,
+  76, 103, 82, 78, 104, 94, 95, 76, 92, 87,
+  81, 79, 84, 68, 64, 74, 67, 86, 80, 92,
+  105, 72, 96, 91, 85, 85, 91, 91, 81, 71,
+  89, 75, 82, 73, 71, 78, 93, 81, 73, 67,
+  82, 98, 90, 87, 86, 82, 78, 79, 68, 90,
+  82, 93, 87, 76, 81, 80, 86, 80, 86, 88,
+  81, 85, 75, 85, 76, 83, 99, 79, 89, 86,
+  94, 91, 88, 74, 85, 82, 77, 100, 92, 79,
+  88, 89, 76, 86, 78, 89, 79, 93, 83, 91,
+  87, 81, 89, 77, 85, 92, 81, 93, 87, 82,
+  85, 81, 84, 86, 92, 85, 86, 86, 83, 87,
+  82, 76, 96, 87, 84, 88, 77, 87, 90, 94,
+  92, 83, 80, 77, 78, 78, 82, 75, 84, 77,
+  87, 84, 75, 80, 74, 99, 75, 78, 77, 85,
+  84, 82, 82, 89, 75, 81, 88, 90, 81, 86,
+  86, 89, 99, 77, 90, 77, 79, 88, 73, 85,
+  78, 68, 82, 70, 84, 92, 86, 69, 84, 88,
+  100, 84, 71, 91, 81, 86, 104, 94, 86, 90,
+  78, 84, 91, 75, 86, 87, 80, 89, 83, 87,
+  86, 73, 82, 75, 76, 80, 91, 87, 99, 86,
+  81, 69, 74, 86, 81, 76, 89, 77, 89, 90,
+  90, 81, 81, 90, 79, 88, 94, 89, 85, 90,
+  88, 83, 97, 88, 85, 90, 76, 80, 77, 83,
+  79, 90, 82, 86, 87, 88, 88, 91, 78, 89,
+  84, 90, 88, 91, 75, 87, 91, 95, 97, 85,
+  89, 70, 75, 86, 86, 69, 93, 75, 77, 89,
+  68, 79, 77, 89, 78, 89, 83, 74, 85, 72,
+  79, 82, 76, 83, 88, 86, 77, 84, 80, 85,
+  93, 77, 83, 74, 78, 93, 75, 84, 74, 67,
+  90, 82, 78, 90, 82, 67, 75, 78, 86, 97,
+  79, 97, 87, 93, 95, 87, 85, 82, 81, 80,
+  84, 74, 85, 89, 79, 83, 83, 88, 87, 79,
+  84, 76, 83, 78, 85, 84, 84, 83, 78, 78,
+  64, 82, 81, 70, 87, 100, 85, 87, 78, 108,
+  87, 83, 75, 93, 91, 85, 90, 92, 77, 77,
+  92, 91, 76, 96, 74, 83, 72, 84, 79, 86,
+  87, 88, 88, 79, 92, 94, 82, 69, 82, 96,
+  83, 78, 75, 82, 79, 83, 93, 89, 91, 93,
+  88, 100, 84, 87, 85, 93, 81, 79, 87, 81,
+  90, 82, 93, 88, 89, 78, 81, 72, 69, 74,
+  67, 77, 87, 87, 92, 73, 88, 92, 85, 88,
+  88, 82, 80, 80, 86, 86, 75, 68, 80, 76,
+  89, 79, 78, 62, 87, 83, 87, 90, 84, 81,
+  82, 82, 80, 86, 84, 90, 89, 75, 80, 76,
+  87, 83, 86, 87, 81, 89, 80, 86, 80, 77,
+  96, 79, 88, 85, 96, 87, 88, 78, 81, 77,
+  76, 87, 77, 102, 109, 80, 84, 83, 97, 94,
+  81, 76, 77, 88, 80, 90, 77, 83, 80, 85,
+  86, 80, 88, 79, 91, 69, 87, 93, 82, 68,
+  89, 81, 82, 82, 91, 81, 82, 88, 79, 82,
+  78, 87, 74, 67, 86, 85, 80, 113, 84, 90,
+  97, 73, 79, 82, 73, 85, 70, 67, 83, 73,
+  89, 80, 76, 81, 96, 82, 89, 84, 75, 79,
+  88, 89, 86, 81, 99, 75, 72, 94, 81, 84,
+  78, 104, 77, 81, 97, 81, 89, 97, 81, 68,
+  95, 83, 78, 80, 90, 104, 77, 85, 86, 78,
+  78, 90, 85, 86, 84, 81, 93, 90, 93, 84,
+  85, 80, 95, 92, 90, 79, 83, 88, 91, 91,
+  96, 93, 84, 78, 88, 79, 70, 85, 79, 85,
+  81, 90, 100, 74, 86, 94, 106, 80, 72, 67,
+  75, 89, 94, 92, 80, 80, 85, 78, 82, 84,
+  99, 77, 84, 76, 95, 91, 78, 65, 82, 82,
+  89, 87, 96, 83, 85, 88, 82, 71, 86, 93,
+  62, 63, 93, 97, 74, 109, 90, 99, 92, 78,
+  85, 85, 72, 89, 64, 89, 85, 75, 95, 79,
+  70, 84, 96, 81, 92, 91, 69, 81, 92, 77,
+  88, 85, 83, 69, 80, 79, 84, 92, 80, 112,
+  77, 87, 98, 71, 101, 100, 82, 64, 96, 91,
+  64, 65, 80, 106, 63, 86, 83, 78, 91, 91,
+  62, 83, 76, 81, 99, 84, 98, 81, 98, 81,
+  101, 93, 83, 80, 77, 99, 93, 91, 103, 96,
+  85, 81, 97, 72, 73, 88, 82, 96, 76, 78,
+  86, 79, 85, 90, 96, 85, 80, 75, 83, 81,
+  89, 86, 83, 89, 84, 85, 88, 81, 99, 76,
+  81, 71, 87, 92, 84, 70, 79, 88, 79, 82,
+  97, 95, 87, 83, 86, 79, 90, 86, 69, 69,
+  84, 88, 78, 106, 84, 90, 98, 76, 83, 83,
+  73, 90, 68, 96, 83, 82, 88, 80, 80, 84,
+  92, 84, 90, 88, 76, 80, 92, 85, 90, 85,
+  93, 81, 76, 88, 84, 91, 81, 107, 78, 81,
+  93, 73, 99, 102, 85, 72, 97, 87, 76, 81,
+  84, 96, 78, 83, 91, 80, 90, 89, 84, 78,
+  84, 85, 90, 92, 91, 83, 83, 77, 89, 94,
+  88, 81, 78, 93, 96, 87, 96, 91, 80, 81,
+  90, 78, 65, 83, 82, 92, 73, 100, 70, 94,
+  92, 80, 82, 102, 97, 88, 73, 98, 89, 62,
+  64, 90, 80, 86, 78, 83, 71, 92, 71, 70,
+  74, 89, 103, 87, 113, 69, 59, 79, 82, 88,
+  56, 90, 107, 91, 78, 100, 97, 66, 83, 70,
+  95, 97, 75, 81, 95, 70, 59, 76, 75, 65,
+  84, 101, 89, 64, 86, 80, 88, 68, 101, 82,
+  76, 60, 87, 86, 76, 116, 102, 80, 87, 70,
+  73, 92, 63, 74, 99, 74, 88, 60, 82, 79,
+  69, 75, 85, 86, 65, 87, 87, 93, 92, 93,
+  104, 78, 91, 78, 77, 94, 102, 86, 94, 73,
+  85, 76, 69, 91, 68, 82, 73, 73, 82, 92,
+  89, 75, 72, 82, 89, 72, 77, 67, 88, 91,
+  72, 82, 78, 57, 66, 84, 75, 95, 93, 83,
+  79, 113, 103, 90, 76, 106, 92, 71, 65, 87,
+  84, 88, 81, 82, 86, 91, 82, 72, 78, 93,
+  93, 94, 106, 66, 52, 82, 85, 89, 44, 87,
+  88, 109, 77, 103, 107, 63, 75, 72, 94, 102,
+  69, 71, 88, 74, 68, 78, 75, 67, 79, 68,
+  92, 62, 91, 88, 86, 78, 104, 81, 71, 59,
+  81, 86, 76, 106, 69, 79, 98, 80, 75, 103,
+  69, 82, 73, 73, 90, 65, 71, 88, 73, 85,
+  91, 82, 52, 84, 85, 94, 89, 95, 106, 78,
+  89, 77, 64, 101, 109, 75, 87, 72, 69, 76,
+  76, 85, 66, 81, 64, 70, 87, 93, 85, 75,
+  79, 83, 91, 62, 74, 66, 84, 96, 73, 79,
+  76, 57, 76, 76, 92, 92, 88, 72, 83, 100,
+  93, 89, 80, 96, 97, 89, 69, 88, 79, 86,
+  79, 78, 92, 93, 88, 68, 80, 91, 98, 91,
+  97, 72, 62, 82, 87, 88, 57, 79, 93, 99,
+  79, 101, 98, 63, 70, 70, 90, 89, 74, 68,
+  97, 71, 63, 86, 73, 66, 79, 65, 82, 70,
+  87, 81, 83, 78, 108, 85, 79, 68, 88, 80,
+  75, 123, 69, 77, 91, 81, 75, 85, 67, 87,
+  78, 80, 84, 66, 78, 94, 77, 88, 90, 83,
+  70, 86, 85, 85, 92, 94, 98, 80, 93, 76,
+  65, 92, 102, 74, 92, 74, 79, 76, 69, 85,
+  68, 81, 69, 68, 86, 89, 93, 78, 86, 81,
+  89, 66, 81, 72, 84, 92, 68, 86, 79, 66,
+  80, 95, 71, 73, 85, 81, 89, 85, 80, 84,
+  84, 86, 91, 84, 70, 90, 78, 80, 81, 90,
+  67, 89, 82, 81, 86, 84, 93, 84, 77, 83,
+  94, 78, 79, 66, 74, 76, 95, 75, 94, 73,
+  80, 104, 82, 85, 88, 77, 98, 79, 71, 78,
+  80, 92, 80, 79, 78, 97, 68, 85, 82, 94,
+  95, 63, 83, 83, 72, 68, 86, 88, 84, 83,
+  80, 97, 75, 73, 92, 63, 78, 78, 101, 84,
+  95, 91, 80, 85, 88, 83, 79, 91, 107, 68,
+  73, 74, 87, 81, 66, 75, 88, 92, 104, 63,
+  102, 70, 93, 89, 94, 80, 74, 102, 88, 81,
+  82, 82, 77, 77, 106, 108, 81, 75, 90, 89,
+  91, 88, 77, 87, 74, 85, 85, 101, 79, 85,
+  80, 76, 86, 81, 89, 85, 81, 90, 78, 95,
+  79, 88, 73, 98, 77, 90, 85, 85, 73, 85,
+  83, 82, 78, 89, 98, 84, 71, 73, 88, 72,
+  82, 67, 71, 76, 102, 65, 79, 71, 75, 96,
+  76, 88, 99, 72, 103, 77, 74, 82, 78, 97,
+  84, 82, 86, 100, 71, 74, 83, 94, 92, 59,
+  84, 83, 83, 65, 78, 87, 77, 84, 89, 95,
+  81, 76, 95, 72, 81, 71, 113, 82, 97, 99,
+  83, 83, 83, 78, 84, 91, 116, 69, 81, 78,
+  85, 73, 75, 76, 85, 90, 88, 60, 104, 83,
+  96, 89, 96, 82, 75, 103, 86, 85, 91, 85,
+  80, 79, 106, 104, 75, 72, 81, 89, 88, 86,
+  76, 91, 79, 81, 77, 101, 79, 80, 81, 75,
+  89, 82, 86, 88, 84, 88, 84, 89, 84, 92,
+  70, 90, 75, 82, 84, 85, 83, 83, 78, 80,
+  78, 83, 96, 85, 74, 68, 100, 72, 80, 74,
+  76, 78, 102, 70, 79, 75, 74, 107, 72, 84,
+  88, 78, 100, 88, 78, 75, 79, 92, 82, 79,
+  83, 89, 71, 77, 91, 89, 89, 67, 85, 81,
+  72, 75, 75, 80, 85, 75, 84, 91, 82, 75,
+  95, 67, 80, 74, 117, 87, 91, 95, 83, 83,
+  86, 73, 90, 85, 110, 74, 75, 81, 86, 76,
+  78, 78, 86, 87, 85, 71, 97, 101, 95, 88,
+  93, 82, 71, 101, 89, 84, 96, 85, 80, 77,
+  99, 98, 63, 78, 86, 83, 87, 89, 75, 90,
+  78, 85, 81, 99, 68, 89, 88, 88, 89, 74,
+  80, 95, 111, 95, 79, 82, 97, 74, 66, 113,
+  89, 85, 75, 84, 90, 83, 101, 86, 80, 85,
+  82, 87, 91, 81, 61, 92, 101, 75, 65, 93,
+  86, 99, 89, 76, 84, 72, 93, 80, 75, 98,
+  72, 83, 92, 79, 81, 87, 90, 109, 99, 84,
+  95, 70, 87, 82, 87, 77, 84, 85, 82, 87,
+  80, 80, 106, 85, 87, 81, 101, 76, 81, 87,
+  87, 84, 82, 76, 87, 70, 99, 80, 78, 83,
+  90, 75, 72, 73, 102, 80, 83, 82, 96, 83,
+  90, 70, 87, 101, 77, 92, 96, 93, 84, 105,
+  77, 84, 70, 62, 76, 77, 93, 84, 82, 95,
+  91, 82, 72, 80, 76, 74, 95, 85, 90, 81,
+  87, 95, 64, 87, 83, 93, 99, 72, 76, 92,
+  120, 93, 82, 85, 104, 78, 72, 106, 91, 90,
+  77, 84, 101, 86, 86, 82, 82, 75, 89, 88,
+  97, 78, 57, 102, 105, 79, 63, 90, 81, 106,
+  81, 63, 73, 65, 88, 79, 65, 105, 72, 82,
+  90, 75, 84, 87, 90, 113, 87, 71, 105, 65,
+  83, 84, 88, 84, 80, 90, 67, 86, 85, 81,
+  115, 79, 81, 71, 112, 74, 72, 77, 81, 82,
+  82, 68, 87, 67, 96, 82, 80, 84, 83, 80,
+  65, 69, 99, 70, 72, 91, 98, 76, 92, 66,
+  90, 103, 67, 84, 90, 90, 75, 108, 70, 87,
+  76, 56, 73, 71, 92, 86, 91, 91, 90, 88,
+  72, 80, 80, 69, 101, 81, 84, 79, 86, 99,
+  78, 77, 88, 86, 81, 91, 80, 91, 107, 91,
+  81, 76, 97, 85, 76, 116, 87, 90, 82, 82,
+  101, 80, 73, 85, 79, 90, 87, 79, 77, 74,
+  64, 101, 107, 78, 73, 86, 88, 100, 73, 77,
+  79, 74, 82, 75, 72, 96, 71, 76, 92, 83,
+  79, 91, 91, 107, 99, 61, 101, 79, 75, 84,
+  82, 82, 87, 84, 84, 86, 91, 81, 106, 90,
+  75, 76, 104, 82, 70, 83, 79, 78, 78, 79,
+  94, 71, 93, 91, 81, 86, 78, 73, 78, 69,
+  94, 76, 78, 86, 93, 76, 88, 73, 77, 89,
+  69, 82, 92, 87, 86, 101, 74, 82, 72, 69,
+  79, 71, 95, 85, 88, 90, 96, 82, 75, 80,
+  85, 75, 107, 86, 91, 80, 94, 104, 67, 85,
+  96, 78, 94, 81, 89, 82, 77, 91, 84, 71,
+  78, 87, 67, 82, 73, 76, 77, 82, 76, 85,
+  77, 92, 82, 82, 77, 83, 95, 91, 81, 83,
+  72, 85, 82, 79, 76, 78, 87, 71, 86, 72,
+  73, 85, 79, 67, 92, 66, 81, 76, 85, 84,
+  89, 75, 86, 91, 77, 82, 93, 86, 90, 74,
+  75, 82, 79, 80, 79, 71, 96, 90, 78, 87,
+  86, 82, 90, 72, 90, 93, 100, 74, 84, 92,
+  94, 79, 80, 86, 95, 94, 84, 75, 96, 70,
+  93, 80, 85, 90, 81, 81, 92, 75, 82, 87,
+  94, 98, 65, 105, 83, 84, 76, 81, 69, 89,
+  71, 75, 88, 96, 84, 82, 83, 66, 81, 96,
+  77, 83, 84, 75, 73, 79, 63, 88, 76, 81,
+  101, 72, 93, 84, 77, 84, 92, 77, 76, 91,
+  68, 71, 71, 74, 69, 88, 77, 83, 83, 88,
+  84, 80, 80, 78, 100, 91, 83, 83, 67, 86,
+  81, 80, 80, 69, 92, 62, 87, 69, 75, 93,
+  69, 68, 92, 80, 80, 73, 98, 88, 85, 72,
+  78, 93, 76, 73, 104, 88, 92, 67, 75, 79,
+  69, 79, 76, 73, 97, 84, 89, 88, 81, 75,
+  97, 67, 89, 80, 109, 66, 79, 99, 90, 71,
+  85, 90, 85, 97, 82, 73, 87, 69, 93, 80,
+  81, 92, 81, 77, 94, 68, 74, 96, 86, 98,
+  53, 102, 81, 87, 74, 81, 67, 86, 64, 87,
+  96, 101, 74, 87, 73, 65, 78, 97, 73, 79,
+  79, 77, 63, 78, 70, 80, 76, 87, 88, 78,
+  85, 86, 86, 91, 85, 72, 77, 88, 69, 87,
+  72, 79, 79, 84, 83, 78, 89, 92, 81, 80,
+  82, 87, 92, 86, 78, 84, 86, 84, 79, 87,
+  82, 84, 76, 72, 79, 73, 76, 83, 77, 82,
+  88, 103, 85, 76, 85, 85, 87, 84, 89, 79,
+  83, 74, 87, 83, 86, 70, 81, 72, 76, 76,
+  69, 76, 106, 86, 90, 86, 93, 80, 93, 77,
+  85, 75, 91, 77, 86, 88, 96, 78, 76, 84,
+  70, 91, 83, 73, 95, 67, 88, 79, 95, 84,
+  86, 85, 87, 80, 76, 97, 98, 95, 66, 108,
+  79, 84, 76, 76, 72, 81, 80, 90, 84, 94,
+  84, 88, 77, 67, 86, 89, 86, 85, 84, 74,
+  71, 88, 95, 91, 83, 82, 80, 89, 87, 84,
+  67, 93, 76, 76, 90, 89, 74, 70, 80, 80,
+  76, 76, 80, 96, 83, 84, 79, 93, 80, 87,
+  84, 86, 97, 85, 79, 93, 93, 85, 84, 77,
+  72, 87, 84, 83, 81, 86, 98, 78, 76, 74,
+  84, 79, 89, 87, 97, 74, 87, 83, 83, 98,
+  81, 84, 82, 79, 87, 91, 79, 85, 86, 76,
+  69, 80, 89, 87, 91, 89, 90, 75, 86, 100,
+  76, 86, 84, 91, 85, 76, 84, 82, 94, 80,
+  88, 73, 90, 78, 102, 88, 76, 84, 82, 99,
+  83, 71, 89, 89, 92, 101, 85, 84, 86, 91,
+  90, 94, 76, 88, 79, 80, 86, 84, 82, 86,
+  90, 71, 89, 98, 85, 89, 75, 75, 79, 73,
+  98, 93, 77, 76, 88, 86, 89, 81, 70, 91,
+  78, 79, 96, 80, 77, 67, 82, 81, 73, 76,
+  78, 98, 92, 85, 90, 96, 76, 86, 85, 93,
+  94, 86, 73, 92, 85, 79, 82, 69, 88, 90,
+  91, 83, 78, 95, 96, 80, 81, 77, 82, 83,
+  94, 90, 94, 71, 89, 84, 82, 98, 84, 86,
+  82, 76, 87, 88, 68, 89, 90, 73, 71, 79,
+  83, 89, 89, 87, 91, 70, 91, 89, 72, 87,
+  81, 92, 88, 77, 90, 87, 87, 83, 84, 66,
+  82, 73, 99, 92, 72, 95, 80, 97, 78, 67,
+  86, 95, 89, 103, 88, 79, 87, 94, 93, 102,
+  79, 90, 73, 84, 88, 83, 88, 86, 85, 66,
+  89, 102, 84, 86, 75, 72, 78, 78, 90, 85,
+  84, 88, 80, 80, 84, 88, 71, 91, 79, 76,
+  88, 71, 70, 70, 74, 81, 75, 74, 84, 92,
+  102, 84, 88, 98, 79, 89, 84, 95, 92, 84,
+  80, 89, 78, 84, 83, 73, 88, 87, 83, 82,
+  83, 82, 96, 81, 79, 97, 88, 78, 88, 88,
+  91, 79, 88, 85, 88, 88, 87, 84, 80, 80,
+  92, 83, 72, 87, 83, 78, 78, 79, 88, 88,
+  92, 89, 88, 78, 86, 82, 72, 88, 85, 90,
+  89, 89, 83, 83, 80, 82, 87, 71, 88, 76,
+  105, 85, 81, 86, 83, 94, 86, 75, 85, 92,
+  93, 98, 82, 87, 83, 92, 86, 92, 82, 84,
+  79, 90, 89, 87, 99, 91, 89, 71, 92, 97,
+  88, 89, 79, 77, 74, 77, 78, 73, 84, 86,
+  86, 76, 91, 77, 74, 84, 79, 93, 82, 83,
+  75, 85, 79, 88, 82, 102, 79, 81, 95, 87,
+  83, 72, 101, 80, 96, 73, 81, 66, 87, 90,
+  107, 92, 73, 82, 83, 86, 72, 96, 100, 86,
+  75, 91, 86, 80, 72, 80, 140, 74, 87, 73,
+  86, 88, 74, 84, 90, 89, 69, 90, 85, 82,
+  76, 73, 81, 68, 63, 84, 76, 86, 87, 78,
+  79, 95, 89, 111, 76, 108, 93, 52, 96, 92,
+  92, 76, 87, 82, 78, 91, 87, 77, 84, 81,
+  87, 71, 81, 87, 78, 86, 85, 90, 92, 85,
+  85, 74, 82, 90, 96, 79, 85, 80, 69, 99,
+  96, 84, 87, 91, 96, 89, 80, 93, 82, 75,
+  80, 99, 85, 82, 92, 84, 74, 88, 101, 75,
+  96, 69, 80, 83, 79, 89, 81, 94, 74, 79,
+  86, 75, 74, 108, 92, 76, 79, 88, 79, 66,
+  82, 80, 100, 84, 83, 85, 80, 85, 84, 85,
+  62, 81, 97, 68, 70, 110, 87, 86, 85, 87,
+  85, 97, 75, 65, 160, 61, 84, 77, 75, 104,
+  64, 94, 82, 91, 73, 87, 95, 77, 66, 78,
+  76, 56, 62, 71, 74, 101, 75, 66, 82, 79,
+  102, 87, 67, 140, 92, 51, 83, 89, 89, 74,
+  83, 78, 77, 95, 80, 64, 77, 92, 81, 95,
+  76, 105, 90, 82, 81, 89, 96, 88, 84, 77,
+  91, 92, 92, 78, 87, 74, 66, 87, 98, 91,
+  82, 93, 98, 84, 90, 108, 57, 84, 77, 95,
+  94, 81, 75, 94, 81, 85, 83, 95, 87, 76,
+  79, 85, 83, 101, 80, 83, 73, 84, 83, 90,
+  79, 99, 95, 89, 78, 87, 77, 69, 96, 80,
+  91, 103, 77, 76, 86, 73, 82, 79, 76, 83,
+  88, 92, 77, 89, 76, 86, 87, 98, 89, 106,
+  72, 81, 127, 79, 85, 76, 88, 91, 78, 85,
+  86, 93, 70, 88, 86, 77, 69, 77, 83, 69,
+  60, 82, 88, 83, 90, 79, 89, 98, 93, 73,
+  74, 97, 96, 61, 88, 95, 90, 82, 97, 80,
+  72, 84, 86, 87, 80, 78, 83, 74, 78, 84,
+  83, 78, 80, 76, 91, 87, 84, 71, 82, 88,
+  91, 85, 85, 77, 75, 88, 81, 79, 86, 85,
+  91, 90, 95, 91, 88, 79, 77, 96, 83, 87,
+  74, 73, 79, 88, 78, 81, 88, 76, 69, 77,
+  81, 89, 74, 76, 69, 87, 80, 90, 82, 99,
+  79, 83, 89, 86, 90, 73, 95, 80, 80, 80,
+  79, 75, 88, 82, 79, 94, 73, 77, 85, 95,
+  66, 89, 92, 87, 74, 82, 89, 91, 81, 84,
+  124, 80, 85, 74, 94, 74, 75, 87, 87, 83,
+  71, 81, 84, 80, 72, 72, 89, 65, 77, 91,
+  82, 91, 84, 83, 80, 93, 80, 92, 68, 118,
+  95, 56, 95, 90, 90, 75, 81, 78, 67, 73,
+  85, 67, 85, 71, 78, 73, 91, 84, 76, 80,
+  75, 87, 89, 84, 76, 78, 74, 87, 81, 74,
+  86, 87, 72, 90, 81, 79, 72, 86, 87, 85,
+  73, 88, 87, 77, 87, 80, 76, 79, 78, 71,
+  72, 85, 83, 74, 96, 70, 77, 78, 81, 88,
+  75, 90, 77, 77, 92, 77, 77, 92, 90, 83,
+  79, 84, 85, 68, 75, 81, 79, 73, 83, 89,
+  78, 81, 78, 80, 66, 75, 94, 76, 69, 126,
+  89, 88, 80, 82, 86, 97, 82, 72, 146, 74,
+  89, 80, 87, 96, 63, 96, 85, 85, 69, 80,
+  86, 82, 63, 86, 79, 54, 84, 77, 74, 108,
+  73, 72, 85, 81, 89, 86, 59, 165, 97, 57,
+  86, 84, 90, 71, 75, 73, 71, 74, 76, 57,
+  85, 86, 75, 92, 86, 111, 87, 77, 70, 74,
+  94, 84, 64, 82, 80, 89, 69, 78, 90, 78,
+  71, 77, 83, 91, 71, 85, 92, 81, 79, 100,
+  68, 87, 85, 67, 83, 79, 72, 77, 73, 88,
+  74, 83, 87, 79, 74, 77, 84, 93, 76, 82,
+  70, 88, 80, 93, 82, 92, 90, 87, 85, 84,
+  84, 69, 93, 80, 76, 76, 75, 79, 90, 78,
+  83, 75, 69, 77, 78, 95, 71, 89, 81, 87,
+  78, 89, 90, 97, 83, 88, 114, 84, 84, 75,
+  92, 79, 78, 84, 84, 88, 72, 83, 83, 77,
+  73, 75, 88, 74, 82, 91, 83, 88, 81, 83,
+  86, 99, 83, 85, 73, 105, 96, 59, 95, 83,
+  92, 80, 92, 83, 65, 74, 85, 83, 81, 71,
+  88, 73, 87, 85, 78, 77, 72, 77, 88, 84,
+  77, 73, 70, 89, 81, 81, 86, 82, 76, 80,
+  73, 81, 86, 82, 83, 92, 88, 87, 93, 79,
+  86, 82, 77, 86, 72, 71, 80, 94, 84, 89,
+  94, 82, 78, 74, 88, 84, 84, 85, 76, 92,
+  81, 91, 83, 104, 83, 89, 88, 88, 91, 71,
+  84, 82, 97, 76, 86, 76, 84, 92, 97, 102,
+  74, 91, 94, 87, 74, 89, 94, 85, 73, 84,
+  87, 86, 81, 77, 135, 78, 80, 79, 83, 83,
+  74, 95, 93, 95, 70, 80, 81, 78, 74, 73,
+  100, 69, 73, 82, 90, 86, 87, 83, 74, 92,
+  89, 116, 73, 115, 87, 61, 95, 93, 87, 97,
+  91, 85, 79, 78, 81, 79, 88, 83, 88, 76,
+  86, 85, 82, 76, 86, 76, 80, 87, 75, 77,
+  83, 88, 73, 78, 86, 81, 69, 91, 89, 90,
+  78, 89, 90, 79, 78, 92, 83, 77, 79, 85,
+  77, 87, 73, 83, 86, 96, 89, 78, 100, 75,
+  85, 79, 92, 82, 81, 96, 82, 82, 100, 76,
+  78, 102, 93, 74, 80, 84, 84, 69, 69, 80,
+  102, 89, 96, 91, 83, 93, 93, 88, 81, 101,
+  105, 68, 79, 117, 95, 84, 81, 78, 86, 101,
+  82, 65, 152, 67, 83, 83, 75, 98, 62, 104,
+  86, 102, 70, 73, 88, 74, 67, 82, 89, 57,
+  78, 71, 75, 90, 78, 70, 76, 76, 104, 88,
+  66, 149, 90, 61, 84, 90, 84, 102, 80, 78,
+  83, 81, 72, 77, 84, 101, 87, 95, 83, 105,
+  91, 78, 89, 79, 87, 89, 65, 71, 84, 91,
+  63, 78, 97, 74, 65, 80, 89, 92, 65, 91,
+  96, 71, 81, 101, 65, 81, 70, 77, 84, 90,
+  69, 92, 88, 93, 80, 93, 90, 81, 79, 74,
+  86, 88, 76, 90, 75, 89, 82, 96, 84, 97,
+  91, 88, 90, 86, 82, 69, 86, 79, 92, 81,
+  85, 83, 91, 90, 88, 84, 73, 91, 83, 87,
+  75, 94, 84, 84, 72, 88, 91, 117, 88, 80,
+  120, 80, 82, 81, 86, 85, 76, 90, 89, 94,
+  72, 81, 80, 74, 77, 72, 88, 78, 74, 85,
+  84, 85, 82, 83, 79, 98, 84, 78, 77, 106,
+  89, 65, 96, 85, 87, 97, 96, 84, 79, 77,
+  83, 94, 86, 80, 97, 70, 85, 84, 83, 75,
+  84, 99, 80, 88, 75, 74, 78, 87, 73, 82,
+  91, 78, 72, 84, 79, 84, 86, 84, 82, 82,
+  85, 86, 90, 77, 78, 86, 75, 88, 71, 80,
+  81, 77, 89, 73, 72, 73, 98, 79, 91, 90,
+  78, 101, 70, 72, 86, 74, 97, 78, 94, 92,
+  76, 83, 88, 94, 89, 86, 94, 72, 98, 81,
+  92, 79, 83, 78, 81, 77, 83, 70, 82, 84,
+  86, 85, 72, 84, 73, 76, 73, 78, 83, 94,
+  84, 122, 89, 76, 96, 77, 89, 80, 76, 84,
+  99, 78, 73, 91, 81, 92, 106, 89, 77, 81,
+  77, 97, 85, 79, 88, 116, 83, 86, 83, 74,
+  85, 91, 87, 73, 84, 80, 88, 93, 80, 79,
+  73, 78, 100, 106, 66, 76, 85, 80, 91, 85,
+  66, 74, 80, 75, 83, 91, 79, 75, 85, 95,
+  98, 90, 77, 76, 102, 76, 94, 94, 82, 90,
+  73, 70, 84, 78, 94, 74, 70, 84, 78, 74,
+  81, 79, 64, 68, 93, 78, 100, 88, 65, 96,
+  69, 75, 91, 84, 125, 65, 84, 78, 74, 80,
+  88, 91, 87, 86, 89, 84, 106, 86, 105, 80,
+  81, 85, 82, 69, 94, 63, 88, 85, 86, 75,
+  76, 85, 71, 89, 59, 77, 78, 76, 85, 136,
+  82, 79, 104, 69, 89, 88, 89, 87, 108, 85,
+  67, 85, 81, 108, 105, 91, 76, 82, 82, 98,
+  82, 83, 96, 87, 79, 95, 86, 74, 97, 90,
+  89, 72, 79, 83, 83, 96, 82, 83, 67, 77,
+  105, 107, 70, 74, 71, 83, 91, 96, 68, 79,
+  76, 80, 100, 82, 68, 69, 81, 98, 92, 86,
+  69, 81, 94, 76, 97, 94, 92, 84, 72, 68,
+  79, 78, 97, 78, 72, 88, 83, 83, 84, 83,
+  72, 77, 95, 78, 97, 84, 77, 79, 71, 78,
+  91, 77, 104, 73, 87, 86, 73, 80, 84, 92,
+  85, 92, 90, 89, 98, 92, 96, 82, 67, 103,
+  83, 73, 103, 69, 85, 81, 93, 85, 78, 78,
+  73, 93, 74, 75, 87, 85, 82, 117, 87, 85,
+  92, 81, 86, 79, 84, 83, 98, 80, 73, 89,
+  73, 91, 101, 91, 90, 83, 77, 99, 85, 82,
+  87, 72, 80, 85, 87, 77, 82, 91, 86, 74,
+  83, 73, 87, 90, 81, 76, 72, 78, 89, 102,
+  72, 73, 80, 80, 94, 92, 71, 74, 78, 82,
+  88, 85, 68, 74, 76, 89, 90, 81, 72, 69,
+  78, 76, 92, 87, 90, 92, 80, 70, 87, 83,
+  95, 73, 75, 74, 75, 77, 84, 74, 79, 79,
+  87, 82, 75, 92, 80, 74, 82, 70, 88, 90,
+  86, 79, 84, 88, 71, 83, 91, 87, 79, 80,
+  96, 76, 94, 75, 104, 84, 94, 77, 89, 75,
+  89, 85, 93, 82, 84, 83, 78, 83, 77, 79,
+  86, 73, 81, 84, 86, 114, 85, 86, 93, 73,
+  81, 94, 72, 80, 91, 83, 73, 78, 74, 108,
+  100, 85, 86, 91, 71, 94, 101, 77, 84, 95,
+  86, 83, 80, 71, 74, 88, 93, 73, 88, 79,
+  83, 89, 76, 81, 74, 77, 94, 93, 72, 83,
+  106, 77, 87, 76, 76, 85, 85, 77, 82, 93,
+  76, 79, 75, 110, 113, 94, 72, 74, 94, 79,
+  86, 79, 81, 97, 75, 83, 78, 79, 87, 61,
+  69, 81, 85, 75, 79, 77, 76, 79, 77, 79,
+  76, 94, 66, 85, 82, 66, 94, 99, 106, 70,
+  77, 75, 73, 81, 97, 81, 78, 76, 82, 94,
+  105, 74, 102, 76, 100, 89, 89, 71, 85, 76,
+  95, 79, 80, 77, 77, 76, 82, 75, 75, 61,
+  81, 78, 86, 126, 81, 75, 100, 64, 82, 107,
+  76, 83, 102, 88, 66, 73, 72, 126, 114, 79,
+  73, 91, 71, 91, 110, 72, 90, 81, 80, 89,
+  82, 71, 85, 82, 95, 75, 81, 75, 81, 92,
+  69, 80, 70, 80, 102, 91, 74, 85, 85, 77,
+  75, 85, 81, 91, 74, 80, 91, 87, 65, 74,
+  72, 121, 124, 84, 66, 77, 81, 78, 89, 76,
+  79, 86, 61, 88, 74, 81, 80, 61, 71, 91,
+  104, 83, 82, 78, 77, 77, 83, 83, 83, 89,
+  76, 95, 81, 72, 90, 87, 95, 73, 86, 86,
+  75, 85, 93, 82, 77, 84, 93, 96, 98, 80,
+  105, 79, 79, 103, 87, 71, 86, 81, 94, 82,
+  84, 80, 80, 83, 85, 80, 82, 69, 84, 83,
+  84, 112, 87, 71, 88, 74, 81, 90, 80, 81,
+  91, 86, 69, 83, 77, 104, 101, 85, 75, 93,
+  70, 93, 109, 80, 86, 77, 78, 85, 82, 68,
+  79, 87, 87, 80, 83, 75, 83, 93, 77, 82,
+  77, 77, 92, 89, 75, 82, 77, 80, 90, 90,
+  79, 83, 84, 83, 88, 89, 74, 79, 76, 111,
+  108, 79, 78, 74, 77, 78, 91, 76, 79, 95,
+  72, 80, 78, 85, 82, 66, 81, 75, 75, 73,
+  83, 86, 84, 79, 85, 79, 74, 87, 88, 75,
+  89, 86, 79, 90, 70, 76, 80, 77, 72, 92,
+  92, 73, 77, 83, 77, 77, 82, 80, 93, 90,
+  100, 74, 98, 83, 87, 97, 94, 73, 87, 80,
+  75, 85, 84, 81, 82, 78, 82, 80, 85, 95,
+  89, 83, 87, 81, 93, 82, 74, 75, 93, 86,
+  88, 79, 71, 78, 95, 78, 93, 85, 74, 84,
+  97, 75, 81, 90, 82, 80, 78, 85, 69, 84,
+  86, 78, 80, 79, 94, 79, 77, 87, 77, 74,
+  90, 88, 75, 81, 105, 83, 85, 75, 82, 86,
+  99, 78, 79, 88, 77, 91, 80, 90, 101, 86,
+  90, 79, 80, 78, 84, 96, 78, 97, 85, 85,
+  77, 92, 89, 76, 75, 81, 88, 70, 80, 75,
+  84, 84, 83, 82, 72, 85, 71, 85, 87, 89,
+  83, 93, 72, 73, 78, 67, 73, 86, 96, 82,
+  77, 83, 73, 88, 88, 76, 88, 86, 102, 75,
+  97, 94, 85, 81, 100, 70, 80, 74, 71, 79,
+  90, 68, 87, 67, 84, 83, 82, 107, 84, 89,
+  96, 75, 96, 92, 69, 75, 103, 83, 82, 74,
+  74, 83, 102, 72, 78, 89, 68, 83, 106, 82,
+  81, 79, 80, 81, 79, 90, 65, 73, 92, 82,
+  73, 79, 89, 77, 74, 81, 79, 81, 94, 89,
+  77, 82, 92, 85, 82, 76, 83, 88, 96, 81,
+  85, 86, 72, 87, 77, 82, 116, 76, 89, 84,
+  77, 82, 86, 94, 74, 94, 80, 94, 77, 105,
+  89, 69, 77, 88, 105, 73, 81, 82, 85, 78,
+  82, 85, 78, 83, 82, 93, 86, 88, 78, 91,
+  74, 75, 88, 80, 83, 90, 96, 73, 74, 84,
+  76, 92, 87, 81, 93, 77, 92, 90, 97, 87,
+  76, 88, 95, 70, 79, 76, 76, 84, 87, 75,
+  83, 74, 82, 84, 84, 95, 87, 80, 83, 78,
+  91, 78, 74, 74, 91, 84, 87, 82, 74, 80,
+  90, 83, 67, 84, 73, 82, 108, 75, 82, 80,
+  80, 80, 78, 82, 67, 79, 87, 82, 78, 78,
+  88, 80, 76, 79, 77, 74, 86, 86, 76, 82,
+  82, 81, 86, 74, 84, 85, 95, 79, 78, 86,
+  76, 88, 81, 91, 101, 74, 85, 84, 81, 77,
+  86, 94, 80, 94, 83, 84, 81, 103, 88, 76,
+  80, 69, 101, 78, 67, 88, 85, 86, 81, 89,
+  75, 93, 87, 86, 86, 71, 88, 79, 76, 88,
+  79, 74, 86, 91, 75, 79, 83, 78, 92, 72,
+  87, 84, 81, 70, 88, 81, 93, 94, 66, 77,
+  76, 88, 80, 91, 89, 93, 84, 72, 102, 85,
+  95, 82, 86, 75, 86, 78, 69, 85, 88, 78,
+  84, 77, 79, 89, 96, 77, 86, 96, 74, 64,
+  76, 90, 76, 97, 80, 84, 86, 107, 88, 81,
+  83, 84, 85, 82, 82, 83, 88, 82, 91, 81,
+  86, 84, 94, 73, 85, 96, 69, 91, 76, 87,
+  87, 101, 83, 93, 85, 75, 86, 82, 70, 86,
+  93, 86, 87, 85, 94, 94, 84, 85, 93, 82,
+  93, 92, 68, 86, 87, 85, 87, 85, 78, 77,
+  81, 69, 65, 76, 86, 80, 77, 87, 73, 82,
+  76, 88, 85, 70, 71, 74, 57, 78, 84, 68,
+  72, 93, 67, 82, 86, 70, 97, 70, 95, 87,
+  74, 67, 69, 72, 86, 99, 80, 58, 91, 89,
+  88, 82, 90, 94, 81, 85, 111, 72, 99, 72,
+  80, 83, 81, 97, 60, 81, 95, 75, 87, 85,
+  87, 91, 82, 83, 108, 86, 64, 52, 84, 105,
+  71, 116, 75, 65, 86, 76, 97, 76, 86, 76,
+  76, 73, 73, 95, 85, 85, 99, 80, 74, 72,
+  101, 87, 61, 121, 68, 82, 92, 78, 79, 93,
+  79, 94, 92, 87, 87, 85, 75, 74, 92, 90,
+  84, 79, 104, 111, 80, 90, 89, 121, 83, 91,
+  67, 80, 76, 92, 75, 82, 77, 93, 73, 76,
+  63, 93, 87, 82, 81, 93, 79, 90, 95, 80,
+  85, 71, 78, 77, 73, 86, 74, 75, 90, 93,
+  74, 85, 86, 79, 88, 82, 78, 84, 78, 67,
+  78, 80, 93, 98, 92, 71, 90, 88, 84, 89,
+  99, 86, 83, 111, 105, 85, 96, 70, 84, 80,
+  87, 96, 68, 87, 88, 79, 87, 79, 86, 91,
+  88, 80, 95, 99, 66, 70, 87, 101, 77, 103,
+  80, 80, 85, 70, 87, 75, 84, 81, 79, 89,
+  79, 90, 90, 87, 88, 84, 83, 70, 95, 79,
+  78, 101, 73, 90, 93, 80, 89, 90, 84, 94,
+  84, 76, 93, 85, 75, 84, 81, 83, 86, 80,
+  89, 94, 83, 87, 90, 100, 78, 92, 67, 86,
+  86, 87, 80, 86, 80, 66, 108, 77, 84, 78,
+  79, 86, 88, 87, 83, 92, 97, 103, 84, 69,
+  85, 72, 81, 81, 96, 94, 80, 81, 66, 83,
+  73, 79, 93, 81, 76, 80, 86, 83, 79, 88,
+  82, 82, 76, 84, 84, 83, 77, 81, 95, 91,
+  69, 86, 88, 88, 75, 90, 82, 77, 84, 73,
+  69, 64, 82, 89, 77, 87, 81, 87, 81, 85,
+  81, 96, 70, 61, 78, 83, 88, 93, 87, 85,
+  75, 82, 79, 81, 81, 73, 85, 81, 84, 77,
+  86, 88, 77, 85, 86, 79, 93, 79, 87, 110,
+  79, 91, 72, 86, 87, 85, 85, 97, 78, 82,
+  86, 91, 74, 74, 97, 76, 86, 89, 87, 88,
+  90, 84, 91, 85, 81, 77, 78, 86, 87, 83,
+  85, 79, 78, 79, 78, 74, 108, 73, 70, 88,
+  85, 78, 85, 86, 82, 84, 80, 59, 76, 71,
+  73, 83, 97, 101, 72, 67, 65, 101, 77, 74,
+  97, 70, 72, 76, 88, 88, 72, 95, 72, 75,
+  90, 66, 91, 70, 93, 80, 126, 100, 57, 85,
+  83, 71, 71, 61, 80, 95, 76, 79, 71, 60,
+  70, 102, 81, 107, 91, 81, 72, 83, 94, 108,
+  56, 50, 79, 85, 98, 106, 78, 76, 59, 76,
+  76, 72, 89, 66, 83, 81, 79, 84, 82, 85,
+  65, 76, 93, 70, 72, 97, 84, 137, 81, 97,
+  70, 81, 79, 92, 82, 98, 78, 94, 102, 93,
+  91, 59, 91, 76, 87, 85, 83, 79, 95, 87,
+  75, 115, 72, 72, 79, 86, 86, 87, 77, 76,
+  79, 92, 80, 79, 85, 78, 77, 85, 91, 89,
+  86, 88, 103, 68, 83, 63, 77, 71, 84, 80,
+  76, 96, 76, 72, 71, 91, 77, 82, 93, 73,
+  72, 79, 86, 74, 86, 94, 74, 81, 109, 82,
+  92, 76, 96, 83, 102, 91, 67, 81, 85, 87,
+  75, 77, 80, 89, 86, 96, 72, 68, 77, 91,
+  78, 94, 87, 89, 80, 90, 83, 98, 62, 66,
+  95, 89, 91, 98, 81, 79, 74, 85, 76, 76,
+  83, 70, 86, 89, 83, 83, 86, 89, 76, 84,
+  86, 74, 88, 85, 82, 110, 84, 94, 86, 84,
+  87, 79, 84, 98, 77, 81, 98, 89, 79, 74,
+  76, 74, 87, 87, 74, 80, 85, 82, 86, 90,
+  81, 79, 79, 86, 85, 84, 84, 79, 94, 80,
+  98, 79, 83, 81, 76, 86, 82, 90, 74, 93,
+  109, 94, 82, 73, 83, 77, 87, 82, 81, 87,
+  98, 90, 75, 82, 77, 89, 78, 78, 77, 84,
+  80, 86, 76, 75, 87, 80, 83, 94, 72, 84,
+  63, 83, 83, 85, 87, 83, 76, 84, 82, 87,
+  82, 68, 83, 94, 71, 69, 78, 85, 82, 82,
+  90, 88, 88, 88, 88, 79, 79, 78, 90, 82,
+  88, 92, 96, 79, 79, 81, 83, 85, 86, 88,
+  78, 75, 92, 81, 86, 83, 90, 89, 69, 88,
+  86, 88, 84, 92, 81, 86, 88, 84, 81, 86,
+  85, 96, 79, 90, 87, 93, 83, 87, 79, 72,
+  87, 89, 92, 93, 94, 81, 94, 83, 79, 76,
+  80, 88, 91, 79, 87, 84, 86, 85, 98, 80,
+  107, 80, 67, 88, 87, 84, 77, 90, 101, 81,
+  81, 70, 81, 75, 96, 77, 78, 100, 84, 76,
+  83, 91, 79, 86, 81, 74, 77, 82, 82, 95,
+  79, 82, 91, 84, 87, 103, 82, 77, 72, 82,
+  98, 79, 81, 75, 67, 76, 86, 93, 82, 94,
+  72, 87, 66, 68, 82, 97, 91, 82, 100, 73,
+  82, 99, 87, 81, 75, 65, 89, 83, 92, 84,
+  83, 77, 67, 79, 78, 84, 96, 87, 87, 83,
+  93, 84, 86, 80, 88, 89, 72, 85, 68, 102,
+  90, 90, 85, 97, 90, 88, 78, 84, 85, 94,
+  70, 93, 96, 91, 88, 80, 74, 72, 87, 88,
+  100, 86, 87, 79, 88, 88, 73, 77, 89, 88,
+  90, 79, 93, 83, 91, 98, 99, 82, 87, 99,
+  74, 81, 80, 92, 74, 89, 103, 83, 83, 70,
+  82, 76, 94, 75, 64, 93, 83, 85, 84, 85,
+  79, 91, 72, 72, 81, 86, 79, 82, 79, 84,
+  90, 83, 90, 100, 83, 82, 75, 83, 82, 86,
+  89, 71, 71, 85, 82, 91, 82, 74, 84, 82,
+  67, 71, 79, 85, 88, 82, 91, 85, 86, 88,
+  83, 74, 78, 76, 89, 87, 87, 92, 89, 78,
+  77, 84, 83, 86, 90, 86, 83, 89, 88, 83,
+  91, 83, 91, 88, 71, 89, 84, 89, 79, 88,
+  79, 90, 95, 87, 79, 96, 82, 95, 76, 88,
+  90, 90, 79, 89, 76, 71, 82, 85, 92, 87,
+  89, 81, 96, 79, 83, 74, 76, 88, 90, 87,
+  90, 85, 84, 82, 87, 94, 77, 89, 85, 76,
+  89, 89, 77, 79, 82, 73, 70, 95, 73, 70,
+  87, 96, 78, 70, 85, 106, 63, 74, 81, 83,
+  90, 82, 81, 88, 73, 100, 98, 98, 76, 90,
+  74, 69, 87, 67, 82, 67, 86, 96, 84, 106,
+  98, 80, 83, 71, 76, 69, 73, 100, 79, 93,
+  75, 85, 84, 101, 88, 77, 77, 62, 64, 72,
+  92, 68, 111, 89, 95, 87, 83, 77, 89, 90,
+  99, 77, 85, 87, 84, 88, 78, 78, 94, 84,
+  85, 86, 80, 110, 101, 88, 73, 79, 90, 80,
+  90, 73, 75, 85, 89, 92, 87, 74, 76, 76,
+  77, 74, 84, 76, 62, 90, 77, 87, 92, 89,
+  79, 75, 68, 78, 80, 77, 78, 91, 76, 84,
+  97, 84, 68, 89, 84, 88, 80, 81, 93, 74,
+  83, 90, 101, 80, 88, 81, 92, 84, 80, 79,
+  91, 77, 88, 87, 76, 75, 73, 86, 87, 81,
+  88, 70, 87, 95, 92, 86, 71, 80, 83, 81,
+  83, 83, 66, 83, 94, 83, 75, 109, 73, 94,
+  85, 81, 87, 85, 75, 99, 66, 92, 76, 86,
+  78, 78, 79, 80, 69, 76, 68, 72, 87, 75,
+  94, 90, 81, 80, 96, 69, 84, 83, 85, 90,
+  81, 93, 95, 77, 92, 82, 89, 95, 89, 80,
+  77, 90, 85, 91, 67, 82, 93, 102, 114, 80,
+  75, 83, 81, 89, 88, 88, 82, 83, 85, 81,
+  80, 80, 81, 80, 75, 95, 89, 90, 88, 72,
+  77, 90, 92, 79, 80, 80, 85, 94, 99, 74,
+  71, 79, 77, 90, 81, 89, 78, 70, 86, 91,
+  93, 81, 93, 70, 105, 99, 84, 79, 93, 88,
+  82, 81, 74, 69, 78, 82, 68, 82, 94, 73,
+  99, 81, 104, 79, 89, 68, 75, 88, 84, 92,
+  78, 81, 93, 73, 75, 99, 71, 100, 80, 85,
+  95, 86, 88, 89, 79, 82, 78, 77, 83, 83,
+  80, 77, 77, 88, 85, 83, 77, 93, 81, 76,
+  84, 78, 89, 73, 75, 85, 79, 84, 81, 86,
+  92, 81, 88, 74, 80, 89, 88, 81, 88, 88,
+  85, 87, 80, 78, 90, 98, 105, 89, 80, 90,
+  82, 89, 82, 99, 86, 87, 70, 87, 73, 92,
+  96, 81, 78, 93, 87, 92, 83, 80, 81, 91,
+  74, 83, 85, 79, 88, 90, 76, 86, 82, 88,
+  83, 76, 79, 79, 88, 89, 79, 77, 85, 72,
+  71, 80, 71, 74, 94, 99, 71, 73, 73, 100,
+  78, 79, 85, 75, 113, 68, 77, 110, 70, 89,
+  81, 91, 90, 82, 79, 73, 87, 71, 118, 70,
+  85, 93, 79, 81, 101, 80, 86, 84, 76, 73,
+  76, 89, 95, 77, 86, 75, 97, 93, 91, 64,
+  58, 65, 74, 90, 73, 76, 101, 80, 109, 94,
+  78, 93, 92, 77, 102, 83, 82, 78, 83, 88,
+  67, 72, 88, 80, 77, 93, 82, 102, 94, 87,
+  90, 83, 95, 76, 61, 78, 77, 94, 98, 87,
+  80, 83, 83, 74, 77, 76, 86, 77, 69, 102,
+  73, 90, 79, 88, 77, 98, 72, 83, 72, 81,
+  81, 92, 75, 76, 83, 83, 67, 96, 82, 81,
+  77, 70, 95, 89, 77, 72, 100, 73, 74, 91,
+  70, 63, 73, 87, 68, 70, 73, 101, 75, 76,
+  80, 83, 107, 65, 72, 89, 69, 103, 89, 95,
+  73, 91, 78, 84, 86, 63, 83, 77, 77, 90,
+  81, 110, 88, 86, 80, 84, 88, 72, 68, 97,
+  71, 85, 84, 87, 88, 80, 76, 55, 62, 66,
+  72, 73, 99, 69, 120, 85, 92, 75, 93, 78,
+  85, 82, 103, 84, 81, 89, 89, 80, 85, 83,
+  94, 87, 83, 86, 67, 105, 85, 82, 72, 81,
+  87, 79, 95, 81, 78, 97, 90, 85, 85, 86,
+  81, 74, 73, 68, 75, 75, 62, 95, 71, 84,
+  80, 89, 76, 69, 78, 79, 79, 75, 85, 84,
+  71, 79, 97, 79, 77, 88, 85, 79, 80, 76,
+  90, 75, 87, 85, 114, 82, 86, 83, 98, 89,
+  85, 80, 75, 80, 81, 86, 85, 75, 80, 90,
+  77, 77, 98, 84, 92, 85, 94, 76, 87, 72,
+  80, 93, 84, 93, 79, 88, 85, 69, 90, 82,
+  69, 96, 76, 89, 98, 89, 75, 87, 75, 96,
+  74, 86, 83, 78, 70, 74, 63, 82, 84, 80,
+  90, 79, 68, 81, 79, 70, 90, 67, 78, 80,
+  84, 89, 87, 90, 102, 81, 100, 84, 81, 86,
+  90, 87, 76, 85, 83, 94, 69, 77, 85, 104,
+  99, 85, 82, 88, 87, 85, 82, 99, 91, 88,
+  73, 84, 75, 86, 81, 76, 81, 95, 84, 95,
+  93, 69, 77, 87, 82, 79, 89, 79, 90, 90,
+  90, 91, 88, 74, 93, 64, 97, 89, 77, 72,
+  73, 91, 86, 83, 80, 71, 78, 99, 105, 88,
+  68, 90, 88, 84, 91, 90, 84, 72, 99, 68,
+  86, 106, 96, 80, 82, 78, 81, 75, 87, 78,
+  79, 81, 147, 86, 106, 88, 76, 61, 93, 81,
+  88, 97, 82, 83, 98, 78, 103, 89, 77, 81,
+  88, 76, 98, 73, 62, 81, 75, 89, 75, 81,
+  90, 72, 102, 99, 76, 93, 80, 80, 87, 90,
+  91, 82, 83, 81, 73, 71, 83, 77, 83, 89,
+  96, 77, 91, 87, 91, 81, 92, 91, 57, 76,
+  74, 62, 84, 83, 77, 76, 91, 88, 87, 94,
+  106, 83, 83, 87, 66, 93, 85, 81, 81, 103,
+  74, 93, 80, 91, 90, 82, 85, 80, 73, 89,
+  71, 83, 79, 71, 92, 76, 85, 91, 76, 75,
+  80, 85, 70, 84, 69, 71, 85, 93, 63, 74,
+  84, 96, 80, 85, 80, 77, 107, 56, 73, 101,
+  66, 96, 95, 96, 87, 84, 68, 76, 94, 70,
+  117, 69, 73, 93, 72, 92, 104, 77, 80, 86,
+  83, 71, 78, 76, 95, 81, 89, 80, 100, 90,
+  90, 58, 60, 65, 74, 88, 97, 76, 109, 76,
+  113, 89, 87, 98, 90, 88, 99, 84, 80, 79,
+  75, 85, 66, 78, 84, 83, 79, 81, 83, 97,
+  98, 81, 87, 77, 93, 73, 72, 82, 80, 91,
+  95, 82, 88, 83, 76, 76, 78, 72, 79, 79,
+  66, 100, 68, 81, 85, 85, 72, 89, 77, 81,
+  72, 83, 84, 81, 76, 75, 86, 73, 74, 89,
+  71, 69, 87, 69, 86, 85, 81, 79, 114, 85,
+  69, 83, 85, 76, 84, 85, 64, 75, 89, 87,
+  87, 75, 84, 87, 79, 71, 76, 98, 75, 101,
+  96, 86, 95, 75, 70, 99, 99, 82, 102, 79,
+  66, 75, 81, 87, 96, 87, 73, 88, 92, 79,
+  80, 80, 85, 80, 86, 83, 93, 85, 91, 62,
+  79, 72, 78, 86, 111, 88, 86, 83, 95, 70,
+  87, 79, 84, 84, 99, 92, 82, 77, 88, 83,
+  85, 80, 92, 81, 80, 81, 78, 95, 94, 86,
+  67, 69, 88, 79, 88, 89, 82, 92, 92, 85,
+  83, 92, 81, 84, 72, 71, 74, 75, 67, 84,
+  81, 86, 93, 89, 83, 85, 83, 77, 81, 82,
+  96, 82, 77, 82, 68, 83, 79, 92, 77, 97,
+  81, 84, 68, 82, 72, 81, 93, 65, 70, 99,
+  74, 93, 81, 100, 86, 91, 89, 75, 74, 82,
+  84, 84, 98, 77, 76, 84, 84, 75, 77, 93,
+  92, 83, 91, 95, 77, 86, 95, 80, 103, 95,
+  80, 83, 85, 83, 80, 68, 76, 92, 85, 100,
+  86, 77, 82, 76, 83, 90, 83, 65, 88, 79,
+  86, 93, 86, 92, 89, 94, 93, 78, 87, 81,
+  84, 79, 90, 69, 79, 86, 80, 98, 82, 70,
+  99, 80, 84, 85, 83, 81, 78, 84, 102, 70,
+  88, 89, 90, 79, 94, 85, 85, 84, 92, 87,
+  88, 84, 84, 80, 78, 100, 87, 101, 76, 83,
+  74, 78, 84, 86, 89, 87, 72, 81, 87, 84,
+  78, 84, 67, 73, 84, 81, 80, 90, 81, 74,
+  76, 78, 67, 89, 86, 79, 68, 95, 76, 90,
+  70, 94, 92, 87, 88, 74, 68, 82, 91, 81,
+  104, 81, 72, 78, 78, 78, 77, 91, 81, 77,
+  72, 84, 75, 64, 91, 85, 116, 98, 73, 71,
+  79, 79, 71, 60, 80, 85, 88, 59, 91, 64,
+  85, 78, 80, 91, 90, 61, 91, 63, 79, 81,
+  88, 90, 82, 77, 103, 83, 83, 78, 73, 80,
+  93, 61, 81, 83, 78, 94, 74, 60, 100, 79,
+  76, 88, 81, 93, 74, 76, 113, 68, 81, 93,
+  77, 75, 88, 69, 81, 83, 85, 87, 74, 87,
+  84, 83, 86, 91, 75, 101, 85, 64, 82, 73,
+  71, 85, 96, 80, 71, 76, 90, 79, 77, 77,
+  82, 80, 92, 90, 75, 90, 85, 81, 74, 82,
+  83, 82, 92, 95, 76, 91, 74, 92, 88, 97,
+  92, 91, 91, 72, 76, 81, 83, 84, 87, 75,
+  93, 87, 80, 87, 78, 84, 90, 80, 77, 95,
+  79, 110, 88, 81, 83, 96, 87, 85, 84, 84,
+  76, 79, 78, 89, 91, 61, 76, 69, 81, 76,
+  85, 86, 82, 65, 83, 86, 85, 85, 94, 83,
+  86, 105, 83, 85, 90, 82, 89, 89, 96, 77,
+  78, 94, 84, 86, 84, 69, 98, 90, 96, 78,
+  79, 89, 79, 88, 99, 79, 95, 92, 85, 86,
+  87, 91, 95, 80, 93, 88, 87, 88, 88, 84,
+  96, 97, 89, 97, 101, 87, 88, 84, 86, 83,
+  94, 91, 80, 83, 88, 75, 84, 88, 98, 78,
+  75, 74, 84, 82, 73, 83, 85, 87, 99, 87,
+  80, 83, 76, 71, 84, 66, 72, 87, 81, 79,
+  85, 83, 81, 66, 94, 82, 84, 63, 103, 75,
+  78, 101, 98, 82, 88, 82, 72, 72, 79, 151,
+  79, 88, 92, 68, 95, 90, 75, 87, 98, 93,
+  84, 73, 75, 101, 90, 88, 73, 85, 78, 90,
+  81, 82, 69, 88, 85, 78, 96, 66, 77, 132,
+  69, 76, 83, 64, 98, 82, 51, 78, 97, 91,
+  81, 76, 85, 66, 80, 90, 102, 66, 77, 65,
+  74, 63, 79, 73, 80, 96, 87, 80, 83, 83,
+  101, 82, 83, 81, 83, 76, 71, 88, 80, 104,
+  80, 79, 121, 89, 62, 81, 89, 70, 79, 99,
+  86, 89, 94, 72, 79, 100, 103, 84, 77, 74,
+  81, 86, 79, 82, 100, 89, 101, 97, 97, 106,
+  82, 79, 100, 64, 68, 74, 84, 80, 71, 86,
+  83, 69, 96, 79, 94, 67, 113, 84, 83, 100,
+  82, 81, 97, 83, 110, 76, 73, 211, 92, 101,
+  95, 47, 98, 87, 79, 83, 100, 97, 94, 76,
+  75, 135, 84, 81, 81, 74, 72, 77, 87, 84,
+  46, 115, 86, 64, 89, 44, 68, 150, 58, 76,
+  79, 60, 97, 84, 28, 100, 105, 89, 84, 71,
+  93, 69, 68, 89, 114, 59, 77, 44, 80, 65,
+  61, 69, 80, 107, 98, 78, 70, 70, 112, 82,
+  74, 76, 77, 85, 80, 96, 86, 89, 83, 71,
+  124, 102, 63, 89, 98, 77, 70, 98, 101, 95,
+  107, 53, 86, 97, 75, 79, 84, 83, 85, 91,
+  70, 82, 83, 89, 92, 87, 67, 68, 77, 76,
+  81, 74, 78, 92, 73, 71, 78, 78, 74, 67,
+  92, 81, 72, 87, 85, 78, 79, 91, 80, 82,
+  84, 87, 65, 76, 87, 103, 79, 85, 88, 82,
+  92, 88, 73, 85, 95, 80, 85, 73, 79, 100,
+  84, 79, 76, 94, 88, 94, 80, 69, 77, 75,
+  85, 81, 93, 78, 72, 116, 80, 86, 88, 73,
+  91, 88, 61, 73, 91, 87, 85, 92, 75, 74,
+  83, 79, 86, 76, 78, 69, 72, 75, 86, 76,
+  77, 94, 89, 81, 86, 83, 93, 83, 79, 77,
+  86, 82, 65, 87, 74, 109, 80, 83, 93, 76,
+  88, 78, 77, 76, 78, 93, 77, 85, 92, 83,
+  78, 84, 71, 93, 88, 79, 85, 79, 80, 72,
+  90, 75, 78, 79, 82, 94, 73, 75, 82, 83,
+  84, 96, 90, 83, 94, 85, 84, 94, 87, 78,
+  101, 82, 74, 96, 79, 87, 80, 81, 89, 89,
+  79, 84, 93, 79, 87, 74, 80, 114, 77, 85,
+  98, 95, 86, 76, 83, 81, 81, 65, 80, 69,
+  76, 76, 83, 83, 84, 68, 90, 77, 86, 95,
+  89, 89, 78, 72, 92, 82, 86, 82, 80, 71,
+  97, 80, 80, 92, 88, 94, 76, 90, 104, 86,
+  86, 89, 101, 74, 85, 82, 91, 80, 84, 80,
+  75, 89, 93, 85, 75, 83, 94, 85, 93, 83,
+  59, 80, 89, 83, 82, 106, 81, 79, 85, 86,
+  83, 84, 83, 91, 81, 84, 92, 108, 72, 75,
+  50, 76, 77, 77, 85, 88, 76, 70, 94, 76,
+  75, 92, 60, 82, 76, 75, 84, 86, 77, 100,
+  89, 76, 98, 86, 75, 97, 89, 73, 103, 69,
+  55, 81, 71, 80, 75, 92, 79, 77, 68, 75,
+  95, 49, 89, 75, 83, 124, 69, 70, 91, 92,
+  75, 71, 82, 79, 81, 70, 81, 64, 71, 79,
+  87, 90, 80, 63, 100, 65, 88, 96, 88, 104,
+  82, 56, 102, 81, 87, 82, 65, 74, 96, 70,
+  83, 92, 74, 92, 66, 88, 106, 85, 72, 92,
+  98, 85, 84, 80, 102, 77, 78, 84, 70, 84,
+  93, 84, 67, 83, 98, 86, 91, 84, 50, 75,
+  74, 77, 77, 111, 68, 73, 107, 80, 70, 81,
+  91, 83, 74, 83, 86, 112, 71, 64, 76, 80,
+  74, 79, 80, 81, 84, 79, 90, 79, 81, 77,
+  92, 89, 73, 76, 80, 83, 84, 95, 82, 88,
+  82, 81, 79, 93, 86, 80, 87, 74, 80, 85,
+  82, 84, 93, 96, 89, 84, 87, 91, 95, 95,
+  89, 77, 77, 103, 77, 78, 92, 97, 84, 92,
+  84, 86, 78, 97, 86, 76, 79, 78, 84, 84,
+  81, 75, 76, 91, 82, 96, 88, 83, 81, 85,
+  90, 86, 82, 84, 85, 78, 91, 78, 82, 94,
+  88, 76, 83, 86, 98, 79, 85, 84, 91, 81,
+  80, 84, 85, 78, 83, 88, 91, 89, 84, 87,
+  82, 84, 96, 83, 87, 84, 67, 83, 80, 89,
+  82, 97, 75, 85, 95, 81, 86, 84, 93, 86,
+  90, 90, 94, 103, 81, 81, 82, 85, 78, 74,
+  75, 72, 76, 85, 90, 87, 81, 87, 110, 76,
+  69, 84, 79, 78, 90, 89, 72, 76, 74, 94,
+  89, 79, 92, 84, 89, 90, 81, 93, 78, 75,
+  84, 96, 88, 97, 75, 85, 98, 76, 92, 91,
+  92, 94, 73, 83, 72, 80, 85, 98, 80, 80,
+  87, 80, 79, 70, 100, 84, 98, 58, 73, 87,
+  63, 77, 68, 78, 69, 99, 118, 88, 83, 71,
+  81, 91, 83, 97, 87, 74, 83, 80, 91, 80,
+  85, 90, 86, 92, 70, 83, 76, 94, 83, 93,
+  92, 78, 87, 86, 93, 80, 97, 93, 88, 90,
+  80, 66, 72, 87, 67, 76, 83, 72, 80, 89,
+  71, 95, 74, 82, 90, 79, 71, 87, 76, 80,
+  98, 80, 84, 75, 77, 65, 80, 90, 85, 91,
+  76, 111, 92, 90, 85, 85, 56, 74, 70, 83,
+  78, 76, 88, 74, 86, 83, 77, 90, 82, 86,
+  85, 87, 91, 87, 72, 83, 77, 82, 67, 92,
+  56, 97, 55, 77, 80, 65, 68, 77, 86, 94,
+  74, 64, 89, 67, 97, 89, 79, 77, 81, 52,
+  111, 96, 88, 98, 80, 80, 90, 73, 70, 83,
+  69, 88, 75, 59, 111, 68, 110, 77, 77, 109,
+  71, 82, 71, 69, 82, 93, 78, 82, 76, 86,
+  92, 79, 82, 80, 97, 87, 74, 86, 113, 69,
+  79, 80, 59, 95, 67, 84, 88, 87, 85, 79,
+  81, 88, 68, 78, 83, 80, 98, 80, 86, 80,
+  91, 76, 86, 72, 85, 82, 91, 102, 87, 91,
+  77, 74, 94, 59, 95, 72, 100, 63, 98, 82,
+  86, 73, 75, 90, 76, 76, 89, 83, 80, 89,
+  85, 75, 89, 82, 90, 77, 90, 86, 85, 78,
+  72, 83, 87, 84, 89, 82, 74, 89, 81, 79,
+  86, 87, 79, 70, 84, 100, 81, 91, 83, 70,
+  103, 80, 73, 91, 69, 93, 68, 96, 100, 120,
+  86, 79, 75, 96, 84, 75, 91, 122, 102, 89,
+  93, 76, 83, 68, 93, 86, 89, 64, 81, 76,
+  86, 97, 91, 102, 92, 85, 107, 95, 78, 71,
+  104, 74, 78, 68, 83, 81, 77, 96, 64, 88,
+  85, 103, 87, 74, 76, 90, 96, 93, 104, 86,
+  79, 90, 90, 88, 87, 77, 106, 91, 81, 76,
+  91, 104, 91, 87, 84, 84, 84, 93, 85, 88,
+  84, 105, 65, 86, 80, 68, 85, 61, 90, 76,
+  82, 82, 123, 83, 88, 77, 87, 82, 88, 98,
+  76, 73, 73, 94, 88, 89, 87, 79, 98, 92,
+  101, 101, 80, 85, 102, 79, 98, 95, 91, 79,
+  98, 90, 100, 100, 87, 91, 88, 84, 65, 83,
+  81, 103, 85, 89, 84, 118, 67, 68, 96, 84,
+  102, 68, 79, 91, 66, 71, 86, 87, 71, 95,
+  72, 90, 67, 84, 87, 70, 90, 84, 83, 91,
+  91, 79, 95, 82, 94, 92, 85, 85, 80, 78,
+  75, 77, 91, 101, 66, 85, 93, 98, 130, 70,
+  90, 72, 90, 92, 79, 73, 69, 96, 78, 89,
+  85, 83, 70, 84, 78, 98, 58, 85, 86, 93,
+  84, 88, 78, 73, 90, 76, 89, 92, 83, 71,
+  57, 92, 72, 106, 57, 93, 85, 96, 71, 80,
+  74, 72, 68, 78, 84, 87, 83, 92, 78, 76,
+  77, 86, 79, 71, 98, 82, 112, 73, 60, 86,
+  80, 77, 90, 99, 96, 75, 64, 78, 88, 70,
+  69, 76, 87, 108, 79, 80, 73, 79, 78, 75,
+  82, 64, 97, 72, 89, 60, 86, 89, 98, 69,
+  81, 53, 61, 62, 56, 87, 77, 99, 149, 72,
+  90, 77, 87, 90, 75, 112, 84, 62, 84, 61,
+  78, 89, 74, 78, 90, 97, 47, 80, 79, 97,
+  69, 72, 116, 62, 80, 78, 76, 67, 86, 102,
+  98, 92, 86, 75, 75, 83, 65, 68, 73, 91,
+  77, 97, 68, 85, 73, 73, 73, 70, 73, 85,
+  73, 84, 83, 82, 72, 70, 79, 65, 86, 84,
+  100, 68, 83, 110, 83, 83, 84, 90, 71, 80,
+  79, 79, 77, 81, 101, 84, 98, 87, 72, 87,
+  82, 94, 84, 89, 70, 80, 81, 87, 82, 89,
+  66, 84, 71, 88, 63, 105, 79, 78, 61, 82,
+  83, 83, 79, 67, 98, 80, 88, 80, 73, 82,
+  71, 61, 112, 89, 90, 81, 74, 85, 98, 54,
+  59, 90, 86, 85, 82, 73, 49, 70, 107, 94,
+  76, 95, 71, 80, 55, 96, 86, 90, 86, 87,
+  89, 87, 89, 69, 91, 75, 98, 74, 82, 93,
+  86, 81, 78, 81, 70, 93, 66, 66, 86, 92,
+  91, 81, 96, 85, 77, 85, 88, 71, 95, 76,
+  88, 87, 62, 78, 85, 86, 95, 92, 86, 107,
+  86, 89, 78, 82, 83, 91, 63, 104, 87, 96,
+  95, 67, 86, 67, 87, 84, 89, 87, 85, 79,
+  85, 82, 78, 88, 79, 79, 80, 93, 73, 78,
+  80, 69, 81, 103, 101, 92, 88, 102, 91, 77,
+  83, 95, 75, 65, 91, 86, 90, 92, 76, 77,
+  79, 79, 74, 67, 85, 99, 91, 105, 77, 92,
+  69, 89, 84, 77, 95, 110, 88, 88, 85, 81,
+  104, 79, 81, 68, 70, 73, 81, 89, 72, 67,
+  86, 71, 72, 91, 102, 85, 86, 88, 83, 92,
+  89, 89, 88, 70, 88, 82, 99, 95, 70, 90,
+  99, 83, 110, 95, 72, 76, 86, 88, 84, 83,
+  72, 99, 81, 83, 75, 93, 69, 77, 104, 96,
+  68, 90, 81, 100, 90, 68, 79, 80, 84, 87,
+  86, 96, 83, 101, 67, 85, 78, 78, 81, 66,
+  87, 82, 72, 88, 114, 86, 71, 74, 86, 73,
+  80, 90, 76, 69, 87, 90, 89, 80, 91, 81,
+  98, 88, 101, 93, 73, 69, 98, 92, 97, 88,
+  103, 85, 98, 87, 89, 89, 69, 94, 92, 95,
+  71, 82, 74, 100, 86, 73, 86, 104, 59, 72,
+  83, 92, 95, 64, 81, 81, 71, 66, 78, 93,
+  88, 79, 98, 88, 67, 77, 97, 60, 80, 99,
+  90, 74, 91, 75, 94, 96, 90, 85, 72, 96,
+  79, 71, 68, 73, 85, 88, 63, 75, 89, 89,
+  135, 74, 90, 75, 94, 93, 96, 75, 81, 91,
+  97, 77, 82, 84, 57, 90, 81, 99, 72, 83,
+  92, 75, 72, 79, 81, 68, 88, 87, 81, 81,
+  74, 69, 67, 83, 91, 103, 72, 98, 73, 86,
+  78, 82, 59, 89, 63, 76, 79, 92, 82, 90,
+  99, 84, 78, 90, 81, 89, 89, 83, 77, 79,
+  80, 86, 83, 80, 67, 93, 94, 84, 66, 94,
+  81, 81, 54, 77, 86, 89, 86, 102, 91, 77,
+  78, 76, 76, 79, 89, 70, 100, 70, 79, 79,
+  86, 67, 96, 50, 60, 74, 73, 97, 78, 82,
+  99, 75, 91, 90, 79, 104, 71, 88, 70, 86,
+  88, 72, 71, 92, 84, 74, 94, 82, 69, 76,
+  93, 85, 82, 82, 106, 72, 83, 78, 78, 87,
+  82, 83, 92, 96, 94, 72, 84, 81, 90, 74,
+  78, 72, 72, 89, 83, 86, 82, 82, 88, 80,
+  96, 83, 88, 92, 75, 87, 78, 76, 78, 78,
+  80, 81, 93, 80, 85, 92, 81, 93, 65, 89,
+  78, 82, 74, 104, 77, 91, 77, 95, 76, 82,
+  101, 81, 76, 72, 78, 79, 99, 92, 77, 82,
+  81, 87, 84, 80, 80, 88, 86, 86, 80, 77,
+  79, 88, 108, 83, 77, 76, 103, 70, 86, 77,
+  65, 85, 81, 79, 77, 92, 83, 82, 72, 77,
+  87, 84, 80, 80, 76, 74, 81, 80, 75, 67,
+  75, 87, 87, 75, 87, 73, 83, 85, 80, 74,
+  80, 98, 76, 75, 72, 78, 87, 88, 83, 87,
+  87, 85, 89, 66, 88, 77, 93, 84, 86, 86,
+  130, 96, 97, 77, 80, 90, 87, 81, 73, 95,
+  88, 78, 82, 74, 81, 74, 80, 75, 81, 90,
+  81, 123, 79, 70, 79, 82, 74, 75, 81, 82,
+  93, 84, 82, 92, 77, 100, 65, 87, 75, 84,
+  79, 104, 77, 90, 77, 99, 75, 78, 87, 85,
+  78, 72, 77, 82, 90, 94, 76, 87, 79, 83,
+  86, 81, 79, 86, 85, 82, 78, 81, 78, 86,
+  102, 77, 75, 74, 116, 65, 84, 77, 71, 81,
+  79, 80, 79, 86, 80, 78, 72, 83, 81, 77,
+  82, 82, 76, 75, 81, 81, 77, 67, 77, 79,
+  94, 75, 87, 79, 83, 91, 80, 73, 78, 83,
+  72, 73, 76, 79, 83, 93, 81, 88, 84, 86,
+  87, 69, 88, 74, 84, 85, 85, 78, 142, 96,
+  98, 77, 77, 92, 82, 73, 68, 90, 99, 74,
+  84, 73, 78, 74, 77, 73, 81, 86, 83, 129,
+  77, 69, 78, 77, 82, 72, 81, 81, 91, 93,
+  83, 91, 82, 91, 70, 92, 82, 90, 76, 98,
+  77, 90, 79, 101, 76, 82, 76, 82, 81, 74,
+  79, 75, 93, 92, 75, 87, 80, 80, 86, 81,
+  80, 84, 87, 80, 78, 79, 79, 89, 105, 81,
+  78, 73, 101, 72, 84, 80, 68, 83, 82, 77,
+  80, 89, 82, 81, 72, 82, 84, 85, 83, 82,
+  81, 78, 77, 82, 75, 70, 80, 83, 90, 75,
+  90, 85, 79, 85, 80, 77, 79, 79, 78, 74,
+  81, 83, 84, 88, 83, 97, 85, 89, 80, 67,
+  86, 77, 78, 83, 89, 81, 124, 94, 92, 81,
+  81, 89, 83, 81, 72, 94, 85, 67, 86, 81,
+  74, 73, 83, 75, 84, 90, 78, 124, 79, 75,
+  78, 83, 74, 81, 82, 88, 84, 85, 99, 95,
+  70, 95, 66, 86, 75, 84, 83, 111, 78, 85,
+  79, 96, 74, 80, 93, 88, 85, 74, 71, 79,
+  91, 90, 77, 77, 80, 95, 75, 79, 78, 93,
+  88, 93, 82, 75, 73, 86, 96, 78, 78, 79,
+  116, 70, 84, 75, 72, 78, 78, 73, 72, 93,
+  82, 78, 75, 73, 86, 91, 81, 76, 86, 78,
+  91, 78, 74, 65, 68, 72, 87, 76, 88, 77,
+  80, 79, 75, 78, 85, 92, 71, 71, 71, 79,
+  79, 84, 84, 82, 86, 84, 87, 72, 89, 71,
+  85, 84, 82, 82, 141, 96, 92, 78, 80, 89,
+  87, 78, 79, 88, 102, 81, 76, 77, 84, 76,
+  81, 80, 82, 86, 80, 136, 78, 78, 79, 76,
+  67, 81, 79, 99, 87, 79, 105, 96, 68, 104,
+  63, 82, 73, 84, 92, 117, 78, 75, 78, 97,
+  74, 79, 78, 97, 86, 79, 69, 89, 88, 81,
+  80, 78, 78, 95, 75, 81, 74, 96, 88, 95,
+  81, 78, 77, 81, 87, 75, 79, 81, 136, 62,
+  86, 76, 86, 77, 77, 76, 69, 85, 81, 74,
+  75, 75, 82, 81, 73, 76, 89, 78, 98, 72,
+  74, 67, 64, 67, 101, 71, 90, 80, 83, 85,
+  74, 78, 82, 70, 60, 71, 73, 81, 78, 90,
+  85, 81, 82, 88, 84, 74, 91, 64, 84, 82,
+  80, 73, 166, 98, 100, 73, 77, 89, 89, 70,
+  80, 83, 124, 76, 73, 77, 75, 76, 80, 79,
+  79, 84, 87, 150, 76, 79, 78, 75, 75, 76,
+  78, 88, 85, 91, 98, 94, 73, 92, 68, 89,
+  79, 88, 81, 106, 78, 81, 78, 103, 74, 78,
+  79, 88, 83, 76, 73, 78, 84, 80, 75, 79,
+  77, 85, 82, 85, 77, 87, 87, 86, 80, 75,
+  76, 88, 97, 82, 76, 81, 115, 70, 85, 79,
+  73, 78, 77, 74, 75, 89, 84, 78, 74, 75,
+  83, 90, 87, 76, 87, 84, 91, 78, 79, 65,
+  72, 73, 95, 75, 91, 89, 83, 81, 75, 81,
+  80, 73, 72, 70, 83, 84, 76, 85, 81, 93,
+  84, 88, 79, 73, 87, 72, 77, 81, 85, 81,
+  132, 93, 92, 78, 84, 86, 88, 79, 78, 86,
+  100, 72, 76, 84, 75, 75, 81, 80, 83, 88,
+  82, 134, 78, 83, 80, 79, 81, 73, 76, 80,
+  87, 88, 96, 101, 73, 86, 69, 86, 79, 84,
+  84, 99, 77, 77, 77, 92, 79, 82, 90, 83,
+  85, 85, 76, 71, 83, 83, 78, 84, 80, 98,
+  75, 81, 78, 94, 87, 90, 80, 85, 71, 87,
+  101, 77, 77, 76, 110, 72, 90, 79, 65, 78,
+  82, 80, 75, 95, 87, 76, 71, 70, 94, 92,
+  82, 80, 90, 74, 88, 79, 78, 74, 72, 74,
+  83, 80, 95, 90, 70, 80, 75, 78, 88, 87,
+  84, 68, 74, 83, 83, 80, 77, 80, 90, 87,
+  87, 73, 89, 77, 76, 89, 86, 83, 117, 95,
+  83, 87, 86, 90, 92, 87, 83, 80, 80, 73,
+  75, 78, 81, 78, 83, 81, 82, 85, 71, 132,
+  75, 81, 74, 81, 75, 77, 76, 83, 90, 80,
+  99, 98, 73, 85, 68, 83, 75, 83, 92, 102,
+  83, 72, 77, 89, 78, 80, 83, 86, 80, 89,
+  74, 73, 81, 81, 81, 84, 82, 100, 75, 80,
+  73, 101, 87, 89, 85, 88, 77, 86, 100, 77,
+  74, 84, 118, 67, 91, 80, 69, 75, 80, 78,
+  77, 90, 86, 76, 71, 76, 92, 85, 79, 79,
+  94, 76, 97, 78, 73, 70, 72, 77, 86, 81,
+  99, 85, 67, 83, 75, 79, 83, 75, 78, 70,
+  72, 86, 81, 83, 77, 85, 90, 93, 86, 79,
+  84, 76, 78, 88, 87, 79, 119, 97, 81, 84,
+  87, 89, 91, 86, 82, 78, 86, 74, 76, 80,
+  72, 79, 82, 79, 81, 87, 79, 136, 74, 85,
+  75, 80, 82, 76, 76, 80, 87, 90, 97, 99,
+  75, 87, 69, 88, 81, 84, 83, 98, 79, 76,
+  74, 97, 75, 82, 89, 81, 77, 84, 77, 74,
+  78, 79, 81, 85, 81, 88, 80, 84, 79, 96,
+  91, 82, 82, 87, 78, 88, 104, 83, 73, 91,
+  111, 71, 90, 85, 66, 77, 83, 72, 78, 91,
+  90, 77, 71, 72, 92, 91, 88, 80, 84, 79,
+  93, 81, 77, 71, 76, 76, 88, 80, 98, 85,
+  70, 82, 76, 80, 81, 77, 82, 68, 77, 87,
+  81, 81, 77, 87, 89, 91, 80, 74, 89, 77,
+  79, 86, 87, 79, 115, 92, 82, 86, 90, 87,
+  94, 87, 81, 79, 82, 78, 80, 84, 75, 77,
+  83, 82, 87, 87, 78, 128, 75, 84, 77, 82,
+  83, 72, 90, 88, 106, 91, 74, 63, 78, 90,
+  78, 72, 82, 96, 69, 82, 85, 100, 85, 80,
+  87, 91, 100, 96, 93, 78, 81, 87, 95, 90,
+  76, 86, 63, 77, 73, 93, 79, 77, 88, 82,
+  83, 80, 84, 73, 76, 92, 89, 96, 87, 66,
+  98, 80, 105, 73, 76, 83, 72, 75, 82, 86,
+  94, 86, 88, 81, 102, 72, 81, 91, 86, 111,
+  80, 83, 91, 85, 70, 73, 73, 75, 87, 93,
+  90, 86, 84, 82, 74, 74, 84, 99, 89, 83,
+  86, 74, 78, 71, 89, 78, 87, 74, 94, 87,
+  74, 72, 84, 84, 73, 77, 88, 101, 87, 56,
+  79, 89, 92, 77, 89, 91, 102, 87, 90, 97,
+  111, 74, 93, 90, 88, 84, 90, 77, 75, 98,
+  78, 90, 133, 82, 72, 59, 77, 87, 75, 74,
+  83, 107, 77, 80, 92, 85, 85, 71, 83, 73,
+  86, 112, 100, 71, 76, 89, 103, 78, 75, 85,
+  61, 75, 84, 71, 90, 70, 94, 86, 79, 76,
+  84, 84, 87, 95, 97, 78, 76, 52, 114, 80,
+  93, 77, 60, 84, 67, 72, 87, 81, 92, 76,
+  89, 82, 89, 69, 81, 82, 80, 102, 78, 76,
+  85, 77, 73, 67, 73, 75, 100, 105, 85, 105,
+  85, 86, 63, 66, 76, 100, 88, 101, 72, 79,
+  77, 69, 81, 75, 95, 77, 90, 100, 72, 86,
+  76, 84, 72, 71, 86, 104, 93, 55, 77, 85,
+  91, 76, 86, 80, 73, 90, 84, 104, 106, 65,
+  74, 94, 84, 78, 83, 83, 80, 101, 86, 85,
+  89, 95, 77, 71, 80, 89, 75, 78, 73, 80,
+  69, 86, 92, 95, 88, 77, 82, 90, 96, 88,
+  91, 82, 83, 82, 88, 68, 79, 88, 70, 83,
+  89, 96, 84, 80, 81, 84, 81, 85, 77, 71,
+  75, 84, 92, 80, 92, 77, 92, 77, 100, 68,
+  86, 84, 74, 80, 82, 83, 95, 94, 84, 78,
+  99, 72, 75, 94, 78, 91, 101, 89, 84, 88,
+  74, 79, 78, 87, 99, 86, 90, 84, 89, 105,
+  82, 70, 83, 95, 89, 87, 87, 90, 84, 70,
+  103, 74, 85, 79, 87, 80, 78, 92, 90, 85,
+  72, 76, 83, 103, 86, 70, 85, 91, 93, 84,
+  82, 85, 81, 87, 88, 93, 79, 81, 95, 87,
+  85, 77, 88, 84, 88, 75, 84, 91, 112, 94,
+  75, 67, 71, 88, 89, 80, 93, 104, 71, 82,
+  91, 92, 96, 74, 89, 84, 102, 96, 93, 80,
+  74, 87, 104, 86, 82, 84, 50, 76, 90, 93,
+  78, 67, 101, 87, 80, 72, 82, 83, 83, 90,
+  82, 105, 75, 61, 102, 76, 95, 67, 62, 93,
+  72, 73, 84, 84, 76, 95, 79, 83, 90, 67,
+  83, 85, 89, 81, 77, 76, 102, 89, 72, 71,
+  61, 75, 83, 90, 83, 116, 95, 72, 73, 79,
+  82, 97, 100, 80, 91, 88, 83, 71, 81, 79,
+  86, 71, 80, 94, 58, 82, 74, 83, 75, 73,
+  82, 94, 85, 60, 81, 93, 92, 75, 75, 74,
+  92, 93, 83, 85, 108, 72, 86, 99, 82, 81,
+  90, 70, 85, 98, 81, 87, 155, 79, 71, 59,
+  81, 76, 99, 79, 112, 122, 78, 77, 102, 69,
+  96, 63, 82, 64, 77, 115, 102, 70, 65, 82,
+  106, 85, 81, 83, 35, 67, 102, 67, 81, 67,
+  123, 99, 76, 72, 89, 96, 99, 96, 84, 81,
+  66, 29, 121, 77, 74, 80, 34, 88, 67, 64,
+  82, 75, 67, 85, 76, 94, 70, 69, 93, 67,
+  91, 67, 74, 67, 99, 72, 70, 60, 59, 79,
+  83, 123, 76, 147, 106, 83, 69, 87, 68, 90,
+  104, 92, 84, 78, 77, 76, 56, 80, 90, 70,
+  86, 118, 54, 71, 60, 85, 66, 64, 76, 90,
+  94, 45, 95, 88, 84, 70, 72, 69, 76, 101,
+  77, 89, 101, 56, 55, 101, 78, 69, 81, 75,
+  80, 107, 84, 90, 98, 99, 79, 69, 72, 88,
+  84, 82, 76, 89, 72, 83, 91, 87, 90, 76,
+  75, 85, 93, 86, 82, 80, 75, 85, 97, 77,
+  81, 88, 57, 72, 94, 90, 82, 73, 89, 86,
+  81, 74, 82, 82, 84, 83, 76, 77, 80, 74,
+  93, 71, 91, 68, 73, 83, 71, 78, 86, 83,
+  84, 95, 81, 75, 85, 68, 88, 86, 77, 75,
+  95, 80, 89, 89, 74, 70, 69, 94, 92, 83,
+  84, 110, 97, 102, 82, 82, 76, 94, 99, 80,
+  93, 84, 82, 70, 96, 77, 89, 79, 85, 85,
+  64, 79, 81, 86, 76, 73, 79, 100, 86, 72,
+  91, 94, 95, 84, 77, 75, 91, 91, 82, 89,
+  75, 76, 83, 89, 81, 79, 88, 81, 93, 75,
+  79, 93, 79, 91, 79, 68, 77, 97, 83, 89,
+  87, 92, 67, 91, 89, 98, 85, 81, 84, 89,
+  87, 80, 86, 79, 88, 91, 91, 76, 83, 86,
+  68, 81, 89, 93, 86, 76, 85, 95, 87, 71,
+  87, 77, 70, 79, 77, 93, 77, 83, 84, 83,
+  99, 61, 78, 93, 72, 84, 86, 80, 69, 96,
+  76, 86, 110, 73, 79, 100, 95, 89, 89, 86,
+  98, 97, 74, 75, 71, 82, 83, 68, 86, 84,
+  89, 69, 81, 84, 84, 88, 95, 78, 84, 114,
+  83, 70, 91, 69, 89, 73, 73, 79, 62, 91,
+  90, 86, 90, 94, 79, 92, 83, 69, 82, 81,
+  86, 78, 80, 94, 83, 91, 91, 80, 93, 82,
+  87, 95, 89, 82, 102, 78, 84, 88, 88, 95,
+  98, 78, 75, 63, 79, 93, 87, 92, 98, 99,
+  71, 88, 100, 87, 91, 68, 79, 72, 88, 87,
+  84, 71, 81, 86, 94, 87, 88, 83, 64, 78,
+  87, 76, 87, 84, 104, 101, 88, 61, 83, 86,
+  75, 80, 68, 80, 68, 62, 95, 82, 92, 65,
+  59, 86, 60, 75, 91, 76, 62, 88, 74, 86,
+  88, 63, 81, 84, 104, 93, 73, 71, 100, 93,
+  70, 67, 69, 74, 79, 79, 84, 104, 100, 92,
+  77, 95, 79, 86, 98, 81, 76, 112, 85, 67,
+  66, 67, 90, 77, 85, 90, 55, 82, 74, 87,
+  70, 98, 77, 87, 79, 66, 90, 67, 81, 76,
+  83, 99, 79, 102, 91, 77, 81, 71, 73, 95,
+  83, 74, 95, 73, 89, 97, 86, 93, 71, 91,
+  80, 68, 78, 97, 81, 87, 72, 79, 71, 93,
+  87, 92, 83, 75, 82, 89, 99, 78, 70, 79,
+  85, 87, 84, 94, 84, 92, 74, 79, 79, 97,
+  89, 79, 83, 93, 88, 66, 76, 74, 76, 77,
+  71, 85, 78, 91, 84, 78, 97, 65, 80, 77,
+  73, 85, 87, 88, 77, 87, 83, 81, 97, 74,
+  84, 101, 90, 93, 83, 88, 85, 99, 74, 80,
+  77, 79, 79, 65, 88, 81, 93, 114, 80, 84,
+  82, 83, 93, 84, 86, 97, 79, 69, 88, 70,
+  91, 78, 91, 75, 68, 80, 92, 89, 90, 86,
+  77, 90, 86, 74, 95, 78, 82, 84, 93, 90,
+  95, 87, 89, 81, 71, 86, 87, 87, 86, 85,
+  99, 86, 86, 67, 75, 96, 79, 91, 84, 82,
+  73, 82, 80, 72, 88, 80, 78, 84, 79, 81,
+  82, 77, 85, 91, 83, 87, 78, 85, 76, 85,
+  72, 90, 81, 81, 88, 86, 71, 84, 61, 69,
+  85, 82, 75, 71, 72, 83, 78, 85, 78, 90,
+  79, 87, 73, 86, 77, 79, 83, 69, 72, 82,
+  87, 81, 82, 90, 82, 75, 77, 74, 85, 92,
+  73, 64, 83, 74, 97, 87, 85, 83, 72, 77,
+  76, 73, 81, 67, 86, 95, 78, 89, 100, 75,
+  73, 83, 93, 78, 86, 79, 73, 81, 80, 80,
+  86, 76, 82, 81, 75, 80, 74, 80, 83, 83,
+  80, 81, 75, 80, 82, 81, 71, 85, 85, 82,
+  73, 86, 84, 79, 93, 80, 90, 77, 84, 83,
+  95, 82, 75, 97, 82, 67, 74, 94, 77, 86,
+  90, 77, 86, 90, 74, 84, 71, 88, 92, 96,
+  64, 77, 74, 89, 87, 75, 94, 93, 148, 76,
+  105, 95, 79, 87, 77, 83, 98, 97, 81, 40,
+  91, 45, 65, 79, 75, 65, 104, 85, 71, 69,
+  101, 75, 69, 84, 87, 88, 68, 100, 96, 91,
+  89, 76, 105, 71, 72, 71, 93, 89, 80, 104,
+  63, 56, 99, 86, 87, 79, 80, 84, 105, 46,
+  79, 84, 72, 99, 79, 97, 88, 85, 118, 80,
+  88, 111, 85, 81, 100, 75, 88, 80, 86, 73,
+  91, 99, 85, 81, 87, 103, 81, 86, 87, 80,
+  82, 84, 82, 85, 86, 102, 79, 87, 79, 94,
+  93, 90, 96, 85, 75, 85, 101, 92, 87, 93,
+  82, 94, 76, 76, 83, 80, 74, 81, 79, 79,
+  89, 86, 80, 82, 79, 76, 83, 87, 75, 92,
+  89, 91, 84, 82, 82, 84, 105, 69, 87, 90,
+  84, 72, 79, 89, 70, 69, 81, 78, 78, 69,
+  76, 87, 81, 85, 83, 79, 75, 86, 77, 96,
+  74, 80, 90, 71, 70, 82, 92, 77, 79, 81,
+  80, 81, 73, 76, 86, 89, 80, 70, 81, 73,
+  97, 82, 86, 78, 79, 82, 83, 71, 82, 66,
+  88, 81, 79, 87, 86, 74, 86, 88, 86, 81,
+  87, 81, 80, 80, 81, 83, 71, 85, 78, 96,
+  78, 82, 74, 84, 82, 85, 80, 80, 91, 79,
+  79, 93, 76, 87, 86, 81, 79, 89, 82, 81,
+  85, 82, 88, 73, 84, 82, 85, 68, 98, 88,
+  82, 74, 85, 76, 73, 89, 77, 66, 87, 94,
+  81, 93, 85, 79, 71, 72, 82, 88, 81, 90,
+  87, 86, 86, 89, 117, 87, 89, 79, 79, 81,
+  80, 66, 84, 74, 98, 73, 83, 77, 80, 92,
+  78, 80, 82, 80, 77, 69, 90, 105, 89, 80,
+  81, 111, 73, 80, 84, 77, 80, 77, 75, 57,
+  75, 64, 74, 84, 87, 74, 92, 79, 88, 88,
+  86, 86, 71, 80, 67, 82, 76, 72, 86, 89,
+  81, 82, 98, 88, 93, 78, 77, 78, 91, 77,
+  84, 71, 86, 81, 87, 90, 80, 81, 75, 78,
+  72, 78, 72, 89, 76, 76, 87, 77, 79, 87,
+  91, 77, 72, 85, 93, 91, 86, 74, 89, 83,
+  88, 79, 86, 79, 87, 81, 89, 85, 85, 64,
+  81, 77, 73, 93, 81, 68, 94, 99, 79, 88,
+  76, 80, 81, 91, 67, 77, 77, 96, 90, 78,
+  94, 92, 159, 82, 118, 87, 69, 85, 85, 77,
+  109, 91, 95, 43, 95, 66, 73, 91, 75, 63,
+  103, 80, 63, 52, 116, 98, 82, 75, 82, 109,
+  69, 90, 102, 89, 92, 67, 88, 59, 82, 59,
+  83, 87, 92, 102, 93, 64, 83, 86, 94, 74,
+  77, 79, 89, 55, 73, 93, 71, 95, 83, 88,
+  88, 93, 119, 72, 69, 98, 92, 82, 92, 68,
+  90, 82, 93, 79, 83, 99, 82, 79, 89, 105,
+  84, 85, 81, 72, 91, 85, 71, 90, 102, 88,
+  82, 92, 101, 103, 91, 85, 86, 78, 77, 91,
+  95, 88, 78, 87, 85, 83, 81, 71, 83, 78,
+  73, 89, 78, 70, 91, 94, 82, 92, 86, 72,
+  76, 80, 82, 86, 86, 97, 83, 83, 85, 88,
+  118, 80, 90, 82, 82, 66, 78, 81, 89, 69,
+  88, 74, 86, 78, 76, 91, 83, 80, 84, 69,
+  73, 76, 94, 99, 85, 77, 88, 93, 71, 77,
+  90, 75, 78, 76, 71, 59, 71, 64, 80, 86,
+  88, 71, 98, 78, 93, 85, 88, 87, 79, 77,
+  68, 79, 78, 70, 88, 80, 77, 81, 85, 78,
+  89, 82, 79, 76, 88, 81, 80, 72, 85, 85,
+  74, 89, 77, 91, 77, 80, 70, 76, 76, 83,
+  75, 73, 92, 77, 76, 92, 87, 76, 87, 84,
+  93, 91, 77, 79, 92, 84, 87, 75, 85, 78,
+  82, 72, 87, 90, 84, 98, 84, 81, 81, 81,
+  80, 70, 91, 87, 79, 85, 75, 80, 85, 80,
+  83, 89, 85, 87, 81, 88, 84, 84, 81, 87,
+  81, 84, 88, 91, 85, 79, 83, 79, 76, 80,
+  82, 70, 78, 87, 73, 90, 79, 88, 82, 83,
+  75, 93, 76, 83, 84, 87, 80, 85, 80, 78,
+  81, 96, 74, 77, 86, 76, 67, 83, 86, 76,
+  74, 71, 83, 89, 84, 89, 74, 82, 66, 72,
+  81, 73, 90, 89, 81, 78, 96, 88, 75, 85,
+  96, 84, 89, 79, 84, 81, 84, 81, 80, 82,
+  85, 70, 80, 79, 67, 69, 79, 82, 83, 82,
+  83, 89, 86, 92, 77, 77, 93, 77, 73, 80,
+  81, 80, 91, 88, 92, 91, 79, 85, 84, 90,
+  73, 91, 86, 70, 80, 76, 88, 88, 84, 70,
+  92, 84, 78, 79, 68, 87, 94, 99, 75, 68,
+  78, 97, 87, 81, 92, 96, 137, 92, 102, 92,
+  91, 95, 95, 86, 98, 97, 78, 49, 93, 58,
+  79, 82, 79, 83, 99, 81, 77, 73, 100, 68,
+  69, 80, 89, 92, 79, 93, 97, 86, 88, 90,
+  87, 75, 82, 72, 78, 86, 97, 85, 72, 65,
+  86, 87, 89, 90, 83, 80, 85, 54, 81, 83,
+  75, 93, 75, 82, 84, 84, 100, 84, 96, 93,
+  97, 87, 89, 84, 88, 84, 92, 80, 91, 81,
+  89, 83, 90, 98, 96, 76, 91, 84, 82, 95,
+  80, 89, 80, 92, 91, 91, 82, 97, 94, 91,
+  95, 88, 83, 105, 96, 96, 78, 83, 80, 85,
+  79, 82, 77, 80, 82, 82, 83, 74, 95, 84,
+  80, 83, 77, 77, 90, 82, 78, 85, 91, 88,
+  82, 85, 79, 88, 95, 82, 83, 85, 87, 74,
+  87, 94, 88, 77, 83, 78, 87, 68, 81, 87,
+  79, 85, 80, 70, 81, 84, 78, 86, 73, 82,
+  91, 79, 78, 80, 84, 76, 79, 89, 73, 78,
+  82, 76, 77, 82, 86, 71, 94, 71, 87, 86,
+  82, 85, 77, 83, 62, 70, 80, 70, 90, 79,
+  76, 80, 80, 78, 78, 85, 91, 81, 88, 83,
+  81, 82, 87, 83, 75, 85, 82, 67, 81, 81,
+  67, 71, 80, 78, 73, 76, 85, 84, 83, 91,
+  71, 75, 85, 77, 79, 79, 75, 83, 88, 87,
+  87, 87, 81, 84, 84, 85, 78, 82, 98, 96,
+  82, 79, 79, 85, 79, 74, 87, 60, 88, 80,
+  78, 97, 79, 110, 85, 83, 83, 85, 76, 87,
+  73, 80, 93, 95, 114, 80, 72, 104, 79, 74,
+  74, 80, 74, 84, 70, 77, 86, 113, 66, 77,
+  84, 101, 80, 79, 90, 91, 92, 88, 79, 89,
+  84, 104, 93, 82, 100, 72, 87, 75, 90, 68,
+  89, 95, 85, 90, 76, 68, 75, 73, 77, 75,
+  83, 73, 85, 78, 108, 67, 69, 87, 92, 76,
+  85, 89, 113, 93, 78, 77, 85, 62, 86, 92,
+  85, 62, 79, 74, 69, 78, 89, 81, 84, 85,
+  80, 154, 84, 87, 83, 78, 77, 83, 112, 73,
+  89, 87, 86, 84, 87, 73, 81, 86, 102, 91,
+  83, 69, 82, 96, 76, 81, 101, 82, 85, 79,
+  74, 84, 80, 77, 99, 66, 93, 87, 80, 96,
+  80, 121, 84, 90, 79, 85, 82, 87, 72, 78,
+  86, 74, 118, 78, 71, 93, 77, 73, 69, 77,
+  71, 87, 75, 83, 86, 126, 71, 67, 85, 76,
+  73, 83, 90, 102, 101, 93, 77, 103, 82, 117,
+  95, 77, 96, 69, 87, 89, 77, 78, 96, 99,
+  87, 77, 85, 69, 68, 79, 81, 74, 80, 84,
+  83, 80, 112, 67, 72, 68, 94, 80, 80, 87,
+  119, 101, 74, 70, 86, 55, 76, 96, 83, 66,
+  82, 80, 64, 72, 88, 81, 86, 86, 79, 161,
+  86, 85, 89, 74, 79, 79, 112, 61, 77, 81,
+  84, 81, 85, 71, 75, 94, 109, 88, 81, 69,
+  83, 94, 80, 79, 100, 94, 76, 84, 79, 85,
+  82, 72, 87, 73, 88, 81, 78, 98, 82, 123,
+  80, 86, 87, 88, 84, 90, 82, 78, 86, 69,
+  107, 80, 75, 79, 81, 94, 83, 81, 65, 83,
+  74, 77, 84, 93, 69, 76, 80, 72, 81, 82,
+  94, 84, 89, 91, 89, 93, 84, 110, 92, 80,
+  100, 79, 88, 75, 86, 75, 103, 96, 79, 88,
+  97, 74, 80, 78, 80, 77, 86, 99, 92, 82,
+  107, 65, 75, 66, 86, 83, 81, 83, 113, 92,
+  82, 69, 86, 63, 87, 86, 90, 66, 80, 79,
+  72, 80, 81, 82, 84, 91, 82, 129, 86, 88,
+  80, 80, 81, 85, 91, 71, 82, 86, 82, 86,
+  78, 76, 75, 84, 95, 93, 79, 71, 91, 85,
+  81, 89, 72, 84, 82, 74, 85, 83, 87, 82,
+  85, 68, 87, 82, 85, 77, 77, 98, 78, 90,
+  77, 98, 78, 73, 69, 80, 79, 69, 98, 75,
+  77, 91, 82, 80, 88, 80, 81, 74, 83, 79,
+  86, 89, 72, 94, 74, 103, 82, 87, 77, 91,
+  101, 86, 86, 67, 73, 71, 90, 89, 106, 84,
+  77, 87, 72, 74, 102, 97, 82, 65, 73, 81,
+  71, 73, 73, 77, 94, 78, 70, 80, 90, 79,
+  83, 76, 74, 87, 85, 86, 105, 82, 70, 85,
+  84, 75, 87, 93, 87, 84, 80, 88, 58, 100,
+  82, 84, 85, 87, 79, 109, 83, 83, 92, 73,
+  79, 82, 92, 93, 77, 87, 78, 73, 89, 77,
+  82, 86, 90, 81, 85, 84, 95, 90, 78, 91,
+  73, 80, 86, 70, 82, 88, 91, 82, 80, 81,
+  86, 92, 85, 81, 80, 98, 84, 96, 83, 97,
+  81, 64, 76, 80, 77, 73, 88, 75, 80, 86,
+  82, 79, 89, 86, 80, 64, 96, 70, 84, 79,
+  81, 88, 75, 84, 82, 87, 83, 79, 105, 87,
+  86, 84, 83, 70, 91, 86, 112, 91, 78, 96,
+  63, 82, 108, 100, 83, 67, 77, 80, 70, 85,
+  69, 76, 93, 94, 70, 74, 88, 75, 83, 79,
+  65, 95, 80, 82, 87, 82, 70, 80, 81, 70,
+  85, 90, 88, 90, 78, 94, 62, 91, 75, 86,
+  90, 89, 77, 104, 84, 81, 82, 78, 77, 81,
+  80, 85, 85, 87, 77, 80, 84, 80, 79, 82,
+  70, 85, 86, 86, 86, 101, 78, 84, 79, 88,
+  79, 72, 79, 86, 87, 78, 95, 90, 84, 85,
+  80, 81, 78, 93, 82, 87, 85, 98, 87, 73,
+  78, 78, 76, 73, 90, 78, 78, 81, 73, 86,
+  84, 86, 78, 71, 87, 79, 77, 78, 79, 87,
+  75, 81, 87, 88, 80, 75, 94, 91, 87, 100,
+  77, 78, 89, 88, 109, 89, 81, 85, 75, 82,
+  114, 103, 77, 68, 87, 90, 75, 77, 72, 77,
+  95, 89, 71, 78, 92, 77, 85, 88, 75, 93,
+  81, 78, 95, 85, 71, 68, 85, 77, 84, 88,
+  87, 85, 79, 82, 63, 89, 80, 86, 88, 88,
+  87, 95, 88, 84, 75, 79, 81, 82, 68, 88,
+  87, 92, 83, 78, 73, 81, 79, 83, 83, 85,
+  83, 83, 89, 84, 83, 87, 57, 80, 86, 86,
+  89, 85, 91, 87, 82, 88, 78, 79, 91, 79,
+  79, 78, 85, 95, 78, 94, 81, 72, 85, 78,
+  94, 66, 78, 80, 85, 70, 73, 94, 99, 81,
+  89, 74, 87, 67, 81, 63, 86, 97, 80, 89,
+  98, 92, 70, 82, 89, 85, 88, 72, 80, 51,
+  76, 98, 100, 86, 79, 99, 74, 88, 88, 91,
+  94, 85, 73, 80, 82, 80, 74, 77, 95, 84,
+  87, 86, 73, 92, 84, 69, 64, 95, 83, 68,
+  75, 77, 77, 86, 77, 85, 94, 89, 91, 108,
+  90, 88, 69, 93, 79, 83, 89, 81, 79, 69,
+  75, 87, 89, 81, 90, 83, 72, 96, 87, 84,
+  80, 73, 93, 85, 82, 90, 87, 87, 90, 83,
+  85, 86, 76, 84, 62, 82, 85, 82, 97, 86,
+  93, 86, 67, 89, 80, 75, 92, 87, 83, 69,
+  91, 93, 84, 96, 85, 64, 93, 82, 92, 73,
+  73, 74, 85, 74, 80, 87, 100, 86, 88, 61,
+  90, 63, 83, 55, 90, 112, 85, 82, 104, 88,
+  81, 69, 88, 82, 89, 73, 93, 57, 77, 93,
+  97, 99, 81, 99, 69, 93, 84, 83, 84, 79,
+  73, 82, 87, 89, 68, 87, 101, 91, 87, 79,
+  71, 89, 89, 88, 59, 98, 86, 65, 69, 78,
+  79, 82, 77, 85, 96, 92, 88, 112, 88, 85,
+  80, 89, 74, 86, 89, 82, 85, 63, 78, 87,
+  82, 87, 90, 85, 68, 92, 91, 88, 78, 83,
+  93, 88, 83, 83, 77, 90, 93, 82, 81, 92,
+  81, 84, 61, 83, 87, 81, 86, 84, 92, 83,
+  85, 90, 76, 81, 88, 79, 78, 64, 85, 89,
+  79, 94, 87, 69, 87, 78, 92, 77, 82, 82,
+  82, 86, 72, 88, 94, 84, 87, 73, 90, 69,
+  79, 61, 89, 95, 82, 87, 106, 88, 72, 73,
+  87, 82, 88, 82, 79, 53, 81, 94, 99, 90,
+  83, 96, 78, 91, 86, 87, 85, 79, 82, 88,
+  82, 85, 63, 80, 89, 78, 85, 85, 76, 92,
+  87, 99, 64, 96, 85, 68, 72, 79, 78, 85,
+  84, 84, 97, 89, 89, 104, 79, 84, 74, 87,
+  81, 87, 89, 81, 86, 64, 77, 89, 82, 83,
+  90, 82, 65, 94, 83, 89, 83, 77, 80, 88,
+  82, 90, 80, 88, 89, 83, 83, 75, 81, 73,
+  90, 93, 88, 75, 91, 58, 95, 73, 88, 73,
+  79, 103, 71, 85, 96, 82, 73, 78, 84, 76,
+  90, 77, 81, 72, 92, 87, 98, 85, 93, 101,
+  94, 81, 89, 88, 81, 81, 81, 100, 87, 95,
+  77, 84, 99, 99, 82, 80, 81, 77, 81, 89,
+  84, 88, 75, 87, 74, 92, 95, 85, 84, 81,
+  91, 83, 71, 75, 86, 78, 80, 97, 73, 89,
+  86, 84, 68, 87, 78, 80, 86, 74, 85, 82,
+  85, 79, 75, 85, 91, 86, 67, 83, 84, 75,
+  76, 78, 76, 97, 77, 76, 80, 86, 85, 84,
+  87, 82, 85, 89, 77, 81, 87, 81, 86, 77,
+  82, 74, 89, 92, 86, 89, 84, 89, 88, 82,
+  80, 81, 97, 84, 85, 80, 85, 65, 95, 84,
+  91, 68, 79, 60, 95, 77, 87, 83, 79, 90,
+  72, 84, 99, 91, 78, 77, 82, 67, 86, 73,
+  82, 74, 89, 87, 105, 77, 90, 100, 92, 85,
+  79, 73, 89, 76, 77, 103, 79, 101, 82, 77,
+  89, 86, 73, 76, 79, 74, 76, 89, 80, 88,
+  76, 82, 76, 96, 98, 83, 83, 78, 82, 85,
+  77, 80, 83, 78, 86, 98, 67, 85, 92, 85,
+  59, 91, 73, 77, 90, 74, 87, 74, 93, 79,
+  79, 98, 85, 81, 64, 83, 92, 67, 71, 75,
+  79, 96, 85, 81, 72, 88, 88, 83, 63, 84,
+  94, 92, 83, 78, 83, 83, 91, 80, 88, 79,
+  86, 94, 86, 84, 77, 91, 83, 85, 78, 77,
+  94, 80, 86, 87, 93, 74, 92, 87, 86, 75,
+  86, 56, 92, 77, 83, 83, 80, 106, 74, 83,
+  96, 86, 84, 79, 89, 80, 79, 81, 87, 74,
+  86, 88, 91, 87, 95, 87, 92, 87, 87, 94,
+  79, 81, 81, 99, 79, 93, 86, 79, 90, 82,
+  81, 81, 82, 75, 77, 88, 88, 81, 77, 86,
+  74, 87, 95, 87, 87, 76, 94, 79, 76, 80,
+  88, 79, 84, 100, 79, 89, 97, 86, 71, 97,
+  77, 86, 86, 73, 89, 80, 83, 81, 78, 81,
+  89, 87, 70, 79, 84, 77, 74, 81, 84, 97,
+  92, 86, 85, 75, 86, 82, 79, 83, 78, 84,
+  81, 80, 83, 83, 84, 79, 85, 82, 85, 89,
+  82, 87, 77, 86, 82, 82, 83, 82, 91, 85,
+  82, 75, 73, 70, 78, 86, 94, 70, 97, 52,
+  89, 77, 77, 71, 82, 114, 73, 81, 81, 81,
+  78, 81, 87, 75, 90, 87, 82, 70, 91, 81,
+  95, 87, 101, 89, 92, 89, 78, 102, 82, 80,
+  73, 88, 83, 92, 74, 95, 98, 103, 83, 74,
+  86, 76, 80, 90, 88, 86, 78, 84, 83, 102,
+  87, 84, 82, 82, 98, 85, 75, 77, 100, 68,
+  96, 82, 77, 80, 87, 75, 76, 93, 80, 85,
+  83, 79, 79, 79, 82, 77, 69, 82, 83, 94,
+  61, 88, 77, 70, 66, 77, 90, 94, 86, 79,
+  79, 99, 88, 80, 88, 83, 86, 83, 81, 76,
+  87, 78, 80, 77, 76, 66, 79, 95, 82, 80,
+  83, 78, 80, 71, 83, 82, 90, 85, 83, 85,
+  84, 68, 83, 81, 94, 64, 89, 46, 86, 80,
+  84, 88, 86, 109, 82, 85, 82, 88, 77, 83,
+  80, 63, 81, 79, 79, 74, 93, 83, 102, 85,
+  114, 85, 91, 81, 70, 81, 88, 76, 75, 88,
+  83, 99, 77, 89, 105, 89, 74, 77, 91, 73,
+  77, 95, 83, 84, 81, 84, 79, 119, 90, 85,
+  83, 76, 77, 88, 88, 78, 98, 66, 73, 81,
+  61, 73, 97, 66, 82, 94, 66, 91, 89, 80,
+  81, 81, 85, 83, 75, 88, 76, 93, 60, 81,
+  87, 62, 53, 75, 96, 99, 88, 81, 71, 88,
+  91, 80, 76, 73, 96, 84, 88, 75, 88, 81,
+  85, 72, 76, 74, 78, 96, 97, 70, 78, 81,
+  78, 74, 87, 82, 96, 87, 78, 87, 104, 73,
+  83, 92, 92, 63, 89, 51, 85, 76, 77, 90,
+  85, 112, 74, 77, 80, 77, 80, 88, 89, 82,
+  78, 88, 86, 70, 83, 90, 88, 88, 95, 77,
+  81, 80, 76, 109, 78, 77, 79, 81, 85, 90,
+  81, 85, 95, 79, 83, 75, 85, 81, 78, 87,
+  87, 80, 82, 85, 80, 94, 91, 90, 84, 81,
+  99, 80, 86, 80, 92, 76, 72, 84, 76, 85,
+  90, 77, 79, 94, 70, 88, 86, 77, 80, 97,
+  79, 83, 78, 82, 81, 97, 62, 83, 80, 71,
+  69, 80, 91, 96, 83, 86, 83, 71, 87, 78,
+  83, 86, 82, 80, 85, 78, 80, 81, 78, 68,
+  79, 79, 98, 92, 87, 83, 78, 78, 78, 71,
+  83, 87, 87, 85, 78, 80, 86, 68, 67, 89,
+  92, 66, 105, 55, 75, 82, 78, 75, 83, 124,
+  71, 77, 71, 77, 95, 84, 82, 85, 101, 89,
+  95, 70, 91, 82, 76, 92, 98, 86, 91, 102,
+  84, 118, 80, 87, 83, 80, 84, 85, 76, 107,
+  93, 98, 92, 81, 78, 72, 85, 89, 90, 87,
+  80, 82, 98, 97, 77, 87, 88, 88, 109, 76,
+  78, 82, 94, 74, 99, 71, 104, 85, 81, 79,
+  81, 91, 86, 79, 80, 87, 80, 80, 78, 73,
+  66, 74, 91, 98, 64, 100, 78, 70, 73, 84,
+  87, 90, 92, 97, 84, 100, 83, 72, 83, 94,
+  79, 77, 74, 82, 83, 68, 67, 103, 77, 72,
+  71, 91, 85, 78, 79, 76, 88, 64, 82, 88,
+  88, 87, 77, 87, 92, 68, 61, 76, 90, 64,
+  117, 49, 68, 86, 87, 86, 86, 123, 79, 73,
+  58, 69, 88, 86, 80, 81, 89, 84, 99, 77,
+  93, 86, 64, 102, 111, 74, 87, 86, 81, 125,
+  77, 90, 84, 74, 90, 84, 74, 115, 109, 89,
+  82, 89, 78, 75, 79, 88, 88, 81, 78, 89,
+  88, 98, 75, 86, 85, 80, 96, 76, 86, 73,
+  100, 75, 82, 67, 91, 79, 84, 62, 97, 90,
+  73, 86, 80, 83, 74, 95, 68, 78, 72, 73,
+  86, 101, 53, 93, 77, 66, 60, 77, 87, 91,
+  107, 98, 83, 89, 80, 70, 95, 85, 82, 72,
+  71, 83, 79, 70, 64, 76, 77, 72, 84, 94,
+  105, 69, 83, 73, 84, 69, 87, 88, 89, 96,
+  77, 85, 93, 71, 72, 86, 92, 62, 98, 60,
+  75, 80, 84, 95, 88, 118, 78, 72, 71, 74,
+  86, 87, 93, 87, 87, 85, 95, 72, 89, 92,
+  76, 91, 93, 84, 74, 78, 79, 121, 80, 85,
+  87, 76, 98, 85, 80, 93, 85, 81, 93, 85,
+  79, 77, 84, 86, 87, 76, 75, 88, 93, 97,
+  81, 90, 89, 85, 97, 75, 81, 86, 87, 84,
+  70, 76, 97, 96, 80, 81, 80, 94, 78, 78,
+  84, 88, 69, 100, 76, 84, 97, 81, 88, 93,
+  63, 89, 82, 70, 74, 85, 86, 90, 95, 84,
+  84, 79, 84, 72, 80, 95, 86, 78, 77, 78,
+  73, 72, 69, 68, 77, 88, 102, 95, 85, 85,
+  83, 75, 89, 70, 84, 95, 88, 88, 93, 76,
+  88, 75, 77, 86, 89, 76, 83, 80, 82, 78,
+  77, 91, 91, 73, 89, 89, 70, 88, 80, 84,
+  96, 92, 74, 62, 85, 78, 94, 91, 82, 79,
+  90, 69, 87, 91, 82, 81, 98, 85, 92, 80,
+  91, 74, 85, 80, 92, 86, 63, 88, 92, 75,
+  89, 90, 88, 73, 71, 86, 80, 93, 80, 78,
+  83, 70, 88, 60, 88, 95, 67, 85, 74, 95,
+  77, 90, 69, 75, 75, 66, 88, 93, 80, 82,
+  82, 84, 66, 85, 93, 85, 62, 79, 86, 81,
+  82, 83, 90, 71, 74, 182, 87, 75, 72, 69,
+  82, 76, 95, 91, 65, 72, 82, 73, 92, 91,
+  82, 81, 74, 86, 82, 91, 86, 87, 90, 75,
+  73, 80, 97, 98, 86, 142, 100, 82, 77, 79,
+  82, 88, 89, 75, 83, 76, 84, 75, 81, 81,
+  86, 76, 85, 92, 76, 86, 87, 90, 85, 94,
+  73, 64, 87, 80, 88, 77, 81, 92, 82, 71,
+  99, 76, 80, 74, 88, 83, 81, 76, 86, 79,
+  77, 88, 91, 83, 66, 81, 80, 80, 96, 102,
+  93, 76, 74, 97, 80, 89, 80, 83, 80, 83,
+  83, 65, 85, 92, 69, 81, 75, 86, 83, 85,
+  71, 75, 72, 68, 97, 97, 84, 89, 82, 77,
+  63, 77, 84, 75, 68, 82, 90, 83, 80, 94,
+  91, 81, 83, 181, 90, 70, 67, 62, 81, 74,
+  90, 92, 65, 71, 86, 75, 92, 93, 87, 85,
+  76, 75, 74, 89, 82, 90, 86, 76, 72, 82,
+  108, 91, 87, 131, 89, 90, 75, 77, 83, 96,
+  87, 76, 86, 83, 81, 85, 84, 86, 91, 73,
+  88, 88, 72, 95, 88, 87, 80, 91, 73, 61,
+  87, 77, 83, 71, 76, 81, 93, 76, 97, 87,
+  84, 79, 85, 88, 85, 76, 93, 76, 85, 84,
+  87, 90, 71, 92, 89, 83, 87, 87, 83, 85,
+  72, 85, 88, 88, 79, 77, 83, 68, 96, 63,
+  93, 93, 68, 82, 90, 89, 77, 85, 74, 74,
+  79, 72, 99, 93, 81, 83, 88, 78, 71, 81,
+  84, 91, 64, 85, 88, 101, 82, 80, 94, 74,
+  75, 166, 86, 72, 72, 76, 81, 78, 92, 81,
+  69, 78, 86, 77, 91, 86, 83, 102, 66, 90,
+  80, 90, 88, 85, 72, 74, 73, 82, 92, 95,
+  88, 126, 88, 80, 75, 82, 80, 93, 90, 78,
+  88, 79, 82, 79, 87, 92, 86, 73, 89, 93,
+  78, 82, 84, 79, 89, 94, 78, 59, 89, 80,
+  93, 74, 86, 86, 96, 80, 68, 85, 71, 81,
+  93, 89, 79, 84, 95, 82, 78, 84, 94, 86,
+  64, 89, 99, 80, 90, 100, 86, 80, 74, 86,
+  73, 97, 74, 82, 83, 70, 85, 73, 81, 76,
+  87, 80, 88, 85, 80, 86, 72, 79, 77, 71,
+  81, 107, 80, 76, 83, 80, 75, 84, 97, 82,
+  65, 77, 84, 87, 74, 86, 94, 76, 77, 161,
+  89, 78, 69, 78, 78, 79, 87, 83, 78, 78,
+  78, 76, 86, 87, 83, 80, 63, 81, 81, 82,
+  85, 90, 84, 77, 70, 81, 97, 88, 91, 125,
+  81, 83, 75, 85, 79, 84, 91, 78, 91, 78,
+  83, 84, 85, 86, 83, 70, 86, 99, 86, 75,
+  88, 73, 86, 93, 82, 60, 89, 84, 90, 64,
+  90, 95, 91, 77, 68, 73, 64, 79, 94, 85,
+  78, 88, 91, 91, 74, 84, 97, 82, 66, 82,
+  93, 86, 96, 109, 89, 78, 75, 96, 79, 96,
+  77, 83, 84, 84, 82, 81, 82, 69, 88, 82,
+  74, 79, 80, 88, 73, 82, 71, 75, 78, 106,
+  86, 87, 78, 75, 71, 82, 84, 78, 68, 73,
+  89, 84, 76, 89, 81, 89, 86, 158, 92, 75,
+  67, 72, 82, 75, 81, 82, 82, 81, 74, 76,
+  89, 91, 88, 81, 69, 75, 75, 85, 88, 91,
+  79, 80, 70, 84, 109, 82, 92, 108, 88, 91,
+  84, 81, 79, 89, 85, 75, 88, 79, 81, 86,
+  80, 86, 86, 73, 89, 90, 76, 91, 87, 80,
+  92, 89, 77, 61, 85, 76, 87, 77, 84, 87,
+  94, 75, 89, 88, 77, 82, 95, 89, 84, 83,
+  92, 82, 82, 86, 91, 87, 73, 88, 99, 83,
+  89, 96, 85, 79, 76, 87, 78, 85, 72, 81,
+  84, 69, 91, 72, 86, 78, 82, 82, 84, 85,
+  78, 85, 76, 77, 79, 77, 82, 107, 80, 79,
+  89, 80, 79, 90, 83, 88, 65, 77, 85, 87,
+  76, 84, 91, 79, 80, 152, 84, 78, 74, 77,
+  78, 80, 86, 77, 73, 82, 78, 76, 91, 86,
+  86, 94, 71, 83, 85, 83, 89, 91, 78, 76,
+  70, 83, 93, 88, 92, 111, 87, 76, 75, 80,
+  87, 83, 91, 82, 85, 86, 82, 87, 78, 82,
+  93, 77, 97, 85, 71, 82, 84, 96, 79, 103,
+  79, 64, 99, 81, 87, 76, 90, 78, 104, 77,
+  88, 93, 87, 85, 91, 88, 94, 75, 95, 80,
+  85, 93, 91, 85, 68, 97, 93, 79, 86, 89,
+  81, 86, 74, 80, 71, 86, 66, 76, 83, 74,
+  91, 70, 86, 74, 87, 79, 95, 92, 78, 83,
+  74, 73, 81, 78, 92, 84, 85, 69, 90, 85,
+  77, 89, 96, 84, 71, 84, 79, 93, 79, 89,
+  97, 69, 70, 136, 78, 76, 82, 85, 88, 85,
+  82, 86, 80, 76, 75, 75, 85, 85, 89, 77,
+  66, 86, 73, 85, 83, 97, 85, 74, 71, 84,
+  81, 84, 91, 120, 82, 79, 76, 83, 90, 82,
+  92, 80, 81, 84, 85, 90, 74, 89, 95, 74,
+  92, 86, 75, 78, 85, 90, 81, 98, 77, 63,
+  96, 78, 87, 83, 91, 76, 96, 79, 78, 87,
+  86, 82, 91, 85, 95, 67, 92, 82, 82, 84,
+  86, 89, 67, 95, 86, 79, 86, 93, 78, 78,
+  70, 88, 74, 96, 71, 76, 87, 79, 94, 75,
+  94, 75, 83, 87, 75, 85, 76, 83, 74, 74,
+  77, 75, 89, 79, 87, 80, 88, 88, 73, 92,
+  85, 87, 67, 84, 84, 91, 76, 86, 93, 68,
+  75, 130, 76, 75, 88, 92, 92, 81, 78, 87,
+  91, 75, 74, 72, 84, 86, 86, 83, 75, 95,
+  79, 90, 86, 98, 94, 76, 73, 85, 82, 81,
+  88, 111, 86, 85, 88, 82, 86, 81, 88, 81,
+  90, 81, 83, 95, 74, 91, 90, 74, 98, 85,
+  74, 87, 89, 92, 86, 98, 81, 64, 95, 78,
+  81, 88, 88, 76, 101, 75, 90, 90, 89, 88,
+  87, 89, 91, 78, 89, 83, 83, 90, 92, 82,
+  77, 92, 91, 83, 88, 85, 79, 69, 80, 84,
+  75, 83, 68, 74, 85, 78, 86, 72, 89, 76,
+  87, 83, 72, 87, 73, 82, 75, 75, 80, 75,
+  78, 87, 86, 72, 94, 88, 83, 102, 77, 86,
+  77, 85, 83, 84, 77, 90, 87, 70, 73, 128,
+  84, 73, 81, 75, 84, 85, 83, 83, 78, 83,
+  81, 79, 92, 82, 87, 88, 78, 89, 85, 82,
+  84, 98, 90, 76, 73, 84, 84, 84, 89, 113,
+  118, 82, 96, 92, 92, 70, 80, 94, 82, 89,
+  82, 91, 79, 102, 72, 75, 88, 72, 92, 83,
+  84, 86, 83, 86, 103, 75, 88, 81, 85, 81,
+  75, 96, 79, 74, 66, 74, 96, 78, 77, 74,
+  84, 78, 82, 73, 74, 91, 98, 68, 90, 80,
+  86, 82, 88, 73, 78, 93, 73, 78, 80, 82,
+  89, 63, 91, 77, 49, 87, 94, 93, 85, 107,
+  64, 77, 78, 89, 92, 80, 83, 91, 80, 72,
+  79, 92, 94, 88, 79, 88, 79, 103, 97, 71,
+  76, 83, 62, 83, 81, 74, 90, 76, 76, 80,
+  78, 82, 82, 95, 75, 115, 99, 81, 84, 93,
+  90, 67, 84, 70, 94, 118, 106, 79, 67, 62,
+  80, 81, 67, 87, 85, 97, 73, 84, 115, 91,
+  81, 93, 90, 74, 82, 97, 75, 88, 80, 90,
+  70, 101, 72, 72, 90, 77, 81, 91, 85, 67,
+  86, 88, 82, 82, 87, 76, 94, 85, 69, 89,
+  71, 76, 72, 74, 98, 76, 81, 63, 84, 70,
+  81, 73, 76, 83, 100, 63, 84, 82, 87, 77,
+  91, 66, 78, 102, 88, 78, 79, 89, 85, 70,
+  98, 85, 63, 82, 76, 100, 71, 114, 86, 76,
+  79, 89, 100, 77, 87, 74, 99, 62, 74, 90,
+  80, 89, 78, 86, 69, 96, 94, 71, 81, 90,
+  71, 89, 85, 75, 82, 80, 81, 71, 77, 100,
+  74, 98, 72, 114, 108, 78, 85, 96, 84, 69,
+  80, 77, 101, 107, 91, 82, 61, 64, 72, 97,
+  62, 88, 83, 98, 69, 73, 119, 90, 67, 93,
+  90, 79, 83, 93, 82, 86, 85, 92, 85, 92,
+  75, 75, 82, 71, 89, 84, 91, 80, 77, 85,
+  84, 82, 87, 81, 83, 77, 68, 90, 80, 78,
+  79, 78, 90, 82, 92, 79, 87, 72, 86, 77,
+  75, 86, 94, 87, 89, 78, 86, 82, 92, 76,
+  81, 97, 79, 80, 82, 80, 88, 78, 93, 80,
+  57, 86, 73, 95, 87, 91, 96, 69, 79, 82,
+  99, 73, 86, 72, 92, 72, 85, 92, 88, 92,
+  77, 79, 69, 98, 91, 77, 79, 92, 62, 83,
+  79, 75, 90, 77, 94, 83, 79, 110, 81, 96,
+  80, 110, 99, 80, 84, 90, 70, 65, 79, 85,
+  80, 101, 77, 78, 68, 69, 81, 84, 81, 85,
+  90, 92, 72, 86, 93, 87, 84, 80, 78, 104,
+  75, 81, 87, 81, 76, 90, 94, 84, 85, 80,
+  82, 82, 77, 71, 85, 82, 75, 78, 104, 90,
+  72, 75, 83, 96, 72, 86, 85, 89, 80, 93,
+  80, 73, 81, 106, 79, 77, 77, 83, 74, 87,
+  85, 84, 80, 92, 69, 77, 90, 66, 76, 79,
+  70, 70, 83, 94, 76, 79, 76, 73, 76, 95,
+  74, 102, 79, 90, 80, 86, 87, 64, 88, 87,
+  80, 93, 71, 95, 81, 85, 85, 87, 84, 77,
+  84, 98, 77, 88, 93, 75, 74, 83, 77, 92,
+  79, 86, 93, 81, 75, 77, 74, 85, 81, 107,
+  92, 87, 79, 96, 82, 77, 89, 74, 79, 94,
+  103, 85, 84, 66, 88, 82, 80, 87, 93, 92,
+  73, 64, 78, 106, 70, 74, 73, 98, 84, 79,
+  82, 87, 72, 92, 88, 74, 86, 95, 74, 97,
+  78, 79, 86, 65, 90, 83, 90, 108, 72, 73,
+  87, 81, 81, 82, 85, 84, 86, 79, 78, 72,
+  71, 96, 73, 73, 78, 91, 61, 86, 89, 77,
+  61, 103, 68, 73, 90, 55, 76, 82, 82, 79,
+  83, 119, 72, 84, 71, 83, 82, 87, 76, 110,
+  64, 92, 71, 85, 87, 75, 99, 103, 91, 82,
+  91, 93, 83, 87, 74, 78, 88, 78, 71, 88,
+  80, 100, 94, 78, 95, 93, 72, 114, 72, 78,
+  100, 70, 71, 88, 68, 83, 92, 83, 105, 90,
+  75, 101, 81, 84, 85, 74, 82, 76, 84, 94,
+  98, 73, 80, 105, 74, 88, 102, 89, 82, 61,
+  98, 93, 83, 84, 77, 82, 79, 82, 88, 82,
+  79, 95, 94, 83, 87, 83, 74, 81, 78, 80,
+  88, 88, 97, 79, 89, 91, 75, 76, 81, 73,
+  73, 87, 85, 80, 94, 89, 77, 70, 78, 104,
+  80, 74, 87, 87, 78, 79, 85, 97, 72, 92,
+  76, 78, 88, 69, 78, 78, 76, 71, 81, 91,
+  77, 89, 80, 74, 85, 92, 80, 100, 81, 89,
+  88, 82, 87, 62, 91, 84, 81, 83, 84, 96,
+  84, 83, 84, 91, 81, 79, 73, 93, 76, 86,
+  89, 78, 75, 86, 78, 93, 81, 88, 93, 85,
+  80, 93, 74, 85, 83, 98, 99, 88, 80, 90,
+  79, 75, 89, 88, 77, 82, 85, 89, 87, 69,
+  79, 83, 82, 85, 93, 86, 74, 72, 96, 83,
+  85, 86, 82, 84, 73, 81, 89, 84, 83, 87,
+  82, 80, 87, 81, 85, 86, 77, 77, 90, 84,
+  80, 70, 95, 88, 85, 81, 79, 80, 77, 83,
+  88, 90, 85, 95, 90, 83, 84, 97, 88, 96,
+  97, 83, 81, 84, 80, 88, 85, 86, 69, 84,
+  77, 83, 75, 81, 77, 82, 83, 86, 83, 80,
+  81, 83, 84, 93, 82, 92, 84, 91, 94, 86,
+  86, 70, 78, 83, 85, 78, 71, 106, 84, 81,
+  87, 88, 86, 83, 75, 92, 80, 80, 89, 85,
+  81, 80, 81, 93, 94, 90, 94, 88, 85, 91,
+  81, 84, 76, 91, 74, 89, 85, 73, 79, 89,
+  89, 77, 80, 83, 80, 83, 95, 80, 87, 83,
+  93, 80, 94, 89, 84, 75, 85, 88, 87, 73,
+  72, 94, 75, 76, 83, 87, 85, 82, 79, 84,
+  84, 98, 83, 97, 74, 82, 92, 73, 88, 76,
+  81, 88, 86, 77, 79, 68, 79, 80, 84, 96,
+  79, 81, 95, 92, 80, 91, 86, 97, 93, 90,
+  69, 91, 85, 79, 77, 95, 72, 90, 72, 74,
+  73, 87, 88, 86, 88, 101, 82, 81, 81, 85,
+  88, 90, 86, 91, 81, 96, 89, 84, 93, 83,
+  87, 93, 86, 75, 73, 110, 86, 77, 78, 82,
+  86, 87, 72, 87, 82, 85, 88, 97, 94, 80,
+  81, 105, 84, 87, 92, 81, 80, 87, 75, 82,
+  76, 87, 76, 91, 79, 74, 86, 89, 81, 75,
+  90, 77, 85, 94, 101, 83, 78, 93, 85, 81,
+  94, 85, 86, 75, 91, 81, 87, 83, 84, 75,
+  74, 79, 90, 86, 87, 88, 85, 88, 87, 83,
+  84, 82, 77, 80, 95, 84, 81, 71, 89, 85,
+  83, 82, 76, 72, 74, 82, 87, 85, 87, 92,
+  92, 85, 86, 96, 87, 93, 91, 82, 79, 82,
+  80, 87, 81, 87, 75, 87, 75, 87, 73, 74,
+  74, 81, 85, 90, 85, 83, 84, 80, 87, 95,
+  93, 94, 91, 93, 83, 86, 91, 66, 82, 86,
+  84, 79, 71, 111, 83, 76, 87, 90, 84, 84,
+  78, 92, 77, 80, 89, 79, 82, 85, 83, 95,
+  94, 89, 88, 89, 85, 81, 79, 84, 74, 91,
+  76, 89, 86, 71, 85, 85, 89, 80, 81, 87,
+  93, 89, 97, 79, 75, 88, 97, 78, 93, 87,
+  82, 75, 88, 71, 68, 90, 86, 62, 84, 80,
+  73, 95, 79, 57, 84, 71, 77, 79, 66, 89,
+  95, 78, 96, 102, 104, 108, 106, 94, 83, 89,
+  90, 85, 88, 74, 92, 64, 46, 64, 65, 73,
+  105, 69, 74, 92, 61, 69, 87, 94, 91, 55,
+  92, 92, 79, 68, 86, 80, 104, 57, 78, 75,
+  81, 74, 118, 81, 75, 87, 44, 87, 167, 92,
+  90, 133, 15, 90, 85, 91, 86, 83, 96, 129,
+  53, 79, 77, 85, 89, 71, 78, 97, 78, 123,
+  57, 80, 85, 68, 95, 76, 83, 71, 87, 77,
+  94, 88, 60, 69, 86, 90, 93, 97, 90, 90,
+  95, 98, 85, 92, 87, 71, 65, 143, 119, 86,
+  104, 89, 96, 97, 88, 82, 102, 82, 83, 114,
+  80, 87, 86, 89, 86, 58, 80, 93, 84, 86,
+  84, 69, 73, 58, 78, 93, 81, 77, 78, 88,
+  79, 81, 78, 77, 87, 81, 83, 83, 101, 97,
+  84, 77, 74, 69, 55, 73, 103, 88, 103, 68,
+  98, 72, 79, 77, 80, 77, 83, 56, 80, 71,
+  90, 80, 90, 84, 84, 99, 79, 96, 81, 79,
+  87, 75, 109, 107, 79, 84, 83, 79, 82, 104,
+  72, 78, 98, 92, 78, 69, 83, 58, 104, 60,
+  83, 95, 79, 78, 81, 98, 63, 80, 78, 79,
+  87, 91, 86, 76, 90, 74, 85, 80, 91, 74,
+  85, 78, 82, 90, 80, 89, 79, 92, 91, 81,
+  90, 84, 80, 76, 97, 81, 57, 78, 84, 89,
+  82, 84, 86, 81, 94, 83, 75, 77, 83, 85,
+  108, 88, 83, 82, 79, 103, 89, 84, 75, 73,
+  81, 80, 73, 97, 87, 90, 85, 87, 84, 83,
+  87, 77, 78, 84, 89, 81, 90, 91, 79, 86,
+  74, 79, 62, 95, 77, 95, 81, 82, 94, 69,
+  73, 89, 85, 82, 82, 69, 75, 80, 90, 99,
+  91, 93, 75, 85, 81, 93, 82, 79, 80, 81,
+  104, 93, 100, 68, 70, 84, 75, 83, 84, 82,
+  88, 82, 78, 83, 88, 78, 92, 75, 94, 81,
+  80, 93, 84, 89, 82, 74, 92, 80, 80, 82,
+  84, 86, 79, 78, 84, 81, 84, 78, 87, 72,
+  83, 86, 81, 80, 89, 83, 79, 85, 87, 74,
+  80, 90, 88, 80, 84, 81, 78, 82, 93, 84,
+  83, 90, 89, 83, 79, 81, 90, 76, 91, 90,
+  73, 101, 77, 82, 72, 93, 81, 67, 102, 79,
+  70, 77, 75, 81, 86, 83, 86, 102, 109, 92,
+  99, 87, 71, 89, 102, 94, 78, 83, 84, 80,
+  81, 112, 82, 83, 97, 85, 86, 105, 81, 72,
+  92, 97, 81, 98, 84, 77, 84, 85, 80, 78,
+  77, 74, 72, 54, 83, 79, 93, 80, 76, 65,
+  66, 80, 104, 68, 93, 81, 92, 105, 79, 82,
+  88, 74, 81, 131, 46, 105, 78, 78, 91, 98,
+  74, 94, 88, 101, 61, 72, 96, 63, 84, 70,
+  85, 77, 79, 75, 87, 89, 73, 48, 78, 87,
+  78, 79, 87, 82, 71, 74, 84, 80, 74, 86,
+  63, 110, 103, 81, 93, 72, 91, 85, 90, 79,
+  103, 75, 80, 89, 97, 74, 46, 79, 78, 78,
+  90, 71, 75, 95, 83, 70, 88, 47, 75, 78,
+  74, 70, 77, 75, 81, 75, 79, 92, 95, 82,
+  87, 92, 84, 85, 85, 70, 82, 74, 78, 85,
+  92, 73, 123, 71, 80, 94, 88, 73, 85, 99,
+  75, 67, 82, 68, 83, 74, 99, 79, 86, 129,
+  68, 70, 79, 81, 100, 82, 89, 101, 71, 87,
+  101, 72, 93, 94, 106, 99, 80, 91, 77, 78,
+  76, 112, 96, 71, 83, 91, 84, 66, 77, 88,
+  75, 99, 72, 84, 84, 78, 87, 74, 92, 82,
+  77, 81, 107, 89, 82, 78, 87, 90, 96, 90,
+  85, 86, 94, 78, 70, 95, 79, 72, 72, 119,
+  76, 86, 88, 96, 95, 89, 90, 79, 92, 87,
+  90, 88, 83, 74, 79, 85, 82, 69, 79, 89,
+  76, 81, 83, 73, 66, 69, 78, 95, 77, 76,
+  77, 82, 70, 73, 81, 79, 78, 75, 96, 82,
+  84, 97, 89, 78, 77, 77, 76, 77, 80, 90,
+  85, 68, 97, 77, 82, 85, 87, 75, 81, 60,
+  78, 77, 91, 89, 93, 86, 79, 113, 80, 90,
+  87, 83, 86, 86, 103, 100, 89, 70, 75, 83,
+  91, 88, 96, 87, 82, 87, 82, 83, 80, 77,
+  110, 58, 88, 93, 77, 86, 82, 93, 73, 73,
+  91, 85, 79, 97, 81, 75, 83, 75, 82, 85,
+  94, 79, 94, 66, 87, 87, 88, 85, 78, 89,
+  90, 79, 80, 91, 80, 82, 82, 87, 69, 85,
+  73, 91, 84, 86, 84, 86, 79, 92, 81, 88,
+  75, 88, 108, 94, 75, 80, 76, 88, 78, 83,
+  82, 91, 88, 83, 61, 79, 75, 78, 84, 97,
+  83, 96, 87, 76, 88, 84, 78, 81, 97, 88,
+  74, 89, 80, 76, 78, 95, 83, 87, 67, 91,
+  91, 90, 84, 92, 82, 90, 87, 100, 83, 77,
+  92, 96, 79, 82, 69, 79, 87, 62, 86, 80,
+  80, 85, 91, 70, 92, 72, 80, 73, 82, 83,
+  101, 82, 82, 83, 89, 78, 75, 65, 67, 90,
+  84, 87, 72, 95, 75, 88, 83, 78, 79, 86,
+  99, 77, 84, 69, 77, 78, 82, 68, 77, 83,
+  85, 75, 76, 85, 79, 85, 84, 86, 75, 70,
+  92, 68, 78, 81, 79, 75, 72, 72, 88, 84,
+  83, 91, 90, 87, 97, 87, 72, 75, 87, 74,
+  78, 81, 78, 97, 83, 70, 77, 84, 81, 91,
+  99, 77, 80, 74, 79, 82, 81, 84, 90, 81,
+  87, 79, 83, 81, 82, 89, 84, 99, 77, 84,
+  88, 82, 74, 110, 79, 80, 85, 89, 79, 98,
+  97, 89, 79, 94, 75, 100, 88, 87, 76, 85,
+  88, 78, 75, 83, 73, 56, 83, 83, 84, 89,
+  80, 84, 97, 76, 84, 84, 87, 70, 129, 95,
+  85, 88, 77, 75, 75, 84, 72, 78, 87, 84,
+  88, 87, 79, 82, 88, 81, 71, 84, 90, 81,
+  87, 88, 84, 87, 81, 80, 92, 80, 84, 82,
+  85, 87, 74, 74, 83, 81, 69, 80, 77, 78,
+  74, 87, 77, 80, 78, 83, 90, 87, 87, 98,
+  84, 81, 92, 84, 87, 75, 84, 71, 71, 86,
+  86, 87, 82, 78, 76, 75, 83, 82, 89, 91,
+  85, 78, 73, 86, 79, 83, 86, 69, 79, 78,
+  82, 86, 91, 83, 85, 102, 91, 79, 90, 87,
+  84, 86, 82, 91, 83, 75, 79, 86, 90, 93,
+  75, 73, 82, 83, 89, 82, 78, 87, 87, 84,
+  81, 101, 77, 71, 91, 92, 88, 89, 83, 94,
+  90, 67, 79, 93, 84, 76, 94, 81, 84, 84,
+  81, 82, 72, 77, 94, 67, 85, 75, 85, 85,
+  85, 79, 86, 71, 78, 86, 83, 88, 83, 98,
+  77, 90, 83, 80, 95, 71, 85, 75, 88, 86,
+  83, 82, 82, 83, 82, 76, 75, 86, 82, 94,
+  80, 78, 79, 94, 76, 89, 84, 91, 83, 84,
+  83, 89, 86, 78, 93, 71, 93, 68, 69, 81,
+  82, 81, 73, 71, 81, 100, 89, 65, 84, 74,
+  82, 77, 56, 82, 83, 81, 77, 71, 80, 86,
+  72, 79, 103, 86, 95, 84, 85, 97, 87, 102,
+  80, 83, 78, 86, 80, 90, 89, 78, 101, 63,
+  80, 82, 106, 80, 72, 65, 75, 86, 68, 75,
+  86, 91, 69, 94, 87, 77, 87, 92, 84, 84,
+  76, 103, 96, 90, 96, 101, 74, 80, 91, 76,
+  76, 96, 86, 83, 79, 76, 68, 101, 110, 86,
+  86, 82, 72, 83, 75, 83, 90, 82, 80, 86,
+  87, 93, 93, 66, 82, 86, 79, 83, 98, 83,
+  85, 85, 71, 81, 94, 90, 66, 94, 88, 82,
+  78, 84, 85, 74, 87, 88, 75, 79, 60, 82,
+  77, 56, 81, 68, 79, 82, 80, 96, 76, 76,
+  83, 80, 86, 94, 77, 87, 72, 75, 79, 88,
+  78, 81, 88, 90, 67, 77, 70, 74, 84, 77,
+  90, 84, 88, 87, 101, 80, 77, 82, 75, 85,
+  66, 83, 80, 90, 72, 88, 91, 80, 77, 88,
+  89, 75, 84, 85, 71, 89, 82, 67, 89, 74,
+  71, 93, 86, 79, 77, 80, 68, 94, 71, 98,
+  100, 79, 67, 80, 83, 72, 88, 87, 85, 102,
+  84, 79, 80, 80, 70, 69, 86, 74, 89, 76,
+  65, 76, 91, 106, 75, 79, 88, 88, 88, 79,
+  92, 82, 71, 85, 88, 79, 89, 84, 88, 87,
+  76, 79, 84, 85, 75, 88, 97, 82, 89, 83,
+  88, 81, 100, 86, 85, 84, 65, 80, 84, 73,
+  85, 77, 83, 92, 93, 98, 82, 83, 88, 88,
+  91, 83, 89, 93, 75, 90, 80, 92, 100, 87,
+  72, 89, 74, 90, 78, 78, 91, 77, 76, 85,
+  78, 94, 99, 87, 69, 77, 96, 94, 87, 80,
+  89, 85, 78, 93, 91, 84, 79, 92, 70, 79,
+  79, 119, 86, 93, 109, 87, 80, 85, 97, 83,
+  82, 81, 84, 65, 78, 96, 76, 81, 78, 85,
+  71, 66, 101, 81, 81, 93, 90, 86, 85, 92,
+  101, 86, 91, 74, 67, 86, 80, 66, 110, 67,
+  79, 105, 80, 89, 87, 78, 75, 80, 77, 105,
+  64, 69, 91, 66, 86, 86, 87, 89, 94, 91,
+  70, 80, 88, 94, 99, 95, 93, 81, 91, 100,
+  111, 87, 102, 100, 98, 86, 98, 111, 94, 78,
+  84, 61, 71, 79, 95, 82, 67, 73, 78, 98,
+  92, 72, 91, 73, 91, 73, 49, 85, 94, 69,
+  74, 71, 78, 93, 63, 75, 118, 83, 105, 86,
+  77, 108, 88, 83, 72, 82, 74, 89, 97, 91,
+  94, 80, 92, 65, 75, 83, 105, 77, 75, 63,
+  72, 83, 65, 81, 80, 91, 78, 88, 96, 79,
+  84, 85, 70, 81, 79, 87, 83, 71, 88, 95,
+  68, 78, 86, 77, 75, 89, 80, 94, 77, 76,
+  65, 95, 100, 89, 87, 90, 76, 79, 69, 70,
+  99, 78, 67, 106, 84, 97, 91, 65, 72, 96,
+  83, 90, 91, 80, 85, 86, 73, 81, 92, 82,
+  65, 95, 83, 90, 74, 100, 88, 89, 88, 83,
+  79, 70, 59, 81, 75, 53, 75, 72, 68, 86,
+  86, 88, 82, 76, 76, 78, 81, 91, 78, 77,
+  81, 72, 90, 85, 75, 93, 108, 72, 71, 81,
+  72, 76, 73, 76, 101, 82, 82, 79, 94, 77,
+  75, 74, 69, 83, 86, 78, 88, 88, 71, 93,
+  86, 85, 72, 98, 93, 75, 81, 72, 66, 86,
+  70, 83, 82, 65, 72, 90, 88, 76, 80, 68,
+  53, 79, 71, 103, 93, 77, 83, 73, 72, 72,
+  97, 79, 83, 97, 77, 85, 77, 79, 68, 69,
+  92, 81, 92, 89, 59, 74, 82, 89, 73, 81,
+  88, 100, 84, 79, 88, 75, 74, 86, 86, 87,
+  84, 86, 85, 84, 75, 74, 73, 88, 75, 92,
+  72, 88, 81, 88, 82, 81, 101, 79, 79, 78,
+  66, 80, 78, 65, 78, 71, 71, 104, 98, 94,
+  66, 87, 100, 89, 98, 85, 92, 84, 77, 89,
+  83, 94, 114, 85, 80, 86, 74, 96, 77, 66,
+  106, 91, 79, 87, 61, 86, 108, 77, 79, 69,
+  84, 93, 83, 73, 79, 90, 71, 87, 81, 92,
+  85, 97, 65, 88, 77, 106, 88, 102, 111, 96,
+  87, 70, 101, 76, 74, 83, 90, 63, 69, 90,
+  69, 78, 84, 85, 71, 58, 119, 86, 82, 91,
+  89, 84, 83, 87, 96, 82, 104, 75, 69, 80,
+  83, 66, 106, 71, 81, 113, 80, 86, 105, 69,
+  85, 75, 81, 102, 75, 68, 93, 73, 77, 98,
+  85, 85, 100, 96, 66, 77, 96, 94, 81, 86,
+  89, 79, 79, 89, 119, 83, 102, 105, 91, 78,
+  93, 111, 88, 80, 86, 68, 79, 81, 91, 80,
+  76, 89, 83, 86, 96, 77, 86, 70, 81, 76,
+  69, 89, 83, 86, 70, 88, 74, 75, 86, 87,
+  87, 76, 90, 87, 89, 99, 81, 87, 83, 90,
+  63, 91, 90, 85, 84, 83, 88, 81, 80, 82,
+  90, 88, 78, 87, 73, 87, 83, 79, 84, 93,
+  87, 92, 93, 91, 78, 82, 93, 86, 81, 79,
+  96, 77, 91, 80, 82, 72, 81, 88, 90, 90,
+  78, 88, 78, 84, 77, 95, 78, 82, 86, 88,
+  91, 74, 84, 71, 97, 81, 86, 86, 89, 93,
+  84, 81, 72, 89, 94, 85, 84, 88, 90, 91,
+  93, 81, 83, 91, 72, 92, 83, 77, 98, 93,
+  90, 100, 104, 83, 85, 73, 73, 84, 86, 79,
+  85, 76, 60, 83, 86, 86, 86, 81, 85, 85,
+  83, 79, 84, 82, 80, 72, 80, 80, 73, 83,
+  92, 78, 67, 90, 70, 75, 84, 85, 84, 80,
+  86, 87, 90, 88, 73, 78, 82, 87, 87, 83,
+  97, 82, 80, 83, 84, 88, 78, 83, 97, 84,
+  79, 78, 70, 87, 79, 86, 86, 85, 77, 90,
+  88, 87, 83, 84, 69, 87, 72, 85, 99, 81,
+  94, 76, 72, 73, 83, 87, 87, 86, 91, 81,
+  84, 86, 68, 71, 90, 85, 84, 89, 79, 72,
+  92, 86, 82, 81, 93, 91, 83, 83, 86, 78,
+  81, 86, 90, 80, 84, 83, 81, 85, 86, 79,
+  75, 87, 69, 88, 84, 81, 96, 84, 87, 91,
+  98, 77, 90, 77, 74, 87, 82, 76, 90, 74,
+  66, 95, 92, 100, 74, 83, 93, 83, 90, 77,
+  94, 95, 71, 86, 82, 95, 88, 88, 80, 82,
+  69, 97, 83, 77, 93, 87, 77, 84, 80, 87,
+  95, 86, 82, 75, 92, 89, 87, 77, 86, 86,
+  86, 83, 86, 88, 89, 86, 80, 80, 71, 96,
+  88, 95, 109, 99, 88, 84, 87, 84, 68, 78,
+  89, 77, 77, 89, 67, 86, 83, 97, 87, 69,
+  90, 85, 87, 79, 83, 88, 90, 81, 93, 88,
+  83, 73, 91, 89, 82, 64, 97, 74, 81, 109,
+  84, 81, 106, 75, 78, 76, 87, 86, 76, 82,
+  88, 71, 85, 90, 74, 87, 95, 89, 77, 85,
+  84, 93, 96, 94, 85, 80, 84, 80, 98, 83,
+  93, 91, 85, 90, 91, 91, 85, 75, 86, 77,
+  82, 91, 91, 83, 86, 83, 84, 68, 74, 78,
+  72, 91, 82, 85, 89, 85, 81, 82, 90, 89,
+  80, 74, 78, 91, 93, 88, 84, 74, 89, 87,
+  68, 99, 85, 87, 83, 75, 85, 68, 90, 74,
+  81, 76, 96, 93, 84, 84, 101, 83, 73, 81,
+  78, 74, 89, 110, 86, 96, 79, 87, 67, 85,
+  96, 66, 84, 80, 84, 65, 87, 85, 92, 91,
+  81, 93, 80, 86, 84, 55, 93, 81, 78, 74,
+  75, 86, 86, 83, 99, 71, 95, 81, 77, 70,
+  83, 86, 87, 88, 84, 80, 78, 81, 80, 74,
+  89, 88, 110, 82, 83, 83, 93, 69, 75, 74,
+  72, 97, 92, 84, 74, 97, 89, 84, 80, 77,
+  85, 83, 75, 99, 80, 82, 77, 76, 83, 80,
+  96, 79, 92, 83, 93, 67, 71, 73, 79, 96,
+  83, 86, 92, 82, 82, 76, 79, 92, 76, 74,
+  74, 89, 81, 77, 83, 79, 89, 86, 73, 84,
+  86, 83, 80, 60, 85, 69, 85, 76, 89, 71,
+  103, 79, 91, 76, 104, 83, 68, 80, 77, 87,
+  105, 104, 90, 92, 73, 85, 63, 81, 83, 65,
+  86, 77, 81, 61, 76, 76, 95, 92, 84, 90,
+  79, 71, 86, 56, 98, 83, 82, 85, 71, 89,
+  77, 73, 99, 75, 90, 77, 78, 77, 77, 86,
+  94, 88, 84, 83, 80, 73, 76, 76, 85, 87,
+  112, 84, 88, 83, 97, 65, 76, 75, 77, 91,
+  72, 78, 70, 104, 74, 81, 62, 84, 81, 79,
+  67, 107, 81, 84, 82, 79, 84, 98, 91, 73,
+  90, 88, 76, 74, 79, 80, 72, 94, 83, 88,
+  84, 86, 86, 85, 89, 90, 83, 76, 80, 88,
+  86, 69, 80, 82, 89, 96, 86, 93, 86, 87,
+  88, 77, 83, 70, 86, 79, 80, 75, 93, 83,
+  82, 84, 90, 89, 77, 82, 82, 84, 88, 109,
+  92, 89, 77, 89, 70, 84, 99, 69, 90, 82,
+  80, 76, 82, 84, 87, 87, 82, 88, 83, 85,
+  94, 60, 91, 79, 83, 100, 82, 84, 81, 88,
+  96, 79, 97, 79, 74, 74, 77, 88, 86, 87,
+  83, 82, 88, 77, 83, 75, 90, 86, 105, 86,
+  85, 81, 97, 71, 81, 89, 77, 95, 80, 86,
+  77, 101, 71, 90, 80, 79, 81, 79, 77, 92,
+  80, 77, 84, 84, 82, 96, 88, 84, 81, 81,
+  89, 58, 69, 77, 64, 99, 81, 84, 89, 81,
+  67, 84, 87, 93, 78, 72, 89, 85, 95, 92,
+  86, 79, 83, 86, 81, 98, 86, 91, 82, 79,
+  87, 68, 86, 76, 75, 83, 99, 92, 86, 74,
+  105, 80, 79, 77, 77, 79, 88, 119, 80, 99,
+  81, 86, 64, 83, 88, 65, 83, 79, 87, 68,
+  93, 76, 106, 85, 84, 93, 77, 91, 90, 56,
+  102, 88, 86, 72, 74, 82, 85, 68, 111, 75,
+  105, 84, 67, 66, 87, 74, 85, 85, 89, 83,
+  70, 88, 83, 79, 90, 89, 108, 82, 87, 82,
+  88, 69, 85, 78, 77, 88, 99, 75, 77, 85,
+  93, 81, 92, 77, 86, 84, 80, 100, 75, 86,
+  74, 81, 82, 81, 106, 84, 80, 80, 98, 49,
+  64, 77, 75, 105, 79, 92, 95, 79, 71, 77,
+  80, 100, 74, 75, 92, 83, 98, 85, 87, 81,
+  92, 80, 85, 81, 84, 92, 79, 65, 85, 69,
+  77, 75, 86, 79, 107, 79, 96, 64, 122, 73,
+  72, 75, 70, 87, 103, 118, 78, 100, 76, 81,
+  58, 77, 78, 60, 88, 78, 83, 66, 85, 65,
+  110, 84, 87, 93, 82, 65, 90, 55, 105, 96,
+  91, 84, 72, 88, 78, 53, 125, 83, 108, 76,
+  70, 69, 83, 75, 93, 85, 84, 77, 65, 74,
+  79, 82, 86, 86, 115, 81, 106, 85, 101, 64,
+  85, 79, 78, 86, 77, 68, 72, 93, 83, 80,
+  71, 83, 78, 82, 73, 116, 74, 87, 81, 82,
+  83, 96, 83, 73, 82, 88, 81, 63, 74, 88,
+  68, 102, 81, 85, 86, 86, 80, 85, 89, 95,
+  82, 73, 88, 82, 83, 78, 85, 87, 83, 90,
+  91, 91, 86, 93, 88, 76, 87, 71, 74, 78,
+  76, 77, 96, 87, 88, 72, 98, 83, 79, 78,
+  74, 82, 85, 115, 85, 90, 80, 85, 68, 83,
+  87, 66, 95, 84, 84, 78, 89, 73, 99, 81,
+  89, 88, 83, 78, 97, 59, 98, 91, 86, 100,
+  82, 84, 80, 75, 107, 82, 101, 77, 65, 70,
+  76, 76, 84, 82, 83, 81, 77, 73, 83, 81,
+  91, 86, 108, 87, 89, 79, 91, 67, 89, 89,
+  86, 94, 82, 77, 79, 91, 74, 85, 90, 79,
+  81, 82, 83, 94, 87, 80, 80, 82, 84, 95,
+  89, 90, 79, 80, 94, 76, 74, 81, 63, 95,
+  86, 88, 83, 82, 68, 84, 89, 85, 78, 69,
+  78, 76, 80, 96, 80, 78, 78, 83, 93, 95,
+  93, 84, 86, 85, 85, 69, 84, 80, 67, 85,
+  84, 100, 79, 75, 94, 81, 81, 73, 80, 81,
+  79, 109, 86, 90, 85, 87, 68, 83, 86, 80,
+  84, 81, 86, 78, 87, 81, 95, 86, 100, 85,
+  81, 90, 87, 62, 95, 87, 83, 74, 84, 81,
+  88, 82, 98, 81, 95, 87, 68, 69, 84, 73,
+  85, 84, 85, 71, 79, 93, 86, 83, 89, 78,
+  102, 80, 81, 78, 81, 80, 91, 85, 70, 86,
+  97, 77, 82, 78, 85, 86, 88, 74, 82, 92,
+  83, 93, 83, 82, 68, 83, 86, 84, 99, 94,
+  71, 79, 105, 70, 66, 77, 75, 97, 79, 93,
+  92, 84, 70, 81, 81, 91, 80, 76, 82, 74,
+  75, 90, 80, 83, 83, 76, 91, 85, 84, 86,
+  82, 77, 83, 71, 73, 81, 73, 79, 91, 83,
+  84, 72, 109, 76, 72, 72, 74, 82, 87, 103,
+  87, 89, 82, 85, 64, 75, 79, 73, 96, 80,
+  83, 73, 87, 75, 97, 84, 102, 88, 80, 74,
+  78, 66, 96, 89, 85, 78, 84, 82, 83, 70,
+  104, 85, 100, 75, 69, 71, 80, 68, 92, 81,
+  73, 68, 64, 83, 82, 83, 83, 77, 111, 81,
+  94, 82, 89, 77, 95, 82, 66, 89, 84, 69,
+  77, 81, 80, 83, 85, 80, 78, 87, 76, 105,
+  84, 74, 82, 84, 86, 96, 85, 88, 80, 84,
+  88, 83, 76, 85, 67, 98, 85, 91, 87, 88,
+  82, 87, 89, 87, 90, 70, 79, 76, 77, 86,
+  82, 86, 77, 84, 96, 93, 91, 84, 88, 82,
+  86, 72, 72, 80, 72, 84, 86, 82, 82, 74,
+  91, 81, 80, 72, 76, 85, 80, 109, 89, 82,
+  85, 86, 72, 88, 83, 82, 98, 83, 84, 91,
+  91, 80, 92, 84, 101, 84, 83, 92, 87, 65,
+  92, 90, 88, 90, 88, 81, 85, 86, 95, 86,
+  96, 78, 67, 71, 81, 73, 87, 82, 73, 75,
+  82, 70, 87, 84, 91, 78, 103, 85, 83, 76,
+  81, 76, 94, 90, 79, 93, 83, 78, 82, 81,
+  78, 88, 83, 75, 78, 92, 82, 88, 83, 87,
+  116, 94, 88, 81, 94, 83, 87, 87, 65, 87,
+  81, 104, 76, 73, 78, 51, 93, 84, 80, 97,
+  73, 77, 90, 82, 91, 81, 96, 84, 106, 103,
+  79, 75, 71, 91, 97, 92, 77, 81, 82, 57,
+  85, 99, 63, 98, 77, 68, 74, 84, 91, 93,
+  81, 77, 80, 87, 74, 82, 101, 80, 82, 79,
+  78, 73, 88, 65, 75, 81, 88, 73, 74, 65,
+  86, 83, 75, 76, 89, 84, 89, 70, 93, 82,
+  80, 80, 74, 95, 88, 81, 95, 84, 78, 75,
+  92, 87, 84, 81, 79, 79, 79, 79, 81, 77,
+  91, 76, 82, 104, 93, 97, 85, 79, 81, 80,
+  74, 77, 91, 111, 104, 75, 86, 122, 88, 84,
+  92, 72, 93, 86, 67, 72, 73, 94, 92, 88,
+  82, 84, 99, 85, 81, 94, 67, 86, 75, 93,
+  76, 74, 74, 45, 78, 81, 96, 79, 80, 81,
+  82, 81, 85, 81, 95, 79, 106, 99, 77, 80,
+  75, 88, 90, 84, 89, 78, 88, 46, 94, 89,
+  64, 102, 73, 77, 71, 90, 93, 88, 80, 75,
+  87, 99, 84, 83, 119, 74, 77, 81, 75, 72,
+  87, 68, 65, 75, 79, 68, 104, 55, 88, 89,
+  72, 89, 83, 80, 102, 77, 96, 85, 80, 78,
+  62, 91, 91, 80, 91, 95, 73, 78, 95, 79,
+  92, 81, 74, 77, 86, 83, 74, 73, 84, 76,
+  95, 106, 101, 89, 72, 79, 73, 85, 76, 87,
+  92, 114, 94, 78, 88, 140, 82, 77, 95, 72,
+  93, 92, 63, 67, 91, 93, 71, 92, 87, 75,
+  97, 92, 83, 89, 69, 81, 95, 81, 81, 72,
+  76, 59, 95, 80, 93, 80, 90, 83, 88, 83,
+  90, 84, 91, 76, 96, 103, 82, 96, 76, 88,
+  98, 92, 99, 81, 83, 58, 80, 97, 68, 92,
+  76, 87, 73, 87, 93, 83, 82, 77, 83, 90,
+  73, 88, 104, 79, 84, 78, 85, 76, 84, 70,
+  73, 85, 83, 71, 107, 66, 89, 83, 75, 75,
+  83, 82, 98, 70, 94, 79, 78, 83, 74, 86,
+  83, 84, 86, 94, 80, 73, 88, 89, 90, 79,
+  80, 84, 85, 73, 79, 85, 93, 76, 87, 102,
+  99, 92, 87, 80, 68, 83, 74, 92, 92, 103,
+  86, 75, 88, 114, 73, 81, 99, 76, 94, 78,
+  70, 77, 71, 85, 88, 79, 89, 90, 106, 84,
+  75, 89, 86, 91, 80, 85, 84, 72, 77, 77,
+  85, 88, 94, 85, 72, 67, 84, 95, 82, 85,
+  84, 76, 97, 74, 84, 77, 78, 92, 77, 81,
+  75, 76, 81, 66, 81, 90, 81, 92, 73, 75,
+  93, 78, 81, 89, 75, 86, 79, 71, 83, 70,
+  93, 91, 79, 87, 69, 76, 86, 81, 79, 94,
+  85, 70, 73, 71, 96, 84, 89, 75, 75, 87,
+  81, 71, 87, 83, 75, 79, 81, 84, 90, 70,
+  81, 74, 99, 80, 95, 97, 73, 88, 89, 87,
+  84, 84, 76, 78, 80, 82, 84, 76, 95, 93,
+  102, 69, 82, 87, 90, 87, 88, 102, 111, 76,
+  94, 95, 85, 76, 78, 79, 78, 93, 73, 76,
+  66, 94, 75, 71, 90, 79, 112, 81, 73, 88,
+  92, 94, 81, 75, 79, 75, 79, 89, 86, 87,
+  102, 57, 73, 65, 83, 98, 70, 87, 83, 79,
+  104, 80, 83, 81, 77, 84, 66, 74, 74, 70,
+  76, 61, 100, 92, 87, 110, 76, 81, 95, 76,
+  80, 77, 64, 83, 84, 79, 88, 70, 81, 103,
+  75, 87, 69, 78, 68, 69, 76, 102, 77, 66,
+  84, 75, 93, 88, 93, 76, 70, 77, 83, 81,
+  86, 86, 82, 80, 81, 82, 89, 69, 72, 89,
+  96, 80, 83, 108, 76, 93, 87, 84, 79, 84,
+  70, 82, 71, 85, 101, 65, 103, 90, 105, 68,
+  88, 95, 90, 83, 83, 96, 99, 84, 104, 86,
+  74, 81, 81, 79, 71, 97, 74, 78, 78, 83,
+  75, 78, 85, 76, 104, 85, 81, 90, 87, 90,
+  80, 76, 84, 71, 76, 79, 88, 84, 85, 79,
+  85, 72, 86, 94, 77, 90, 81, 85, 86, 80,
+  84, 87, 79, 84, 73, 81, 80, 74, 84, 64,
+  89, 88, 82, 94, 80, 92, 92, 76, 87, 85,
+  73, 84, 80, 91, 86, 79, 97, 90, 76, 86,
+  76, 79, 89, 86, 77, 95, 81, 72, 97, 72,
+  95, 83, 88, 77, 72, 83, 89, 72, 87, 84,
+  75, 85, 79, 81, 87, 76, 81, 83, 101, 78,
+  93, 95, 81, 82, 89, 88, 78, 80, 79, 83,
+  79, 83, 87, 79, 101, 89, 98, 76, 80, 81,
+  86, 90, 86, 93, 89, 78, 93, 93, 69, 76,
+  84, 84, 79, 86, 76, 78, 85, 86, 87, 78,
+  88, 98, 94, 82, 75, 89, 82, 89, 80, 70,
+  85, 67, 64, 84, 93, 83, 82, 82, 77, 67,
+  86, 99, 85, 86, 86, 84, 77, 76, 88, 84,
+  79, 92, 86, 76, 83, 79, 74, 84, 75, 87,
+  97, 90, 90, 88, 97, 74, 74, 87, 71, 78,
+  81, 84, 76, 79, 70, 81, 89, 86, 85, 83,
+  91, 96, 86, 88, 83, 84, 91, 89, 94, 84,
+  97, 73, 66, 80, 84, 82, 78, 90, 80, 82,
+  92, 78, 83, 81, 78, 78, 82, 80, 83, 97,
+  73, 89, 95, 89, 81, 81, 85, 91, 82, 85,
+  81, 83, 96, 85, 100, 80, 91, 90, 90, 91,
+  77, 89, 99, 78, 90, 82, 84, 80, 60, 86,
+  76, 88, 84, 85, 81, 91, 90, 71, 91, 91,
+  91, 80, 71, 87, 89, 91, 92, 74, 86, 72,
+  73, 91, 93, 81, 82, 66, 80, 71, 84, 98,
+  80, 86, 78, 83, 75, 70, 99, 94, 86, 84,
+  79, 74, 74, 79, 74, 80, 79, 91, 106, 91,
+  90, 93, 97, 73, 74, 83, 64, 79, 78, 78,
+  77, 78, 58, 96, 90, 78, 80, 82, 81, 90,
+  86, 90, 81, 89, 87, 95, 84, 81, 97, 73,
+  62, 87, 74, 93, 77, 96, 84, 84, 98, 81,
+  86, 84, 74, 81, 83, 80, 73, 103, 74, 86,
+  97, 88, 84, 90, 86, 95, 76, 85, 78, 78,
+  110, 85, 103, 82, 100, 91, 83, 83, 80, 84,
+  99, 88, 94, 67, 75, 83, 67, 84, 77, 85,
+  80, 91, 88, 76, 86, 78, 87, 79, 96, 84,
+  76, 90, 82, 87, 79, 85, 87, 65, 67, 80,
+  91, 77, 78, 87, 91, 71, 79, 95, 81, 87,
+  76, 79, 79, 75, 84, 91, 87, 88, 81, 79,
+  71, 78, 79, 83, 82, 88, 96, 88, 93, 89,
+  97, 72, 78, 90, 72, 74, 82, 78, 77, 82,
+  76, 79, 89, 88, 85, 84, 94, 96, 81, 89,
+  83, 84, 90, 85, 93, 83, 92, 73, 70, 91,
+  82, 82, 78, 88, 76, 87, 90, 73, 91, 83,
+  79, 85, 81, 81, 81, 95, 80, 82, 96, 89,
+  88, 79, 83, 88, 82, 85, 80, 85, 97, 82,
+  97, 79, 94, 91, 86, 84, 85, 92, 94, 79,
+  94, 81, 75, 84, 70, 89, 78, 87, 85, 81,
+  77, 84, 87, 87, 79, 93, 81, 86, 92, 89,
+  92, 81, 83, 85, 64, 95, 86, 84, 89, 87,
+  69, 88, 83, 91, 85, 76, 85, 91, 83, 78,
+  81, 86, 86, 95, 83, 90, 90, 81, 85, 88,
+  74, 86, 68, 85, 83, 79, 86, 86, 74, 93,
+  86, 80, 89, 75, 94, 85, 83, 100, 89, 81,
+  85, 82, 76, 100, 84, 89, 89, 84, 86, 88,
+  82, 81, 91, 78, 80, 94, 78, 101, 81, 84,
+  74, 85, 90, 88, 84, 92, 80, 79, 94, 80,
+  92, 94, 93, 75, 93, 71, 77, 84, 76, 98,
+  98, 88, 88, 87, 77, 72, 64, 88, 81, 83,
+  63, 79, 82, 73, 81, 80, 84, 90, 75, 65,
+  85, 85, 77, 82, 94, 94, 88, 93, 78, 90,
+  91, 84, 83, 82, 90, 79, 83, 89, 83, 80,
+  82, 92, 67, 88, 88, 83, 70, 85, 74, 81,
+  79, 90, 81, 73, 81, 78, 83, 79, 78, 77,
+  84, 91, 81, 85, 82, 79, 86, 89, 68, 88,
+  73, 96, 96, 73, 82, 85, 64, 92, 81, 88,
+  90, 66, 91, 88, 77, 97, 93, 74, 87, 69,
+  78, 95, 93, 80, 92, 86, 83, 108, 85, 88,
+  90, 79, 75, 87, 70, 85, 79, 84, 81, 82,
+  88, 86, 89, 98, 79, 85, 99, 85, 84, 88,
+  91, 67, 92, 80, 73, 82, 79, 95, 95, 89,
+  82, 86, 62, 78, 73, 87, 79, 92, 68, 82,
+  75, 74, 81, 87, 89, 92, 71, 66, 85, 75,
+  74, 81, 96, 102, 79, 81, 78, 85, 88, 87,
+  81, 83, 76, 86, 92, 92, 89, 82, 84, 81,
+  63, 91, 86, 80, 85, 84, 67, 85, 91, 91,
+  84, 70, 85, 94, 75, 84, 84, 80, 86, 88,
+  83, 82, 89, 86, 88, 82, 78, 82, 69, 85,
+  88, 79, 87, 99, 69, 92, 84, 81, 89, 76,
+  93, 84, 78, 99, 87, 83, 87, 82, 78, 94,
+  81, 84, 90, 93, 80, 88, 85, 84, 96, 78,
+  80, 93, 81, 86, 81, 80, 79, 80, 81, 83,
+  85, 96, 77, 81, 94, 80, 90, 94, 92, 74,
+  95, 76, 78, 81, 84, 95, 100, 82, 87, 86,
+  73, 76, 61, 89, 80, 83, 66, 79, 79, 84,
+  83, 85, 89, 85, 72, 72, 88, 86, 80, 82,
+  92, 96, 85, 87, 77, 85, 102, 87, 86, 90,
+  91, 79, 74, 85, 76, 84, 82, 100, 67, 91,
+  84, 80, 64, 90, 74, 78, 78, 93, 83, 77,
+  86, 79, 106, 85, 92, 85, 80, 94, 88, 97,
+  84, 70, 82, 95, 77, 94, 100, 93, 89, 85,
+  80, 79, 80, 82, 81, 79, 90, 67, 73, 88,
+  83, 93, 89, 76, 89, 75, 69, 91, 84, 83,
+  80, 80, 77, 90, 81, 76, 92, 97, 78, 84,
+  83, 107, 80, 79, 84, 74, 89, 90, 79, 93,
+  84, 85, 89, 86, 74, 90, 92, 76, 70, 85,
+  85, 77, 75, 90, 87, 88, 81, 86, 87, 75,
+  78, 87, 80, 82, 76, 91, 70, 75, 86, 84,
+  85, 98, 80, 83, 79, 65, 68, 87, 91, 88,
+  71, 78, 73, 87, 84, 76, 80, 76, 104, 73,
+  61, 83, 73, 85, 75, 95, 69, 101, 82, 79,
+  32, 85, 97, 70, 66, 89, 70, 72, 76, 56,
+  125, 90, 105, 80, 78, 92, 88, 88, 65, 62,
+  87, 90, 92, 88, 100, 102, 112, 84, 67, 93,
+  72, 87, 83, 75, 87, 60, 60, 85, 80, 89,
+  99, 76, 86, 58, 66, 90, 77, 81, 81, 91,
+  69, 75, 75, 73, 101, 107, 72, 79, 80, 93,
+  84, 74, 97, 68, 78, 84, 78, 101, 86, 76,
+  93, 96, 64, 82, 86, 69, 64, 102, 75, 73,
+  71, 76, 79, 90, 63, 85, 97, 82, 91, 82,
+  69, 89, 87, 100, 64, 81, 79, 107, 82, 111,
+  77, 100, 80, 55, 61, 83, 80, 91, 64, 65,
+  75, 80, 84, 83, 81, 75, 90, 79, 70, 83,
+  75, 83, 87, 76, 73, 90, 84, 80, 55, 87,
+  100, 72, 83, 89, 78, 74, 84, 73, 105, 91,
+  101, 84, 78, 89, 88, 78, 80, 76, 96, 90,
+  90, 89, 79, 97, 96, 90, 81, 108, 78, 80,
+  84, 81, 88, 71, 67, 90, 77, 88, 91, 78,
+  86, 70, 67, 88, 89, 82, 80, 91, 71, 77,
+  92, 74, 99, 96, 74, 77, 83, 87, 79, 78,
+  90, 74, 78, 80, 79, 94, 79, 83, 92, 88,
+  69, 91, 84, 77, 82, 96, 82, 76, 78, 86,
+  86, 86, 77, 84, 94, 86, 75, 90, 75, 84,
+  89, 91, 72, 89, 85, 92, 88, 90, 77, 92,
+  82, 62, 69, 82, 90, 88, 72, 73, 89, 91,
+  86, 90, 82, 73, 79, 76, 79, 81, 80, 83,
+  88, 93, 72, 84, 76, 87, 90, 89, 86, 90,
+  95, 86, 82, 81, 88, 89, 74, 87, 88, 93,
+  81, 87, 78, 111, 83, 80, 85, 85, 83, 81,
+  92, 84, 95, 86, 84, 84, 83, 80, 85, 70,
+  80, 86, 73, 81, 91, 89, 82, 78, 81, 80,
+  88, 86, 74, 82, 62, 89, 78, 81, 86, 84,
+  103, 102, 88, 89, 89, 98, 73, 71, 90, 75,
+  82, 89, 81, 92, 80, 88, 81, 84, 71, 79,
+  93, 87, 65, 83, 92, 81, 79, 82, 86, 85,
+  79, 81, 81, 86, 83, 92, 87, 80, 93, 99,
+  74, 87, 74, 80, 82, 89, 85, 85, 78, 74,
+  67, 83, 91, 83, 78, 83, 83, 87, 77, 77,
+  84, 77, 87, 70, 67, 78, 78, 82, 77, 89,
+  74, 90, 69, 100, 78, 87, 102, 82, 73, 74,
+  71, 75, 91, 72, 106, 89, 103, 95, 75, 89,
+  85, 106, 71, 87, 92, 66, 101, 80, 105, 98,
+  105, 100, 72, 98, 93, 67, 82, 64, 73, 83,
+  61, 85, 92, 80, 68, 75, 72, 81, 98, 90,
+  73, 76, 60, 96, 68, 66, 86, 88, 105, 117,
+  81, 75, 91, 98, 79, 62, 96, 74, 80, 91,
+  80, 94, 83, 82, 78, 88, 78, 73, 82, 89,
+  59, 96, 91, 76, 76, 66, 81, 78, 75, 78,
+  120, 80, 88, 94, 81, 68, 122, 113, 73, 80,
+  71, 84, 85, 104, 83, 104, 77, 68, 55, 75,
+  80, 75, 80, 74, 88, 73, 77, 88, 83, 89,
+  79, 76, 75, 78, 83, 82, 88, 76, 75, 83,
+  75, 88, 92, 85, 94, 87, 67, 81, 79, 81,
+  88, 79, 74, 87, 88, 104, 79, 92, 82, 88,
+  76, 84, 90, 77, 92, 83, 81, 88, 92, 88,
+  84, 98, 87, 72, 87, 71, 77, 93, 73, 86,
+  92, 87, 76, 82, 77, 87, 95, 89, 76, 84,
+  69, 97, 75, 72, 85, 83, 104, 100, 78, 87,
+  87, 89, 73, 73, 95, 77, 80, 89, 84, 93,
+  89, 94, 78, 83, 74, 81, 87, 91, 79, 86,
+  92, 82, 82, 84, 84, 83, 78, 77, 92, 88,
+  80, 91, 86, 78, 107, 93, 77, 83, 78, 84,
+  92, 87, 82, 85, 74, 74, 72, 78, 96, 76,
+  78, 78, 94, 63, 81, 85, 83, 73, 71, 77,
+  88, 83, 91, 81, 83, 72, 85, 68, 73, 81,
+  85, 101, 81, 82, 85, 71, 95, 89, 87, 83,
+  93, 89, 78, 86, 80, 83, 72, 81, 80, 79,
+  90, 73, 85, 78, 77, 89, 92, 73, 77, 67,
+  79, 82, 69, 88, 84, 80, 85, 79, 73, 84,
+  74, 79, 99, 75, 88, 82, 92, 74, 69, 88,
+  88, 76, 73, 100, 85, 78, 84, 110, 95, 71,
+  78, 76, 81, 88, 85, 100, 103, 81, 89, 84,
+  86, 89, 74, 91, 85, 80, 84, 83, 78, 83,
+  80, 75, 87, 75, 86, 89, 84, 81, 76, 102,
+  81, 107, 83, 83, 94, 79, 77, 91, 81, 69,
+  70, 70, 88, 95, 88, 98, 98, 98, 90, 74,
+  97, 72, 68, 85, 88, 74, 72, 77, 83, 89,
+  98, 78, 81, 82, 83, 66, 76, 86, 93, 105,
+  79, 83, 83, 74, 89, 96, 84, 84, 86, 81,
+  80, 84, 73, 92, 76, 79, 76, 72, 77, 67,
+  79, 76, 80, 88, 95, 73, 70, 67, 83, 74,
+  59, 80, 79, 76, 94, 74, 79, 92, 67, 81,
+  111, 87, 90, 85, 89, 79, 61, 98, 95, 84,
+  72, 105, 94, 80, 91, 116, 94, 72, 86, 77,
+  78, 84, 80, 87, 120, 71, 78, 94, 85, 93,
+  72, 100, 92, 91, 93, 88, 78, 78, 86, 74,
+  93, 87, 89, 92, 83, 85, 77, 99, 87, 102,
+  80, 88, 97, 85, 83, 94, 65, 75, 69, 67,
+  83, 91, 77, 96, 97, 96, 98, 71, 91, 83,
+  64, 84, 83, 90, 73, 77, 93, 84, 81, 80,
+  84, 92, 86, 67, 73, 78, 81, 91, 86, 90,
+  76, 73, 76, 86, 93, 85, 95, 69, 72, 82,
+  85, 84, 79, 88, 72, 90, 81, 79, 84, 85,
+  86, 86, 86, 65, 79, 85, 76, 82, 75, 84,
+  84, 86, 88, 79, 79, 77, 77, 76, 91, 74,
+  90, 70, 87, 75, 67, 85, 93, 77, 83, 89,
+  85, 76, 85, 95, 94, 83, 85, 78, 79, 88,
+  90, 88, 93, 73, 86, 80, 88, 89, 78, 90,
+  84, 81, 84, 83, 76, 82, 86, 76, 81, 75,
+  86, 88, 87, 87, 87, 93, 82, 108, 84, 81,
+  92, 99, 73, 83, 76, 73, 75, 77, 91, 93,
+  91, 90, 90, 93, 88, 86, 97, 66, 70, 84,
+  89, 84, 79, 90, 85, 97, 105, 78, 69, 81,
+  83, 73, 90, 85, 92, 110, 76, 76, 87, 77,
+  90, 86, 81, 84, 82, 84, 68, 70, 76, 102,
+  89, 78, 78, 71, 75, 65, 88, 93, 85, 82,
+  93, 71, 86, 79, 81, 85, 70, 88, 75, 79,
+  85, 74, 82, 92, 75, 95, 98, 71, 71, 86,
+  99, 75, 60, 96, 92, 74, 87, 120, 76, 76,
+  87, 118, 99, 80, 76, 91, 77, 82, 77, 101,
+  102, 69, 97, 82, 83, 73, 76, 74, 77, 100,
+  101, 103, 85, 72, 88, 77, 93, 90, 93, 94,
+  83, 84, 75, 100, 76, 96, 75, 79, 102, 81,
+  72, 94, 82, 85, 70, 70, 82, 98, 83, 103,
+  111, 71, 110, 74, 101, 71, 77, 89, 95, 85,
+  80, 87, 81, 117, 118, 75, 74, 76, 82, 75,
+  96, 81, 105, 125, 78, 75, 85, 81, 94, 93,
+  76, 86, 72, 93, 80, 72, 63, 107, 85, 81,
+  76, 77, 82, 57, 87, 101, 77, 85, 101, 73,
+  76, 74, 92, 81, 53, 90, 69, 71, 94, 76,
+  85, 96, 67, 95, 111, 75, 64, 95, 88, 85,
+  63, 109, 91, 82, 70, 137, 77, 73, 96, 125,
+  109, 85, 77, 96, 73, 78, 71, 81, 126, 72,
+  74, 97, 83, 76, 70, 73, 84, 113, 97, 112,
+  88, 58, 88, 76, 91, 89, 107, 95, 84, 87,
+  72, 103, 80, 88, 76, 78, 112, 79, 77, 103,
+  73, 95, 71, 72, 77, 97, 72, 112, 106, 68,
+  123, 70, 92, 73, 86, 83, 81, 99, 79, 85,
+  94, 90, 89, 76, 70, 79, 79, 74, 84, 84,
+  81, 103, 86, 82, 82, 75, 78, 79, 84, 82,
+  84, 86, 64, 73, 84, 79, 83, 93, 76, 78,
+  84, 73, 86, 92, 75, 81, 89, 71, 95, 84,
+  80, 86, 75, 91, 76, 82, 90, 73, 81, 80,
+  80, 81, 89, 71, 76, 64, 93, 79, 71, 94,
+  91, 80, 72, 104, 85, 76, 88, 105, 100, 93,
+  72, 87, 77, 82, 81, 93, 87, 81, 85, 82,
+  81, 79, 82, 78, 79, 82, 87, 92, 82, 77,
+  87, 77, 91, 72, 88, 92, 81, 86, 81, 89,
+  78, 100, 84, 79, 96, 98, 70, 95, 86, 84,
+  74, 74, 92, 96, 88, 94, 99, 78, 99, 90,
+  91, 76, 68, 86, 80, 71, 83, 101, 94, 85,
+  86, 84, 69, 88, 84, 79, 85, 82, 81, 89,
+  84, 88, 67, 70, 78, 80, 96, 82, 86, 73,
+  64, 75, 89, 84, 90, 85, 75, 76, 81, 71,
+  91, 77, 81, 82, 78, 75, 88, 89, 73, 93,
+  78, 90, 80, 93, 88, 73, 78, 90, 86, 84,
+  88, 73, 83, 86, 95, 76, 71, 84, 93, 81,
+  89, 84, 85, 74, 80, 94, 85, 72, 94, 72,
+  80, 87, 87, 86, 95, 76, 88, 70, 82, 87,
+  80, 80, 72, 83, 98, 79, 82, 86, 94, 79,
+  88, 90, 90, 95, 91, 77, 69, 88, 67, 95,
+  75, 88, 90, 80, 84, 78, 73, 75, 72, 82,
+  80, 97, 90, 86, 98, 81, 97, 81, 93, 76,
+  77, 83, 82, 69, 85, 95, 90, 88, 90, 82,
+  70, 82, 87, 79, 93, 83, 88, 94, 85, 81,
+  71, 73, 81, 83, 95, 80, 80, 93, 70, 71,
+  91, 80, 84, 80, 70, 72, 89, 62, 102, 72,
+  83, 83, 90, 85, 86, 74, 78, 95, 66, 89,
+  76, 86, 91, 77, 82, 91, 80, 87, 98, 84,
+  83, 90, 79, 79, 80, 97, 85, 95, 69, 84,
+  89, 71, 77, 95, 89, 74, 94, 69, 77, 84,
+  82, 86, 103, 88, 75, 80, 82, 94, 85, 79,
+  79, 89, 100, 83, 85, 87, 83, 76, 91, 77,
+  93, 96, 90, 80, 73, 88, 73, 98, 78, 99,
+  94, 78, 81, 95, 71, 77, 72, 88, 88, 96,
+  82, 89, 99, 87, 102, 85, 84, 84, 94, 84,
+  87, 76, 83, 88, 103, 80, 85, 79, 75, 75,
+  76, 79, 81, 77, 79, 90, 81, 94, 76, 74,
+  79, 82, 92, 80, 88, 95, 72, 73, 88, 73,
+  74, 85, 81, 78, 91, 76, 86, 78, 80, 82,
+  79, 74, 95, 78, 77, 94, 83, 96, 81, 94,
+  89, 81, 80, 87, 89, 82, 87, 71, 79, 75,
+  88, 81, 86, 78, 86, 84, 66, 82, 84, 73,
+  79, 88, 86, 88, 73, 77, 80, 90, 87, 97,
+  87, 93, 73, 78, 87, 87, 82, 79, 74, 79,
+  88, 80, 80, 86, 87, 81, 89, 70, 88, 92,
+  94, 85, 80, 87, 77, 97, 83, 81, 89, 81,
+  82, 88, 82, 75, 75, 84, 95, 96, 89, 82,
+  98, 87, 89, 85, 72, 84, 82, 82, 83, 88,
+  82, 71, 89, 65, 76, 69, 90, 83, 85, 68,
+  81, 79, 81, 81, 72, 92, 90, 94, 78, 79,
+  93, 65, 81, 80, 81, 89, 83, 88, 92, 77,
+  90, 101, 86, 75, 87, 92, 83, 69, 72, 80,
+  93, 89, 83, 70, 85, 98, 94, 112, 84, 73,
+  86, 80, 68, 89, 81, 96, 82, 67, 76, 100,
+  69, 76, 97, 81, 72, 89, 87, 73, 98, 80,
+  78, 103, 84, 88, 87, 91, 78, 82, 76, 78,
+  117, 79, 98, 84, 57, 86, 83, 98, 82, 83,
+  80, 74, 87, 86, 76, 82, 73, 79, 77, 76,
+  88, 84, 81, 96, 92, 83, 94, 77, 83, 73,
+  78, 87, 78, 103, 85, 90, 77, 79, 92, 105,
+  95, 94, 74, 87, 83, 89, 82, 89, 84, 75,
+  83, 79, 73, 81, 90, 79, 82, 81, 84, 73,
+  78, 87, 57, 90, 68, 83, 95, 80, 92, 80,
+  80, 82, 71, 100, 88, 85, 76, 64, 92, 97,
+  93, 80, 78, 86, 97, 81, 79, 79, 96, 80,
+  87, 72, 84, 95, 90, 96, 84, 78, 85, 77,
+  75, 89, 90, 88, 82, 60, 67, 81, 73, 90,
+  87, 83, 79, 88, 85, 66, 90, 77, 82, 98,
+  74, 87, 88, 88, 78, 83, 78, 75, 102, 78,
+  88, 80, 65, 83, 85, 95, 72, 73, 85, 85,
+  77, 73, 65, 78, 81, 82, 73, 88, 89, 86,
+  94, 85, 86, 79, 87, 65, 80, 89, 76, 93,
+  70, 87, 79, 83, 89, 86, 84, 88, 76, 93,
+  83, 79, 84, 82, 83, 89, 83, 81, 84, 93,
+  79, 93, 78, 78, 65, 87, 90, 68, 77, 93,
+  72, 83, 69, 83, 98, 86, 90, 87, 71, 74,
+  71, 97, 86, 87, 74, 64, 94, 80, 82, 82,
+  79, 76, 94, 84, 95, 76, 98, 92, 80, 80,
+  84, 88, 88, 80, 83, 84, 82, 86, 85, 88,
+  93, 88, 85, 66, 78, 80, 69, 110, 82, 85,
+  85, 88, 91, 71, 78, 85, 92, 90, 77, 76,
+  88, 85, 90, 86, 92, 73, 106, 87, 88, 79,
+  80, 94, 100, 91, 87, 81, 78, 91, 80, 73,
+  73, 92, 95, 85, 69, 104, 94, 86, 85, 78,
+  89, 85, 80, 64, 87, 100, 82, 102, 82, 84,
+  80, 80, 86, 91, 82, 84, 66, 84, 77, 83,
+  88, 85, 92, 84, 84, 84, 90, 65, 76, 71,
+  90, 81, 85, 80, 77, 78, 86, 81, 70, 85,
+  74, 94, 79, 81, 93, 70, 107, 84, 83, 93,
+  88, 87, 80, 74, 81, 102, 96, 75, 77, 87,
+  90, 69, 79, 87, 88, 84, 85, 74, 82, 98,
+  88, 109, 89, 80, 77, 88, 62, 78, 80, 89,
+  81, 67, 66, 95, 84, 69, 99, 75, 76, 74,
+  95, 81, 96, 77, 76, 101, 79, 90, 86, 83,
+  71, 93, 81, 87, 118, 87, 93, 82, 57, 87,
+  70, 99, 80, 80, 90, 86, 75, 87, 71, 78,
+  73, 82, 84, 81, 86, 78, 82, 97, 98, 90,
+  95, 73, 72, 69, 73, 78, 76, 85, 84, 91,
+  76, 70, 92, 96, 98, 92, 72, 86, 90, 85,
+  86, 90, 89, 81, 80, 80, 72, 83, 85, 78,
+  81, 87, 80, 76, 85, 88, 59, 94, 58, 78,
+  99, 83, 91, 83, 106, 77, 70, 100, 87, 83,
+  73, 61, 82, 91, 94, 78, 82, 91, 103, 82,
+  79, 87, 87, 77, 85, 72, 85, 100, 85, 88,
+  93, 81, 83, 75, 80, 86, 86, 85, 80, 54,
+  56, 73, 82, 90, 83, 85, 74, 77, 91, 74,
+  85, 76, 83, 116, 66, 86, 81, 84, 78, 96,
+  87, 81, 112, 83, 78, 82, 67, 78, 83, 96,
+  76, 74, 88, 90, 65, 74, 64, 72, 82, 84,
+  74, 96, 90, 83, 92, 79, 94, 86, 85, 60,
+  74, 86, 80, 89, 78, 81, 75, 76, 88, 80,
+  83, 81, 71, 85, 78, 72, 77, 70, 80, 95,
+  91, 81, 81, 94, 77, 97, 78, 77, 64, 86,
+  86, 80, 77, 93, 75, 80, 65, 75, 103, 82,
+  82, 89, 94, 86, 71, 105, 85, 82, 79, 61,
+  87, 75, 78, 78, 104, 80, 107, 85, 87, 75,
+  87, 91, 75, 78, 84, 85, 80, 75, 92, 83,
+  88, 75, 99, 85, 88, 85, 86, 55, 77, 75,
+  71, 116, 71, 95, 69, 90, 99, 68, 79, 99,
+  98, 107, 71, 75, 79, 82, 94, 96, 99, 84,
+  113, 96, 79, 90, 85, 89, 110, 85, 83, 83,
+  78, 90, 75, 71, 75, 79, 100, 86, 60, 109,
+  95, 91, 84, 72, 95, 93, 78, 61, 78, 110,
+  92, 106, 86, 86, 85, 71, 82, 102, 81, 77,
+  62, 72, 77, 83, 84, 91, 89, 83, 85, 83,
+  86, 70, 84, 79, 93, 74, 87, 89, 78, 76,
+  87, 92, 93, 82, 86, 91, 84, 81, 87, 71,
+  92, 81, 87, 84, 84, 91, 79, 78, 88, 83,
+  91, 78, 86, 89, 87, 76, 80, 88, 83, 80,
+  79, 75, 82, 90, 89, 109, 86, 91, 84, 92,
+  69, 78, 76, 92, 87, 72, 75, 91, 85, 80,
+  86, 85, 82, 84, 102, 81, 91, 82, 79, 104,
+  84, 88, 89, 82, 82, 97, 87, 85, 119, 83,
+  90, 88, 65, 86, 87, 94, 78, 90, 80, 81,
+  76, 77, 70, 87, 80, 79, 73, 86, 89, 85,
+  69, 91, 88, 88, 93, 77, 84, 81, 70, 75,
+  79, 91, 85, 88, 82, 74, 86, 87, 95, 88,
+  78, 90, 84, 89, 80, 87, 87, 79, 82, 85,
+  77, 89, 85, 77, 82, 95, 81, 77, 81, 92,
+  72, 90, 74, 83, 93, 79, 96, 82, 90, 81,
+  77, 99, 83, 77, 73, 68, 92, 90, 89, 77,
+  84, 85, 98, 82, 71, 87, 82, 75, 81, 77,
+  83, 92, 86, 94, 92, 77, 82, 81, 89, 80,
+  80, 86, 85, 68, 68, 79, 82, 88, 81, 90,
+  79, 83, 96, 80, 82, 80, 81, 108, 75, 81,
+  85, 85, 81, 90, 87, 81, 107, 82, 84, 84,
+  67, 75, 91, 90, 70, 81, 82, 84, 71, 70,
+  68, 88, 91, 79, 81, 91, 83, 89, 89, 79,
+  89, 83, 86, 66, 89, 88, 78, 84, 85, 90,
+  80, 76, 89, 78, 83, 80, 80, 81, 91, 79,
+  77, 73, 83, 95, 86, 80, 86, 103, 73, 97,
+  78, 87, 68, 88, 86, 79, 76, 87, 75, 79,
+  67, 75, 99, 76, 84, 89, 78, 95, 75, 101,
+  84, 75, 77, 64, 94, 83, 80, 87, 99, 73,
+  101, 90, 68, 79, 84, 80, 83, 84, 75, 80,
+  81, 82, 103, 86, 87, 85, 96, 82, 84, 86,
+  94, 63, 76, 85, 73, 100, 72, 99, 86, 95,
+  93, 70, 80, 96, 88, 103, 76, 72, 81, 81,
+  93, 88, 94, 79, 113, 102, 91, 88, 90, 79,
+  105, 78, 85, 89, 77, 88, 73, 75, 77, 87,
+  108, 81, 71, 94, 82, 96, 97, 78, 96, 86,
+  83, 62, 86, 100, 94, 99, 89, 89, 94, 76,
+  84, 95, 86, 75, 79, 76, 86, 81, 89, 89,
+  85, 67, 80, 96, 93, 85, 76, 82, 76, 89,
+  77, 88, 70, 64, 79, 89, 79, 110, 76, 92,
+  73, 75, 96, 90, 90, 91, 72, 93, 76, 89,
+  95, 78, 80, 94, 100, 84, 88, 65, 88, 88,
+  86, 81, 85, 78, 83, 81, 103, 85, 82, 72,
+  85, 81, 80, 83, 93, 80, 104, 96, 82, 105,
+  58, 65, 95, 97, 93, 90, 76, 83, 112, 86,
+  71, 75, 74, 67, 84, 76, 81, 90, 75, 96,
+  79, 100, 98, 96, 88, 96, 93, 94, 75, 68,
+  99, 67, 84, 76, 89, 81, 76, 66, 92, 92,
+  75, 98, 77, 94, 86, 75, 93, 94, 76, 83,
+  83, 86, 86, 78, 69, 95, 88, 82, 99, 85,
+  104, 96, 78, 95, 89, 78, 86, 76, 94, 65,
+  76, 89, 81, 83, 76, 83, 64, 99, 72, 75,
+  73, 59, 71, 83, 82, 110, 66, 91, 70, 74,
+  87, 83, 106, 85, 80, 106, 76, 91, 89, 93,
+  76, 88, 78, 85, 87, 67, 92, 83, 88, 80,
+  80, 84, 84, 84, 95, 74, 82, 71, 94, 84,
+  88, 80, 90, 77, 110, 103, 83, 109, 51, 70,
+  80, 97, 89, 87, 90, 81, 93, 91, 75, 84,
+  72, 75, 91, 69, 73, 84, 70, 80, 88, 84,
+  79, 115, 82, 83, 90, 100, 82, 55, 95, 69,
+  82, 72, 89, 85, 76, 99, 96, 93, 76, 83,
+  71, 88, 80, 75, 93, 105, 66, 86, 82, 79,
+  64, 75, 72, 87, 84, 86, 93, 77, 97, 98,
+  80, 88, 84, 74, 92, 84, 89, 90, 99, 108,
+  82, 86, 79, 77, 71, 87, 86, 90, 73, 89,
+  78, 83, 92, 76, 79, 95, 88, 89, 83, 77,
+  75, 91, 80, 86, 84, 94, 89, 87, 84, 89,
+  75, 90, 83, 82, 86, 89, 81, 87, 86, 88,
+  85, 93, 94, 93, 81, 81, 83, 81, 92, 84,
+  95, 81, 78, 78, 71, 69, 77, 77, 83, 90,
+  87, 85, 77, 80, 101, 71, 85, 80, 75, 87,
+  70, 98, 88, 89, 80, 89, 84, 77, 90, 75,
+  94, 83, 88, 78, 76, 88, 90, 85, 91, 73,
+  93, 93, 69, 88, 85, 94, 88, 87, 84, 85,
+  77, 73, 80, 75, 90, 100, 89, 84, 73, 82,
+  85, 78, 103, 78, 96, 87, 87, 91, 89, 90,
+  110, 78, 103, 85, 71, 71, 65, 85, 85, 88,
+  74, 82, 79, 97, 76, 75, 78, 59, 79, 93,
+  83, 119, 94, 88, 66, 82, 78, 87, 116, 94,
+  90, 97, 76, 88, 84, 89, 91, 79, 96, 78,
+  76, 71, 86, 84, 96, 80, 70, 95, 86, 78,
+  86, 87, 85, 63, 91, 69, 83, 75, 96, 62,
+  100, 113, 93, 110, 50, 70, 84, 89, 93, 73,
+  71, 82, 102, 95, 67, 81, 68, 62, 72, 70,
+  72, 75, 77, 99, 86, 94, 89, 102, 75, 85,
+  91, 83, 85, 71, 95, 63, 82, 82, 87, 80,
+  75, 49, 95, 92, 86, 80, 79, 87, 79, 77,
+  96, 99, 72, 73, 75, 85, 82, 83, 57, 93,
+  90, 83, 97, 72, 95, 86, 85, 85, 106, 79,
+  83, 76, 78, 67, 60, 79, 78, 87, 77, 83,
+  73, 91, 76, 66, 82, 52, 65, 85, 73, 120,
+  69, 89, 68, 80, 70, 83, 123, 70, 83, 113,
+  74, 86, 97, 97, 78, 70, 92, 82, 70, 64,
+  102, 81, 89, 87, 61, 75, 83, 73, 85, 83,
+  84, 57, 91, 87, 80, 67, 92, 62, 109, 118,
+  87, 107, 37, 77, 70, 90, 94, 58, 98, 77,
+  89, 89, 70, 85, 70, 92, 81, 64, 63, 73,
+  75, 80, 86, 84, 71, 115, 61, 84, 89, 99,
+  90, 64, 101, 66, 78, 71, 89, 83, 76, 71,
+  94, 93, 85, 69, 71, 81, 70, 72, 78, 117,
+  64, 78, 59, 76, 69, 82, 66, 87, 78, 81,
+  93, 66, 92, 83, 82, 72, 86, 75, 77, 91,
+  82, 86, 79, 105, 91, 87, 78, 79, 70, 77,
+  80, 85, 79, 76, 85, 81, 78, 82, 80, 90,
+  86, 94, 84, 80, 89, 78, 76, 86, 77, 92,
+  81, 87, 74, 96, 75, 94, 81, 72, 92, 86,
+  75, 91, 84, 70, 86, 94, 91, 96, 86, 69,
+  87, 83, 85, 77, 98, 74, 85, 81, 81, 61,
+  72, 67, 77, 88, 85, 86, 85, 77, 102, 73,
+  85, 85, 69, 98, 73, 92, 79, 83, 81, 86,
+  78, 81, 86, 85, 96, 89, 89, 101, 80, 87,
+  96, 87, 82, 62, 87, 89, 83, 82, 81, 92,
+  93, 79, 88, 86, 78, 84, 70, 79, 87, 97,
+  74, 84, 88, 80, 84, 83, 100, 75, 109, 89,
+  83, 78, 90, 78, 98, 70, 96, 81, 69, 95,
+  75, 78, 78, 82, 79, 88, 83, 79, 75, 73,
+  75, 85, 95, 109, 94, 93, 107, 90, 71, 84,
+  84, 93, 94, 90, 99, 104, 77, 85, 80, 100,
+  79, 69, 79, 66, 79, 78, 88, 84, 93, 90,
+  81, 90, 86, 80, 87, 81, 85, 69, 89, 74,
+  88, 64, 87, 84, 91, 104, 96, 99, 78, 58,
+  81, 95, 78, 87, 75, 98, 89, 88, 76, 83,
+  70, 72, 80, 72, 92, 85, 82, 96, 88, 88,
+  93, 84, 82, 91, 84, 82, 94, 88, 86, 73,
+  91, 80, 89, 76, 67, 62, 94, 96, 96, 77,
+  88, 93, 85, 81, 93, 77, 83, 86, 79, 100,
+  85, 94, 69, 86, 92, 83, 96, 73, 90, 98,
+  87, 84, 100, 80, 75, 80, 73, 88, 68, 76,
+  75, 87, 81, 93, 79, 80, 73, 70, 83, 78,
+  78, 103, 81, 94, 87, 88, 67, 80, 78, 89,
+  92, 78, 88, 111, 70, 82, 89, 95, 77, 67,
+  75, 71, 86, 72, 103, 79, 92, 97, 66, 74,
+  79, 76, 96, 86, 88, 66, 86, 76, 82, 63,
+  87, 79, 96, 101, 94, 101, 68, 64, 70, 89,
+  81, 64, 81, 94, 83, 86, 73, 88, 74, 87,
+  84, 69, 86, 83, 85, 88, 88, 90, 81, 93,
+  72, 94, 85, 101, 96, 82, 101, 69, 89, 79,
+  94, 77, 69, 69, 95, 96, 88, 76, 83, 85,
+  81, 76, 80, 92, 73, 81, 71, 90, 82, 90,
+  70, 84, 77, 78, 93, 68, 89, 86, 82, 75,
+  92, 75, 69, 90, 90, 97, 81, 92, 84, 91,
+  81, 79, 75, 83, 77, 83, 83, 78, 92, 93,
+  82, 80, 80, 88, 84, 93, 87, 90, 83, 83,
+  84, 88, 74, 101, 84, 93, 83, 84, 69, 90,
+  89, 80, 88, 87, 80, 91, 86, 86, 83, 86,
+  87, 89, 85, 75, 90, 87, 82, 75, 87, 74,
+  91, 82, 83, 82, 81, 72, 73, 84, 84, 91,
+  93, 77, 92, 76, 84, 88, 72, 83, 91, 90,
+  92, 75, 80, 79, 89, 82, 89, 87, 87, 90,
+  81, 107, 91, 92, 103, 86, 91, 66, 91, 86,
+  78, 86, 89, 94, 88, 76, 92, 95, 100, 76,
+  84, 76, 84, 88, 81, 85, 94, 85, 83, 79,
+  89, 77, 105, 87, 81, 78, 82, 83, 106, 98,
+  82, 88, 97, 83, 78, 68, 78, 76, 80, 84,
+  96, 73, 91, 98, 77, 79, 77, 89, 88, 75,
+  84, 86, 100, 82, 87, 77, 86, 84, 94, 101,
+  75, 79, 80, 84, 111, 74, 91, 89, 76, 81,
+  89, 84, 76, 77, 92, 86, 83, 71, 72, 89,
+  87, 88, 87, 102, 64, 107, 98, 87, 93, 86,
+  90, 83, 81, 79, 81, 77, 86, 84, 80, 106,
+  81, 86, 85, 80, 74, 81, 94, 95, 90, 82,
+  95, 81, 88, 79, 84, 69, 103, 85, 62, 91,
+  90, 102, 74, 89, 86, 83, 94, 71, 87, 75,
+  93, 89, 87, 84, 80, 83, 87, 86, 89, 83,
+  84, 90, 91, 80, 56, 97, 85, 88, 80, 79,
+  93, 86, 103, 83, 89, 72, 103, 62, 88, 93,
+  84, 116, 73, 70, 88, 91, 70, 91, 88, 90,
+  73, 78, 87, 99, 86, 109, 87, 65, 95, 78,
+  103, 75, 94, 91, 94, 81, 81, 99, 88, 83,
+  84, 94, 106, 74, 96, 78, 68, 98, 83, 91,
+  86, 81, 80, 85, 76, 72, 98, 80, 76, 75,
+  91, 97, 68, 74, 87, 95, 83, 70, 86, 62,
+  61, 73, 59, 94, 69, 84, 95, 98, 70, 82,
+  81, 85, 80, 111, 74, 97, 74, 87, 92, 102,
+  88, 77, 87, 99, 62, 80, 84, 101, 80, 84,
+  87, 100, 82, 69, 87, 74, 84, 103, 85, 90,
+  85, 69, 76, 86, 80, 77, 86, 77, 87, 102,
+  79, 100, 63, 88, 76, 73, 73, 66, 85, 76,
+  89, 78, 92, 71, 80, 69, 65, 73, 79, 125,
+  76, 92, 96, 84, 73, 96, 71, 83, 66, 79,
+  82, 92, 78, 112, 71, 78, 95, 81, 74, 89,
+  88, 87, 83, 96, 77, 85, 99, 85, 67, 101,
+  94, 78, 77, 91, 72, 97, 77, 82, 81, 74,
+  81, 109, 81, 74, 95, 78, 85, 77, 88, 82,
+  100, 63, 96, 92, 77, 77, 81, 58, 53, 90,
+  63, 84, 79, 75, 77, 85, 84, 85, 79, 86,
+  80, 92, 74, 109, 74, 81, 83, 100, 71, 77,
+  94, 87, 76, 86, 95, 88, 86, 77, 89, 87,
+  74, 69, 92, 87, 73, 90, 84, 83, 88, 83,
+  88, 87, 87, 96, 75, 74, 91, 97, 58, 99,
+  65, 72, 74, 96, 90, 93, 92, 88, 75, 83,
+  82, 112, 97, 81, 95, 91, 102, 72, 76, 69,
+  76, 76, 79, 94, 78, 71, 86, 91, 79, 70,
+  82, 92, 95, 61, 86, 84, 102, 76, 101, 85,
+  98, 78, 91, 91, 74, 87, 62, 76, 80, 85,
+  110, 69, 93, 69, 75, 85, 69, 88, 88, 80,
+  85, 68, 83, 71, 83, 87, 84, 100, 62, 99,
+  87, 85, 97, 97, 83, 77, 79, 71, 94, 79,
+  97, 91, 54, 89, 76, 102, 78, 74, 88, 89,
+  85, 86, 86, 76, 93, 93, 85, 103, 75, 76,
+  93, 67, 73, 86, 84, 107, 68, 93, 85, 83,
+  82, 76, 73, 67, 79, 93, 89, 94, 89, 80,
+  81, 76, 85, 94, 76, 91, 96, 93, 69, 96,
+  84, 107, 80, 69, 90, 82, 88, 88, 82, 71,
+  86, 56, 108, 92, 77, 97, 71, 69, 71, 95,
+  73, 92, 64, 74, 74, 74, 88, 98, 83, 123,
+  89, 58, 111, 77, 96, 63, 91, 94, 111, 121,
+  78, 91, 88, 66, 62, 89, 103, 91, 134, 57,
+  101, 83, 62, 90, 71, 78, 72, 89, 82, 78,
+  89, 78, 75, 74, 88, 89, 76, 67, 72, 84,
+  87, 76, 79, 62, 60, 73, 71, 95, 80, 108,
+  40, 82, 79, 83, 70, 84, 91, 94, 65, 86,
+  72, 80, 78, 113, 83, 103, 78, 102, 57, 67,
+  90, 70, 80, 79, 75, 90, 85, 61, 79, 79,
+  69, 58, 90, 88, 74, 89, 72, 86, 74, 84,
+  78, 92, 90, 91, 69, 110, 92, 84, 73, 88,
+  84, 70, 79, 83, 75, 81, 89, 80, 76, 74,
+  85, 73, 83, 98, 79, 88, 91, 80, 84, 88,
+  66, 78, 69, 85, 71, 97, 87, 102, 75, 74,
+  94, 79, 80, 81, 81, 83, 103, 124, 78, 76,
+  102, 76, 64, 89, 83, 86, 91, 96, 71, 95,
+  65, 85, 78, 74, 85, 106, 86, 87, 85, 79,
+  86, 79, 85, 85, 97, 67, 93, 92, 76, 75,
+  79, 46, 55, 98, 75, 73, 81, 66, 58, 93,
+  87, 80, 79, 84, 89, 81, 55, 105, 81, 83,
+  90, 97, 78, 88, 94, 83, 76, 81, 104, 72,
+  86, 81, 82, 77, 77, 71, 96, 87, 77, 56,
+  80, 82, 88, 76, 84, 89, 88, 104, 84, 76,
+  87, 88, 43, 99, 71, 75, 76, 89, 111, 98,
+  95, 92, 81, 78, 82, 111, 90, 77, 83, 69,
+  85, 100, 79, 84, 80, 89, 87, 91, 88, 78,
+  65, 72, 79, 72, 89, 90, 85, 93, 84, 83,
+  82, 83, 89, 89, 87, 91, 86, 78, 78, 81,
+  81, 95, 84, 80, 94, 80, 100, 71, 77, 82,
+  86, 90, 64, 83, 82, 75, 87, 84, 87, 87,
+  84, 83, 76, 78, 87, 87, 89, 96, 82, 86,
+  71, 94, 73, 87, 81, 79, 86, 81, 86, 92,
+  76, 90, 87, 113, 77, 87, 81, 81, 93, 92,
+  73, 92, 77, 79, 77, 77, 97, 77, 76, 83,
+  82, 77, 87, 82, 82, 88, 74, 69, 79, 88,
+  90, 98, 98, 80, 96, 86, 82, 86, 87, 98,
+  78, 80, 102, 81, 79, 91, 83, 78, 90, 82,
+  90, 83, 84, 84, 83, 73, 60, 73, 78, 96,
+  79, 85, 80, 85, 85, 86, 64, 81, 65, 76,
+  77, 93, 83, 89, 74, 81, 83, 82, 78, 79,
+  86, 86, 95, 112, 81, 73, 92, 73, 74, 91,
+  88, 79, 84, 75, 95, 59, 69, 84, 79, 79,
+  75, 73, 82, 87, 86, 81, 90, 81, 92, 70,
+  94, 85, 89, 90, 87, 83, 90, 81, 70, 90,
+  74, 84, 72, 91, 91, 70, 90, 80, 79, 96,
+  82, 103, 83, 68, 84, 86, 81, 88, 76, 89,
+  79, 82, 83, 88, 102, 80, 77, 71, 94, 76,
+  80, 71, 84, 90, 77, 74, 80, 79, 93, 84,
+  74, 88, 89, 100, 71, 81, 96, 82, 77, 90,
+  87, 72, 80, 79, 98, 82, 92, 92, 90, 88,
+  86, 94, 84, 81, 79, 69, 96, 66, 89, 97,
+  96, 75, 89, 85, 78, 93, 82, 90, 72, 86,
+  82, 78, 71, 82, 80, 83, 79, 89, 71, 70,
+  73, 83, 78, 72, 86, 86, 78, 79, 76, 87,
+  70, 102, 71, 68, 85, 94, 88, 80, 82, 70,
+  89, 79, 78, 104, 89, 88, 92, 89, 93, 106,
+  99, 87, 83, 81, 76, 66, 85, 105, 93, 74,
+  71, 87, 79, 84, 88, 76, 85, 81, 87, 91,
+  67, 89, 96, 82, 86, 79, 96, 87, 74, 73,
+  98, 89, 81, 87, 75, 87, 92, 85, 75, 90,
+  95, 91, 84, 77, 74, 79, 93, 72, 82, 89,
+  82, 90, 78, 73, 87, 85, 78, 93, 57, 78,
+  88, 77, 94, 94, 85, 94, 93, 85, 77, 87,
+  78, 77, 84, 85, 82, 100, 90, 94, 81, 91,
+  85, 93, 79, 68, 91, 78, 84, 95, 86, 72,
+  90, 76, 100, 89, 89, 84, 82, 93, 73, 101,
+  80, 84, 87, 81, 78, 96, 86, 82, 88, 78,
+  80, 77, 85, 89, 80, 91, 88, 101, 85, 83,
+  90, 97, 74, 81, 102, 81, 78, 87, 91, 76,
+  76, 99, 85, 84, 104, 81, 82, 90, 80, 89,
+  90, 81, 96, 81, 79, 95, 76, 82, 83, 91,
+  89, 86, 93, 113, 78, 80, 81, 90, 82, 92,
+  87, 92, 85, 77, 87, 89, 90, 82, 93, 88,
+  83, 85, 84, 95, 81, 77, 89, 78, 81, 82,
+  88, 83, 86, 95, 86, 79, 90, 84, 82, 83,
+  78, 79, 80, 84, 82, 92, 84, 74, 87, 80,
+  78, 89, 81, 82, 84, 92, 87, 93, 83, 96,
+  90, 69, 91, 81, 78, 81, 77, 79, 87, 87,
+  90, 94, 85, 88, 81, 98, 88, 97, 83, 91,
+  88, 83, 92, 89, 83, 86, 75, 70, 77, 80,
+  86, 85, 82, 83, 91, 87, 88, 81, 78, 90,
+  74, 82, 94, 73, 72, 84, 95, 77, 81, 82,
+  86, 97, 86, 75, 76, 89, 79, 75, 82, 102,
+  86, 76, 81, 92, 84, 75, 87, 80, 92, 81,
+  86, 89, 75, 77, 84, 89, 72, 96, 76, 80,
+  84, 69, 82, 86, 87, 81, 96, 75, 89, 75,
+  87, 92, 82, 78, 104, 86, 81, 84, 87, 84,
+  83, 89, 78, 79, 82, 85, 79, 80, 83, 81,
+  82, 79, 87, 84, 76, 80, 79, 96, 88, 88,
+  82, 88, 84, 89, 89, 100, 83, 111, 82, 80,
+  87, 79, 81, 82, 82, 89, 85, 80, 86, 93,
+  84, 84, 87, 97, 68, 75, 78, 84, 87, 71,
+  95, 104, 81, 86, 67, 69, 81, 75, 89, 88,
+  79, 91, 84, 77, 85, 87, 86, 93, 74, 81,
+  103, 81, 77, 85, 90, 72, 75, 95, 79, 94,
+  96, 71, 83, 96, 80, 80, 84, 91, 94, 85,
+  87, 93, 84, 108, 95, 80, 87, 82, 94, 79,
+  75, 79, 90, 87, 74, 89, 82, 90, 85, 74,
+  91, 84, 86, 84, 91, 78, 87, 83, 86, 91,
+  85, 77, 93, 84, 84, 81, 90, 89, 81, 80,
+  79, 80, 79, 84, 83, 80, 73, 79, 79, 82,
+  90, 89, 79, 76, 82, 67, 81, 78, 78, 71,
+  97, 93, 72, 88, 90, 100, 61, 82, 93, 71,
+  91, 84, 78, 82, 97, 66, 80, 92, 91, 82,
+  91, 90, 150, 96, 82, 87, 83, 86, 84, 81,
+  97, 90, 79, 67, 83, 78, 92, 84, 82, 81,
+  82, 93, 85, 78, 96, 61, 73, 85, 73, 88,
+  87, 81, 83, 103, 76, 95, 97, 87, 80, 80,
+  95, 95, 88, 90, 81, 84, 83, 78, 82, 88,
+  91, 81, 91, 104, 77, 86, 86, 98, 78, 82,
+  79, 95, 77, 93, 77, 92, 72, 80, 88, 92,
+  84, 94, 93, 88, 73, 97, 91, 97, 83, 93,
+  82, 82, 70, 84, 83, 79, 95, 87, 86, 92,
+  71, 90, 77, 85, 84, 93, 74, 79, 65, 90,
+  87, 83, 92, 75, 70, 84, 79, 63, 91, 94,
+  77, 84, 89, 110, 73, 78, 86, 76, 92, 72,
+  70, 88, 91, 71, 71, 93, 92, 93, 93, 91,
+  165, 87, 90, 91, 76, 88, 88, 70, 87, 89,
+  71, 67, 77, 84, 92, 82, 90, 77, 89, 78,
+  84, 63, 90, 52, 72, 90, 60, 83, 84, 86,
+  90, 108, 85, 78, 99, 109, 78, 79, 92, 89,
+  83, 73, 70, 102, 77, 80, 81, 78, 92, 73,
+  91, 98, 75, 92, 85, 82, 75, 82, 78, 95,
+  75, 98, 66, 86, 73, 77, 77, 88, 85, 97,
+  98, 75, 74, 80, 92, 99, 80, 92, 97, 90,
+  66, 86, 85, 80, 91, 78, 83, 79, 67, 89,
+  77, 85, 89, 92, 69, 79, 64, 84, 83, 83,
+  77, 95, 88, 80, 76, 70, 89, 87, 76, 91,
+  88, 114, 65, 87, 85, 74, 87, 74, 77, 98,
+  87, 66, 73, 90, 88, 87, 94, 93, 142, 79,
+  81, 89, 78, 72, 88, 89, 90, 92, 73, 62,
+  86, 74, 91, 82, 87, 81, 80, 72, 83, 75,
+  97, 61, 70, 87, 76, 75, 86, 83, 84, 102,
+  76, 87, 95, 98, 78, 73, 97, 102, 82, 87,
+  74, 96, 82, 84, 86, 85, 92, 98, 99, 96,
+  73, 89, 87, 84, 76, 85, 80, 96, 73, 91,
+  74, 83, 69, 82, 84, 86, 83, 98, 90, 80,
+  74, 83, 89, 94, 80, 89, 85, 86, 73, 81,
+  93, 83, 90, 73, 85, 85, 70, 88, 80, 82,
+  78, 94, 69, 77, 71, 87, 85, 83, 79, 70,
+  87, 81, 93, 91, 77, 84, 79, 87, 87, 77,
+  72, 79, 85, 84, 86, 84, 90, 67, 89, 86,
+  85, 96, 82, 72, 86, 95, 75, 81, 87, 86,
+  86, 89, 75, 84, 91, 81, 75, 84, 89, 81,
+  83, 83, 79, 95, 79, 96, 78, 88, 89, 105,
+  70, 79, 105, 78, 81, 85, 95, 79, 73, 86,
+  78, 75, 89, 80, 84, 70, 86, 91, 91, 75,
+  83, 78, 78, 88, 83, 85, 77, 84, 92, 68,
+  87, 90, 79, 80, 80, 82, 91, 83, 80, 83,
+  79, 77, 90, 77, 88, 77, 81, 82, 83, 89,
+  83, 87, 75, 86, 80, 75, 72, 87, 80, 85,
+  88, 87, 75, 83, 81, 86, 82, 83, 76, 76,
+  85, 74, 87, 83, 79, 83, 91, 72, 75, 86,
+  93, 81, 68, 85, 81, 81, 82, 76, 81, 71,
+  79, 91, 89, 79, 84, 73, 85, 86, 80, 88,
+  87, 71, 88, 102, 105, 72, 90, 94, 86, 92,
+  75, 78, 83, 90, 79, 79, 88, 85, 86, 77,
+  83, 93, 78, 87, 75, 84, 84, 90, 66, 81,
+  89, 78, 73, 80, 97, 86, 88, 78, 79, 82,
+  80, 76, 85, 79, 90, 79, 81, 90, 78, 77,
+  77, 85, 91, 78, 70, 86, 88, 68, 85, 81,
+  73, 82, 82, 82, 81, 88, 72, 78, 79, 77,
+  84, 76, 86, 81, 87, 69, 86, 84, 86, 89,
+  79, 89, 95, 77, 70, 88, 72, 92, 84, 82,
+  69, 80, 79, 87, 85, 82, 86, 82, 87, 75,
+  87, 79, 86, 86, 81, 85, 92, 79, 86, 84,
+  70, 73, 79, 86, 86, 87, 81, 75, 78, 85,
+  82, 77, 90, 74, 81, 88, 80, 93, 85, 74,
+  87, 98, 74, 71, 85, 87, 84, 76, 79, 87,
+  81, 87, 87, 77, 96, 79, 84, 78, 82, 93,
+  70, 73, 74, 91, 85, 101, 69, 80, 102, 71,
+  77, 82, 94, 79, 81, 82, 75, 83, 88, 75,
+  86, 84, 86, 96, 78, 87, 79, 80, 80, 90,
+  87, 104, 72, 82, 86, 66, 88, 76, 73, 84,
+  75, 86, 80, 82, 76, 75, 77, 80, 85, 73,
+  86, 84, 84, 76, 86, 74, 84, 84, 72, 86,
+  81, 76, 75, 85, 74, 89, 82, 74, 76, 81,
+  85, 84, 87, 79, 83, 80, 81, 74, 88, 80,
+  80, 85, 87, 82, 82, 90, 99, 88, 81, 89,
+  78, 84, 94, 75, 82, 91, 86, 74, 83, 91,
+  96, 85, 88, 87, 99, 73, 83, 73, 73, 86,
+  88, 96, 90, 90, 79, 93, 81, 85, 86, 65,
+  88, 80, 83, 77, 75, 95, 62, 75, 92, 79,
+  69, 78, 88, 78, 91, 86, 78, 78, 74, 73,
+  80, 93, 92, 93, 83, 82, 75, 90, 79, 87,
+  96, 74, 83, 73, 68, 94, 88, 71, 86, 100,
+  88, 78, 73, 77, 83, 91, 102, 83, 97, 93,
+  101, 85, 74, 90, 76, 79, 88, 66, 87, 78,
+  113, 94, 86, 73, 98, 79, 95, 86, 85, 101,
+  86, 77, 73, 83, 71, 80, 86, 88, 99, 76,
+  93, 76, 85, 64, 74, 86, 83, 93, 84, 93,
+  71, 84, 91, 86, 101, 82, 85, 97, 77, 78,
+  99, 87, 83, 85, 91, 75, 90, 105, 110, 88,
+  82, 81, 91, 61, 103, 80, 70, 81, 108, 90,
+  90, 92, 76, 81, 79, 84, 84, 61, 85, 97,
+  78, 77, 86, 103, 57, 75, 103, 77, 56, 77,
+  87, 72, 88, 102, 65, 77, 74, 69, 77, 96,
+  107, 92, 85, 86, 74, 91, 85, 92, 87, 63,
+  81, 64, 66, 83, 88, 61, 82, 89, 90, 77,
+  72, 79, 90, 82, 116, 88, 86, 100, 91, 86,
+  71, 96, 64, 73, 85, 70, 88, 77, 104, 93,
+  78, 80, 101, 79, 82, 78, 94, 103, 91, 73,
+  71, 78, 66, 82, 83, 85, 82, 81, 92, 74,
+  83, 65, 82, 78, 80, 90, 76, 92, 82, 96,
+  92, 89, 99, 92, 79, 97, 78, 85, 89, 75,
+  84, 80, 85, 79, 83, 88, 93, 97, 76, 86,
+  83, 75, 91, 80, 76, 84, 91, 80, 92, 98,
+  80, 83, 84, 97, 88, 66, 88, 87, 80, 76,
+  83, 89, 66, 79, 98, 87, 70, 80, 83, 75,
+  89, 89, 80, 85, 76, 75, 77, 86, 96, 88,
+  83, 81, 76, 92, 79, 85, 92, 68, 95, 73,
+  76, 91, 95, 72, 86, 83, 97, 80, 72, 75,
+  84, 80, 101, 88, 80, 89, 99, 85, 72, 99,
+  75, 81, 85, 68, 88, 79, 82, 97, 80, 88,
+  98, 79, 93, 89, 85, 98, 82, 77, 72, 82,
+  70, 88, 74, 82, 77, 77, 96, 74, 88, 69,
+  72, 86, 81, 89, 85, 91, 100, 82, 85, 91,
+  85, 92, 81, 85, 80, 90, 86, 73, 80, 76,
+  90, 90, 82, 84, 70, 81, 73, 84, 94, 90,
+  88, 73, 74, 87, 74, 85, 85, 98, 93, 101,
+  85, 86, 80, 63, 86, 75, 75, 81, 71, 90,
+  63, 74, 97, 89, 79, 85, 92, 82, 89, 85,
+  89, 80, 83, 89, 88, 100, 73, 76, 73, 88,
+  74, 86, 68, 91, 98, 64, 82, 83, 69, 86,
+  88, 77, 86, 105, 85, 82, 80, 96, 84, 83,
+  92, 76, 93, 88, 88, 85, 84, 76, 98, 72,
+  82, 71, 79, 83, 100, 90, 84, 77, 83, 79,
+  103, 94, 87, 89, 86, 82, 80, 82, 70, 84,
+  79, 89, 83, 89, 80, 66, 85, 82, 76, 83,
+  92, 89, 71, 85, 93, 81, 92, 95, 88, 90,
+  86, 87, 80, 91, 87, 81, 84, 82, 99, 93,
+  84, 94, 70, 85, 66, 80, 93, 83, 102, 69,
+  72, 91, 87, 87, 79, 96, 101, 89, 77, 79,
+  77, 55, 82, 84, 74, 86, 73, 103, 58, 71,
+  102, 89, 65, 82, 99, 79, 83, 93, 79, 84,
+  82, 87, 88, 94, 81, 76, 70, 92, 72, 91,
+  73, 92, 96, 53, 81, 73, 72, 79, 91, 73,
+  82, 95, 80, 80, 84, 98, 92, 82, 96, 79,
+  84, 86, 85, 91, 83, 75, 89, 56, 76, 75,
+  79, 90, 104, 88, 81, 70, 81, 78, 99, 97,
+  94, 90, 88, 83, 76, 76, 71, 82, 73, 85,
+  77, 97, 73, 63, 88, 73, 76, 82, 91, 84,
+  68, 83, 97, 94, 96, 89, 87, 94, 79, 87,
+  80, 91, 86, 72, 84, 87, 85, 96, 82, 81,
+  72, 93, 68, 85, 89, 89, 91, 75, 76, 85,
+  79, 91, 86, 100, 96, 83, 83, 93, 77, 60,
+  74, 77, 74, 80, 74, 93, 62, 71, 92, 93,
+  78, 85, 91, 76, 89, 89, 87, 83, 83, 91,
+  82, 97, 78, 78, 75, 89, 77, 87, 78, 91,
+  95, 58, 84, 84, 72, 86, 95, 80, 79, 86,
+  84, 82, 82, 94, 83, 85, 95, 87, 86, 86,
+  87, 88, 83, 76, 101, 69, 75, 71, 77, 87,
+  93, 90, 82, 73, 82, 78, 94, 99, 88, 89,
+  84, 84, 73, 80, 69, 82, 75, 90, 86, 89,
+  81, 65, 91, 78, 76, 83, 88, 86, 73, 82,
+  95, 84, 84, 80, 72, 89, 71, 77, 86, 90,
+  73, 74, 86, 71, 81, 92, 79, 69, 58, 81,
+  75, 80, 89, 110, 84, 75, 95, 76, 76, 84,
+  76, 92, 82, 107, 92, 84, 79, 73, 87, 74,
+  72, 67, 85, 71, 75, 88, 75, 81, 102, 91,
+  86, 81, 93, 66, 92, 80, 91, 104, 84, 89,
+  75, 75, 76, 89, 75, 86, 64, 84, 87, 86,
+  90, 85, 89, 93, 73, 86, 80, 88, 96, 82,
+  76, 87, 81, 87, 66, 86, 92, 82, 85, 94,
+  87, 78, 103, 80, 83, 76, 72, 83, 67, 79,
+  79, 85, 78, 85, 103, 89, 67, 70, 80, 92,
+  91, 75, 66, 87, 82, 90, 76, 92, 81, 86,
+  82, 101, 69, 79, 88, 93, 67, 77, 93, 84,
+  77, 88, 68, 84, 74, 76, 82, 99, 74, 77,
+  82, 86, 93, 96, 82, 75, 57, 84, 74, 74,
+  94, 111, 83, 71, 99, 80, 94, 91, 73, 87,
+  85, 98, 95, 77, 77, 81, 79, 80, 69, 65,
+  81, 76, 74, 90, 70, 81, 96, 95, 90, 85,
+  88, 62, 91, 77, 86, 104, 93, 89, 79, 75,
+  70, 90, 74, 89, 67, 82, 94, 84, 82, 83,
+  94, 92, 77, 85, 79, 84, 91, 74, 82, 86,
+  75, 78, 60, 96, 87, 75, 85, 96, 79, 79,
+  104, 73, 79, 80, 71, 91, 85, 69, 78, 78,
+  77, 85, 115, 94, 79, 68, 76, 96, 88, 73,
+  69, 81, 70, 90, 86, 97, 72, 88, 92, 100,
+  67, 76, 90, 95, 65, 75, 94, 85, 84, 84,
+  72, 84, 71, 79, 87, 92, 74, 72, 85, 97,
+  79, 98, 82, 67, 57, 88, 84, 81, 92, 106,
+  74, 73, 97, 76, 84, 96, 75, 91, 84, 95,
+  86, 85, 77, 73, 70, 81, 76, 66, 77, 77,
+  76, 86, 64, 86, 100, 90, 87, 76, 90, 70,
+  91, 83, 94, 102, 85, 88, 74, 76, 76, 87,
+  82, 85, 69, 82, 93, 82, 86, 87, 93, 93,
+  79, 86, 76, 79, 93, 80, 78, 85, 79, 75,
+  69, 99, 93, 79, 85, 88, 83, 77, 107, 77,
+  84, 74, 71, 87, 98, 76, 82, 75, 77, 83,
+  105, 93, 71, 74, 76, 89, 89, 75, 66, 78,
+  77, 93, 99, 92, 80, 93, 101, 95, 70, 79,
+  86, 95, 67, 79, 85, 80, 77, 90, 86, 86,
+  81, 70, 94, 65, 81, 74, 87, 91, 60, 76,
+  81, 91, 107, 82, 87, 83, 90, 69, 95, 96,
+  95, 65, 92, 87, 76, 81, 80, 83, 82, 96,
+  78, 86, 82, 83, 83, 75, 99, 84, 67, 84,
+  86, 96, 80, 87, 75, 81, 87, 77, 90, 80,
+  74, 83, 81, 85, 87, 76, 90, 76, 80, 80,
+  78, 79, 83, 82, 75, 92, 82, 89, 73, 82,
+  81, 87, 102, 73, 92, 78, 82, 90, 97, 94,
+  87, 103, 98, 79, 78, 83, 72, 82, 90, 73,
+  69, 82, 82, 63, 76, 77, 75, 94, 84, 77,
+  86, 82, 79, 92, 95, 83, 48, 98, 71, 69,
+  105, 81, 121, 96, 84, 94, 89, 83, 87, 73,
+  156, 88, 91, 93, 71, 80, 102, 79, 71, 62,
+  89, 41, 76, 77, 87, 94, 59, 72, 83, 98,
+  102, 82, 99, 80, 76, 63, 94, 90, 92, 50,
+  94, 88, 70, 93, 89, 69, 79, 86, 81, 89,
+  80, 80, 83, 67, 91, 84, 65, 79, 83, 83,
+  70, 86, 78, 77, 84, 77, 92, 81, 65, 86,
+  74, 80, 91, 75, 89, 76, 67, 84, 87, 74,
+  86, 89, 81, 89, 75, 87, 68, 71, 81, 82,
+  101, 76, 96, 72, 77, 80, 95, 88, 97, 102,
+  93, 76, 68, 85, 60, 79, 75, 71, 76, 80,
+  83, 75, 76, 91, 62, 93, 96, 82, 82, 80,
+  75, 93, 88, 87, 45, 90, 80, 77, 82, 79,
+  131, 87, 89, 94, 82, 76, 96, 79, 179, 87,
+  81, 92, 81, 90, 82, 98, 74, 78, 92, 72,
+  80, 81, 84, 87, 61, 78, 83, 93, 108, 89,
+  99, 85, 79, 71, 92, 94, 93, 67, 84, 85,
+  81, 81, 83, 79, 82, 115, 82, 91, 82, 84,
+  89, 76, 82, 85, 71, 81, 88, 77, 81, 91,
+  80, 77, 84, 77, 95, 81, 77, 80, 80, 83,
+  93, 81, 88, 72, 78, 80, 79, 86, 81, 78,
+  95, 93, 89, 88, 76, 88, 83, 96, 104, 73,
+  91, 75, 86, 81, 92, 92, 106, 98, 98, 80,
+  79, 81, 73, 83, 85, 73, 72, 81, 80, 70,
+  79, 78, 81, 93, 86, 75, 85, 91, 74, 88,
+  92, 81, 49, 79, 70, 74, 85, 79, 107, 93,
+  88, 95, 94, 88, 81, 74, 140, 86, 82, 71,
+  79, 72, 88, 87, 78, 64, 92, 50, 83, 73,
+  79, 81, 70, 82, 75, 88, 101, 84, 93, 79,
+  80, 71, 94, 97, 90, 63, 99, 83, 77, 82,
+  87, 81, 88, 94, 83, 80, 84, 76, 90, 79,
+  92, 83, 78, 92, 88, 93, 80, 80, 82, 81,
+  85, 90, 92, 90, 74, 88, 85, 87, 84, 79,
+  81, 76, 89, 87, 82, 71, 94, 74, 84, 97,
+  74, 84, 79, 74, 82, 91, 90, 84, 89, 82,
+  85, 86, 92, 78, 80, 93, 97, 82, 80, 83,
+  67, 80, 81, 73, 75, 85, 75, 78, 77, 81,
+  64, 91, 96, 81, 84, 81, 75, 92, 92, 82,
+  54, 99, 69, 71, 89, 90, 113, 86, 81, 88,
+  80, 72, 92, 84, 149, 86, 86, 85, 71, 63,
+  100, 80, 71, 57, 86, 20, 79, 75, 80, 89,
+  74, 88, 73, 97, 96, 84, 96, 82, 79, 62,
+  87, 87, 86, 43, 101, 93, 65, 88, 96, 74,
+  88, 71, 84, 80, 84, 73, 94, 79, 94, 88,
+  84, 85, 81, 86, 72, 82, 82, 78, 79, 91,
+  91, 77, 67, 94, 84, 90, 87, 78, 79, 76,
+  68, 96, 84, 77, 98, 73, 69, 104, 67, 81,
+  81, 59, 86, 82, 85, 92, 93, 81, 73, 76,
+  96, 81, 93, 90, 91, 80, 66, 77, 64, 75,
+  60, 71, 82, 87, 83, 84, 77, 87, 47, 92,
+  100, 86, 85, 81, 72, 89, 89, 88, 50, 88,
+  80, 84, 78, 97, 119, 76, 83, 86, 60, 68,
+  101, 84, 162, 98, 78, 92, 86, 81, 88, 89,
+  75, 66, 88, 55, 80, 79, 81, 93, 73, 83,
+  75, 85, 99, 86, 92, 80, 82, 72, 86, 93,
+  92, 60, 88, 89, 79, 77, 87, 79, 82, 95,
+  82, 80, 83, 77, 91, 78, 89, 85, 79, 88,
+  83, 87, 80, 82, 86, 81, 80, 88, 93, 70,
+  75, 85, 86, 83, 89, 82, 81, 73, 88, 85,
+  82, 77, 95, 77, 85, 95, 80, 86, 82, 80,
+  87, 92, 92, 84, 89, 75, 84, 86, 91, 83,
+  102, 91, 94, 80, 80, 82, 70, 82, 76, 71,
+  75, 85, 82, 76, 79, 77, 73, 91, 95, 86,
+  84, 86, 74, 86, 94, 82, 56, 81, 77, 76,
+  94, 89, 105, 86, 86, 84, 82, 79, 88, 88,
+  130, 85, 82, 75, 76, 76, 83, 80, 83, 73,
+  86, 75, 82, 76, 85, 80, 69, 86, 78, 86,
+  97, 87, 93, 84, 79, 80, 100, 94, 106, 81,
+  83, 77, 78, 89, 89, 85, 82, 93, 84, 78,
+  84, 85, 90, 73, 89, 80, 77, 86, 86, 91,
+  85, 85, 91, 86, 86, 88, 90, 81, 76, 82,
+  89, 82, 85, 78, 89, 78, 90, 88, 83, 82,
+  91, 84, 95, 92, 89, 80, 83, 73, 85, 86,
+  76, 75, 85, 88, 91, 88, 87, 78, 75, 93,
+  91, 88, 80, 91, 76, 81, 87, 72, 71, 82,
+  77, 68, 81, 80, 77, 86, 90, 88, 90, 77,
+  74, 93, 88, 76, 61, 108, 76, 75, 86, 89,
+  103, 85, 81, 90, 87, 79, 89, 97, 128, 80,
+  86, 83, 85, 75, 86, 77, 83, 69, 85, 62,
+  79, 78, 83, 88, 73, 86, 76, 84, 96, 81,
+  91, 83, 85, 76, 84, 93, 108, 73, 87, 85,
+  72, 86, 98, 84, 88, 85, 84, 82, 81, 78,
+  97, 74, 91, 83, 86, 79, 74, 82, 80, 90,
+  91, 85, 87, 84, 97, 85, 67, 81, 78, 77,
+  88, 73, 94, 79, 79, 87, 77, 82, 91, 89,
+  82, 92, 82, 78, 80, 62, 85, 78, 74, 76,
+  88, 87, 89, 83, 91, 79, 87, 91, 91, 86,
+  73, 90, 70, 79, 81, 66, 77, 83, 79, 73,
+  83, 82, 71, 85, 89, 89, 84, 78, 73, 91,
+  82, 82, 57, 90, 84, 77, 86, 94, 103, 81,
+  82, 87, 83, 76, 93, 98, 129, 85, 82, 87,
+  86, 82, 88, 85, 83, 75, 85, 75, 82, 78,
+  86, 90, 69, 86, 80, 82, 96, 82, 92, 83,
+  84, 80, 84, 91, 100, 78, 78, 86, 82, 81,
+  88, 87, 76, 94, 82, 78, 81, 87, 92, 77,
+  91, 83, 81, 80, 78, 85, 89, 83, 94, 84,
+  82, 86, 94, 74, 78, 83, 86, 78, 90, 81,
+  85, 75, 85, 86, 78, 82, 92, 84, 80, 89,
+  88, 83, 86, 77, 87, 88, 79, 74, 86, 85,
+  90, 93, 84, 76, 104, 86, 90, 82, 81, 92,
+  80, 85, 84, 69, 72, 82, 91, 68, 80, 78,
+  82, 84, 91, 92, 83, 82, 75, 89, 79, 77,
+  64, 85, 83, 76, 95, 91, 99, 88, 85, 88,
+  86, 82, 89, 100, 116, 79, 87, 99, 93, 82,
+  91, 88, 80, 70, 71, 99, 73, 83, 94, 83,
+  82, 83, 82, 99, 67, 77, 70, 72, 82, 87,
+  100, 83, 77, 79, 94, 84, 84, 92, 83, 91,
+  86, 88, 83, 76, 89, 90, 80, 93, 89, 77,
+  83, 73, 91, 73, 81, 81, 82, 85, 89, 63,
+  79, 82, 87, 87, 66, 86, 94, 83, 81, 81,
+  88, 90, 81, 76, 72, 91, 69, 91, 80, 81,
+  90, 77, 84, 97, 84, 81, 76, 80, 76, 99,
+  89, 81, 82, 89, 88, 79, 66, 82, 84, 84,
+  86, 78, 75, 92, 81, 74, 72, 85, 79, 81,
+  87, 93, 87, 80, 75, 113, 69, 85, 79, 79,
+  80, 87, 75, 94, 84, 78, 70, 95, 37, 86,
+  81, 94, 69, 87, 70, 97, 107, 84, 95, 98,
+  83, 84, 75, 93, 80, 84, 83, 83, 84, 86,
+  81, 88, 93, 72, 55, 85, 62, 84, 107, 89,
+  85, 73, 92, 80, 81, 100, 74, 76, 87, 99,
+  78, 76, 94, 74, 80, 87, 108, 81, 78, 85,
+  90, 54, 77, 78, 89, 95, 80, 78, 90, 82,
+  84, 82, 73, 89, 89, 81, 85, 69, 82, 82,
+  86, 79, 68, 79, 89, 94, 67, 83, 80, 76,
+  75, 100, 80, 85, 84, 79, 98, 127, 76, 84,
+  85, 80, 87, 91, 72, 80, 73, 85, 85, 70,
+  76, 88, 55, 85, 80, 71, 83, 78, 80, 83,
+  92, 90, 88, 93, 69, 86, 86, 91, 76, 85,
+  67, 89, 92, 72, 76, 84, 65, 82, 86, 88,
+  83, 83, 48, 92, 123, 93, 73, 107, 82, 92,
+  89, 82, 95, 86, 70, 92, 80, 96, 74, 71,
+  100, 91, 64, 111, 59, 88, 107, 85, 88, 81,
+  80, 83, 75, 102, 82, 85, 88, 104, 75, 101,
+  91, 68, 105, 80, 105, 96, 69, 91, 91, 61,
+  96, 86, 89, 101, 87, 99, 100, 91, 96, 77,
+  109, 83, 79, 104, 90, 83, 75, 81, 103, 99,
+  88, 79, 88, 84, 57, 72, 84, 83, 65, 117,
+  94, 80, 85, 90, 116, 138, 88, 82, 90, 90,
+  78, 91, 105, 79, 72, 83, 82, 75, 87, 84,
+  68, 148, 89, 66, 95, 82, 107, 88, 82, 100,
+  86, 61, 75, 91, 110, 88, 92, 98, 71, 70,
+  97, 103, 82, 65, 105, 75, 87, 85, 102, 91,
+  83, 82, 84, 79, 89, 91, 81, 75, 69, 100,
+  75, 80, 88, 80, 76, 84, 78, 99, 68, 77,
+  80, 75, 82, 88, 84, 82, 84, 77, 88, 92,
+  87, 88, 81, 86, 87, 87, 83, 81, 83, 82,
+  81, 92, 95, 79, 96, 82, 80, 78, 76, 79,
+  79, 73, 86, 65, 87, 74, 86, 92, 63, 85,
+  93, 87, 89, 81, 80, 93, 75, 78, 75, 95,
+  69, 85, 86, 85, 82, 81, 89, 90, 79, 84,
+  79, 84, 66, 87, 85, 80, 86, 88, 94, 82,
+  70, 88, 83, 85, 88, 82, 82, 85, 71, 69,
+  76, 88, 80, 84, 82, 71, 88, 86, 83, 111,
+  88, 92, 80, 79, 75, 81, 84, 92, 78, 89,
+  74, 95, 37, 87, 83, 92, 72, 87, 76, 86,
+  100, 80, 91, 96, 84, 87, 67, 95, 81, 78,
+  82, 77, 77, 81, 81, 92, 92, 73, 59, 81,
+  63, 83, 86, 92, 88, 73, 88, 78, 84, 89,
+  76, 76, 91, 95, 78, 73, 80, 72, 79, 91,
+  116, 77, 98, 83, 75, 63, 73, 76, 87, 84,
+  73, 77, 87, 80, 80, 84, 67, 85, 85, 85,
+  96, 66, 77, 82, 72, 78, 65, 78, 79, 90,
+  75, 92, 70, 79, 79, 95, 83, 93, 89, 79,
+  90, 114, 73, 83, 85, 77, 90, 86, 71, 85,
+  65, 86, 82, 78, 78, 89, 49, 74, 80, 80,
+  75, 80, 79, 69, 93, 88, 101, 91, 87, 86,
+  76, 97, 68, 78, 68, 92, 80, 81, 73, 89,
+  61, 84, 83, 86, 78, 84, 45, 88, 110, 94,
+  76, 100, 84, 87, 83, 91, 91, 84, 73, 78,
+  74, 88, 73, 72, 101, 85, 69, 113, 57, 80,
+  95, 89, 90, 81, 75, 75, 79, 95, 81, 84,
+  86, 107, 68, 101, 84, 73, 108, 79, 113, 100,
+  81, 76, 75, 66, 82, 84, 82, 104, 83, 105,
+  98, 94, 90, 77, 99, 85, 84, 106, 107, 79,
+  90, 85, 87, 103, 83, 82, 96, 81, 54, 86,
+  79, 79, 71, 115, 101, 81, 87, 86, 107, 127,
+  83, 80, 87, 88, 78, 83, 92, 82, 71, 80,
+  80, 81, 87, 85, 59, 129, 94, 78, 87, 82,
+  97, 73, 90, 103, 108, 58, 90, 94, 96, 97,
+  82, 96, 70, 78, 87, 99, 82, 71, 101, 77,
+  88, 86, 102, 84, 89, 78, 78, 84, 90, 91,
+  79, 77, 69, 94, 72, 72, 89, 77, 75, 87,
+  71, 95, 68, 74, 85, 73, 80, 88, 85, 79,
+  85, 73, 98, 83, 91, 93, 80, 86, 95, 82,
+  84, 80, 86, 87, 83, 94, 81, 77, 92, 79,
+  82, 75, 79, 78, 77, 65, 92, 60, 85, 77,
+  85, 86, 65, 91, 90, 84, 79, 87, 76, 91,
+  72, 81, 76, 83, 80, 89, 83, 81, 81, 87,
+  96, 94, 76, 77, 74, 79, 73, 93, 89, 82,
+  92, 81, 94, 86, 76, 88, 87, 86, 86, 85,
+  80, 80, 77, 66, 76, 90, 83, 86, 84, 79,
+  89, 88, 78, 106, 89, 89, 80, 84, 78, 85,
+  78, 91, 81, 90, 69, 89, 42, 88, 82, 83,
+  77, 79, 79, 78, 94, 81, 91, 96, 79, 84,
+  70, 92, 75, 77, 81, 79, 81, 82, 75, 94,
+  77, 72, 67, 84, 69, 85, 78, 84, 84, 73,
+  85, 72, 83, 94, 69, 75, 89, 89, 80, 71,
+  85, 80, 81, 89, 93, 74, 97, 80, 73, 66,
+  79, 77, 78, 81, 79, 67, 83, 80, 78, 79,
+  71, 88, 84, 84, 80, 79, 80, 88, 70, 78,
+  66, 81, 77, 90, 79, 90, 70, 80, 83, 88,
+  80, 86, 85, 75, 80, 105, 78, 83, 87, 74,
+  83, 86, 68, 86, 73, 88, 80, 83, 73, 91,
+  61, 68, 75, 89, 78, 80, 82, 78, 88, 87,
+  85, 100, 87, 80, 77, 87, 77, 80, 68, 90,
+  80, 85, 64, 92, 51, 87, 74, 79, 75, 73,
+  57, 90, 89, 92, 82, 84, 81, 87, 82, 91,
+  75, 88, 79, 72, 76, 87, 74, 81, 89, 74,
+  76, 94, 68, 78, 91, 89, 90, 80, 90, 63,
+  83, 90, 77, 79, 83, 100, 73, 84, 89, 80,
+  85, 79, 96, 89, 81, 82, 74, 69, 84, 77,
+  76, 89, 79, 92, 84, 88, 83, 74, 98, 86,
+  91, 95, 89, 77, 82, 81, 82, 88, 81, 80,
+  88, 79, 70, 98, 74, 83, 74, 103, 95, 82,
+  86, 81, 97, 116, 73, 84, 89, 83, 73, 89,
+  84, 86, 79, 85, 82, 85, 80, 93, 72, 88,
+  84, 79, 81, 80, 93, 73, 97, 93, 108, 73,
+  87, 82, 86, 89, 80, 86, 69, 88, 81, 85,
+  76, 84, 87, 80, 79, 85, 87, 72, 77, 77,
+  85, 87, 93, 80, 102, 75, 77, 95, 76, 100,
+  74, 86, 115, 70, 76, 114, 79, 88, 90, 75,
+  70, 98, 101, 91, 85, 69, 94, 86, 86, 74,
+  73, 74, 76, 73, 77, 80, 90, 97, 73, 91,
+  88, 116, 83, 69, 93, 81, 64, 106, 83, 66,
+  89, 90, 88, 78, 95, 85, 73, 96, 72, 75,
+  70, 78, 81, 71, 94, 78, 92, 85, 77, 82,
+  82, 92, 96, 92, 74, 74, 88, 68, 87, 78,
+  93, 71, 74, 77, 93, 71, 80, 88, 99, 80,
+  77, 78, 82, 91, 77, 70, 93, 74, 79, 78,
+  85, 71, 77, 86, 97, 86, 77, 81, 112, 96,
+  79, 89, 84, 75, 90, 85, 72, 86, 83, 70,
+  90, 70, 75, 93, 85, 87, 76, 88, 82, 88,
+  96, 76, 97, 70, 77, 99, 74, 102, 77, 87,
+  113, 73, 73, 110, 75, 93, 89, 76, 68, 99,
+  99, 87, 83, 69, 84, 79, 85, 78, 68, 78,
+  75, 74, 79, 84, 92, 96, 76, 95, 95, 122,
+  88, 67, 91, 80, 65, 105, 79, 62, 81, 89,
+  93, 82, 92, 91, 74, 92, 76, 78, 75, 74,
+  81, 73, 93, 82, 95, 85, 80, 84, 80, 87,
+  93, 89, 76, 79, 91, 69, 86, 75, 86, 71,
+  76, 82, 89, 69, 82, 88, 89, 83, 76, 80,
+  87, 91, 80, 74, 90, 74, 78, 78, 87, 74,
+  77, 89, 94, 90, 72, 74, 107, 95, 80, 93,
+  86, 77, 83, 88, 76, 85, 63, 68, 71, 74,
+  71, 90, 93, 88, 79, 92, 78, 84, 91, 74,
+  96, 72, 80, 89, 80, 95, 76, 91, 106, 76,
+  80, 106, 80, 86, 84, 78, 73, 97, 92, 86,
+  88, 70, 89, 77, 83, 75, 75, 76, 81, 70,
+  78, 78, 90, 97, 73, 84, 95, 110, 83, 71,
+  91, 82, 64, 98, 84, 71, 78, 91, 91, 83,
+  97, 92, 78, 92, 71, 74, 75, 80, 83, 71,
+  93, 76, 94, 87, 85, 80, 79, 91, 95, 92,
+  73, 84, 94, 69, 86, 80, 95, 80, 71, 83,
+  85, 75, 78, 93, 92, 84, 76, 79, 85, 86,
+  86, 73, 84, 80, 79, 73, 82, 72, 76, 86,
+  99, 83, 88, 82, 101, 98, 76, 96, 80, 74,
+  83, 86, 75, 87, 66, 71, 88, 73, 75, 92,
+  82, 88, 77, 75, 88, 88, 92, 83, 101, 77,
+  78, 90, 84, 102, 79, 91, 114, 76, 80, 116,
+  82, 88, 93, 75, 78, 89, 95, 84, 72, 73,
+  81, 75, 84, 79, 67, 79, 73, 77, 85, 79,
+  93, 95, 71, 88, 92, 124, 95, 64, 90, 84,
+  73, 112, 82, 68, 80, 93, 87, 80, 91, 81,
+  69, 88, 73, 78, 74, 80, 79, 75, 83, 74,
+  92, 84, 80, 84, 89, 88, 89, 90, 78, 79,
+  79, 71, 84, 89, 86, 69, 80, 85, 97, 67,
+  79, 67, 97, 79, 69, 81, 84, 96, 77, 78,
+  95, 79, 75, 82, 94, 73, 81, 77, 98, 90,
+  73, 74, 108, 92, 86, 90, 84, 79, 87, 87,
+  69, 82, 68, 73, 77, 82, 79, 90, 85, 87,
+  79, 78, 83, 93, 97, 80, 96, 73, 75, 96,
+  83, 102, 80, 93, 107, 76, 74, 109, 79, 89,
+  90, 76, 73, 89, 94, 74, 73, 75, 70, 78,
+  82, 83, 64, 86, 76, 80, 87, 82, 94, 94,
+  75, 90, 95, 126, 99, 60, 91, 83, 77, 113,
+  76, 72, 73, 92, 94, 81, 89, 85, 72, 83,
+  76, 82, 80, 77, 80, 76, 80, 78, 96, 88,
+  84, 87, 86, 80, 83, 86, 79, 82, 84, 71,
+  85, 82, 78, 67, 78, 90, 94, 68, 83, 61,
+  89, 79, 73, 83, 90, 94, 79, 80, 91, 80,
+  75, 86, 95, 76, 84, 79, 98, 94, 69, 67,
+  102, 92, 89, 95, 85, 83, 86, 88, 73, 85,
+  50, 72, 59, 89, 76, 91, 91, 90, 79, 83,
+  80, 89, 87, 78, 96, 75, 78, 87, 88, 98,
+  78, 94, 105, 83, 82, 109, 78, 87, 85, 78,
+  77, 89, 91, 79, 72, 75, 76, 75, 84, 79,
+  70, 81, 76, 78, 84, 80, 91, 93, 73, 85,
+  95, 117, 92, 66, 90, 85, 74, 103, 85, 73,
+  74, 95, 87, 80, 93, 88, 74, 86, 75, 80,
+  79, 83, 80, 77, 86, 76, 94, 81, 85, 83,
+  82, 86, 85, 88, 78, 83, 81, 75, 85, 93,
+  84, 80, 77, 90, 89, 72, 78, 75, 90, 80,
+  71, 81, 85, 92, 82, 80, 84, 84, 75, 80,
+  92, 75, 81, 78, 99, 86, 80, 76, 97, 94,
+  84, 93, 82, 81, 83, 86, 75, 84, 57, 76,
+  82, 84, 77, 90, 83, 87, 77, 78, 85, 87,
+  91, 84, 106, 76, 81, 79, 81, 106, 76, 93,
+  111, 78, 85, 119, 82, 86, 94, 73, 78, 79,
+  91, 87, 75, 74, 85, 78, 85, 82, 74, 77,
+  68, 76, 86, 81, 89, 87, 75, 82, 88, 119,
+  96, 67, 94, 84, 73, 101, 75, 74, 75, 96,
+  85, 81, 93, 81, 80, 76, 78, 72, 76, 81,
+  82, 76, 82, 74, 83, 86, 84, 76, 87, 83,
+  85, 90, 79, 75, 84, 67, 89, 80, 80, 71,
+  80, 88, 99, 72, 82, 75, 95, 91, 74, 73,
+  80, 93, 80, 79, 99, 83, 81, 82, 88, 72,
+  87, 80, 100, 89, 88, 78, 101, 88, 82, 85,
+  86, 85, 83, 86, 68, 80, 72, 72, 82, 77,
+  78, 85, 85, 84, 78, 81, 84, 90, 94, 80,
+  103, 76, 77, 86, 81, 106, 74, 89, 110, 77,
+  83, 115, 79, 89, 87, 72, 72, 78, 91, 85,
+  75, 77, 74, 78, 85, 82, 75, 82, 73, 79,
+  90, 82, 88, 84, 79, 84, 88, 117, 101, 61,
+  96, 81, 78, 102, 70, 71, 71, 94, 88, 82,
+  91, 82, 81, 76, 80, 78, 79, 81, 80, 76,
+  84, 81, 84, 88, 82, 79, 87, 75, 83, 89,
+  78, 79, 92, 67, 89, 71, 75, 69, 79, 90,
+  93, 74, 83, 73, 93, 89, 76, 81, 84, 94,
+  84, 81, 92, 84, 83, 87, 90, 76, 89, 80,
+  101, 91, 92, 73, 97, 90, 85, 91, 84, 88,
+  78, 88, 71, 82, 59, 75, 75, 80, 76, 88,
+  88, 86, 76, 79, 87, 88, 84, 76, 100, 76,
+  82, 77, 84, 102, 75, 90, 105, 86, 87, 115,
+  76, 87, 85, 77, 79, 81, 93, 82, 74, 78,
+  80, 72, 86, 81, 77, 79, 72, 79, 87, 80,
+  89, 84, 80, 81, 92, 112, 94, 66, 96, 82,
+  73, 98, 79, 76, 71, 97, 86, 82, 95, 87,
+  83, 78, 78, 79, 80, 84, 82, 77, 88, 76,
+  87, 89, 84, 76, 83, 81, 82, 87, 78, 85,
+  88, 70, 88, 84, 82, 82, 77, 90, 86, 79,
+  80, 82, 93, 87, 75, 73, 79, 94, 82, 79,
+  85, 91, 84, 81, 89, 74, 84, 78, 100, 85,
+  92, 77, 95, 89, 80, 91, 84, 85, 77, 84,
+  72, 84, 65, 74, 85, 79, 79, 85, 82, 86,
+  72, 72, 75, 89, 87, 81, 80, 92, 90, 84,
+  84, 155, 112, 92, 70, 79, 62, 60, 91, 74,
+  89, 94, 82, 77, 76, 76, 73, 89, 92, 89,
+  107, 88, 68, 96, 98, 89, 73, 90, 94, 76,
+  90, 73, 54, 76, 65, 73, 79, 73, 84, 75,
+  86, 91, 86, 87, 81, 96, 73, 60, 97, 93,
+  90, 92, 81, 105, 90, 49, 97, 88, 93, 111,
+  69, 84, 75, 80, 74, 74, 107, 69, 73, 82,
+  86, 118, 64, 75, 73, 93, 83, 98, 61, 95,
+  82, 90, 79, 70, 78, 75, 104, 104, 82, 77,
+  91, 67, 77, 70, 82, 74, 81, 82, 86, 85,
+  96, 62, 81, 88, 88, 94, 67, 77, 93, 66,
+  110, 106, 73, 88, 85, 92, 74, 81, 75, 81,
+  71, 82, 90, 62, 79, 86, 87, 85, 86, 144,
+  105, 87, 76, 86, 74, 68, 88, 80, 54, 87,
+  68, 75, 79, 78, 76, 89, 93, 87, 109, 107,
+  71, 92, 97, 90, 86, 89, 91, 78, 93, 87,
+  89, 77, 71, 69, 84, 74, 74, 76, 92, 93,
+  84, 90, 80, 87, 74, 65, 101, 94, 89, 88,
+  80, 99, 83, 64, 89, 84, 87, 100, 81, 83,
+  70, 81, 80, 73, 101, 80, 81, 77, 90, 108,
+  73, 70, 76, 90, 72, 95, 72, 97, 81, 102,
+  87, 72, 81, 72, 107, 109, 67, 74, 97, 98,
+  81, 71, 76, 73, 75, 84, 84, 85, 100, 68,
+  82, 78, 92, 77, 64, 79, 94, 64, 86, 97,
+  72, 89, 84, 85, 81, 83, 72, 85, 75, 91,
+  95, 81, 85, 78, 72, 91, 79, 81, 64, 89,
+  70, 89, 75, 80, 91, 82, 92, 65, 84, 94,
+  87, 90, 79, 87, 94, 78, 70, 92, 70, 82,
+  90, 85, 75, 87, 79, 80, 82, 80, 75, 81,
+  78, 86, 82, 107, 89, 81, 92, 81, 82, 83,
+  87, 84, 75, 79, 79, 75, 84, 103, 71, 73,
+  96, 70, 83, 85, 94, 86, 84, 86, 103, 86,
+  88, 100, 79, 83, 92, 86, 89, 81, 93, 78,
+  76, 74, 91, 90, 83, 94, 87, 92, 88, 78,
+  110, 84, 91, 81, 78, 90, 83, 83, 80, 75,
+  89, 74, 67, 75, 80, 62, 90, 78, 81, 79,
+  78, 94, 95, 87, 68, 82, 91, 71, 80, 81,
+  91, 89, 80, 80, 84, 80, 60, 76, 87, 77,
+  85, 118, 101, 79, 75, 185, 114, 87, 76, 69,
+  76, 71, 91, 76, 103, 100, 75, 73, 76, 81,
+  72, 81, 98, 77, 114, 84, 74, 105, 98, 85,
+  85, 92, 97, 78, 79, 86, 68, 83, 76, 84,
+  73, 78, 82, 77, 86, 90, 96, 89, 81, 108,
+  75, 45, 102, 79, 75, 84, 90, 98, 76, 50,
+  85, 86, 89, 83, 75, 78, 74, 80, 84, 64,
+  96, 74, 72, 89, 89, 124, 77, 67, 80, 89,
+  81, 97, 61, 80, 73, 76, 72, 64, 75, 78,
+  90, 105, 93, 68, 79, 76, 86, 69, 83, 97,
+  91, 91, 86, 104, 102, 71, 82, 82, 93, 77,
+  61, 78, 89, 70, 94, 102, 78, 95, 80, 84,
+  73, 89, 84, 89, 82, 72, 88, 60, 83, 101,
+  99, 80, 75, 161, 110, 109, 83, 78, 83, 80,
+  85, 80, 55, 84, 70, 70, 82, 81, 72, 83,
+  93, 94, 104, 97, 76, 91, 89, 84, 95, 89,
+  93, 79, 86, 83, 110, 85, 78, 76, 85, 65,
+  72, 80, 87, 85, 95, 95, 77, 87, 76, 54,
+  95, 80, 77, 82, 87, 93, 75, 60, 95, 80,
+  77, 91, 69, 81, 67, 76, 85, 63, 90, 80,
+  61, 80, 94, 110, 84, 84, 76, 99, 69, 92,
+  69, 89, 75, 75, 76, 65, 64, 77, 87, 109,
+  73, 64, 89, 74, 86, 72, 77, 95, 88, 85,
+  84, 101, 97, 75, 83, 76, 98, 69, 78, 79,
+  96, 71, 77, 94, 75, 93, 81, 82, 79, 88,
+  75, 99, 72, 84, 89, 75, 90, 84, 78, 84,
+  82, 99, 69, 100, 81, 83, 78, 80, 80, 79,
+  88, 72, 83, 93, 86, 87, 74, 80, 95, 81,
+  64, 84, 71, 84, 89, 87, 77, 86, 76, 86,
+  86, 84, 88, 80, 84, 85, 78, 107, 90, 83,
+  93, 81, 89, 85, 75, 80, 78, 73, 76, 73,
+  77, 102, 83, 76, 85, 74, 87, 78, 88, 82,
+  80, 89, 99, 82, 87, 88, 75, 82, 79, 91,
+  96, 83, 90, 85, 73, 86, 87, 86, 80, 90,
+  77, 82, 84, 75, 92, 84, 80, 87, 75, 84,
+  82, 72, 80, 74, 87, 79, 74, 80, 78, 74,
+  86, 79, 80, 85, 84, 77, 105, 87, 62, 83,
+  85, 69, 78, 79, 89, 90, 70, 80, 76, 75,
+  67, 79, 85, 77, 84, 103, 86, 83, 88, 124,
+  97, 79, 64, 75, 79, 79, 98, 82, 100, 90,
+  71, 82, 81, 94, 86, 83, 86, 73, 107, 88,
+  80, 96, 86, 90, 86, 88, 83, 83, 73, 80,
+  76, 72, 81, 78, 70, 91, 87, 77, 85, 92,
+  93, 78, 87, 90, 79, 51, 100, 83, 72, 86,
+  87, 101, 83, 63, 85, 94, 85, 77, 84, 77,
+  101, 90, 82, 78, 76, 69, 88, 87, 80, 104,
+  80, 82, 82, 84, 82, 89, 68, 80, 76, 83,
+  87, 80, 81, 77, 91, 87, 78, 89, 87, 90,
+  89, 71, 85, 89, 80, 98, 84, 85, 96, 81,
+  75, 87, 87, 83, 60, 79, 81, 86, 86, 87,
+  78, 90, 91, 86, 80, 87, 76, 90, 79, 77,
+  83, 61, 80, 89, 82, 80, 84, 108, 97, 97,
+  71, 79, 86, 84, 89, 81, 65, 81, 75, 79,
+  84, 91, 86, 86, 80, 95, 98, 91, 82, 86,
+  79, 84, 95, 87, 92, 82, 80, 79, 101, 76,
+  81, 75, 80, 66, 82, 79, 87, 89, 90, 83,
+  82, 75, 81, 61, 95, 87, 78, 85, 83, 100,
+  82, 70, 95, 93, 79, 89, 66, 80, 94, 83,
+  84, 75, 78, 85, 77, 82, 85, 96, 86, 91,
+  83, 97, 72, 86, 73, 84, 79, 75, 87, 77,
+  73, 78, 86, 92, 85, 84, 91, 84, 88, 74,
+  82, 96, 81, 91, 84, 88, 87, 81, 78, 77,
+  94, 84, 93, 81, 89, 87, 86, 92, 71, 89,
+  89, 87, 83, 88, 77, 97, 71, 88, 80, 82,
+  89, 80, 71, 85, 83, 69, 78, 90, 68, 80,
+  77, 85, 89, 78, 84, 76, 90, 90, 80, 90,
+  85, 84, 84, 81, 81, 83, 72, 86, 86, 81,
+  78, 81, 83, 81, 87, 85, 81, 82, 84, 79,
+  83, 98, 89, 75, 91, 92, 90, 78, 87, 80,
+  86, 76, 78, 79, 83, 85, 84, 80, 87, 79,
+  85, 81, 90, 79, 90, 83, 109, 80, 81, 94,
+  72, 88, 81, 86, 89, 71, 91, 79, 80, 89,
+  88, 82, 85, 89, 85, 89, 91, 81, 95, 80,
+  84, 80, 85, 90, 80, 87, 87, 76, 83, 80,
+  74, 90, 87, 79, 83, 78, 80, 86, 88, 84,
+  109, 85, 72, 88, 91, 78, 75, 81, 92, 92,
+  75, 82, 73, 91, 85, 74, 79, 79, 66, 82,
+  96, 86, 83, 96, 81, 91, 66, 87, 67, 63,
+  79, 95, 85, 82, 92, 84, 83, 68, 96, 92,
+  93, 72, 92, 85, 78, 81, 74, 84, 120, 75,
+  98, 79, 79, 82, 76, 75, 80, 88, 82, 72,
+  70, 76, 65, 82, 77, 77, 88, 101, 80, 74,
+  87, 75, 95, 82, 85, 81, 67, 74, 102, 100,
+  87, 108, 80, 80, 81, 83, 75, 82, 74, 79,
+  70, 64, 86, 92, 73, 88, 79, 86, 75, 112,
+  71, 95, 89, 102, 79, 74, 93, 59, 80, 83,
+  77, 100, 88, 86, 101, 76, 88, 97, 63, 96,
+  82, 86, 85, 77, 77, 90, 87, 104, 76, 77,
+  80, 92, 96, 84, 80, 89, 80, 82, 86, 87,
+  95, 83, 82, 80, 82, 82, 72, 77, 93, 82,
+  86, 95, 76, 107, 72, 92, 69, 68, 90, 86,
+  81, 80, 91, 81, 78, 74, 98, 93, 96, 71,
+  97, 88, 76, 88, 81, 78, 120, 74, 86, 81,
+  75, 92, 77, 80, 81, 81, 91, 60, 59, 69,
+  71, 99, 81, 72, 93, 92, 84, 76, 84, 68,
+  90, 77, 97, 87, 66, 81, 86, 84, 89, 103,
+  92, 76, 70, 75, 74, 80, 70, 73, 71, 68,
+  86, 89, 63, 81, 76, 84, 82, 100, 63, 94,
+  88, 112, 85, 79, 99, 66, 89, 91, 78, 80,
+  74, 79, 105, 78, 90, 87, 65, 91, 83, 88,
+  86, 66, 69, 84, 98, 84, 84, 68, 65, 93,
+  100, 74, 80, 80, 85, 83, 89, 75, 78, 69,
+  70, 80, 83, 80, 72, 79, 92, 85, 83, 93,
+  83, 100, 73, 81, 67, 69, 81, 88, 83, 78,
+  87, 86, 82, 72, 100, 95, 85, 69, 101, 80,
+  82, 92, 87, 83, 121, 82, 72, 82, 75, 85,
+  78, 78, 79, 87, 84, 77, 66, 77, 65, 88,
+  79, 78, 89, 71, 82, 72, 88, 73, 93, 78,
+  88, 81, 69, 78, 93, 101, 93, 111, 78, 79,
+  78, 76, 76, 78, 81, 75, 76, 65, 86, 89,
+  74, 89, 80, 80, 86, 99, 70, 104, 84, 112,
+  80, 75, 94, 68, 79, 83, 87, 94, 81, 97,
+  103, 80, 98, 95, 65, 94, 85, 89, 86, 73,
+  77, 86, 97, 98, 83, 78, 74, 93, 95, 85,
+  84, 84, 83, 85, 91, 89, 74, 94, 83, 65,
+  90, 94, 85, 77, 80, 80, 82, 93, 72, 123,
+  81, 71, 72, 66, 79, 86, 82, 85, 100, 82,
+  87, 75, 87, 82, 95, 76, 102, 88, 90, 71,
+  69, 103, 106, 90, 82, 79, 84, 88, 90, 71,
+  82, 74, 81, 72, 87, 84, 75, 80, 82, 82,
+  84, 87, 77, 62, 84, 85, 100, 85, 92, 75,
+  95, 78, 80, 111, 77, 86, 64, 103, 64, 76,
+  82, 87, 77, 71, 77, 78, 81, 80, 78, 69,
+  70, 86, 87, 99, 71, 106, 76, 75, 93, 104,
+  78, 74, 78, 98, 97, 83, 74, 90, 95, 74,
+  91, 93, 79, 79, 84, 81, 80, 72, 67, 94,
+  99, 105, 64, 98, 70, 94, 98, 90, 91, 77,
+  72, 74, 84, 88, 90, 85, 56, 71, 84, 82,
+  88, 77, 75, 73, 87, 93, 78, 97, 88, 79,
+  79, 79, 95, 72, 80, 73, 89, 82, 93, 80,
+  82, 81, 89, 72, 111, 106, 85, 68, 75, 74,
+  84, 101, 85, 79, 74, 88, 83, 76, 81, 81,
+  83, 61, 78, 85, 75, 84, 81, 84, 81, 84,
+  86, 65, 82, 99, 114, 74, 91, 87, 80, 76,
+  88, 117, 77, 70, 66, 88, 62, 78, 73, 82,
+  72, 69, 79, 83, 83, 71, 75, 77, 57, 75,
+  91, 69, 67, 121, 72, 75, 96, 129, 71, 80,
+  77, 124, 93, 73, 67, 72, 87, 76, 85, 100,
+  78, 67, 70, 82, 73, 74, 72, 89, 84, 92,
+  69, 105, 55, 94, 106, 79, 86, 76, 66, 74,
+  96, 84, 81, 73, 55, 77, 89, 90, 86, 75,
+  81, 78, 86, 88, 81, 76, 84, 74, 72, 80,
+  85, 81, 88, 78, 100, 82, 95, 77, 84, 82,
+  85, 74, 101, 96, 86, 83, 85, 89, 104, 97,
+  96, 81, 80, 85, 87, 75, 82, 81, 84, 83,
+  81, 89, 70, 86, 82, 88, 79, 93, 76, 64,
+  83, 80, 97, 74, 86, 77, 86, 79, 84, 118,
+  73, 87, 87, 97, 62, 75, 74, 86, 79, 74,
+  81, 79, 86, 74, 79, 97, 74, 73, 91, 90,
+  74, 110, 75, 85, 89, 101, 85, 80, 80, 94,
+  89, 84, 73, 80, 91, 79, 89, 95, 78, 75,
+  74, 81, 79, 74, 72, 86, 85, 111, 83, 99,
+  69, 85, 91, 84, 94, 78, 72, 78, 92, 84,
+  78, 98, 90, 80, 100, 96, 87, 86, 79, 81,
+  87, 77, 71, 86, 86, 76, 77, 75, 81, 90,
+  79, 83, 90, 90, 84, 78, 81, 81, 89, 79,
+  98, 86, 101, 79, 82, 106, 80, 84, 92, 80,
+  87, 77, 84, 82, 83, 85, 85, 76, 87, 91,
+  78, 85, 78, 91, 96, 97, 81, 70, 84, 90,
+  96, 103, 76, 81, 96, 80, 79, 99, 82, 77,
+  79, 87, 81, 77, 92, 80, 72, 86, 82, 83,
+  90, 73, 99, 74, 77, 74, 83, 84, 90, 100,
+  92, 78, 89, 107, 88, 78, 85, 88, 98, 80,
+  76, 93, 84, 87, 81, 92, 90, 87, 86, 79,
+  82, 76, 78, 85, 86, 90, 84, 91, 72, 89,
+  89, 77, 80, 84, 69, 86, 77, 88, 80, 84,
+  70, 90, 89, 98, 91, 89, 72, 70, 89, 74,
+  83, 84, 101, 85, 87, 86, 78, 81, 79, 79,
+  96, 80, 85, 80, 80, 74, 84, 77, 106, 83,
+  94, 74, 74, 77, 73, 67, 85, 70, 80, 81,
+  86, 88, 75, 91, 82, 77, 87, 86, 78, 90,
+  75, 89, 93, 83, 83, 72, 80, 110, 107, 88,
+  77, 87, 96, 84, 87, 105, 84, 79, 75, 74,
+  72, 84, 84, 72, 71, 88, 78, 89, 90, 73,
+  99, 77, 71, 71, 87, 66, 89, 99, 81, 85,
+  82, 127, 82, 84, 82, 105, 82, 73, 73, 86,
+  74, 89, 77, 101, 98, 81, 70, 67, 83, 78,
+  84, 88, 90, 86, 96, 90, 64, 88, 84, 73,
+  67, 89, 57, 87, 79, 81, 75, 79, 73, 93,
+  96, 90, 87, 81, 80, 79, 92, 77, 80, 95,
+  95, 81, 75, 79, 80, 86, 86, 77, 100, 85,
+  90, 76, 81, 80, 83, 89, 93, 90, 93, 80,
+  82, 84, 78, 85, 81, 73, 91, 78, 79, 77,
+  83, 91, 86, 95, 86, 92, 81, 87, 79, 95,
+  94, 78, 76, 69, 79, 90, 97, 89, 80, 81,
+  94, 80, 95, 101, 84, 76, 86, 89, 73, 76,
+  86, 86, 80, 80, 77, 85, 97, 77, 94, 91,
+  75, 74, 81, 80, 93, 102, 85, 80, 87, 108,
+  93, 81, 87, 86, 86, 76, 78, 74, 83, 90,
+  87, 100, 87, 87, 79, 76, 87, 75, 83, 83,
+  93, 96, 98, 90, 78, 82, 79, 74, 82, 86,
+  66, 86, 82, 87, 76, 91, 98, 75, 73, 83,
+  115, 93, 78, 85, 85, 72, 94, 75, 96, 89,
+  90, 86, 89, 82, 76, 87, 82, 83, 83, 75,
+  76, 82, 91, 81, 90, 76, 82, 68, 83, 86,
+  91, 80, 84, 90, 73, 87, 80, 100, 82, 94,
+  84, 81, 80, 95, 97, 96, 90, 87, 74, 97,
+  77, 93, 90, 89, 73, 84, 81, 91, 92, 78,
+  74, 73, 84, 84, 87, 74, 78, 78, 81, 82,
+  98, 74, 83, 99, 99, 83, 74, 69, 84, 78,
+  80, 66, 94, 89, 83, 71, 74, 66, 78, 84,
+  82, 87, 83, 97, 105, 81, 84, 76, 78, 84,
+  76, 91, 84, 74, 78, 87, 89, 80, 80, 80,
+  74, 84, 85, 96, 106, 77, 75, 88, 111, 78,
+  78, 87, 77, 81, 100, 80, 81, 79, 115, 84,
+  76, 80, 79, 81, 113, 81, 97, 91, 95, 87,
+  85, 78, 86, 91, 80, 82, 85, 69, 72, 79,
+  81, 76, 97, 82, 83, 73, 78, 71, 91, 78,
+  85, 96, 71, 86, 81, 111, 82, 103, 82, 73,
+  77, 91, 94, 105, 90, 85, 72, 91, 68, 91,
+  90, 90, 75, 79, 80, 99, 86, 80, 73, 76,
+  82, 80, 88, 71, 71, 77, 84, 72, 99, 75,
+  86, 98, 96, 81, 75, 80, 83, 77, 85, 58,
+  96, 101, 75, 74, 72, 70, 79, 90, 79, 91,
+  86, 93, 104, 75, 79, 76, 77, 83, 72, 95,
+  88, 69, 84, 87, 88, 88, 91, 81, 74, 81,
+  87, 92, 88, 80, 71, 90, 113, 80, 79, 92,
+  79, 71, 87, 78, 79, 76, 111, 85, 79, 85,
+  81, 69, 85, 75, 94, 86, 92, 87, 93, 68,
+  86, 90, 81, 83, 76, 75, 76, 82, 89, 78,
+  91, 82, 77, 83, 89, 73, 90, 81, 77, 94,
+  72, 89, 77, 97, 78, 99, 84, 73, 77, 94,
+  97, 90, 87, 85, 71, 81, 77, 92, 89, 86,
+  75, 83, 81, 91, 90, 80, 76, 75, 80, 81,
+  83, 77, 74, 80, 78, 87, 97, 89, 87, 97,
+  98, 85, 75, 94, 85, 81, 83, 75, 96, 98,
+  84, 79, 77, 71, 88, 85, 85, 87, 84, 94,
+  108, 81, 83, 72, 81, 83, 74, 93, 86, 74,
+  84, 88, 87, 83, 89, 82, 91, 81, 82, 88,
+  73, 78, 81, 86, 105, 76, 81, 92, 79, 89,
+  102, 75, 81, 88, 118, 94, 76, 80, 79, 72,
+  93, 78, 97, 82, 100, 87, 90, 82, 81, 82,
+  86, 79, 86, 76, 73, 75, 85, 71, 100, 75,
+  77, 71, 84, 87, 86, 77, 80, 88, 72, 86,
+  78, 110, 83, 91, 88, 84, 79, 83, 100, 100,
+  83, 85, 74, 102, 76, 99, 90, 87, 73, 84,
+  79, 87, 91, 75, 74, 77, 85, 80, 86, 70,
+  79, 79, 81, 72, 97, 72, 75, 108, 93, 87,
+  69, 69, 93, 80, 82, 61, 99, 71, 77, 74,
+  77, 76, 76, 90, 84, 94, 83, 86, 90, 86,
+  83, 74, 82, 84, 78, 89, 81, 78, 87, 92,
+  85, 75, 89, 78, 72, 87, 83, 85, 89, 79,
+  69, 87, 108, 85, 78, 86, 80, 83, 97, 81,
+  86, 81, 120, 85, 76, 71, 75, 83, 124, 84,
+  101, 81, 108, 88, 83, 78, 85, 85, 78, 76,
+  91, 70, 67, 73, 73, 72, 108, 78, 78, 76,
+  79, 70, 85, 73, 86, 96, 72, 96, 82, 122,
+  87, 95, 93, 74, 78, 80, 100, 109, 83, 84,
+  75, 104, 67, 100, 85, 87, 72, 82, 77, 104,
+  83, 83, 74, 82, 82, 77, 90, 67, 72, 78,
+  87, 62, 100, 72, 74, 107, 88, 84, 73, 76,
+  97, 84, 81, 53, 102, 76, 67, 71, 74, 80,
+  72, 102, 81, 102, 90, 83, 83, 80, 75, 73,
+  81, 86, 74, 91, 89, 74, 92, 96, 86, 83,
+  97, 79, 75, 85, 91, 80, 68, 86, 64, 93,
+  111, 83, 78, 94, 74, 75, 87, 79, 86, 81,
+  112, 87, 77, 81, 77, 67, 88, 82, 94, 84,
+  95, 87, 92, 70, 79, 82, 86, 79, 79, 77,
+  72, 78, 79, 75, 93, 77, 72, 80, 85, 74,
+  82, 81, 78, 91, 72, 85, 84, 105, 81, 94,
+  88, 76, 76, 82, 102, 89, 84, 84, 68, 96,
+  76, 100, 88, 84, 75, 83, 78, 88, 90, 75,
+  80, 80, 79, 77, 88, 72, 76, 84, 81, 80,
+  94, 89, 74, 102, 96, 89, 71, 94, 89, 82,
+  79, 70, 97, 89, 78, 79, 82, 80, 85, 89,
+  89, 93, 80, 81, 98, 76, 82, 70, 84, 81,
+  81, 88, 83, 80, 82, 93, 87, 88, 87, 80,
+  95, 85, 83, 81, 62, 79, 80, 86, 104, 81,
+  82, 87, 80, 92, 95, 82, 82, 89, 110, 100,
+  84, 83, 79, 77, 91, 72, 91, 81, 100, 88,
+  92, 77, 85, 81, 87, 70, 83, 81, 76, 78,
+  90, 75, 86, 77, 76, 64, 87, 88, 94, 80,
+  79, 92, 72, 86, 72, 102, 76, 96, 78, 87,
+  75, 90, 94, 91, 84, 81, 71, 83, 69, 90,
+  94, 78, 73, 87, 81, 86, 90, 78, 82, 81,
+  81, 80, 85, 76, 86, 90, 74, 87, 95, 75,
+  75, 100, 85, 79, 67, 72, 88, 81, 84, 75,
+  88, 63, 90, 88, 79, 79, 82, 86, 90, 88,
+  72, 90, 100, 96, 87, 72, 80, 76, 80, 88,
+  77, 80, 85, 82, 83, 84, 86, 86, 75, 85,
+  84, 82, 83, 76, 86, 85, 99, 87, 83, 84,
+  79, 88, 91, 84, 85, 80, 113, 98, 85, 77,
+  77, 87, 117, 84, 94, 82, 103, 87, 87, 74,
+  82, 80, 80, 68, 82, 76, 74, 79, 79, 77,
+  83, 83, 82, 71, 85, 74, 97, 77, 82, 94,
+  77, 86, 80, 108, 79, 97, 82, 72, 75, 90,
+  93, 89, 86, 82, 69, 86, 68, 88, 90, 78,
+  70, 84, 84, 94, 82, 74, 87, 86, 78, 75,
+  82, 72, 81, 87, 77, 78, 95, 77, 78, 97,
+  83, 77, 67, 84, 90, 86, 85, 64, 86, 70,
+  83, 82, 74, 83, 77, 90, 86, 92, 83, 89,
+  98, 87, 84, 73, 82, 81, 81, 91, 83, 78,
+  85, 86, 87, 82, 86, 86, 79, 85, 96, 78,
+  68, 82, 81, 90, 99, 83, 84, 91, 73, 74,
+  85, 79, 86, 80, 106, 93, 82, 83, 77, 70,
+  93, 88, 89, 82, 92, 88, 94, 66, 73, 83,
+  92, 73, 79, 80, 76, 81, 87, 72, 78, 79,
+  75, 74, 86, 75, 90, 82, 76, 90, 75, 88,
+  88, 98, 77, 93, 80, 77, 74, 90, 95, 85,
+  85, 82, 70, 90, 72, 89, 92, 76, 74, 90,
+  81, 90, 88, 76, 91, 85, 77, 82, 87, 77,
+  79, 91, 76, 89, 90, 91, 73, 97, 87, 81,
+  72, 95, 85, 83, 86, 79, 82, 77, 87, 82,
+  82, 81, 82, 86, 90, 88, 77, 86, 105, 80,
+  85, 73, 82, 76, 84, 87, 80, 82, 78, 86,
+  86, 84, 79, 90, 94, 83, 86, 81, 61, 78,
+  85, 84, 97, 82, 81, 89, 85, 89, 97, 87,
+  96, 99, 79, 86, 92, 84, 97, 76, 92, 80,
+  82, 82, 95, 87, 82, 99, 91, 92, 89, 94,
+  86, 68, 79, 85, 59, 77, 78, 71, 88, 69,
+  88, 89, 90, 82, 89, 79, 88, 78, 86, 79,
+  81, 88, 85, 81, 68, 81, 86, 98, 82, 78,
+  111, 88, 77, 75, 85, 88, 62, 82, 72, 85,
+  82, 69, 84, 84, 85, 79, 82, 75, 110, 79,
+  90, 77, 90, 99, 69, 74, 85, 93, 76, 81,
+  79, 92, 75, 72, 93, 65, 86, 78, 78, 105,
+  86, 73, 78, 87, 87, 91, 71, 78, 80, 101,
+  81, 82, 99, 87, 85, 86, 83, 70, 84, 87,
+  98, 97, 97, 81, 88, 76, 90, 84, 88, 76,
+  100, 77, 92, 101, 80, 92, 96, 81, 104, 93,
+  82, 86, 116, 79, 93, 75, 105, 88, 89, 83,
+  97, 90, 82, 86, 101, 122, 82, 101, 81, 63,
+  90, 85, 89, 77, 81, 65, 92, 69, 87, 80,
+  97, 87, 93, 91, 90, 73, 90, 82, 76, 109,
+  102, 84, 49, 87, 90, 123, 86, 77, 112, 97,
+  74, 79, 95, 83, 67, 74, 74, 84, 74, 76,
+  83, 74, 86, 73, 88, 59, 122, 77, 79, 61,
+  95, 87, 76, 71, 94, 96, 87, 89, 64, 88,
+  79, 63, 113, 69, 77, 75, 64, 96, 82, 71,
+  60, 88, 87, 96, 71, 86, 78, 101, 87, 79,
+  107, 82, 86, 100, 93, 69, 84, 81, 98, 93,
+  95, 82, 103, 83, 96, 86, 80, 72, 97, 72,
+  92, 126, 77, 100, 81, 90, 98, 94, 79, 85,
+  102, 83, 98, 72, 89, 83, 89, 89, 97, 91,
+  80, 93, 87, 102, 91, 99, 80, 67, 82, 86,
+  84, 74, 81, 69, 90, 86, 89, 77, 100, 86,
+  84, 87, 88, 78, 95, 80, 79, 101, 94, 99,
+  61, 83, 87, 109, 86, 76, 114, 89, 77, 82,
+  89, 84, 67, 77, 74, 85, 80, 75, 78, 84,
+  87, 67, 94, 64, 116, 79, 92, 74, 93, 72,
+  84, 70, 94, 97, 84, 101, 72, 92, 90, 65,
+  111, 68, 82, 81, 69, 103, 94, 74, 68, 88,
+  87, 94, 69, 101, 83, 99, 86, 80, 99, 88,
+  84, 92, 92, 69, 85, 76, 94, 83, 98, 83,
+  89, 79, 77, 87, 87, 76, 97, 79, 83, 104,
+  90, 79, 85, 86, 85, 97, 65, 90, 82, 83,
+  88, 77, 84, 83, 91, 74, 94, 79, 80, 92,
+  82, 79, 88, 79, 78, 83, 75, 80, 53, 74,
+  81, 86, 82, 75, 87, 94, 74, 83, 74, 69,
+  89, 83, 93, 80, 78, 73, 72, 92, 77, 73,
+  89, 83, 78, 83, 85, 88, 72, 79, 69, 83,
+  71, 87, 73, 82, 76, 74, 86, 106, 85, 66,
+  77, 84, 89, 86, 92, 84, 83, 92, 69, 75,
+  79, 90, 76, 77, 94, 82, 81, 84, 84, 61,
+  86, 85, 89, 101, 83, 84, 87, 88, 80, 77,
+  59, 93, 84, 94, 78, 86, 82, 83, 71, 76,
+  79, 75, 81, 86, 73, 86, 83, 86, 88, 73,
+  80, 86, 92, 83, 88, 81, 85, 77, 101, 82,
+  84, 78, 88, 86, 67, 93, 84, 76, 93, 78,
+  97, 83, 92, 66, 96, 81, 82, 76, 83, 94,
+  84, 80, 72, 83, 88, 75, 79, 86, 84, 83,
+  82, 65, 91, 87, 78, 87, 86, 64, 93, 87,
+  82, 76, 76, 75, 76, 84, 69, 69, 91, 82,
+  75, 81, 79, 94, 74, 84, 75, 80, 65, 84,
+  78, 91, 59, 80, 91, 92, 77, 61, 74, 88,
+  96, 89, 86, 70, 86, 82, 68, 72, 83, 94,
+  81, 94, 94, 81, 78, 77, 82, 62, 78, 80,
+  92, 116, 77, 79, 78, 86, 82, 74, 46, 87,
+  86, 92, 75, 87, 81, 86, 75, 85, 81, 72,
+  88, 74, 82, 92, 82, 82, 97, 71, 82, 85,
+  94, 82, 79, 81, 85, 88, 91, 90, 81, 86,
+  84, 86, 67, 87, 83, 81, 95, 73, 90, 78,
+  90, 78, 92, 83, 83, 82, 84, 82, 96, 80,
+  74, 78, 79, 78, 75, 80, 82, 82, 88, 78,
+  88, 86, 81, 86, 86, 72, 90, 79, 84, 80,
+  78, 79, 74, 91, 74, 77, 91, 92, 77, 79,
+  88, 86, 74, 82, 75, 83, 71, 87, 78, 83,
+  72, 82, 93, 96, 83, 71, 79, 83, 91, 92,
+  86, 83, 85, 79, 63, 73, 82, 92, 82, 105,
+  90, 90, 78, 80, 90, 65, 88, 84, 85, 105,
+  84, 79, 80, 86, 79, 82, 57, 88, 83, 92,
+  77, 83, 79, 88, 68, 80, 81, 70, 83, 77,
+  84, 86, 95, 84, 90, 76, 76, 86, 90, 82,
+  82, 85, 81, 82, 100, 70, 82, 79, 83, 88,
+  73, 83, 77, 81, 83, 86, 87, 78, 96, 84,
+  93, 85, 76, 91, 84, 68, 78, 72, 75, 92,
+  87, 85, 76, 92, 88, 90, 81, 83, 91, 89,
+  86, 86, 69, 74, 86, 79, 106, 80, 93, 63,
+  75, 95, 86, 73, 78, 61, 67, 92, 67, 80,
+  80, 83, 67, 82, 82, 99, 79, 98, 78, 78,
+  89, 114, 95, 79, 82, 82, 88, 88, 94, 87,
+  72, 83, 82, 85, 72, 78, 73, 89, 105, 77,
+  79, 98, 70, 71, 89, 101, 92, 87, 77, 80,
+  89, 87, 86, 80, 66, 92, 78, 91, 82, 83,
+  87, 95, 80, 72, 92, 77, 84, 81, 80, 67,
+  78, 96, 89, 84, 76, 82, 87, 84, 76, 92,
+  89, 57, 99, 75, 80, 79, 73, 86, 70, 85,
+  73, 72, 79, 95, 81, 78, 93, 77, 99, 85,
+  73, 91, 90, 57, 86, 66, 77, 109, 83, 77,
+  112, 94, 88, 86, 75, 77, 90, 96, 83, 81,
+  74, 69, 89, 74, 98, 80, 89, 53, 63, 85,
+  100, 64, 74, 49, 64, 96, 55, 82, 82, 78,
+  57, 79, 81, 102, 95, 88, 76, 73, 95, 117,
+  91, 78, 86, 88, 83, 90, 98, 76, 66, 82,
+  94, 83, 70, 87, 66, 91, 125, 81, 85, 104,
+  59, 66, 81, 98, 96, 92, 83, 85, 91, 83,
+  74, 67, 55, 81, 81, 90, 80, 80, 79, 96,
+  73, 68, 90, 78, 94, 79, 83, 70, 85, 97,
+  78, 82, 77, 81, 84, 84, 64, 100, 86, 49,
+  106, 82, 90, 82, 82, 82, 78, 86, 77, 80,
+  89, 86, 88, 71, 92, 85, 99, 88, 82, 88,
+  99, 66, 94, 73, 77, 93, 84, 85, 102, 87,
+  89, 86, 79, 73, 97, 92, 85, 85, 88, 78,
+  89, 83, 89, 80, 97, 64, 68, 83, 87, 71,
+  81, 66, 66, 87, 69, 82, 80, 79, 66, 82,
+  81, 97, 84, 92, 77, 85, 95, 113, 93, 86,
+  84, 80, 90, 94, 98, 86, 76, 84, 81, 89,
+  68, 81, 71, 85, 113, 83, 77, 99, 70, 71,
+  90, 98, 92, 93, 85, 80, 90, 86, 80, 81,
+  66, 77, 83, 90, 87, 85, 86, 97, 75, 71,
+  88, 81, 88, 77, 87, 78, 98, 98, 90, 83,
+  84, 81, 81, 85, 70, 95, 91, 58, 85, 78,
+  98, 70, 68, 84, 94, 78, 100, 47, 78, 98,
+  93, 98, 63, 69, 84, 86, 69, 95, 87, 87,
+  79, 104, 89, 77, 87, 57, 92, 74, 79, 87,
+  72, 85, 70, 115, 94, 75, 85, 75, 83, 87,
+  91, 67, 81, 91, 88, 79, 64, 93, 85, 89,
+  98, 67, 96, 87, 82, 89, 73, 72, 86, 79,
+  79, 87, 73, 71, 81, 80, 87, 124, 79, 79,
+  76, 74, 85, 72, 89, 76, 75, 72, 81, 77,
+  74, 86, 76, 94, 81, 101, 82, 89, 78, 82,
+  63, 84, 114, 82, 101, 103, 98, 90, 78, 75,
+  78, 72, 113, 84, 82, 79, 75, 89, 89, 80,
+  63, 104, 90, 86, 76, 90, 90, 100, 94, 76,
+  83, 90, 86, 93, 89, 90, 84, 91, 86, 63,
+  60, 78, 85, 74, 105, 30, 71, 101, 92, 87,
+  67, 63, 85, 85, 55, 93, 82, 91, 76, 99,
+  83, 78, 84, 47, 99, 73, 76, 90, 74, 79,
+  71, 82, 96, 71, 84, 80, 86, 84, 87, 67,
+  74, 91, 94, 76, 65, 93, 84, 93, 94, 70,
+  95, 98, 71, 92, 64, 67, 78, 76, 80, 74,
+  76, 71, 82, 76, 81, 116, 107, 78, 67, 69,
+  89, 64, 89, 77, 79, 74, 82, 81, 65, 89,
+  69, 80, 87, 97, 84, 83, 64, 84, 60, 81,
+  111, 81, 110, 105, 77, 95, 75, 77, 64, 69,
+  125, 77, 77, 63, 75, 87, 94, 82, 60, 85,
+  94, 76, 80, 94, 88, 99, 97, 78, 74, 82,
+  88, 97, 83, 88, 83, 86, 83, 88, 86, 83,
+  92, 96, 93, 72, 83, 85, 74, 83, 67, 76,
+  80, 78, 91, 98, 89, 87, 74, 96, 86, 87,
+  90, 89, 75, 71, 87, 87, 68, 101, 71, 72,
+  89, 74, 90, 81, 79, 85, 80, 78, 88, 83,
+  89, 93, 69, 87, 94, 77, 88, 74, 88, 86,
+  81, 91, 81, 78, 90, 91, 80, 77, 68, 77,
+  70, 91, 88, 95, 78, 83, 82, 79, 90, 84,
+  88, 84, 78, 78, 81, 82, 87, 91, 87, 86,
+  107, 106, 81, 79, 85, 79, 70, 84, 126, 86,
+  96, 99, 85, 84, 79, 82, 102, 75, 91, 84,
+  79, 85, 70, 90, 92, 80, 73, 81, 78, 87,
+  93, 89, 91, 94, 89, 81, 85, 99, 84, 89,
+  93, 86, 85, 65, 89, 61, 70, 92, 99, 60,
+  94, 26, 69, 74, 94, 95, 70, 69, 84, 87,
+  43, 85, 104, 87, 88, 99, 89, 77, 91, 33,
+  111, 80, 92, 94, 79, 78, 96, 106, 90, 110,
+  86, 78, 76, 92, 88, 74, 73, 84, 104, 81,
+  75, 80, 85, 86, 104, 70, 89, 101, 69, 78,
+  69, 82, 74, 88, 90, 83, 86, 70, 87, 70,
+  84, 86, 95, 76, 79, 92, 82, 67, 93, 79,
+  79, 79, 90, 78, 64, 79, 71, 95, 76, 87,
+  96, 76, 63, 76, 65, 92, 78, 85, 105, 98,
+  93, 95, 65, 84, 60, 64, 109, 75, 86, 78,
+  73, 92, 97, 89, 61, 92, 83, 74, 69, 101,
+  101, 83, 102, 66, 96, 68, 81, 99, 83, 91,
+  84, 102, 78, 51, 69, 66, 96, 53, 100, 5,
+  61, 78, 112, 94, 73, 66, 87, 91, 28, 87,
+  80, 93, 72, 97, 77, 79, 86, 24, 114, 85,
+  93, 103, 89, 67, 89, 72, 92, 120, 91, 87,
+  76, 96, 100, 75, 66, 79, 110, 75, 77, 78,
+  84, 86, 102, 73, 74, 91, 62, 83, 60, 74,
+  74, 86, 89, 88, 62, 75, 94, 72, 90, 74,
+  84, 75, 71, 88, 91, 51, 92, 75, 77, 84,
+  90, 82, 61, 88, 74, 94, 74, 80, 102, 81,
+  58, 71, 57, 97, 62, 85, 108, 104, 101, 91,
+  65, 75, 40, 64, 102, 63, 76, 62, 76, 91,
+  103, 96, 59, 72, 89, 67, 73, 108, 116, 73,
+  87, 66, 88, 61, 81, 97, 76, 95, 84, 96,
+  79, 79, 81, 91, 87, 73, 89, 48, 77, 73,
+  73, 92, 69, 77, 76, 78, 69, 94, 83, 87,
+  89, 94, 80, 87, 98, 61, 91, 83, 79, 90,
+  69, 92, 79, 63, 96, 93, 85, 83, 78, 86,
+  93, 75, 86, 75, 82, 98, 82, 81, 91, 85,
+  83, 74, 97, 86, 77, 85, 77, 85, 82, 91,
+  87, 78, 87, 77, 75, 76, 76, 81, 101, 83,
+  85, 92, 88, 85, 84, 86, 76, 80, 86, 80,
+  72, 95, 79, 92, 98, 99, 97, 74, 78, 91,
+  75, 82, 109, 89, 103, 94, 84, 84, 78, 81,
+  89, 68, 94, 75, 87, 83, 77, 86, 92, 80,
+  69, 76, 82, 79, 110, 89, 73, 89, 80, 78,
+  82, 87, 81, 95, 81, 88, 89, 68, 70, 78,
+  86, 82, 94, 73, 91, 68, 75, 85, 79, 87,
+  64, 80, 82, 77, 91, 90, 88, 85, 79, 81,
+  93, 82, 93, 63, 86, 84, 84, 78, 71, 90,
+  97, 107, 87, 97, 83, 83, 84, 81, 85, 82,
+  79, 78, 94, 81, 75, 88, 80, 75, 97, 83,
+  90, 92, 70, 75, 72, 80, 80, 93, 93, 86,
+  95, 78, 75, 93, 82, 77, 92, 84, 98, 90,
+  76, 90, 93, 87, 95, 76, 88, 80, 88, 98,
+  84, 84, 77, 98, 82, 81, 83, 88, 74, 81,
+  88, 83, 86, 93, 78, 93, 77, 93, 96, 73,
+  67, 90, 86, 89, 83, 86, 82, 88, 78, 100,
+  88, 77, 78, 104, 91, 88, 82, 73, 99, 84,
+  84, 98, 83, 83, 89, 84, 73, 72, 82, 71,
+  89, 65, 91, 56, 74, 84, 86, 90, 65, 81,
+  83, 74, 85, 93, 74, 92, 83, 74, 83, 82,
+  90, 52, 89, 100, 78, 78, 75, 80, 84, 93,
+  87, 96, 88, 84, 92, 80, 78, 79, 75, 69,
+  87, 77, 79, 91, 80, 87, 96, 82, 87, 82,
+  68, 82, 69, 81, 82, 97, 99, 82, 92, 88,
+  75, 90, 79, 85, 82, 88, 95, 88, 73, 80,
+  94, 85, 90, 73, 89, 79, 76, 100, 92, 88,
+  84, 102, 78, 67, 68, 79, 74, 72, 82, 82,
+  89, 95, 79, 87, 77, 93, 86, 70, 57, 86,
+  78, 79, 74, 81, 80, 89, 69, 89, 97, 72,
+  105, 102, 89, 83, 82, 75, 92, 81, 82, 91,
+  73, 86, 88, 88, 70, 87, 91, 87, 89, 86,
+  88, 75, 79, 88, 81, 95, 61, 83, 75, 76,
+  88, 90, 88, 78, 83, 86, 86, 80, 97, 80,
+  76, 91, 86, 80, 69, 88, 77, 82, 87, 94,
+  89, 84, 84, 80, 89, 83, 88, 79, 88, 92,
+  82, 85, 89, 77, 88, 85, 90, 78, 81, 77,
+  75, 77, 80, 86, 91, 81, 88, 81, 70, 90,
+  76, 70, 85, 86, 92, 87, 82, 89, 88, 81,
+  80, 77, 83, 84, 91, 93, 76, 85, 93, 90,
+  86, 77, 95, 90, 78, 79, 96, 81, 91, 90,
+  89, 73, 76, 81, 102, 77, 72, 86, 87, 90,
+  84, 88, 85, 85, 86, 85, 84, 82, 104, 101,
+  85, 90, 87, 83, 83, 95, 80, 95, 83, 85,
+  75, 82, 95, 72, 71, 84, 79, 77, 70, 81,
+  76, 93, 77, 83, 82, 68, 73, 79, 78, 85,
+  90, 72, 86, 81, 73, 99, 71, 79, 105, 92,
+  93, 95, 77, 85, 66, 84, 94, 72, 78, 75,
+  55, 72, 84, 82, 93, 57, 82, 89, 96, 69,
+  78, 71, 84, 85, 67, 86, 79, 83, 87, 71,
+  125, 92, 88, 86, 92, 80, 77, 88, 76, 78,
+  75, 93, 84, 81, 75, 81, 88, 86, 96, 95,
+  80, 97, 81, 104, 87, 95, 92, 100, 81, 92,
+  77, 79, 92, 86, 79, 100, 87, 83, 87, 82,
+  62, 90, 92, 92, 80, 91, 77, 80, 92, 74,
+  89, 74, 76, 78, 88, 93, 92, 97, 87, 92,
+  86, 77, 70, 88, 77, 84, 82, 59, 71, 74,
+  81, 66, 70, 76, 82, 74, 61, 71, 75, 99,
+  80, 84, 84, 70, 68, 80, 71, 89, 82, 62,
+  87, 76, 74, 109, 62, 69, 106, 85, 103, 83,
+  70, 92, 79, 84, 104, 59, 79, 75, 58, 69,
+  95, 88, 100, 57, 79, 77, 94, 66, 83, 66,
+  79, 88, 53, 87, 78, 81, 95, 71, 122, 87,
+  95, 84, 83, 83, 76, 92, 81, 63, 81, 99,
+  81, 82, 78, 81, 81, 93, 108, 90, 81, 107,
+  71, 87, 101, 95, 92, 101, 80, 92, 77, 86,
+  93, 83, 75, 111, 77, 82, 80, 74, 54, 85,
+  84, 94, 76, 95, 74, 82, 87, 68, 100, 72,
+  73, 85, 93, 101, 72, 88, 81, 96, 86, 72,
+  65, 79, 74, 85, 89, 52, 79, 64, 75, 80,
+  78, 82, 80, 81, 76, 82, 77, 90, 83, 84,
+  85, 72, 76, 77, 79, 81, 82, 68, 89, 83,
+  78, 95, 77, 81, 98, 79, 85, 83, 80, 71,
+  84, 95, 87, 73, 78, 76, 64, 76, 84, 89,
+  100, 69, 89, 89, 88, 75, 83, 79, 86, 80,
+  69, 80, 82, 79, 94, 72, 111, 85, 85, 84,
+  91, 80, 78, 85, 79, 73, 91, 97, 87, 79,
+  77, 84, 95, 97, 98, 92, 81, 91, 80, 79,
+  79, 87, 85, 92, 88, 92, 79, 95, 96, 87,
+  89, 96, 89, 83, 78, 89, 64, 87, 92, 91,
+  79, 90, 79, 84, 91, 79, 85, 78, 79, 92,
+  90, 89, 78, 96, 91, 86, 91, 74, 78, 92,
+  77, 83, 83, 69, 78, 82, 84, 73, 88, 83,
+  100, 73, 79, 82, 84, 88, 79, 107, 93, 70,
+  67, 81, 90, 79, 99, 81, 77, 88, 74, 82,
+  80, 84, 91, 84, 90, 83, 88, 89, 68, 78,
+  75, 70, 60, 70, 81, 79, 79, 90, 92, 64,
+  88, 82, 78, 68, 83, 82, 77, 86, 66, 73,
+  76, 71, 85, 82, 111, 94, 78, 84, 78, 82,
+  77, 87, 76, 60, 72, 87, 79, 73, 86, 87,
+  84, 90, 78, 92, 70, 87, 85, 83, 79, 92,
+  86, 93, 84, 86, 84, 75, 76, 82, 73, 96,
+  78, 87, 87, 87, 59, 89, 90, 83, 87, 80,
+  88, 81, 105, 71, 87, 84, 79, 86, 85, 91,
+  94, 86, 98, 84, 89, 80, 76, 84, 80, 91,
+  80, 79, 80, 85, 73, 80, 81, 78, 99, 72,
+  92, 88, 83, 91, 87, 77, 94, 77, 65, 89,
+  92, 77, 84, 72, 83, 98, 79, 70, 90, 90,
+  84, 77, 84, 88, 86, 88, 69, 72, 82, 72,
+  80, 64, 81, 85, 93, 89, 96, 72, 96, 83,
+  71, 69, 86, 75, 82, 85, 64, 88, 78, 71,
+  85, 80, 118, 87, 76, 87, 69, 86, 77, 83,
+  75, 58, 73, 90, 81, 78, 84, 89, 87, 89,
+  74, 86, 71, 86, 87, 80, 64, 92, 81, 89,
+  85, 94, 87, 76, 74, 79, 69, 88, 74, 92,
+  84, 90, 57, 83, 97, 86, 106, 79, 89, 79,
+  106, 76, 81, 75, 89, 84, 76, 88, 93, 82,
+  96, 86, 94, 72, 72, 89, 72, 85, 88, 82,
+  80, 81, 73, 77, 84, 78, 93, 76, 81, 82,
+  81, 83, 80, 63, 91, 73, 71, 76, 85, 80,
+  76, 79, 83, 91, 86, 85, 79, 87, 85, 86,
+  78, 89, 86, 84, 76, 93, 78, 69, 103, 72,
+  86, 77, 94, 94, 94, 66, 91, 93, 79, 74,
+  85, 78, 80, 85, 73, 98, 78, 74, 87, 80,
+  96, 88, 73, 80, 81, 78, 81, 89, 76, 64,
+  91, 86, 82, 74, 81, 89, 83, 83, 87, 88,
+  74, 88, 82, 78, 79, 92, 86, 89, 85, 86,
+  86, 78, 79, 85, 77, 93, 77, 86, 76, 85,
+  62, 88, 86, 81, 87, 84, 85, 83, 99, 79,
+  84, 84, 83, 87, 69, 84, 92, 85, 94, 85,
+  81, 77, 83, 87, 82, 86, 79, 82, 94, 87,
+  90, 91, 98, 94, 91, 75, 90, 84, 84, 74,
+  88, 86, 85, 79, 70, 84, 97, 84, 86, 102,
+  81, 97, 86, 74, 107, 90, 87, 87, 70, 89,
+  102, 83, 89, 94, 78, 81, 67, 82, 95, 87,
+  70, 91, 91, 89, 98, 77, 57, 90, 72, 95,
+  80, 83, 93, 81, 77, 73, 93, 80, 88, 94,
+  72, 82, 83, 80, 77, 83, 74, 80, 95, 74,
+  85, 67, 91, 81, 73, 86, 74, 82, 79, 71,
+  97, 82, 75, 85, 81, 77, 89, 85, 82, 80,
+  72, 76, 90, 79, 84, 78, 97, 92, 74, 90,
+  86, 75, 97, 84, 96, 83, 113, 95, 80, 92,
+  88, 86, 74, 80, 98, 74, 93, 82, 95, 87,
+  92, 85, 91, 92, 81, 93, 99, 94, 92, 104,
+  84, 87, 86, 77, 103, 96, 83, 72, 100, 78,
+  94, 84, 73, 86, 99, 82, 73, 110, 85, 104,
+  93, 62, 119, 104, 76, 89, 62, 95, 109, 76,
+  96, 82, 87, 94, 77, 82, 94, 95, 80, 86,
+  85, 94, 103, 85, 49, 100, 76, 96, 86, 80,
+  93, 80, 74, 68, 96, 78, 83, 88, 71, 87,
+  79, 87, 74, 78, 70, 81, 84, 71, 94, 72,
+  86, 77, 77, 75, 69, 79, 82, 72, 101, 91,
+  58, 86, 76, 67, 83, 90, 76, 81, 70, 74,
+  86, 71, 89, 82, 97, 92, 73, 73, 87, 75,
+  108, 88, 99, 76, 109, 103, 79, 91, 93, 77,
+  77, 80, 104, 72, 92, 82, 88, 85, 92, 85,
+  89, 83, 79, 98, 91, 102, 85, 90, 84, 87,
+  91, 82, 91, 89, 83, 78, 88, 76, 83, 81,
+  75, 81, 95, 82, 73, 99, 88, 95, 96, 79,
+  100, 87, 78, 88, 69, 94, 101, 90, 88, 86,
+  80, 81, 91, 79, 100, 85, 84, 91, 83, 84,
+  95, 87, 70, 91, 74, 97, 84, 84, 93, 82,
+  79, 79, 89, 82, 86, 87, 75, 79, 85, 83,
+  82, 84, 77, 82, 88, 80, 84, 68, 84, 87,
+  74, 75, 74, 83, 84, 73, 92, 89, 79, 93,
+  91, 74, 88, 89, 81, 85, 74, 80, 91, 80,
+  81, 78, 87, 88, 74, 83, 85, 76, 94, 85,
+  89, 82, 103, 90, 80, 86, 89, 81, 76, 86,
+  105, 76, 92, 83, 79, 86, 91, 87, 92, 92,
+  80, 85, 93, 84, 73, 92, 86, 71, 83, 81,
+  80, 90, 79, 71, 75, 95, 80, 105, 92, 73,
+  79, 92, 67, 73, 77, 91, 81, 82, 74, 79,
+  87, 86, 100, 74, 84, 88, 104, 72, 82, 83,
+  81, 80, 81, 80, 86, 96, 72, 108, 115, 82,
+  89, 82, 75, 69, 87, 96, 80, 99, 91, 94,
+  98, 82, 93, 114, 97, 90, 74, 69, 101, 76,
+  136, 74, 80, 57, 68, 84, 75, 82, 80, 69,
+  86, 79, 97, 88, 86, 73, 94, 95, 81, 78,
+  94, 74, 67, 86, 82, 84, 70, 66, 79, 86,
+  98, 75, 73, 83, 89, 81, 99, 91, 84, 83,
+  97, 76, 70, 81, 85, 74, 86, 88, 83, 77,
+  79, 85, 88, 80, 91, 85, 92, 97, 79, 85,
+  88, 88, 51, 82, 75, 70, 86, 82, 85, 88,
+  87, 76, 95, 102, 86, 74, 83, 81, 82, 76,
+  93, 81, 81, 95, 72, 87, 70, 82, 87, 79,
+  89, 79, 77, 92, 103, 73, 84, 87, 72, 79,
+  73, 91, 89, 89, 75, 89, 71, 98, 91, 87,
+  83, 78, 85, 91, 70, 100, 96, 75, 83, 86,
+  88, 93, 89, 90, 65, 73, 83, 85, 107, 72,
+  70, 77, 74, 82, 75, 79, 87, 70, 77, 82,
+  85, 86, 89, 65, 92, 77, 77, 77, 77, 86,
+  63, 83, 78, 96, 64, 73, 86, 81, 104, 81,
+  71, 92, 86, 82, 91, 83, 88, 89, 95, 79,
+  68, 80, 87, 78, 73, 71, 64, 86, 90, 90,
+  74, 79, 77, 91, 81, 88, 88, 90, 83, 88,
+  66, 80, 71, 99, 84, 80, 84, 89, 96, 78,
+  93, 87, 85, 71, 80, 103, 84, 81, 100, 75,
+  83, 93, 76, 90, 79, 89, 89, 81, 86, 87,
+  76, 83, 94, 81, 85, 81, 78, 81, 76, 89,
+  84, 79, 84, 80, 63, 88, 92, 86, 86, 87,
+  87, 90, 73, 88, 84, 81, 73, 79, 86, 79,
+  90, 79, 87, 91, 81, 85, 83, 82, 84, 85,
+  90, 82, 80, 76, 85, 86, 83, 101, 83, 82,
+  81, 81, 81, 74, 76, 87, 81, 94, 72, 85,
+  77, 93, 85, 84, 88, 92, 84, 91, 84, 99,
+  85, 83, 77, 85, 78, 85, 86, 89, 79, 80,
+  93, 88, 77, 79, 66, 82, 85, 100, 83, 83,
+  77, 88, 82, 85, 98, 89, 89, 80, 78, 75,
+  75, 57, 82, 80, 81, 101, 70, 87, 65, 96,
+  73, 91, 78, 70, 66, 95, 79, 102, 105, 83,
+  89, 64, 79, 76, 89, 65, 64, 72, 92, 75,
+  89, 77, 82, 84, 86, 77, 100, 76, 95, 80,
+  100, 111, 97, 93, 92, 87, 81, 60, 85, 73,
+  111, 86, 120, 64, 158, 69, 74, 147, 106, 76,
+  86, 78, 85, 101, 104, 78, 73, 56, 101, 67,
+  65, 118, 80, 60, 81, 77, 78, 72, 104, 85,
+  75, 76, 81, 78, 74, 82, 73, 93, 94, 76,
+  78, 55, 70, 86, 95, 116, 73, 78, 92, 84,
+  98, 99, 93, 76, 82, 85, 59, 73, 85, 80,
+  78, 101, 77, 86, 76, 92, 70, 65, 87, 87,
+  86, 73, 75, 83, 101, 85, 67, 87, 74, 58,
+  79, 83, 89, 88, 83, 80, 100, 100, 76, 77,
+  78, 82, 79, 77, 112, 96, 104, 82, 75, 83,
+  71, 80, 91, 77, 71, 87, 78, 97, 85, 81,
+  88, 83, 88, 87, 81, 96, 72, 92, 85, 83,
+  68, 127, 87, 91, 83, 97, 87, 87, 86, 84,
+  91, 64, 103, 77, 68, 86, 92, 66, 73, 72,
+  72, 89, 83, 85, 89, 81, 76, 76, 57, 87,
+  84, 57, 63, 84, 80, 77, 94, 79, 96, 73,
+  87, 87, 67, 86, 62, 75, 84, 82, 77, 74,
+  89, 83, 83, 94, 73, 82, 81, 82, 79, 77,
+  93, 86, 91, 80, 76, 78, 79, 91, 84, 83,
+  77, 90, 79, 84, 79, 75, 89, 88, 86, 71,
+  74, 82, 93, 93, 78, 91, 71, 90, 87, 81,
+  82, 85, 90, 82, 105, 78, 92, 73, 84, 106,
+  89, 88, 101, 80, 87, 89, 78, 96, 75, 85,
+  96, 82, 99, 96, 81, 91, 93, 87, 85, 88,
+  84, 83, 71, 93, 83, 87, 84, 74, 75, 93,
+  88, 89, 90, 95, 91, 98, 73, 81, 73, 80,
+  60, 83, 85, 72, 79, 71, 79, 89, 90, 79,
+  78, 73, 82, 83, 79, 83, 81, 63, 82, 94,
+  74, 95, 87, 85, 80, 80, 90, 88, 81, 91,
+  80, 92, 69, 68, 67, 82, 79, 90, 93, 94,
+  70, 81, 81, 91, 86, 84, 79, 69, 88, 92,
+  90, 91, 93, 80, 91, 89, 76, 79, 74, 88,
+  87, 87, 87, 90, 77, 89, 84, 80, 97, 89,
+  100, 92, 79, 77, 76, 60, 72, 88, 86, 92,
+  82, 89, 79, 90, 64, 87, 75, 90, 84, 90,
+  74, 97, 112, 76, 84, 79, 76, 77, 83, 75,
+  84, 86, 77, 73, 87, 94, 82, 85, 90, 78,
+  83, 79, 94, 99, 83, 69, 93, 96, 86, 82,
+  82, 80, 85, 79, 92, 81, 95, 83, 113, 90,
+  75, 104, 112, 85, 76, 68, 76, 99, 78, 99,
+  60, 64, 97, 79, 73, 96, 92, 55, 80, 71,
+  84, 74, 93, 92, 84, 84, 83, 88, 89, 88,
+  81, 90, 98, 80, 90, 79, 81, 78, 81, 84,
+  88, 78, 98, 85, 80, 79, 100, 80, 114, 93,
+  77, 87, 81, 86, 94, 81, 90, 84, 82, 96,
+  74, 82, 100, 83, 87, 72, 82, 79, 98, 81,
+  86, 90, 74, 71, 79, 80, 92, 84, 82, 71,
+  101, 79, 81, 79, 76, 89, 79, 73, 81, 90,
+  102, 84, 88, 89, 74, 82, 83, 84, 92, 98,
+  64, 92, 85, 91, 94, 88, 87, 85, 78, 92,
+  79, 97, 72, 71, 94, 103, 82, 87, 86, 94,
+  90, 87, 80, 60, 74, 83, 84, 96, 77, 81,
+  90, 72, 79, 64, 82, 77, 81, 82, 90, 83,
+  83, 84, 69, 74, 83, 69, 69, 81, 86, 78,
+  83, 79, 91, 87, 87, 89, 81, 85, 55, 78,
+  80, 88, 74, 88, 87, 78, 61, 79, 77, 68,
+  86, 80, 81, 69, 88, 84, 100, 91, 97, 85,
+  81, 89, 95, 81, 78, 87, 81, 80, 90, 81,
+  98, 87, 91, 70, 81, 78, 90, 82, 84, 92,
+  67, 79, 87, 74, 79, 85, 87, 74, 91, 68,
+  97, 69, 83, 103, 88, 86, 84, 89, 95, 96,
+  82, 84, 77, 84, 82, 84, 97, 99, 81, 95,
+  89, 85, 94, 88, 88, 78, 83, 89, 82, 86,
+  74, 73, 91, 92, 84, 86, 90, 89, 88, 90,
+  75, 71, 75, 90, 75, 84, 92, 86, 79, 80,
+  90, 88, 92, 75, 81, 78, 76, 80, 89, 78,
+  81, 68, 81, 87, 77, 95, 90, 80, 74, 79,
+  79, 95, 79, 88, 81, 85, 67, 76, 76, 82,
+  71, 93, 84, 92, 65, 83, 78, 87, 82, 82,
+  89, 80, 83, 89, 69, 96, 93, 87, 90, 82,
+  82, 88, 88, 91, 88, 85, 88, 87, 73, 92,
+  78, 79, 95, 87, 83, 72, 104, 86, 75, 86,
+  73, 81, 80, 78, 89, 84, 70, 74, 76, 82,
+  85, 77, 82, 76, 85, 81, 100, 90, 61, 72,
+  87, 75, 76, 82, 90, 80, 85, 74, 79, 106,
+  97, 75, 83, 77, 88, 74, 76, 70, 97, 75,
+  89, 60, 89, 78, 87, 80, 81, 79, 90, 89,
+  79, 69, 74, 122, 77, 77, 82, 83, 88, 86,
+  94, 102, 79, 90, 83, 105, 83, 88, 78, 83,
+  77, 97, 80, 77, 82, 82, 81, 75, 67, 98,
+  78, 90, 89, 105, 82, 94, 86, 132, 82, 90,
+  86, 92, 96, 92, 74, 78, 80, 71, 93, 94,
+  95, 68, 87, 75, 90, 90, 75, 83, 78, 101,
+  84, 96, 80, 85, 92, 66, 71, 94, 78, 79,
+  69, 87, 84, 71, 75, 77, 72, 83, 72, 77,
+  69, 66, 84, 73, 68, 76, 69, 79, 86, 71,
+  73, 45, 78, 83, 83, 94, 69, 74, 85, 63,
+  103, 74, 95, 87, 83, 75, 80, 74, 76, 68,
+  80, 70, 77, 70, 91, 65, 95, 81, 90, 77,
+  85, 71, 69, 92, 78, 82, 85, 82, 71, 68,
+  74, 116, 83, 82, 69, 106, 77, 85, 90, 102,
+  73, 87, 93, 96, 72, 94, 70, 75, 72, 61,
+  82, 78, 81, 71, 84, 83, 72, 85, 75, 89,
+  77, 106, 65, 96, 94, 139, 85, 95, 97, 92,
+  81, 89, 66, 106, 71, 71, 104, 94, 95, 55,
+  91, 76, 91, 106, 66, 75, 90, 113, 74, 104,
+  85, 80, 97, 59, 64, 86, 75, 83, 62, 77,
+  79, 85, 82, 90, 80, 100, 76, 87, 87, 90,
+  85, 95, 70, 87, 77, 83, 85, 79, 81, 65,
+  81, 78, 88, 86, 84, 74, 85, 83, 77, 93,
+  80, 90, 88, 97, 90, 89, 91, 83, 78, 86,
+  84, 81, 93, 84, 98, 79, 91, 107, 86, 85,
+  87, 94, 89, 78, 80, 76, 84, 73, 79, 103,
+  81, 83, 87, 65, 87, 88, 72, 94, 81, 69,
+  83, 92, 83, 74, 73, 84, 84, 71, 80, 76,
+  91, 82, 79, 95, 78, 90, 92, 85, 96, 100,
+  89, 101, 86, 108, 102, 81, 72, 86, 81, 90,
+  78, 75, 82, 78, 87, 93, 88, 79, 72, 80,
+  94, 79, 77, 89, 82, 92, 94, 87, 88, 74,
+  85, 72, 81, 89, 86, 76, 73, 95, 80, 62,
+  94, 74, 75, 83, 71, 83, 80, 60, 83, 87,
+  75, 82, 74, 93, 94, 83, 85, 73, 84, 58,
+  106, 96, 61, 75, 85, 67, 106, 78, 84, 80,
+  83, 79, 71, 119, 84, 80, 78, 79, 80, 73,
+  79, 64, 78, 91, 89, 77, 82, 61, 83, 75,
+  73, 84, 86, 86, 79, 53, 68, 147, 89, 95,
+  84, 73, 90, 64, 78, 100, 99, 100, 104, 96,
+  98, 82, 73, 77, 64, 79, 76, 89, 80, 76,
+  82, 102, 73, 88, 72, 91, 83, 101, 72, 77,
+  73, 131, 88, 84, 89, 88, 92, 80, 53, 90,
+  77, 83, 94, 83, 91, 51, 90, 77, 93, 89,
+  59, 90, 80, 78, 65, 109, 87, 72, 86, 51,
+  70, 83, 86, 78, 76, 77, 65, 69, 81, 62,
+  64, 78, 67, 77, 66, 42, 80, 83, 67, 80,
+  70, 91, 104, 71, 73, 44, 78, 53, 79, 90,
+  62, 83, 78, 55, 124, 79, 83, 78, 75, 73,
+  68, 84, 65, 93, 81, 63, 70, 67, 82, 60,
+  72, 76, 81, 70, 80, 50, 83, 74, 66, 88,
+  68, 85, 69, 54, 59, 176, 101, 86, 68, 86,
+  77, 59, 74, 109, 97, 77, 81, 109, 89, 82,
+  75, 73, 43, 74, 73, 94, 80, 88, 78, 106,
+  86, 92, 70, 88, 77, 94, 64, 78, 61, 137,
+  76, 86, 97, 88, 77, 75, 45, 87, 60, 85,
+  105, 74, 92, 41, 87, 72, 102, 87, 45, 72,
+  80, 80, 82, 125, 91, 67, 102, 39, 62, 75,
+  90, 81, 86, 65, 79, 89, 90, 88, 86, 100,
+  75, 83, 85, 78, 78, 97, 70, 85, 81, 91,
+  93, 83, 82, 69, 79, 77, 73, 91, 79, 70,
+  82, 77, 98, 97, 76, 86, 88, 92, 81, 80,
+  82, 80, 79, 89, 86, 88, 86, 81, 85, 96,
+  90, 83, 97, 81, 83, 88, 83, 76, 88, 88,
+  85, 60, 73, 102, 92, 92, 95, 65, 80, 73,
+  68, 96, 82, 91, 75, 84, 93, 80, 76, 83,
+  85, 83, 70, 75, 87, 66, 79, 95, 80, 85,
+  99, 104, 86, 93, 80, 102, 82, 105, 115, 80,
+  81, 85, 85, 80, 65, 75, 79, 82, 84, 90,
+  83, 73, 82, 87, 100, 88, 73, 83, 74, 89,
+  114, 93, 84, 79, 95, 65, 84, 85, 82, 86,
+  75, 90, 90, 76, 84, 91, 78, 76, 70, 82,
+  80, 74, 76, 81, 83, 92, 77, 91, 95, 91,
+  91, 85, 86, 75, 85, 112, 76, 72, 103, 81,
+  81, 73, 94, 86, 78, 81, 93, 104, 88, 81,
+  86, 83, 89, 76, 78, 74, 69, 91, 93, 82,
+  89, 77, 78, 76, 78, 79, 84, 85, 74, 73,
+  83, 115, 81, 100, 94, 85, 93, 69, 74, 81,
+  89, 113, 92, 80, 107, 87, 78, 76, 84, 93,
+  86, 75, 81, 79, 98, 91, 76, 86, 75, 104,
+  83, 86, 75, 76, 83, 121, 84, 67, 85, 84,
+  92, 79, 58, 87, 95, 78, 76, 80, 92, 70,
+  79, 92, 83, 92, 75, 86, 84, 97, 70, 80,
+  90, 93, 84, 67, 70, 90, 83, 74, 77, 93,
+  82, 76, 85, 84, 69, 76, 70, 79, 72, 62,
+  80, 75, 70, 93, 87, 95, 101, 82, 87, 62,
+  79, 71, 75, 103, 73, 74, 101, 70, 101, 95,
+  87, 71, 75, 71, 80, 87, 78, 96, 94, 71,
+  83, 73, 82, 73, 65, 77, 80, 80, 89, 71,
+  83, 80, 72, 81, 77, 84, 68, 75, 75, 138,
+  89, 91, 78, 93, 94, 70, 67, 82, 91, 89,
+  87, 91, 100, 83, 75, 72, 72, 80, 83, 78,
+  81, 88, 100, 97, 88, 96, 75, 108, 69, 80,
+  62, 71, 75, 119, 78, 64, 95, 91, 81, 77,
+  58, 90, 88, 77, 69, 78, 97, 52, 68, 87,
+  87, 87, 63, 77, 80, 79, 90, 90, 82, 90,
+  91, 57, 61, 89, 80, 78, 83, 85, 83, 88,
+  81, 92, 87, 93, 79, 85, 83, 85, 76, 89,
+  78, 83, 75, 88, 95, 87, 87, 76, 81, 73,
+  71, 105, 83, 73, 96, 92, 77, 103, 83, 80,
+  84, 95, 75, 81, 90, 79, 87, 92, 94, 89,
+  86, 89, 76, 100, 100, 88, 92, 79, 79, 83,
+  87, 80, 93, 87, 79, 75, 86, 91, 85, 97,
+  100, 63, 79, 74, 69, 86, 85, 103, 85, 77,
+  91, 83, 86, 82, 95, 77, 76, 70, 89, 74,
+  95, 85, 78, 80, 93, 103, 88, 82, 87, 87,
+  90, 99, 104, 74, 79, 79, 100, 78, 66, 102,
+  88, 77, 76, 83, 76, 90, 83, 96, 91, 90,
+  85, 77, 91, 95, 92, 81, 89, 88, 85, 75,
+  89, 86, 87, 86, 76, 93, 85, 82, 99, 89,
+  84, 80, 80, 94, 92, 70, 85, 88, 98, 76,
+  74, 83, 99, 97, 97, 89, 47, 74, 96, 95,
+  100, 69, 81, 84, 88, 90, 75, 87, 99, 75,
+  84, 87, 71, 81, 91, 86, 69, 82, 97, 84,
+  82, 83, 105, 70, 76, 93, 90, 97, 83, 84,
+  96, 89, 89, 94, 90, 81, 78, 82, 73, 77,
+  69, 98, 95, 82, 89, 93, 91, 80, 95, 67,
+  84, 80, 82, 95, 60, 91, 87, 84, 90, 99,
+  79, 87, 78, 88, 91, 76, 94, 77, 93, 84,
+  92, 71, 94, 96, 80, 99, 78, 88, 75, 97,
+  84, 103, 81, 79, 71, 84, 74, 86, 85, 85,
+  73, 85, 82, 98, 93, 77, 89, 88, 84, 83,
+  97, 79, 85, 81, 75, 83, 113, 95, 93, 81,
+  80, 79, 84, 84, 78, 79, 74, 101, 74, 80,
+  69, 70, 75, 92, 76, 70, 99, 101, 86, 82,
+  79, 81, 109, 106, 78, 89, 72, 84, 77, 102,
+  79, 87, 86, 73, 80, 66, 66, 71, 88, 89,
+  90, 73, 103, 68, 81, 70, 79, 72, 76, 69,
+  85, 85, 80, 78, 86, 98, 89, 73, 55, 74,
+  93, 79, 80, 90, 82, 99, 92, 77, 85, 72,
+  87, 94, 69, 83, 80, 92, 81, 101, 91, 100,
+  83, 95, 79, 82, 74, 79, 99, 83, 92, 77,
+  90, 84, 66, 69, 68, 66, 77, 96, 79, 87,
+  78, 78, 73, 68, 102, 78, 67, 84, 80, 82,
+  108, 90, 73, 79, 81, 81, 73, 79, 77, 94,
+  73, 74, 77, 66, 97, 85, 86, 84, 80, 75,
+  83, 84, 78, 81, 91, 100, 71, 74, 68, 77,
+  82, 89, 90, 68, 79, 98, 73, 80, 92, 85,
+  83, 95, 82, 90, 80, 75, 86, 98, 93, 84,
+  88, 78, 85, 70, 73, 76, 100, 84, 75, 76,
+  96, 77, 83, 78, 82, 72, 77, 80, 85, 87,
+  80, 85, 97, 91, 102, 67, 69, 76, 87, 79,
+  74, 83, 86, 92, 96, 88, 78, 71, 90, 103,
+  88, 83, 84, 98, 82, 92, 88, 92, 91, 83,
+  81, 89, 84, 96, 99, 81, 85, 82, 91, 89,
+  76, 70, 75, 73, 91, 89, 84, 92, 84, 81,
+  85, 80, 101, 78, 76, 88, 87, 91, 86, 89,
+  74, 95, 104, 81, 77, 84, 82, 107, 76, 85,
+  78, 79, 109, 95, 88, 74, 70, 80, 82, 83,
+  77, 73, 87, 97, 72, 81, 91, 75, 78, 89,
+  81, 66, 100, 91, 95, 81, 75, 83, 118, 101,
+  78, 95, 72, 84, 71, 94, 88, 85, 95, 95,
+  84, 73, 61, 74, 75, 79, 88, 83, 105, 73,
+  75, 68, 76, 72, 73, 81, 80, 88, 78, 78,
+  89, 90, 84, 66, 53, 77, 96, 86, 91, 83,
+  68, 85, 96, 74, 85, 74, 86, 85, 74, 85,
+  79, 87, 77, 99, 91, 98, 85, 100, 75, 66,
+  76, 74, 97, 84, 93, 71, 89, 91, 78, 76,
+  70, 79, 81, 93, 85, 96, 76, 82, 66, 66,
+  79, 80, 68, 91, 75, 88, 93, 96, 78, 72,
+  94, 79, 71, 81, 82, 92, 76, 69, 70, 64,
+  105, 85, 90, 75, 78, 66, 82, 90, 78, 76,
+  75, 107, 80, 76, 77, 67, 73, 85, 116, 70,
+  88, 93, 78, 82, 79, 83, 108, 97, 85, 89,
+  67, 78, 66, 85, 85, 80, 86, 76, 97, 68,
+  48, 70, 79, 82, 78, 80, 92, 78, 74, 74,
+  75, 66, 62, 76, 71, 81, 77, 84, 98, 79,
+  88, 66, 45, 67, 92, 74, 75, 70, 65, 89,
+  87, 87, 84, 76, 96, 88, 79, 82, 80, 91,
+  82, 85, 85, 96, 89, 99, 76, 80, 64, 70,
+  90, 79, 82, 78, 89, 88, 75, 67, 66, 65,
+  90, 85, 87, 84, 83, 87, 74, 64, 94, 76,
+  65, 80, 81, 72, 93, 83, 69, 86, 94, 75,
+  74, 77, 75, 95, 78, 75, 79, 68, 85, 77,
+  85, 83, 85, 72, 92, 77, 87, 78, 94, 88,
+  92, 73, 85, 91, 93, 83, 106, 82, 79, 92,
+  71, 69, 88, 86, 92, 86, 96, 95, 94, 67,
+  84, 79, 93, 81, 91, 82, 92, 77, 79, 84,
+  96, 81, 79, 80, 78, 91, 81, 96, 86, 82,
+  85, 95, 89, 87, 86, 93, 92, 82, 96, 71,
+  71, 90, 76, 84, 69, 77, 84, 79, 89, 91,
+  82, 78, 92, 90, 87, 82, 89, 85, 81, 77,
+  85, 79, 85, 85, 85, 90, 84, 74, 85, 79,
+  77, 78, 91, 99, 85, 80, 77, 89, 95, 78,
+  82, 91, 90, 89, 85, 89, 88, 84, 88, 87,
+  72, 86, 76, 85, 82, 94, 107, 88, 89, 84,
+  88, 92, 88, 97, 80, 80, 96, 87, 85, 95,
+  78, 74, 73, 86, 80, 79, 90, 98, 66, 78,
+  86, 73, 85, 87, 119, 70, 88, 91, 83, 83,
+  79, 83, 93, 88, 88, 101, 76, 87, 68, 104,
+  86, 80, 96, 100, 93, 65, 55, 73, 72, 79,
+  85, 89, 103, 75, 80, 76, 74, 69, 73, 86,
+  75, 88, 77, 81, 98, 92, 93, 65, 72, 72,
+  90, 83, 97, 73, 82, 86, 93, 83, 84, 73,
+  80, 101, 73, 87, 80, 86, 78, 88, 93, 101,
+  91, 96, 87, 70, 76, 77, 95, 80, 87, 73,
+  88, 87, 82, 73, 65, 89, 85, 93, 85, 86,
+  81, 86, 82, 67, 79, 79, 65, 91, 73, 83,
+  90, 84, 73, 73, 109, 76, 76, 78, 82, 94,
+  79, 77, 82, 69, 80, 86, 80, 88, 89, 70,
+  87, 81, 82, 89, 84, 94, 83, 82, 82, 88,
+  92, 73, 129, 77, 77, 90, 74, 75, 84, 82,
+  99, 89, 92, 93, 91, 76, 79, 80, 87, 85,
+  92, 76, 90, 75, 51, 79, 79, 84, 81, 84,
+  79, 87, 85, 98, 80, 80, 78, 89, 83, 86,
+  82, 89, 90, 74, 89, 73, 67, 80, 84, 76,
+  82, 74, 85, 83, 89, 96, 83, 76, 92, 88,
+  78, 86, 89, 91, 90, 82, 81, 89, 84, 88,
+  92, 81, 76, 75, 93, 84, 80, 81, 91, 92,
+  95, 82, 69, 87, 88, 85, 78, 94, 76, 89,
+  79, 84, 91, 86, 76, 84, 77, 79, 85, 86,
+  77, 87, 102, 84, 84, 84, 82, 87, 89, 88,
+  86, 76, 81, 78, 76, 86, 91, 79, 81, 75,
+  85, 85, 93, 90, 92, 73, 81, 103, 87, 84,
+  113, 89, 79, 90, 72, 72, 94, 84, 81, 99,
+  95, 93, 105, 77, 92, 81, 90, 91, 91, 76,
+  85, 86, 78, 92, 93, 80, 86, 91, 76, 89,
+  80, 107, 96, 88, 96, 90, 101, 90, 86, 88,
+  78, 86, 89, 79, 72, 97, 71, 93, 76, 83,
+  95, 79, 88, 91, 88, 83, 75, 87, 79, 73,
+  100, 86, 80, 75, 87, 82, 74, 75, 86, 79,
+  89, 69, 82, 77, 78, 88, 84, 85, 87, 90,
+  78, 102, 87, 81, 79, 101, 82, 88, 76, 96,
+  94, 90, 89, 92, 82, 89, 85, 88, 85, 96,
+  100, 90, 81, 82, 103, 77, 91, 92, 101, 95,
+  81, 80, 83, 87, 66, 93, 96, 109, 75, 78,
+  95, 87, 80, 85, 106, 83, 66, 65, 91, 103,
+  80, 66, 83, 80, 97, 81, 81, 81, 93, 80,
+  72, 91, 100, 89, 91, 76, 93, 90, 73, 71,
+  81, 86, 77, 70, 86, 80, 66, 79, 90, 75,
+  91, 75, 70, 85, 75, 92, 89, 105, 104, 80,
+  73, 90, 90, 94, 80, 91, 73, 97, 81, 90,
+  96, 86, 83, 57, 88, 88, 79, 90, 84, 85,
+  104, 93, 88, 93, 77, 104, 90, 96, 105, 86,
+  89, 86, 83, 90, 93, 88, 89, 73, 88, 79,
+  97, 87, 80, 73, 95, 95, 79, 74, 86, 81,
+  57, 69, 79, 108, 80, 90, 98, 83, 96, 101,
+  78, 93, 90, 82, 72, 72, 90, 95, 80, 82,
+  82, 76, 70, 86, 90, 107, 74, 83, 91, 90,
+  77, 76, 91, 78, 66, 71, 78, 89, 76, 62,
+  102, 86, 90, 80, 91, 91, 87, 70, 73, 73,
+  91, 94, 93, 76, 80, 91, 78, 66, 85, 88,
+  74, 78, 84, 89, 61, 81, 85, 80, 90, 72,
+  71, 86, 65, 80, 89, 101, 109, 65, 69, 84,
+  75, 97, 71, 96, 73, 91, 92, 96, 97, 78,
+  92, 57, 87, 78, 88, 86, 82, 83, 105, 84,
+  91, 92, 74, 103, 77, 89, 98, 85, 97, 81,
+  86, 94, 90, 80, 86, 71, 84, 101, 89, 89,
+  69, 71, 98, 94, 72, 74, 96, 81, 49, 87,
+  76, 104, 79, 101, 98, 80, 93, 94, 78, 77,
+  99, 76, 72, 64, 91, 78, 90, 92, 82, 86,
+  76, 105, 88, 92, 81, 80, 73, 84, 81, 89,
+  83, 82, 75, 86, 79, 93, 94, 76, 101, 84,
+  90, 90, 82, 96, 79, 94, 84, 79, 81, 95,
+  95, 82, 69, 78, 98, 74, 85, 83, 85, 90,
+  85, 99, 87, 79, 83, 76, 83, 84, 92, 85,
+  91, 84, 78, 84, 94, 70, 77, 67, 75, 90,
+  84, 82, 94, 68, 84, 84, 96, 84, 91, 67,
+  87, 86, 77, 95, 83, 84, 82, 73, 75, 80,
+  66, 66, 84, 87, 96, 97, 106, 86, 94, 83,
+  109, 82, 88, 76, 71, 83, 96, 84, 91, 86,
+  66, 92, 82, 79, 88, 85, 73, 83, 75, 82,
+  89, 89, 77, 79, 96, 83, 94, 101, 90, 78,
+  78, 89, 82, 82, 76, 81, 75, 94, 81, 73,
+  86, 101, 75, 84, 76, 88, 78, 83, 91, 77,
+  69, 76, 84, 86, 72, 66, 95, 81, 82, 81,
+  94, 80, 100, 85, 71, 99, 109, 83, 89, 52,
+  76, 75, 106, 54, 85, 87, 58, 78, 80, 76,
+  64, 83, 92, 79, 88, 73, 90, 94, 72, 90,
+  97, 97, 98, 69, 86, 90, 98, 90, 75, 96,
+  73, 64, 96, 91, 90, 77, 84, 67, 81, 76,
+  78, 80, 90, 87, 83, 89, 90, 83, 87, 92,
+  87, 105, 99, 98, 113, 86, 83, 95, 90, 85,
+  81, 71, 74, 72, 90, 83, 80, 72, 92, 88,
+  77, 76, 90, 82, 56, 66, 80, 107, 60, 94,
+  83, 83, 83, 80, 77, 97, 89, 74, 71, 64,
+  71, 87, 86, 81, 73, 76, 88, 69, 77, 97,
+  75, 92, 79, 90, 78, 79, 81, 75, 65, 85,
+  82, 76, 97, 64, 101, 82, 73, 81, 108, 98,
+  109, 78, 70, 84, 92, 90, 91, 44, 83, 67,
+  131, 57, 80, 89, 57, 75, 75, 97, 58, 82,
+  92, 85, 91, 69, 83, 85, 61, 71, 100, 89,
+  103, 59, 78, 86, 75, 93, 73, 106, 74, 66,
+  78, 100, 79, 76, 95, 62, 83, 69, 73, 74,
+  86, 84, 82, 80, 91, 94, 72, 98, 74, 95,
+  85, 86, 116, 86, 69, 104, 86, 84, 93, 61,
+  76, 81, 82, 82, 64, 64, 95, 88, 77, 70,
+  102, 80, 51, 91, 81, 110, 85, 99, 81, 82,
+  84, 78, 78, 77, 93, 68, 69, 63, 82, 75,
+  88, 94, 84, 82, 80, 91, 81, 92, 82, 80,
+  75, 88, 71, 84, 80, 81, 85, 93, 83, 76,
+  101, 81, 89, 80, 77, 92, 101, 88, 79, 104,
+  85, 82, 78, 93, 92, 75, 72, 70, 107, 69,
+  74, 86, 73, 100, 75, 95, 82, 81, 77, 75,
+  88, 86, 97, 80, 87, 82, 72, 74, 88, 72,
+  91, 70, 68, 88, 75, 77, 90, 61, 81, 77,
+  86, 83, 88, 78, 75, 77, 73, 87, 84, 75,
+  79, 81, 70, 78, 65, 73, 74, 89, 100, 83,
+  99, 90, 97, 82, 99, 79, 99, 74, 72, 79,
+  96, 80, 100, 78, 73, 87, 85, 76, 93, 76,
+  74, 93, 83, 87, 108, 88, 72, 83, 90, 75,
+  103, 87, 93, 74, 80, 85, 95, 81, 88, 84,
+  88, 71, 82, 72, 89, 82, 83, 91, 78, 85,
+  65, 78, 84, 78, 99, 86, 84, 89, 86, 81,
+  98, 63, 109, 91, 89, 84, 80, 112, 94, 102,
+  80, 86, 84, 72, 71, 70, 109, 61, 89, 83,
+  79, 108, 75, 77, 94, 82, 86, 89, 91, 81,
+  99, 73, 94, 88, 77, 80, 94, 69, 91, 78,
+  78, 89, 71, 83, 84, 75, 86, 87, 101, 78,
+  75, 81, 93, 65, 76, 78, 95, 85, 83, 87,
+  79, 77, 80, 67, 76, 93, 102, 83, 103, 92,
+  81, 78, 100, 87, 72, 77, 70, 73, 95, 78,
+  123, 93, 74, 79, 102, 74, 86, 83, 76, 70,
+  77, 79, 71, 95, 75, 100, 82, 77, 82, 100,
+  92, 82, 79, 90, 86, 76, 74, 86, 89, 73,
+  84, 71, 85, 85, 80, 91, 80, 81, 70, 74,
+  76, 83, 93, 91, 94, 87, 84, 87, 89, 64,
+  107, 89, 101, 86, 83, 105, 93, 88, 80, 75,
+  81, 63, 86, 59, 127, 58, 79, 84, 88, 111,
+  65, 78, 91, 83, 87, 86, 92, 83, 103, 86,
+  94, 77, 73, 74, 95, 74, 88, 84, 65, 89,
+  77, 83, 81, 81, 76, 85, 96, 80, 80, 83,
+  91, 67, 80, 70, 90, 82, 82, 74, 74, 89,
+  70, 71, 67, 90, 97, 76, 96, 94, 79, 79,
+  95, 88, 96, 76, 73, 75, 91, 76, 136, 79,
+  67, 80, 110, 71, 96, 77, 79, 78, 81, 79,
+  82, 101, 77, 94, 86, 79, 85, 88, 94, 84,
+  75, 94, 86, 76, 68, 94, 90, 96, 83, 85,
+  81, 74, 84, 83, 80, 83, 68, 82, 83, 83,
+  108, 86, 89, 81, 74, 88, 87, 84, 95, 69,
+  83, 76, 73, 107, 102, 84, 79, 83, 85, 80,
+  80, 69, 92, 73, 77, 88, 84, 98, 73, 77,
+  83, 80, 85, 82, 93, 101, 97, 77, 95, 91,
+  62, 75, 82, 75, 90, 68, 70, 91, 78, 74,
+  87, 72, 78, 79, 95, 80, 80, 85, 78, 75,
+  83, 83, 94, 84, 89, 75, 75, 82, 77, 62,
+  78, 83, 81, 78, 86, 91, 89, 77, 88, 80,
+  100, 73, 66, 80, 91, 76, 106, 92, 78, 85,
+  88, 91, 82, 70, 89, 87, 92, 79, 86, 90,
+  84, 93, 95, 80, 95, 95, 91, 78, 86, 97,
+  101, 95, 91, 80, 72, 78, 82, 95, 93, 84,
+  77, 94, 85, 97, 67, 70, 70, 56, 81, 82,
+  69, 117, 93, 76, 81, 91, 103, 80, 100, 89,
+  81, 84, 76, 81, 91, 86, 108, 86, 74, 69,
+  96, 80, 68, 75, 85, 74, 81, 86, 87, 79,
+  85, 92, 92, 81, 98, 100, 74, 90, 99, 83,
+  88, 83, 113, 73, 60, 84, 79, 77, 59, 136,
+  80, 101, 75, 95, 82, 80, 79, 87, 66, 74,
+  83, 72, 84, 80, 75, 80, 74, 114, 85, 90,
+  86, 81, 90, 90, 99, 78, 85, 81, 89, 81,
+  98, 81, 87, 88, 82, 65, 87, 79, 111, 72,
+  84, 60, 85, 77, 116, 101, 99, 85, 106, 77,
+  70, 72, 97, 93, 89, 85, 72, 84, 102, 79,
+  93, 87, 63, 86, 72, 91, 104, 90, 75, 98,
+  100, 89, 65, 68, 77, 64, 103, 70, 58, 102,
+  83, 77, 84, 83, 104, 85, 98, 85, 69, 84,
+  80, 89, 89, 75, 116, 88, 79, 76, 98, 81,
+  60, 78, 78, 70, 98, 87, 79, 81, 86, 93,
+  90, 82, 119, 111, 77, 85, 94, 83, 91, 84,
+  112, 77, 62, 94, 74, 80, 58, 151, 113, 100,
+  72, 91, 77, 85, 77, 81, 59, 78, 77, 62,
+  83, 81, 77, 76, 77, 120, 86, 88, 78, 95,
+  96, 80, 98, 76, 95, 77, 89, 90, 101, 110,
+  94, 91, 86, 60, 88, 87, 117, 73, 81, 63,
+  78, 82, 121, 104, 97, 82, 118, 70, 77, 72,
+  101, 91, 97, 85, 74, 80, 89, 69, 78, 79,
+  81, 90, 82, 103, 93, 84, 77, 95, 83, 77,
+  73, 72, 72, 63, 78, 74, 68, 95, 79, 74,
+  85, 96, 98, 88, 88, 80, 83, 86, 85, 86,
+  81, 81, 105, 97, 86, 70, 92, 79, 80, 77,
+  88, 74, 83, 83, 85, 79, 86, 78, 84, 86,
+  93, 87, 75, 89, 98, 83, 82, 83, 109, 75,
+  59, 83, 74, 82, 70, 109, 103, 93, 79, 94,
+  76, 80, 80, 85, 72, 76, 84, 81, 81, 85,
+  76, 77, 79, 96, 83, 95, 89, 79, 90, 86,
+  97, 79, 88, 79, 83, 82, 94, 97, 84, 88,
+  83, 74, 81, 78, 108, 81, 81, 73, 88, 79,
+  110, 89, 77, 83, 96, 84, 88, 76, 98, 93,
+  90, 88, 73, 82, 98, 95, 98, 80, 84, 86,
+  87, 86, 79, 89, 75, 94, 92, 85, 85, 81,
+  78, 84, 86, 85, 63, 93, 106, 85, 91, 98,
+  76, 74, 86, 96, 93, 86, 81, 81, 82, 87,
+  79, 83, 79, 78, 80, 77, 82, 78, 81, 84,
+  94, 87, 85, 75, 76, 91, 91, 80, 90, 84,
+  82, 82, 65, 88, 84, 74, 80, 73, 82, 78,
+  80, 90, 78, 111, 75, 91, 73, 83, 88, 73,
+  70, 73, 65, 72, 89, 78, 93, 86, 87, 82,
+  78, 92, 89, 96, 77, 87, 68, 93, 86, 81,
+  88, 76, 87, 84, 77, 69, 85, 82, 88, 71,
+  85, 89, 92, 78, 74, 90, 79, 76, 97, 79,
+  103, 85, 84, 79, 92, 72, 83, 92, 73, 74,
+  95, 88, 87, 97, 85, 91, 81, 82, 83, 91,
+  77, 87, 76, 92, 110, 78, 77, 87, 86, 90,
+  94, 91, 73, 70, 80, 94, 98, 87, 80, 72,
+  78, 84, 96, 91, 86, 82, 87, 72, 79, 94,
+  75, 80, 74, 73, 72, 93, 79, 97, 106, 76,
+  80, 70, 82, 66, 85, 78, 74, 93, 79, 79,
+  52, 89, 82, 81, 76, 80, 62, 72, 74, 110,
+  80, 73, 78, 78, 75, 80, 98, 69, 72, 74,
+  61, 78, 85, 85, 94, 76, 92, 80, 79, 73,
+  89, 118, 82, 86, 55, 97, 74, 77, 89, 68,
+  102, 80, 63, 76, 80, 83, 92, 61, 84, 97,
+  98, 71, 73, 91, 77, 78, 88, 70, 75, 84,
+  87, 73, 86, 70, 73, 92, 72, 79, 99, 81,
+  95, 86, 85, 82, 85, 105, 89, 95, 80, 89,
+  75, 94, 79, 80, 91, 77, 80, 82, 85, 84,
+  83, 95, 82, 81, 91, 100, 84, 79, 77, 80,
+  91, 81, 83, 80, 90, 83, 82, 87, 79, 78,
+  81, 81, 72, 78, 87, 80, 85, 74, 82, 77,
+  76, 81, 85, 84, 95, 97, 80, 80, 72, 79,
+  82, 79, 88, 76, 82, 82, 78, 87, 78, 95,
+  112, 88, 76, 87, 83, 79, 79, 86, 74, 75,
+  92, 82, 95, 88, 84, 80, 81, 89, 87, 87,
+  74, 89, 76, 89, 97, 89, 91, 75, 89, 88,
+  82, 91, 86, 87, 88, 74, 86, 88, 90, 85,
+  76, 86, 86, 82, 85, 75, 80, 89, 82, 84,
+  82, 76, 81, 89, 72, 78, 89, 88, 85, 77,
+  85, 86, 85, 88, 78, 87, 74, 94, 77, 95,
+  99, 76, 89, 73, 75, 89, 76, 77, 76, 81,
+  97, 75, 88, 93, 71, 82, 81, 87, 83, 84,
+  96, 88, 86, 89, 72, 80, 85, 85, 80, 80,
+  90, 90, 79, 89, 84, 87, 82, 79, 81, 81,
+  79, 88, 80, 83, 75, 78, 79, 79, 75, 76,
+  74, 73, 87, 86, 83, 83, 82, 73, 84, 87,
+  82, 77, 83, 68, 87, 79, 87, 80, 90, 83,
+  94, 84, 77, 72, 82, 81, 89, 102, 75, 90,
+  83, 82, 83, 83, 84, 75, 76, 91, 76, 82,
+  85, 89, 78, 75, 84, 89, 80, 87, 76, 96,
+  86, 84, 80, 80, 82, 88, 79, 90, 92, 80,
+  79, 80, 71, 87, 95, 87, 75, 87, 81, 90,
+  88, 86, 87, 83, 72, 84, 78, 88, 110, 91,
+  94, 83, 80, 96, 67, 87, 87, 77, 88, 78,
+  87, 92, 63, 73, 79, 90, 83, 81, 91, 88,
+  82, 73, 78, 86, 82, 97, 82, 83, 88, 103,
+  77, 92, 81, 79, 84, 72, 87, 84, 73, 86,
+  66, 80, 68, 80, 74, 81, 67, 81, 74, 81,
+  75, 87, 79, 89, 92, 70, 74, 76, 80, 81,
+  93, 58, 90, 82, 85, 85, 91, 99, 94, 71,
+  85, 77, 84, 73, 91, 93, 66, 88, 80, 85,
+  72, 90, 81, 65, 88, 88, 65, 75, 79, 90,
+  74, 76, 78, 91, 65, 80, 80, 94, 85, 83,
+  83, 78, 72, 90, 72, 91, 84, 78, 64, 79,
+  65, 90, 96, 81, 89, 97, 80, 88, 82, 97,
+  84, 89, 74, 95, 79, 90, 90, 89, 87, 70,
+  74, 81, 76, 84, 87, 91, 84, 75, 82, 98,
+  82, 84, 77, 89, 81, 79, 94, 75, 87, 79,
+  74, 84, 80, 81, 81, 79, 76, 84, 87, 86,
+  73, 74, 83, 81, 83, 86, 82, 88, 82, 74,
+  76, 79, 79, 74, 79, 77, 81, 72, 83, 85,
+  80, 81, 84, 79, 87, 87, 83, 85, 87, 78,
+  89, 89, 82, 82, 94, 83, 98, 89, 75, 73,
+  78, 85, 89, 91, 76, 83, 84, 79, 86, 84,
+  86, 74, 90, 89, 82, 81, 88, 92, 79, 79,
+  87, 83, 80, 90, 77, 88, 88, 82, 86, 80,
+  89, 86, 80, 91, 86, 82, 83, 85, 72, 89,
+  90, 89, 72, 81, 79, 80, 92, 89, 73, 91,
+  90, 87, 80, 90, 68, 85, 58, 95, 90, 78,
+  94, 96, 79, 73, 89, 83, 94, 96, 91, 86,
+  88, 85, 84, 85, 77, 83, 80, 114, 82, 86,
+  88, 79, 78, 82, 66, 94, 97, 81, 84, 74,
+  78, 89, 81, 90, 76, 86, 87, 92, 93, 83,
+  97, 89, 85, 88, 82, 65, 63, 82, 72, 112,
+  89, 86, 104, 82, 88, 79, 75, 95, 88, 73,
+  87, 86, 85, 87, 95, 97, 87, 86, 60, 89,
+  88, 79, 112, 76, 82, 88, 98, 83, 83, 84,
+  86, 80, 87, 99, 89, 88, 65, 86, 101, 89,
+  72, 78, 76, 86, 82, 120, 79, 94, 59, 83,
+  80, 84, 74, 80, 71, 100, 81, 76, 87, 82,
+  80, 85, 94, 67, 85, 86, 86, 63, 79, 43,
+  62, 87, 104, 78, 78, 96, 86, 84, 54, 82,
+  82, 79, 86, 117, 82, 77, 85, 67, 110, 96,
+  73, 89, 72, 76, 88, 92, 77, 100, 87, 91,
+  75, 92, 95, 87, 84, 88, 89, 93, 75, 89,
+  67, 89, 86, 84, 80, 92, 78, 64, 86, 89,
+  73, 72, 76, 98, 67, 90, 87, 76, 84, 83,
+  98, 87, 75, 77, 83, 65, 79, 80, 79, 84,
+  84, 84, 53, 86, 76, 87, 66, 87, 81, 96,
+  67, 76, 59, 94, 73, 94, 99, 80, 98, 80,
+  76, 77, 77, 86, 137, 70, 77, 85, 82, 90,
+  91, 101, 75, 86, 80, 99, 81, 101, 81, 74,
+  80, 91, 82, 59, 76, 87, 81, 86, 79, 90,
+  83, 79, 92, 77, 93, 74, 79, 52, 72, 83,
+  82, 78, 70, 93, 88, 89, 67, 91, 85, 84,
+  80, 97, 89, 82, 86, 73, 88, 96, 80, 84,
+  75, 77, 89, 78, 91, 87, 71, 81, 80, 83,
+  83, 81, 83, 82, 88, 91, 71, 88, 73, 84,
+  88, 93, 85, 80, 84, 76, 90, 87, 80, 79,
+  89, 91, 90, 82, 85, 86, 82, 83, 87, 88,
+  88, 80, 84, 78, 77, 83, 84, 84, 83, 79,
+  70, 89, 83, 93, 91, 84, 89, 97, 69, 94,
+  69, 99, 102, 95, 92, 81, 84, 85, 91, 89,
+  85, 88, 92, 84, 86, 84, 80, 89, 90, 107,
+  83, 72, 91, 90, 99, 97, 75, 83, 82, 88,
+  77, 89, 79, 88, 95, 78, 80, 74, 96, 82,
+  91, 81, 81, 99, 91, 90, 80, 94, 68, 94,
+  61, 91, 85, 79, 101, 93, 74, 81, 97, 76,
+  86, 94, 82, 84, 87, 89, 84, 81, 80, 87,
+  70, 112, 93, 48, 84, 76, 87, 72, 67, 85,
+  104, 85, 75, 73, 83, 83, 75, 92, 72, 86,
+  91, 82, 91, 85, 94, 88, 84, 85, 89, 66,
+  68, 76, 66, 104, 87, 101, 72, 79, 88, 88,
+  77, 102, 90, 62, 75, 83, 83, 77, 95, 100,
+  81, 93, 63, 91, 80, 73, 106, 76, 91, 83,
+  105, 83, 84, 92, 77, 79, 93, 97, 93, 90,
+  68, 84, 101, 86, 83, 75, 80, 76, 88, 133,
+  82, 89, 74, 76, 76, 83, 82, 85, 70, 102,
+  84, 82, 81, 79, 84, 80, 102, 70, 83, 81,
+  89, 66, 79, 43, 62, 83, 108, 88, 88, 90,
+  87, 77, 54, 79, 86, 83, 78, 114, 82, 81,
+  75, 63, 110, 96, 78, 92, 77, 79, 80, 94,
+  66, 102, 75, 91, 74, 94, 97, 80, 84, 86,
+  86, 98, 78, 84, 70, 92, 84, 87, 75, 79,
+  73, 69, 81, 83, 76, 73, 76, 93, 64, 92,
+  87, 70, 86, 67, 85, 81, 68, 86, 77, 70,
+  75, 75, 69, 88, 87, 83, 55, 87, 73, 95,
+  65, 83, 79, 83, 64, 68, 56, 92, 64, 85,
+  99, 87, 80, 80, 65, 83, 77, 86, 108, 76,
+  77, 83, 70, 95, 96, 91, 71, 89, 80, 82,
+  86, 98, 75, 72, 80, 97, 89, 52, 75, 83,
+  73, 87, 86, 84, 79, 81, 86, 71, 99, 73,
+  83, 56, 75, 85, 83, 82, 78, 88, 85, 84,
+  69, 91, 83, 91, 81, 91, 94, 87, 76, 73,
+  90, 85, 77, 79, 82, 78, 94, 84, 78, 77,
+  82, 79, 78, 84, 88, 77, 83, 75, 90, 74,
+  69, 87, 70, 88, 86, 97, 83, 87, 78, 80,
+  89, 86, 82, 81, 93, 90, 81, 91, 84, 90,
+  87, 74, 87, 85, 84, 87, 79, 81, 79, 95,
+  84, 84, 87, 78, 74, 87, 89, 95, 90, 88,
+  94, 85, 69, 83, 69, 90, 88, 87, 91, 83,
+  83, 86, 77, 93, 87, 86, 73, 83, 82, 79,
+  68, 97, 92, 97, 80, 73, 84, 86, 96, 102,
+  74, 79, 71, 93, 83, 81, 77, 87, 88, 83,
+  91, 81, 104, 85, 84, 75, 82, 92, 86, 89,
+  77, 92, 74, 94, 77, 92, 82, 82, 89, 92,
+  71, 79, 102, 89, 94, 86, 85, 85, 76, 89,
+  82, 81, 84, 77, 68, 89, 98, 73, 90, 79,
+  84, 84, 84, 85, 86, 90, 96, 84, 84, 81,
+  78, 92, 79, 86, 91, 99, 85, 88, 91, 77,
+  83, 73, 84, 70, 77, 79, 76, 81, 83, 98,
+  64, 76, 84, 87, 86, 90, 91, 66, 89, 77,
+  80, 83, 86, 90, 85, 82, 68, 87, 90, 81,
+  86, 73, 82, 85, 94, 78, 92, 89, 78, 77,
+  89, 94, 98, 90, 94, 83, 85, 85, 91, 85,
+  89, 83, 87, 109, 87, 91, 86, 85, 91, 88,
+  86, 87, 78, 85, 73, 99, 84, 91, 83, 84,
+  97, 86, 77, 79, 90, 69, 75, 56, 65, 83,
+  93, 81, 93, 83, 84, 80, 67, 84, 87, 79,
+  86, 111, 89, 82, 82, 65, 95, 93, 78, 88,
+  76, 83, 83, 84, 79, 120, 75, 90, 84, 90,
+  94, 83, 81, 84, 89, 94, 74, 88, 78, 88,
+  84, 87, 82, 82, 78, 78, 84, 78, 77, 75,
+  84, 97, 80, 89, 91, 71, 84, 78, 82, 78,
+  78, 87, 80, 78, 79, 73, 80, 82, 85, 89,
+  61, 91, 77, 83, 71, 85, 82, 84, 74, 69,
+  65, 89, 77, 85, 98, 83, 76, 84, 77, 93,
+  82, 85, 82, 81, 79, 89, 68, 99, 86, 98,
+  79, 80, 83, 81, 84, 94, 80, 82, 83, 90,
+  82, 62, 72, 91, 89, 95, 87, 87, 78, 91,
+  83, 81, 96, 77, 86, 70, 75, 90, 83, 79,
+  80, 86, 82, 81, 79, 94, 84, 79, 84, 100,
+  90, 88, 83, 78, 79, 84, 80, 81, 79, 83,
+  92, 82, 82, 90, 81, 83, 81, 79, 85, 82,
+  83, 89, 83, 73, 65, 93, 78, 89, 85, 94,
+  89, 81, 85, 87, 85, 78, 81, 78, 94, 87,
+  92, 82, 82, 85, 83, 90, 78, 84, 92, 87,
+  82, 90, 83, 95, 89, 80, 87, 81, 77, 86,
+  87, 81, 93, 85, 96, 91, 86, 76, 77, 89,
+  92, 84, 88, 76, 83, 89, 85, 95, 85, 84,
+  80, 83, 80, 87, 76, 96, 81, 97, 85, 79,
+  87, 84, 92, 93, 81, 88, 79, 90, 74, 86,
+  71, 93, 100, 87, 76, 99, 86, 72, 87, 85,
+  79, 92, 91, 82, 90, 78, 81, 88, 72, 84,
+  80, 79, 78, 84, 67, 69, 90, 99, 66, 99,
+  81, 81, 87, 79, 91, 66, 81, 70, 93, 90,
+  86, 86, 67, 84, 77, 78, 87, 80, 78, 85,
+  77, 83, 74, 88, 72, 85, 88, 79, 76, 80,
+  72, 102, 90, 92, 89, 92, 88, 74, 86, 88,
+  87, 86, 74, 95, 94, 77, 99, 72, 95, 90,
+  81, 86, 104, 91, 74, 89, 87, 87, 83, 74,
+  86, 91, 91, 89, 101, 79, 95, 85, 86, 103,
+  76, 78, 90, 102, 97, 91, 83, 93, 114, 71,
+  98, 79, 75, 72, 83, 73, 94, 70, 84, 84,
+  69, 82, 88, 100, 78, 93, 87, 86, 89, 94,
+  80, 94, 122, 99, 80, 84, 81, 61, 75, 86,
+  83, 82, 74, 89, 77, 79, 74, 84, 78, 75,
+  89, 102, 81, 88, 113, 87, 74, 90, 79, 86,
+  94, 75, 86, 87, 81, 81, 75, 88, 72, 85,
+  86, 77, 79, 71, 82, 89, 87, 82, 72, 83,
+  74, 85, 77, 85, 81, 80, 90, 98, 86, 70,
+  94, 76, 88, 74, 92, 67, 61, 79, 73, 98,
+  80, 77, 105, 81, 86, 73, 87, 90, 92, 77,
+  85, 82, 79, 84, 77, 79, 81, 78, 92, 84,
+  80, 76, 79, 85, 92, 69, 82, 86, 86, 74,
+  93, 69, 84, 85, 72, 86, 90, 89, 94, 85,
+  61, 77, 76, 77, 96, 83, 72, 93, 64, 72,
+  71, 87, 78, 79, 66, 88, 89, 95, 102, 82,
+  130, 85, 86, 96, 86, 92, 76, 80, 90, 84,
+  83, 73, 92, 87, 83, 93, 79, 79, 92, 97,
+  99, 94, 91, 79, 98, 82, 87, 92, 94, 87,
+  82, 116, 92, 84, 76, 86, 80, 78, 80, 75,
+  87, 81, 66, 79, 83, 85, 90, 89, 81, 82,
+  75, 91, 88, 98, 92, 91, 88, 70, 77, 79,
+  89, 78, 92, 98, 76, 93, 69, 94, 97, 76,
+  84, 89, 80, 75, 91, 81, 102, 73, 72, 83,
+  81, 81, 89, 77, 87, 83, 91, 82, 77, 85,
+  71, 107, 82, 76, 64, 77, 89, 80, 102, 74,
+  90, 73, 68, 79, 62, 87, 74, 81, 89, 80,
+  82, 80, 88, 90, 76, 99, 82, 69, 73, 77,
+  87, 69, 86, 84, 87, 98, 94, 91, 71, 100,
+  91, 76, 87, 95, 71, 85, 96, 93, 85, 79,
+  74, 77, 73, 99, 81, 80, 80, 87, 72, 73,
+  75, 100, 75, 99, 75, 90, 84, 77, 94, 67,
+  79, 83, 78, 95, 83, 113, 76, 81, 94, 78,
+  73, 84, 65, 83, 89, 74, 76, 90, 77, 75,
+  90, 71, 81, 80, 75, 97, 98, 93, 93, 88,
+  85, 67, 72, 86, 91, 87, 66, 84, 87, 74,
+  91, 72, 96, 96, 83, 86, 86, 84, 81, 84,
+  80, 85, 87, 83, 83, 88, 91, 97, 93, 92,
+  102, 79, 81, 109, 71, 75, 84, 102, 94, 91,
+  87, 90, 96, 73, 93, 89, 80, 83, 68, 77,
+  95, 68, 72, 73, 73, 89, 99, 88, 77, 94,
+  81, 86, 86, 83, 81, 92, 119, 94, 95, 78,
+  83, 59, 75, 84, 77, 88, 73, 90, 69, 84,
+  78, 91, 76, 82, 92, 105, 89, 91, 130, 85,
+  73, 91, 75, 90, 98, 83, 94, 81, 72, 78,
+  62, 89, 78, 85, 77, 72, 92, 73, 64, 93,
+  99, 83, 74, 84, 76, 79, 71, 82, 83, 78,
+  95, 74, 88, 66, 97, 74, 82, 71, 89, 66,
+  55, 85, 66, 88, 75, 75, 86, 80, 81, 79,
+  88, 92, 85, 74, 74, 87, 85, 86, 77, 81,
+  85, 82, 94, 90, 69, 79, 73, 72, 93, 79,
+  76, 96, 84, 87, 85, 71, 79, 71, 76, 83,
+  77, 84, 87, 87, 63, 76, 89, 87, 92, 80,
+  78, 83, 71, 81, 77, 85, 82, 74, 62, 88,
+  85, 82, 113, 78, 136, 79, 78, 91, 88, 97,
+  77, 80, 83, 80, 85, 69, 103, 88, 85, 90,
+  86, 84, 96, 88, 104, 91, 77, 74, 88, 87,
+  84, 93, 94, 86, 84, 118, 92, 83, 85, 85,
+  83, 60, 78, 70, 77, 76, 72, 80, 104, 89,
+  79, 76, 87, 83, 75, 93, 89, 105, 99, 85,
+  73, 71, 70, 79, 83, 77, 93, 96, 74, 97,
+  69, 91, 90, 61, 85, 90, 76, 81, 84, 78,
+  89, 78, 72, 92, 86, 75, 99, 76, 92, 85,
+  94, 83, 77, 81, 72, 79, 78, 83, 70, 81,
+  87, 93, 87, 77, 77, 69, 66, 79, 58, 91,
+  82, 78, 82, 75, 99, 90, 80, 91, 77, 101,
+  80, 72, 70, 80, 85, 70, 86, 73, 84, 86,
+  93, 87, 87, 90, 95, 84, 88, 81, 69, 88,
+  94, 81, 82, 84, 72, 84, 77, 92, 80, 82,
+  75, 87, 85, 81, 89, 90, 82, 82, 82, 86,
+  78, 79, 85, 78, 81, 82, 75, 98, 83, 109,
+  94, 82, 96, 79, 72, 86, 76, 79, 100, 80,
+  90, 73, 86, 76, 81, 80, 77, 81, 87, 99,
+  97, 79, 84, 87, 85, 69, 80, 88, 87, 82,
+  73, 88, 89, 68, 92, 67, 96, 79, 89, 87,
+  85, 83, 86, 86, 83, 87, 84, 86, 89, 81,
+  89, 88, 89, 81, 96, 79, 84, 99, 84, 80,
+  85, 96, 89, 97, 76, 91, 81, 84, 82, 81,
+  87, 75, 69, 83, 92, 68, 78, 83, 75, 81,
+  82, 88, 79, 83, 73, 87, 78, 94, 81, 88,
+  110, 88, 82, 83, 81, 66, 79, 90, 81, 91,
+  85, 86, 83, 81, 78, 87, 76, 83, 93, 92,
+  86, 88, 102, 84, 82, 82, 81, 94, 92, 86,
+  86, 87, 87, 78, 66, 83, 91, 80, 76, 77,
+  88, 82, 71, 92, 96, 85, 87, 89, 86, 73,
+  81, 87, 83, 88, 86, 76, 87, 76, 89, 86,
+  79, 73, 86, 75, 69, 83, 73, 88, 75, 69,
+  76, 80, 83, 76, 92, 91, 90, 74, 84, 89,
+  89, 90, 85, 82, 87, 80, 83, 87, 83, 75,
+  73, 69, 85, 78, 71, 90, 92, 89, 80, 81,
+  88, 81, 74, 85, 68, 91, 90, 84, 79, 77,
+  96, 87, 87, 74, 88, 98, 69, 78, 85, 88,
+  82, 72, 73, 87, 87, 89, 96, 85, 96, 78,
+  67, 89, 83, 87, 81, 87, 85, 92, 89, 72,
+  98, 82, 84, 93, 79, 86, 87, 89, 93, 78,
+  90, 85, 80, 83, 91, 95, 87, 89, 74, 101,
+  92, 85, 80, 81, 99, 64, 72, 75, 81, 86,
+  76, 74, 96, 82, 82, 89, 83, 85, 76, 95,
+  91, 107, 87, 80, 70, 76, 68, 99, 79, 85,
+  97, 97, 85, 91, 81, 97, 79, 69, 83, 98,
+  87, 79, 87, 87, 90, 82, 83, 88, 89, 77,
+  95, 80, 86, 82, 85, 79, 84, 80, 64, 75,
+  78, 81, 70, 88, 87, 84, 87, 88, 78, 81,
+  79, 79, 69, 92, 89, 82, 75, 77, 99, 80,
+  82, 90, 92, 109, 79, 77, 85, 90, 90, 73,
+  84, 79, 83, 85, 91, 88, 74, 81, 89, 96,
+  89, 76, 87, 70, 80, 86, 77, 88, 72, 86,
+  84, 79, 88, 77, 102, 76, 61, 84, 73, 82,
+  74, 80, 95, 89, 100, 106, 89, 87, 92, 88,
+  97, 78, 80, 81, 85, 89, 87, 82, 74, 91,
+  72, 82, 78, 98, 89, 98, 89, 84, 71, 76,
+  70, 80, 66, 86, 87, 76, 75, 97, 104, 76,
+  97, 83, 94, 83, 78, 99, 81, 81, 78, 72,
+  69, 100, 68, 89, 101, 97, 81, 84, 73, 88,
+  93, 94, 82, 91, 81, 90, 100, 87, 72, 78,
+  96, 91, 55, 87, 73, 72, 80, 79, 82, 107,
+  97, 76, 88, 76, 85, 79, 84, 83, 73, 93,
+  94, 92, 92, 79, 87, 65, 73, 78, 90, 82,
+  86, 64, 83, 82, 71, 86, 88, 91, 92, 83,
+  79, 74, 90, 94, 71, 86, 72, 88, 84, 66,
+  81, 81, 107, 78, 61, 81, 83, 81, 74, 87,
+  105, 95, 88, 105, 88, 80, 83, 86, 105, 96,
+  80, 79, 88, 86, 86, 84, 70, 89, 71, 72,
+  72, 93, 81, 98, 85, 90, 69, 77, 80, 90,
+  68, 80, 87, 73, 69, 91, 97, 74, 103, 92,
+  88, 75, 72, 106, 95, 77, 77, 75, 70, 95,
+  69, 97, 105, 96, 72, 80, 77, 90, 89, 90,
+  82, 92, 71, 76, 110, 79, 70, 78, 92, 83,
+  52, 86, 79, 81, 79, 85, 88, 99, 100, 77,
+  94, 82, 84, 82, 76, 84, 76, 83, 91, 90,
+  90, 79, 89, 61, 90, 79, 92, 85, 94, 59,
+  88, 89, 79, 81, 84, 94, 85, 81, 93, 79,
+  83, 87, 74, 92, 74, 91, 88, 77, 84, 80,
+  100, 83, 72, 77, 82, 81, 76, 80, 93, 92,
+  94, 92, 90, 77, 91, 84, 95, 110, 87, 81,
+  82, 90, 86, 84, 70, 90, 73, 79, 73, 86,
+  88, 98, 86, 79, 74, 77, 77, 86, 71, 88,
+  89, 73, 75, 93, 98, 83, 90, 84, 95, 78,
+  79, 93, 94, 84, 75, 81, 69, 100, 71, 94,
+  102, 91, 81, 84, 74, 83, 89, 92, 92, 81,
+  79, 80, 102, 83, 78, 79, 79, 90, 59, 89,
+  85, 82, 81, 93, 79, 109, 96, 76, 91, 73,
+  79, 81, 72, 81, 74, 79, 82, 90, 83, 77,
+  87, 66, 96, 78, 92, 84, 89, 65, 79, 76,
+  73, 87, 77, 90, 86, 88, 77, 70, 97, 86,
+  87, 83, 84, 78, 84, 73, 94, 89, 116, 71,
+  58, 82, 75, 90, 77, 72, 88, 102, 88, 103,
+  80, 86, 85, 82, 83, 83, 80, 69, 86, 81,
+  80, 87, 78, 86, 74, 77, 70, 97, 79, 102,
+  85, 88, 63, 75, 77, 79, 72, 91, 72, 77,
+  87, 92, 90, 74, 88, 92, 95, 81, 78, 90,
+  87, 78, 85, 78, 68, 102, 81, 85, 87, 95,
+  77, 84, 79, 79, 81, 81, 84, 91, 82, 106,
+  102, 93, 61, 83, 102, 86, 49, 84, 70, 80,
+  90, 74, 79, 99, 93, 80, 85, 84, 77, 98,
+  84, 79, 88, 88, 83, 84, 91, 81, 76, 68,
+  89, 81, 81, 102, 87, 69, 86, 101, 75, 101,
+  73, 85, 84, 79, 64, 85, 110, 85, 104, 81,
+  81, 76, 79, 73, 95, 93, 137, 65, 63, 75,
+  84, 107, 72, 76, 89, 112, 102, 87, 80, 86,
+  84, 77, 91, 81, 80, 74, 76, 80, 75, 82,
+  63, 77, 72, 83, 69, 83, 73, 126, 82, 81,
+  57, 74, 97, 77, 84, 77, 74, 67, 83, 90,
+  82, 68, 62, 88, 96, 66, 70, 84, 71, 60,
+  100, 89, 72, 115, 88, 88, 86, 99, 73, 76,
+  93, 96, 72, 77, 73, 82, 77, 117, 130, 83,
+  59, 75, 98, 71, 66, 78, 81, 89, 98, 85,
+  82, 95, 85, 80, 97, 84, 76, 118, 70, 74,
+  103, 76, 77, 82, 78, 78, 72, 64, 116, 83,
+  78, 115, 102, 65, 90, 126, 74, 85, 91, 92,
+  87, 83, 86, 76, 91, 88, 84, 84, 79, 89,
+  88, 69, 89, 84, 108, 87, 78, 81, 94, 86,
+  69, 71, 94, 97, 84, 76, 85, 73, 87, 83,
+  90, 113, 79, 72, 80, 76, 83, 84, 65, 85,
+  74, 72, 66, 78, 81, 102, 84, 80, 68, 75,
+  74, 88, 76, 86, 79, 73, 82, 90, 90, 74,
+  81, 86, 91, 76, 80, 90, 87, 79, 75, 86,
+  71, 96, 77, 96, 91, 92, 76, 81, 80, 89,
+  83, 82, 82, 79, 79, 97, 102, 85, 62, 82,
+  84, 86, 50, 82, 86, 85, 90, 95, 76, 102,
+  91, 77, 91, 83, 75, 89, 77, 77, 88, 83,
+  81, 83, 72, 78, 76, 65, 97, 80, 84, 96,
+  90, 74, 85, 91, 80, 89, 79, 88, 92, 90,
+  89, 73, 87, 79, 82, 80, 86, 79, 86, 69,
+  89, 87, 97, 80, 67, 78, 76, 89, 78, 73,
+  76, 92, 82, 88, 81, 88, 89, 84, 77, 83,
+  77, 83, 88, 84, 78, 87, 89, 84, 80, 77,
+  69, 95, 80, 99, 86, 92, 70, 79, 64, 89,
+  78, 97, 75, 77, 85, 87, 88, 80, 95, 87,
+  95, 83, 85, 78, 87, 79, 80, 85, 69, 96,
+  85, 89, 83, 91, 85, 84, 74, 77, 84, 86,
+  89, 76, 89, 104, 97, 111, 69, 85, 107, 88,
+  60, 83, 71, 79, 81, 78, 69, 104, 86, 79,
+  82, 81, 83, 91, 85, 79, 89, 84, 81, 88,
+  85, 85, 82, 87, 97, 77, 70, 97, 78, 76,
+  87, 85, 86, 93, 87, 85, 94, 82, 83, 81,
+  94, 78, 98, 77, 83, 82, 88, 77, 89, 87,
+  112, 75, 74, 75, 87, 92, 72, 68, 70, 94,
+  92, 80, 84, 85, 88, 79, 83, 86, 79, 85,
+  81, 84, 79, 80, 77, 80, 76, 77, 67, 88,
+  74, 114, 83, 86, 66, 75, 74, 85, 80, 89,
+  78, 72, 83, 84, 82, 77, 77, 86, 96, 76,
+  78, 83, 76, 67, 87, 98, 69, 94, 90, 89,
+  79, 95, 79, 81, 86, 88, 79, 78, 76, 75,
+  82, 115, 100, 107, 66, 84, 108, 78, 69, 82,
+  79, 81, 92, 86, 70, 98, 74, 81, 87, 82,
+  78, 99, 80, 79, 93, 75, 84, 91, 75, 84,
+  83, 82, 105, 84, 70, 106, 76, 76, 85, 106,
+  81, 83, 96, 94, 96, 78, 96, 75, 86, 81,
+  80, 80, 80, 90, 95, 68, 89, 83, 99, 86,
+  90, 77, 102, 85, 69, 72, 82, 84, 86, 78,
+  86, 74, 93, 83, 82, 111, 79, 83, 82, 86,
+  78, 85, 71, 83, 78, 77, 63, 80, 80, 102,
+  87, 85, 74, 77, 64, 78, 76, 90, 79, 74,
+  87, 82, 89, 81, 89, 83, 89, 76, 87, 86,
+  80, 78, 73, 94, 69, 91, 84, 95, 84, 87,
+  84, 83, 83, 85, 87, 83, 85, 71, 87, 98,
+  94, 91, 72, 84, 90, 88, 62, 82, 83, 78,
+  87, 87, 67, 106, 90, 75, 89, 77, 81, 88,
+  85, 75, 83, 84, 84, 89, 77, 81, 80, 84,
+  89, 78, 72, 90, 80, 86, 87, 80, 85, 93,
+  77, 90, 83, 80, 82, 91, 78, 85, 83, 69,
+  88, 85, 74, 71, 75, 95, 91, 75, 85, 78,
+  94, 70, 93, 82, 91, 96, 94, 81, 94, 80,
+  88, 77, 83, 73, 86, 90, 89, 85, 84, 66,
+  101, 79, 64, 91, 93, 83, 75, 94, 86, 92,
+  85, 90, 92, 83, 84, 86, 82, 96, 96, 82,
+  103, 88, 99, 67, 82, 89, 72, 103, 76, 83,
+  87, 97, 88, 80, 83, 76, 102, 76, 90, 80,
+  68, 97, 67, 72, 107, 93, 84, 79, 76, 75,
+  83, 83, 92, 93, 91, 66, 82, 73, 84, 71,
+  82, 83, 77, 83, 87, 90, 100, 72, 84, 95,
+  73, 85, 93, 77, 98, 94, 87, 97, 84, 80,
+  88, 84, 101, 104, 85, 79, 81, 89, 75, 84,
+  98, 68, 77, 90, 83, 82, 86, 60, 72, 83,
+  70, 71, 74, 74, 82, 76, 93, 83, 73, 73,
+  83, 73, 78, 93, 88, 88, 87, 81, 77, 76,
+  83, 78, 92, 85, 78, 91, 83, 67, 89, 73,
+  67, 86, 108, 70, 84, 92, 78, 84, 79, 98,
+  91, 89, 95, 94, 77, 89, 99, 116, 108, 109,
+  78, 80, 77, 93, 91, 88, 71, 84, 76, 93,
+  98, 82, 82, 76, 104, 73, 83, 75, 68, 89,
+  70, 70, 83, 98, 82, 75, 83, 78, 87, 81,
+  83, 99, 89, 63, 81, 90, 85, 87, 78, 83,
+  80, 82, 83, 92, 96, 63, 84, 88, 72, 88,
+  92, 69, 79, 93, 79, 90, 90, 76, 84, 86,
+  100, 102, 85, 87, 83, 82, 87, 87, 84, 89,
+  82, 88, 75, 87, 78, 71, 79, 89, 79, 70,
+  74, 100, 88, 77, 100, 70, 82, 73, 81, 82,
+  93, 96, 89, 88, 95, 86, 87, 74, 86, 86,
+  90, 88, 75, 84, 83, 68, 83, 75, 70, 89,
+  91, 68, 75, 94, 90, 85, 82, 83, 100, 93,
+  84, 84, 85, 96, 96, 73, 96, 88, 100, 65,
+  73, 87, 74, 94, 91, 82, 84, 98, 94, 79,
+  81, 89, 91, 74, 95, 81, 71, 86, 67, 71,
+  82, 87, 86, 78, 81, 85, 88, 84, 90, 90,
+  90, 63, 84, 74, 82, 93, 81, 82, 80, 80,
+  86, 86, 95, 75, 86, 92, 73, 106, 82, 69,
+  67, 93, 85, 89, 93, 81, 91, 83, 97, 99,
+  87, 78, 74, 99, 73, 95, 96, 75, 82, 84,
+  79, 75, 94, 73, 94, 95, 77, 76, 84, 87,
+  95, 77, 92, 74, 75, 77, 97, 76, 78, 102,
+  96, 79, 101, 78, 85, 72, 84, 67, 72, 82,
+  110, 89, 65, 67, 95, 74, 70, 98, 90, 83,
+  69, 86, 89, 84, 83, 105, 62, 81, 70, 78,
+  70, 88, 96, 99, 95, 90, 72, 70, 98, 95,
+  94, 70, 65, 77, 89, 97, 89, 67, 80, 80,
+  99, 92, 72, 97, 72, 96, 85, 79, 107, 94,
+  97, 83, 70, 79, 68, 93, 71, 104, 90, 76,
+  85, 88, 77, 62, 77, 82, 89, 73, 79, 86,
+  91, 61, 87, 100, 71, 76, 78, 69, 83, 100,
+  82, 91, 104, 77, 60, 83, 86, 83, 85, 90,
+  70, 91, 69, 82, 109, 60, 67, 84, 80, 69,
+  105, 65, 82, 99, 64, 67, 80, 58, 76, 71,
+  94, 90, 62, 82, 89, 57, 62, 93, 85, 83,
+  93, 83, 68, 78, 84, 69, 85, 74, 103, 98,
+  73, 71, 83, 60, 78, 93, 96, 84, 80, 88,
+  81, 83, 72, 111, 63, 83, 87, 78, 74, 83,
+  103, 137, 99, 134, 55, 98, 90, 104, 121, 58,
+  61, 78, 75, 91, 96, 74, 79, 83, 99, 95,
+  59, 84, 74, 85, 85, 80, 71, 99, 83, 77,
+  82, 78, 82, 91, 65, 102, 86, 74, 87, 119,
+  79, 77, 77, 81, 92, 78, 70, 85, 85, 45,
+  84, 93, 73, 70, 75, 62, 66, 103, 78, 86,
+  102, 73, 43, 88, 81, 78, 80, 100, 75, 94,
+  85, 91, 102, 74, 83, 90, 75, 78, 86, 72,
+  85, 100, 82, 77, 87, 95, 88, 81, 97, 72,
+  82, 82, 86, 79, 80, 101, 91, 86, 97, 93,
+  88, 73, 85, 83, 72, 80, 91, 88, 70, 66,
+  89, 76, 77, 100, 84, 77, 70, 88, 91, 83,
+  80, 94, 67, 87, 69, 80, 74, 87, 100, 87,
+  88, 91, 78, 67, 86, 92, 94, 65, 75, 74,
+  89, 94, 97, 68, 77, 86, 93, 90, 79, 93,
+  72, 89, 83, 83, 78, 89, 94, 81, 75, 83,
+  73, 90, 69, 98, 90, 75, 88, 83, 81, 88,
+  77, 82, 88, 73, 81, 87, 83, 68, 83, 102,
+  70, 99, 75, 63, 58, 99, 79, 88, 101, 83,
+  74, 78, 86, 79, 87, 86, 71, 90, 80, 101,
+  68, 86, 78, 82, 88, 82, 93, 98, 84, 85,
+  79, 83, 84, 99, 86, 85, 95, 85, 83, 68,
+  95, 75, 78, 97, 88, 76, 89, 74, 85, 81,
+  76, 72, 79, 89, 99, 89, 76, 70, 92, 77,
+  70, 84, 74, 83, 74, 94, 92, 86, 93, 97,
+  71, 80, 75, 79, 83, 83, 87, 102, 86, 82,
+  93, 72, 90, 89, 100, 83, 76, 81, 84, 103,
+  82, 77, 77, 83, 89, 90, 72, 85, 75, 92,
+  91, 85, 105, 94, 90, 87, 83, 107, 81, 89,
+  88, 95, 80, 78, 85, 86, 88, 78, 81, 80,
+  92, 87, 86, 89, 83, 79, 87, 82, 74, 81,
+  81, 78, 81, 96, 81, 87, 90, 82, 69, 82,
+  85, 96, 79, 88, 68, 81, 77, 93, 68, 85,
+  68, 83, 87, 79, 96, 90, 69, 87, 60, 73,
+  80, 77, 76, 82, 98, 101, 80, 69, 87, 60,
+  71, 90, 79, 76, 86, 81, 74, 82, 72, 78,
+  87, 81, 87, 93, 76, 74, 87, 70, 76, 85,
+  81, 84, 79, 92, 85, 82, 91, 97, 84, 80,
+  93, 82, 80, 83, 90, 124, 92, 106, 72, 84,
+  72, 86, 114, 79, 76, 83, 75, 99, 84, 80,
+  77, 84, 81, 91, 63, 71, 81, 81, 92, 87,
+  73, 97, 85, 85, 96, 98, 89, 83, 82, 87,
+  76, 80, 78, 106, 87, 83, 84, 80, 92, 88,
+  80, 88, 82, 71, 84, 77, 76, 74, 76, 68,
+  82, 98, 81, 87, 88, 79, 65, 86, 84, 90,
+  77, 91, 72, 79, 98, 97, 73, 86, 79, 86,
+  80, 84, 84, 92, 85, 94, 84, 83, 88, 105,
+  78, 86, 92, 79, 87, 75, 87, 78, 78, 97,
+  82, 84, 88, 90, 88, 80, 78, 88, 79, 86,
+  84, 92, 78, 72, 93, 77, 77, 85, 68, 80,
+  77, 96, 93, 80, 92, 89, 78, 84, 70, 81,
+  86, 78, 86, 88, 85, 84, 95, 71, 78, 84,
+  92, 83, 78, 81, 83, 97, 86, 77, 75, 79,
+  86, 88, 76, 83, 77, 91, 85, 91, 79, 88,
+  89, 89, 85, 101, 86, 83, 78, 90, 81, 78,
+  89, 82, 92, 90, 78, 82, 94, 89, 88, 89,
+  79, 85, 86, 82, 68, 97, 80, 77, 67, 97,
+  81, 86, 94, 86, 82, 78, 87, 91, 82, 86,
+  97, 91, 86, 83, 92, 73, 77, 74, 82, 87,
+  76, 80, 121, 69, 70, 79, 84, 91, 86, 92,
+  69, 99, 68, 81, 86, 80, 105, 85, 100, 83,
+  75, 73, 78, 91, 80, 92, 102, 84, 86, 106,
+  88, 86, 99, 85, 103, 81, 83, 91, 88, 90,
+  75, 81, 85, 74, 75, 87, 76, 62, 102, 81,
+  77, 79, 96, 88, 67, 84, 88, 91, 72, 85,
+  102, 90, 80, 78, 74, 92, 82, 104, 73, 70,
+  84, 68, 92, 104, 84, 82, 91, 82, 82, 93,
+  74, 78, 86, 88, 98, 65, 86, 85, 95, 94,
+  71, 72, 79, 82, 93, 60, 77, 84, 71, 76,
+  93, 71, 81, 87, 79, 84, 89, 86, 95, 73,
+  80, 72, 77, 82, 82, 72, 77, 77, 77, 77,
+  84, 85, 94, 77, 72, 84, 74, 95, 87, 77,
+  68, 76, 68, 85, 71, 78, 79, 94, 89, 96,
+  68, 81, 78, 75, 102, 86, 98, 90, 66, 77,
+  87, 109, 81, 116, 100, 96, 82, 81, 106, 71,
+  75, 73, 130, 86, 83, 90, 108, 78, 61, 57,
+  77, 77, 68, 64, 105, 64, 124, 86, 80, 146,
+  113, 72, 71, 83, 93, 112, 79, 79, 71, 90,
+  100, 70, 74, 119, 86, 90, 57, 58, 81, 61,
+  85, 95, 74, 82, 94, 94, 58, 89, 87, 92,
+  96, 89, 122, 65, 82, 99, 81, 108, 76, 81,
+  94, 84, 85, 62, 80, 74, 68, 62, 73, 68,
+  92, 92, 74, 79, 96, 89, 95, 70, 79, 63,
+  71, 99, 73, 76, 63, 67, 91, 75, 101, 81,
+  85, 79, 82, 80, 81, 84, 79, 80, 113, 87,
+  68, 77, 87, 85, 83, 86, 98, 89, 75, 81,
+  77, 78, 99, 86, 92, 87, 83, 89, 77, 93,
+  86, 101, 105, 86, 84, 102, 77, 85, 78, 89,
+  96, 86, 86, 103, 86, 86, 81, 89, 82, 73,
+  73, 69, 79, 76, 108, 85, 76, 79, 94, 83,
+  77, 82, 83, 91, 79, 91, 82, 86, 82, 79,
+  79, 89, 84, 88, 69, 71, 88, 80, 87, 86,
+  83, 81, 89, 83, 84, 87, 81, 76, 85, 84,
+  85, 73, 87, 83, 86, 89, 76, 79, 78, 82,
+  91, 66, 78, 82, 72, 78, 93, 71, 84, 92,
+  83, 82, 74, 79, 93, 71, 96, 76, 80, 80,
+  87, 75, 72, 75, 97, 88, 52, 77, 74, 83,
+  78, 73, 67, 88, 87, 70, 109, 74, 70, 83,
+  78, 94, 83, 83, 70, 84, 73, 87, 77, 79,
+  103, 92, 89, 95, 79, 75, 70, 71, 97, 83,
+  99, 84, 91, 79, 93, 87, 80, 94, 85, 76,
+  97, 84, 79, 79, 93, 76, 90, 78, 80, 112,
+  70, 92, 75, 85, 90, 70, 84, 81, 70, 74,
+  90, 85, 77, 73, 100, 89, 71, 78, 86, 68,
+  78, 85, 86, 75, 87, 96, 82, 75, 86, 75,
+  80, 74, 90, 88, 62, 71, 82, 89, 82, 69,
+  95, 85, 118, 70, 67, 86, 69, 84, 98, 75,
+  74, 84, 94, 88, 85, 75, 74, 74, 98, 89,
+  74, 88, 91, 68, 81, 72, 65, 88, 80, 80,
+  88, 107, 100, 81, 85, 71, 71, 68, 76, 82,
+  66, 86, 89, 76, 84, 83, 62, 85, 68, 93,
+  85, 76, 71, 82, 68, 79, 76, 77, 114, 88,
+  86, 91, 83, 87, 67, 75, 91, 79, 106, 77,
+  79, 68, 102, 84, 71, 87, 91, 71, 114, 78,
+  84, 69, 92, 81, 84, 78, 81, 98, 79, 94,
+  82, 92, 87, 76, 104, 71, 72, 69, 86, 79,
+  72, 83, 83, 86, 74, 72, 85, 65, 76, 78,
+  91, 65, 81, 102, 81, 74, 86, 76, 72, 77,
+  104, 92, 67, 75, 84, 83, 100, 65, 98, 93,
+  82, 67, 75, 76, 67, 82, 92, 80, 70, 81,
+  98, 79, 98, 70, 76, 73, 102, 87, 74, 82,
+  82, 64, 87, 70, 74, 89, 76, 87, 74, 105,
+  88, 82, 113, 76, 76, 76, 81, 75, 72, 86,
+  82, 73, 100, 91, 71, 83, 79, 95, 81, 83,
+  77, 82, 80, 87, 80, 79, 94, 89, 86, 92,
+  93, 95, 68, 71, 91, 79, 95, 87, 73, 80,
+  89, 90, 76, 92, 83, 82, 109, 92, 79, 80,
+  93, 87, 88, 78, 78, 74, 65, 97, 81, 85,
+  88, 68, 81, 83, 75, 71, 92, 86, 76, 76,
+  70, 85, 73, 79, 87, 70, 80, 73, 83, 75,
+  89, 100, 79, 80, 87, 78, 72, 76, 93, 89,
+  61, 60, 81, 89, 83, 75, 98, 83, 67, 73,
+  73, 77, 69, 83, 98, 81, 68, 80, 93, 89,
+  107, 77, 79, 79, 99, 90, 68, 89, 87, 64,
+  89, 71, 72, 87, 85, 80, 86, 99, 71, 85,
+  67, 95, 86, 94, 67, 74, 88, 88, 79, 78,
+  90, 85, 81, 84, 86, 96, 83, 75, 93, 89,
+  78, 84, 84, 86, 82, 87, 91, 98, 85, 85,
+  78, 79, 82, 90, 92, 87, 76, 83, 91, 91,
+  80, 97, 80, 87, 74, 81, 76, 89, 85, 87,
+  90, 90, 92, 90, 74, 83, 80, 78, 85, 95,
+  78, 74, 95, 90, 88, 84, 93, 70, 88, 95,
+  78, 85, 87, 74, 78, 85, 75, 84, 86, 94,
+  84, 83, 83, 84, 82, 84, 80, 85, 81, 91,
+  83, 89, 90, 85, 84, 79, 99, 93, 76, 100,
+  76, 86, 86, 79, 81, 93, 76, 89, 77, 97,
+  85, 85, 90, 81, 79, 92, 80, 87, 91, 83,
+  79, 89, 91, 80, 91, 102, 71, 87, 78, 94,
+  82, 75, 71, 80, 91, 80, 82, 85, 96, 88,
+  85, 83, 88, 100, 87, 72, 84, 87, 79, 83,
+  93, 88, 85, 86, 87, 84, 94, 96, 82, 78,
+  81, 79, 84, 85, 88, 75, 86, 100, 84, 98,
+  79, 75, 87, 86, 77, 83, 85, 86, 89, 89,
+  87, 87, 76, 90, 81, 83, 82, 88, 77, 74,
+  82, 91, 103, 85, 96, 70, 74, 87, 75, 84,
+  88, 68, 79, 88, 78, 81, 87, 98, 85, 79,
+  85, 85, 78, 79, 89, 88, 83, 83, 84, 89,
+  86, 82, 83, 87, 92, 85, 71, 97, 68, 85,
+  88, 92, 84, 90, 84, 93, 76, 96, 86, 79,
+  91, 91, 78, 91, 85, 80, 88, 87, 87, 90,
+  94, 82, 96, 110, 68, 86, 95, 93, 88, 74,
+  70, 76, 90, 87, 74, 79, 91, 81, 82, 85,
+  90, 97, 82, 78, 80, 91, 90, 84, 91, 84,
+  79, 85, 85, 83, 83, 93, 79, 79, 89, 77,
+  88, 86, 83, 84, 94, 90, 93, 94, 82, 82,
+  85, 89, 77, 87, 84, 79, 87, 88, 84, 76,
+  72, 84, 86, 80, 85, 90, 76, 81, 92, 88,
+  92, 91, 90, 84, 78, 94, 83, 84, 85, 76,
+  80, 84, 76, 85, 83, 94, 79, 88, 87, 84,
+  79, 86, 78, 87, 77, 74, 85, 88, 86, 89,
+  79, 79, 74, 91, 76, 76, 77, 86, 87, 82,
+  81, 90, 75, 90, 72, 98, 85, 81, 95, 85,
+  93, 94, 79, 86, 86, 85, 80, 90, 95, 81,
+  90, 96, 70, 94, 87, 90, 82, 85, 85, 76,
+  72, 92, 74, 75, 80, 115, 69, 68, 71, 98,
+  83, 90, 87, 86, 90, 80, 86, 78, 87, 100,
+  116, 93, 73, 97, 75, 86, 74, 97, 87, 64,
+  94, 69, 87, 61, 79, 69, 70, 80, 83, 86,
+  83, 73, 88, 86, 73, 75, 72, 73, 65, 82,
+  83, 97, 82, 78, 96, 84, 103, 63, 91, 78,
+  82, 122, 73, 78, 104, 71, 77, 72, 74, 76,
+  119, 61, 82, 106, 76, 94, 82, 95, 80, 104,
+  79, 92, 82, 85, 69, 76, 93, 73, 82, 70,
+  72, 76, 78, 79, 94, 110, 125, 81, 79, 86,
+  94, 72, 78, 70, 84, 95, 81, 114, 105, 91,
+  83, 90, 89, 73, 78, 75, 85, 70, 84, 89,
+  75, 95, 78, 82, 92, 77, 85, 74, 77, 85,
+  71, 84, 84, 99, 81, 70, 72, 88, 67, 86,
+  87, 75, 78, 80, 87, 80, 80, 107, 93, 98,
+  73, 92, 75, 81, 83, 77, 93, 71, 95, 80,
+  72, 65, 85, 72, 73, 79, 75, 75, 80, 72,
+  91, 90, 75, 78, 66, 74, 54, 85, 90, 94,
+  75, 73, 99, 71, 95, 66, 95, 68, 79, 89,
+  83, 75, 92, 68, 82, 63, 70, 89, 126, 69,
+  84, 111, 67, 90, 75, 87, 87, 99, 85, 95,
+  81, 89, 68, 79, 76, 76, 81, 78, 80, 78,
+  78, 89, 88, 107, 137, 77, 75, 90, 93, 81,
+  87, 64, 89, 79, 74, 103, 84, 93, 73, 84,
+  101, 77, 84, 69, 90, 79, 79, 88, 81, 73,
+  76, 78, 84, 82, 87, 74, 71, 83, 71, 83,
+  77, 89, 80, 68, 71, 90, 81, 90, 83, 79,
+  70, 81, 79, 82, 89, 93, 95, 91, 77, 86,
+  78, 80, 82, 85, 104, 65, 87, 78, 84, 70,
+  80, 72, 74, 91, 85, 81, 83, 73, 91, 79,
+  77, 80, 75, 76, 68, 86, 84, 94, 81, 85,
+  96, 92, 114, 71, 89, 74, 85, 96, 100, 75,
+  104, 67, 81, 69, 74, 93, 120, 69, 84, 102,
+  75, 88, 83, 81, 100, 95, 79, 94, 81, 98,
+  74, 77, 91, 78, 89, 79, 78, 78, 78, 104,
+  92, 106, 122, 76, 79, 88, 93, 78, 88, 74,
+  87, 79, 79, 100, 75, 90, 81, 88, 95, 77,
+  80, 71, 85, 78, 85, 84, 82, 86, 80, 92,
+  86, 90, 87, 67, 83, 78, 78, 73, 86, 103,
+  86, 71, 80, 81, 82, 72, 86, 79, 75, 89,
+  83, 87, 76, 94, 88, 88, 85, 88, 82, 85,
+  83, 89, 83, 76, 89, 77, 77, 68, 73, 77,
+  82, 83, 84, 87, 84, 74, 95, 79, 73, 80,
+  68, 93, 64, 92, 71, 94, 83, 83, 81, 99,
+  96, 86, 78, 67, 79, 77, 79, 82, 79, 87,
+  81, 71, 80, 77, 97, 81, 84, 96, 73, 83,
+  82, 80, 77, 89, 86, 90, 75, 70, 75, 75,
+  73, 84, 87, 94, 79, 78, 74, 75, 76, 99,
+  106, 84, 84, 80, 92, 83, 95, 82, 100, 80,
+  66, 88, 93, 95, 83, 99, 103, 86, 70, 77,
+  80, 96, 83, 92, 98, 83, 74, 82, 86, 74,
+  83, 72, 82, 69, 80, 86, 96, 88, 96, 71,
+  88, 85, 80, 73, 79, 80, 78, 85, 77, 81,
+  75, 92, 78, 87, 89, 97, 93, 82, 97, 70,
+  87, 73, 94, 82, 76, 77, 79, 85, 94, 84,
+  79, 87, 86, 72, 96, 83, 73, 78, 68, 85,
+  74, 90, 79, 92, 81, 85, 80, 93, 75, 99,
+  83, 75, 81, 73, 74, 77, 75, 86, 80, 68,
+  77, 93, 81, 91, 84, 88, 77, 87, 83, 77,
+  73, 83, 73, 96, 72, 69, 79, 80, 68, 86,
+  82, 108, 80, 89, 76, 86, 75, 96, 77, 91,
+  83, 79, 87, 90, 94, 79, 104, 71, 74, 85,
+  81, 102, 73, 90, 100, 88, 72, 79, 75, 95,
+  77, 100, 90, 80, 79, 88, 84, 81, 82, 67,
+  80, 76, 73, 81, 84, 81, 90, 68, 79, 80,
+  81, 80, 79, 80, 77, 85, 78, 80, 79, 88,
+  77, 81, 86, 104, 91, 82, 95, 84, 87, 78,
+  91, 76, 80, 78, 88, 86, 87, 83, 88, 98,
+  83, 71, 92, 81, 78, 80, 72, 78, 73, 88,
+  77, 84, 82, 88, 85, 105, 100, 88, 77, 69,
+  88, 77, 89, 80, 83, 84, 82, 73, 77, 89,
+  94, 84, 88, 92, 81, 80, 87, 73, 77, 83,
+  89, 87, 79, 75, 76, 79, 78, 87, 86, 92,
+  79, 79, 71, 82, 77, 94, 98, 77, 82, 80,
+  88, 86, 101, 85, 100, 79, 80, 82, 81, 98,
+  83, 91, 92, 84, 75, 78, 82, 94, 89, 89,
+  85, 82, 78, 95, 84, 99, 84, 75, 82, 80,
+  80, 77, 89, 87, 84, 68, 87, 84, 86, 79,
+  84, 82, 73, 86, 79, 87, 88, 87, 83, 90,
+  92, 85, 86, 90, 89, 90, 84, 81, 85, 77,
+  83, 94, 76, 85, 89, 86, 93, 87, 80, 81,
+  99, 82, 83, 83, 86, 94, 68, 87, 70, 89,
+  93, 86, 80, 100, 95, 92, 79, 75, 82, 77,
+  95, 98, 84, 88, 85, 81, 85, 81, 87, 90,
+  88, 78, 80, 85, 89, 84, 80, 84, 87, 76,
+  74, 79, 79, 74, 81, 84, 82, 89, 94, 80,
+  75, 83, 76, 98, 83, 83, 89, 86, 83, 91,
+  94, 90, 93, 76, 79, 83, 93, 89, 81, 93,
+  90, 87, 72, 75, 81, 97, 91, 91, 95, 80,
+  82, 90, 78, 84, 82, 80, 80, 75, 84, 90,
+  100, 85, 82, 63, 94, 92, 89, 87, 81, 85,
+  82, 79, 79, 82, 94, 81, 76, 88, 96, 93,
+  92, 86, 97, 81, 90, 75, 83, 64, 85, 102,
+  83, 97, 94, 86, 91, 87, 83, 76, 89, 79,
+  88, 79, 92, 88, 82, 82, 75, 84, 94, 88,
+  82, 95, 79, 98, 79, 83, 83, 80, 82, 92,
+  82, 87, 92, 83, 75, 93, 80, 87, 87, 68,
+  88, 85, 96, 81, 80, 82, 75, 81, 79, 76,
+  79, 76, 79, 83, 76, 85, 90, 82, 80, 84,
+  77, 96, 59, 85, 90, 87, 76, 95, 90, 86,
+  95, 76, 86, 84, 90, 92, 75, 93, 86, 82,
+  77, 79, 80, 90, 87, 95, 86, 83, 86, 92,
+  83, 84, 79, 77, 81, 80, 81, 81, 86, 83,
+  81, 67, 88, 86, 87, 87, 78, 82, 87, 82,
+  80, 81, 90, 85, 76, 77, 90, 94, 92, 84,
+  98, 87, 84, 85, 80, 71, 87, 97, 83, 92,
+  87, 85, 93, 88, 82, 76, 92, 81, 90, 82,
+  94, 82, 79, 84, 77, 87, 90, 94, 84, 103,
+  95, 89, 79, 77, 85, 79, 85, 93, 89, 84,
+  87, 93, 80, 94, 87, 87, 91, 73, 90, 79,
+  94, 84, 81, 85, 87, 79, 81, 76, 82, 77,
+  84, 85, 80, 80, 82, 80, 76, 82, 75, 95,
+  85, 81, 84, 86, 82, 93, 92, 93, 92, 83,
+  84, 85, 90, 88, 82, 95, 84, 90, 78, 76,
+  89, 94, 96, 90, 89, 78, 85, 82, 103, 97,
+  91, 81, 81, 71, 79, 72, 71, 76, 86, 81,
+  85, 77, 78, 81, 82, 65, 65, 74, 87, 93,
+  82, 74, 87, 90, 81, 86, 91, 83, 69, 80,
+  83, 87, 83, 80, 84, 100, 86, 92, 84, 80,
+  97, 98, 94, 91, 86, 85, 80, 89, 74, 79,
+  100, 83, 87, 95, 77, 87, 85, 78, 85, 90,
+  74, 83, 88, 70, 72, 84, 90, 77, 85, 83,
+  87, 61, 84, 102, 86, 89, 85, 86, 93, 81,
+  81, 73, 91, 81, 75, 78, 74, 97, 85, 92,
+  79, 95, 90, 84, 82, 72, 84, 82, 83, 84,
+  93, 84, 89, 86, 84, 91, 86, 87, 86, 84,
+  82, 83, 90, 85, 70, 90, 90, 95, 79, 82,
+  90, 78, 77, 86, 93, 81, 75, 79, 80, 84,
+  94, 79, 74, 77, 74, 74, 74, 79, 73, 77,
+  84, 88, 92, 86, 95, 82, 78, 101, 85, 82,
+  97, 72, 78, 90, 81, 65, 72, 85, 76, 93,
+  85, 86, 72, 89, 84, 85, 82, 83, 84, 90,
+  85, 88, 88, 92, 86, 74, 83, 67, 112, 80,
+  100, 89, 80, 72, 82, 79, 80, 72, 85, 82,
+  79, 83, 67, 78, 103, 82, 81, 90, 80, 65,
+  73, 94, 79, 86, 87, 102, 78, 72, 86, 81,
+  83, 87, 86, 72, 78, 86, 83, 80, 76, 83,
+  86, 84, 73, 72, 84, 77, 85, 78, 92, 88,
+  75, 94, 85, 77, 88, 87, 62, 83, 93, 75,
+  86, 90, 82, 87, 90, 89, 84, 80, 90, 78,
+  99, 83, 101, 90, 81, 82, 72, 79, 90, 78,
+  79, 80, 98, 82, 74, 87, 70, 83, 89, 89,
+  95, 105, 98, 80, 82, 81, 97, 83, 83, 80,
+  90, 82, 82, 91, 88, 87, 90, 93, 88, 87,
+  83, 90, 79, 80, 91, 76, 77, 96, 79, 83,
+  75, 100, 78, 76, 73, 70, 86, 79, 96, 93,
+  92, 74, 84, 87, 75, 76, 69, 85, 84, 104,
+  67, 93, 93, 86, 76, 83, 77, 86, 77, 78,
+  78, 86, 89, 90, 82, 73, 94, 94, 72, 79,
+  82, 88, 80, 85, 79, 74, 87, 90, 95, 73,
+  90, 78, 79, 79, 75, 71, 80, 89, 75, 88,
+  87, 74, 77, 80, 73, 77, 89, 81, 80, 79,
+  87, 73, 85, 86, 88, 87, 93, 74, 84, 76,
+  73, 78, 99, 97, 96, 85, 79, 71, 82, 78,
+  78, 86, 80, 80, 83, 86, 81, 78, 83, 76,
+  79, 84, 80, 86, 79, 75, 88, 90, 80, 83,
+  95, 85, 66, 87, 62, 79, 78, 73, 73, 93,
+  90, 90, 88, 88, 90, 106, 90, 97, 88, 88,
+  79, 82, 78, 64, 88, 79, 89, 96, 81, 81,
+  82, 60, 70, 90, 69, 74, 88, 68, 73, 88,
+  86, 82, 86, 86, 86, 75, 69, 108, 88, 86,
+  85, 84, 84, 80, 83, 69, 87, 82, 85, 71,
+  73, 85, 82, 91, 77, 95, 88, 81, 77, 67,
+  80, 81, 86, 79, 88, 84, 88, 89, 87, 89,
+  86, 91, 62, 89, 90, 83, 85, 88, 76, 91,
+  93, 95, 80, 77, 89, 88, 89, 80, 82, 83,
+  72, 87, 75, 77, 84, 84, 75, 78, 80, 95,
+  74, 70, 73, 89, 82, 91, 90, 88, 127, 80,
+  77, 89, 86, 83, 92, 65, 68, 89, 84, 69,
+  101, 98, 75, 78, 74, 72, 60, 103, 90, 85,
+  77, 86, 78, 86, 78, 97, 77, 83, 82, 67,
+  81, 50, 96, 67, 99, 95, 83, 65, 76, 63,
+  71, 77, 93, 82, 79, 85, 73, 92, 87, 90,
+  84, 83, 93, 114, 62, 96, 78, 72, 81, 105,
+  74, 72, 99, 92, 65, 88, 83, 63, 76, 83,
+  99, 79, 74, 78, 81, 78, 76, 63, 88, 77,
+  82, 70, 83, 87, 76, 99, 78, 76, 82, 98,
+  45, 104, 105, 76, 80, 81, 85, 100, 89, 78,
+  77, 71, 89, 95, 121, 72, 84, 107, 81, 73,
+  73, 72, 88, 81, 87, 79, 100, 109, 74, 81,
+  63, 77, 96, 85, 99, 85, 98, 84, 91, 74,
+  100, 83, 79, 80, 102, 90, 88, 106, 111, 73,
+  114, 92, 80, 60, 84, 104, 84, 83, 81, 79,
+  91, 78, 79, 79, 69, 88, 76, 75, 77, 78,
+  72, 77, 92, 99, 89, 78, 84, 92, 83, 76,
+  86, 95, 89, 97, 71, 91, 73, 97, 78, 75,
+  94, 109, 92, 67, 77, 86, 83, 69, 89, 87,
+  96, 108, 83, 76, 81, 90, 85, 92, 87, 81,
+  91, 74, 91, 71, 96, 81, 86, 80, 93, 81,
+  75, 101, 94, 84, 84, 83, 75, 77, 95, 104,
+  79, 91, 85, 75, 94, 66, 82, 79, 85, 88,
+  96, 84, 89, 71, 59, 78, 101, 106, 94, 87,
+  81, 71, 86, 75, 71, 76, 84, 79, 82, 96,
+  86, 75, 79, 73, 74, 75, 77, 83, 86, 75,
+  87, 86, 83, 88, 98, 95, 73, 89, 77, 87,
+  83, 74, 81, 103, 94, 93, 88, 84, 90, 108,
+  94, 86, 87, 87, 77, 85, 79, 80, 91, 84,
+  86, 96, 86, 76, 80, 67, 76, 95, 82, 70,
+  92, 69, 92, 98, 83, 77, 83, 83, 96, 91,
+  60, 113, 89, 87, 90, 79, 86, 74, 89, 66,
+  86, 82, 88, 90, 67, 88, 87, 91, 89, 103,
+  88, 87, 81, 77, 80, 82, 82, 75, 85, 86,
+  88, 87, 78, 88, 83, 91, 62, 89, 82, 93,
+  93, 81, 69, 93, 87, 88, 76, 70, 91, 90,
+  91, 86, 52, 85, 80, 86, 86, 83, 79, 84,
+  79, 84, 75, 81, 76, 75, 73, 92, 90, 78,
+  75, 78, 86, 71, 76, 90, 92, 85, 92, 58,
+  71, 92, 96, 78, 120, 94, 95, 88, 73, 77,
+  75, 100, 100, 89, 79, 94, 87, 77, 86, 99,
+  80, 81, 85, 74, 83, 70, 98, 75, 98, 91,
+  89, 72, 80, 73, 70, 82, 81, 82, 80, 67,
+  103, 86, 88, 91, 85, 90, 85, 111, 82, 92,
+  82, 77, 85, 84, 80, 66, 96, 83, 75, 87,
+  93, 80, 75, 87, 109, 76, 78, 83, 79, 87,
+  79, 75, 93, 76, 76, 69, 78, 94, 79, 96,
+  68, 80, 83, 87, 56, 93, 61, 79, 87, 82,
+  70, 95, 90, 80, 82, 66, 87, 105, 102, 75,
+  61, 101, 93, 74, 79, 77, 75, 80, 76, 88,
+  81, 87, 64, 79, 62, 71, 87, 81, 94, 76,
+  93, 81, 86, 76, 106, 88, 87, 73, 88, 90,
+  87, 106, 85, 76, 87, 91, 83, 70, 88, 84,
+  80, 82, 75, 95, 90, 78, 92, 85, 78, 85,
+  85, 79, 77, 96, 80, 77, 91, 77, 101, 98,
+  89, 87, 85, 79, 84, 93, 90, 83, 91, 67,
+  86, 101, 78, 81, 90, 96, 113, 66, 80, 88,
+  76, 70, 77, 86, 92, 103, 86, 78, 92, 100,
+  84, 90, 98, 82, 82, 72, 76, 81, 79, 91,
+  84, 79, 93, 98, 79, 99, 90, 83, 77, 86,
+  80, 77, 91, 104, 70, 76, 79, 95, 84, 73,
+  82, 80, 90, 92, 82, 81, 94, 87, 75, 72,
+  93, 66, 81, 93, 81, 81, 79, 92, 88, 83,
+  77, 82, 85, 73, 86, 86, 79, 89, 73, 69,
+  89, 91, 94, 63, 86, 82, 93, 67, 91, 92,
+  74, 69, 88, 74, 88, 92, 77, 63, 91, 97,
+  96, 83, 95, 88, 95, 96, 75, 80, 84, 80,
+  83, 86, 90, 76, 94, 93, 71, 82, 103, 52,
+  81, 80, 83, 100, 74, 71, 87, 65, 107, 62,
+  82, 73, 75, 85, 71, 81, 95, 93, 101, 96,
+  90, 142, 70, 69, 94, 89, 91, 78, 83, 98,
+  90, 83, 92, 75, 98, 86, 80, 71, 91, 87,
+  66, 70, 92, 92, 73, 87, 83, 81, 58, 134,
+  88, 105, 82, 88, 99, 97, 83, 80, 76, 89,
+  78, 55, 76, 96, 88, 83, 81, 87, 71, 69,
+  86, 76, 83, 83, 75, 93, 68, 80, 72, 85,
+  67, 87, 92, 88, 85, 96, 102, 65, 79, 80,
+  91, 86, 104, 80, 88, 76, 73, 90, 64, 74,
+  75, 66, 89, 69, 83, 54, 78, 92, 80, 80,
+  81, 94, 83, 90, 82, 82, 77, 71, 84, 84,
+  81, 72, 97, 77, 91, 80, 99, 63, 74, 80,
+  83, 98, 63, 76, 77, 71, 97, 80, 77, 87,
+  101, 88, 65, 70, 91, 80, 84, 94, 88, 117,
+  73, 92, 79, 79, 85, 90, 97, 84, 81, 94,
+  94, 71, 91, 80, 80, 69, 119, 87, 104, 65,
+  86, 90, 61, 84, 76, 82, 70, 102, 81, 95,
+  94, 100, 80, 94, 74, 83, 74, 78, 84, 46,
+  76, 82, 99, 81, 83, 94, 86, 81, 84, 77,
+  89, 67, 74, 90, 89, 76, 69, 83, 74, 88,
+  104, 85, 90, 96, 91, 74, 93, 84, 87, 91,
+  87, 74, 96, 92, 74, 97, 72, 82, 85, 75,
+  84, 75, 82, 62, 74, 87, 83, 84, 89, 86,
+  78, 74, 89, 87, 72, 81, 89, 81, 71, 77,
+  83, 75, 94, 83, 98, 78, 75, 86, 83, 92,
+  73, 82, 80, 73, 85, 76, 78, 80, 94, 89,
+  65, 77, 88, 76, 82, 91, 94, 103, 78, 94,
+  77, 84, 69, 99, 96, 84, 78, 83, 98, 85,
+  93, 90, 88, 81, 108, 90, 118, 77, 78, 95,
+  84, 88, 76, 92, 87, 84, 94, 87, 86, 87,
+  83, 91, 86, 80, 85, 81, 94, 59, 84, 81,
+  85, 88, 83, 72, 83, 65, 80, 78, 79, 78,
+  78, 91, 74, 83, 78, 81, 82, 73, 88, 89,
+  75, 91, 72, 71, 87, 84, 84, 77, 92, 82,
+  87, 83, 82, 88, 68, 69, 82, 74, 86, 88,
+  78, 72, 80, 89, 80, 82, 88, 88, 96, 91,
+  77, 81, 84, 79, 84, 79, 82, 77, 91, 87,
+  73, 88, 100, 55, 76, 84, 76, 100, 82, 91,
+  82, 78, 92, 71, 83, 84, 84, 97, 72, 81,
+  89, 87, 88, 93, 86, 105, 72, 80, 86, 88,
+  92, 75, 86, 91, 88, 77, 93, 79, 92, 86,
+  80, 70, 87, 89, 93, 79, 94, 90, 71, 86,
+  74, 83, 74, 143, 85, 93, 88, 88, 87, 96,
+  78, 86, 81, 86, 80, 68, 80, 89, 85, 83,
+  84, 94, 67, 74, 86, 60, 92, 61, 75, 89,
+  73, 75, 80, 86, 71, 86, 91, 87, 95, 92,
+  99, 71, 80, 77, 84, 109, 105, 83, 83, 94,
+  63, 84, 72, 74, 80, 90, 82, 69, 75, 75,
+  70, 83, 80, 88, 77, 95, 81, 81, 86, 78,
+  74, 76, 87, 75, 70, 80, 81, 85, 78, 82,
+  86, 68, 86, 86, 73, 91, 76, 88, 80, 79,
+  77, 83, 85, 90, 105, 95, 72, 82, 84, 81,
+  71, 86, 79, 77, 69, 100, 74, 71, 75, 79,
+  92, 89, 70, 87, 82, 89, 84, 78, 78, 65,
+  111, 90, 135, 85, 89, 89, 75, 82, 81, 84,
+  84, 97, 77, 79, 86, 102, 68, 91, 78, 91,
+  82, 76, 89, 64, 76, 81, 96, 85, 74, 101,
+  79, 81, 87, 68, 90, 44, 82, 81, 92, 74,
+  78, 85, 80, 88, 98, 81, 94, 92, 82, 75,
+  88, 84, 90, 103, 88, 82, 79, 103, 83, 83,
+  86, 76, 87, 97, 82, 72, 73, 86, 80, 82,
+  89, 82, 84, 82, 74, 80, 97, 75, 74, 90,
+  96, 79, 63, 92, 73, 80, 80, 91, 89, 84,
+  84, 96, 81, 83, 77, 84, 81, 75, 72, 76,
+  83, 80, 87, 91, 79, 89, 87, 84, 76, 90,
+  87, 80, 76, 86, 79, 79, 73, 76, 83, 84,
+  68, 81, 83, 101, 90, 89, 80, 78, 89, 90,
+  116, 93, 84, 94, 89, 95, 89, 90, 95, 75,
+  85, 82, 77, 95, 79, 95, 75, 84, 103, 81,
+  102, 77, 74, 90, 83, 97, 83, 73, 88, 75,
+  78, 76, 84, 69, 83, 83, 75, 78, 74, 75,
+  83, 71, 96, 83, 79, 89, 69, 74, 98, 85,
+  85, 73, 82, 78, 90, 93, 80, 94, 75, 68,
+  83, 75, 87, 87, 86, 72, 85, 84, 84, 84,
+  90, 87, 92, 85, 85, 83, 75, 87, 79, 88,
+  85, 85, 90, 88, 76, 88, 98, 71, 84, 83,
+  83, 89, 79, 82, 87, 79, 91, 77, 83, 84,
+  82, 104, 70, 85, 87, 82, 94, 99, 83, 98,
+  73, 78, 87, 90, 91, 75, 86, 90, 83, 69,
+  95, 82, 91, 88, 84, 74, 83, 89, 88, 80,
+  89, 88, 89, 91, 82, 86, 81, 126, 80, 89,
+  88, 83, 94, 91, 80, 87, 86, 93, 79, 83,
+  91, 84, 82, 92, 82, 91, 73, 83, 81, 65,
+  87, 53, 83, 86, 80, 75, 69, 82, 71, 80,
+  95, 85, 97, 89, 94, 74, 93, 83, 91, 89,
+  95, 77, 88, 94, 76, 92, 73, 71, 84, 86,
+  75, 78, 85, 77, 74, 83, 85, 92, 84, 92,
+  81, 81, 87, 83, 70, 87, 86, 80, 83, 78,
+  85, 88, 72, 86, 91, 77, 90, 87, 78, 86,
+  82, 76, 90, 81, 85, 83, 84, 95, 83, 89,
+  79, 91, 85, 81, 81, 93, 79, 88, 75, 91,
+  72, 83, 83, 77, 86, 84, 71, 78, 85, 81,
+  84, 86, 83, 78, 82, 87, 100, 84, 86, 88,
+  85, 95, 94, 89, 90, 88, 75, 84, 83, 85,
+  80, 91, 81, 94, 90, 84, 91, 90, 82, 77,
+  86, 86, 72, 94, 80, 87, 79, 74, 80, 49,
+  92, 81, 97, 79, 65, 83, 71, 87, 104, 83,
+  96, 85, 98, 70, 87, 86, 97, 81, 78, 78,
+  86, 95, 87, 92, 80, 69, 86, 84, 77, 78,
+  85, 90, 79, 88, 97, 83, 86, 86, 70, 84,
+  89, 78, 68, 94, 88, 82, 72, 82, 69, 85,
+  77, 84, 94, 86, 91, 95, 82, 87, 84, 76,
+  94, 90, 82, 81, 84, 85, 71, 85, 84, 96,
+  83, 85, 88, 95, 89, 94, 82, 86, 76, 80,
+  81, 76, 80, 84, 72, 80, 83, 84, 87, 93,
+  82, 80, 84, 88, 87, 80, 84, 88, 75, 98,
+  99, 90, 97, 82, 81, 84, 85, 82, 94, 94,
+  74, 85, 92, 84, 101, 91, 88, 82, 88, 62,
+  99, 91, 87, 85, 81, 76, 63, 78, 87, 90,
+  90, 74, 65, 86, 76, 72, 75, 90, 79, 97,
+  93, 94, 89, 107, 86, 88, 93, 104, 89, 85,
+  98, 96, 89, 87, 89, 86, 67, 90, 80, 71,
+  86, 90, 72, 77, 78, 99, 77, 81, 74, 92,
+  81, 89, 92, 82, 82, 78, 82, 75, 83, 86,
+  77, 67, 83, 88, 80, 102, 88, 79, 75, 90,
+  85, 91, 72, 77, 71, 80, 89, 72, 74, 94,
+  75, 82, 67, 78, 92, 82, 104, 94, 77, 89,
+  82, 85, 74, 88, 77, 90, 78, 70, 80, 95,
+  86, 86, 99, 92, 82, 84, 71, 76, 80, 84,
+  80, 86, 97, 86, 96, 94, 75, 95, 96, 80,
+  88, 87, 97, 93, 80, 90, 77, 83, 87, 98,
+  97, 81, 85, 68, 60, 74, 78, 81, 75, 81,
+  68, 71, 76, 76, 76, 93, 93, 81, 89, 91,
+  102, 107, 88, 97, 106, 100, 76, 95, 109, 83,
+  98, 79, 86, 98, 73, 81, 70, 70, 87, 95,
+  70, 77, 77, 93, 62, 73, 78, 69, 84, 96,
+  82, 81, 77, 72, 70, 78, 89, 88, 77, 70,
+  66, 80, 86, 90, 90, 77, 76, 78, 76, 89,
+  77, 64, 67, 85, 84, 79, 66, 100, 80, 87,
+  74, 80, 91, 94, 106, 91, 81, 84, 73, 94,
+  65, 108, 70, 84, 89, 71, 74, 74, 74, 85,
+  91, 84, 89, 86, 74, 74, 79, 85, 83, 91,
+  79, 78, 76, 104, 74, 92, 83, 78, 79, 81,
+  81, 84, 95, 97, 86, 97, 79, 87, 84, 91,
+  81, 79, 60, 79, 82, 88, 91, 69, 65, 93,
+  79, 77, 76, 95, 87, 95, 84, 86, 78, 106,
+  90, 90, 82, 91, 88, 90, 100, 80, 100, 78,
+  88, 87, 70, 91, 77, 68, 83, 84, 79, 79,
+  76, 82, 72, 80, 80, 79, 74, 96, 97, 98,
+  81, 79, 78, 75, 87, 86, 84, 59, 80, 91,
+  87, 97, 88, 83, 97, 91, 87, 90, 76, 74,
+  74, 91, 91, 83, 72, 92, 77, 88, 64, 85,
+  88, 91, 101, 99, 79, 85, 85, 86, 74, 88,
+  80, 91, 88, 68, 80, 65, 86, 84, 94, 94,
+  85, 90, 76, 80, 81, 82, 85, 94, 84, 97,
+  74, 91, 82, 93, 80, 81, 82, 92, 98, 92,
+  78, 91, 85, 63, 78, 99, 102, 82, 77, 66,
+  71, 82, 80, 94, 97, 77, 69, 113, 83, 94,
+  86, 91, 93, 84, 94, 106, 89, 100, 90, 97,
+  114, 98, 91, 82, 98, 101, 78, 82, 74, 94,
+  70, 86, 81, 82, 89, 98, 71, 87, 83, 105,
+  78, 85, 61, 84, 82, 98, 83, 88, 84, 66,
+  78, 81, 85, 75, 73, 61, 80, 77, 92, 97,
+  86, 68, 88, 80, 86, 82, 78, 68, 67, 70,
+  81, 71, 72, 107, 85, 81, 71, 79, 94, 89,
+  86, 93, 74, 93, 71, 86, 64, 77, 78, 72,
+  87, 71, 70, 86, 75, 80, 97, 87, 80, 95,
+  67, 81, 78, 95, 79, 87, 82, 79, 88, 89,
+  76, 77, 89, 77, 102, 75, 84, 87, 85, 85,
+  71, 86, 80, 117, 126, 75, 71, 55, 64, 79,
+  70, 85, 75, 78, 78, 98, 79, 100, 78, 103,
+  100, 69, 81, 94, 108, 112, 82, 107, 119, 92,
+  75, 87, 100, 89, 92, 69, 70, 90, 72, 84,
+  69, 79, 99, 107, 70, 76, 77, 80, 58, 84,
+  68, 58, 73, 112, 70, 73, 69, 57, 69, 86,
+  94, 71, 71, 61, 73, 65, 95, 91, 91, 66,
+  63, 68, 81, 80, 89, 48, 57, 80, 87, 72,
+  66, 123, 90, 82, 82, 85, 94, 98, 87, 92,
+  78, 80, 59, 95, 51, 95, 74, 67, 91, 62,
+  67, 75, 64, 80, 94, 77, 85, 95, 64, 73,
+  81, 94, 81, 96, 69, 69, 64, 95, 68, 81,
+  83, 71, 89, 71, 63, 81, 105, 84, 84, 100,
+  87, 93, 101, 89, 75, 67, 68, 82, 76, 95,
+  88, 70, 66, 111, 85, 96, 87, 93, 89, 93,
+  80, 93, 91, 97, 95, 98, 103, 80, 91, 81,
+  97, 78, 88, 70, 74, 89, 72, 86, 78, 80,
+  91, 92, 72, 82, 79, 71, 70, 83, 67, 78,
+  73, 101, 87, 82, 83, 70, 77, 82, 86, 81,
+  78, 57, 79, 78, 86, 98, 90, 75, 74, 83,
+  85, 83, 85, 64, 74, 94, 83, 76, 71, 106,
+  93, 89, 66, 84, 86, 96, 87, 91, 79, 86,
+  74, 84, 65, 77, 82, 81, 88, 72, 72, 72,
+  73, 80, 96, 88, 86, 95, 73, 82, 81, 92,
+  86, 95, 88, 87, 76, 87, 83, 83, 86, 78,
+  87, 80, 86, 85, 86, 84, 88, 60, 72, 91,
+  82, 86, 78, 72, 74, 84, 84, 84, 93, 71,
+  57, 122, 80, 81, 83, 87, 78, 83, 90, 107,
+  77, 87, 99, 85, 90, 83, 98, 82, 87, 95,
+  72, 102, 95, 87, 78, 90, 80, 72, 73, 81,
+  68, 79, 94, 104, 102, 92, 69, 81, 81, 93,
+  96, 102, 96, 84, 87, 88, 77, 91, 92, 80,
+  81, 93, 101, 91, 77, 87, 98, 85, 91, 77,
+  67, 75, 89, 80, 79, 69, 68, 85, 83, 91,
+  75, 85, 95, 84, 87, 92, 68, 115, 74, 72,
+  73, 65, 73, 69, 79, 85, 63, 113, 99, 80,
+  98, 96, 69, 86, 63, 84, 70, 89, 86, 83,
+  94, 89, 79, 88, 93, 84, 83, 74, 99, 77,
+  92, 87, 72, 82, 70, 82, 81, 110, 97, 79,
+  66, 58, 80, 84, 76, 77, 80, 74, 59, 135,
+  85, 87, 81, 97, 78, 68, 87, 107, 89, 87,
+  98, 93, 109, 85, 97, 80, 92, 89, 74, 84,
+  82, 82, 67, 83, 79, 65, 80, 91, 68, 77,
+  93, 88, 87, 88, 71, 68, 78, 98, 81, 85,
+  81, 71, 82, 83, 78, 96, 82, 81, 71, 80,
+  98, 87, 83, 77, 75, 74, 84, 80, 74, 57,
+  81, 93, 73, 68, 63, 88, 88, 87, 77, 99,
+  88, 88, 91, 93, 72, 112, 65, 74, 55, 66,
+  73, 67, 84, 78, 61, 91, 77, 79, 110, 88,
+  72, 87, 60, 84, 71, 90, 81, 90, 97, 86,
+  73, 86, 80, 84, 83, 68, 93, 65, 86, 83,
+  80, 77, 94, 95, 87, 88, 83, 82, 72, 71,
+  68, 85, 84, 84, 87, 73, 57, 119, 89, 78,
+  85, 86, 74, 98, 94, 99, 83, 82, 102, 83,
+  80, 75, 102, 77, 89, 84, 72, 87, 84, 83,
+  66, 93, 77, 71, 79, 77, 70, 67, 88, 77,
+  96, 88, 71, 91, 73, 96, 96, 77, 91, 85,
+  84, 84, 81, 100, 94, 73, 82, 92, 91, 90,
+  83, 91, 71, 85, 87, 80, 74, 70, 88, 104,
+  80, 70, 71, 81, 88, 92, 72, 96, 79, 89,
+  90, 84, 71, 105, 73, 71, 71, 60, 75, 77,
+  81, 87, 63, 93, 94, 79, 103, 91, 75, 84,
+  70, 83, 71, 90, 87, 93, 110, 98, 94, 86,
+  93, 89, 85, 75, 91, 79, 91, 83, 73, 82,
+  101, 78, 92, 80, 82, 94, 96, 88, 87, 85,
+  72, 89, 81, 94, 81, 86, 87, 71, 68, 76,
+  76, 89, 81, 96, 79, 89, 73, 72, 91, 104,
+  80, 83, 81, 88, 88, 93, 95, 79, 73, 89,
+  89, 85, 87, 76, 87, 82, 82, 91, 75, 85,
+  78, 103, 76, 76, 86, 83, 74, 86, 80, 83,
+  77, 84, 73, 82, 84, 98, 87, 72, 84, 80,
+  80, 80, 77, 80, 82, 88, 80, 82, 88, 90,
+  67, 85, 80, 83, 84, 83, 79, 87, 94, 87,
+  92, 83, 80, 72, 86, 87, 87, 67, 92, 77,
+  72, 83, 77, 89, 85, 87, 87, 84, 80, 79,
+  84, 90, 86, 81, 93, 76, 96, 85, 91, 83,
+  75, 87, 86, 84, 83, 68, 88, 94, 84, 89,
+  86, 81, 70, 89, 104, 95, 89, 81, 66, 87,
+  63, 80, 92, 92, 85, 77, 53, 91, 78, 70,
+  87, 101, 85, 105, 74, 69, 89, 101, 72, 82,
+  80, 80, 92, 91, 92, 77, 74, 82, 89, 78,
+  81, 73, 89, 75, 78, 81, 94, 79, 76, 91,
+  82, 76, 89, 93, 89, 84, 74, 78, 70, 87,
+  75, 72, 97, 85, 92, 78, 74, 82, 92, 81,
+  83, 79, 89, 90, 68, 80, 90, 99, 69, 87,
+  71, 83, 77, 84, 79, 80, 98, 91, 101, 76,
+  72, 78, 89, 86, 88, 59, 82, 85, 66, 82,
+  80, 84, 88, 85, 86, 88, 87, 80, 79, 91,
+  94, 77, 84, 73, 86, 78, 78, 90, 71, 86,
+  81, 98, 82, 68, 86, 97, 102, 89, 91, 79,
+  85, 81, 90, 88, 87, 89, 70, 95, 86, 82,
+  79, 85, 87, 73, 74, 85, 84, 91, 79, 91,
+  91, 84, 79, 73, 85, 91, 76, 80, 82, 85,
+  86, 82, 92, 82, 87, 89, 83, 77, 80, 76,
+  89, 80, 80, 84, 76, 86, 78, 91, 75, 75,
+  87, 98, 71, 92, 76, 80, 76, 82, 81, 85,
+  83, 93, 92, 74, 79, 83, 90, 85, 85, 80,
+  83, 83, 79, 92, 86, 88, 69, 86, 76, 82,
+  83, 85, 77, 89, 90, 84, 91, 77, 79, 75,
+  77, 84, 85, 69, 80, 77, 74, 79, 76, 85,
+  88, 88, 92, 84, 81, 75, 79, 88, 87, 72,
+  79, 83, 84, 84, 92, 83, 74, 88, 82, 78,
+  88, 67, 85, 89, 81, 82, 81, 84, 74, 101,
+  112, 94, 86, 79, 70, 84, 81, 73, 87, 99,
+  82, 88, 47, 80, 81, 87, 80, 96, 77, 92,
+  70, 70, 98, 106, 81, 75, 77, 82, 77, 94,
+  90, 78, 73, 90, 87, 76, 80, 73, 89, 80,
+  78, 101, 83, 87, 78, 83, 87, 74, 84, 73,
+  83, 93, 73, 88, 79, 80, 78, 81, 83, 91,
+  92, 78, 87, 88, 87, 68, 83, 73, 83, 95,
+  64, 71, 93, 81, 67, 79, 76, 86, 89, 81,
+  77, 77, 88, 90, 106, 91, 69, 76, 90, 85,
+  90, 60, 91, 81, 66, 81, 90, 87, 90, 86,
+  83, 96, 76, 77, 86, 88, 99, 78, 90, 75,
+  100, 75, 87, 95, 83, 83, 83, 103, 81, 80,
+  85, 95, 73, 103, 83, 100, 60, 88, 124, 111,
+  93, 78, 63, 80, 64, 62, 96, 121, 82, 96,
+  35, 98, 78, 63, 82, 114, 86, 111, 76, 72,
+  97, 84, 79, 79, 85, 77, 86, 88, 84, 79,
+  65, 85, 77, 70, 79, 67, 85, 72, 77, 82,
+  103, 86, 74, 63, 100, 73, 82, 74, 99, 88,
+  62, 87, 76, 75, 72, 70, 83, 66, 106, 80,
+  83, 79, 80, 68, 93, 76, 97, 109, 54, 87,
+  90, 95, 74, 82, 72, 81, 80, 82, 77, 66,
+  97, 92, 149, 78, 64, 87, 100, 83, 96, 47,
+  83, 90, 56, 76, 94, 79, 93, 77, 88, 102,
+  91, 82, 83, 84, 117, 74, 78, 67, 84, 71,
+  81, 94, 79, 80, 88, 131, 82, 80, 84, 96,
+  85, 87, 91, 81, 82, 79, 101, 97, 87, 84,
+  72, 89, 79, 79, 85, 95, 85, 85, 59, 89,
+  80, 93, 85, 89, 87, 83, 79, 72, 86, 77,
+  76, 76, 75, 84, 92, 84, 90, 82, 78, 85,
+  82, 72, 81, 75, 88, 75, 77, 81, 78, 84,
+  75, 87, 78, 74, 83, 85, 78, 95, 72, 81,
+  79, 86, 86, 86, 88, 89, 98, 80, 83, 91,
+  92, 74, 94, 75, 89, 86, 68, 105, 100, 80,
+  69, 80, 70, 81, 91, 84, 78, 90, 90, 84,
+  93, 84, 74, 76, 82, 85, 86, 63, 78, 80,
+  74, 75, 86, 84, 88, 85, 92, 94, 80, 71,
+  84, 88, 94, 73, 86, 86, 87, 77, 90, 86,
+  73, 86, 75, 91, 83, 78, 84, 88, 87, 89,
+  87, 86, 80, 96, 105, 80, 87, 82, 72, 95,
+  86, 74, 94, 107, 88, 78, 63, 81, 87, 85,
+  81, 93, 82, 88, 73, 74, 90, 93, 89, 77,
+  75, 81, 73, 101, 85, 84, 92, 90, 82, 82,
+  77, 79, 91, 77, 77, 96, 78, 88, 75, 86,
+  85, 74, 83, 89, 73, 88, 82, 79, 75, 75,
+  86, 75, 82, 92, 97, 76, 80, 93, 99, 82,
+  77, 80, 80, 88, 76, 78, 79, 75, 73, 78,
+  71, 86, 89, 87, 75, 81, 95, 91, 95, 101,
+  68, 79, 85, 84, 89, 69, 90, 80, 73, 87,
+  80, 90, 87, 87, 84, 89, 87, 71, 90, 81,
+  92, 81, 85, 84, 87, 84, 92, 87, 79, 84,
+  82, 95, 77, 78, 81, 90, 78, 95, 100, 99,
+  73, 97, 106, 93, 96, 81, 65, 93, 71, 81,
+  101, 111, 89, 85, 51, 91, 81, 71, 90, 100,
+  83, 99, 74, 76, 88, 75, 82, 76, 73, 82,
+  77, 88, 80, 81, 74, 92, 66, 77, 84, 77,
+  87, 79, 76, 92, 87, 83, 73, 86, 87, 72,
+  84, 82, 84, 83, 72, 71, 73, 70, 81, 64,
+  85, 81, 103, 73, 84, 99, 89, 78, 80, 84,
+  87, 95, 64, 95, 72, 86, 73, 79, 70, 84,
+  80, 82, 82, 75, 98, 91, 110, 103, 64, 79,
+  99, 82, 87, 60, 84, 88, 73, 82, 78, 83,
+  82, 83, 87, 94, 86, 77, 87, 78, 102, 80,
+  81, 76, 87, 79, 84, 84, 83, 78, 80, 119,
+  75, 74, 77, 88, 88, 90, 91, 87, 87, 78,
+  98, 92, 89, 85, 75, 96, 81, 94, 92, 101,
+  90, 76, 75, 86, 84, 89, 84, 85, 85, 80,
+  77, 77, 87, 72, 88, 77, 77, 88, 86, 86,
+  88, 86, 78, 85, 78, 83, 92, 75, 87, 80,
+  75, 86, 75, 86, 74, 92, 77, 74, 77, 79,
+  69, 91, 78, 77, 80, 82, 91, 81, 85, 86,
+  92, 81, 83, 90, 90, 80, 88, 79, 86, 83,
+  78, 102, 88, 77, 73, 81, 68, 75, 92, 78,
+  86, 92, 94, 82, 88, 95, 74, 80, 88, 86,
+  88, 73, 85, 76, 74, 86, 81, 87, 81, 82,
+  88, 86, 89, 70, 87, 82, 90, 76, 85, 88,
+  88, 86, 95, 84, 81, 88, 79, 88, 79, 75,
+  80, 90, 90, 88, 95, 76, 90, 80, 82, 96,
+  92, 76, 82, 88, 88, 92, 82, 73, 100, 87,
+  90, 81, 64, 79, 86, 91, 89, 89, 75, 85,
+  92, 68, 72, 104, 86, 83, 104, 91, 80, 85,
+  78, 100, 77, 79, 98, 85, 75, 88, 88, 82,
+  86, 82, 75, 83, 79, 100, 93, 75, 85, 66,
+  80, 82, 81, 89, 85, 45, 74, 73, 83, 76,
+  80, 73, 93, 80, 95, 83, 97, 73, 76, 92,
+  74, 100, 85, 90, 75, 91, 79, 71, 86, 77,
+  92, 112, 78, 69, 68, 86, 92, 80, 85, 81,
+  77, 82, 72, 82, 87, 76, 98, 90, 76, 85,
+  78, 91, 83, 80, 93, 90, 67, 88, 71, 84,
+  66, 80, 78, 83, 93, 97, 83, 91, 95, 91,
+  81, 80, 85, 82, 74, 98, 97, 77, 93, 81,
+  73, 75, 80, 80, 73, 76, 75, 67, 75, 82,
+  72, 88, 84, 77, 96, 82, 92, 89, 130, 68,
+  81, 87, 80, 96, 143, 87, 99, 83, 70, 68,
+  110, 78, 113, 81, 80, 98, 77, 81, 85, 77,
+  62, 76, 85, 74, 97, 94, 81, 62, 88, 83,
+  87, 85, 89, 64, 64, 57, 58, 102, 73, 72,
+  115, 89, 84, 79, 82, 85, 84, 119, 79, 68,
+  73, 73, 80, 89, 92, 71, 101, 98, 83, 106,
+  82, 99, 89, 80, 111, 72, 88, 72, 77, 85,
+  73, 72, 101, 77, 88, 77, 86, 93, 84, 58,
+  90, 86, 67, 88, 65, 96, 74, 93, 81, 84,
+  78, 67, 92, 80, 76, 74, 74, 80, 77, 74,
+  89, 92, 74, 83, 88, 79, 107, 79, 75, 80,
+  86, 83, 76, 92, 80, 65, 72, 82, 93, 77,
+  76, 72, 91, 79, 95, 85, 106, 90, 107, 81,
+  84, 96, 82, 82, 90, 96, 79, 76, 103, 81,
+  97, 92, 70, 86, 85, 96, 73, 80, 75, 78,
+  79, 77, 73, 74, 73, 81, 99, 92, 78, 79,
+  76, 84, 70, 71, 69, 112, 77, 92, 66, 84,
+  86, 68, 74, 98, 97, 101, 85, 67, 73, 83,
+  95, 88, 109, 94, 98, 99, 89, 107, 90, 99,
+  104, 87, 94, 82, 79, 82, 77, 93, 87, 76,
+  93, 80, 88, 83, 102, 102, 83, 56, 104, 78,
+  60, 88, 92, 100, 90, 100, 96, 96, 82, 70,
+  90, 83, 74, 75, 76, 70, 84, 75, 79, 74,
+  91, 74, 77, 89, 89, 71, 94, 86, 79, 88,
+  95, 72, 95, 98, 95, 75, 87, 86, 85, 92,
+  71, 88, 70, 77, 85, 71, 80, 89, 92, 87,
+  71, 82, 75, 81, 78, 93, 69, 85, 81, 91,
+  97, 79, 80, 92, 78, 87, 84, 95, 78, 104,
+  82, 74, 89, 88, 78, 88, 85, 87, 77, 73,
+  83, 104, 79, 90, 84, 73, 76, 90, 80, 76,
+  96, 79, 85, 78, 67, 102, 94, 96, 79, 76,
+  91, 67, 82, 78, 90, 108, 76, 69, 79, 87,
+  74, 94, 73, 97, 79, 81, 78, 101, 87, 78,
+  83, 89, 87, 90, 72, 101, 80, 81, 99, 84,
+  79, 86, 81, 90, 84, 78, 73, 92, 72, 94,
+  85, 84, 96, 88, 79, 85, 61, 77, 93, 65,
+  85, 86, 79, 76, 84, 78, 72, 91, 87, 74,
+  82, 92, 100, 76, 69, 72, 68, 88, 79, 95,
+  90, 88, 105, 60, 78, 99, 96, 88, 112, 76,
+  88, 76, 70, 68, 74, 60, 110, 84, 89, 101,
+  72, 83, 83, 86, 70, 89, 81, 95, 93, 80,
+  84, 75, 71, 78, 91, 95, 91, 74, 65, 66,
+  65, 86, 73, 71, 100, 70, 88, 88, 93, 78,
+  71, 83, 88, 72, 90, 83, 83, 72, 82, 69,
+  80, 79, 87, 111, 87, 81, 64, 92, 98, 81,
+  90, 82, 83, 80, 66, 94, 88, 77, 93, 75,
+  70, 88, 90, 84, 84, 83, 91, 84, 65, 77,
+  58, 79, 77, 79, 76, 80, 95, 84, 82, 85,
+  90, 97, 81, 81, 70, 80, 91, 71, 81, 76,
+  87, 85, 80, 73, 78, 76, 70, 77, 79, 74,
+  80, 88, 80, 78, 77, 85, 79, 80, 85, 91,
+  81, 69, 86, 83, 73, 91, 88, 83, 82, 83,
+  88, 75, 106, 61, 86, 79, 78, 91, 72, 76,
+  92, 82, 59, 88, 79, 82, 84, 91, 83, 80,
+  78, 73, 89, 82, 90, 88, 76, 70, 69, 92,
+  76, 94, 82, 79, 96, 85, 82, 86, 79, 89,
+  98, 62, 85, 75, 85, 75, 86, 88, 82, 83,
+  77, 101, 78, 92, 85, 87, 98, 78, 83, 73,
+  74, 83, 76, 81, 95, 77, 95, 92, 71, 91,
+  95, 71, 88, 75, 82, 86, 79, 96, 81, 81,
+  77, 92, 80, 69, 90, 84, 81, 83, 79, 81,
+  83, 75, 95, 87, 84, 86, 74, 84, 91, 82,
+  89, 85, 85, 73, 87, 82, 91, 96, 80, 91,
+  96, 82, 97, 96, 75, 82, 82, 74, 72, 92,
+  85, 79, 90, 97, 87, 87, 87, 74, 79, 82,
+  88, 99, 65, 89, 95, 81, 87, 85, 77, 78,
+  84, 92, 79, 91, 80, 82, 88, 100, 84, 90,
+  84, 92, 81, 99, 99, 112, 78, 82, 80, 90,
+  78, 101, 80, 72, 98, 82, 93, 83, 81, 86,
+  89, 99, 82, 75, 95, 78, 90, 81, 90, 89,
+  71, 81, 101, 88, 87, 90, 66, 87, 90, 82,
+  91, 97, 84, 84, 82, 82, 85, 89, 65, 102,
+  81, 81, 100, 86, 88, 88, 90, 89, 88, 83,
+  77, 82, 64, 87, 84, 78, 92, 92, 79, 79,
+  83, 81, 96, 68, 72, 90, 85, 78, 88, 83,
+  80, 89, 86, 76, 85, 98, 98, 82, 77, 77,
+  80, 90, 70, 91, 83, 80, 82, 78, 78, 89,
+  100, 89, 89, 73, 80, 82, 73, 87, 70, 71,
+  76, 81, 99, 90, 76, 91, 79, 89, 93, 96,
+  73, 104, 81, 82, 80, 93, 80, 83, 79, 94,
+  80, 91, 85, 99, 76, 76, 75, 75, 83, 77,
+  79, 74, 90, 85, 79, 69, 81, 88, 91, 98,
+  80, 72, 86, 77, 87, 77, 98, 99, 78, 84,
+  80, 93, 83, 88, 79, 90, 90, 86, 79, 96,
+  78, 83, 90, 76, 77, 89, 73, 106, 87, 85,
+  99, 84, 80, 70, 69, 82, 86, 79, 81, 85,
+  73, 89, 86, 83, 97, 96, 88, 89, 90, 78,
+  93, 70, 77, 83, 79, 82, 82, 79, 81, 82,
+  78, 70, 84, 86, 94, 82, 67, 82, 88, 90,
+  73, 89, 75, 77, 78, 70, 84, 87, 84, 87,
+  93, 87, 83, 83, 83, 76, 84, 66, 74, 75,
+  96, 88, 77, 79, 86, 83, 81, 90, 75, 96,
+  82, 89, 86, 91, 75, 84, 84, 86, 91, 100,
+  90, 84, 79, 89, 76, 87, 88, 72, 89, 77,
+  87, 85, 78, 71, 95, 81, 90, 90, 82, 83,
+  84, 85, 82, 77, 94, 90, 74, 83, 78, 94,
+  95, 83, 76, 81, 83, 84, 80, 90, 82, 82,
+  89, 87, 80, 89, 80, 98, 87, 84, 96, 86,
+  77, 80, 88, 82, 87, 86, 81, 82, 74, 89,
+  85, 84, 90, 87, 69, 79, 76, 88, 81, 94,
+  87, 97, 112, 83, 79, 118, 92, 68, 75, 100,
+  83, 86, 85, 74, 105, 88, 92, 75, 83, 75,
+  80, 85, 92, 89, 85, 80, 104, 72, 76, 89,
+  92, 73, 109, 83, 75, 80, 74, 76, 70, 93,
+  104, 87, 86, 68, 81, 74, 88, 102, 66, 105,
+  86, 83, 85, 80, 75, 79, 82, 67, 89, 93,
+  79, 91, 85, 73, 88, 101, 98, 95, 87, 79,
+  89, 78, 79, 82, 89, 67, 72, 85, 77, 68,
+  99, 98, 68, 82, 89, 83, 81, 80, 88, 92,
+  70, 79, 94, 91, 82, 79, 87, 93, 92, 75,
+  78, 90, 88, 89, 88, 87, 82, 94, 84, 78,
+  85, 86, 82, 100, 76, 75, 78, 88, 85, 99,
+  79, 92, 58, 80, 88, 76, 87, 73, 76, 90,
+  124, 77, 87, 117, 85, 97, 77, 80, 79, 74,
+  85, 66, 90, 81, 76, 79, 80, 71, 80, 82,
+  104, 71, 83, 88, 82, 76, 77, 88, 85, 55,
+  89, 74, 52, 88, 103, 66, 72, 73, 93, 81,
+  76, 60, 93, 84, 86, 118, 61, 75, 95, 75,
+  87, 85, 74, 92, 78, 68, 73, 114, 82, 85,
+  89, 60, 76, 81, 102, 89, 84, 77, 78, 88,
+  79, 97, 87, 62, 71, 94, 77, 57, 87, 119,
+  62, 68, 93, 80, 69, 73, 84, 96, 68, 76,
+  90, 119, 79, 89, 102, 93, 79, 83, 66, 91,
+  89, 89, 98, 68, 70, 92, 100, 63, 73, 81,
+  73, 96, 86, 70, 63, 82, 74, 84, 83, 113,
+  74, 89, 101, 83, 83, 88, 87, 99, 100, 85,
+  79, 116, 85, 106, 78, 95, 80, 88, 85, 79,
+  74, 86, 91, 75, 79, 79, 87, 86, 87, 74,
+  97, 92, 100, 85, 88, 84, 86, 71, 74, 82,
+  75, 84, 103, 78, 73, 95, 96, 79, 80, 70,
+  75, 83, 88, 88, 79, 62, 83, 77, 84, 79,
+  79, 82, 86, 69, 89, 89, 78, 87, 89, 77,
+  88, 109, 91, 100, 89, 74, 80, 91, 97, 81,
+  91, 70, 68, 84, 76, 73, 91, 98, 77, 80,
+  90, 83, 88, 81, 82, 84, 75, 83, 93, 89,
+  79, 95, 89, 93, 94, 77, 81, 86, 86, 91,
+  90, 90, 83, 98, 95, 78, 77, 90, 85, 90,
+  85, 77, 86, 87, 83, 92, 79, 95, 77, 78,
+  70, 77, 78, 82, 78, 82, 116, 86, 94, 128,
+  83, 113, 71, 78, 70, 65, 91, 73, 92, 89,
+  92, 85, 77, 73, 83, 82, 94, 80, 84, 83,
+  87, 84, 86, 76, 83, 75, 75, 72, 79, 79,
+  85, 72, 81, 98, 92, 82, 81, 58, 91, 83,
+  83, 110, 67, 80, 84, 83, 81, 85, 87, 87,
+  84, 69, 71, 92, 85, 80, 96, 62, 70, 99,
+  80, 85, 84, 75, 83, 82, 67, 90, 81, 81,
+  76, 77, 74, 84, 88, 115, 69, 98, 94, 81,
+  75, 68, 90, 90, 71, 79, 89, 107, 81, 78,
+  91, 97, 78, 60, 73, 86, 79, 78, 90, 76,
+  69, 83, 93, 77, 83, 84, 79, 95, 68, 73,
+  71, 80, 78, 87, 80, 98, 68, 74, 79, 67,
+  84, 74, 72, 73, 119, 86, 105, 132, 79, 122,
+  67, 54, 64, 50, 86, 66, 84, 79, 73, 82,
+  80, 61, 77, 75, 107, 75, 78, 92, 64, 86,
+  77, 85, 86, 73, 128, 64, 82, 107, 90, 62,
+  78, 56, 88, 81, 84, 50, 116, 90, 75, 141,
+  70, 118, 83, 86, 96, 82, 82, 87, 93, 76,
+  49, 147, 97, 75, 82, 42, 80, 104, 71, 72,
+  83, 72, 79, 82, 52, 121, 79, 84, 59, 66,
+  74, 97, 73, 147, 68, 69, 81, 67, 78, 58,
+  81, 101, 69, 68, 89, 139, 70, 86, 118, 96,
+  54, 48, 58, 95, 64, 75, 92, 63, 61, 73,
+  100, 80, 75, 84, 85, 96, 75, 68, 49, 77,
+  67, 69, 86, 115, 70, 82, 91, 80, 79, 90,
+  81, 93, 105, 87, 89, 119, 78, 75, 73, 81,
+  72, 76, 89, 81, 81, 72, 85, 79, 78, 78,
+  87, 84, 86, 85, 82, 98, 93, 81, 82, 80,
+  85, 78, 101, 72, 81, 73, 88, 81, 83, 99,
+  86, 79, 82, 62, 81, 69, 85, 95, 77, 92,
+  81, 86, 82, 88, 82, 77, 90, 67, 78, 84,
+  79, 87, 89, 71, 84, 108, 88, 91, 86, 77,
+  74, 77, 69, 80, 82, 80, 70, 76, 75, 91,
+  81, 95, 66, 95, 98, 74, 82, 70, 85, 83,
+  77, 82, 89, 96, 82, 89, 89, 96, 75, 61,
+  78, 85, 71, 83, 81, 83, 73, 86, 68, 67,
+  81, 86, 79, 90, 90, 73, 83, 85, 84, 89,
+  78, 94, 78, 75, 81, 94, 78, 105, 96, 77,
+  82, 88, 89, 86, 94, 95, 78, 89, 66, 92,
+  88, 80, 87, 90, 101, 93, 84, 90, 91, 82,
+  87, 91, 89, 83, 96, 78, 81, 89, 88, 83,
+  80, 89, 91, 77, 71, 85, 85, 105, 78, 87,
+  91, 85, 77, 79, 91, 92, 76, 89, 75, 89,
+  86, 83, 83, 78, 78, 79, 93, 83, 78, 85,
+  85, 74, 95, 83, 77, 78, 88, 79, 79, 75,
+  85, 75, 83, 71, 73, 77, 95, 90, 101, 89,
+  77, 101, 90, 92, 84, 83, 108, 77, 72, 78,
+  94, 81, 93, 87, 82, 89, 92, 71, 94, 86,
+  71, 93, 97, 90, 78, 84, 91, 86, 85, 89,
+  88, 87, 84, 79, 87, 94, 87, 84, 77, 87,
+  63, 80, 96, 103, 79, 99, 92, 79, 94, 86,
+  82, 84, 84, 78, 82, 82, 62, 102, 91, 84,
+  77, 72, 92, 104, 87, 89, 99, 86, 90, 74,
+  75, 95, 100, 73, 80, 85, 76, 84, 78, 78,
+  79, 66, 79, 74, 82, 105, 76, 84, 84, 89,
+  78, 67, 101, 96, 73, 73, 80, 78, 76, 85,
+  88, 65, 77, 70, 88, 77, 84, 87, 85, 74,
+  79, 64, 85, 76, 90, 78, 70, 81, 75, 72,
+  88, 69, 74, 90, 78, 92, 97, 75, 75, 120,
+  97, 98, 71, 82, 107, 73, 74, 70, 81, 81,
+  95, 74, 72, 89, 79, 67, 92, 82, 75, 98,
+  92, 79, 80, 92, 84, 76, 82, 81, 74, 80,
+  99, 78, 77, 99, 80, 78, 79, 96, 77, 85,
+  100, 86, 78, 99, 97, 81, 77, 90, 90, 88,
+  93, 84, 81, 88, 71, 96, 89, 88, 73, 95,
+  101, 91, 80, 92, 92, 86, 83, 78, 92, 93,
+  97, 85, 97, 84, 88, 80, 87, 86, 94, 76,
+  90, 84, 82, 100, 75, 77, 94, 85, 71, 87,
+  85, 91, 80, 82, 79, 85, 86, 80, 83, 80,
+  81, 79, 90, 82, 70, 87, 90, 83, 85, 87,
+  80, 82, 84, 81, 80, 87, 82, 68, 82, 75,
+  75, 82, 94, 93, 88, 81, 81, 95, 82, 90,
+  90, 82, 92, 81, 75, 80, 81, 86, 88, 83,
+  82, 89, 91, 73, 97, 83, 74, 88, 93, 90,
+  77, 89, 89, 96, 87, 90, 92, 88, 81, 81,
+  86, 95, 88, 84, 81, 87, 99, 84, 89, 85,
+  84, 87, 81, 97, 74, 97, 78, 83, 90, 90,
+  86, 85, 88, 78, 77, 78, 78, 86, 85, 77,
+  94, 96, 84, 92, 97, 84, 82, 72, 87, 84,
+  82, 99, 86, 63, 80, 81, 81, 79, 83, 85,
+  89, 75, 98, 75, 79, 83, 83, 83, 91, 76,
+  88, 86, 85, 82, 82, 89, 81, 82, 90, 58,
+  76, 83, 87, 85, 90, 89, 81, 79, 80, 98,
+  83, 69, 86, 78, 85, 80, 84, 91, 94, 91,
+  92, 81, 58, 87, 79, 75, 87, 80, 88, 84,
+  86, 86, 82, 81, 87, 76, 91, 90, 87, 84,
+  66, 81, 78, 91, 92, 75, 86, 89, 73, 132,
+  89, 93, 87, 84, 93, 88, 86, 88, 72, 98,
+  79, 78, 65, 85, 95, 81, 81, 89, 85, 91,
+  74, 92, 73, 100, 85, 90, 87, 86, 79, 76,
+  81, 77, 83, 88, 81, 87, 81, 86, 104, 89,
+  88, 80, 101, 80, 87, 75, 85, 86, 85, 99,
+  76, 101, 78, 77, 82, 76, 69, 89, 87, 85,
+  86, 66, 84, 86, 83, 90, 86, 82, 97, 86,
+  92, 73, 90, 86, 86, 78, 89, 50, 58, 81,
+  74, 86, 82, 91, 85, 88, 81, 91, 77, 89,
+  86, 84, 86, 84, 83, 84, 100, 86, 82, 76,
+  65, 90, 77, 78, 91, 81, 99, 84, 82, 87,
+  86, 82, 77, 77, 86, 86, 79, 86, 76, 80,
+  76, 89, 72, 77, 78, 86, 87, 129, 83, 90,
+  87, 81, 81, 86, 86, 83, 80, 88, 86, 83,
+  88, 83, 84, 70, 92, 89, 91, 91, 65, 87,
+  79, 81, 87, 83, 86, 83, 72, 83, 71, 82,
+  77, 95, 88, 85, 94, 95, 97, 82, 82, 63,
+  87, 78, 98, 87, 89, 86, 94, 102, 79, 129,
+  78, 70, 89, 71, 78, 90, 91, 87, 80, 69,
+  88, 79, 84, 94, 82, 95, 97, 87, 89, 83,
+  88, 88, 84, 78, 91, 65, 71, 87, 75, 92,
+  82, 103, 67, 84, 92, 87, 83, 86, 84, 86,
+  93, 78, 84, 81, 105, 89, 78, 91, 52, 82,
+  73, 81, 94, 84, 94, 94, 74, 92, 96, 81,
+  79, 89, 80, 74, 74, 94, 134, 87, 84, 83,
+  72, 78, 82, 90, 105, 158, 89, 89, 81, 76,
+  79, 93, 96, 76, 81, 76, 80, 96, 101, 84,
+  93, 90, 79, 75, 84, 88, 81, 95, 73, 93,
+  77, 80, 96, 85, 87, 89, 91, 77, 65, 72,
+  85, 81, 82, 84, 92, 98, 77, 94, 83, 87,
+  90, 77, 82, 87, 82, 85, 85, 62, 77, 82,
+  83, 80, 88, 85, 89, 79, 97, 83, 81, 81,
+  78, 81, 92, 72, 78, 91, 84, 83, 78, 95,
+  82, 80, 83, 67, 74, 84, 89, 86, 90, 79,
+  80, 76, 74, 100, 81, 61, 86, 76, 80, 88,
+  87, 91, 87, 85, 95, 86, 61, 81, 79, 84,
+  94, 80, 82, 84, 77, 89, 83, 83, 84, 81,
+  86, 91, 89, 83, 59, 85, 76, 92, 96, 78,
+  86, 87, 68, 111, 81, 92, 78, 87, 97, 90,
+  89, 84, 70, 95, 82, 65, 64, 85, 92, 87,
+  76, 84, 81, 88, 82, 89, 73, 96, 83, 88,
+  87, 86, 81, 80, 85, 75, 85, 84, 81, 86,
+  72, 81, 100, 89, 78, 85, 83, 81, 87, 77,
+  82, 85, 76, 91, 81, 78, 80, 78, 80, 77,
+  76, 93, 86, 79, 88, 74, 83, 84, 81, 85,
+  86, 77, 92, 93, 96, 76, 92, 85, 81, 74,
+  87, 55, 57, 81, 75, 81, 86, 87, 82, 83,
+  77, 92, 75, 79, 88, 81, 79, 87, 88, 85,
+  99, 79, 89, 76, 71, 84, 75, 72, 92, 80,
+  94, 86, 78, 86, 85, 81, 75, 79, 80, 88,
+  76, 84, 63, 79, 80, 92, 80, 83, 76, 83,
+  78, 116, 76, 89, 84, 77, 81, 88, 84, 81,
+  81, 82, 87, 71, 81, 85, 77, 70, 80, 94,
+  86, 97, 70, 88, 79, 92, 81, 80, 82, 89,
+  75, 86, 77, 75, 83, 90, 84, 85, 83, 92,
+  92, 79, 89, 77, 66, 78, 96, 82, 79, 89,
+  89, 94, 78, 119, 81, 73, 86, 72, 68, 90,
+  82, 80, 90, 71, 90, 77, 81, 84, 79, 85,
+  98, 87, 98, 81, 90, 81, 79, 79, 98, 69,
+  68, 84, 76, 87, 90, 97, 75, 79, 96, 87,
+  83, 86, 86, 84, 92, 80, 82, 81, 100, 81,
+  78, 85, 57, 84, 72, 70, 92, 83, 94, 97,
+  80, 85, 89, 79, 78, 90, 75, 84, 77, 93,
+  118, 81, 84, 84, 76, 83, 76, 95, 99, 144,
+  87, 89, 75, 75, 87, 90, 88, 81, 82, 75,
+  79, 88, 95, 84, 89, 91, 77, 78, 79, 89,
+  81, 98, 75, 107, 75, 86, 91, 87, 87, 85,
+  91, 80, 63, 68, 88, 86, 85, 91, 86, 94,
+  82, 93, 91, 79, 86, 76, 79, 87, 83, 93,
+  90, 71, 76, 85, 83, 82, 89, 80, 82, 82,
+  92, 83, 81, 81, 80, 78, 97, 75, 81, 93,
+  90, 82, 83, 94, 86, 86, 93, 73, 85, 85,
+  88, 91, 87, 86, 84, 75, 76, 89, 82, 69,
+  87, 80, 86, 83, 85, 91, 88, 94, 90, 72,
+  57, 82, 80, 91, 98, 82, 93, 80, 86, 85,
+  86, 75, 81, 79, 90, 93, 105, 85, 60, 85,
+  85, 90, 89, 76, 81, 90, 75, 115, 79, 99,
+  79, 99, 102, 90, 90, 79, 66, 99, 75, 69,
+  66, 79, 95, 88, 75, 82, 81, 87, 85, 91,
+  78, 98, 85, 86, 89, 85, 85, 80, 87, 75,
+  79, 72, 88, 85, 70, 82, 93, 90, 75, 87,
+  100, 78, 85, 81, 81, 85, 76, 89, 89, 70,
+  79, 82, 85, 76, 89, 87, 81, 80, 84, 82,
+  84, 85, 82, 85, 86, 78, 87, 93, 96, 77,
+  90, 84, 81, 81, 89, 62, 62, 80, 82, 86,
+  88, 85, 79, 79, 74, 86, 75, 76, 88, 75,
+  81, 86, 88, 84, 101, 84, 89, 69, 70, 82,
+  75, 78, 93, 85, 95, 85, 78, 86, 87, 79,
+  72, 78, 85, 94, 82, 84, 60, 84, 82, 89,
+  88, 82, 77, 83, 78, 105, 81, 92, 84, 81,
+  86, 88, 86, 77, 75, 89, 83, 78, 74, 80,
+  76, 76, 72, 95, 87, 89, 79, 90, 81, 91,
+  83, 79, 84, 89, 76, 84, 80, 77, 76, 81,
+  87, 83, 83, 85, 91, 85, 81, 82, 91, 73,
+  92, 81, 79, 83, 82, 90, 85, 101, 89, 80,
+  86, 69, 81, 85, 75, 82, 87, 76, 92, 78,
+  79, 85, 81, 83, 92, 86, 99, 82, 92, 85,
+  76, 81, 91, 68, 70, 83, 79, 86, 90, 86,
+  88, 82, 85, 84, 81, 86, 82, 75, 90, 77,
+  83, 81, 97, 89, 81, 81, 56, 83, 71, 76,
+  93, 83, 99, 92, 83, 86, 90, 78, 80, 89,
+  82, 89, 79, 86, 98, 81, 81, 84, 87, 87,
+  80, 88, 95, 130, 91, 90, 79, 75, 91, 90,
+  93, 84, 86, 80, 81, 95, 85, 82, 87, 92,
+  93, 64, 79, 102, 84, 89, 88, 67, 85, 79,
+  79, 85, 80, 97, 94, 68, 82, 73, 75, 79,
+  69, 92, 72, 91, 75, 75, 91, 78, 94, 65,
+  91, 84, 73, 92, 77, 89, 82, 90, 104, 68,
+  74, 89, 87, 78, 78, 77, 88, 94, 70, 84,
+  88, 69, 96, 86, 79, 87, 96, 97, 95, 92,
+  84, 95, 86, 86, 93, 70, 80, 84, 100, 82,
+  94, 51, 81, 91, 82, 88, 69, 78, 85, 81,
+  88, 83, 87, 81, 86, 84, 85, 81, 100, 103,
+  93, 92, 71, 87, 92, 89, 81, 107, 69, 79,
+  79, 84, 79, 66, 85, 95, 78, 75, 80, 72,
+  81, 96, 84, 93, 85, 86, 103, 70, 87, 78,
+  92, 81, 85, 77, 79, 85, 85, 98, 94, 62,
+  79, 73, 87, 91, 88, 70, 85, 82, 88, 81,
+  73, 99, 88, 63, 77, 74, 72, 83, 76, 104,
+  73, 88, 80, 72, 90, 71, 104, 55, 87, 85,
+  67, 83, 78, 103, 82, 95, 115, 51, 67, 85,
+  82, 79, 83, 78, 84, 96, 72, 77, 88, 59,
+  83, 86, 86, 87, 113, 93, 95, 94, 92, 93,
+  59, 86, 102, 67, 60, 83, 80, 75, 102, 52,
+  77, 97, 77, 83, 66, 68, 83, 82, 75, 84,
+  86, 78, 84, 80, 87, 92, 89, 109, 99, 96,
+  66, 90, 87, 83, 84, 98, 56, 73, 78, 83,
+  64, 52, 81, 92, 78, 81, 84, 68, 84, 93,
+  86, 85, 86, 87, 109, 63, 84, 78, 87, 92,
+  79, 76, 72, 87, 85, 91, 94, 70, 80, 82,
+  81, 91, 85, 73, 83, 78, 81, 83, 80, 94,
+  90, 72, 87, 73, 75, 82, 94, 93, 86, 86,
+  83, 77, 89, 71, 95, 64, 87, 84, 80, 80,
+  83, 91, 85, 92, 106, 64, 72, 87, 78, 79,
+  85, 84, 88, 92, 72, 89, 87, 68, 92, 79,
+  83, 87, 98, 89, 96, 97, 84, 88, 87, 88,
+  100, 69, 80, 92, 95, 84, 93, 53, 79, 88,
+  81, 89, 65, 79, 85, 80, 78, 96, 84, 82,
+  89, 89, 89, 89, 93, 95, 96, 86, 77, 90,
+  88, 88, 76, 95, 69, 75, 85, 82, 69, 63,
+  80, 91, 75, 78, 86, 74, 83, 88, 92, 89,
+  99, 82, 100, 75, 78, 87, 87, 79, 84, 77,
+  79, 85, 95, 87, 83, 85, 80, 83, 70, 83,
+  90, 80, 82, 82, 66, 81, 75, 86, 73, 63,
+  89, 82, 76, 87, 107, 89, 75, 79, 84, 80,
+  87, 83, 85, 83, 76, 75, 84, 99, 72, 96,
+  81, 71, 106, 68, 90, 88, 92, 72, 80, 85,
+  89, 75, 86, 81, 90, 72, 95, 91, 82, 92,
+  84, 81, 94, 88, 98, 76, 74, 76, 83, 85,
+  73, 77, 98, 80, 78, 72, 82, 82, 89, 86,
+  75, 65, 94, 84, 80, 78, 87, 82, 87, 91,
+  74, 67, 80, 96, 90, 79, 80, 84, 92, 82,
+  78, 87, 78, 82, 79, 88, 71, 70, 80, 97,
+  93, 73, 81, 73, 74, 81, 93, 84, 85, 76,
+  89, 78, 87, 75, 72, 81, 82, 82, 99, 79,
+  103, 81, 88, 86, 77, 76, 69, 85, 95, 80,
+  83, 92, 63, 87, 78, 85, 68, 60, 94, 83,
+  90, 92, 89, 84, 72, 74, 89, 76, 113, 67,
+  94, 93, 69, 78, 77, 84, 81, 108, 80, 53,
+  134, 63, 84, 90, 102, 72, 80, 82, 83, 67,
+  100, 84, 89, 72, 102, 98, 93, 89, 90, 79,
+  93, 84, 110, 87, 57, 76, 84, 88, 56, 89,
+  90, 75, 77, 88, 74, 84, 101, 81, 72, 53,
+  95, 94, 69, 81, 93, 85, 84, 94, 72, 70,
+  73, 106, 95, 86, 80, 95, 100, 81, 72, 74,
+  78, 90, 71, 89, 53, 51, 76, 101, 94, 66,
+  96, 73, 71, 81, 100, 82, 85, 75, 89, 72,
+  79, 74, 66, 82, 78, 85, 93, 71, 94, 78,
+  79, 82, 81, 104, 72, 84, 87, 85, 86, 81,
+  73, 85, 75, 88, 69, 64, 97, 77, 91, 80,
+  80, 91, 78, 78, 91, 81, 91, 72, 89, 95,
+  74, 84, 82, 85, 84, 94, 77, 71, 108, 72,
+  69, 87, 93, 74, 82, 87, 87, 74, 88, 83,
+  93, 77, 93, 77, 86, 90, 86, 83, 96, 89,
+  98, 75, 68, 76, 78, 83, 70, 78, 87, 83,
+  80, 69, 79, 87, 95, 82, 75, 71, 94, 85,
+  81, 97, 81, 81, 78, 92, 79, 79, 78, 100,
+  94, 77, 85, 86, 91, 81, 78, 82, 77, 90,
+  84, 86, 66, 70, 78, 95, 100, 74, 97, 72,
+  81, 87, 86, 83, 86, 75, 85, 75, 72, 81,
+  73, 82, 85, 80, 94, 79, 86, 89, 82, 88,
+  82, 74, 69, 90, 82, 89, 91, 77, 89, 89,
+  83, 78, 70, 81, 91, 86, 85, 86, 101, 94,
+  79, 80, 89, 89, 77, 85, 84, 90, 83, 76,
+  91, 105, 82, 80, 82, 76, 93, 78, 89, 88,
+  87, 88, 71, 89, 90, 74, 85, 89, 92, 92,
+  85, 89, 72, 86, 72, 81, 92, 84, 82, 75,
+  87, 78, 80, 83, 88, 64, 95, 90, 94, 79,
+  94, 71, 81, 91, 80, 86, 94, 86, 93, 87,
+  84, 87, 91, 90, 74, 73, 70, 81, 80, 83,
+  77, 81, 79, 86, 82, 81, 75, 92, 90, 90,
+  83, 96, 90, 90, 78, 85, 91, 87, 91, 75,
+  80, 90, 83, 70, 68, 91, 90, 77, 86, 80,
+  76, 73, 95, 94, 93, 87, 87, 99, 89, 69,
+  67, 89, 90, 83, 97, 82, 98, 88, 88, 76,
+  73, 92, 99, 83, 101, 83, 67, 89, 85, 79,
+  93, 86, 101, 84, 85, 105, 92, 74, 87, 90,
+  84, 79, 89, 70, 90, 75, 96, 94, 93, 99,
+  70, 88, 90, 75, 96, 89, 94, 106, 86, 88,
+  67, 88, 58, 83, 89, 79, 83, 91, 80, 77,
+  87, 89, 80, 59, 87, 83, 89, 85, 86, 64,
+  94, 83, 87, 82, 97, 88, 98, 91, 89, 90,
+  89, 89, 76, 77, 69, 78, 68, 89, 72, 82,
+  85, 90, 82, 74, 72, 85, 84, 93, 90, 98,
+  95, 91, 93, 86, 113, 89, 95, 78, 76, 89,
+  88, 67, 60, 90, 83, 80, 90, 77, 80, 72,
+  91, 94, 86, 87, 79, 86, 87, 97, 69, 83,
+  82, 89, 89, 75, 90, 80, 82, 83, 70, 84,
+  95, 81, 93, 85, 72, 91, 84, 80, 88, 86,
+  80, 85, 80, 95, 84, 85, 87, 87, 78, 78,
+  91, 80, 97, 78, 79, 87, 87, 85, 71, 89,
+  92, 76, 85, 85, 97, 96, 82, 77, 73, 85,
+  75, 81, 91, 86, 86, 76, 87, 81, 82, 81,
+  82, 69, 91, 87, 94, 75, 91, 76, 84, 86,
+  86, 86, 93, 83, 99, 104, 81, 88, 84, 88,
+  79, 79, 70, 86, 79, 81, 82, 79, 80, 82,
+  88, 83, 74, 84, 95, 90, 86, 95, 89, 91,
+  81, 88, 96, 77, 95, 88, 81, 89, 101, 71,
+  69, 90, 72, 79, 83, 82, 80, 70, 93, 93,
+  84, 87, 86, 88, 77, 92, 79, 93, 86, 80,
+  70, 83, 86, 74, 70, 99, 87, 79, 80, 89,
+  89, 75, 68, 81, 79, 78, 85, 85, 97, 84,
+  81, 80, 84, 93, 82, 78, 87, 83, 92, 89,
+  86, 79, 82, 84, 79, 92, 84, 80, 74, 74,
+  76, 84, 87, 79, 79, 97, 85, 91, 92, 82,
+  86, 69, 83, 86, 79, 85, 78, 69, 84, 86,
+  123, 68, 84, 79, 84, 85, 71, 72, 83, 86,
+  74, 87, 78, 72, 74, 79, 88, 83, 85, 75,
+  84, 92, 80, 79, 89, 81, 83, 88, 78, 79,
+  79, 99, 84, 79, 83, 96, 77, 80, 87, 85,
+  83, 92, 76, 87, 76, 60, 72, 85, 92, 92,
+  79, 83, 80, 82, 93, 86, 85, 76, 103, 83,
+  119, 101, 74, 106, 89, 96, 87, 84, 78, 77,
+  94, 82, 64, 98, 85, 83, 87, 81, 95, 82,
+  88, 76, 81, 89, 88, 88, 78, 103, 84, 77,
+  80, 103, 132, 90, 114, 84, 87, 68, 97, 80,
+  92, 78, 95, 92, 65, 90, 77, 66, 83, 72,
+  87, 73, 76, 74, 70, 77, 84, 86, 80, 71,
+  67, 71, 81, 90, 73, 82, 82, 83, 98, 73,
+  86, 82, 81, 81, 77, 96, 75, 96, 74, 84,
+  79, 80, 75, 88, 92, 95, 72, 66, 73, 81,
+  80, 83, 99, 88, 87, 86, 79, 79, 89, 60,
+  80, 83, 78, 89, 89, 79, 76, 81, 96, 88,
+  74, 93, 65, 61, 109, 95, 87, 88, 83, 89,
+  79, 87, 74, 84, 87, 94, 86, 76, 92, 85,
+  77, 74, 85, 93, 84, 77, 71, 89, 83, 89,
+  69, 83, 79, 76, 83, 80, 82, 75, 94, 86,
+  83, 77, 89, 83, 87, 55, 82, 79, 78, 92,
+  81, 78, 82, 79, 79, 86, 76, 79, 88, 92,
+  76, 85, 86, 69, 78, 75, 84, 93, 88, 81,
+  76, 68, 85, 91, 86, 89, 86, 77, 90, 94,
+  81, 87, 99, 70, 83, 102, 80, 70, 73, 83,
+  80, 80, 76, 78, 91, 85, 81, 92, 81, 83,
+  79, 83, 79, 89, 94, 76, 80, 79, 75, 75,
+  86, 85, 84, 81, 88, 80, 72, 73, 89, 78,
+  86, 99, 74, 86, 86, 84, 93, 85, 72, 91,
+  93, 78, 106, 85, 91, 97, 85, 81, 86, 84,
+  99, 86, 85, 78, 95, 83, 71, 87, 80, 84,
+  75, 75, 90, 82, 82, 76, 91, 69, 62, 87,
+  78, 77, 92, 88, 93, 84, 73, 79, 80, 76,
+  92, 88, 89, 60, 88, 75, 76, 87, 145, 81,
+  93, 80, 87, 77, 84, 78, 86, 85, 72, 102,
+  95, 76, 70, 88, 70, 69, 88, 80, 99, 105,
+  75, 93, 98, 82, 93, 89, 74, 75, 72, 86,
+  77, 82, 91, 78, 122, 65, 94, 82, 93, 76,
+  84, 91, 76, 73, 73, 73, 75, 65, 75, 83,
+  83, 95, 84, 94, 97, 94, 82, 78, 105, 77,
+  80, 79, 111, 80, 83, 87, 91, 76, 87, 92,
+  68, 81, 81, 91, 80, 99, 76, 79, 51, 81,
+  74, 81, 88, 92, 81, 93, 83, 81, 103, 80,
+  82, 76, 105, 88, 132, 93, 67, 84, 76, 78,
+  86, 92, 95, 61, 79, 85, 57, 82, 82, 78,
+  95, 97, 85, 67, 74, 75, 82, 73, 106, 94,
+  67, 132, 93, 84, 76, 97, 193, 76, 170, 92,
+  79, 58, 118, 73, 84, 73, 71, 94, 95, 82,
+  75, 81, 79, 53, 83, 74, 99, 60, 66, 78,
+  87, 80, 92, 94, 74, 77, 71, 94, 64, 78,
+  98, 82, 69, 66, 100, 85, 82, 79, 95, 86,
+  81, 73, 70, 60, 67, 83, 76, 100, 71, 99,
+  59, 81, 80, 96, 81, 78, 105, 79, 81, 80,
+  92, 75, 92, 59, 92, 79, 76, 99, 67, 83,
+  75, 91, 100, 100, 76, 70, 64, 74, 81, 86,
+  86, 102, 81, 101, 72, 84, 86, 81, 80, 96,
+  86, 84, 113, 86, 79, 82, 75, 77, 88, 83,
+  76, 85, 76, 92, 61, 82, 78, 76, 90, 87,
+  81, 80, 91, 86, 87, 74, 91, 88, 80, 85,
+  93, 88, 72, 79, 76, 85, 66, 80, 78, 83,
+  79, 78, 82, 90, 67, 82, 97, 88, 77, 86,
+  85, 84, 91, 83, 86, 64, 77, 97, 91, 80,
+  93, 89, 87, 86, 75, 88, 83, 69, 83, 93,
+  71, 70, 81, 84, 84, 77, 80, 58, 77, 72,
+  83, 84, 76, 103, 76, 92, 70, 87, 93, 94,
+  91, 76, 78, 76, 84, 84, 83, 76, 85, 85,
+  81, 94, 95, 74, 95, 100, 70, 85, 79, 86,
+  102, 85, 79, 79, 98, 83, 108, 79, 86, 95,
+  80, 87, 82, 85, 108, 83, 82, 67, 83, 66,
+  63, 86, 98, 83, 87, 76, 89, 74, 90, 92,
+  93, 72, 84, 82, 76, 86, 84, 90, 94, 74,
+  67, 79, 89, 95, 86, 78, 85, 80, 94, 75,
+  99, 88, 105, 68, 95, 83, 74, 83, 79, 77,
+  90, 94, 86, 96, 85, 90, 81, 91, 71, 75,
+  95, 98, 94, 77, 84, 76, 97, 82, 90, 95,
+  87, 87, 81, 84, 88, 99, 80, 80, 76, 75,
+  85, 83, 97, 83, 83, 62, 74, 83, 76, 78,
+  83, 63, 79, 78, 84, 75, 81, 101, 93, 91,
+  86, 105, 92, 90, 85, 83, 96, 86, 73, 80,
+  88, 77, 91, 77, 69, 80, 72, 83, 76, 87,
+  83, 77, 61, 85, 80, 87, 70, 81, 77, 99,
+  90, 77, 95, 91, 80, 78, 83, 83, 79, 82,
+  88, 55, 90, 75, 81, 81, 97, 86, 88, 70,
+  80, 81, 71, 90, 86, 94, 84, 58, 69, 85,
+  97, 91, 96, 80, 78, 96, 94, 81, 98, 72,
+  102, 51, 107, 82, 76, 78, 84, 79, 86, 78,
+  81, 96, 95, 65, 85, 98, 75, 56, 97, 89,
+  94, 66, 82, 76, 98, 77, 93, 96, 98, 101,
+  61, 89, 83, 86, 74, 93, 35, 72, 86, 86,
+  92, 89, 85, 59, 88, 74, 74, 78, 84, 68,
+  71, 83, 67, 69, 83, 106, 89, 90, 89, 100,
+  80, 81, 83, 81, 91, 86, 71, 74, 86, 78,
+  89, 86, 69, 84, 69, 85, 80, 86, 80, 69,
+  82, 94, 51, 92, 70, 88, 73, 93, 90, 73,
+  88, 94, 74, 87, 79, 86, 96, 83, 89, 75,
+  83, 76, 84, 80, 81, 91, 83, 77, 85, 84,
+  78, 84, 86, 92, 86, 73, 90, 84, 99, 88,
+  83, 79, 85, 87, 92, 78, 91, 72, 96, 88,
+  75, 84, 89, 90, 74, 77, 91, 94, 87, 89,
+  83, 68, 80, 88, 84, 82, 92, 98, 89, 73,
+  85, 84, 95, 80, 88, 90, 83, 86, 83, 85,
+  86, 92, 75, 80, 67, 80, 79, 83, 93, 80,
+  81, 88, 68, 87, 84, 79, 88, 82, 77, 85,
+  75, 76, 85, 104, 88, 79, 83, 98, 83, 88,
+  90, 77, 83, 92, 73, 78, 87, 78, 101, 83,
+  77, 79, 76, 81, 80, 83, 87, 87, 74, 90,
+  79, 81, 67, 80, 73, 97, 86, 76, 94, 94,
+  82, 73, 93, 74, 96, 83, 91, 92, 87, 81,
+  90, 92, 73, 79, 79, 96, 82, 98, 78, 85,
+  77, 83, 83, 97, 91, 89, 90, 81, 108, 76,
+  88, 71, 71, 95, 69, 74, 77, 96, 52, 81,
+  72, 86, 87, 95, 84, 83, 95, 80, 79, 75,
+  92, 84, 72, 79, 94, 92, 86, 77, 85, 75,
+  96, 72, 87, 63, 86, 92, 74, 86, 77, 83,
+  86, 94, 81, 80, 73, 109, 84, 92, 77, 114,
+  73, 77, 79, 76, 72, 79, 87, 80, 85, 85,
+  89, 79, 90, 76, 93, 70, 78, 67, 95, 87,
+  78, 73, 81, 53, 87, 76, 97, 98, 89, 94,
+  88, 73, 76, 79, 73, 75, 77, 86, 87, 100,
+  68, 77, 91, 85, 91, 75, 94, 92, 67, 84,
+  111, 77, 76, 87, 86, 74, 86, 75, 78, 86,
+  58, 94, 84, 91, 88, 77, 83, 82, 69, 78,
+  86, 108, 75, 87, 103, 65, 101, 73, 103, 86,
+  68, 105, 86, 76, 81, 79, 59, 50, 81, 71,
+  83, 98, 74, 92, 117, 76, 85, 102, 63, 93,
+  94, 70, 85, 81, 80, 86, 69, 83, 113, 64,
+  117, 55, 95, 102, 83, 88, 81, 127, 85, 107,
+  77, 83, 67, 96, 64, 83, 82, 88, 81, 69,
+  85, 76, 97, 86, 75, 80, 86, 93, 66, 74,
+  88, 91, 108, 61, 77, 57, 84, 123, 78, 92,
+  101, 108, 71, 81, 83, 110, 127, 86, 79, 68,
+  66, 89, 53, 89, 80, 103, 75, 110, 65, 61,
+  88, 74, 78, 66, 86, 84, 48, 93, 88, 92,
+  81, 85, 86, 77, 87, 84, 94, 90, 76, 84,
+  78, 61, 84, 94, 77, 84, 81, 82, 81, 93,
+  90, 85, 83, 85, 99, 81, 88, 83, 79, 98,
+  62, 87, 71, 79, 74, 84, 77, 83, 83, 88,
+  81, 88, 94, 83, 84, 104, 91, 80, 82, 74,
+  90, 97, 86, 87, 78, 79, 90, 82, 90, 60,
+  78, 93, 79, 86, 55, 92, 88, 75, 99, 80,
+  78, 87, 78, 89, 81, 76, 89, 81, 83, 83,
+  63, 84, 84, 71, 83, 82, 86, 75, 89, 99,
+  94, 77, 88, 70, 93, 85, 88, 72, 73, 92,
+  83, 81, 96, 82, 86, 90, 86, 69, 77, 73,
+  75, 96, 68, 81, 88, 97, 69, 72, 81, 86,
+  99, 79, 88, 85, 71, 79, 90, 78, 85, 89,
+  87, 93, 92, 82, 81, 84, 79, 76, 87, 78,
+  81, 87, 73, 77, 70, 87, 76, 95, 81, 82,
+  98, 90, 97, 71, 97, 65, 78, 92, 75, 84,
+  115, 102, 55, 82, 86, 85, 93, 84, 90, 93,
+  100, 90, 96, 81, 93, 76, 75, 75, 86, 86,
+  90, 97, 79, 77, 79, 72, 81, 75, 87, 87,
+  69, 78, 56, 75, 80, 68, 109, 73, 84, 90,
+  92, 81, 76, 116, 79, 81, 73, 80, 79, 88,
+  89, 81, 92, 86, 82, 87, 83, 87, 95, 84,
+  79, 71, 87, 82, 70, 74, 69, 57, 88, 83,
+  100, 94, 79, 85, 91, 63, 85, 80, 69, 83,
+  68, 80, 66, 99, 75, 71, 84, 73, 92, 75,
+  85, 79, 69, 85, 102, 73, 78, 92, 76, 72,
+  104, 80, 67, 83, 81, 86, 86, 87, 79, 79,
+  67, 76, 60, 81, 85, 105, 74, 83, 97, 69,
+  97, 64, 93, 122, 72, 95, 88, 76, 135, 82,
+  83, 78, 83, 59, 128, 98, 86, 98, 126, 87,
+  76, 105, 75, 67, 90, 61, 76, 71, 89, 82,
+  68, 84, 99, 59, 76, 73, 107, 103, 81, 84,
+  55, 93, 72, 71, 85, 91, 99, 80, 75, 78,
+  81, 83, 72, 79, 76, 82, 96, 94, 75, 86,
+  83, 77, 67, 95, 76, 89, 127, 85, 67, 67,
+  74, 112, 82, 86, 80, 65, 76, 86, 86, 100,
+  83, 84, 84, 53, 98, 77, 53, 85, 83, 79,
+  74, 115, 72, 74, 92, 55, 79, 76, 79, 65,
+  59, 89, 82, 82, 96, 89, 84, 81, 91, 81,
+  84, 84, 79, 83, 83, 87, 82, 83, 72, 75,
+  73, 88, 74, 90, 97, 81, 76, 90, 90, 72,
+  89, 107, 86, 95, 76, 83, 83, 80, 77, 81,
+  76, 82, 91, 84, 75, 97, 90, 92, 84, 115,
+  97, 75, 76, 83, 85, 90, 86, 70, 78, 82,
+  76, 78, 84, 61, 84, 79, 73, 78, 63, 75,
+  87, 61, 85, 78, 81, 82, 81, 85, 74, 67,
+  72, 83, 77, 85, 84, 96, 91, 82, 83, 82,
+  84, 84, 80, 71, 96, 86, 79, 72, 87, 81,
+  103, 73, 67, 65, 85, 83, 100, 87, 78, 83,
+  83, 65, 110, 76, 74, 96, 72, 71, 103, 94,
+  71, 73, 85, 76, 100, 71, 84, 74, 75, 82,
+  67, 73, 75, 92, 86, 82, 84, 78, 93, 85,
+  91, 76, 90, 78, 86, 83, 70, 82, 96, 90,
+  82, 81, 95, 95, 80, 94, 80, 77, 83, 74,
+  88, 89, 83, 82, 89, 86, 79, 91, 83, 83,
+  83, 73, 61, 92, 83, 82, 85, 89, 89, 81,
+  82, 83, 82, 108, 86, 82, 93, 89, 75, 89,
+  85, 83, 85, 83, 85, 85, 85, 76, 80, 71,
+  90, 72, 91, 77, 85, 81, 86, 82, 87, 78,
+  79, 94, 78, 88, 95, 79, 93, 79, 85, 95,
+  75, 90, 80, 97, 86, 78, 82, 73, 77, 80,
+  71, 91, 98, 79, 96, 89, 78, 83, 80, 80,
+  89, 77, 86, 93, 78, 81, 63, 85, 91, 75,
+  85, 95, 81, 88, 74, 77, 84, 104, 76, 76,
+  77, 98, 87, 63, 85, 83, 91, 79, 101, 72,
+  91, 86, 83, 83, 70, 91, 102, 97, 73, 77,
+  77, 87, 81, 92, 88, 76, 78, 96, 83, 90,
+  83, 74, 94, 77, 86, 91, 86, 78, 103, 70,
+  72, 85, 83, 83, 72, 67, 91, 79, 82, 84,
+  87, 105, 80, 91, 90, 92, 69, 82, 80, 76,
+  99, 88, 80, 80, 89, 77, 74, 67, 75, 72,
+  96, 74, 79, 72, 82, 68, 91, 65, 80, 99,
+  81, 84, 100, 83, 91, 76, 92, 93, 73, 93,
+  88, 100, 83, 71, 90, 79, 84, 77, 66, 85,
+  99, 79, 106, 95, 64, 87, 90, 72, 105, 68,
+  83, 88, 98, 94, 68, 81, 80, 81, 85, 94,
+  94, 80, 75, 81, 84, 101, 67, 78, 84, 89,
+  80, 88, 82, 79, 96, 84, 92, 74, 89, 86,
+  88, 81, 72, 82, 100, 93, 64, 83, 83, 93,
+  79, 91, 82, 75, 80, 93, 90, 95, 88, 75,
+  81, 82, 86, 86, 79, 80, 85, 73, 76, 90,
+  79, 83, 74, 79, 90, 80, 83, 92, 83, 108,
+  85, 72, 93, 90, 69, 94, 85, 80, 84, 81,
+  83, 89, 87, 73, 82, 76, 63, 68, 90, 70,
+  86, 82, 87, 81, 78, 74, 81, 86, 88, 80,
+  98, 79, 92, 79, 84, 86, 71, 81, 80, 98,
+  79, 77, 80, 76, 94, 81, 77, 77, 99, 80,
+  101, 95, 82, 82, 79, 85, 101, 82, 86, 93,
+  82, 85, 85, 84, 90, 75, 98, 95, 74, 87,
+  76, 79, 85, 102, 78, 78, 75, 79, 78, 72,
+  78, 92, 92, 97, 93, 83, 89, 84, 75, 83,
+  105, 95, 95, 90, 99, 85, 79, 86, 83, 80,
+  89, 103, 95, 86, 99, 71, 76, 83, 84, 84,
+  83, 76, 92, 78, 86, 73, 88, 75, 84, 89,
+  84, 93, 82, 56, 96, 89, 93, 55, 74, 87,
+  89, 81, 79, 82, 94, 79, 87, 77, 70, 67,
+  80, 88, 92, 81, 78, 95, 88, 93, 80, 90,
+  76, 84, 84, 68, 90, 76, 74, 90, 95, 78,
+  93, 85, 76, 92, 90, 78, 60, 71, 93, 83,
+  89, 79, 88, 91, 81, 69, 67, 73, 70, 74,
+  85, 84, 99, 98, 90, 83, 91, 81, 76, 96,
+  90, 90, 82, 79, 109, 106, 60, 70, 82, 94,
+  90, 89, 71, 80, 76, 70, 78, 67, 66, 92,
+  90, 88, 92, 96, 96, 87, 77, 80, 122, 93,
+  81, 92, 90, 65, 68, 94, 78, 73, 96, 100,
+  97, 77, 107, 67, 61, 88, 80, 77, 87, 74,
+  91, 70, 82, 73, 97, 65, 96, 80, 81, 77,
+  80, 48, 99, 83, 79, 48, 69, 87, 98, 79,
+  75, 93, 94, 63, 87, 89, 52, 65, 77, 84,
+  87, 78, 70, 89, 82, 102, 84, 89, 82, 84,
+  89, 68, 80, 81, 64, 95, 90, 84, 80, 80,
+  69, 96, 91, 90, 66, 75, 92, 83, 90, 81,
+  76, 81, 80, 81, 66, 77, 70, 75, 89, 91,
+  106, 122, 89, 83, 91, 84, 81, 86, 70, 86,
+  76, 73, 98, 126, 40, 78, 68, 95, 85, 90,
+  72, 84, 88, 79, 78, 84, 82, 87, 91, 94,
+  83, 81, 81, 84, 81, 86, 101, 92, 94, 81,
+  90, 83, 75, 89, 85, 82, 89, 94, 90, 77,
+  92, 87, 78, 80, 89, 90, 84, 75, 87, 77,
+  91, 76, 99, 79, 92, 85, 85, 84, 84, 68,
+  96, 97, 92, 63, 87, 78, 84, 82, 80, 76,
+  92, 85, 85, 73, 77, 72, 79, 85, 91, 77,
+  93, 96, 87, 95, 82, 93, 76, 85, 95, 68,
+  100, 75, 84, 94, 94, 81, 82, 80, 82, 95,
+  87, 84, 63, 73, 90, 85, 93, 84, 79, 98,
+  86, 87, 66, 73, 71, 72, 78, 92, 99, 92,
+  87, 80, 90, 99, 77, 89, 69, 90, 82, 83,
+  93, 94, 72, 69, 80, 92, 88, 90, 84, 81,
+  77, 82, 86, 73, 84, 110, 100, 94, 88, 95,
+  97, 80, 79, 70, 120, 96, 89, 84, 90, 82,
+  81, 94, 82, 79, 90, 99, 97, 90, 95, 70,
+  65, 84, 100, 83, 87, 75, 86, 84, 83, 68,
+  84, 66, 84, 97, 103, 91, 75, 48, 100, 84,
+  93, 55, 70, 86, 85, 79, 82, 83, 85, 86,
+  75, 79, 64, 66, 79, 88, 89, 67, 84, 85,
+  82, 80, 86, 68, 68, 91, 71, 61, 82, 86,
+  74, 86, 85, 91, 95, 75, 89, 82, 93, 78,
+  58, 64, 89, 78, 77, 75, 110, 76, 82, 82,
+  72, 73, 66, 73, 94, 78, 101, 121, 88, 80,
+  91, 74, 84, 79, 88, 87, 73, 56, 94, 110,
+  46, 81, 75, 83, 93, 94, 91, 75, 85, 73,
+  88, 71, 72, 115, 91, 80, 81, 110, 114, 91,
+  75, 61, 143, 92, 78, 91, 81, 78, 73, 104,
+  70, 69, 98, 91, 98, 94, 109, 68, 37, 92,
+  93, 76, 98, 80, 96, 77, 78, 69, 88, 52,
+  91, 82, 110, 69, 75, 28, 106, 76, 74, 44,
+  71, 95, 103, 75, 71, 94, 93, 71, 71, 96,
+  51, 63, 76, 83, 77, 78, 76, 78, 71, 76,
+  89, 60, 74, 86, 70, 56, 64, 89, 60, 92,
+  80, 108, 78, 72, 77, 88, 91, 82, 55, 62,
+  92, 79, 70, 77, 86, 62, 81, 80, 68, 79,
+  61, 74, 94, 85, 107, 156, 83, 83, 99, 76,
+  86, 71, 74, 83, 68, 49, 91, 141, 0, 91,
+  59, 79, 88, 97, 73, 89, 96, 84, 82, 89,
+  87, 97, 95, 93, 85, 85, 91, 86, 83, 77,
+  104, 93, 86, 82, 88, 88, 76, 98, 89, 80,
+  87, 91, 93, 97, 84, 83, 69, 80, 94, 88,
+  88, 75, 92, 80, 87, 71, 88, 71, 87, 91,
+  104, 81, 79, 61, 98, 87, 98, 63, 79, 87,
+  86, 83, 78, 75, 91, 90, 71, 76, 67, 73,
+  88, 85, 82, 72, 79, 89, 84, 79, 89, 74,
+  70, 84, 72, 65, 96, 82, 84, 101, 83, 94,
+  76, 75, 90, 90, 89, 81, 58, 67, 78, 81,
+  80, 82, 82, 85, 86, 72, 68, 73, 66, 73,
+  91, 85, 100, 107, 76, 79, 89, 98, 79, 81,
+  78, 87, 76, 65, 84, 94, 60, 80, 79, 80,
+  87, 90, 69, 79, 81, 94, 79, 75, 86, 91,
+  101, 102, 86, 86, 87, 79, 86, 82, 93, 78,
+  89, 83, 88, 80, 75, 73, 86, 87, 78, 94,
+  84, 79, 77, 82, 91, 78, 99, 82, 85, 88,
+  77, 99, 98, 70, 95, 86, 86, 103, 80, 108,
+  75, 88, 85, 93, 91, 70, 73, 82, 73, 75,
+  87, 78, 84, 101, 83, 75, 88, 69, 84, 94,
+  84, 79, 95, 82, 98, 86, 80, 76, 75, 83,
+  87, 72, 93, 83, 90, 77, 90, 94, 92, 76,
+  80, 82, 94, 97, 56, 69, 85, 92, 83, 76,
+  104, 100, 82, 96, 86, 67, 79, 94, 83, 78,
+  79, 66, 80, 85, 90, 79, 82, 99, 83, 86,
+  74, 75, 88, 82, 74, 75, 109, 80, 97, 87,
+  79, 81, 88, 92, 82, 70, 86, 89, 106, 97,
+  78, 94, 102, 84, 87, 78, 99, 79, 90, 80,
+  84, 81, 73, 79, 85, 84, 86, 92, 86, 88,
+  79, 80, 89, 81, 90, 77, 92, 84, 85, 107,
+  89, 63, 84, 77, 90, 95, 100, 86, 70, 89,
+  89, 89, 93, 62, 71, 79, 79, 70, 84, 80,
+  88, 86, 83, 78, 69, 66, 90, 89, 74, 86,
+  80, 76, 90, 87, 80, 72, 77, 85, 87, 70,
+  88, 83, 97, 91, 87, 105, 84, 71, 85, 85,
+  104, 89, 56, 65, 76, 91, 74, 74, 90, 85,
+  84, 89, 79, 68, 65, 90, 90, 81, 76, 89,
+  75, 82, 88, 80, 83, 94, 80, 80, 75, 73,
+  88, 92, 59, 76, 106, 75, 89, 96, 65, 88,
+  96, 91, 77, 85, 87, 85, 97, 103, 85, 78,
+  85, 82, 89, 92, 84, 83, 85, 83, 96, 86,
+  83, 79, 94, 85, 74, 89, 84, 94, 71, 86,
+  94, 74, 90, 87, 88, 87, 85, 97, 99, 70,
+  82, 86, 88, 96, 81, 88, 78, 95, 82, 88,
+  93, 73, 74, 78, 75, 80, 85, 74, 88, 99,
+  78, 73, 85, 74, 96, 90, 79, 91, 82, 82,
+  97, 86, 86, 74, 78, 83, 78, 71, 101, 82,
+  98, 106, 88, 100, 80, 78, 81, 87, 91, 84,
+  58, 71, 73, 93, 82, 80, 87, 102, 83, 75,
+  79, 68, 81, 94, 87, 85, 76, 64, 76, 86,
+  91, 93, 85, 102, 91, 88, 76, 84, 80, 79,
+  83, 73, 109, 81, 93, 86, 78, 83, 76, 81,
+  84, 86, 69, 80, 84, 96, 84, 98, 85, 89,
+  82, 83, 82, 97, 70, 73, 88, 72, 85, 88,
+  85, 80, 93, 72, 97, 87, 98, 68, 65, 83,
+  84, 81, 84, 83, 89, 86, 80, 81, 77, 84,
+  96, 74, 82, 100, 76, 100, 84, 77, 87, 92,
+  91, 89, 77, 71, 86, 84, 88, 83, 73, 84,
+  84, 79, 93, 79, 77, 98, 79, 93, 88, 77,
+  88, 82, 74, 89, 84, 86, 79, 83, 101, 88,
+  87, 99, 94, 86, 89, 78, 88, 80, 68, 97,
+  86, 72, 78, 87, 84, 86, 92, 93, 83, 86,
+  82, 75, 93, 81, 78, 50, 92, 72, 86, 90,
+  78, 87, 84, 76, 88, 91, 90, 72, 74, 69,
+  84, 103, 76, 83, 82, 84, 76, 80, 87, 75,
+  68, 78, 88, 94, 83, 92, 92, 88, 88, 75,
+  85, 92, 67, 71, 84, 67, 77, 90, 94, 83,
+  91, 65, 86, 82, 95, 64, 61, 78, 86, 76,
+  85, 83, 89, 84, 83, 82, 85, 83, 100, 69,
+  87, 98, 77, 97, 83, 81, 86, 87, 92, 82,
+  76, 72, 82, 87, 89, 84, 72, 89, 75, 82,
+  94, 87, 80, 92, 77, 96, 86, 69, 92, 74,
+  71, 88, 85, 90, 80, 81, 104, 87, 92, 102,
+  91, 81, 87, 77, 86, 74, 64, 95, 81, 72,
+  76, 86, 84, 89, 85, 97, 81, 84, 81, 77,
+  96, 81, 75, 38, 95, 70, 86, 93, 76, 87,
+  79, 74, 88, 89, 89, 64, 64, 68, 87, 105,
+  79, 84, 81, 85, 82, 74, 85, 82, 78, 81,
+  80, 93, 86, 95, 79, 84, 84, 83, 85, 94,
+  72, 78, 71, 72, 102, 90, 93, 82, 95, 75,
+  78, 82, 95, 61, 65, 73, 89, 81, 81, 77,
+  85, 81, 82, 78, 92, 82, 90, 75, 80, 89,
+  81, 92, 83, 85, 90, 86, 88, 79, 78, 77,
+  92, 87, 84, 80, 75, 85, 91, 80, 101, 81,
+  72, 89, 82, 91, 89, 82, 86, 83, 78, 99,
+  94, 84, 80, 80, 92, 84, 87, 89, 89, 87,
+  85, 77, 83, 88, 76, 91, 83, 76, 76, 90,
+  71, 83, 87, 97, 82, 87, 85, 73, 97, 83,
+  81, 59, 95, 76, 83, 97, 84, 83, 82, 74,
+  88, 92, 88, 75, 73, 69, 85, 103, 74, 83,
+  70, 85, 77, 79, 87, 90, 84, 78, 82, 85,
+  91, 95, 86, 88, 96, 82, 88, 83, 55, 74,
+  89, 67, 85, 93, 84, 82, 92, 60, 105, 86,
+  102, 60, 65, 74, 87, 73, 82, 75, 87, 97,
+  97, 79, 73, 88, 86, 76, 75, 90, 80, 99,
+  85, 81, 89, 76, 91, 93, 79, 77, 86, 88,
+  89, 85, 78, 84, 83, 77, 98, 76, 78, 88,
+  85, 85, 89, 74, 84, 75, 76, 88, 85, 85,
+  83, 78, 99, 81, 86, 89, 95, 89, 101, 85,
+  79, 107, 79, 90, 77, 75, 68, 86, 80, 76,
+  83, 86, 75, 88, 74, 58, 98, 86, 78, 60,
+  93, 79, 79, 89, 78, 73, 82, 67, 88, 91,
+  87, 72, 59, 79, 80, 103, 70, 83, 71, 87,
+  82, 77, 87, 73, 83, 81, 85, 82, 95, 92,
+  92, 89, 97, 77, 93, 75, 53, 69, 85, 62,
+  81, 97, 93, 81, 90, 52, 103, 88, 100, 55,
+  65, 73, 88, 71, 81, 76, 87, 93, 99, 70,
+  80, 85, 84, 75, 76, 90, 84, 96, 85, 85,
+  90, 65, 86, 80, 80, 73, 78, 92, 89, 89,
+  80, 87, 66, 73, 105, 82, 80, 77, 74, 82,
+  93, 70, 87, 63, 76, 91, 84, 89, 80, 75,
+  101, 85, 86, 96, 88, 87, 97, 84, 81, 99,
+  65, 86, 69, 76, 64, 88, 76, 82, 70, 88,
+  72, 88, 75, 59, 98, 86, 72, 55, 96, 76,
+  82, 95, 80, 77, 81, 59, 87, 92, 83, 70,
+  53, 83, 81, 105, 74, 84, 72, 92, 89, 73,
+  86, 81, 87, 82, 80, 89, 91, 93, 82, 85,
+  92, 79, 90, 79, 60, 75, 76, 72, 107, 92,
+  94, 80, 91, 65, 100, 82, 101, 55, 63, 71,
+  85, 77, 79, 72, 85, 95, 104, 76, 85, 89,
+  75, 81, 75, 87, 83, 94, 83, 88, 92, 71,
+  87, 78, 82, 82, 90, 93, 88, 81, 84, 83,
+  83, 74, 106, 76, 76, 86, 82, 82, 89, 89,
+  85, 79, 79, 97, 89, 84, 80, 77, 89, 83,
+  84, 81, 81, 94, 99, 89, 77, 117, 86, 84,
+  75, 80, 65, 89, 68, 75, 82, 83, 74, 89,
+  80, 61, 97, 87, 80, 74, 91, 83, 78, 102,
+  90, 68, 83, 71, 93, 94, 80, 80, 67, 79,
+  83, 99, 71, 86, 80, 83, 85, 72, 94, 99,
+  80, 74, 71, 84, 84, 93, 80, 91, 89, 98,
+  88, 84, 66, 80, 89, 84, 110, 87, 84, 83,
+  84, 73, 85, 83, 103, 86, 69, 74, 85, 73,
+  86, 67, 78, 106, 96, 62, 76, 89, 70, 81,
+  80, 80, 79, 104, 75, 84, 95, 73, 104, 85,
+  81, 85, 89, 88, 89, 75, 97, 75, 75, 81,
+  99, 78, 78, 90, 92, 92, 77, 91, 80, 84,
+  89, 84, 76, 80, 91, 79, 80, 91, 83, 76,
+  91, 91, 92, 85, 78, 125, 90, 84, 79, 78,
+  72, 83, 75, 68, 79, 86, 78, 90, 92, 63,
+  94, 86, 87, 85, 85, 76, 75, 86, 82, 68,
+  81, 80, 92, 92, 80, 83, 79, 79, 90, 91,
+  72, 84, 79, 84, 89, 66, 86, 90, 82, 76,
+  77, 86, 86, 92, 78, 90, 88, 97, 87, 74,
+  64, 78, 90, 84, 118, 87, 82, 81, 78, 67,
+  84, 83, 102, 82, 73, 73, 81, 77, 90, 71,
+  75, 105, 102, 58, 83, 87, 69, 79, 77, 81,
+  82, 106, 78, 88, 99, 67, 100, 88, 84, 83,
+  88, 94, 89, 74, 102, 82, 71, 75, 98, 86,
+  72, 91, 86, 93, 80, 103, 78, 88, 94, 89,
+  76, 83, 90, 74, 72, 85, 80, 73, 85, 99,
+  91, 80, 81, 135, 93, 81, 74, 80, 68, 84,
+  74, 76, 82, 92, 74, 89, 102, 65, 89, 89,
+  85, 92, 83, 73, 71, 87, 88, 66, 86, 86,
+  101, 99, 75, 86, 75, 81, 95, 92, 73, 83,
+  89, 85, 82, 70, 88, 97, 88, 78, 75, 90,
+  85, 92, 76, 90, 87, 98, 87, 79, 72, 81,
+  88, 92, 121, 88, 82, 85, 86, 74, 93, 78,
+  98, 92, 72, 74, 81, 85, 90, 70, 82, 104,
+  102, 64, 88, 92, 69, 87, 79, 82, 81, 101,
+  82, 86, 98, 73, 106, 88, 84, 96, 93, 92,
+  87, 75, 102, 76, 72, 78, 92, 81, 74, 82,
+  90, 91, 79, 109, 80, 95, 89, 94, 80, 81,
+  91, 79, 69, 75, 81, 69, 81, 96, 92, 86,
+  76, 135, 102, 77, 77, 85, 70, 90, 77, 71,
+  80, 93, 80, 88, 101, 65, 87, 88, 94, 100,
+  87, 78, 71, 90, 85, 58, 84, 90, 98, 99,
+  83, 87, 87, 86, 94, 84, 72, 90, 86, 77,
+  80, 67, 87, 93, 91, 77, 67, 60, 93, 85,
+  86, 89, 74, 82, 87, 99, 84, 89, 88, 103,
+  86, 76, 89, 88, 79, 115, 92, 85, 84, 83,
+  81, 88, 81, 73, 86, 83, 79, 88, 76, 79,
+  90, 86, 82, 76, 88, 79, 80, 87, 87, 83,
+  61, 75, 87, 83, 73, 93, 81, 83, 88, 85,
+  80, 78, 90, 77, 75, 89, 89, 83, 72, 81,
+  89, 84, 84, 74, 74, 70, 85, 90, 81, 78,
+  76, 91, 94, 71, 79, 89, 85, 88, 83, 84,
+  71, 88, 80, 93, 77, 80, 90, 99, 80, 84,
+  84, 79, 88, 87, 79, 93, 86, 100, 87, 85,
+  105, 82, 95, 76, 83, 155, 93, 87, 96, 95,
+  81, 93, 97, 78, 88, 86, 84, 84, 73, 71,
+  86, 75, 94, 76, 72, 54, 99, 84, 89, 79,
+  74, 79, 91, 91, 72, 90, 92, 95, 82, 94,
+  92, 86, 82, 109, 89, 85, 85, 85, 86, 81,
+  82, 73, 82, 89, 81, 83, 77, 79, 90, 83,
+  84, 79, 95, 70, 83, 83, 92, 78, 61, 78,
+  89, 82, 75, 90, 82, 81, 90, 84, 81, 77,
+  75, 81, 78, 88, 94, 80, 72, 79, 82, 80,
+  92, 70, 71, 77, 83, 91, 82, 85, 79, 76,
+  82, 71, 74, 85, 89, 93, 84, 87, 63, 89,
+  74, 103, 77, 77, 93, 101, 78, 83, 72, 81,
+  77, 88, 76, 92, 94, 108, 88, 80, 109, 75,
+  93, 75, 71, 160, 80, 85, 92, 93, 77, 91,
+  91, 78, 71, 88, 87, 94, 79, 72, 84, 79,
+  89, 76, 71, 68, 88, 84, 81, 83, 77, 85,
+  89, 93, 85, 90, 87, 97, 93, 78, 88, 92,
+  85, 113, 93, 80, 82, 83, 82, 77, 87, 91,
+  86, 89, 85, 88, 78, 83, 87, 87, 85, 79,
+  86, 78, 80, 86, 92, 81, 62, 78, 87, 90,
+  78, 92, 83, 81, 80, 82, 79, 68, 101, 72,
+  79, 88, 84, 84, 97, 78, 88, 83, 88, 77,
+  75, 86, 85, 91, 86, 75, 73, 82, 93, 74,
+  82, 85, 86, 89, 81, 87, 69, 86, 83, 95,
+  78, 82, 85, 97, 82, 84, 85, 78, 85, 92,
+  76, 93, 84, 93, 89, 83, 99, 80, 89, 73,
+  74, 135, 88, 88, 83, 94, 85, 91, 91, 72,
+  90, 87, 83, 79, 74, 79, 79, 90, 91, 82,
+  73, 62, 95, 85, 83, 88, 78, 77, 85, 87,
+  68, 89, 91, 92, 89, 79, 90, 83, 79, 109,
+  86, 81, 81, 84, 85, 87, 77, 75, 87, 82,
+  84, 85, 87, 79, 86, 80, 81, 78, 93, 84,
+  83, 90, 92, 79, 65, 72, 87, 80, 78, 86,
+  84, 82, 95, 89, 86, 79, 78, 79, 82, 86,
+  87, 71, 72, 81, 82, 88, 85, 69, 80, 76,
+  80, 94, 81, 80, 78, 87, 79, 75, 81, 85,
+  80, 85, 84, 84, 75, 88, 79, 92, 74, 76,
+  85, 99, 84, 87, 70, 80, 68, 78, 86, 89,
+  90, 97, 83, 83, 116, 81, 82, 79, 78, 156,
+  78, 87, 99, 95, 82, 92, 97, 76, 73, 86,
+  85, 83, 72, 85, 74, 77, 94, 81, 81, 60,
+  100, 82, 89, 83, 78, 72, 91, 86, 58, 87,
+  93, 92, 82, 93, 95, 77, 76, 100, 81, 83,
+  84, 93, 90, 84, 79, 76, 88, 80, 85, 77,
+  87, 84, 90, 79, 85, 83, 98, 78, 85, 88,
+  95, 81, 64, 70, 89, 78, 81, 82, 88, 76,
+  100, 88, 87, 78, 66, 88, 86, 87, 95, 69,
+  68, 81, 78, 83, 89, 63, 80, 86, 75, 96,
+  79, 85, 81, 80, 73, 80, 77, 84, 80, 91,
+  84, 83, 68, 89, 77, 98, 74, 75, 91, 99,
+  86, 81, 62, 81, 62, 80, 92, 89, 89, 101,
+  84, 82, 120, 79, 81, 81, 70, 162, 67, 85,
+  89, 94, 75, 87, 84, 71, 59, 86, 88, 96,
+  80, 82, 82, 84, 88, 79, 76, 68, 89, 84,
+  81, 82, 75, 81, 87, 85, 72, 82, 83, 91,
+  95, 81, 90, 87, 82, 111, 85, 78, 84, 87,
+  84, 80, 79, 85, 86, 93, 84, 83, 87, 82,
+  86, 86, 84, 81, 91, 83, 84, 86, 91, 84,
+  62, 75, 85, 84, 80, 87, 86, 78, 90, 85,
+  81, 72, 79, 76, 84, 85, 87, 75, 83, 79,
+  80, 87, 88, 76, 78, 90, 83, 93, 86, 74,
+  75, 88, 83, 80, 78, 84, 79, 87, 81, 86,
+  72, 88, 80, 85, 77, 78, 87, 96, 84, 75,
+  71, 78, 68, 82, 83, 90, 94, 90, 87, 82,
+  109, 82, 82, 80, 78, 136, 80, 85, 89, 93,
+  82, 94, 91, 74, 80, 89, 84, 81, 79, 81,
+  77, 91, 88, 78, 77, 75, 83, 89, 85, 88,
+  70, 78, 90, 86, 84, 87, 88, 96, 85, 71,
+  90, 83, 75, 116, 88, 77, 80, 85, 82, 82,
+  72, 74, 82, 90, 88, 88, 89, 81, 79, 83,
+  78, 82, 90, 86, 79, 89, 89, 76, 68, 70,
+  87, 83, 76, 83, 85, 86, 92, 89, 87, 82,
+  89, 74, 85, 83, 83, 79, 79, 81, 91, 83,
+  80, 70, 74, 78, 77, 87, 85, 82, 75, 90,
+  83, 73, 78, 85, 87, 84, 83, 87, 79, 85,
+  83, 81, 74, 78, 81, 99, 81, 90, 78, 77,
+  65, 79, 83, 93, 90, 89, 81, 88, 100, 84,
+  82, 77, 80, 139, 81, 83, 89, 88, 83, 94,
+  105, 81, 93, 87, 82, 85, 78, 87, 76, 77,
+  92, 80, 81, 73, 87, 85, 95, 84, 70, 77,
+  97, 85, 77, 86, 89, 93, 83, 76, 94, 78,
+  71, 111, 83, 81, 86, 86, 81, 80, 75, 78,
+  86, 81, 90, 80, 91, 86, 84, 86, 79, 83,
+  92, 81, 84, 87, 87, 77, 62, 72, 88, 81,
+  76, 81, 93, 83, 94, 90, 89, 84, 73, 80,
+  85, 83, 91, 77, 70, 81, 89, 82, 83, 63,
+  74, 82, 80, 88, 82, 88, 77, 83, 81, 80,
+  78, 86, 88, 82, 79, 90, 82, 92, 79, 89,
+  73, 75, 89, 99, 79, 77, 72, 77, 63, 78,
+  85, 91, 83, 89, 80, 88, 104, 82, 81, 80,
+  74, 142, 77, 81, 86, 89, 80, 90, 97, 75,
+  85, 86, 88, 95, 84, 84, 80, 84, 85, 79,
+  80, 80, 83, 88, 83, 85, 70, 80, 89, 81,
+  86, 80, 78, 92, 92, 75, 85, 87, 75, 112,
+  86, 75, 84, 81, 76, 77, 74, 83, 85, 97,
+  85, 88, 89, 82, 82, 89, 83, 83, 88, 82,
+  79, 84, 89, 85, 63, 74, 85, 81, 74, 84,
+  87, 83, 91, 81, 82, 73, 86, 73, 84, 80,
+  83, 77, 82, 81, 84, 83, 80, 73, 76, 83,
+  83, 90, 86, 79, 74, 82, 83, 77, 82, 83,
+  87, 88, 80, 88, 74, 89, 83, 76, 78, 81,
+  83, 95, 78, 75, 74, 76, 66, 78, 82, 90,
+  89, 85, 82, 87, 95, 83, 83, 82, 83, 123,
+  82, 84, 94, 88, 78, 94, 97, 81, 97, 88,
+  91, 91, 92, 80, 82, 70, 78, 66, 93, 86,
+  77, 93, 120, 103, 77, 83, 73, 65, 85, 95,
+  98, 64, 82, 95, 85, 85, 85, 87, 103, 83,
+  102, 100, 67, 76, 103, 103, 81, 82, 87, 88,
+  83, 92, 89, 90, 86, 111, 86, 92, 70, 83,
+  94, 89, 97, 73, 82, 71, 63, 64, 89, 89,
+  86, 72, 82, 90, 78, 66, 67, 74, 71, 76,
+  108, 93, 73, 81, 91, 64, 80, 108, 78, 84,
+  86, 87, 104, 78, 87, 86, 84, 91, 92, 79,
+  71, 86, 87, 103, 75, 86, 81, 93, 74, 61,
+  87, 93, 90, 84, 83, 84, 70, 91, 79, 85,
+  95, 91, 74, 98, 85, 102, 73, 88, 81, 75,
+  90, 87, 82, 74, 83, 80, 89, 92, 69, 57,
+  92, 86, 69, 104, 77, 97, 84, 95, 77, 72,
+  61, 92, 66, 84, 77, 67, 90, 83, 62, 76,
+  105, 100, 67, 92, 80, 81, 111, 89, 77, 81,
+  66, 79, 71, 110, 74, 90, 65, 82, 90, 72,
+  66, 68, 85, 96, 90, 106, 96, 70, 78, 86,
+  78, 72, 89, 75, 115, 72, 71, 87, 85, 88,
+  93, 58, 76, 72, 52, 80, 92, 88, 54, 81,
+  92, 86, 79, 94, 62, 96, 74, 70, 93, 81,
+  87, 90, 64, 80, 84, 99, 70, 81, 95, 90,
+  77, 85, 114, 75, 81, 78, 79, 77, 80, 88,
+  91, 84, 93, 84, 101, 70, 75, 64, 88, 94,
+  77, 91, 66, 97, 123, 82, 82, 75, 81, 84,
+  91, 92, 83, 91, 79, 77, 80, 63, 89, 72,
+  79, 76, 75, 92, 91, 75, 89, 75, 68, 79,
+  83, 89, 89, 90, 93, 81, 37, 72, 91, 81,
+  82, 97, 82, 79, 68, 87, 77, 82, 91, 95,
+  70, 98, 89, 85, 93, 94, 90, 64, 87, 83,
+  91, 78, 97, 91, 100, 89, 70, 85, 73, 93,
+  82, 98, 118, 88, 87, 80, 76, 99, 81, 72,
+  73, 106, 87, 89, 103, 75, 77, 72, 111, 87,
+  80, 93, 71, 75, 87, 83, 95, 93, 84, 73,
+  94, 86, 83, 70, 86, 89, 115, 86, 85, 92,
+  100, 77, 73, 88, 90, 99, 86, 83, 83, 91,
+  98, 81, 98, 85, 81, 78, 74, 68, 84, 77,
+  78, 91, 74, 83, 88, 76, 88, 81, 87, 98,
+  84, 91, 79, 81, 79, 87, 91, 78, 85, 66,
+  77, 65, 93, 86, 82, 87, 114, 106, 73, 83,
+  73, 65, 84, 97, 94, 62, 83, 96, 80, 87,
+  79, 89, 80, 81, 88, 88, 71, 74, 98, 100,
+  72, 80, 83, 90, 85, 77, 90, 84, 83, 107,
+  80, 80, 75, 94, 89, 83, 91, 75, 80, 75,
+  71, 67, 87, 90, 83, 66, 72, 86, 73, 68,
+  76, 74, 75, 84, 78, 89, 70, 82, 88, 68,
+  76, 110, 71, 84, 89, 83, 109, 85, 83, 90,
+  80, 91, 75, 73, 81, 79, 94, 98, 66, 85,
+  87, 91, 90, 64, 86, 70, 85, 84, 86, 89,
+  84, 83, 78, 84, 79, 87, 72, 96, 73, 85,
+  92, 83, 67, 72, 76, 87, 77, 71, 84, 79,
+  79, 91, 60, 63, 69, 86, 70, 94, 72, 94,
+  91, 91, 80, 75, 60, 77, 62, 81, 79, 74,
+  85, 87, 71, 74, 85, 99, 59, 90, 75, 78,
+  103, 78, 76, 75, 57, 81, 55, 103, 67, 93,
+  69, 74, 82, 70, 62, 65, 88, 90, 82, 83,
+  88, 70, 88, 82, 82, 75, 84, 71, 131, 70,
+  76, 94, 88, 75, 93, 67, 62, 82, 59, 79,
+  88, 79, 65, 74, 93, 90, 82, 98, 63, 97,
+  70, 63, 91, 75, 84, 82, 72, 81, 86, 92,
+  69, 86, 91, 94, 71, 80, 118, 75, 89, 78,
+  93, 79, 77, 75, 90, 86, 99, 94, 110, 78,
+  79, 65, 75, 94, 79, 82, 61, 74, 127, 80,
+  82, 78, 78, 83, 79, 92, 74, 90, 78, 77,
+  84, 83, 87, 69, 91, 66, 87, 84, 89, 67,
+  79, 84, 85, 85, 86, 80, 89, 87, 90, 80,
+  57, 76, 77, 79, 85, 98, 84, 76, 79, 71,
+  88, 88, 91, 88, 72, 93, 88, 85, 91, 91,
+  77, 73, 90, 95, 83, 80, 93, 72, 93, 84,
+  75, 85, 77, 85, 75, 95, 113, 86, 85, 85,
+  79, 90, 86, 78, 72, 108, 79, 74, 93, 75,
+  88, 81, 96, 95, 85, 78, 81, 75, 95, 78,
+  87, 90, 93, 74, 100, 88, 81, 71, 101, 97,
+  98, 81, 83, 93, 85, 82, 79, 87, 96, 93,
+  86, 79, 81, 93, 91, 81, 100, 88, 94, 82,
+  85, 71, 80, 68, 90, 90, 52, 79, 91, 87,
+  86, 83, 89, 87, 77, 92, 79, 93, 74, 103,
+  100, 81, 89, 82, 84, 67, 82, 87, 80, 88,
+  104, 110, 62, 74, 73, 64, 81, 94, 100, 75,
+  88, 94, 78, 75, 85, 93, 95, 95, 84, 88,
+  73, 71, 91, 99, 89, 83, 83, 89, 97, 78,
+  91, 84, 80, 108, 67, 80, 81, 91, 96, 86,
+  91, 73, 82, 78, 76, 64, 80, 83, 92, 70,
+  77, 87, 78, 66, 79, 77, 82, 81, 74, 84,
+  75, 81, 89, 70, 78, 107, 73, 87, 87, 90,
+  105, 94, 80, 94, 80, 87, 79, 81, 87, 73,
+  91, 86, 67, 84, 91, 86, 105, 77, 84, 75,
+  90, 81, 88, 92, 88, 84, 82, 81, 69, 91,
+  76, 96, 84, 71, 97, 80, 75, 75, 80, 80,
+  71, 75, 89, 76, 83, 87, 71, 68, 63, 83,
+  74, 106, 79, 97, 90, 87, 74, 73, 53, 80,
+  65, 83, 76, 74, 83, 76, 99, 79, 79, 89,
+  64, 93, 77, 77, 103, 92, 78, 86, 68, 82,
+  53, 102, 82, 91, 74, 73, 85, 73, 61, 72,
+  84, 100, 77, 89, 92, 65, 95, 80, 89, 73,
+  83, 75, 125, 77, 72, 93, 93, 71, 97, 64,
+  66, 78, 72, 81, 89, 72, 92, 78, 99, 93,
+  83, 99, 69, 94, 77, 66, 97, 87, 85, 81,
+  80, 82, 97, 85, 71, 86, 86, 97, 77, 81,
+  117, 81, 90, 84, 103, 78, 82, 78, 87, 87,
+  95, 80, 108, 79, 83, 69, 72, 88, 79, 78,
+  73, 76, 110, 84, 89, 85, 83, 83, 78, 93,
+  76, 94, 84, 80, 86, 81, 82, 73, 94, 87,
+  94, 84, 81, 71, 72, 78, 76, 84, 94, 81,
+  79, 90, 83, 77, 90, 80, 81, 81, 86, 98,
+  81, 73, 59, 91, 81, 87, 90, 83, 70, 83,
+  85, 80, 86, 87, 73, 83, 85, 97, 85, 87,
+  90, 80, 97, 78, 80, 91, 73, 83, 78, 82,
+  105, 90, 80, 73, 77, 87, 84, 74, 71, 104,
+  77, 76, 81, 83, 86, 84, 95, 97, 89, 89,
+  85, 78, 93, 77, 94, 93, 84, 86, 98, 81,
+  93, 74, 91, 77, 89, 82, 91, 89, 86, 89,
+  85, 92, 94, 83, 91, 80, 81, 95, 80, 70,
+  103, 88, 98, 78, 98, 69, 78, 71, 91, 99,
+  74, 82, 93, 93, 85, 81, 77, 91, 70, 97,
+  79, 88, 85, 88, 104, 85, 79, 83, 80, 84,
+  90, 82, 79, 87, 73, 87, 82, 82, 81, 83,
+  83, 95, 77, 77, 89, 81, 95, 78, 76, 79,
+  86, 85, 86, 85, 76, 80, 76, 93, 99, 92,
+  87, 78, 92, 78, 87, 78, 77, 72, 92, 82,
+  78, 81, 85, 78, 94, 92, 91, 79, 83, 78,
+  79, 84, 86, 80, 78, 80, 86, 81, 86, 84,
+  83, 85, 82, 84, 74, 67, 83, 78, 84, 75,
+  83, 83, 75, 88, 76, 79, 90, 79, 88, 82,
+  84, 86, 80, 77, 69, 81, 90, 81, 75, 88,
+  71, 80, 84, 85, 83, 83, 83, 83, 79, 87,
+  79, 86, 92, 79, 88, 85, 88, 79, 85, 86,
+  83, 78, 90, 87, 80, 86, 87, 92, 86, 76,
+  74, 93, 91, 82, 78, 87, 97, 77, 99, 80,
+  79, 78, 78, 78, 85, 88, 83, 76, 89, 86,
+  98, 80, 87, 90, 75, 88, 79, 78, 80, 81,
+  71, 65, 84, 77, 79, 84, 78, 85, 78, 114,
+  82, 81, 86, 82, 82, 92, 85, 80, 69, 93,
+  82, 92, 106, 89, 91, 85, 87, 74, 88, 89,
+  75, 86, 67, 83, 86, 83, 90, 79, 88, 72,
+  88, 83, 88, 92, 84, 92, 75, 82, 71, 91,
+  82, 93, 82, 83, 81, 71, 85, 73, 86, 83,
+  89, 76, 82, 81, 72, 85, 74, 91, 76, 82,
+  76, 79, 75, 80, 84, 77, 89, 87, 80, 85,
+  99, 82, 81, 88, 78, 66, 89, 79, 76, 79,
+  78, 80, 90, 80, 102, 93, 77, 80, 84, 84,
+  77, 83, 81, 86, 80, 81, 86, 80, 77, 85,
+  72, 79, 81, 86, 83, 83, 81, 80, 85, 79,
+  78, 79, 81, 77, 75, 79, 87, 76, 81, 81,
+  75, 93, 82, 80, 91, 86, 84, 81, 85, 77,
+  78, 74, 76, 71, 83, 70, 76, 82, 83, 73,
+  91, 90, 90, 93, 85, 79, 80, 87, 85, 84,
+  74, 81, 86, 81, 83, 84, 83, 87, 88, 83,
+  66, 70, 84, 79, 82, 86, 88, 77, 74, 88,
+  79, 85, 87, 79, 81, 86, 83, 88, 87, 78,
+  69, 76, 93, 77, 77, 89, 95, 76, 85, 82,
+  80, 80, 86, 82, 82, 86, 86, 82, 83, 82,
+  90, 90, 81, 80, 72, 83, 80, 76, 69, 87,
+  81, 87, 82, 92, 83, 78, 77, 95, 93, 83,
+  86, 75, 89, 82, 97, 77, 77, 83, 74, 82,
+  82, 84, 84, 88, 92, 83, 77, 69, 89, 83,
+  90, 95, 84, 79, 102, 78, 76, 75, 80, 73,
+  72, 87, 84, 84, 80, 100, 79, 77, 96, 83,
+  79, 74, 80, 80, 79, 81, 82, 92, 99, 93,
+  106, 78, 85, 83, 85, 75, 86, 74, 87, 77,
+  96, 85, 88, 75, 81, 93, 80, 86, 88, 81,
+  78, 80, 79, 71, 94, 81, 86, 77, 83, 73,
+  84, 75, 83, 77, 106, 82, 80, 90, 81, 86,
+  80, 88, 80, 92, 75, 84, 83, 82, 80, 85,
+  85, 88, 80, 86, 75, 80, 89, 81, 84, 76,
+  94, 61, 80, 81, 73, 93, 84, 80, 76, 87,
+  86, 77, 81, 79, 72, 87, 82, 82, 85, 82,
+  113, 88, 111, 78, 84, 80, 77, 76, 84, 93,
+  90, 90, 120, 80, 105, 76, 81, 93, 78, 101,
+  98, 82, 212, 84, 68, 70, 107, 83, 70, 78,
+  77, 85, 71, 141, 79, 75, 96, 89, 87, 106,
+  77, 79, 81, 102, 80, 101, 109, 96, 120, 78,
+  95, 92, 98, 86, 80, 82, 84, 72, 87, 94,
+  95, 75, 87, 79, 87, 101, 115, 99, 80, 113,
+  82, 79, 97, 83, 95, 83, 92, 74, 87, 73,
+  80, 76, 120, 84, 96, 83, 105, 87, 84, 95,
+  90, 96, 82, 86, 80, 69, 76, 85, 87, 93,
+  96, 91, 80, 85, 95, 87, 80, 81, 85, 55,
+  89, 77, 68, 98, 77, 88, 83, 81, 88, 77,
+  83, 96, 73, 74, 70, 78, 86, 83, 87, 77,
+  93, 75, 76, 76, 70, 73, 83, 85, 82, 87,
+  94, 68, 91, 72, 70, 79, 81, 90, 83, 78,
+  109, 77, 73, 74, 81, 81, 76, 69, 79, 81,
+  79, 101, 77, 76, 83, 79, 75, 73, 71, 66,
+  80, 83, 81, 88, 96, 91, 105, 79, 88, 90,
+  85, 74, 84, 76, 84, 71, 92, 86, 87, 74,
+  77, 96, 85, 89, 85, 82, 78, 88, 78, 75,
+  95, 76, 89, 77, 80, 77, 82, 81, 72, 84,
+  106, 84, 84, 82, 84, 80, 80, 83, 82, 90,
+  89, 80, 88, 62, 75, 82, 83, 87, 81, 85,
+  81, 77, 80, 81, 84, 81, 88, 64, 74, 79,
+  68, 94, 70, 84, 80, 86, 82, 77, 80, 82,
+  89, 93, 86, 83, 81, 76, 79, 78, 77, 79,
+  82, 83, 82, 80, 82, 81, 87, 86, 75, 95,
+  74, 79, 87, 78, 84, 80, 73, 82, 83, 81,
+  80, 78, 75, 79, 75, 99, 85, 82, 89, 78,
+  78, 78, 97, 76, 88, 67, 79, 93, 79, 83,
+  76, 77, 79, 86, 81, 86, 78, 74, 75, 82,
+  83, 76, 77, 77, 93, 75, 82, 91, 82, 87,
+  90, 88, 86, 73, 90, 81, 81, 73, 85, 84,
+  75, 80, 70, 73, 86, 88, 85, 82, 81, 77,
+  79, 83, 70, 87, 87, 88, 77, 86, 74, 70,
+  81, 96, 85, 88, 89, 87, 84, 82, 79, 75,
+  87, 78, 86, 84, 74, 85, 81, 84, 78, 86,
+  78, 84, 73, 89, 85, 80, 87, 82, 77, 80,
+  87, 81, 79, 83, 93, 70, 94, 78, 83, 76,
+  78, 75, 86, 88, 87, 81, 91, 84, 95, 88,
+  83, 84, 69, 83, 77, 81, 105, 77, 61, 66,
+  88, 80, 69, 85, 78, 79, 78, 113, 72, 77,
+  82, 86, 79, 83, 77, 86, 71, 93, 69, 93,
+  86, 85, 90, 79, 84, 81, 79, 86, 75, 81,
+  68, 77, 90, 77, 84, 79, 85, 86, 95, 95,
+  95, 88, 82, 98, 75, 82, 77, 87, 79, 82,
+  81, 77, 79, 85, 82, 77, 93, 80, 82, 73,
+  82, 83, 76, 91, 81, 89, 72, 82, 83, 83,
+  73, 84, 83, 83, 91, 86, 73, 78, 91, 79,
+  78, 82, 73, 70, 83, 80, 73, 85, 69, 80,
+  76, 80, 96, 71, 79, 87, 84, 77, 81, 83,
+  83, 82, 81, 73, 76, 76, 78, 78, 72, 84,
+  83, 84, 81, 90, 78, 81, 92, 79, 72, 74,
+  76, 76, 74, 80, 105, 78, 77, 77, 78, 87,
+  78, 79, 79, 80, 77, 86, 74, 74, 76, 74,
+  82, 67, 73, 70, 79, 80, 75, 75, 79, 86,
+  79, 74, 80, 83, 69, 83, 82, 80, 76, 76,
+  91, 76, 88, 88, 77, 97, 83, 90, 76, 77,
+  81, 83, 80, 85, 79, 77, 76, 78, 72, 89,
+  83, 93, 79, 87, 85, 78, 82, 74, 70, 82,
+  89, 85, 82, 87, 82, 71, 84, 80, 82, 85,
+  92, 87, 83, 82, 80, 72, 83, 80, 87, 84,
+  79, 88, 83, 82, 74, 89, 64, 86, 71, 87,
+  81, 80, 85, 84, 85, 82, 62, 81, 91, 80,
+  85, 83, 72, 85, 90, 70, 71, 97, 78, 73,
+  89, 89, 84, 80, 88, 81, 82, 82, 80, 79,
+  81, 83, 99, 94, 98, 88, 76, 74, 84, 91,
+  95, 77, 92, 69, 98, 119, 78, 80, 100, 75,
+  72, 91, 109, 87, 99, 91, 85, 95, 66, 104,
+  84, 87, 88, 74, 89, 89, 115, 100, 87, 80,
+  77, 78, 78, 72, 75, 86, 79, 80, 84, 85,
+  93, 71, 91, 87, 95, 82, 102, 89, 84, 58,
+  85, 84, 95, 77, 69, 77, 76, 74, 66, 74,
+  87, 71, 83, 102, 74, 79, 74, 91, 80, 74,
+  79, 79, 102, 74, 90, 101, 77, 79, 92, 92,
+  88, 87, 73, 86, 113, 81, 79, 82, 66, 86,
+  77, 82, 97, 84, 69, 81, 89, 73, 86, 82,
+  69, 90, 92, 72, 79, 105, 83, 75, 96, 85,
+  84, 77, 73, 81, 74, 84, 87, 86, 82, 82,
+  97, 84, 93, 100, 76, 74, 86, 74, 100, 70,
+  102, 70, 97, 131, 91, 83, 104, 72, 68, 85,
+  111, 84, 99, 100, 88, 99, 74, 96, 86, 86,
+  79, 77, 89, 82, 117, 110, 82, 90, 76, 77,
+  74, 71, 84, 93, 67, 75, 83, 84, 96, 80,
+  89, 99, 96, 84, 106, 78, 88, 59, 73, 84,
+  100, 82, 69, 73, 72, 79, 66, 70, 90, 84,
+  74, 106, 70, 75, 82, 93, 83, 71, 84, 79,
+  114, 81, 99, 95, 79, 76, 98, 90, 75, 87,
+  73, 78, 98, 73, 88, 88, 76, 74, 78, 82,
+  82, 78, 76, 83, 92, 76, 78, 75, 76, 83,
+  92, 77, 68, 88, 75, 81, 86, 85, 85, 85,
+  82, 83, 82, 80, 85, 88, 81, 78, 93, 77,
+  87, 97, 81, 73, 87, 82, 89, 79, 81, 72,
+  99, 105, 97, 79, 96, 84, 79, 93, 96, 88,
+  90, 89, 77, 98, 70, 72, 85, 83, 95, 77,
+  87, 97, 107, 94, 94, 78, 74, 83, 81, 75,
+  85, 86, 92, 76, 89, 90, 94, 97, 97, 82,
+  90, 82, 100, 85, 91, 70, 81, 86, 87, 87,
+  67, 85, 80, 82, 77, 75, 81, 74, 84, 101,
+  77, 75, 74, 89, 79, 78, 82, 80, 93, 78,
+  88, 96, 81, 91, 96, 95, 74, 89, 82, 90,
+  93, 83, 77, 84, 74, 82, 79, 81, 112, 85,
+  79, 88, 85, 77, 82, 86, 74, 82, 88, 73,
+  79, 111, 88, 74, 94, 77, 88, 76, 67, 88,
+  77, 86, 89, 79, 87, 88, 89, 72, 86, 98,
+  78, 90, 88, 76, 76, 89, 70, 81, 87, 108,
+  71, 84, 77, 78, 82, 90, 98, 89, 98, 97,
+  76, 75, 70, 70, 78, 90, 82, 78, 91, 81,
+  110, 96, 82, 79, 84, 68, 109, 75, 65, 85,
+  79, 75, 90, 83, 91, 74, 83, 79, 89, 92,
+  94, 78, 83, 87, 78, 86, 96, 68, 75, 73,
+  69, 79, 75, 67, 83, 81, 80, 80, 82, 80,
+  75, 84, 84, 102, 93, 79, 84, 83, 87, 91,
+  77, 69, 86, 98, 89, 85, 72, 73, 89, 79,
+  81, 88, 81, 77, 68, 84, 100, 85, 77, 91,
+  73, 74, 82, 87, 75, 85, 84, 78, 75, 88,
+  90, 75, 100, 78, 91, 74, 74, 76, 70, 85,
+  91, 76, 92, 89, 87, 72, 66, 97, 80, 87,
+  81, 72, 78, 92, 94, 75, 89, 89, 58, 87,
+  70, 81, 83, 85, 98, 89, 95, 84, 80, 72,
+  71, 91, 76, 87, 71, 89, 103, 81, 104, 89,
+  77, 76, 90, 78, 128, 79, 75, 82, 73, 78,
+  92, 82, 91, 71, 74, 71, 90, 87, 91, 85,
+  77, 91, 70, 81, 82, 66, 73, 75, 68, 76,
+  74, 61, 80, 90, 80, 74, 85, 87, 79, 88,
+  78, 106, 101, 78, 72, 83, 66, 91, 77, 72,
+  70, 93, 85, 83, 71, 64, 80, 73, 78, 92,
+  81, 70, 69, 76, 98, 91, 73, 89, 87, 85,
+  81, 81, 76, 84, 93, 79, 86, 78, 76, 78,
+  90, 75, 88, 80, 78, 85, 80, 84, 86, 84,
+  82, 89, 90, 77, 77, 109, 78, 81, 90, 82,
+  79, 89, 103, 81, 89, 105, 80, 81, 95, 78,
+  75, 84, 96, 88, 97, 83, 78, 83, 77, 107,
+  77, 89, 83, 78, 90, 85, 103, 107, 86, 85,
+  79, 75, 95, 81, 93, 85, 77, 73, 81, 83,
+  96, 90, 88, 88, 88, 89, 101, 83, 91, 88,
+  75, 84, 87, 73, 72, 68, 69, 83, 74, 69,
+  88, 84, 79, 92, 83, 85, 78, 86, 85, 98,
+  86, 84, 89, 87, 72, 88, 84, 81, 71, 93,
+  75, 84, 79, 76, 82, 82, 83, 87, 86, 77,
+  77, 87, 84, 93, 89, 85, 88, 96, 73, 68,
+  83, 89, 73, 83, 79, 87, 89, 74, 89, 85,
+  83, 81, 80, 80, 81, 89, 95, 91, 84, 92,
+  89, 84, 85, 87, 83, 83, 89, 89, 71, 86,
+  84, 91, 82, 92, 90, 95, 81, 95, 78, 89,
+  74, 91, 86, 83, 78, 71, 84, 79, 90, 73,
+  94, 78, 85, 92, 87, 81, 84, 75, 86, 84,
+  86, 90, 78, 64, 85, 70, 87, 98, 85, 92,
+  80, 82, 84, 93, 75, 88, 89, 87, 87, 94,
+  79, 94, 88, 76, 92, 85, 89, 89, 77, 80,
+  84, 77, 87, 80, 76, 81, 95, 69, 92, 82,
+  72, 84, 80, 85, 83, 75, 68, 89, 108, 88,
+  91, 82, 91, 94, 88, 77, 94, 80, 78, 71,
+  70, 97, 81, 82, 74, 98, 83, 70, 80, 90,
+  66, 85, 72, 84, 87, 77, 80, 92, 85, 85,
+  96, 82, 95, 85, 86, 92, 84, 92, 87, 82,
+  79, 74, 82, 85, 94, 89, 80, 80, 74, 82,
+  97, 87, 81, 95, 76, 105, 74, 92, 73, 98,
+  77, 80, 77, 64, 86, 78, 96, 65, 110, 83,
+  83, 100, 86, 69, 95, 70, 83, 95, 86, 93,
+  83, 68, 89, 71, 92, 107, 84, 86, 87, 72,
+  82, 90, 68, 88, 84, 79, 88, 88, 70, 97,
+  88, 83, 104, 84, 90, 94, 72, 74, 97, 69,
+  97, 77, 74, 82, 96, 71, 97, 79, 60, 83,
+  72, 89, 83, 91, 72, 92, 95, 86, 92, 89,
+  89, 93, 85, 80, 96, 77, 79, 69, 90, 99,
+  77, 87, 88, 86, 78, 71, 87, 93, 80, 84,
+  94, 91, 77, 77, 88, 79, 85, 84, 84, 86,
+  99, 87, 79, 87, 86, 96, 86, 77, 80, 92,
+  77, 80, 93, 90, 73, 84, 87, 92, 82, 101,
+  77, 89, 88, 88, 68, 91, 83, 96, 85, 84,
+  78, 80, 80, 84, 78, 73, 88, 76, 92, 89,
+  85, 89, 86, 74, 82, 78, 96, 92, 90, 74,
+  80, 70, 85, 97, 91, 87, 91, 91, 86, 92,
+  84, 84, 95, 87, 86, 88, 81, 86, 81, 78,
+  85, 88, 84, 85, 87, 84, 88, 87, 85, 81,
+  76, 82, 95, 76, 87, 81, 75, 82, 74, 93,
+  84, 89, 72, 84, 84, 89, 91, 84, 88, 85,
+  80, 80, 95, 76, 80, 78, 85, 83, 89, 87,
+  93, 88, 90, 77, 95, 84, 75, 85, 91, 81,
+  94, 82, 86, 83, 73, 79, 85, 81, 69, 72,
+  92, 88, 85, 78, 80, 87, 82, 77, 86, 84,
+  77, 81, 91, 85, 81, 89, 102, 88, 91, 101,
+  84, 88, 75, 91, 84, 79, 90, 94, 85, 92,
+  77, 93, 90, 86, 81, 84, 82, 80, 77, 76,
+  107, 94, 69, 85, 83, 79, 68, 75, 77, 68,
+  91, 82, 91, 74, 82, 92, 78, 92, 77, 78,
+  104, 81, 88, 80, 85, 85, 60, 69, 77, 97,
+  84, 91, 88, 99, 100, 88, 87, 74, 86, 86,
+  86, 81, 84, 95, 87, 74, 80, 78, 86, 79,
+  100, 68, 93, 84, 82, 86, 73, 87, 85, 87,
+  81, 77, 84, 75, 81, 90, 83, 85, 87, 68,
+  93, 80, 88, 82, 81, 78, 93, 86, 87, 77,
+  81, 89, 83, 81, 93, 76, 64, 76, 90, 93,
+  88, 81, 73, 93, 80, 75, 102, 78, 75, 62,
+  78, 71, 78, 94, 91, 66, 87, 94, 74, 82,
+  70, 70, 87, 103, 80, 102, 88, 82, 86, 86,
+  83, 91, 79, 75, 83, 68, 85, 80, 89, 101,
+  94, 88, 73, 90, 40, 61, 83, 80, 79, 82,
+  83, 53, 81, 83, 78, 93, 82, 74, 93, 87,
+  82, 74, 93, 85, 70, 70, 73, 96, 72, 88,
+  83, 92, 89, 91, 74, 71, 80, 78, 85, 85,
+  89, 96, 84, 85, 84, 81, 85, 77, 103, 77,
+  77, 79, 76, 90, 84, 92, 99, 95, 92, 81,
+  81, 88, 79, 90, 84, 80, 90, 62, 90, 84,
+  85, 80, 77, 81, 92, 81, 82, 77, 79, 89,
+  82, 84, 92, 76, 74, 72, 91, 91, 85, 82,
+  83, 84, 79, 78, 93, 77, 93, 76, 76, 75,
+  79, 93, 90, 64, 95, 97, 74, 86, 65, 60,
+  80, 96, 83, 91, 83, 86, 84, 95, 86, 87,
+  85, 76, 88, 72, 86, 82, 91, 101, 92, 92,
+  73, 77, 73, 61, 86, 73, 82, 68, 79, 77,
+  79, 84, 80, 87, 83, 75, 90, 85, 78, 69,
+  85, 87, 74, 77, 68, 95, 79, 85, 79, 92,
+  83, 89, 73, 80, 76, 76, 89, 86, 98, 91,
+  85, 84, 81, 81, 85, 86, 88, 76, 60, 76,
+  75, 92, 77, 93, 88, 92, 92, 76, 85, 87,
+  80, 78, 89, 80, 85, 80, 97, 92, 86, 81,
+  82, 70, 81, 83, 81, 92, 80, 89, 83, 79,
+  83, 77, 89, 72, 86, 103, 85, 76, 80, 92,
+  85, 79, 86, 71, 65, 79, 85, 78, 78, 102,
+  93, 80, 75, 98, 88, 87, 80, 84, 84, 88,
+  90, 94, 86, 83, 86, 71, 92, 86, 82, 84,
+  79, 67, 79, 51, 74, 94, 82, 69, 85, 73,
+  72, 76, 91, 70, 86, 86, 80, 79, 66, 96,
+  87, 97, 78, 91, 89, 80, 76, 71, 95, 83,
+  81, 70, 72, 87, 75, 85, 80, 86, 90, 80,
+  66, 45, 78, 83, 79, 62, 89, 95, 90, 94,
+  99, 74, 90, 76, 79, 71, 101, 76, 82, 89,
+  79, 87, 87, 93, 89, 79, 85, 95, 94, 73,
+  68, 74, 71, 60, 72, 83, 78, 88, 81, 62,
+  77, 83, 68, 79, 78, 77, 83, 70, 86, 94,
+  94, 100, 87, 81, 92, 82, 74, 87, 83, 82,
+  100, 68, 75, 72, 75, 72, 91, 70, 77, 67,
+  65, 77, 74, 87, 83, 72, 88, 104, 76, 83,
+  83, 75, 93, 49, 73, 84, 86, 81, 112, 82,
+  94, 104, 41, 92, 154, 87, 83, 129, 34, 76,
+  100, 95, 67, 80, 96, 95, 68, 68, 83, 81,
+  81, 92, 76, 89, 71, 113, 73, 76, 80, 90,
+  83, 78, 71, 65, 81, 73, 69, 78, 64, 85,
+  91, 82, 83, 81, 89, 92, 83, 109, 84, 96,
+  79, 70, 66, 118, 108, 77, 97, 91, 95, 101,
+  85, 80, 84, 94, 83, 118, 93, 92, 61, 77,
+  80, 67, 69, 94, 82, 85, 79, 68, 68, 64,
+  64, 88, 80, 71, 79, 76, 80, 85, 65, 87,
+  81, 77, 90, 86, 75, 78, 75, 85, 90, 81,
+  73, 76, 93, 73, 86, 75, 76, 60, 85, 78,
+  72, 101, 84, 102, 83, 87, 86, 79, 86, 81,
+  96, 77, 80, 86, 94, 73, 113, 90, 103, 109,
+  63, 88, 110, 97, 88, 103, 84, 65, 102, 96,
+  77, 77, 82, 79, 93, 57, 86, 78, 80, 72,
+  73, 76, 72, 102, 83, 75, 84, 120, 80, 76,
+  94, 59, 81, 73, 77, 77, 74, 140, 87, 84,
+  85, 78, 85, 92, 82, 96, 71, 110, 78, 74,
+  57, 96, 60, 71, 91, 85, 75, 83, 85, 79,
+  84, 87, 77, 102, 85, 81, 86, 83, 76, 82,
+  80, 91, 88, 80, 76, 77, 73, 85, 70, 93,
+  81, 87, 78, 96, 74, 85, 98, 63, 85, 91,
+  82, 85, 87, 80, 81, 85, 86, 74, 82, 95,
+  101, 90, 85, 89, 89, 78, 73, 93, 89, 77,
+  84, 78, 83, 73, 86, 96, 78, 85, 80, 86,
+  96, 86, 83, 82, 86, 81, 88, 50, 78, 86,
+  78, 70, 79, 87, 75, 69, 88, 73, 91, 82,
+  82, 90, 66, 96, 82, 83, 67, 97, 77, 77,
+  82, 84, 94, 89, 87, 93, 69, 76, 94, 80,
+  81, 81, 82, 81, 77, 60, 83, 83, 80, 65,
+  80, 90, 87, 85, 83, 82, 96, 78, 73, 83,
+  89, 70, 74, 86, 74, 81, 93, 89, 85, 81,
+  87, 92, 103, 69, 92, 86, 70, 93, 69, 71,
+  86, 85, 76, 79, 84, 96, 69, 81, 74, 70,
+  75, 91, 90, 85, 99, 85, 101, 77, 75, 85,
+  89, 88, 95, 86, 84, 94, 103, 108, 86, 85,
+  100, 62, 76, 71, 79, 74, 84, 93, 84, 94,
+  82, 67, 92, 93, 76, 81, 74, 76, 58, 77,
+  81, 93, 102, 88, 87, 93, 79, 73, 89, 87,
+  92, 80, 90, 107, 79, 85, 80, 83, 90, 118,
+  72, 78, 79, 71, 75, 112, 83, 88, 89, 107,
+  82, 87, 89, 76, 89, 77, 91, 72, 77, 71,
+  72, 87, 85, 77, 86, 85, 92, 74, 83, 95,
+  81, 79, 79, 94, 76, 87, 69, 103, 88, 91,
+  85, 91, 91, 73, 74, 73, 88, 97, 84, 81,
+  103, 80, 65, 82, 82, 91, 73, 74, 84, 81,
+  76, 84, 79, 84, 68, 82, 74, 64, 81, 89,
+  95, 76, 79, 75, 88, 83, 80, 88, 94, 83,
+  94, 84, 85, 99, 72, 106, 88, 82, 98, 64,
+  71, 63, 89, 73, 77, 101, 82, 111, 83, 55,
+  91, 81, 80, 80, 79, 97, 55, 79, 85, 87,
+  105, 97, 93, 88, 81, 72, 74, 91, 102, 79,
+  112, 107, 80, 90, 86, 90, 82, 97, 94, 69,
+  81, 78, 79, 86, 87, 87, 90, 108, 81, 85,
+  93, 98, 86, 92, 100, 73, 76, 76, 92, 84,
+  82, 102, 88, 90, 99, 69, 85, 94, 82, 74,
+  72, 102, 77, 88, 69, 98, 86, 94, 81, 94,
+  89, 65, 77, 72, 90, 96, 85, 83, 81, 94,
+  88, 81, 92, 83, 75, 78, 83, 78, 88, 88,
+  96, 78, 80, 81, 88, 85, 90, 83, 80, 79,
+  86, 82, 91, 76, 76, 80, 81, 87, 99, 83,
+  83, 81, 102, 82, 87, 68, 94, 88, 76, 93,
+  82, 88, 77, 79, 90, 82, 82, 87, 86, 90,
+  85, 85, 87, 83, 83, 75, 92, 84, 91, 94,
+  92, 82, 91, 96, 87, 70, 96, 86, 83, 87,
+  81, 78, 80, 78, 92, 89, 81, 95, 84, 92,
+  84, 91, 67, 82, 88, 93, 88, 71, 81, 82,
+  81, 84, 83, 70, 97, 86, 72, 89, 78, 87,
+  85, 89, 83, 84, 85, 90, 83, 86, 85, 85,
+  85, 70, 78, 73, 80, 83, 81, 85, 90, 99,
+  68, 73, 101, 93, 88, 93, 79, 96, 84, 74,
+  106, 79, 77, 68, 81, 75, 93, 83, 93, 79,
+  86, 80, 90, 75, 83, 78, 86, 82, 80, 84,
+  84, 79, 75, 82, 99, 92, 105, 79, 85, 86,
+  102, 82, 80, 58, 92, 94, 75, 83, 84, 77,
+  92, 88, 95, 87, 88, 87, 80, 85, 81, 88,
+  79, 79, 81, 67, 93, 91, 98, 110, 84, 94,
+  69, 98, 89, 70, 109, 71, 76, 85, 81, 82,
+  86, 82, 89, 94, 76, 89, 81, 77, 88, 82,
+  72, 90, 75, 92, 74, 79, 70, 78, 87, 88,
+  70, 74, 83, 87, 80, 88, 73, 84, 82, 92,
+  78, 82, 84, 90, 85, 85, 88, 88, 83, 73,
+  72, 71, 77, 88, 80, 82, 90, 98, 64, 75,
+  90, 90, 89, 94, 81, 90, 82, 81, 101, 95,
+  76, 71, 84, 78, 92, 84, 95, 85, 79, 86,
+  93, 85, 91, 78, 91, 74, 85, 82, 72, 71,
+  77, 87, 84, 93, 99, 78, 82, 87, 91, 91,
+  83, 61, 77, 90, 77, 82, 80, 81, 79, 82,
+  86, 87, 88, 87, 84, 86, 80, 85, 87, 90,
+  81, 72, 81, 88, 94, 93, 83, 94, 94, 88,
+  79, 73, 106, 76, 80, 79, 79, 85, 85, 79,
+  88, 98, 82, 82, 87, 85, 83, 75, 73, 90,
+  70, 82, 80, 78, 75, 91, 85, 84, 80, 71,
+  91, 88, 97, 79, 74, 87, 78, 91, 82, 84,
+  79, 94, 87, 88, 86, 90, 86, 92, 76, 72,
+  73, 78, 80, 79, 84, 98, 73, 73, 86, 91,
+  90, 93, 89, 98, 92, 89, 83, 83, 81, 80,
+  80, 83, 84, 94, 92, 86, 75, 83, 90, 81,
+  87, 83, 82, 73, 78, 86, 93, 79, 84, 86,
+  85, 84, 91, 80, 81, 87, 92, 76, 96, 88,
+  91, 79, 88, 84, 79, 81, 75, 83, 84, 89,
+  81, 85, 81, 84, 82, 82, 81, 89, 72, 81,
+  81, 87, 95, 81, 79, 84, 99, 85, 97, 74,
+  101, 85, 80, 83, 74, 89, 83, 74, 85, 85,
+  76, 94, 86, 100, 81, 93, 77, 93, 82, 91,
+  96, 69, 72, 89, 78, 94, 85, 73, 90, 85,
+  68, 90, 69, 93, 89, 97, 82, 92, 81, 83,
+  77, 81, 88, 77, 82, 73, 78, 77, 69, 98,
+  86, 75, 80, 84, 77, 71, 85, 89, 92, 86,
+  86, 91, 102, 94, 88, 76, 78, 73, 76, 84,
+  86, 90, 80, 80, 85, 95, 87, 72, 84, 84,
+  82, 74, 74, 88, 94, 79, 86, 86, 105, 86,
+  82, 69, 77, 93, 86, 78, 86, 93, 90, 76,
+  87, 63, 75, 71, 80, 91, 90, 82, 96, 82,
+  74, 74, 80, 85, 72, 79, 69, 73, 74, 91,
+  98, 100, 68, 94, 83, 73, 102, 84, 126, 72,
+  74, 73, 73, 98, 91, 79, 79, 88, 71, 71,
+  86, 89, 95, 90, 86, 101, 70, 90, 77, 72,
+  63, 88, 82, 88, 71, 66, 73, 86, 76, 80,
+  61, 78, 92, 99, 80, 96, 83, 82, 76, 79,
+  89, 83, 81, 70, 71, 72, 76, 103, 75, 73,
+  78, 72, 77, 73, 67, 90, 78, 79, 85, 82,
+  86, 96, 85, 84, 78, 70, 83, 90, 87, 86,
+  89, 84, 77, 87, 93, 81, 92, 87, 81, 68,
+  80, 89, 84, 73, 88, 91, 90, 89, 82, 71,
+  77, 90, 80, 95, 83, 101, 84, 81, 92, 73,
+  74, 78, 75, 84, 75, 87, 91, 83, 77, 78,
+  80, 81, 82, 91, 71, 76, 72, 90, 98, 84,
+  69, 94, 104, 72, 93, 85, 121, 91, 77, 73,
+  76, 99, 85, 75, 87, 92, 80, 74, 90, 95,
+  87, 76, 81, 94, 72, 86, 75, 74, 69, 103,
+  85, 89, 79, 70, 83, 85, 96, 76, 62, 77,
+  87, 98, 83, 100, 81, 82, 78, 84, 88, 84,
+  81, 86, 77, 82, 75, 95, 82, 78, 74, 78,
+  84, 71, 69, 94, 87, 81, 80, 97, 99, 86,
+  80, 81, 81, 75, 78, 92, 78, 95, 96, 93,
+  61, 88, 92, 83, 92, 90, 94, 74, 79, 82,
+  96, 74, 92, 94, 80, 84, 82, 87, 83, 93,
+  83, 78, 88, 100, 80, 85, 99, 83, 89, 81,
+  70, 82, 66, 82, 94, 89, 73, 87, 88, 76,
+  90, 74, 78, 78, 84, 75, 104, 83, 80, 80,
+  103, 80, 81, 90, 89, 90, 79, 77, 84, 93,
+  73, 82, 74, 85, 88, 81, 82, 89, 81, 93,
+  83, 88, 85, 90, 74, 85, 82, 80, 86, 85,
+  85, 81, 94, 76, 75, 95, 59, 89, 88, 100,
+  78, 103, 86, 90, 85, 83, 95, 81, 77, 88,
+  75, 84, 80, 93, 80, 83, 77, 77, 85, 69,
+  88, 96, 89, 77, 61, 83, 89, 88, 66, 76,
+  86, 72, 74, 99, 74, 97, 69, 74, 71, 92,
+  87, 89, 86, 105, 99, 75, 87, 72, 90, 70,
+  98, 91, 105, 79, 80, 71, 76, 101, 71, 86,
+  87, 102, 72, 66, 112, 75, 85, 71, 75, 84,
+  67, 73, 117, 78, 69, 68, 87, 73, 84, 68,
+  99, 68, 82, 84, 105, 103, 80, 88, 99, 69,
+  83, 119, 105, 93, 79, 81, 91, 99, 78, 98,
+  77, 80, 86, 60, 78, 84, 87, 86, 84, 91,
+  83, 85, 50, 78, 83, 80, 81, 78, 92, 74,
+  78, 76, 82, 85, 50, 76, 93, 104, 76, 109,
+  95, 83, 77, 84, 83, 88, 85, 80, 77, 86,
+  93, 87, 71, 95, 76, 73, 83, 77, 68, 101,
+  79, 71, 74, 75, 69, 86, 70, 78, 86, 69,
+  80, 96, 80, 89, 84, 78, 63, 89, 93, 91,
+  95, 98, 93, 72, 70, 80, 77, 70, 93, 94,
+  93, 89, 83, 77, 81, 94, 79, 94, 81, 102,
+  78, 71, 107, 74, 84, 81, 83, 82, 63, 85,
+  98, 83, 72, 73, 85, 77, 90, 82, 100, 79,
+  84, 80, 98, 86, 78, 87, 99, 76, 73, 106,
+  107, 96, 94, 74, 90, 98, 72, 95, 74, 80,
+  98, 66, 83, 95, 85, 72, 77, 91, 87, 88,
+  58, 88, 90, 90, 81, 80, 90, 77, 83, 77,
+  92, 86, 55, 75, 82, 101, 77, 96, 96, 83,
+  82, 90, 83, 90, 82, 93, 74, 86, 83, 79,
+  71, 93, 81, 74, 86, 74, 77, 104, 88, 79,
+  87, 75, 100, 99, 82, 90, 79, 81, 79, 95,
+  84, 85, 87, 81, 89, 89, 84, 93, 84, 82,
+  83, 78, 97, 76, 77, 93, 76, 80, 99, 91,
+  89, 77, 88, 69, 91, 104, 81, 103, 87, 89,
+  82, 78, 73, 87, 85, 83, 72, 75, 73, 81,
+  82, 81, 88, 77, 76, 87, 77, 80, 93, 80,
+  91, 75, 83, 84, 105, 78, 84, 75, 79, 105,
+  85, 83, 70, 97, 73, 80, 83, 73, 92, 75,
+  86, 82, 78, 93, 85, 63, 142, 83, 80, 89,
+  81, 92, 83, 89, 88, 79, 83, 91, 87, 77,
+  89, 78, 76, 85, 69, 74, 73, 85, 82, 77,
+  78, 89, 82, 73, 87, 91, 87, 90, 84, 88,
+  82, 86, 77, 86, 83, 166, 76, 80, 92, 76,
+  86, 81, 94, 80, 80, 78, 73, 76, 83, 77,
+  94, 91, 88, 82, 87, 87, 72, 92, 75, 80,
+  80, 69, 80, 95, 68, 70, 101, 92, 103, 87,
+  83, 68, 93, 74, 81, 78, 85, 88, 80, 86,
+  84, 87, 88, 81, 80, 85, 63, 77, 85, 91,
+  84, 73, 77, 82, 77, 79, 98, 72, 82, 81,
+  84, 85, 88, 80, 73, 79, 74, 82, 99, 87,
+  73, 84, 82, 78, 81, 84, 95, 85, 81, 83,
+  75, 85, 89, 57, 92, 76, 89, 83, 83, 84,
+  74, 96, 79, 88, 77, 95, 82, 85, 69, 79,
+  56, 88, 76, 78, 68, 86, 78, 80, 87, 78,
+  73, 104, 83, 92, 80, 105, 80, 87, 78, 81,
+  69, 78, 81, 153, 67, 86, 84, 72, 91, 89,
+  90, 80, 79, 81, 78, 100, 86, 86, 80, 86,
+  94, 86, 87, 87, 89, 94, 78, 82, 83, 80,
+  79, 90, 83, 82, 87, 88, 90, 87, 86, 72,
+  87, 63, 88, 95, 73, 93, 87, 79, 85, 84,
+  77, 82, 81, 89, 73, 80, 82, 81, 92, 78,
+  77, 71, 76, 80, 97, 76, 86, 86, 81, 84,
+  105, 77, 78, 79, 77, 86, 94, 81, 82, 86,
+  81, 81, 81, 95, 100, 76, 85, 84, 69, 83,
+  84, 74, 67, 86, 88, 90, 81, 98, 87, 86,
+  95, 82, 82, 93, 78, 72, 81, 87, 80, 84,
+  72, 81, 79, 78, 77, 80, 88, 89, 82, 142,
+  85, 82, 90, 87, 86, 86, 82, 86, 84, 95,
+  86, 146, 82, 79, 89, 84, 84, 89, 86, 87,
+  81, 74, 72, 72, 90, 81, 84, 90, 83, 80,
+  81, 90, 73, 72, 87, 87, 91, 75, 79, 88,
+  71, 70, 108, 93, 102, 80, 91, 66, 97, 103,
+  78, 89, 86, 86, 82, 78, 74, 91, 85, 81,
+  82, 82, 69, 85, 88, 89, 85, 80, 85, 86,
+  70, 80, 90, 86, 95, 80, 85, 84, 80, 76,
+  78, 86, 80, 83, 83, 82, 67, 89, 81, 73,
+  74, 64, 92, 83, 86, 88, 83, 88, 84, 98,
+  138, 77, 80, 77, 87, 84, 81, 84, 69, 83,
+  83, 95, 91, 80, 79, 85, 64, 89, 73, 84,
+  76, 90, 82, 85, 78, 87, 74, 51, 89, 90,
+  80, 103, 81, 82, 85, 75, 67, 73, 75, 97,
+  63, 92, 89, 84, 74, 75, 97, 80, 85, 72,
+  62, 70, 90, 74, 95, 81, 77, 74, 87, 87,
+  66, 81, 80, 89, 82, 75, 84, 89, 63, 66,
+  123, 92, 121, 98, 85, 71, 99, 68, 87, 88,
+  88, 87, 78, 83, 81, 94, 97, 78, 87, 92,
+  63, 79, 88, 80, 81, 75, 80, 81, 71, 73,
+  86, 87, 99, 83, 75, 93, 60, 80, 78, 101,
+  82, 68, 80, 90, 71, 81, 90, 75, 81, 88,
+  84, 104, 80, 87, 77, 87, 83, 103, 69, 75,
+  79, 72, 87, 78, 57, 96, 64, 96, 77, 111,
+  91, 95, 75, 83, 61, 92, 81, 92, 70, 89,
+  85, 88, 78, 79, 78, 70, 80, 85, 81, 131,
+  83, 78, 77, 77, 48, 79, 69, 63, 68, 106,
+  85, 77, 83, 82, 86, 79, 80, 74, 75, 77,
+  84, 83, 77, 78, 90, 80, 82, 88, 80, 86,
+  79, 85, 85, 76, 81, 88, 79, 71, 94, 79,
+  93, 96, 88, 67, 91, 59, 87, 81, 87, 86,
+  85, 76, 92, 88, 81, 80, 90, 90, 69, 85,
+  85, 84, 88, 74, 88, 87, 72, 78, 90, 81,
+  88, 88, 84, 83, 92, 75, 73, 92, 79, 78,
+  93, 78, 82, 82, 84, 77, 79, 97, 95, 80,
+  85, 89, 74, 85, 87, 109, 64, 85, 81, 83,
+  82, 87, 90, 79, 80, 83, 83, 96, 85, 74,
+  77, 85, 70, 86, 74, 85, 80, 83, 77, 86,
+  85, 88, 75, 127, 83, 84, 95, 96, 81, 81,
+  79, 74, 73, 77, 79, 85, 68, 83, 94, 80,
+  77, 93, 87, 94, 79, 73, 76, 93, 87, 84,
+  79, 88, 87, 82, 79, 92, 87, 74, 84, 84,
+  99, 78, 82, 86, 91, 77, 90, 86, 88, 88,
+  88, 69, 99, 118, 78, 78, 78, 88, 78, 76,
+  79, 91, 80, 84, 79, 86, 81, 82, 90, 82,
+  89, 79, 84, 90, 70, 79, 84, 84, 93, 81,
+  89, 79, 97, 75, 79, 81, 78, 82, 94, 81,
+  79, 81, 83, 83, 73, 64, 92, 79, 86, 85,
+  83, 89, 83, 137, 155, 78, 83, 85, 82, 100,
+  102, 84, 83, 83, 92, 88, 89, 76, 80, 101,
+  84, 85, 100, 85, 85, 98, 76, 92, 70, 92,
+  89, 58, 88, 86, 83, 90, 91, 85, 92, 77,
+  72, 78, 74, 74, 85, 84, 97, 78, 82, 93,
+  86, 89, 79, 69, 72, 79, 83, 81, 89, 84,
+  83, 81, 81, 90, 81, 78, 80, 92, 99, 79,
+  86, 77, 84, 69, 94, 86, 84, 100, 87, 73,
+  91, 82, 84, 70, 78, 86, 75, 79, 79, 96,
+  79, 88, 84, 89, 69, 81, 87, 84, 85, 78,
+  83, 86, 66, 70, 85, 79, 93, 80, 83, 78,
+  85, 75, 83, 84, 78, 76, 85, 80, 79, 73,
+  87, 77, 75, 80, 85, 90, 85, 86, 83, 93,
+  81, 158, 111, 76, 85, 86, 79, 89, 93, 84,
+  77, 86, 93, 90, 88, 80, 78, 87, 65, 83,
+  82, 86, 81, 93, 76, 89, 73, 84, 81, 92,
+  88, 91, 97, 104, 84, 84, 84, 74, 63, 72,
+  73, 52, 72, 86, 91, 82, 82, 84, 87, 90,
+  78, 75, 79, 98, 82, 82, 79, 80, 89, 82,
+  80, 93, 92, 80, 80, 86, 94, 78, 85, 88,
+  95, 81, 76, 82, 84, 99, 88, 74, 88, 69,
+  84, 69, 81, 87, 80, 75, 87, 90, 77, 84,
+  87, 92, 77, 83, 88, 83, 92, 77, 85, 87,
+  68, 77, 85, 82, 89, 84, 89, 78, 98, 74,
+  82, 86, 77, 86, 86, 80, 84, 81, 89, 86,
+  73, 90, 92, 80, 87, 86, 77, 92, 83, 152,
+  84, 87, 89, 89, 79, 94, 105, 84, 86, 82,
+  94, 87, 85, 77, 78, 90, 87, 83, 100, 83,
+  85, 93, 76, 91, 80, 90, 86, 130, 89, 84,
+  107, 89, 94, 84, 83, 78, 76, 78, 81, 66,
+  86, 81, 78, 80, 73, 91, 80, 79, 67, 95,
+  84, 82, 77, 99, 87, 72, 68, 87, 74, 71,
+  84, 91, 87, 70, 77, 88, 79, 68, 101, 84,
+  111, 91, 79, 83, 77, 82, 70, 90, 111, 86,
+  73, 72, 88, 88, 82, 62, 78, 70, 93, 86,
+  83, 64, 141, 72, 85, 88, 83, 70, 94, 91,
+  116, 75, 82, 69, 126, 76, 74, 77, 91, 79,
+  74, 77, 70, 115, 87, 84, 74, 67, 73, 89,
+  101, 94, 86, 92, 73, 81, 77, 80, 85, 85,
+  95, 80, 72, 99, 92, 68, 90, 69, 97, 84,
+  90, 91, 88, 72, 92, 91, 88, 79, 71, 90,
+  91, 77, 74, 75, 71, 85, 115, 102, 74, 80,
+  76, 87, 94, 95, 69, 74, 72, 90, 85, 83,
+  74, 86, 69, 95, 79, 85, 72, 95, 92, 86,
+  74, 100, 84, 66, 76, 95, 79, 77, 83, 90,
+  84, 71, 83, 84, 81, 74, 97, 88, 73, 76,
+  65, 86, 76, 86, 57, 89, 88, 87, 72, 74,
+  78, 80, 86, 68, 83, 69, 93, 77, 77, 64,
+  132, 74, 90, 89, 79, 61, 99, 89, 100, 81,
+  85, 68, 125, 78, 80, 74, 87, 77, 77, 65,
+  72, 105, 88, 86, 78, 71, 71, 86, 94, 93,
+  90, 88, 74, 85, 76, 82, 83, 78, 84, 85,
+  75, 92, 82, 71, 90, 77, 91, 88, 87, 86,
+  86, 66, 94, 90, 85, 66, 75, 86, 93, 79,
+  74, 75, 72, 82, 105, 82, 76, 79, 77, 81,
+  78, 92, 74, 78, 74, 84, 85, 67, 76, 84,
+  74, 93, 80, 78, 64, 90, 89, 85, 77, 103,
+  85, 76, 70, 84, 69, 74, 81, 91, 80, 68,
+  78, 89, 76, 69, 107, 86, 96, 77, 81, 87,
+  77, 84, 71, 91, 118, 85, 73, 71, 88, 87,
+  84, 63, 78, 69, 92, 76, 86, 66, 139, 79,
+  87, 85, 86, 65, 95, 93, 110, 77, 83, 74,
+  123, 75, 79, 74, 90, 76, 78, 84, 67, 111,
+  90, 81, 80, 70, 80, 91, 109, 88, 88, 94,
+  75, 96, 79, 81, 82, 77, 92, 86, 75, 94,
+  89, 70, 89, 68, 96, 87, 91, 88, 85, 73,
+  92, 91, 90, 79, 70, 90, 99, 75, 74, 77,
+  72, 86, 108, 91, 74, 84, 76, 90, 78, 94,
+  73, 73, 72, 91, 83, 83, 82, 79, 73, 87,
+  81, 82, 79, 83, 82, 81, 85, 85, 95, 84,
+  79, 78, 72, 88, 89, 84, 86, 75, 76, 94,
+  82, 89, 85, 84, 95, 82, 81, 81, 89, 77,
+  74, 79, 80, 82, 88, 80, 87, 76, 87, 71,
+  76, 87, 76, 80, 85, 83, 106, 75, 98, 87,
+  89, 86, 88, 78, 92, 77, 86, 71, 102, 79,
+  79, 90, 86, 83, 76, 74, 78, 93, 90, 69,
+  85, 84, 71, 87, 86, 76, 85, 65, 83, 77,
+  79, 82, 83, 84, 68, 88, 83, 78, 80, 87,
+  82, 78, 83, 85, 89, 82, 76, 77, 89, 88,
+  81, 78, 91, 88, 95, 84, 62, 83, 87, 85,
+  81, 91, 87, 84, 79, 80, 87, 87, 84, 84,
+  85, 89, 82, 92, 81, 87, 75, 87, 79, 82,
+  85, 83, 81, 86, 83, 81, 90, 89, 87, 85,
+  80, 89, 90, 82, 85, 79, 77, 87, 78, 95,
+  81, 83, 70, 77, 83, 87, 87, 76, 70, 79,
+  80, 86, 84, 84, 85, 77, 85, 73, 76, 80,
+  76, 80, 84, 83, 99, 82, 99, 86, 90, 83,
+  91, 79, 88, 79, 80, 71, 103, 82, 80, 93,
+  80, 81, 81, 68, 77, 88, 90, 70, 86, 83,
+  72, 74, 84, 77, 84, 68, 85, 84, 82, 81,
+  81, 75, 59, 85, 84, 75, 76, 90, 80, 85,
+  79, 86, 87, 81, 70, 77, 91, 88, 80, 71,
+  86, 83, 93, 80, 70, 85, 90, 79, 78, 81,
+  74, 85, 81, 76, 74, 86, 86, 86, 88, 83,
+  80, 87, 83, 92, 84, 86, 82, 85, 76, 79,
+  85, 83, 85, 87, 93, 89, 79, 80, 72, 88,
+  90, 83, 84, 75, 77, 92, 72, 87, 86, 81,
+  90, 77, 90, 85, 88, 77, 72, 84, 88, 84,
+  80, 79, 85, 81, 82, 73, 74, 82, 76, 83,
+  89, 80, 106, 84, 94, 85, 93, 84, 87, 76,
+  96, 71, 82, 75, 102, 74, 78, 91, 83, 78,
+  83, 76, 77, 90, 87, 68, 86, 82, 78, 76,
+  88, 75, 82, 65, 82, 86, 81, 81, 83, 77,
+  71, 85, 84, 71, 82, 85, 81, 76, 83, 85,
+  89, 83, 73, 92, 87, 90, 81, 82, 91, 85,
+  93, 80, 70, 86, 87, 83, 83, 82, 79, 86,
+  81, 84, 77, 87, 82, 82, 87, 90, 80, 90,
+  83, 82, 76, 90, 87, 85, 82, 74, 78, 82,
+  85, 68, 91, 87, 89, 81, 82, 91, 92, 85,
+  82, 88, 85, 88, 85, 98, 90, 83, 86, 84,
+  85, 82, 100, 84, 85, 79, 80, 79, 84, 88,
+  81, 86, 90, 89, 85, 98, 76, 83, 86, 98,
+  68, 88, 93, 91, 91, 95, 87, 78, 76, 77,
+  88, 77, 85, 75, 82, 90, 88, 87, 84, 82,
+  92, 88, 83, 87, 82, 92, 83, 89, 81, 80,
+  87, 70, 88, 89, 86, 83, 81, 77, 91, 88,
+  73, 82, 80, 96, 84, 85, 80, 84, 86, 84,
+  92, 89, 87, 83, 78, 78, 93, 81, 97, 92,
+  74, 99, 94, 87, 99, 82, 95, 84, 85, 87,
+  88, 84, 83, 88, 91, 80, 88, 92, 85, 85,
+  86, 88, 81, 94, 84, 74, 69, 82, 81, 66,
+  82, 94, 91, 84, 88, 88, 89, 88, 83, 89,
+  91, 79, 80, 100, 88, 79, 74, 83, 86, 83,
+  92, 79, 84, 85, 84, 84, 85, 84, 83, 85,
+  84, 88, 80, 88, 73, 89, 89, 92, 67, 88,
+  84, 87, 88, 94, 89, 81, 77, 79, 84, 79,
+  85, 76, 86, 92, 85, 90, 85, 86, 91, 88,
+  79, 86, 81, 89, 83, 80, 78, 82, 84, 77,
+  88, 90, 87, 86, 85, 77, 86, 79, 74, 80,
+  78, 98, 82, 87, 81, 84, 82, 77, 90, 88,
+  88, 82, 81, 76, 86, 79, 87, 86, 83, 98,
+  92, 80, 98, 86, 87, 85, 82, 86, 86, 86,
+  78, 86, 89, 81, 87, 92, 86, 93, 94, 90,
+  85, 92, 82, 70, 78, 83, 83, 69, 85, 93,
+  88, 81, 80, 89, 91, 88, 86, 87, 90, 85,
+  81, 92, 90, 83, 80, 82, 82, 82, 100, 74,
+  83, 90, 81, 82, 83, 85, 82, 87, 79, 90,
+  88, 96, 76, 88, 90, 94, 69, 89, 88, 87,
+  90, 91, 88, 79, 78, 76, 87, 78, 80, 73,
+  88, 90, 88, 90, 86, 90, 82, 83, 84, 87,
+  84, 94, 86, 74, 79, 80, 87, 67, 88, 85,
+  85, 83, 86, 78, 92, 86, 76, 72, 82, 94,
+  82, 83, 82, 84, 86, 84, 93, 88, 83, 85,
+  84, 83, 98, 79, 93, 90, 81, 99, 89, 77,
+  97, 85, 89, 83, 84, 90, 92, 85, 81, 86,
+  93, 85, 87, 92, 80, 86, 90, 83, 90, 88,
+  76, 76, 68, 76, 79, 75, 101, 80, 83, 92,
+  76, 70, 81, 71, 72, 84, 97, 81, 81, 74,
+  79, 78, 102, 77, 82, 94, 78, 90, 70, 81,
+  83, 84, 94, 82, 79, 76, 83, 85, 81, 76,
+  84, 89, 81, 75, 83, 107, 81, 77, 74, 104,
+  90, 73, 91, 83, 88, 75, 82, 71, 83, 63,
+  85, 97, 92, 90, 91, 71, 88, 81, 79, 90,
+  87, 86, 87, 78, 74, 79, 73, 92, 83, 81,
+  85, 82, 73, 80, 77, 84, 78, 80, 83, 71,
+  83, 77, 90, 84, 76, 92, 82, 83, 93, 81,
+  96, 96, 89, 66, 86, 88, 81, 100, 79, 86,
+  75, 86, 91, 91, 70, 86, 74, 85, 84, 72,
+  89, 78, 78, 84, 128, 88, 113, 82, 76, 76,
+  64, 86, 77, 64, 121, 86, 85, 76, 69, 36,
+  88, 61, 75, 106, 78, 70, 80, 70, 64, 84,
+  94, 78, 84, 82, 68, 98, 79, 97, 88, 87,
+  95, 114, 77, 74, 73, 84, 77, 63, 82, 100,
+  80, 85, 77, 129, 79, 91, 44, 97, 44, 72,
+  98, 77, 91, 71, 74, 67, 82, 79, 85, 85,
+  80, 76, 118, 72, 63, 77, 81, 69, 89, 109,
+  86, 67, 87, 70, 64, 81, 96, 77, 97, 117,
+  98, 76, 63, 89, 79, 68, 73, 73, 86, 71,
+  85, 82, 78, 89, 77, 84, 85, 74, 91, 105,
+  77, 53, 105, 82, 68, 101, 91, 81, 91, 80,
+  84, 87, 77, 87, 76, 75, 103, 71, 72, 80,
+  79, 76, 106, 81, 90, 90, 81, 75, 71, 78,
+  75, 78, 87, 94, 79, 94, 84, 73, 84, 66,
+  90, 82, 83, 87, 77, 74, 82, 74, 87, 75,
+  95, 90, 73, 78, 66, 85, 88, 81, 82, 79,
+  76, 78, 76, 82, 87, 89, 83, 85, 85, 71,
+  85, 89, 87, 78, 79, 64, 94, 75, 80, 90,
+  98, 77, 81, 77, 83, 65, 93, 110, 84, 87,
+  86, 78, 97, 83, 84, 90, 89, 90, 81, 80,
+  68, 76, 76, 70, 78, 74, 104, 82, 71, 83,
+  80, 93, 83, 82, 81, 75, 88, 76, 91, 88,
+  70, 95, 91, 81, 92, 82, 78, 88, 87, 75,
+  91, 96, 79, 83, 87, 83, 88, 84, 87, 91,
+  85, 85, 79, 86, 78, 78, 87, 80, 79, 86,
+  100, 89, 91, 95, 72, 77, 74, 81, 84, 77,
+  99, 93, 81, 80, 71, 70, 81, 72, 80, 89,
+  94, 85, 95, 74, 82, 82, 101, 96, 85, 94,
+  78, 83, 89, 82, 102, 92, 79, 70, 89, 76,
+  80, 77, 80, 94, 91, 87, 82, 76, 79, 98,
+  89, 74, 76, 83, 86, 74, 91, 92, 91, 83,
+  71, 73, 89, 60, 82, 106, 81, 79, 87, 73,
+  91, 83, 83, 92, 90, 85, 73, 76, 71, 75,
+  70, 92, 83, 81, 81, 80, 67, 89, 78, 69,
+  82, 91, 82, 71, 91, 80, 82, 76, 81, 74,
+  80, 82, 78, 86, 86, 95, 89, 75, 93, 92,
+  81, 101, 89, 75, 83, 93, 97, 86, 74, 86,
+  82, 89, 82, 76, 91, 76, 78, 83, 118, 85,
+  113, 92, 77, 76, 65, 88, 76, 65, 124, 88,
+  88, 69, 66, 43, 77, 63, 84, 107, 82, 71,
+  80, 71, 66, 87, 96, 81, 81, 77, 74, 99,
+  97, 97, 95, 88, 98, 114, 93, 75, 83, 78,
+  85, 74, 89, 101, 82, 88, 75, 115, 79, 91,
+  51, 106, 42, 75, 99, 79, 79, 80, 67, 66,
+  86, 75, 77, 90, 73, 61, 112, 68, 70, 84,
+  86, 76, 83, 102, 75, 66, 86, 72, 65, 79,
+  90, 70, 91, 106, 97, 71, 69, 77, 87, 75,
+  67, 72, 91, 76, 89, 73, 81, 82, 71, 83,
+  87, 72, 80, 107, 80, 57, 108, 80, 73, 97,
+  89, 64, 92, 82, 84, 81, 81, 86, 80, 74,
+  101, 72, 75, 73, 87, 85, 86, 87, 88, 93,
+  78, 76, 80, 85, 81, 80, 100, 80, 81, 84,
+  78, 77, 83, 69, 87, 76, 92, 85, 79, 73,
+  85, 79, 90, 82, 86, 88, 74, 83, 88, 88,
+  113, 87, 97, 65, 84, 83, 84, 78, 85, 95,
+  82, 89, 88, 72, 77, 75, 88, 79, 84, 81,
+  94, 75, 86, 93, 90, 90, 73, 78, 83, 68,
+  76, 104, 79, 76, 100, 78, 102, 83, 87, 85,
+  91, 85, 80, 82, 71, 76, 76, 75, 77, 70,
+  101, 76, 70, 85, 80, 81, 85, 92, 85, 75,
+  92, 80, 100, 77, 78, 92, 87, 80, 79, 77,
+  71, 89, 87, 82, 81, 88, 82, 87, 80, 67,
+  97, 88, 92, 87, 85, 88, 89, 87, 79, 76,
+  90, 79, 83, 89, 99, 87, 79, 99, 79, 75,
+  71, 75, 84, 68, 92, 91, 77, 72, 72, 64,
+  81, 82, 85, 84, 92, 80, 89, 72, 89, 81,
+  93, 93, 91, 88, 93, 82, 90, 90, 115, 91,
+  69, 78, 90, 71, 72, 76, 77, 91, 101, 90,
+  84, 67, 83, 99, 86, 76, 80, 66, 90, 79,
+  85, 86, 94, 82, 79, 61, 91, 61, 88, 89,
+  82, 80, 95, 74, 85, 84, 82, 88, 78, 91,
+  69, 78, 71, 88, 70, 84, 81, 84, 80, 84,
+  80, 87, 91, 76, 86, 86, 88, 74, 97, 75,
+  78, 75, 76, 80, 79, 81, 79, 79, 89, 87,
+  87, 74, 96, 85, 78, 90, 88, 79, 83, 90,
+  92, 87, 80, 83, 80, 80, 92, 82, 83, 86,
+  87, 88, 105, 89, 84, 102, 78, 74, 71, 85,
+  83, 54, 108, 69, 84, 72, 71, 54, 85, 71,
+  86, 90, 86, 78, 82, 73, 78, 92, 83, 84,
+  84, 82, 82, 91, 117, 100, 117, 89, 83, 98,
+  85, 75, 84, 73, 78, 86, 102, 111, 93, 76,
+  76, 85, 83, 88, 74, 84, 64, 76, 86, 85,
+  91, 87, 69, 51, 76, 72, 88, 79, 84, 68,
+  103, 71, 80, 82, 78, 72, 75, 115, 56, 71,
+  80, 71, 77, 86, 78, 74, 83, 98, 70, 82,
+  79, 79, 93, 82, 78, 67, 98, 77, 84, 75,
+  70, 79, 73, 83, 80, 80, 82, 88, 92, 71,
+  97, 73, 74, 86, 66, 77, 103, 89, 89, 84,
+  88, 90, 80, 72, 98, 77, 77, 99, 89, 85,
+  79, 87, 74, 89, 84, 78, 76, 82, 82, 76,
+  99, 75, 81, 75, 73, 74, 84, 75, 82, 74,
+  94, 84, 79, 76, 85, 81, 83, 72, 86, 85,
+  87, 88, 89, 92, 121, 87, 93, 75, 90, 76,
+  92, 78, 76, 88, 93, 94, 87, 69, 86, 88,
+  83, 80, 87, 88, 95, 84, 85, 83, 91, 86,
+  85, 68, 88, 64, 85, 90, 85, 87, 91, 75,
+  89, 83, 83, 80, 79, 85, 83, 77, 75, 94,
+  76, 78, 76, 76, 90, 82, 84, 80, 87, 85,
+  85, 88, 84, 76, 94, 77, 98, 73, 73, 84,
+  86, 78, 74, 74, 71, 88, 82, 76, 79, 80,
+  82, 82, 83, 78, 104, 86, 89, 84, 84, 85,
+  85, 80, 94, 80, 84, 87, 80, 106, 84, 93,
+  76, 75, 75, 87, 80, 78, 74, 78, 91, 80,
+  64, 97, 80, 83, 84, 101, 75, 66, 79, 76,
+  72, 64, 90, 77, 107, 98, 92, 79, 87, 83,
+  76, 95, 95, 87, 114, 80, 79, 92, 83, 87,
+  76, 75, 88, 92, 81, 76, 94, 86, 86, 79,
+  77, 110, 87, 92, 97, 83, 74, 85, 97, 81,
+  82, 73, 93, 73, 71, 94, 108, 82, 83, 89,
+  67, 79, 74, 73, 99, 75, 84, 86, 81, 95,
+  88, 80, 89, 89, 86, 81, 89, 94, 80, 74,
+  89, 84, 83, 78, 86, 88, 95, 91, 87, 78,
+  85, 90, 80, 85, 77, 72, 77, 80, 76, 77,
+  84, 90, 49, 90, 87, 92, 83, 94, 81, 73,
+  84, 95, 74, 79, 81, 111, 68, 91, 74, 90,
+  77, 85, 76, 85, 79, 83, 95, 58, 66, 93,
+  73, 84, 78, 87, 74, 79, 88, 84, 80, 77,
+  88, 86, 79, 107, 85, 79, 84, 85, 87, 100,
+  83, 85, 115, 81, 84, 99, 81, 81, 89, 78,
+  84, 97, 85, 75, 90, 82, 87, 84, 77, 101,
+  94, 72, 85, 84, 76, 86, 81, 74, 68, 83,
+  87, 76, 69, 77, 117, 83, 84, 80, 80, 86,
+  75, 94, 90, 89, 82, 86, 83, 84, 85, 71,
+  83, 90, 61, 78, 88, 82, 85, 71, 92, 80,
+  85, 88, 88, 90, 86, 99, 84, 77, 85, 86,
+  83, 83, 84, 73, 76, 76, 80, 79, 67, 91,
+  60, 83, 90, 86, 90, 89, 81, 80, 81, 87,
+  76, 92, 79, 104, 72, 87, 83, 83, 86, 94,
+  82, 77, 78, 78, 89, 64, 78, 88, 85, 88,
+  86, 78, 82, 96, 93, 85, 83, 91, 79, 89,
+  88, 99, 84, 80, 84, 88, 79, 82, 66, 82,
+  98, 93, 87, 91, 86, 81, 91, 85, 89, 82,
+  80, 88, 91, 86, 90, 88, 81, 82, 87, 69,
+  73, 82, 93, 76, 78, 65, 78, 78, 93, 83,
+  90, 83, 93, 79, 84, 80, 91, 83, 86, 81,
+  95, 94, 91, 80, 80, 81, 86, 70, 86, 80,
+  69, 76, 79, 86, 83, 77, 82, 76, 82, 97,
+  88, 86, 75, 100, 76, 78, 86, 85, 81, 83,
+  86, 79, 78, 84, 88, 90, 63, 92, 86, 85,
+  91, 83, 99, 91, 83, 79, 86, 91, 77, 92,
+  79, 95, 85, 86, 71, 66, 80, 83, 85, 74,
+  71, 91, 78, 100, 58, 82, 75, 77, 90, 88,
+  79, 70, 78, 72, 72, 73, 98, 79, 82, 76,
+  88, 77, 81, 79, 49, 78, 74, 82, 83, 79,
+  72, 88, 75, 80, 74, 78, 90, 82, 84, 78,
+  96, 85, 87, 82, 73, 102, 86, 93, 84, 80,
+  73, 88, 109, 87, 87, 70, 100, 86, 80, 92,
+  73, 83, 78, 82, 71, 77, 85, 54, 104, 72,
+  82, 89, 73, 90, 87, 85, 88, 90, 102, 86,
+  86, 95, 77, 80, 82, 86, 81, 79, 80, 83,
+  89, 102, 89, 78, 87, 87, 83, 85, 92, 79,
+  82, 72, 76, 78, 89, 108, 66, 94, 90, 98,
+  93, 86, 81, 77, 80, 94, 76, 72, 86, 110,
+  96, 91, 79, 68, 81, 82, 79, 86, 87, 78,
+  85, 78, 63, 89, 78, 77, 82, 80, 82, 74,
+  80, 82, 82, 75, 85, 83, 64, 126, 89, 71,
+  83, 78, 78, 86, 114, 96, 111, 77, 100, 100,
+  62, 73, 80, 76, 88, 101, 87, 70, 88, 74,
+  81, 87, 83, 98, 87, 79, 72, 82, 77, 89,
+  78, 89, 57, 94, 82, 70, 73, 80, 62, 74,
+  79, 79, 78, 77, 87, 64, 87, 83, 76, 78,
+  77, 80, 93, 92, 72, 97, 71, 71, 77, 80,
+  88, 80, 87, 82, 90, 84, 93, 84, 90, 102,
+  89, 78, 77, 87, 73, 83, 87, 78, 88, 81,
+  77, 67, 74, 90, 57, 89, 96, 92, 99, 79,
+  82, 77, 78, 83, 82, 86, 85, 109, 119, 93,
+  93, 106, 84, 89, 83, 85, 90, 72, 89, 75,
+  82, 88, 92, 87, 86, 81, 87, 98, 102, 85,
+  91, 91, 71, 89, 83, 148, 91, 82, 86, 80,
+  94, 96, 96, 82, 98, 83, 96, 94, 70, 77,
+  91, 90, 92, 123, 81, 85, 81, 74, 81, 86,
+  94, 54, 81, 74, 67, 81, 91, 77, 63, 58,
+  56, 85, 75, 76, 80, 69, 70, 82, 81, 81,
+  93, 83, 92, 64, 61, 91, 83, 68, 84, 101,
+  91, 87, 77, 89, 56, 74, 81, 66, 86, 83,
+  82, 77, 87, 93, 83, 77, 84, 87, 78, 80,
+  81, 77, 75, 80, 80, 84, 98, 90, 82, 79,
+  53, 76, 78, 90, 92, 81, 93, 92, 86, 79,
+  79, 78, 82, 100, 86, 87, 92, 92, 72, 90,
+  80, 81, 89, 75, 66, 84, 84, 97, 71, 75,
+  80, 79, 94, 81, 78, 88, 79, 76, 82, 89,
+  86, 89, 90, 75, 87, 79, 72, 82, 70, 90,
+  58, 91, 72, 88, 73, 82, 76, 82, 81, 82,
+  82, 91, 87, 79, 93, 91, 82, 80, 78, 86,
+  87, 83, 83, 86, 85, 82, 94, 86, 94, 74,
+  86, 94, 78, 77, 78, 83, 82, 83, 79, 78,
+  86, 82, 84, 78, 87, 84, 73, 95, 87, 85,
+  93, 90, 100, 92, 82, 91, 80, 82, 90, 77,
+  83, 76, 76, 73, 87, 90, 86, 73, 94, 84,
+  89, 88, 88, 80, 93, 68, 82, 84, 81, 101,
+  101, 88, 84, 88, 92, 91, 84, 89, 76, 94,
+  79, 71, 85, 75, 77, 92, 81, 69, 76, 80,
+  80, 82, 83, 73, 86, 95, 86, 82, 85, 82,
+  84, 79, 87, 81, 63, 84, 85, 87, 88, 79,
+  75, 84, 79, 66, 83, 80, 78, 69, 83, 92,
+  79, 84, 83, 80, 69, 82, 80, 82, 83, 65,
+  87, 82, 84, 84, 86, 85, 87, 92, 80, 86,
+  77, 86, 85, 92, 90, 97, 77, 86, 93, 85,
+  79, 89, 63, 73, 87, 84, 80, 76, 89, 72,
+  96, 79, 84, 79, 76, 68, 96, 87, 78, 86,
+  89, 81, 71, 95, 81, 87, 84, 81, 84, 87,
+  86, 79, 79, 78, 81, 74, 91, 94, 73, 88,
+  77, 84, 96, 83, 81, 66, 82, 104, 72, 88,
+  87, 83, 104, 80, 79, 85, 84, 91, 78, 80,
+  83, 83, 102, 94, 88, 63, 82, 91, 85, 87,
+  93, 74, 83, 90, 95, 101, 92, 88, 90, 82,
+  93, 87, 79, 90, 88, 92, 84, 86, 81, 142,
+  82, 70, 99, 80, 96, 69, 122, 95, 83, 84,
+  95, 77, 66, 82, 89, 90, 89, 88, 82, 89,
+  76, 77, 83, 88, 103, 57, 88, 91, 75, 83,
+  91, 84, 77, 87, 70, 87, 78, 84, 77, 94,
+  39, 75, 91, 86, 93, 89, 88, 68, 76, 82,
+  88, 66, 86, 82, 98, 89, 64, 74, 77, 82,
+  72, 88, 85, 87, 81, 85, 85, 93, 82, 85,
+  87, 73, 75, 78, 89, 93, 72, 86, 68, 93,
+  103, 92, 87, 68, 81, 83, 63, 91, 93, 83,
+  88, 86, 76, 85, 85, 83, 78, 101, 91, 123,
+  66, 92, 87, 82, 81, 84, 81, 82, 82, 74,
+  88, 76, 70, 62, 75, 84, 85, 84, 74, 85,
+  82, 89, 79, 81, 102, 88, 98, 90, 95, 102,
+  67, 89, 76, 81, 113, 84, 80, 93, 86, 72,
+  102, 67, 89, 80, 90, 99, 68, 79, 76, 88,
+  87, 81, 71, 83, 64, 70, 68, 88, 101, 82,
+  89, 84, 75, 72, 69, 91, 78, 100, 78, 89,
+  81, 82, 90, 68, 86, 68, 109, 79, 80, 93,
+  85, 93, 88, 86, 96, 88, 74, 105, 77, 98,
+  92, 82, 87, 76, 92, 86, 88, 75, 87, 76,
+  94, 85, 81, 82, 83, 74, 91, 81, 95, 70,
+  85, 100, 89, 90, 72, 85, 78, 100, 88, 81,
+  83, 78, 89, 91, 79, 89, 81, 101, 39, 90,
+  90, 90, 67, 85, 95, 87, 75, 72, 75, 47,
+  65, 75, 77, 81, 82, 83, 70, 77, 75, 90,
+  84, 75, 101, 94, 125, 65, 69, 95, 53, 97,
+  81, 80, 112, 78, 82, 82, 81, 78, 104, 69,
+  84, 97, 89, 91, 72, 75, 70, 92, 88, 69,
+  89, 96, 64, 60, 74, 85, 85, 74, 85, 71,
+  49, 54, 45, 81, 83, 95, 117, 92, 76, 77,
+  96, 70, 89, 88, 117, 72, 80, 79, 95, 81,
+  98, 75, 87, 96, 61, 83, 72, 115, 79, 69,
+  107, 71, 85, 75, 97, 77, 80, 130, 94, 85,
+  83, 69, 79, 85, 76, 73, 78, 57, 77, 95,
+  82, 88, 72, 74, 73, 83, 65, 73, 77, 76,
+  90, 82, 82, 69, 75, 78, 44, 75, 73, 102,
+  73, 103, 76, 90, 79, 65, 61, 64, 75, 80,
+  91, 97, 90, 91, 83, 74, 71, 94, 81, 89,
+  87, 85, 110, 55, 68, 83, 87, 90, 64, 76,
+  74, 84, 56, 84, 80, 84, 85, 77, 86, 102,
+  76, 70, 88, 83, 85, 80, 84, 73, 109, 67,
+  101, 73, 85, 70, 72, 85, 85, 72, 31, 72,
+  73, 74, 95, 76, 98, 74, 109, 89, 81, 98,
+  75, 89, 74, 86, 82, 88, 95, 84, 94, 73,
+  91, 89, 69, 74, 112, 94, 74, 88, 120, 74,
+  89, 80, 83, 80, 58, 140, 81, 90, 76, 69,
+  75, 81, 70, 81, 78, 69, 84, 78, 72, 95,
+  60, 83, 89, 77, 75, 83, 90, 86, 95, 76,
+  82, 86, 90, 94, 73, 85, 84, 78, 86, 77,
+  71, 74, 87, 82, 78, 87, 93, 75, 87, 90,
+  89, 90, 79, 80, 84, 85, 77, 76, 91, 82,
+  79, 93, 101, 100, 94, 84, 98, 73, 91, 88,
+  88, 77, 83, 74, 92, 80, 83, 75, 93, 75,
+  71, 75, 71, 85, 89, 89, 79, 86, 63, 84,
+  78, 85, 99, 86, 90, 86, 83, 91, 87, 87,
+  77, 84, 78, 78, 77, 95, 84, 71, 80, 94,
+  93, 76, 91, 83, 79, 82, 84, 87, 97, 86,
+  97, 91, 88, 75, 97, 87, 72, 81, 87, 94,
+  84, 80, 74, 64, 82, 80, 75, 99, 92, 89,
+  74, 84, 84, 94, 84, 84, 86, 93, 74, 95,
+  82, 100, 80, 88, 67, 74, 79, 82, 79, 109,
+  84, 114, 79, 95, 98, 75, 86, 68, 93, 78,
+  84, 82, 84, 85, 94, 83, 82, 78, 93, 79,
+  72, 62, 92, 91, 90, 82, 79, 101, 87, 85,
+  103, 98, 80, 90, 90, 68, 95, 94, 84, 78,
+  94, 82, 102, 67, 73, 75, 105, 89, 67, 83,
+  76, 87, 85, 82, 77, 72, 45, 81, 73, 99,
+  91, 63, 83, 78, 79, 70, 75, 85, 72, 83,
+  64, 99, 65, 88, 88, 65, 95, 82, 96, 75,
+  86, 92, 86, 88, 89, 97, 86, 86, 81, 87,
+  78, 79, 97, 95, 63, 81, 90, 93, 103, 68,
+  76, 68, 89, 80, 78, 78, 94, 96, 84, 79,
+  90, 87, 74, 90, 94, 89, 75, 91, 84, 88,
+  85, 81, 82, 76, 78, 83, 87, 87, 77, 106,
+  62, 88, 72, 122, 71, 76, 88, 94, 74, 64,
+  65, 70, 70, 71, 87, 76, 85, 99, 78, 75,
+  103, 95, 84, 83, 86, 88, 101, 84, 78, 96,
+  69, 83, 67, 101, 101, 78, 84, 75, 85, 91,
+  90, 69, 77, 96, 88, 136, 87, 76, 74, 67,
+  85, 66, 100, 64, 75, 64, 73, 79, 85, 78,
+  91, 67, 49, 64, 59, 84, 91, 79, 98, 101,
+  81, 83, 89, 82, 79, 81, 89, 78, 79, 87,
+  101, 95, 94, 88, 96, 100, 71, 72, 86, 79,
+  77, 77, 92, 63, 86, 78, 92, 69, 72, 136,
+  92, 89, 74, 72, 79, 82, 77, 63, 72, 83,
+  69, 95, 76, 97, 84, 84, 80, 68, 73, 70,
+  84, 71, 87, 72, 85, 81, 86, 91, 85, 85,
+  80, 81, 77, 82, 74, 91, 81, 100, 83, 85,
+  82, 78, 94, 77, 78, 95, 78, 82, 92, 80,
+  76, 74, 101, 76, 79, 94, 89, 86, 93, 78,
+  85, 80, 81, 79, 98, 77, 79, 85, 90, 93,
+  83, 77, 87, 74, 85, 81, 78, 94, 94, 89,
+  85, 88, 83, 82, 94, 88, 85, 93, 86, 89,
+  79, 96, 90, 93, 84, 87, 80, 77, 76, 90,
+  92, 72, 79, 77, 76, 73, 97, 89, 94, 93,
+  79, 83, 87, 87, 90, 86, 95, 70, 93, 77,
+  72, 82, 81, 80, 88, 85, 73, 84, 77, 84,
+  88, 94, 92, 79, 91, 80, 80, 88, 80, 85,
+  83, 84, 85, 87, 89, 92, 73, 94, 69, 74,
+  97, 82, 87, 84, 85, 94, 98, 89, 91, 83,
+  82, 74, 82, 85, 75, 95, 96, 94, 83, 76,
+  88, 73, 77, 82, 81, 83, 95, 85, 70, 74,
+  88, 91, 81, 82, 86, 83, 92, 84, 85, 78,
+  84, 85, 88, 83, 86, 85, 91, 72, 75, 71,
+  86, 78, 91, 84, 80, 93, 89, 82, 81, 76,
+  70, 84, 83, 82, 83, 86, 81, 77, 86, 89,
+  92, 81, 78, 93, 87, 90, 73, 81, 83, 68,
+  84, 89, 74, 81, 89, 82, 91, 96, 80, 93,
+  85, 90, 77, 93, 91, 76, 94, 85, 71, 82,
+  84, 79, 90, 90, 74, 70, 80, 83, 82, 87,
+  85, 85, 95, 73, 85, 89, 79, 82, 94, 84,
+  90, 85, 88, 88, 80, 89, 79, 77, 94, 86,
+  85, 79, 76, 105, 87, 88, 88, 94, 80, 79,
+  90, 89, 80, 82, 76, 91, 62, 69, 80, 76,
+  84, 83, 96, 89, 108, 93, 77, 82, 79, 89,
+  86, 86, 82, 84, 76, 78, 69, 90, 88, 90,
+  83, 85, 101, 84, 98, 72, 82, 88, 87, 116,
+  90, 78, 87, 72, 81, 72, 88, 70, 76, 77,
+  77, 77, 84, 76, 94, 70, 66, 84, 87, 82,
+  94, 78, 83, 98, 77, 80, 87, 76, 86, 94,
+  72, 83, 86, 85, 93, 95, 85, 92, 91, 97,
+  79, 90, 88, 77, 85, 81, 84, 75, 84, 78,
+  99, 84, 75, 77, 86, 87, 73, 77, 80, 85,
+  93, 66, 77, 86, 78, 83, 82, 88, 104, 84,
+  85, 78, 81, 76, 86, 78, 91, 83, 86, 80,
+  104, 107, 89, 83, 44, 92, 83, 84, 83, 83,
+  84, 98, 86, 96, 86, 78, 86, 106, 90, 95,
+  81, 77, 89, 85, 82, 89, 93, 87, 90, 85,
+  82, 89, 83, 76, 73, 78, 90, 87, 68, 75,
+  81, 68, 83, 76, 93, 82, 77, 73, 68, 80,
+  85, 88, 96, 90, 94, 76, 84, 88, 80, 77,
+  89, 63, 112, 88, 90, 85, 84, 88, 81, 76,
+  74, 84, 81, 84, 81, 88, 64, 72, 89, 76,
+  89, 115, 80, 85, 82, 89, 78, 83, 100, 94,
+  73, 90, 84, 83, 84, 83, 89, 95, 81, 88,
+  74, 86, 86, 76, 82, 75, 81, 67, 88, 92,
+  81, 75, 76, 80, 90, 80, 80, 83, 62, 81,
+  80, 81, 83, 76, 81, 82, 88, 78, 99, 102,
+  63, 79, 65, 88, 80, 84, 81, 85, 86, 95,
+  92, 53, 85, 82, 86, 93, 89, 88, 84, 70,
+  76, 97, 88, 81, 92, 86, 88, 83, 82, 89,
+  85, 80, 82, 83, 86, 79, 114, 76, 77, 76,
+  72, 80, 93, 84, 87, 65, 74, 76, 78, 89,
+  88, 87, 92, 83, 79, 78, 87, 85, 82, 71,
+  106, 71, 61, 86, 78, 84, 83, 80, 81, 80,
+  76, 79, 81, 84, 75, 80, 92, 78, 76, 104,
+  76, 86, 81, 78, 75, 93, 85, 91, 71, 87,
+  85, 90, 81, 87, 85, 89, 71, 90, 71, 102,
+  85, 81, 83, 75, 82, 75, 89, 87, 80, 75,
+  78, 76, 76, 87, 69, 87, 73, 84, 82, 87,
+  77, 76, 82, 85, 89, 101, 81, 94, 86, 78,
+  138, 93, 71, 87, 76, 85, 92, 76, 80, 82,
+  70, 91, 82, 73, 86, 70, 76, 87, 82, 101,
+  79, 76, 70, 84, 77, 93, 93, 86, 79, 91,
+  101, 104, 86, 78, 92, 92, 78, 83, 78, 79,
+  100, 88, 100, 90, 98, 76, 78, 89, 72, 92,
+  87, 67, 80, 82, 91, 83, 86, 97, 88, 70,
+  61, 94, 67, 74, 100, 72, 68, 74, 79, 80,
+  95, 82, 87, 98, 92, 83, 76, 83, 83, 95,
+  91, 80, 73, 120, 72, 85, 66, 88, 93, 90,
+  88, 87, 90, 67, 72, 88, 75, 94, 78, 82,
+  81, 65, 77, 86, 86, 76, 95, 86, 77, 80,
+  69, 85, 91, 92, 87, 79, 87, 93, 67, 84,
+  83, 89, 80, 110, 92, 90, 87, 88, 40, 94,
+  98, 76, 85, 81, 83, 81, 78, 66, 98, 85,
+  99, 111, 75, 86, 75, 75, 84, 92, 82, 88,
+  93, 81, 97, 85, 91, 88, 99, 72, 79, 81,
+  86, 88, 63, 71, 76, 78, 77, 77, 86, 85,
+  82, 78, 65, 79, 77, 79, 96, 87, 95, 68,
+  79, 77, 82, 108, 86, 72, 79, 88, 85, 86,
+  77, 115, 84, 84, 86, 85, 75, 88, 85, 95,
+  81, 89, 80, 76, 93, 68, 83, 74, 84, 86,
+  84, 75, 71, 89, 94, 90, 85, 89, 81, 78,
+  82, 102, 90, 86, 69, 108, 86, 77, 93, 85,
+  97, 76, 77, 93, 84, 87, 73, 87, 77, 88,
+  87, 89, 78, 81, 83, 84, 77, 82, 76, 81,
+  86, 79, 87, 86, 68, 83, 76, 83, 84, 76,
+  85, 85, 85, 89, 83, 61, 87, 87, 95, 91,
+  74, 84, 79, 75, 73, 98, 77, 79, 92, 81,
+  93, 83, 82, 91, 89, 78, 62, 86, 75, 86,
+  93, 70, 73, 86, 68, 81, 87, 82, 88, 78,
+  78, 79, 78, 80, 98, 85, 88, 74, 84, 73,
+  83, 105, 87, 77, 75, 70, 61, 81, 76, 95,
+  85, 78, 73, 84, 71, 86, 86, 88, 86, 77,
+  73, 83, 82, 71, 82, 86, 84, 76, 80, 83,
+  72, 89, 85, 83, 80, 100, 76, 81, 81, 93,
+  79, 91, 72, 113, 84, 81, 93, 77, 96, 84,
+  84, 92, 81, 85, 76, 85, 79, 79, 71, 86,
+  78, 80, 82, 82, 83, 82, 79, 80, 84, 91,
+  71, 86, 81, 75, 156, 89, 66, 84, 80, 79,
+  94, 79, 82, 91, 67, 90, 84, 69, 70, 74,
+  74, 99, 83, 93, 80, 67, 70, 77, 89, 80,
+  85, 87, 79, 99, 83, 111, 83, 85, 97, 111,
+  81, 89, 85, 85, 101, 80, 103, 81, 110, 79,
+  81, 91, 74, 94, 76, 81, 85, 79, 85, 84,
+  81, 90, 81, 65, 58, 85, 69, 66, 97, 67,
+  76, 76, 73, 84, 99, 81, 91, 95, 79, 87,
+  82, 74, 88, 96, 91, 85, 74, 106, 77, 75,
+  70, 78, 82, 85, 81, 84, 84, 62, 76, 89,
+  78, 79, 78, 83, 80, 66, 80, 91, 79, 80,
+  85, 97, 81, 88, 72, 75, 93, 83, 78, 74,
+  83, 83, 69, 87, 91, 86, 74, 95, 79, 91,
+  86, 92, 54, 82, 98, 85, 86, 84, 77, 86,
+  72, 61, 100, 100, 96, 95, 71, 77, 82, 74,
+  80, 81, 76, 92, 89, 78, 87, 89, 84, 88,
+  101, 84, 81, 88, 98, 85, 76, 79, 84, 79,
+  77, 89, 79, 89, 71, 79, 67, 78, 69, 87,
+  84, 90, 89, 77, 83, 89, 86, 93, 73, 73,
+  86, 87, 93, 83, 68, 106, 77, 88, 101, 81,
+  88, 86, 86, 100, 89, 74, 88, 70, 88, 87,
+  86, 73, 80, 81, 89, 73, 87, 83, 86, 83,
+  91, 90, 86, 86, 86, 88, 90, 84, 84, 102,
+  90, 78, 98, 90, 91, 84, 70, 76, 87, 87,
+  83, 89, 94, 74, 72, 99, 95, 91, 82, 83,
+  75, 88, 77, 92, 78, 67, 74, 90, 86, 86,
+  88, 79, 86, 76, 80, 80, 83, 87, 75, 97,
+  84, 93, 88, 78, 68, 87, 84, 85, 73, 85,
+  69, 81, 83, 76, 84, 104, 79, 88, 91, 83,
+  65, 89, 95, 82, 79, 81, 89, 83, 66, 93,
+  84, 85, 72, 68, 87, 79, 78, 94, 83, 88,
+  80, 71, 83, 83, 83, 97, 78, 79, 85, 68,
+  72, 79, 82, 85, 80, 87, 82, 81, 77, 92,
+  88, 81, 86, 72, 74, 83, 81, 87, 83, 81,
+  84, 89, 81, 82, 85, 79, 72, 77, 81, 92,
+  76, 88, 81, 78, 86, 88, 84, 90, 83, 80,
+  92, 84, 84, 89, 81, 78, 90, 87, 84, 88,
+  93, 74, 72, 84, 80, 89, 83, 84, 79, 85,
+  82, 90, 79, 80, 69, 94, 89, 81, 143, 91,
+  66, 82, 81, 79, 89, 73, 76, 105, 60, 86,
+  75, 64, 72, 74, 74, 105, 90, 89, 78, 72,
+  73, 76, 77, 84, 80, 87, 80, 92, 85, 105,
+  96, 81, 91, 108, 91, 85, 83, 88, 98, 84,
+  86, 79, 111, 87, 79, 88, 68, 93, 79, 77,
+  81, 75, 88, 83, 82, 85, 85, 71, 67, 74,
+  78, 63, 88, 87, 93, 74, 74, 92, 95, 77,
+  86, 99, 73, 91, 80, 75, 90, 91, 85, 100,
+  77, 105, 80, 68, 68, 83, 87, 81, 83, 81,
+  90, 64, 83, 89, 89, 75, 80, 81, 88, 74,
+  75, 85, 83, 73, 91, 104, 89, 91, 70, 79,
+  91, 81, 83, 87, 91, 81, 71, 86, 93, 94,
+  77, 95, 80, 85, 75, 77, 79, 74, 81, 78,
+  71, 85, 76, 79, 81, 83, 73, 78, 79, 81,
+  76, 86, 91, 74, 67, 82, 77, 86, 84, 88,
+  84, 82, 84, 76, 83, 81, 80, 71, 86, 78,
+  78, 81, 78, 71, 81, 83, 84, 82, 64, 69,
+  87, 80, 88, 94, 76, 82, 79, 89, 76, 76,
+  88, 82, 72, 74, 93, 67, 88, 76, 86, 81,
+  81, 88, 69, 80, 91, 85, 74, 85, 75, 83,
+  85, 93, 78, 84, 76, 87, 73, 79, 81, 70,
+  89, 82, 88, 90, 83, 84, 80, 85, 80, 81,
+  81, 88, 87, 72, 78, 81, 77, 85, 78, 78,
+  85, 76, 80, 72, 77, 83, 85, 86, 78, 82,
+  75, 91, 86, 85, 96, 77, 92, 77, 80, 83,
+  80, 90, 89, 78, 81, 67, 81, 73, 73, 89,
+  75, 82, 91, 85, 76, 78, 77, 77, 75, 79,
+  84, 70, 70, 86, 87, 86, 83, 85, 103, 80,
+  92, 81, 80, 75, 78, 70, 87, 76, 84, 78,
+  79, 63, 83, 86, 77, 82, 70, 69, 84, 84,
+  82, 106, 85, 81, 85, 93, 75, 78, 87, 79,
+  80, 75, 89, 75, 80, 76, 80, 77, 77, 88,
+  81, 70, 79, 84, 77, 78, 71, 77, 89, 81,
+  79, 79, 81, 78, 74, 78, 74, 81, 91, 83,
+  85, 89, 87, 83, 80, 74, 81, 82, 80, 88,
+  86, 81, 72, 78, 75, 82, 73, 81, 86, 75,
+  76, 72, 76, 74, 82, 79, 69, 78, 79, 83,
+  81, 84, 99, 74, 93, 72, 80, 79, 80, 88,
+  80, 77, 76, 71, 85, 87, 71, 86, 76, 83,
+  75, 80, 76, 79, 77, 80, 77, 86, 84, 71,
+  74, 81, 86, 88, 88, 86, 79, 84, 86, 83,
+  81, 76, 75, 88, 93, 82, 75, 80, 81, 71,
+  83, 81, 83, 83, 72, 83, 88, 77, 89, 84,
+  74, 84, 83, 83, 78, 77, 84, 81, 77, 75,
+  90, 65, 88, 76, 83, 83, 80, 86, 76, 79,
+  93, 82, 79, 84, 77, 75, 89, 90, 82, 85,
+  73, 75, 77, 77, 86, 67, 87, 82, 88, 88,
+  83, 85, 82, 86, 83, 80, 74, 85, 83, 90,
+  79, 83, 81, 82, 80, 77, 82, 74, 79, 75,
+  80, 81, 83, 81, 73, 81, 77, 87, 85, 87,
+  90, 76, 85, 75, 84, 82, 99, 101, 105, 90,
+  92, 109, 55, 68, 80, 89, 84, 88, 124, 93,
+  74, 81, 87, 79, 87, 95, 90, 107, 103, 86,
+  85, 67, 77, 96, 172, 84, 87, 101, 90, 98,
+  96, 93, 74, 92, 88, 90, 84, 73, 91, 86,
+  88, 106, 72, 91, 70, 94, 77, 103, 71, 79,
+  73, 78, 67, 57, 95, 90, 84, 89, 79, 42,
+  78, 68, 81, 92, 77, 71, 99, 73, 91, 84,
+  84, 81, 77, 105, 66, 84, 72, 90, 86, 119,
+  66, 89, 95, 102, 59, 83, 90, 76, 84, 85,
+  96, 88, 81, 77, 88, 81, 108, 84, 85, 76,
+  91, 75, 105, 80, 91, 77, 76, 77, 74, 105,
+  65, 96, 96, 89, 77, 71, 79, 85, 94, 70,
+  92, 83, 91, 87, 100, 95, 100, 88, 92, 105,
+  59, 59, 77, 91, 80, 90, 139, 91, 79, 70,
+  79, 73, 77, 89, 88, 100, 109, 86, 92, 72,
+  76, 89, 173, 84, 96, 93, 80, 93, 94, 93,
+  79, 82, 92, 85, 86, 70, 90, 89, 81, 99,
+  71, 97, 68, 94, 74, 119, 80, 72, 74, 90,
+  70, 55, 92, 93, 85, 88, 75, 55, 77, 71,
+  74, 92, 72, 71, 110, 66, 75, 79, 85, 76,
+  74, 106, 73, 75, 68, 83, 87, 96, 71, 86,
+  94, 108, 63, 79, 74, 81, 92, 90, 92, 77,
+  79, 77, 87, 81, 106, 91, 81, 72, 88, 75,
+  91, 81, 84, 72, 74, 78, 66, 97, 66, 85,
+  99, 85, 83, 71, 86, 81, 89, 66, 93, 81,
+  86, 83, 98, 92, 86, 90, 84, 94, 68, 81,
+  80, 92, 86, 86, 111, 81, 78, 80, 81, 80,
+  89, 87, 89, 99, 101, 85, 92, 75, 76, 96,
+  139, 87, 87, 94, 91, 89, 79, 105, 75, 91,
+  84, 88, 80, 75, 85, 82, 85, 103, 77, 102,
+  75, 95, 76, 100, 70, 80, 80, 76, 68, 64,
+  89, 91, 85, 84, 80, 46, 80, 76, 81, 92,
+  81, 64, 97, 74, 92, 79, 89, 85, 78, 95,
+  70, 83, 81, 93, 80, 77, 72, 83, 100, 87,
+  63, 79, 85, 81, 83, 90, 96, 88, 85, 76,
+  84, 79, 96, 93, 85, 77, 93, 75, 100, 75,
+  86, 77, 74, 78, 76, 97, 62, 89, 105, 89,
+  81, 71, 95, 83, 94, 71, 89, 82, 92, 86,
+  83, 79, 84, 87, 74, 82, 80, 81, 78, 80,
+  82, 77, 91, 91, 77, 86, 87, 79, 85, 81,
+  83, 82, 75, 81, 76, 83, 82, 87, 121, 72,
+  90, 88, 79, 89, 85, 69, 75, 79, 74, 98,
+  89, 77, 79, 76, 75, 77, 77, 68, 78, 80,
+  89, 100, 80, 81, 85, 81, 76, 80, 81, 79,
+  80, 72, 84, 70, 80, 77, 85, 71, 82, 86,
+  76, 72, 88, 85, 76, 81, 77, 85, 78, 84,
+  78, 89, 82, 89, 80, 83, 77, 87, 91, 84,
+  85, 94, 81, 82, 87, 74, 84, 81, 82, 91,
+  94, 78, 82, 77, 77, 87, 69, 87, 82, 79,
+  82, 75, 78, 82, 91, 83, 80, 75, 81, 75,
+  80, 81, 88, 81, 75, 87, 83, 81, 86, 85,
+  87, 88, 75, 68, 78, 75, 82, 82, 81, 78,
+  95, 84, 81, 81, 83, 74, 77, 80, 80, 72,
+  84, 84, 78, 85, 81, 83, 132, 78, 92, 91,
+  80, 78, 85, 64, 75, 72, 81, 87, 93, 69,
+  84, 76, 77, 80, 72, 70, 74, 81, 92, 108,
+  86, 79, 91, 93, 79, 79, 79, 78, 80, 74,
+  77, 77, 72, 73, 80, 72, 76, 82, 81, 61,
+  82, 82, 78, 81, 75, 79, 82, 77, 75, 85,
+  84, 81, 83, 83, 71, 91, 86, 85, 84, 94,
+  87, 87, 84, 65, 85, 83, 81, 92, 92, 84,
+  76, 73, 72, 87, 62, 86, 83, 76, 85, 74,
+  74, 72, 84, 78, 71, 75, 85, 73, 79, 78,
+  90, 80, 77, 89, 80, 76, 82, 86, 85, 92,
+  74, 68, 84, 88, 81, 84, 81, 77, 83, 74,
+  78, 85, 84, 78, 83, 85, 80, 75, 90, 81,
+  80, 84, 83, 89, 113, 81, 87, 89, 82, 80,
+  72, 80, 82, 80, 80, 96, 87, 74, 80, 78,
+  76, 81, 80, 84, 78, 80, 89, 93, 78, 82,
+  86, 87, 78, 81, 78, 78, 79, 70, 80, 65,
+  88, 75, 82, 72, 78, 83, 77, 70, 93, 84,
+  84, 80, 79, 78, 80, 81, 83, 91, 83, 79,
+  81, 81, 78, 77, 87, 79, 82, 94, 80, 81,
+  86, 74, 82, 79, 82, 88, 91, 87, 81, 79,
+  75, 85, 74, 86, 78, 75, 81, 76, 78, 78,
+  85, 77, 78, 75, 81, 75, 83, 80, 81, 82,
+  75, 91, 83, 75, 78, 86, 85, 96, 76, 76,
+  75, 76, 96, 82, 67, 80, 84, 73, 87, 73,
+  81, 81, 61, 85, 98, 85, 87, 88, 86, 106,
+  89, 70, 104, 91, 78, 79, 98, 80, 75, 97,
+  88, 79, 85, 87, 108, 81, 99, 90, 71, 98,
+  100, 96, 82, 101, 93, 89, 82, 88, 72, 86,
+  91, 74, 83, 80, 80, 83, 86, 73, 88, 68,
+  85, 91, 87, 92, 84, 81, 83, 79, 90, 75,
+  79, 88, 85, 87, 80, 78, 75, 70, 85, 86,
+  90, 81, 87, 87, 102, 79, 66, 68, 85, 80,
+  82, 84, 83, 77, 82, 82, 67, 61, 83, 73,
+  93, 88, 92, 72, 99, 80, 84, 83, 78, 96,
+  77, 68, 78, 109, 105, 86, 92, 63, 96, 77,
+  77, 91, 82, 89, 85, 97, 86, 74, 71, 72,
+  111, 72, 53, 80, 89, 79, 88, 67, 76, 79,
+  38, 83, 107, 93, 68, 90, 79, 105, 102, 64,
+  102, 84, 71, 83, 106, 83, 83, 80, 89, 74,
+  81, 84, 102, 77, 105, 85, 70, 109, 110, 76,
+  75, 109, 87, 94, 95, 83, 74, 89, 90, 78,
+  79, 77, 79, 92, 90, 74, 82, 68, 86, 81,
+  89, 91, 91, 70, 82, 84, 82, 61, 80, 76,
+  93, 88, 85, 74, 85, 85, 77, 87, 89, 71,
+  87, 98, 96, 76, 53, 57, 78, 70, 52, 84,
+  86, 74, 85, 82, 62, 57, 82, 77, 95, 93,
+  98, 82, 100, 85, 71, 82, 84, 95, 77, 62,
+  83, 116, 102, 88, 89, 61, 104, 85, 65, 101,
+  80, 79, 84, 90, 77, 89, 78, 77, 89, 83,
+  73, 78, 80, 83, 87, 74, 79, 81, 68, 86,
+  95, 84, 72, 86, 83, 102, 90, 68, 96, 80,
+  76, 79, 90, 94, 80, 80, 83, 79, 78, 88,
+  98, 81, 93, 85, 79, 89, 88, 86, 84, 95,
+  89, 84, 80, 87, 75, 79, 91, 74, 80, 83,
+  79, 84, 84, 71, 90, 71, 89, 89, 84, 86,
+  91, 83, 76, 81, 83, 76, 78, 91, 89, 87,
+  74, 80, 83, 101, 87, 80, 87, 82, 87, 94,
+  101, 80, 71, 68, 85, 80, 87, 85, 87, 80,
+  83, 90, 71, 62, 85, 71, 95, 89, 96, 70,
+  93, 90, 85, 88, 78, 89, 81, 73, 79, 105,
+  79, 85, 87, 65, 94, 82, 82, 88, 78, 83,
+  79, 87, 83, 90, 73, 77, 119, 76, 67, 85,
+  85, 81, 86, 73, 92, 86, 47, 83, 104, 89,
+  87, 87, 79, 97, 85, 66, 100, 87, 72, 74,
+  107, 72, 76, 104, 87, 72, 85, 86, 88, 83,
+  104, 88, 78, 103, 103, 111, 83, 106, 87, 85,
+  84, 88, 73, 87, 95, 74, 82, 79, 77, 89,
+  80, 70, 83, 74, 84, 93, 92, 74, 86, 80,
+  84, 81, 82, 75, 88, 99, 75, 88, 87, 73,
+  76, 66, 84, 90, 88, 81, 84, 78, 97, 90,
+  58, 62, 88, 77, 72, 84, 83, 82, 88, 95,
+  69, 62, 80, 88, 87, 82, 84, 73, 90, 79,
+  83, 82, 80, 92, 80, 71, 82, 103, 102, 83,
+  89, 61, 95, 82, 67, 99, 80, 90, 83, 88,
+  89, 78, 68, 83, 148, 63, 56, 86, 92, 77,
+  84, 73, 94, 90, 22, 77, 111, 93, 72, 87,
+  72, 96, 98, 59, 110, 80, 64, 75, 122, 70,
+  81, 84, 82, 72, 83, 85, 78, 74, 110, 81,
+  81, 119, 118, 82, 74, 119, 84, 82, 106, 86,
+  75, 87, 97, 77, 77, 71, 69, 97, 81, 72,
+  64, 73, 95, 79, 96, 72, 80, 64, 92, 87,
+  70, 61, 89, 87, 81, 91, 97, 71, 93, 92,
+  75, 88, 87, 63, 86, 87, 96, 85, 41, 48,
+  75, 66, 41, 79, 88, 76, 82, 85, 61, 57,
+  76, 94, 92, 86, 82, 83, 90, 80, 68, 83,
+  87, 93, 84, 66, 88, 105, 93, 84, 89, 59,
+  98, 83, 52, 110, 85, 81, 86, 82, 85, 88,
+  74, 78, 104, 79, 73, 82, 78, 81, 85, 74,
+  89, 87, 57, 88, 94, 88, 84, 85, 81, 98,
+  83, 68, 92, 79, 77, 76, 97, 90, 83, 85,
+  88, 76, 82, 84, 85, 81, 95, 84, 86, 89,
+  90, 87, 85, 96, 82, 84, 83, 85, 73, 79,
+  90, 75, 84, 84, 80, 88, 80, 69, 86, 78,
+  100, 89, 84, 79, 87, 87, 75, 87, 77, 71,
+  84, 100, 78, 86, 82, 77, 83, 115, 86, 86,
+  84, 84, 83, 86, 94, 80, 67, 68, 83, 80,
+  80, 86, 82, 80, 87, 80, 73, 65, 84, 81,
+  91, 83, 86, 69, 87, 86, 84, 89, 85, 89,
+  88, 77, 79, 100, 70, 86, 85, 66, 89, 83,
+  74, 90, 81, 83, 74, 89, 80, 80, 85, 75,
+  99, 86, 74, 76, 81, 95, 79, 80, 97, 83,
+  69, 82, 91, 78, 78, 77, 83, 93, 80, 72,
+  91, 84, 83, 76, 89, 73, 70, 90, 89, 74,
+  84, 87, 91, 79, 95, 82, 85, 86, 89, 100,
+  93, 97, 85, 90, 71, 78, 71, 89, 87, 83,
+  86, 83, 81, 83, 88, 76, 85, 75, 89, 102,
+  90, 81, 86, 88, 84, 90, 76, 76, 87, 89,
+  85, 85, 73, 92, 72, 67, 95, 88, 86, 89,
+  86, 76, 83, 103, 77, 78, 92, 85, 96, 89,
+  76, 82, 84, 85, 78, 68, 80, 84, 82, 72,
+  78, 61, 88, 82, 95, 86, 87, 83, 80, 82,
+  77, 97, 82, 81, 92, 69, 91, 79, 78, 79,
+  87, 87, 83, 86, 85, 75, 78, 75, 107, 80,
+  67, 80, 86, 89, 74, 77, 96, 83, 52, 87,
+  91, 87, 76, 75, 78, 91, 86, 65, 95, 83,
+  74, 79, 95, 73, 73, 88, 88, 76, 89, 82,
+  84, 70, 92, 78, 83, 80, 93, 83, 89, 106,
+  81, 90, 80, 76, 73, 91, 91, 81, 87, 81,
+  75, 90, 87, 80, 78, 73, 101, 103, 92, 96,
+  74, 82, 90, 88, 69, 69, 83, 89, 87, 82,
+  75, 93, 74, 87, 94, 84, 87, 82, 86, 74,
+  80, 99, 67, 70, 87, 76, 80, 83, 76, 83,
+  86, 92, 75, 63, 82, 95, 78, 80, 81, 62,
+  85, 84, 85, 90, 97, 88, 81, 76, 79, 94,
+  75, 82, 89, 66, 94, 78, 73, 86, 87, 83,
+  90, 84, 80, 77, 87, 78, 93, 89, 75, 75,
+  79, 84, 79, 83, 92, 84, 72, 84, 86, 79,
+  82, 79, 91, 92, 78, 73, 84, 81, 86, 82,
+  88, 80, 79, 86, 93, 77, 86, 87, 87, 78,
+  89, 77, 83, 81, 87, 82, 93, 95, 82, 89,
+  75, 78, 75, 83, 85, 80, 87, 85, 81, 82,
+  84, 77, 86, 76, 97, 96, 85, 86, 80, 94,
+  80, 94, 73, 76, 85, 101, 86, 83, 70, 91,
+  77, 92, 92, 86, 84, 87, 86, 81, 85, 83,
+  82, 77, 83, 84, 97, 88, 72, 86, 84, 83,
+  80, 70, 89, 78, 85, 69, 81, 60, 89, 85,
+  93, 91, 86, 84, 81, 85, 79, 96, 71, 80,
+  86, 70, 87, 77, 82, 76, 78, 86, 89, 93,
+  77, 75, 85, 89, 75, 71, 90, 76, 103, 70,
+  76, 82, 86, 78, 86, 82, 92, 92, 90, 79,
+  83, 74, 98, 71, 101, 85, 90, 93, 72, 87,
+  79, 89, 83, 91, 85, 80, 81, 72, 89, 74,
+  72, 67, 94, 95, 83, 71, 85, 92, 66, 96,
+  79, 90, 73, 90, 79, 86, 87, 93, 87, 79,
+  84, 76, 91, 91, 82, 87, 84, 93, 92, 79,
+  77, 70, 77, 78, 84, 80, 80, 84, 67, 88,
+  67, 79, 79, 82, 83, 89, 76, 81, 65, 97,
+  80, 77, 85, 72, 90, 71, 74, 88, 96, 85,
+  89, 88, 85, 91, 91, 80, 93, 88, 156, 81,
+  100, 81, 90, 69, 81, 100, 94, 90, 87, 108,
+  92, 84, 90, 78, 80, 88, 86, 93, 80, 74,
+  85, 79, 77, 56, 85, 80, 114, 79, 81, 81,
+  91, 81, 82, 78, 98, 88, 81, 78, 87, 69,
+  95, 63, 102, 87, 96, 101, 73, 87, 82, 81,
+  88, 89, 78, 86, 84, 73, 95, 77, 71, 63,
+  95, 80, 80, 67, 83, 93, 67, 99, 74, 90,
+  75, 92, 82, 86, 83, 85, 83, 78, 72, 70,
+  87, 81, 78, 81, 85, 94, 86, 80, 79, 64,
+  74, 83, 88, 79, 85, 79, 69, 81, 64, 77,
+  79, 75, 83, 97, 72, 82, 68, 89, 78, 81,
+  86, 69, 96, 71, 64, 82, 84, 84, 91, 86,
+  79, 90, 91, 84, 96, 88, 156, 82, 100, 79,
+  79, 69, 78, 103, 87, 97, 84, 111, 89, 80,
+  92, 69, 77, 90, 86, 92, 78, 82, 87, 88,
+  75, 73, 91, 80, 103, 84, 76, 82, 84, 78,
+  82, 77, 87, 89, 83, 80, 84, 75, 95, 72,
+  95, 78, 90, 95, 72, 87, 80, 96, 85, 92,
+  68, 80, 84, 77, 93, 76, 78, 74, 93, 78,
+  80, 72, 81, 93, 66, 94, 80, 92, 72, 88,
+  80, 86, 93, 96, 86, 80, 79, 77, 92, 87,
+  79, 81, 94, 93, 93, 79, 81, 75, 75, 96,
+  88, 83, 83, 87, 71, 91, 71, 73, 81, 78,
+  87, 93, 78, 87, 65, 95, 88, 82, 86, 78,
+  82, 73, 71, 88, 95, 85, 88, 89, 77, 95,
+  92, 79, 92, 91, 145, 86, 96, 76, 88, 70,
+  81, 97, 82, 85, 86, 104, 89, 84, 91, 79,
+  80, 81, 92, 86, 80, 83, 80, 90, 71, 58,
+  92, 76, 102, 76, 85, 80, 92, 78, 88, 79,
+  96, 87, 81, 76, 85, 81, 86, 71, 95, 84,
+  93, 92, 76, 93, 83, 82, 78, 86, 73, 84,
+  82, 77, 87, 72, 78, 65, 99, 97, 81, 64,
+  88, 84, 71, 96, 79, 92, 77, 93, 79, 90,
+  79, 83, 81, 79, 79, 75, 94, 81, 91, 78,
+  87, 86, 86, 83, 78, 73, 78, 74, 78, 94,
+  77, 89, 68, 78, 64, 77, 81, 79, 77, 86,
+  79, 79, 75, 92, 74, 80, 77, 73, 91, 74,
+  65, 92, 71, 87, 84, 93, 89, 83, 77, 89,
+  90, 82, 153, 76, 89, 78, 79, 78, 87, 89,
+  94, 94, 88, 107, 91, 81, 88, 76, 85, 85,
+  83, 66, 86, 78, 75, 79, 70, 40, 90, 77,
+  96, 73, 87, 72, 99, 83, 87, 79, 96, 85,
+  79, 73, 84, 78, 78, 64, 96, 85, 91, 98,
+  76, 89, 83, 74, 85, 87, 73, 83, 86, 78,
+  95, 75, 80, 60, 91, 75, 82, 55, 86, 81,
+  72, 103, 79, 89, 84, 90, 84, 89, 73, 82,
+  82, 79, 73, 74, 93, 79, 85, 80, 82, 89,
+  83, 85, 76, 67, 75, 80, 81, 98, 79, 87,
+  68, 77, 63, 80, 76, 77, 77, 90, 75, 77,
+  78, 82, 69, 88, 77, 69, 95, 77, 61, 85,
+  53, 86, 85, 92, 79, 82, 72, 94, 89, 89,
+  141, 74, 94, 77, 74, 79, 86, 89, 84, 99,
+  77, 99, 84, 76, 99, 69, 78, 93, 89, 89,
+  81, 83, 84, 83, 71, 62, 94, 79, 93, 75,
+  84, 83, 87, 75, 85, 78, 85, 83, 84, 79,
+  84, 78, 85, 72, 88, 79, 87, 94, 78, 90,
+  79, 87, 79, 87, 75, 82, 84, 81, 96, 75,
+  82, 70, 94, 75, 79, 66, 82, 83, 69, 91,
+  79, 87, 76, 91, 82, 88, 78, 85, 83, 76,
+  76, 74, 93, 80, 92, 78, 86, 85, 84, 81,
+  79, 77, 76, 98, 82, 91, 81, 92, 76, 88,
+  67, 76, 75, 78, 81, 91, 82, 78, 71, 94,
+  77, 84, 78, 79, 88, 78, 66, 84, 69, 86,
+  84, 91, 82, 87, 81, 88, 88, 85, 135, 85,
+  89, 78, 90, 77, 86, 89, 86, 89, 86, 104,
+  86, 80, 91, 79, 81, 83, 91, 120, 85, 83,
+  74, 100, 75, 75, 88, 83, 100, 86, 77, 82,
+  85, 73, 83, 85, 91, 87, 84, 84, 84, 81,
+  91, 80, 91, 81, 85, 85, 74, 106, 78, 86,
+  80, 87, 71, 88, 87, 80, 86, 72, 79, 81,
+  95, 100, 76, 75, 82, 87, 75, 90, 78, 92,
+  72, 90, 84, 86, 77, 76, 86, 78, 87, 79,
+  93, 86, 92, 90, 93, 87, 89, 83, 78, 76,
+  83, 76, 84, 89, 82, 82, 65, 84, 70, 93,
+  82, 82, 85, 93, 78, 90, 76, 94, 98, 77,
+  72, 76, 82, 70, 71, 93, 82, 86, 86, 88,
+  86, 81, 79, 87, 81, 77, 155, 85, 89, 82,
+  77, 80, 84, 88, 88, 88, 85, 119, 93, 93,
+  88, 81, 87, 88, 89, 104, 90, 77, 72, 93,
+  78, 62, 94, 83, 100, 77, 81, 80, 95, 75,
+  89, 84, 91, 83, 82, 82, 82, 79, 85, 80,
+  93, 81, 85, 92, 78, 99, 74, 80, 83, 93,
+  76, 88, 85, 81, 91, 75, 81, 75, 85, 81,
+  76, 73, 83, 84, 74, 92, 78, 86, 74, 90,
+  83, 86, 71, 74, 86, 79, 74, 71, 97, 86,
+  86, 90, 82, 90, 82, 86, 76, 74, 80, 84,
+  87, 93, 81, 81, 68, 83, 68, 97, 80, 82,
+  83, 95, 83, 86, 79, 88, 88, 78, 79, 73,
+  88, 74, 67, 87, 63, 83, 83, 83, 80, 81,
+  77, 91, 78, 83, 148, 79, 87, 82, 75, 81,
+  83, 87, 86, 92, 85, 112, 89, 87, 93, 81,
+  80, 88, 97, 119, 84, 83, 76, 93, 76, 77,
+  93, 86, 96, 73, 77, 82, 81, 71, 84, 84,
+  82, 85, 84, 86, 79, 78, 86, 80, 86, 79,
+  82, 91, 77, 94, 74, 94, 80, 90, 84, 86,
+  88, 81, 92, 73, 81, 81, 90, 76, 77, 77,
+  79, 88, 72, 86, 81, 87, 75, 91, 88, 84,
+  74, 79, 87, 80, 84, 76, 90, 87, 89, 92,
+  87, 86, 90, 82, 77, 80, 84, 98, 86, 86,
+  83, 84, 73, 90, 72, 92, 77, 83, 83, 94,
+  80, 86, 71, 96, 89, 76, 75, 76, 84, 74,
+  74, 84, 77, 83, 85, 87, 82, 83, 82, 86,
+  80, 81, 136, 87, 88, 87, 92, 79, 81, 91,
+  87, 89, 87, 117, 86, 92, 89, 85, 76, 76,
+  92, 83, 83, 99, 101, 79, 84, 48, 87, 83,
+  93, 80, 87, 89, 88, 82, 93, 86, 91, 87,
+  78, 92, 82, 83, 77, 82, 91, 77, 79, 76,
+  83, 92, 92, 90, 87, 97, 75, 87, 81, 75,
+  89, 85, 81, 86, 76, 103, 63, 92, 83, 91,
+  73, 80, 75, 86, 65, 95, 68, 105, 90, 79,
+  81, 89, 93, 89, 83, 81, 90, 92, 89, 80,
+  88, 85, 75, 70, 85, 85, 80, 82, 75, 96,
+  79, 85, 85, 77, 75, 76, 89, 81, 82, 85,
+  74, 90, 73, 89, 78, 92, 81, 89, 78, 77,
+  80, 90, 102, 79, 74, 83, 78, 76, 79, 81,
+  99, 91, 93, 78, 87, 109, 75, 74, 78, 83,
+  87, 78, 82, 78, 72, 105, 81, 80, 87, 75,
+  92, 81, 107, 85, 85, 48, 98, 81, 91, 73,
+  93, 81, 94, 84, 85, 87, 83, 82, 86, 99,
+  85, 79, 72, 74, 84, 82, 75, 77, 95, 81,
+  96, 72, 91, 75, 76, 85, 87, 81, 90, 84,
+  91, 81, 81, 90, 69, 95, 87, 95, 70, 87,
+  77, 81, 70, 97, 74, 101, 84, 84, 77, 91,
+  94, 98, 87, 84, 90, 91, 79, 83, 91, 79,
+  75, 72, 85, 86, 78, 93, 78, 88, 81, 75,
+  86, 85, 76, 76, 90, 80, 79, 75, 75, 85,
+  77, 89, 83, 95, 80, 101, 82, 85, 73, 86,
+  93, 81, 83, 90, 95, 82, 83, 84, 97, 70,
+  95, 86, 89, 111, 71, 81, 87, 85, 85, 79,
+  87, 77, 60, 102, 86, 72, 90, 79, 84, 95,
+  94, 83, 79, 60, 96, 83, 80, 74, 78, 80,
+  93, 92, 92, 82, 85, 81, 80, 86, 95, 75,
+  71, 55, 76, 86, 83, 77, 90, 85, 87, 76,
+  92, 77, 83, 80, 83, 96, 90, 81, 87, 87,
+  83, 92, 73, 88, 85, 90, 68, 90, 75, 81,
+  70, 98, 73, 93, 89, 87, 78, 99, 104, 107,
+  85, 86, 91, 87, 81, 86, 86, 76, 76, 77,
+  86, 82, 72, 84, 73, 83, 83, 75, 89, 88,
+  77, 76, 86, 80, 81, 90, 82, 87, 89, 87,
+  83, 89, 81, 94, 90, 78, 81, 86, 95, 77,
+  77, 89, 87, 79, 82, 85, 92, 74, 93, 81,
+  99, 95, 76, 85, 93, 85, 79, 82, 85, 81,
+  82, 93, 76, 79, 87, 109, 80, 93, 81, 75,
+  93, 70, 67, 85, 67, 92, 76, 102, 67, 76,
+  92, 88, 85, 84, 76, 98, 78, 84, 98, 93,
+  109, 69, 94, 71, 62, 103, 78, 95, 77, 150,
+  80, 69, 92, 58, 86, 84, 71, 97, 73, 98,
+  75, 79, 77, 77, 82, 70, 89, 96, 70, 88,
+  73, 74, 108, 81, 86, 83, 78, 75, 86, 86,
+  80, 86, 99, 72, 87, 100, 73, 75, 87, 76,
+  71, 54, 88, 86, 59, 82, 77, 85, 74, 95,
+  79, 87, 75, 110, 71, 91, 83, 85, 74, 77,
+  82, 64, 62, 87, 86, 86, 77, 86, 80, 80,
+  64, 77, 77, 92, 99, 113, 82, 78, 81, 97,
+  93, 71, 66, 79, 74, 82, 84, 87, 94, 89,
+  75, 84, 85, 105, 88, 78, 93, 85, 91, 61,
+  75, 79, 81, 79, 85, 107, 80, 71, 80, 80,
+  83, 82, 84, 109, 77, 93, 84, 93, 95, 71,
+  84, 70, 78, 92, 83, 80, 69, 145, 75, 82,
+  94, 63, 78, 84, 73, 91, 74, 92, 80, 89,
+  83, 85, 86, 75, 81, 88, 70, 94, 73, 85,
+  91, 77, 79, 83, 83, 82, 93, 75, 85, 83,
+  82, 73, 93, 91, 74, 72, 83, 82, 71, 75,
+  88, 88, 61, 79, 75, 92, 74, 87, 87, 83,
+  81, 88, 71, 93, 68, 88, 73, 79, 81, 83,
+  67, 80, 78, 82, 84, 91, 82, 83, 69, 91,
+  81, 80, 102, 78, 84, 76, 90, 101, 86, 75,
+  74, 82, 88, 79, 92, 77, 73, 94, 88, 84,
+  89, 91, 88, 82, 95, 87, 85, 60, 85, 82,
+  77, 82, 75, 94, 88, 79, 87, 77, 82, 80,
+  81, 94, 87, 84, 80, 67, 79, 76, 86, 77,
+  88, 88, 84, 78, 80, 102, 86, 87, 94, 77,
+  82, 80, 83, 93, 79, 82, 81, 86, 85, 91,
+  80, 80, 80, 87, 73, 100, 75, 88, 88, 88,
+  84, 89, 91, 99, 90, 80, 92, 86, 84, 78,
+  89, 80, 79, 76, 87, 81, 76, 81, 81, 82,
+  67, 75, 79, 96, 78, 85, 93, 75, 83, 89,
+  81, 95, 80, 90, 77, 83, 80, 92, 77, 80,
+  84, 81, 96, 85, 83, 87, 77, 83, 84, 82,
+  92, 76, 88, 82, 96, 90, 89, 84, 90, 83,
+  85, 79, 94, 82, 93, 88, 106, 78, 82, 98,
+  79, 71, 78, 69, 87, 80, 71, 108, 71, 99,
+  68, 76, 77, 84, 125, 92, 86, 89, 78, 67,
+  92, 80, 102, 79, 105, 64, 114, 88, 77, 108,
+  74, 81, 86, 88, 91, 60, 82, 57, 105, 89,
+  94, 89, 84, 92, 74, 78, 87, 80, 83, 80,
+  94, 88, 91, 77, 88, 74, 105, 66, 94, 89,
+  58, 81, 66, 99, 69, 79, 83, 87, 81, 96,
+  74, 79, 96, 81, 79, 61, 96, 83, 92, 80,
+  87, 70, 76, 101, 87, 89, 79, 90, 85, 97,
+  92, 80, 83, 83, 74, 53, 63, 66, 86, 87,
+  46, 72, 94, 84, 91, 79, 83, 94, 75, 115,
+  86, 104, 85, 64, 91, 88, 81, 84, 65, 77,
+  79, 114, 98, 89, 84, 76, 76, 111, 73, 97,
+  77, 68, 84, 78, 69, 94, 64, 89, 73, 92,
+  74, 71, 104, 92, 95, 80, 75, 79, 79, 85,
+  96, 83, 93, 70, 99, 74, 66, 100, 83, 83,
+  88, 106, 87, 72, 83, 65, 87, 82, 81, 89,
+  77, 93, 80, 82, 83, 77, 83, 74, 85, 87,
+  93, 75, 88, 67, 95, 70, 91, 72, 63, 78,
+  71, 93, 67, 74, 94, 86, 85, 89, 69, 83,
+  94, 80, 76, 69, 92, 75, 79, 83, 79, 71,
+  72, 95, 84, 92, 73, 90, 81, 92, 86, 79,
+  82, 76, 70, 68, 70, 79, 88, 83, 49, 72,
+  84, 84, 76, 77, 79, 88, 81, 101, 82, 90,
+  88, 72, 83, 92, 82, 84, 67, 79, 76, 103,
+  94, 85, 95, 75, 82, 101, 80, 89, 90, 81,
+  78, 70, 78, 85, 80, 88, 68, 93, 82, 76,
+  98, 84, 87, 83, 79, 82, 80, 87, 89, 74,
+  78, 76, 91, 77, 80, 95, 78, 85, 87, 80,
+  78, 97, 84, 76, 87, 79, 89, 90, 83, 93,
+  80, 85, 83, 91, 83, 76, 84, 89, 88, 80,
+  85, 78, 95, 78, 88, 69, 76, 82, 77, 86,
+  85, 84, 93, 87, 86, 84, 72, 79, 87, 75,
+  79, 79, 86, 72, 81, 76, 82, 76, 76, 83,
+  90, 81, 83, 85, 84, 91, 85, 80, 85, 76,
+  72, 85, 78, 96, 91, 79, 67, 84, 84, 84,
+  83, 81, 83, 84, 86, 90, 81, 87, 83, 81,
+  93, 96, 98, 81, 86, 87, 86, 95, 84, 86,
+  88, 79, 97, 79, 58, 102, 79, 88, 94, 85,
+  72, 81, 77, 89, 55, 71, 85, 103, 85, 96,
+  78, 76, 122, 82, 82, 77, 89, 99, 98, 72,
+  76, 83, 77, 78, 84, 92, 76, 79, 70, 77,
+  70, 101, 87, 62, 92, 83, 83, 109, 80, 80,
+  93, 68, 80, 69, 90, 65, 95, 68, 79, 76,
+  80, 88, 72, 75, 62, 82, 79, 98, 81, 87,
+  63, 101, 72, 84, 84, 85, 94, 102, 69, 95,
+  79, 86, 84, 99, 80, 80, 86, 93, 72, 79,
+  94, 73, 79, 73, 94, 98, 79, 68, 83, 69,
+  74, 84, 89, 104, 86, 82, 63, 70, 79, 78,
+  92, 73, 87, 102, 77, 130, 102, 88, 75, 88,
+  75, 71, 84, 66, 81, 88, 86, 84, 101, 75,
+  112, 94, 90, 96, 86, 89, 89, 80, 78, 75,
+  101, 96, 73, 88, 85, 90, 95, 84, 91, 78,
+  97, 80, 87, 90, 82, 94, 84, 107, 90, 89,
+  85, 88, 80, 86, 86, 81, 81, 84, 79, 91,
+  88, 78, 81, 72, 90, 102, 77, 78, 83, 92,
+  87, 79, 77, 74, 76, 83, 82, 83, 72, 71,
+  79, 83, 79, 79, 66, 82, 84, 106, 62, 84,
+  80, 88, 78, 89, 77, 79, 76, 90, 86, 89,
+  83, 87, 88, 81, 96, 98, 82, 79, 82, 76,
+  82, 82, 89, 88, 77, 75, 82, 75, 88, 67,
+  80, 98, 84, 72, 75, 85, 79, 81, 94, 70,
+  86, 80, 95, 92, 94, 89, 79, 77, 101, 73,
+  98, 87, 97, 90, 90, 82, 96, 65, 91, 78,
+  98, 80, 81, 96, 78, 77, 85, 76, 89, 84,
+  95, 83, 84, 82, 79, 74, 96, 83, 84, 79,
+  82, 81, 82, 71, 71, 102, 94, 84, 88, 89,
+  96, 83, 92, 79, 93, 89, 86, 81, 83, 84,
+  84, 77, 90, 80, 78, 76, 74, 105, 86, 86,
+  72, 75, 77, 95, 93, 78, 79, 89, 86, 88,
+  81, 93, 88, 83, 88, 88, 81, 78, 91, 83,
+  83, 77, 78, 88, 87, 82, 90, 86, 85, 78,
+  86, 84, 86, 75, 102, 79, 75, 88, 83, 90,
+  99, 84, 78, 84, 77, 87, 86, 72, 77, 89,
+  82, 84, 81, 87, 78, 86, 89, 76, 85, 85,
+  84, 86, 84, 84, 76, 87, 105, 94, 81, 86,
+  98, 90, 87, 94, 83, 72, 63, 76, 65, 102,
+  78, 86, 79, 86, 72, 82, 71, 66, 64, 68,
+  81, 105, 82, 100, 75, 68, 108, 81, 89, 81,
+  91, 98, 116, 53, 70, 72, 80, 85, 151, 106,
+  92, 77, 61, 75, 69, 104, 92, 61, 78, 107,
+  74, 78, 83, 76, 77, 59, 81, 73, 82, 68,
+  100, 53, 79, 71, 73, 104, 69, 71, 66, 78,
+  54, 92, 92, 64, 99, 92, 83, 80, 91, 88,
+  90, 143, 87, 98, 78, 76, 95, 87, 84, 74,
+  94, 105, 54, 89, 93, 77, 80, 77, 113, 93,
+  81, 69, 90, 71, 60, 55, 88, 105, 75, 73,
+  59, 63, 81, 81, 79, 79, 84, 113, 63, 117,
+  54, 81, 62, 78, 58, 67, 81, 67, 71, 70,
+  78, 83, 91, 68, 53, 103, 78, 96, 81, 85,
+  87, 88, 71, 81, 76, 86, 76, 82, 87, 91,
+  90, 83, 90, 60, 76, 85, 90, 82, 93, 104,
+  99, 58, 84, 75, 82, 113, 87, 76, 80, 90,
+  58, 66, 83, 91, 94, 75, 77, 83, 83, 72,
+  77, 69, 78, 64, 88, 77, 77, 106, 78, 69,
+  69, 87, 83, 84, 76, 75, 81, 69, 69, 97,
+  106, 85, 96, 82, 74, 92, 80, 91, 87, 95,
+  94, 87, 81, 83, 80, 57, 88, 89, 100, 105,
+  77, 74, 86, 108, 84, 82, 103, 93, 83, 75,
+  84, 70, 73, 98, 85, 99, 91, 92, 77, 76,
+  79, 77, 79, 82, 85, 79, 89, 110, 61, 93,
+  80, 74, 85, 64, 90, 85, 84, 79, 88, 70,
+  93, 74, 67, 83, 94, 70, 86, 97, 88, 75,
+  82, 83, 76, 91, 93, 91, 87, 81, 92, 74,
+  85, 77, 83, 86, 74, 80, 89, 85, 82, 73,
+  90, 82, 86, 92, 79, 72, 76, 85, 71, 84,
+  80, 81, 93, 82, 78, 76, 91, 84, 77, 77,
+  79, 84, 84, 85, 79, 85, 80, 93, 85, 81,
+  83, 91, 90, 74, 79, 83, 89, 81, 95, 86,
+  86, 78, 86, 90, 86, 78, 87, 73, 89, 80,
+  91, 82, 87, 73, 84, 90, 85, 76, 115, 79,
+  80, 98, 84, 90, 88, 81, 82, 84, 84, 83,
+  79, 99, 75, 88, 96, 92, 90, 86, 91, 89,
+  91, 74, 78, 82, 87, 93, 73, 88, 83, 88,
+  97, 84, 92, 83, 91, 86, 89, 93, 84, 101,
+  92, 79, 93, 86, 96, 93, 79, 81, 87, 78,
+  69, 80, 70, 78, 85, 104, 89, 96, 77, 63,
+  87, 77, 83, 88, 87, 87, 99, 106, 87, 90,
+  97, 80, 87, 75, 77, 90, 75, 82, 82, 84,
+  80, 88, 77, 95, 88, 88, 81, 75, 90, 89,
+  87, 88, 90, 80, 92, 86, 96, 68, 74, 77,
+  87, 77, 79, 80, 67, 77, 79, 84, 60, 75,
+  96, 76, 93, 95, 85, 67, 100, 85, 96, 93,
+  85, 88, 85, 83, 88, 90, 98, 96, 99, 73,
+  81, 81, 95, 84, 85, 79, 94, 83, 65, 76,
+  83, 100, 74, 70, 65, 87, 91, 87, 85, 73,
+  83, 92, 84, 96, 56, 74, 76, 78, 68, 75,
+  99, 83, 91, 80, 83, 84, 91, 85, 75, 82,
+  80, 100, 82, 90, 85, 92, 73, 84, 66, 87,
+  64, 71, 84, 92, 85, 98, 81, 82, 91, 77,
+  82, 82, 93, 96, 92, 90, 86, 82, 86, 96,
+  82, 93, 86, 81, 66, 75, 84, 84, 84, 78,
+  78, 89, 83, 119, 86, 69, 81, 86, 85, 79,
+  82, 88, 86, 76, 76, 77, 88, 96, 81, 76,
+  80, 81, 55, 89, 80, 76, 84, 86, 87, 83,
+  82, 96, 84, 70, 102, 88, 88, 84, 81, 78,
+  84, 85, 92, 95, 77, 82, 97, 85, 79, 73,
+  97, 87, 86, 72, 82, 79, 68, 103, 88, 98,
+  83, 84, 72, 76, 90, 82, 85, 74, 84, 89,
+  77, 89, 76, 81, 78, 78, 79, 68, 93, 78,
+  87, 84, 84, 72, 84, 74, 72, 81, 89, 82,
+  82, 94, 92, 87, 83, 82, 84, 93, 76, 81,
+  81, 81, 86, 85, 85, 90, 89, 78, 80, 86,
+  86, 91, 78, 76, 87, 75, 79, 94, 91, 93,
+  83, 85, 75, 90, 87, 85, 93, 77, 93, 82,
+  84, 100, 86, 73, 86, 89, 79, 83, 78, 79,
+  83, 81, 81, 86, 84, 92, 80, 76, 79, 91,
+  77, 94, 80, 82, 91, 82, 82, 85, 80, 76,
+  89, 82, 83, 85, 91, 79, 87, 85, 80, 88,
+  94, 78, 86, 81, 89, 88, 84, 79, 92, 89,
+  84, 80, 83, 81, 77, 96, 80, 94, 89, 91,
+  86, 79, 93, 85, 88, 74, 78, 83, 82, 85,
+  89, 87, 86, 80, 91, 79, 87, 82, 88, 87,
+  86, 87, 89, 76, 77, 88, 86, 88, 99, 74,
+  70, 67, 89, 78, 87, 81, 83, 84, 88, 85,
+  65, 87, 89, 88, 88, 92, 95, 71, 83, 61,
+  85, 83, 88, 88, 85, 80, 99, 76, 94, 81,
+  82, 76, 72, 83, 77, 79, 101, 62, 87, 75,
+  66, 92, 83, 87, 84, 103, 91, 91, 66, 91,
+  85, 94, 96, 91, 76, 82, 82, 89, 89, 88,
+  74, 88, 65, 85, 98, 95, 81, 74, 78, 100,
+  80, 101, 83, 85, 98, 92, 83, 94, 84, 92,
+  98, 79, 85, 81, 77, 102, 80, 88, 93, 88,
+  74, 107, 84, 87, 92, 86, 89, 85, 70, 86,
+  81, 77, 79, 88, 84, 87, 92, 69, 68, 103,
+  72, 81, 85, 84, 77, 77, 75, 78, 82, 89,
+  76, 94, 90, 83, 94, 75, 97, 67, 71, 60,
+  74, 90, 99, 87, 82, 101, 82, 73, 61, 92,
+  100, 70, 86, 110, 86, 80, 89, 68, 92, 83,
+  96, 71, 75, 74, 89, 78, 85, 100, 94, 93,
+  79, 73, 73, 95, 88, 92, 81, 72, 79, 86,
+  80, 93, 82, 82, 81, 79, 60, 81, 93, 93,
+  87, 74, 76, 74, 79, 69, 79, 79, 65, 78,
+  78, 83, 76, 99, 89, 60, 76, 98, 82, 88,
+  83, 87, 85, 95, 71, 90, 86, 73, 96, 88,
+  71, 78, 77, 98, 69, 89, 87, 85, 92, 80,
+  77, 74, 74, 86, 103, 77, 54, 78, 67, 91,
+  100, 85, 73, 85, 83, 98, 69, 92, 74, 81,
+  84, 89, 77, 65, 83, 81, 82, 92, 80, 79,
+  101, 97, 92, 83, 78, 89, 86, 83, 83, 93,
+  77, 93, 64, 102, 89, 72, 105, 99, 65, 89,
+  80, 94, 80, 75, 100, 91, 86, 90, 97, 81,
+  76, 86, 70, 83, 92, 94, 90, 79, 85, 66,
+  77, 90, 79, 96, 87, 92, 90, 78, 82, 74,
+  77, 82, 100, 87, 85, 82, 69, 87, 92, 83,
+  96, 70, 63, 74, 69, 99, 83, 75, 80, 85,
+  86, 97, 84, 78, 84, 101, 79, 76, 84, 72,
+  77, 88, 68, 92, 99, 81, 85, 77, 82, 92,
+  76, 77, 103, 84, 90, 81, 92, 71, 84, 79,
+  89, 86, 88, 77, 71, 87, 67, 80, 93, 103,
+  86, 85, 88, 100, 101, 91, 84, 75, 79, 94,
+  78, 88, 88, 88, 88, 84, 73, 91, 76, 94,
+  85, 94, 100, 65, 69, 61, 75, 83, 88, 88,
+  86, 105, 86, 76, 56, 85, 109, 81, 87, 102,
+  78, 73, 90, 68, 95, 83, 93, 78, 79, 91,
+  91, 78, 75, 83, 82, 85, 78, 79, 76, 86,
+  87, 77, 78, 85, 80, 92, 84, 91, 91, 90,
+  85, 73, 66, 83, 93, 91, 89, 89, 77, 85,
+  74, 75, 91, 86, 71, 67, 74, 74, 93, 95,
+  80, 65, 82, 93, 79, 94, 86, 91, 90, 86,
+  77, 97, 87, 87, 98, 76, 75, 74, 90, 101,
+  64, 82, 85, 88, 84, 90, 75, 91, 77, 85,
+  95, 86, 64, 78, 74, 91, 82, 92, 83, 80,
+  84, 75, 62, 94, 77, 87, 82, 100, 82, 74,
+  82, 85, 83, 89, 72, 98, 86, 86, 80, 71,
+  79, 68, 68, 77, 67, 93, 94, 94, 74, 95,
+  78, 68, 73, 88, 112, 75, 103, 95, 63, 76,
+  93, 73, 115, 80, 105, 57, 59, 78, 81, 82,
+  76, 109, 88, 88, 91, 70, 71, 93, 79, 103,
+  67, 89, 91, 84, 74, 96, 83, 71, 88, 74,
+  73, 68, 98, 69, 87, 72, 84, 60, 60, 64,
+  69, 82, 65, 84, 74, 77, 64, 104, 83, 65,
+  83, 108, 73, 78, 85, 78, 74, 81, 63, 94,
+  92, 85, 78, 72, 64, 68, 77, 92, 72, 90,
+  84, 83, 107, 55, 70, 61, 73, 85, 88, 68,
+  67, 71, 52, 86, 103, 92, 76, 86, 82, 97,
+  98, 81, 77, 82, 67, 107, 65, 74, 84, 83,
+  93, 85, 86, 71, 74, 99, 83, 79, 69, 91,
+  89, 91, 86, 82, 71, 90, 56, 80, 85, 82,
+  121, 95, 69, 90, 82, 76, 76, 77, 93, 100,
+  101, 88, 87, 96, 86, 83, 61, 79, 87, 85,
+  80, 65, 90, 65, 78, 85, 84, 99, 89, 90,
+  88, 69, 86, 78, 79, 88, 118, 88, 111, 65,
+  82, 85, 89, 88, 96, 55, 51, 81, 59, 111,
+  80, 72, 82, 70, 85, 91, 85, 96, 86, 101,
+  75, 75, 82, 67, 74, 73, 63, 82, 106, 92,
+  69, 75, 96, 84, 73, 73, 123, 96, 92, 84,
+  99, 72, 77, 83, 95, 85, 71, 80, 88, 90,
+  84, 72, 81, 96, 95, 79, 75, 89, 106, 80,
+  93, 69, 77, 88, 76, 102, 93, 82, 102, 76,
+  77, 91, 79, 101, 78, 86, 88, 70, 71, 71,
+  74, 80, 94, 97, 75, 86, 82, 78, 80, 84,
+  106, 89, 78, 96, 75, 75, 100, 77, 83, 84,
+  90, 80, 73, 95, 95, 80, 82, 92, 79, 90,
+  80, 73, 83, 83, 77, 87, 80, 70, 83, 83,
+  90, 88, 86, 89, 94, 85, 80, 82, 97, 79,
+  86, 89, 86, 91, 85, 73, 77, 81, 74, 81,
+  87, 77, 91, 91, 78, 73, 85, 106, 82, 81,
+  82, 85, 92, 87, 81, 89, 86, 89, 89, 85,
+  88, 71, 85, 93, 73, 81, 85, 90, 87, 86,
+  71, 94, 88, 83, 84, 92, 65, 88, 84, 82,
+  76, 99, 79, 81, 94, 87, 78, 87, 78, 87,
+  75, 101, 73, 74, 92, 89, 90, 82, 81, 99,
+  75, 92, 72, 82, 82, 78, 75, 84, 74, 93,
+  96, 92, 66, 72, 72, 79, 97, 89, 102, 88,
+  80, 91, 68, 76, 95, 87, 103, 87, 95, 77,
+  68, 80, 76, 80, 78, 108, 90, 81, 101, 70,
+  76, 87, 78, 98, 71, 71, 86, 83, 83, 93,
+  83, 84, 102, 90, 96, 70, 97, 73, 90, 74,
+  86, 82, 70, 77, 72, 87, 72, 82, 84, 68,
+  69, 100, 82, 80, 79, 100, 83, 69, 83, 86,
+  85, 90, 71, 86, 91, 91, 76, 76, 85, 72,
+  84, 86, 93, 94, 94, 84, 116, 69, 73, 78,
+  88, 84, 70, 75, 84, 87, 81, 80, 80, 96,
+  79, 79, 83, 86, 107, 82, 85, 85, 62, 92,
+  62, 77, 84, 83, 99, 88, 77, 90, 67, 87,
+  76, 104, 82, 93, 86, 91, 83, 80, 80, 95,
+  59, 84, 74, 88, 105, 86, 71, 85, 70, 91,
+  78, 97, 83, 110, 72, 86, 83, 102, 91, 87,
+  64, 79, 87, 82, 71, 72, 88, 72, 79, 90,
+  89, 93, 104, 81, 83, 73, 95, 75, 77, 88,
+  103, 86, 103, 81, 85, 90, 83, 79, 91, 62,
+  64, 99, 74, 98, 83, 69, 93, 69, 82, 89,
+  96, 92, 70, 85, 81, 82, 89, 90, 79, 82,
+  82, 85, 92, 85, 86, 84, 87, 82, 82, 74,
+  109, 90, 87, 85, 107, 83, 78, 94, 89, 87,
+  66, 78, 91, 92, 88, 85, 77, 82, 85, 77,
+  75, 92, 83, 85, 95, 74, 79, 74, 79, 99,
+  91, 77, 89, 89, 93, 88, 83, 88, 85, 87,
+  84, 93, 88, 86, 89, 87, 72, 85, 77, 90,
+  74, 74, 87, 81, 87, 84, 84, 89, 81, 78,
+  85, 89, 87, 93, 84, 89, 80, 92, 78, 84,
+  88, 90, 92, 77, 87, 81, 79, 87, 79, 92,
+  79, 89, 93, 76, 86, 84, 80, 75, 93, 83,
+  81, 86, 88, 83, 83, 77, 94, 77, 81, 73,
+  84, 73, 78, 80, 107, 95, 90, 105, 81, 90,
+  82, 88, 77, 76, 93, 95, 93, 84, 75, 87,
+  91, 100, 91, 66, 80, 87, 92, 85, 92, 77,
+  84, 86, 74, 86, 74, 82, 88, 92, 82, 88,
+  74, 94, 78, 85, 90, 81, 76, 83, 93, 97,
+  97, 82, 80, 79, 84, 85, 85, 81, 77, 88,
+  86, 84, 79, 91, 78, 82, 81, 77, 101, 97,
+  91, 79, 93, 89, 79, 83, 88, 102, 87, 86,
+  92, 82, 89, 76, 82, 88, 89, 90, 80, 84,
+  79, 89, 86, 87, 91, 80, 74, 80, 69, 81,
+  82, 81, 87, 71, 77, 91, 74, 89, 85, 80,
+  80, 84, 86, 85, 81, 80, 83, 36, 89, 91,
+  88, 87, 76, 83, 92, 84, 79, 87, 84, 85,
+  80, 79, 96, 83, 93, 95, 87, 87, 82, 75,
+  80, 84, 88, 84, 94, 80, 84, 84, 88, 71,
+  88, 75, 79, 68, 86, 92, 74, 87, 84, 85,
+  87, 79, 65, 76, 84, 88, 79, 87, 84, 86,
+  80, 84, 90, 90, 83, 84, 99, 85, 83, 83,
+  86, 82, 87, 88, 83, 81, 78, 87, 83, 81,
+  87, 81, 83, 76, 82, 86, 104, 88, 74, 80,
+  87, 83, 79, 76, 91, 96, 83, 97, 81, 86,
+  86, 89, 84, 86, 92, 90, 76, 80, 75, 87,
+  82, 87, 94, 77, 81, 88, 80, 83, 90, 83,
+  85, 76, 78, 92, 78, 81, 92, 88, 81, 92,
+  82, 92, 76, 85, 85, 52, 90, 97, 86, 82,
+  77, 84, 88, 82, 93, 100, 86, 90, 86, 95,
+  108, 86, 86, 87, 91, 73, 80, 83, 86, 86,
+  88, 79, 87, 90, 88, 80, 86, 76, 82, 73,
+  77, 74, 87, 82, 81, 99, 85, 75, 93, 83,
+  76, 88, 83, 86, 85, 90, 97, 81, 72, 82,
+  88, 99, 81, 81, 98, 88, 81, 87, 89, 82,
+  83, 90, 77, 73, 87, 85, 82, 81, 88, 76,
+  68, 83, 91, 78, 68, 80, 91, 84, 73, 87,
+  64, 66, 76, 70, 69, 74, 76, 90, 83, 83,
+  86, 99, 94, 77, 92, 86, 112, 82, 74, 92,
+  71, 85, 71, 79, 98, 83, 91, 87, 79, 88,
+  87, 82, 85, 109, 84, 91, 91, 70, 84, 89,
+  89, 73, 100, 166, 82, 63, 88, 80, 96, 82,
+  87, 67, 66, 62, 68, 86, 86, 103, 80, 89,
+  80, 81, 89, 82, 79, 94, 83, 78, 80, 87,
+  89, 83, 64, 84, 91, 108, 73, 81, 79, 91,
+  90, 74, 106, 79, 80, 87, 79, 87, 86, 88,
+  89, 95, 97, 84, 71, 92, 79, 80, 80, 69,
+  76, 94, 79, 100, 76, 80, 77, 78, 81, 79,
+  74, 72, 85, 83, 88, 80, 74, 80, 59, 86,
+  81, 83, 70, 85, 96, 87, 80, 76, 67, 65,
+  76, 74, 80, 65, 79, 85, 79, 69, 81, 90,
+  85, 75, 94, 88, 110, 83, 75, 85, 69, 90,
+  70, 75, 96, 86, 94, 75, 87, 88, 89, 84,
+  80, 100, 77, 85, 93, 64, 84, 87, 85, 69,
+  95, 171, 74, 65, 85, 79, 86, 76, 84, 67,
+  64, 62, 72, 72, 85, 97, 112, 77, 88, 89,
+  83, 81, 85, 90, 86, 79, 77, 89, 91, 80,
+  73, 85, 89, 110, 77, 69, 73, 96, 86, 77,
+  102, 74, 83, 85, 79, 85, 78, 101, 90, 92,
+  81, 82, 65, 92, 75, 76, 79, 73, 75, 87,
+  67, 89, 69, 76, 79, 80, 80, 83, 75, 74,
+  76, 81, 82, 77, 82, 83, 73, 87, 87, 75,
+  84, 91, 97, 88, 85, 80, 84, 70, 83, 100,
+  91, 73, 86, 81, 84, 89, 83, 89, 81, 82,
+  85, 86, 83, 85, 83, 87, 82, 85, 65, 80,
+  85, 89, 87, 96, 87, 83, 87, 84, 76, 85,
+  78, 91, 88, 80, 79, 94, 85, 78, 83, 82,
+  80, 83, 88, 89, 77, 83, 83, 73, 77, 82,
+  82, 77, 79, 82, 78, 82, 94, 96, 84, 81,
+  83, 77, 80, 83, 83, 78, 95, 87, 81, 88,
+  88, 85, 76, 70, 77, 75, 83, 87, 83, 83,
+  87, 89, 83, 80, 72, 84, 87, 88, 82, 70,
+  79, 79, 70, 83, 83, 77, 80, 83, 70, 85,
+  79, 78, 85, 80, 76, 91, 91, 81, 80, 83,
+  85, 84, 79, 77, 79, 80, 89, 75, 86, 82,
+  89, 84, 85, 91, 83, 74, 84, 84, 76, 98,
+  85, 84, 92, 87, 86, 88, 96, 87, 73, 80,
+  77, 81, 90, 91, 90, 78, 71, 86, 75, 88,
+  78, 94, 81, 74, 77, 82, 84, 95, 90, 85,
+  79, 92, 86, 94, 88, 85, 88, 60, 77, 84,
+  83, 88, 90, 93, 92, 93, 81, 82, 93, 93,
+  83, 82, 62, 80, 83, 84, 74, 85, 77, 81,
+  59, 79, 93, 78, 89, 90, 79, 86, 93, 69,
+  73, 88, 95, 80, 84, 94, 87, 89, 76, 94,
+  81, 79, 76, 56, 83, 91, 84, 81, 83, 87,
+  73, 79, 80, 86, 80, 82, 97, 85, 83, 88,
+  88, 68, 89, 84, 89, 79, 91, 85, 83, 80,
+  73, 87, 70, 80, 84, 73, 74, 82, 92, 90,
+  79, 91, 69, 86, 78, 71, 74, 76, 88, 88,
+  84, 74, 92, 94, 96, 87, 82, 85, 94, 82,
+  82, 96, 77, 73, 84, 86, 79, 85, 84, 79,
+  79, 78, 76, 78, 83, 94, 80, 78, 85, 78,
+  92, 83, 88, 84, 94, 105, 79, 80, 90, 79,
+  93, 87, 89, 84, 70, 66, 79, 94, 91, 86,
+  64, 77, 89, 76, 81, 90, 84, 83, 73, 79,
+  83, 91, 90, 91, 75, 83, 88, 95, 81, 89,
+  97, 80, 91, 85, 92, 82, 81, 92, 80, 82,
+  79, 72, 90, 93, 88, 82, 75, 86, 91, 79,
+  83, 82, 83, 83, 86, 88, 75, 82, 75, 73,
+  82, 84, 82, 79, 84, 86, 87, 76, 79, 79,
+  74, 80, 83, 89, 66, 86, 87, 91, 78, 91,
+  71, 83, 66, 72, 75, 64, 80, 94, 82, 73,
+  99, 90, 85, 78, 93, 88, 90, 96, 78, 93,
+  73, 82, 81, 92, 104, 83, 97, 84, 80, 82,
+  85, 76, 79, 89, 71, 95, 101, 75, 87, 76,
+  82, 84, 85, 139, 80, 71, 88, 76, 86, 84,
+  86, 74, 81, 65, 75, 79, 89, 100, 80, 84,
+  88, 76, 79, 88, 84, 91, 93, 82, 77, 92,
+  94, 98, 72, 91, 87, 109, 83, 75, 87, 87,
+  87, 80, 97, 78, 88, 86, 72, 88, 86, 88,
+  91, 93, 93, 79, 74, 80, 86, 75, 84, 75,
+  78, 89, 77, 94, 85, 75, 69, 84, 83, 86,
+  81, 74, 78, 89, 87, 89, 76, 74, 89, 89,
+  79, 80, 70, 76, 72, 76, 69, 93, 79, 101,
+  69, 83, 81, 68, 84, 81, 83, 101, 95, 81,
+  82, 94, 80, 78, 100, 86, 122, 98, 82, 93,
+  90, 85, 86, 82, 95, 84, 80, 89, 74, 93,
+  74, 68, 80, 81, 88, 83, 87, 73, 78, 87,
+  80, 87, 80, 78, 83, 73, 81, 87, 88, 83,
+  90, 70, 83, 98, 89, 86, 79, 84, 64, 98,
+  80, 84, 70, 89, 89, 70, 82, 76, 60, 100,
+  95, 84, 90, 98, 74, 81, 72, 78, 94, 77,
+  86, 81, 81, 101, 97, 68, 81, 91, 72, 75,
+  82, 83, 87, 80, 72, 95, 82, 91, 89, 79,
+  73, 83, 81, 84, 98, 93, 75, 141, 76, 88,
+  73, 89, 94, 77, 87, 73, 82, 82, 85, 88,
+  75, 78, 75, 75, 61, 97, 81, 92, 72, 85,
+  89, 71, 84, 84, 82, 101, 84, 77, 82, 100,
+  73, 75, 107, 90, 134, 94, 80, 86, 89, 83,
+  86, 76, 92, 89, 80, 91, 83, 98, 77, 71,
+  84, 77, 78, 82, 94, 81, 80, 91, 78, 82,
+  78, 81, 86, 66, 77, 79, 91, 79, 83, 75,
+  84, 94, 89, 76, 81, 79, 64, 96, 80, 81,
+  69, 91, 91, 74, 85, 80, 61, 78, 93, 77,
+  87, 95, 75, 83, 69, 83, 86, 79, 75, 85,
+  80, 106, 86, 68, 79, 90, 72, 75, 83, 83,
+  88, 80, 73, 90, 86, 88, 89, 84, 73, 81,
+  77, 80, 95, 90, 82, 137, 77, 82, 71, 84,
+  98, 73, 82, 77, 88, 89, 82, 87, 69, 81,
+  72, 76, 75, 85, 83, 86, 71, 84, 80, 80,
+  86, 91, 78, 86, 83, 84, 77, 92, 79, 78,
+  97, 87, 117, 97, 82, 79, 82, 95, 94, 83,
+  85, 86, 87, 86, 88, 88, 73, 82, 88, 90,
+  87, 85, 91, 75, 79, 91, 84, 85, 76, 76,
+  78, 75, 83, 80, 92, 78, 84, 75, 82, 95,
+  89, 85, 89, 83, 76, 93, 85, 89, 72, 83,
+  97, 73, 81, 78, 61, 72, 97, 78, 85, 95,
+  76, 81, 77, 99, 94, 78, 85, 81, 83, 97,
+  91, 70, 80, 99, 76, 76, 81, 82, 79, 86,
+  75, 98, 84, 92, 85, 88, 79, 83, 83, 84,
+  92, 87, 94, 131, 77, 86, 74, 85, 93, 70,
+  89, 86, 77, 81, 81, 82, 77, 73, 73, 78,
+  75, 91, 81, 89, 82, 83, 82, 73, 80, 81,
+  87, 96, 85, 87, 85, 81, 81, 78, 91, 80,
+  114, 90, 85, 97, 95, 82, 91, 83, 88, 84,
+  85, 90, 72, 93, 77, 80, 92, 84, 80, 89,
+  91, 79, 86, 82, 83, 84, 83, 80, 79, 74,
+  87, 79, 91, 79, 83, 69, 86, 87, 79, 74,
+  82, 92, 67, 89, 89, 81, 62, 90, 86, 74,
+  87, 79, 62, 84, 96, 80, 87, 100, 83, 91,
+  73, 76, 89, 68, 79, 84, 81, 101, 98, 71,
+  78, 84, 76, 75, 93, 81, 86, 75, 85, 103,
+  84, 81, 89, 80, 78, 75, 80, 85, 102, 83,
+  80, 112, 82, 87, 73, 87, 100, 78, 98, 89,
+  81, 76, 82, 89, 78, 75, 76, 83, 71, 93,
+  89, 84, 84, 84, 88, 73, 83, 86, 77, 96,
+  88, 87, 87, 77, 77, 79, 97, 89, 115, 84,
+  85, 88, 94, 76, 91, 84, 89, 85, 89, 94,
+  80, 99, 83, 80, 95, 78, 73, 88, 94, 83,
+  88, 84, 90, 83, 83, 82, 85, 65, 85, 76,
+  91, 76, 74, 75, 90, 79, 76, 70, 79, 87,
+  67, 83, 88, 79, 65, 89, 79, 78, 89, 76,
+  65, 76, 89, 76, 76, 93, 84, 96, 71, 74,
+  86, 65, 72, 83, 80, 101, 89, 77, 79, 86,
+  87, 75, 89, 87, 86, 79, 85, 96, 81, 76,
+  93, 76, 72, 69, 79, 79, 94, 81, 84, 98,
+  80, 87, 70, 79, 105, 80, 87, 86, 86, 84,
+  84, 89, 75, 78, 75, 79, 79, 86, 87, 84,
+  80, 83, 76, 77, 82, 84, 74, 83, 83, 92,
+  86, 78, 79, 80, 87, 82, 104, 90, 87, 82,
+  81, 92, 86, 81, 90, 81, 87, 87, 90, 91,
+  79, 87, 90, 85, 80, 88, 93, 77, 85, 88,
+  85, 85, 81, 75, 78, 72, 86, 82, 92, 76,
+  75, 75, 86, 90, 75, 68, 87, 90, 73, 86,
+  85, 86, 66, 80, 84, 77, 86, 79, 62, 74,
+  91, 83, 82, 91, 81, 89, 76, 84, 92, 71,
+  79, 87, 82, 91, 87, 76, 74, 95, 78, 77,
+  89, 82, 81, 82, 83, 100, 84, 81, 86, 84,
+  79, 76, 83, 85, 91, 85, 91, 105, 75, 84,
+  73, 86, 98, 73, 86, 86, 72, 84, 83, 94,
+  72, 73, 68, 77, 86, 82, 85, 83, 86, 89,
+  75, 75, 82, 79, 80, 92, 88, 94, 91, 77,
+  82, 80, 86, 81, 97, 95, 84, 99, 94, 90,
+  91, 84, 92, 89, 94, 81, 75, 83, 82, 72,
+  88, 86, 84, 83, 87, 77, 85, 82, 86, 84,
+  75, 83, 73, 81, 92, 84, 85, 83, 83, 74,
+  85, 90, 79, 75, 94, 87, 76, 81, 90, 79,
+  69, 86, 90, 74, 85, 84, 61, 83, 88, 87,
+  87, 100, 81, 84, 79, 81, 97, 77, 86, 93,
+  86, 97, 94, 79, 78, 85, 83, 77, 89, 76,
+  80, 78, 85, 100, 89, 77, 82, 76, 81, 81,
+  82, 87, 96, 85, 78, 113, 79, 94, 79, 96,
+  97, 77, 83, 92, 82, 83, 83, 90, 73, 76,
+  72, 82, 86, 82, 88, 88, 83, 87, 75, 77,
+  86, 84, 77, 87, 90, 98, 87, 76, 88, 81,
+  89, 89, 89, 91, 93, 85, 92, 81, 90, 85,
+  86, 86, 94, 80, 78, 85, 84, 76, 88, 81,
+  82, 86, 84, 79, 88, 82, 90, 85, 77, 83,
+  78, 73, 86, 87, 89, 81, 75, 74, 90, 83,
+  77, 78, 83, 84, 78, 76, 92, 79, 69, 83,
+  87, 76, 87, 82, 66, 77, 81, 86, 79, 92,
+  85, 86, 80, 76, 99, 77, 86, 93, 88, 91,
+  89, 80, 83, 84, 86, 77, 81, 78, 80, 81,
+  81, 101, 87, 72, 88, 75, 78, 76, 88, 84,
+  89, 88, 85, 101, 80, 93, 79, 92, 101, 81,
+  86, 86, 86, 83, 84, 91, 74, 78, 67, 79,
+  88, 81, 91, 93, 80, 86, 70, 79, 86, 86,
+  73, 89, 94, 98, 81, 74, 80, 84, 82, 81,
+  92, 95, 88, 83, 82, 92, 85, 80, 87, 84,
+  92, 79, 77, 83, 81, 71, 88, 85, 80, 83,
+  88, 78, 85, 86, 81, 82, 77, 81, 75, 84,
+  92, 88, 88, 81, 75, 77, 85, 89, 76, 70,
+  79, 89, 80, 80, 92, 83, 72, 81, 84, 79,
+  87, 84, 63, 77, 89, 94, 77, 91, 84, 80,
+  80, 80, 93, 77, 83, 92, 88, 91, 86, 79,
+  73, 89, 89, 79, 84, 84, 78, 84, 86, 97,
+  87, 76, 82, 80, 84, 86, 90, 85, 91, 86,
+  91, 102, 76, 89, 82, 92, 96, 81, 94, 70,
+  93, 84, 76, 93, 75, 86, 85, 83, 74, 86,
+  77, 90, 72, 83, 82, 82, 96, 92, 84, 84,
+  82, 79, 82, 85, 81, 94, 97, 73, 101, 105,
+  95, 96, 87, 96, 86, 74, 93, 70, 92, 67,
+  80, 88, 91, 81, 76, 75, 87, 76, 91, 75,
+  84, 87, 103, 93, 91, 70, 84, 76, 97, 84,
+  95, 84, 83, 88, 81, 87, 80, 83, 75, 83,
+  86, 88, 83, 80, 86, 74, 76, 83, 86, 77,
+  86, 97, 73, 81, 85, 82, 91, 86, 91, 90,
+  93, 69, 73, 112, 93, 85, 84, 72, 69, 76,
+  92, 84, 83, 78, 76, 91, 79, 81, 89, 99,
+  91, 98, 90, 96, 84, 83, 80, 91, 79, 96,
+  71, 86, 86, 88, 102, 75, 80, 80, 79, 72,
+  83, 101, 76, 85, 79, 81, 70, 83, 83, 91,
+  79, 80, 87, 76, 70, 84, 76, 81, 66, 83,
+  71, 97, 73, 80, 91, 83, 97, 89, 74, 88,
+  84, 89, 90, 88, 83, 74, 79, 65, 91, 88,
+  93, 74, 68, 73, 92, 93, 84, 80, 86, 72,
+  96, 89, 70, 76, 94, 84, 94, 79, 88, 73,
+  76, 78, 77, 75, 65, 78, 88, 88, 82, 83,
+  77, 66, 84, 76, 78, 77, 85, 78, 71, 81,
+  78, 72, 82, 84, 90, 87, 80, 88, 97, 76,
+  65, 109, 91, 87, 74, 64, 71, 89, 91, 90,
+  89, 68, 65, 81, 68, 93, 81, 89, 88, 97,
+  84, 86, 76, 91, 74, 91, 81, 111, 76, 85,
+  78, 83, 90, 75, 81, 76, 77, 69, 82, 86,
+  78, 92, 80, 86, 78, 81, 99, 84, 79, 83,
+  91, 79, 60, 84, 82, 77, 79, 92, 84, 88,
+  78, 75, 78, 91, 95, 76, 77, 79, 87, 78,
+  91, 89, 84, 77, 83, 70, 92, 83, 96, 75,
+  79, 96, 89, 99, 76, 76, 87, 70, 93, 88,
+  60, 86, 93, 93, 92, 80, 80, 83, 92, 82,
+  92, 79, 56, 82, 86, 92, 100, 82, 85, 65,
+  79, 86, 71, 86, 79, 78, 78, 85, 80, 76,
+  81, 92, 96, 84, 74, 79, 94, 92, 83, 94,
+  83, 97, 71, 88, 79, 82, 94, 94, 91, 68,
+  67, 81, 76, 84, 88, 75, 88, 95, 88, 89,
+  96, 98, 82, 88, 91, 104, 90, 78, 78, 90,
+  74, 84, 88, 74, 89, 87, 77, 92, 76, 85,
+  88, 86, 86, 79, 78, 84, 71, 74, 81, 92,
+  114, 84, 73, 82, 78, 73, 98, 78, 83, 98,
+  104, 69, 83, 104, 110, 91, 91, 94, 83, 70,
+  83, 65, 97, 76, 98, 79, 89, 93, 92, 81,
+  78, 79, 91, 82, 82, 107, 114, 84, 97, 57,
+  85, 82, 89, 93, 101, 71, 68, 101, 75, 86,
+  78, 69, 82, 73, 81, 75, 86, 76, 75, 76,
+  77, 86, 84, 84, 93, 96, 74, 83, 84, 80,
+  86, 80, 90, 82, 81, 72, 81, 102, 89, 80,
+  81, 89, 69, 73, 86, 83, 69, 77, 85, 87,
+  88, 66, 89, 94, 93, 85, 88, 95, 79, 77,
+  79, 74, 79, 71, 83, 73, 101, 85, 104, 83,
+  79, 80, 77, 78, 89, 104, 68, 80, 81, 83,
+  72, 84, 76, 94, 77, 75, 90, 83, 93, 84,
+  70, 90, 59, 74, 87, 87, 75, 86, 113, 69,
+  96, 101, 86, 95, 87, 94, 77, 86, 81, 64,
+  106, 72, 110, 91, 93, 85, 71, 73, 91, 82,
+  86, 83, 82, 87, 104, 88, 84, 67, 89, 69,
+  93, 89, 97, 70, 54, 77, 75, 83, 69, 67,
+  87, 72, 67, 83, 75, 71, 76, 76, 80, 79,
+  86, 88, 73, 81, 81, 80, 75, 80, 82, 80,
+  89, 88, 96, 76, 70, 123, 97, 84, 70, 63,
+  71, 87, 85, 86, 76, 63, 78, 85, 73, 81,
+  80, 105, 92, 86, 84, 80, 72, 87, 75, 87,
+  70, 92, 70, 79, 90, 80, 107, 72, 75, 81,
+  77, 72, 85, 94, 71, 80, 82, 82, 70, 82,
+  96, 87, 84, 87, 93, 75, 66, 80, 79, 88,
+  78, 88, 91, 92, 72, 80, 93, 86, 92, 88,
+  77, 85, 84, 87, 79, 93, 88, 84, 101, 69,
+  102, 88, 83, 81, 80, 81, 93, 98, 73, 81,
+  88, 73, 91, 86, 68, 88, 96, 79, 91, 87,
+  91, 70, 77, 81, 90, 81, 63, 75, 79, 78,
+  85, 75, 78, 64, 79, 77, 82, 80, 84, 84,
+  71, 88, 84, 83, 76, 86, 91, 83, 77, 79,
+  108, 85, 71, 110, 80, 91, 73, 72, 78, 87,
+  84, 91, 86, 73, 76, 82, 70, 96, 81, 87,
+  85, 88, 86, 89, 97, 94, 80, 97, 82, 111,
+  87, 82, 86, 87, 87, 76, 77, 84, 86, 92,
+  73, 71, 92, 84, 78, 92, 87, 68, 86, 78,
+  70, 87, 67, 90, 101, 79, 79, 89, 86, 93,
+  91, 83, 97, 96, 79, 64, 77, 92, 106, 89,
+  81, 90, 83, 75, 83, 69, 91, 82, 86, 73,
+  96, 98, 101, 87, 79, 93, 87, 90, 84, 100,
+  98, 81, 85, 76, 80, 98, 83, 86, 93, 79,
+  73, 111, 81, 86, 78, 73, 86, 84, 85, 75,
+  93, 72, 77, 81, 91, 85, 92, 85, 95, 91,
+  78, 84, 93, 77, 96, 81, 70, 76, 78, 80,
+  75, 79, 77, 77, 78, 91, 76, 81, 91, 78,
+  69, 82, 91, 86, 81, 73, 95, 77, 86, 76,
+  90, 97, 88, 73, 82, 86, 82, 71, 84, 78,
+  102, 82, 88, 95, 76, 77, 83, 90, 77, 93,
+  77, 81, 79, 86, 86, 82, 76, 85, 66, 79,
+  78, 89, 104, 82, 79, 97, 63, 82, 86, 76,
+  94, 88, 99, 64, 87, 110, 102, 94, 93, 91,
+  70, 89, 83, 62, 106, 71, 89, 89, 97, 96,
+  80, 79, 85, 82, 86, 88, 79, 100, 102, 78,
+  94, 71, 76, 80, 84, 91, 92, 80, 66, 92,
+  78, 85, 76, 78, 89, 66, 74, 83, 79, 71,
+  76, 81, 83, 85, 85, 87, 87, 86, 75, 85,
+  75, 81, 80, 78, 94, 79, 80, 81, 77, 102,
+  96, 79, 77, 82, 78, 80, 89, 79, 65, 76,
+  85, 89, 82, 69, 90, 103, 94, 81, 95, 88,
+  84, 74, 73, 88, 75, 71, 75, 78, 97, 78,
+  103, 85, 86, 74, 81, 88, 74, 103, 76, 75,
+  81, 84, 76, 80, 93, 90, 75, 84, 82, 80,
+  80, 79, 87, 93, 73, 94, 85, 87, 86, 85,
+  94, 90, 91, 104, 86, 93, 83, 91, 75, 99,
+  91, 83, 113, 75, 81, 89, 87, 85, 86, 88,
+  91, 88, 79, 84, 84, 85, 96, 80, 90, 87,
+  81, 79, 87, 83, 91, 76, 76, 89, 84, 80,
+  80, 89, 76, 72, 85, 80, 81, 73, 85, 72,
+  77, 85, 86, 88, 75, 88, 82, 93, 67, 84,
+  87, 75, 92, 76, 100, 85, 77, 98, 88, 88,
+  83, 81, 81, 82, 93, 81, 84, 81, 75, 91,
+  77, 86, 88, 92, 88, 87, 92, 88, 105, 84,
+  80, 87, 88, 86, 81, 81, 90, 82, 97, 80,
+  99, 83, 74, 79, 89, 88, 69, 86, 91, 80,
+  81, 80, 92, 82, 68, 81, 87, 89, 86, 75,
+  83, 91, 73, 83, 85, 74, 85, 87, 84, 101,
+  88, 92, 72, 80, 79, 91, 73, 84, 92, 81,
+  85, 76, 90, 77, 84, 83, 78, 79, 80, 81,
+  93, 88, 86, 79, 80, 84, 83, 93, 89, 91,
+  90, 80, 96, 88, 87, 87, 98, 93, 75, 87,
+  97, 90, 98, 91, 71, 79, 78, 95, 79, 87,
+  88, 93, 74, 78, 74, 85, 84, 92, 92, 76,
+  82, 100, 74, 85, 88, 91, 91, 87, 71, 82,
+  73, 84, 80, 87, 86, 76, 83, 84, 80, 73,
+  79, 65, 80, 82, 84, 84, 77, 79, 79, 81,
+  103, 79, 84, 88, 92, 94, 95, 89, 83, 86,
+  53, 79, 85, 72, 88, 83, 92, 84, 72, 80,
+  88, 66, 80, 80, 89, 94, 82, 74, 85, 87,
+  72, 85, 88, 90, 88, 83, 80, 78, 88, 79,
+  84, 93, 76, 83, 79, 79, 82, 89, 84, 76,
+  83, 96, 76, 89, 94, 68, 76, 85, 75, 90,
+  95, 80, 88, 88, 99, 86, 87, 79, 83, 74,
+  80, 76, 82, 87, 84, 88, 87, 80, 96, 73,
+  86, 84, 86, 80, 88, 94, 88, 74, 88, 80,
+  85, 67, 79, 65, 79, 77, 88, 82, 75, 91,
+  74, 84, 80, 80, 86, 73, 70, 85, 64, 79,
+  81, 87, 86, 79, 84, 96, 82, 80, 81, 72,
+  89, 82, 67, 78, 73, 76, 81, 89, 95, 82,
+  89, 90, 94, 81, 90, 91, 88, 95, 83, 86,
+  90, 73, 96, 78, 92, 87, 76, 85, 76, 69,
+  93, 82, 92, 93, 84, 81, 81, 83, 74, 78,
+  93, 97, 85, 84, 75, 94, 89, 80, 85, 97,
+  86, 83, 95, 90, 75, 71, 95, 76, 75, 108,
+  78, 91, 97, 74, 81, 83, 70, 98, 88, 87,
+  97, 97, 103, 95, 83, 85, 84, 77, 81, 81,
+  97, 77, 80, 88, 95, 91, 95, 73, 83, 74,
+  93, 82, 97, 86, 99, 75, 92, 80, 80, 81,
+  96, 77, 87, 78, 87, 80, 72, 73, 79, 84,
+  78, 94, 85, 82, 74, 82, 79, 78, 87, 91,
+  90, 84, 86, 98, 86, 79, 82, 80, 90, 80,
+  74, 78, 83, 87, 86, 88, 83, 87, 88, 90,
+  96, 77, 83, 80, 112, 86, 69, 84, 94, 92,
+  67, 71, 76, 83, 85, 86, 81, 114, 59, 77,
+  78, 63, 75, 88, 76, 73, 70, 85, 85, 64,
+  89, 89, 102, 133, 78, 103, 71, 81, 86, 90,
+  129, 82, 116, 57, 94, 85, 77, 61, 94, 64,
+  75, 96, 90, 59, 111, 59, 71, 80, 69, 94,
+  80, 72, 81, 103, 88, 89, 101, 92, 68, 88,
+  93, 103, 95, 93, 68, 96, 96, 85, 66, 76,
+  87, 79, 88, 95, 78, 102, 70, 91, 63, 103,
+  84, 114, 73, 79, 78, 105, 93, 83, 98, 87,
+  92, 95, 85, 92, 81, 124, 81, 93, 89, 85,
+  71, 84, 88, 69, 67, 64, 67, 82, 79, 101,
+  48, 89, 84, 87, 111, 70, 63, 77, 68, 94,
+  91, 92, 95, 93, 63, 78, 77, 125, 89, 80,
+  71, 91, 74, 79, 85, 79, 66, 79, 78, 87,
+  80, 80, 78, 89, 70, 97, 74, 78, 93, 88,
+  88, 108, 84, 89, 87, 86, 80, 87, 105, 69,
+  94, 88, 80, 105, 77, 79, 83, 73, 82, 127,
+  83, 94, 76, 76, 80, 75, 90, 65, 96, 63,
+  78, 94, 88, 78, 66, 68, 47, 87, 78, 93,
+  81, 64, 70, 86, 86, 80, 84, 86, 92, 69,
+  69, 87, 78, 73, 92, 93, 66, 71, 80, 91,
+  60, 80, 81, 81, 86, 74, 88, 69, 90, 73,
+  80, 88, 56, 126, 81, 93, 78, 71, 70, 89,
+  83, 90, 79, 70, 86, 89, 46, 80, 53, 83,
+  83, 85, 107, 89, 88, 84, 73, 75, 85, 124,
+  77, 93, 87, 75, 79, 88, 104, 82, 89, 93,
+  76, 82, 68, 70, 85, 84, 85, 103, 89, 73,
+  80, 99, 72, 83, 84, 95, 89, 88, 77, 79,
+  91, 73, 93, 88, 82, 83, 59, 81, 83, 85,
+  82, 80, 84, 106, 84, 95, 89, 87, 77, 87,
+  69, 103, 90, 81, 102, 83, 92, 88, 78, 89,
+  85, 77, 64, 66, 76, 81, 77, 83, 94, 71,
+  97, 76, 82, 82, 99, 87, 81, 80, 81, 83,
+  92, 78, 91, 80, 86, 73, 85, 79, 88, 79,
+  95, 69, 76, 72, 72, 89, 80, 77, 80, 80,
+  70, 77, 82, 95, 86, 71, 80, 99, 83, 85,
+  85, 87, 93, 83, 56, 69, 73, 85, 82, 90,
+  87, 77, 95, 92, 97, 78, 78, 90, 104, 83,
+  76, 84, 91, 91, 76, 75, 70, 82, 83, 87,
+  88, 118, 62, 80, 75, 72, 80, 79, 74, 88,
+  74, 83, 72, 78, 90, 93, 90, 107, 88, 97,
+  85, 85, 72, 89, 89, 78, 77, 73, 91, 81,
+  85, 74, 80, 77, 74, 99, 90, 73, 100, 87,
+  86, 81, 67, 79, 80, 75, 80, 88, 90, 93,
+  101, 80, 71, 86, 65, 82, 100, 84, 63, 84,
+  90, 83, 65, 77, 87, 83, 85, 81, 83, 92,
+  76, 85, 79, 92, 85, 106, 93, 100, 89, 92,
+  82, 74, 91, 83, 85, 86, 89, 84, 74, 91,
+  78, 93, 82, 83, 92, 86, 81, 83, 80, 73,
+  78, 85, 89, 92, 82, 74, 81, 85, 109, 81,
+  80, 83, 85, 84, 90, 83, 93, 84, 94, 89,
+  73, 83, 90, 83, 84, 89, 80, 84, 88, 97,
+  71, 90, 79, 89, 81, 80, 78, 95, 76, 85,
+  67, 85, 90, 87, 82, 111, 87, 86, 86, 81,
+  71, 68, 104, 83, 66, 88, 85, 89, 76, 97,
+  81, 78, 87, 86, 79, 84, 80, 92, 85, 76,
+  86, 58, 93, 73, 79, 91, 78, 74, 78, 73,
+  63, 90, 71, 81, 85, 80, 42, 73, 83, 85,
+  82, 82, 85, 73, 69, 81, 83, 75, 83, 88,
+  83, 79, 71, 82, 81, 83, 80, 93, 76, 73,
+  81, 77, 87, 66, 79, 82, 72, 69, 79, 91,
+  68, 73, 78, 99, 73, 86, 89, 79, 85, 89,
+  80, 79, 84, 78, 83, 77, 97, 86, 90, 88,
+  88, 70, 87, 97, 83, 92, 97, 84, 81, 82,
+  92, 84, 93, 91, 79, 81, 75, 83, 89, 89,
+  87, 101, 85, 80, 77, 94, 80, 72, 79, 93,
+  82, 87, 74, 92, 89, 77, 90, 90, 79, 84,
+  75, 92, 78, 79, 85, 74, 82, 110, 85, 90,
+  86, 82, 80, 74, 68, 100, 77, 85, 96, 70,
+  95, 94, 85, 90, 79, 84, 66, 72, 91, 78,
+  87, 82, 93, 96, 70, 72, 73, 83, 100, 82,
+  87, 77, 63, 87, 91, 74, 81, 84, 90, 81,
+  77, 80, 82, 81, 84, 98, 76, 77, 78, 92,
+  85, 74, 85, 80, 84, 72, 82, 92, 85, 78,
+  78, 92, 80, 84, 84, 86, 91, 85, 82, 82,
+  84, 88, 85, 74, 77, 86, 88, 91, 99, 78,
+  85, 82, 106, 67, 100, 116, 72, 120, 81, 79,
+  90, 88, 76, 97, 87, 78, 70, 92, 93, 98,
+  121, 109, 77, 122, 71, 69, 83, 73, 81, 116,
+  107, 107, 103, 149, 74, 83, 74, 99, 89, 106,
+  84, 73, 76, 79, 97, 95, 79, 107, 95, 81,
+  87, 83, 84, 88, 81, 75, 101, 90, 87, 93,
+  90, 88, 89, 67, 82, 71, 70, 75, 83, 98,
+  72, 90, 87, 103, 73, 106, 76, 101, 90, 77,
+  91, 69, 75, 82, 71, 64, 86, 76, 79, 110,
+  83, 83, 87, 107, 100, 68, 89, 84, 95, 81,
+  64, 52, 89, 85, 95, 85, 85, 103, 79, 89,
+  74, 111, 79, 96, 64, 80, 93, 78, 84, 106,
+  77, 80, 98, 119, 89, 94, 83, 71, 82, 71,
+  77, 62, 100, 95, 75, 115, 96, 82, 77, 83,
+  72, 83, 97, 81, 79, 84, 73, 83, 80, 84,
+  66, 84, 65, 83, 83, 82, 72, 87, 94, 108,
+  83, 114, 71, 81, 79, 106, 83, 101, 79, 87,
+  74, 76, 98, 82, 82, 93, 87, 90, 76, 98,
+  80, 95, 91, 71, 80, 84, 71, 84, 99, 86,
+  83, 75, 74, 54, 83, 69, 86, 85, 68, 92,
+  76, 100, 80, 87, 75, 94, 84, 72, 89, 90,
+  86, 81, 77, 78, 74, 81, 97, 94, 84, 83,
+  89, 89, 92, 89, 85, 87, 88, 83, 65, 74,
+  80, 81, 83, 82, 84, 96, 78, 75, 73, 86,
+  79, 85, 67, 95, 81, 89, 93, 87, 86, 91,
+  109, 102, 88, 86, 89, 80, 83, 77, 77, 62,
+  84, 79, 83, 91, 95, 84, 79, 73, 87, 82,
+  90, 82, 85, 88, 81, 93, 71, 78, 70, 69,
+  69, 87, 86, 79, 75, 70, 85, 100, 81, 78,
+  79, 80, 87, 91, 85, 93, 87, 83, 76, 88,
+  95, 80, 95, 79, 92, 91, 79, 99, 86, 96,
+  80, 87, 85, 81, 73, 79, 94, 89, 84, 88,
+  76, 64, 84, 88, 89, 80, 80, 90, 83, 87,
+  93, 63, 77, 79, 78, 69, 84, 91, 86, 84,
+  89, 80, 88, 81, 94, 78, 87, 80, 96, 77,
+  75, 91, 79, 93, 89, 89, 66, 95, 83, 81,
+  74, 87, 79, 87, 78, 80, 82, 57, 90, 83,
+  77, 84, 87, 89, 85, 83, 77, 94, 98, 86,
+  74, 77, 86, 90, 82, 83, 93, 80, 105, 106,
+  73, 115, 84, 73, 82, 92, 70, 94, 86, 76,
+  74, 82, 77, 89, 97, 98, 69, 102, 77, 77,
+  84, 76, 85, 102, 83, 103, 80, 128, 72, 79,
+  71, 99, 81, 97, 92, 79, 75, 66, 87, 93,
+  74, 96, 100, 81, 79, 90, 74, 80, 92, 68,
+  82, 83, 83, 90, 87, 85, 88, 70, 73, 77,
+  86, 74, 84, 89, 70, 91, 75, 94, 70, 100,
+  86, 94, 81, 76, 113, 69, 88, 86, 66, 69,
+  80, 92, 82, 101, 82, 85, 86, 91, 89, 76,
+  84, 81, 90, 77, 81, 61, 91, 79, 90, 79,
+  82, 98, 84, 87, 82, 105, 74, 90, 71, 82,
+  78, 86, 83, 100, 78, 78, 101, 101, 91, 92,
+  87, 85, 84, 71, 77, 73, 89, 83, 81, 92,
+  93, 78, 80, 84, 74, 86, 97, 84, 88, 80,
+  72, 76, 59, 76, 63, 81, 66, 85, 87, 85,
+  80, 76, 80, 97, 79, 86, 75, 80, 74, 97,
+  78, 91, 87, 90, 71, 71, 86, 84, 78, 86,
+  99, 91, 78, 98, 84, 83, 95, 66, 71, 80,
+  74, 85, 96, 86, 80, 81, 72, 65, 77, 72,
+  93, 82, 70, 80, 79, 91, 87, 88, 85, 79,
+  79, 73, 92, 94, 93, 89, 77, 76, 74, 88,
+  100, 82, 86, 79, 84, 84, 80, 91, 84, 79,
+  82, 82, 74, 85, 76, 76, 81, 82, 83, 81,
+  83, 81, 79, 80, 75, 81, 78, 86, 81, 93,
+  78, 83, 85, 86, 111, 84, 78, 86, 88, 92,
+  86, 82, 80, 72, 76, 78, 87, 71, 90, 81,
+  86, 75, 94, 86, 93, 89, 89, 81, 85, 88,
+  62, 80, 74, 73, 71, 88, 93, 80, 85, 65,
+  78, 95, 81, 64, 83, 78, 87, 88, 76, 82,
+  94, 79, 70, 89, 84, 85, 97, 81, 92, 93,
+  81, 98, 87, 87, 79, 89, 84, 85, 84, 83,
+  87, 92, 82, 92, 72, 81, 82, 96, 96, 85,
+  85, 86, 81, 82, 100, 66, 82, 70, 78, 71,
+  75, 89, 90, 88, 93, 73, 93, 82, 91, 76,
+  86, 77, 96, 74, 72, 95, 79, 81, 86, 86,
+  79, 101, 77, 82, 76, 87, 77, 81, 88, 85,
+  92, 56, 85, 82, 84, 80, 91, 86, 85, 83,
+  76, 88, 96, 77, 65, 76, 81, 93, 83, 84,
+  94, 81, 83, 92, 76, 113, 82, 77, 87, 80,
+  80, 94, 86, 90, 79, 80, 73, 88, 89, 84,
+  68, 86, 84, 86, 79, 82, 83, 89, 95, 102,
+  77, 113, 76, 78, 72, 89, 90, 88, 93, 96,
+  84, 69, 82, 92, 80, 87, 91, 86, 77, 88,
+  85, 85, 90, 71, 90, 95, 81, 87, 80, 79,
+  84, 77, 75, 82, 85, 77, 95, 83, 72, 87,
+  68, 86, 77, 92, 88, 85, 79, 74, 96, 75,
+  93, 83, 73, 71, 80, 89, 88, 86, 83, 88,
+  85, 95, 78, 82, 77, 80, 96, 82, 81, 76,
+  89, 80, 81, 85, 82, 79, 79, 88, 89, 80,
+  72, 81, 76, 83, 75, 92, 83, 91, 77, 68,
+  103, 83, 85, 86, 90, 98, 84, 81, 82, 72,
+  72, 86, 83, 88, 89, 78, 89, 77, 87, 85,
+  93, 91, 90, 81, 75, 87, 66, 78, 64, 81,
+  70, 83, 84, 83, 79, 72, 84, 92, 82, 85,
+  78, 80, 78, 85, 79, 85, 86, 94, 79, 76,
+  87, 93, 80, 79, 90, 89, 80, 91, 90, 90,
+  84, 78, 83, 87, 77, 86, 88, 87, 85, 84,
+  75, 76, 90, 85, 96, 80, 75, 83, 81, 86,
+  87, 75, 84, 72, 77, 73, 74, 91, 92, 90,
+  84, 71, 84, 82, 95, 73, 84, 80, 90, 88,
+  74, 90, 77, 78, 86, 88, 77, 94, 78, 83,
+  81, 85, 80, 74, 81, 83, 88, 65, 75, 79,
+  82, 81, 86, 88, 76, 87, 83, 76, 106, 76,
+  65, 83, 83, 93, 87, 91, 80, 75, 73, 84,
+  86, 80, 82, 83, 87, 74, 95, 87, 87, 91,
+  82, 84, 78, 95, 71, 81, 75, 74, 79, 81,
+  94, 69, 86, 69, 78, 95, 83, 72, 82, 77,
+  84, 85, 80, 82, 93, 79, 81, 91, 82, 88,
+  94, 83, 95, 97, 80, 92, 86, 91, 71, 97,
+  86, 87, 83, 84, 83, 86, 87, 91, 81, 86,
+  87, 96, 89, 82, 82, 84, 78, 83, 97, 56,
+  81, 69, 79, 69, 70, 80, 87, 90, 95, 70,
+  93, 75, 90, 73, 82, 77, 98, 76, 71, 89,
+  76, 78, 89, 85, 81, 101, 82, 92, 82, 85,
+  79, 77, 81, 86, 99, 57, 78, 78, 81, 80,
+  91, 91, 94, 78, 76, 85, 98, 74, 70, 72,
+  78, 91, 87, 90, 79, 86, 84, 83, 71, 91,
+  92, 66, 83, 65, 70, 72, 87, 85, 80, 68,
+  79, 86, 70, 85, 84, 89, 86, 102, 71, 82,
+  82, 87, 89, 86, 91, 81, 87, 74, 71, 80,
+  73, 113, 85, 83, 80, 69, 92, 87, 71, 77,
+  76, 83, 87, 83, 83, 96, 92, 96, 91, 75,
+  79, 87, 85, 84, 104, 83, 86, 76, 71, 81,
+  89, 91, 80, 71, 66, 83, 79, 86, 69, 80,
+  77, 79, 80, 66, 93, 80, 83, 86, 90, 81,
+  75, 86, 99, 86, 66, 73, 85, 102, 71, 100,
+  90, 83, 82, 81, 70, 82, 81, 79, 104, 88,
+  70, 91, 78, 72, 79, 76, 83, 95, 93, 92,
+  105, 98, 70, 97, 96, 78, 77, 67, 89, 71,
+  77, 119, 76, 97, 72, 86, 73, 67, 84, 73,
+  81, 63, 74, 71, 91, 85, 81, 70, 85, 92,
+  62, 102, 90, 84, 72, 95, 70, 83, 85, 86,
+  94, 66, 86, 85, 88, 73, 76, 62, 75, 125,
+  87, 81, 85, 69, 84, 90, 75, 74, 85, 72,
+  88, 81, 82, 90, 100, 98, 87, 86, 74, 95,
+  86, 91, 102, 77, 92, 84, 57, 88, 93, 93,
+  79, 61, 80, 78, 76, 86, 68, 73, 80, 70,
+  85, 63, 94, 80, 88, 79, 86, 70, 82, 79,
+  116, 81, 69, 82, 78, 107, 63, 96, 91, 94,
+  82, 77, 73, 87, 87, 84, 96, 94, 73, 91,
+  70, 73, 75, 76, 83, 77, 89, 84, 78, 93,
+  61, 96, 90, 76, 74, 68, 88, 78, 73, 128,
+  74, 100, 70, 73, 78, 88, 91, 74, 83, 66,
+  70, 85, 92, 79, 84, 76, 81, 82, 72, 99,
+  89, 86, 87, 103, 67, 87, 88, 83, 79, 61,
+  87, 84, 85, 72, 85, 79, 84, 108, 82, 79,
+  80, 65, 81, 86, 81, 81, 81, 84, 95, 80,
+  78, 83, 89, 98, 93, 84, 78, 90, 88, 83,
+  97, 83, 82, 74, 82, 82, 87, 87, 83, 65,
+  107, 85, 95, 82, 74, 77, 80, 85, 85, 71,
+  97, 75, 82, 84, 82, 74, 94, 85, 93, 91,
+  68, 81, 86, 103, 82, 103, 94, 76, 80, 81,
+  73, 89, 84, 81, 101, 87, 74, 90, 84, 75,
+  78, 77, 86, 75, 71, 87, 70, 99, 78, 96,
+  89, 85, 78, 72, 88, 77, 77, 106, 89, 88,
+  76, 103, 83, 95, 83, 71, 85, 79, 66, 79,
+  82, 85, 76, 77, 89, 82, 87, 70, 94, 89,
+  74, 98, 85, 85, 85, 86, 87, 74, 98, 77,
+  77, 83, 61, 81, 73, 127, 89, 84, 89, 73,
+  82, 84, 70, 83, 74, 83, 79, 76, 100, 82,
+  86, 95, 97, 83, 82, 82, 89, 90, 106, 67,
+  69, 70, 60, 92, 83, 89, 88, 55, 75, 90,
+  77, 93, 71, 85, 91, 117, 68, 68, 89, 89,
+  94, 73, 93, 81, 85, 85, 89, 79, 65, 76,
+  85, 114, 70, 88, 86, 88, 91, 79, 66, 84,
+  69, 81, 75, 110, 91, 80, 78, 65, 75, 77,
+  79, 89, 79, 95, 101, 86, 76, 80, 83, 63,
+  85, 64, 85, 80, 81, 95, 87, 94, 73, 106,
+  81, 76, 76, 79, 75, 71, 66, 81, 79, 87,
+  72, 69, 91, 93, 85, 78, 85, 85, 76, 85,
+  91, 89, 80, 76, 91, 66, 100, 86, 74, 87,
+  66, 69, 72, 104, 88, 74, 91, 65, 84, 87,
+  75, 83, 76, 88, 75, 64, 102, 80, 83, 97,
+  99, 88, 93, 81, 105, 85, 110, 76, 82, 78,
+  59, 98, 80, 98, 88, 56, 64, 80, 77, 81,
+  58, 83, 93, 98, 71, 55, 86, 86, 100, 80,
+  96, 79, 88, 78, 81, 68, 67, 76, 79, 117,
+  70, 92, 82, 107, 79, 74, 68, 96, 67, 86,
+  64, 126, 106, 75, 63, 61, 70, 72, 78, 91,
+  78, 100, 84, 77, 69, 81, 82, 66, 75, 64,
+  77, 86, 70, 100, 85, 95, 81, 95, 82, 86,
+  77, 73, 87, 80, 68, 83, 88, 80, 81, 82,
+  89, 82, 90, 78, 77, 91, 88, 98, 82, 81,
+  87, 89, 81, 61, 93, 87, 78, 84, 80, 83,
+  74, 122, 82, 84, 90, 70, 90, 84, 75, 77,
+  83, 103, 85, 76, 89, 80, 89, 93, 92, 86,
+  81, 84, 91, 85, 99, 75, 68, 67, 77, 89,
+  81, 83, 92, 53, 85, 89, 82, 88, 69, 77,
+  88, 83, 76, 71, 92, 86, 91, 90, 87, 85,
+  84, 80, 88, 86, 65, 71, 84, 118, 68, 91,
+  87, 84, 77, 72, 70, 83, 74, 84, 80, 103,
+  89, 84, 76, 72, 74, 81, 83, 94, 73, 83,
+  79, 90, 87, 83, 86, 73, 84, 65, 83, 85,
+  80, 94, 88, 100, 74, 93, 84, 93, 75, 82,
+  81, 92, 69, 88, 78, 81, 72, 79, 93, 71,
+  92, 71, 90, 97, 66, 79, 87, 79, 102, 86,
+  88, 78, 95, 72, 76, 83, 75, 95, 95, 101,
+  93, 90, 92, 70, 68, 87, 78, 82, 84, 88,
+  76, 80, 93, 82, 88, 94, 86, 89, 89, 66,
+  82, 76, 90, 67, 84, 75, 64, 80, 84, 93,
+  106, 78, 97, 93, 94, 81, 69, 90, 95, 108,
+  79, 67, 89, 88, 105, 79, 95, 85, 103, 76,
+  72, 88, 79, 89, 94, 91, 79, 72, 83, 76,
+  87, 72, 75, 93, 83, 80, 58, 94, 98, 80,
+  87, 78, 74, 95, 97, 81, 86, 85, 93, 81,
+  93, 75, 89, 75, 94, 79, 101, 82, 73, 75,
+  82, 91, 81, 94, 80, 89, 69, 86, 70, 82,
+  71, 92, 72, 90, 65, 66, 85, 81, 90, 71,
+  81, 85, 80, 68, 95, 79, 97, 76, 98, 87,
+  106, 77, 79, 89, 79, 86, 95, 64, 77, 72,
+  96, 61, 79, 96, 90, 88, 86, 97, 76, 73,
+  84, 75, 80, 94, 89, 83, 95, 68, 103, 73,
+  94, 77, 97, 79, 73, 86, 83, 109, 103, 77,
+  76, 89, 90, 74, 58, 90, 93, 102, 78, 57,
+  91, 86, 115, 87, 101, 90, 96, 77, 59, 79,
+  82, 87, 95, 85, 85, 78, 72, 88, 80, 69,
+  80, 93, 74, 81, 55, 102, 120, 78, 77, 75,
+  76, 92, 94, 104, 90, 95, 102, 70, 88, 80,
+  95, 74, 83, 89, 98, 83, 67, 74, 93, 87,
+  95, 95, 83, 70, 71, 77, 84, 87, 71, 86,
+  84, 91, 83, 78, 99, 72, 93, 71, 64, 97,
+  87, 82, 88, 79, 96, 88, 82, 81, 95, 83,
+  81, 85, 79, 86, 88, 97, 74, 91, 86, 74,
+  87, 90, 76, 80, 93, 98, 80, 83, 84, 76,
+  89, 90, 88, 81, 81, 74, 86, 77, 93, 78,
+  87, 75, 75, 76, 88, 88, 104, 80, 78, 91,
+  85, 84, 65, 85, 93, 82, 80, 70, 92, 87,
+  98, 94, 93, 99, 75, 75, 71, 82, 78, 77,
+  88, 96, 81, 78, 86, 81, 72, 60, 72, 79,
+  85, 81, 66, 97, 90, 82, 81, 85, 80, 94,
+  97, 118, 83, 88, 100, 88, 94, 81, 95, 81,
+  93, 78, 100, 82, 79, 80, 82, 96, 88, 69,
+  87, 76, 87, 74, 68, 72, 72, 87, 88, 82,
+  85, 75, 90, 79, 72, 81, 71, 83, 87, 96,
+  59, 92, 82, 71, 80, 83, 89, 81, 79, 73,
+  92, 72, 79, 83, 85, 93, 76, 84, 75, 73,
+  89, 73, 80, 92, 83, 92, 81, 94, 84, 79,
+  83, 88, 80, 80, 83, 82, 83, 90, 81, 60,
+  81, 70, 82, 80, 80, 84, 79, 91, 86, 78,
+  97, 66, 77, 90, 108, 95, 86, 76, 84, 79,
+  87, 70, 89, 94, 84, 91, 88, 69, 78, 98,
+  79, 81, 89, 89, 100, 85, 84, 84, 77, 89,
+  88, 76, 81, 84, 91, 71, 88, 82, 74, 94,
+  83, 86, 83, 91, 75, 86, 71, 80, 70, 84,
+  88, 100, 85, 89, 79, 114, 81, 87, 81, 75,
+  94, 79, 74, 82, 69, 90, 92, 81, 79, 78,
+  76, 75, 74, 87, 74, 76, 105, 100, 63, 88,
+  87, 77, 106, 83, 80, 81, 69, 81, 103, 88,
+  87, 87, 76, 91, 72, 69, 67, 76, 75, 88,
+  86, 79, 76, 85, 86, 89, 97, 67, 82, 97,
+  73, 74, 99, 80, 78, 76, 80, 56, 67, 47,
+  69, 71, 72, 86, 114, 95, 77, 86, 97, 77,
+  77, 108, 120, 84, 82, 80, 78, 83, 72, 69,
+  104, 97, 84, 97, 77, 82, 89, 99, 106, 74,
+  85, 85, 114, 68, 83, 76, 70, 91, 90, 91,
+  84, 76, 85, 85, 80, 94, 68, 99, 81, 85,
+  70, 84, 78, 79, 72, 92, 78, 83, 93, 94,
+  84, 82, 95, 99, 82, 111, 83, 74, 82, 85,
+  87, 88, 86, 99, 82, 94, 67, 78, 85, 81,
+  123, 90, 95, 110, 112, 83, 68, 75, 97, 97,
+  124, 87, 83, 110, 72, 91, 75, 82, 81, 94,
+  78, 76, 74, 61, 74, 101, 70, 100, 86, 71,
+  73, 75, 89, 86, 96, 71, 107, 87, 96, 74,
+  91, 85, 80, 75, 83, 59, 59, 54, 66, 90,
+  83, 82, 122, 86, 79, 95, 80, 92, 80, 115,
+  119, 70, 78, 81, 71, 90, 75, 80, 95, 102,
+  70, 103, 67, 81, 86, 77, 126, 71, 88, 80,
+  114, 60, 92, 79, 82, 95, 89, 102, 90, 76,
+  84, 95, 80, 112, 66, 90, 86, 77, 77, 85,
+  82, 70, 85, 96, 77, 94, 94, 82, 79, 74,
+  86, 71, 89, 78, 80, 82, 83, 73, 79, 71,
+  85, 87, 88, 89, 88, 77, 89, 87, 74, 83,
+  83, 89, 74, 86, 75, 83, 84, 68, 79, 85,
+  96, 82, 90, 74, 90, 72, 82, 81, 87, 76,
+  76, 97, 82, 83, 96, 67, 79, 90, 87, 97,
+  87, 90, 82, 93, 89, 80, 89, 85, 76, 92,
+  88, 92, 79, 86, 87, 96, 86, 89, 92, 81,
+  79, 91, 86, 74, 83, 70, 84, 84, 71, 88,
+  89, 83, 96, 88, 95, 76, 83, 81, 82, 80,
+  91, 65, 77, 88, 78, 84, 87, 89, 87, 99,
+  85, 94, 84, 85, 76, 78, 81, 92, 94, 59,
+  98, 79, 82, 92, 88, 86, 85, 96, 76, 85,
+  71, 80, 60, 86, 81, 80, 85, 100, 81, 95,
+  76, 78, 82, 80, 91, 71, 83, 70, 76, 90,
+  87, 87, 90, 77, 83, 78, 67, 77, 78, 78,
+  73, 95, 72, 95, 77, 67, 86, 82, 88, 82,
+  88, 83, 96, 72, 83, 85, 72, 89, 69, 71,
+  77, 81, 84, 77, 82, 78, 86, 92, 91, 87,
+  90, 81, 73, 82, 79, 81, 86, 89, 85, 82,
+  76, 76, 67, 76, 86, 82, 85, 77, 82, 88,
+  79, 82, 96, 73, 79, 88, 95, 91, 90, 86,
+  87, 78, 82, 74, 93, 82, 88, 92, 81, 76,
+  84, 102, 86, 86, 86, 91, 100, 90, 82, 83,
+  79, 90, 85, 75, 80, 90, 86, 67, 85, 81,
+  81, 96, 86, 87, 70, 98, 76, 83, 75, 75,
+  68, 81, 80, 91, 87, 92, 85, 104, 77, 94,
+  79, 69, 89, 71, 79, 86, 74, 94, 87, 91,
+  76, 75, 75, 77, 87, 77, 77, 91, 100, 91,
+  70, 87, 94, 85, 91, 86, 86, 90, 72, 87,
+  88, 77, 85, 85, 73, 85, 71, 57, 72, 83,
+  68, 78, 90, 71, 81, 90, 80, 85, 96, 72,
+  77, 81, 79, 80, 84, 85, 86, 82, 77, 76,
+  75, 66, 82, 80, 76, 82, 112, 80, 73, 94,
+  92, 81, 78, 111, 132, 64, 90, 84, 73, 76,
+  78, 83, 82, 90, 83, 89, 73, 79, 89, 91,
+  109, 83, 86, 76, 104, 64, 82, 71, 91, 91,
+  89, 83, 79, 82, 90, 80, 83, 92, 75, 94,
+  90, 72, 79, 90, 80, 77, 81, 85, 76, 84,
+  85, 90, 84, 77, 85, 76, 90, 84, 82, 77,
+  79, 79, 83, 81, 87, 90, 83, 81, 75, 82,
+  74, 98, 79, 88, 78, 85, 89, 83, 77, 67,
+  95, 79, 82, 87, 92, 79, 92, 76, 89, 74,
+  83, 84, 89, 74, 91, 92, 90, 82, 90, 72,
+  87, 83, 82, 96, 92, 88, 82, 94, 94, 79,
+  93, 87, 78, 93, 88, 90, 82, 89, 95, 95,
+  85, 87, 85, 89, 74, 89, 86, 72, 86, 73,
+  81, 89, 83, 74, 85, 87, 98, 96, 91, 80,
+  78, 81, 83, 88, 102, 70, 80, 80, 77, 85,
+  83, 80, 84, 93, 97, 95, 85, 83, 81, 81,
+  83, 88, 101, 65, 92, 84, 81, 95, 87, 82,
+  91, 89, 77, 90, 77, 76, 67, 79, 86, 80,
+  90, 95, 88, 86, 81, 84, 85, 80, 88, 73,
+  88, 73, 85, 91, 92, 89, 93, 78, 82, 94,
+  73, 85, 74, 84, 77, 87, 77, 77, 79, 72,
+  77, 89, 92, 82, 91, 85, 91, 71, 82, 84,
+  82, 86, 82, 92, 93, 84, 86, 72, 85, 78,
+  80, 97, 97, 92, 87, 88, 85, 82, 85, 87,
+  81, 91, 90, 83, 77, 90, 77, 93, 85, 81,
+  90, 83, 78, 91, 81, 71, 87, 68, 81, 78,
+  83, 90, 88, 84, 96, 83, 89, 75, 88, 81,
+  84, 90, 88, 75, 80, 91, 78, 85, 86, 94,
+  87, 98, 87, 94, 82, 90, 78, 79, 78, 93,
+  95, 67, 84, 82, 79, 96, 85, 84, 77, 99,
+  80, 82, 78, 74, 65, 75, 78, 86, 89, 96,
+  79, 100, 79, 89, 80, 74, 90, 70, 88, 76,
+  82, 97, 86, 92, 87, 72, 78, 90, 82, 76,
+  70, 78, 107, 85, 73, 86, 78, 80, 80, 78,
+  86, 85, 77, 83, 89, 76, 84, 79, 75, 91,
+  78, 67, 83, 86, 71, 85, 88, 76, 82, 92,
+  89, 83, 87, 81, 81, 82, 80, 95, 79, 86,
+  93, 91, 73, 82, 90, 74, 92, 80, 85, 79,
+  104, 79, 76, 85, 90, 71, 77, 102, 111, 77,
+  91, 85, 84, 85, 79, 80, 82, 84, 88, 89,
+  78, 75, 86, 93, 91, 83, 88, 89, 93, 80,
+  82, 83, 87, 93, 76, 85, 75, 90, 89, 75,
+  82, 86, 76, 96, 83, 81, 78, 91, 74, 74,
+  81, 76, 72, 80, 79, 95, 86, 90, 71, 82,
+  76, 72, 90, 103, 69, 97, 70, 83, 70, 96,
+  76, 84, 89, 66, 95, 91, 89, 75, 93, 74,
+  67, 90, 71, 104, 72, 83, 98, 93, 82, 79,
+  75, 91, 88, 84, 86, 80, 90, 96, 73, 87,
+  65, 77, 96, 81, 69, 79, 75, 83, 83, 92,
+  92, 95, 86, 81, 81, 90, 82, 81, 86, 80,
+  69, 85, 105, 79, 90, 81, 69, 84, 77, 76,
+  91, 81, 83, 76, 75, 78, 92, 91, 83, 79,
+  80, 89, 85, 80, 81, 106, 99, 73, 75, 78,
+  60, 80, 93, 82, 91, 89, 76, 76, 85, 81,
+  76, 86, 92, 94, 101, 76, 88, 102, 98, 81,
+  78, 87, 73, 79, 88, 82, 76, 87, 84, 88,
+  96, 73, 76, 85, 74, 91, 74, 85, 75, 67,
+  89, 88, 73, 106, 69, 80, 65, 93, 76, 85,
+  84, 66, 92, 89, 84, 78, 76, 73, 79, 92,
+  72, 104, 77, 85, 95, 91, 83, 73, 78, 81,
+  91, 84, 85, 82, 93, 92, 71, 87, 90, 72,
+  108, 81, 63, 83, 79, 85, 86, 85, 85, 97,
+  79, 83, 79, 85, 78, 81, 84, 82, 72, 79,
+  97, 80, 87, 79, 66, 82, 78, 76, 93, 85,
+  82, 77, 73, 88, 96, 93, 81, 86, 77, 79,
+  83, 85, 81, 108, 103, 69, 75, 76, 60, 81,
+  92, 81, 96, 92, 69, 75, 84, 74, 77, 86,
+  89, 87, 103, 77, 92, 108, 113, 80, 84, 84,
+  66, 75, 74, 83, 76, 91, 83, 92, 77, 73,
+  70, 87, 75, 98, 76, 99, 80, 71, 89, 78,
+  77, 95, 76, 81, 68, 92, 75, 88, 91, 65,
+  91, 87, 86, 88, 63, 75, 90, 93, 82, 97,
+  73, 82, 91, 85, 79, 74, 80, 76, 86, 81,
+  85, 81, 89, 90, 72, 81, 98, 80, 90, 82,
+  71, 85, 74, 87, 81, 83, 83, 95, 90, 86,
+  81, 92, 82, 79, 82, 89, 73, 87, 111, 77,
+  92, 80, 71, 83, 91, 79, 99, 80, 90, 80,
+  76, 91, 96, 93, 83, 79, 75, 75, 86, 84,
+  82, 106, 94, 70, 80, 77, 62, 79, 96, 84,
+  88, 86, 73, 81, 81, 76, 78, 84, 90, 94,
+  98, 78, 89, 96, 97, 79, 74, 79, 68, 81,
+  78, 77, 79, 89, 88, 82, 87, 74, 78, 83,
+  78, 90, 69, 85, 72, 79, 91, 96, 71, 99,
+  64, 76, 74, 96, 81, 95, 89, 80, 103, 84,
+  84, 76, 86, 75, 66, 93, 72, 93, 77, 82,
+  98, 92, 86, 75, 70, 96, 86, 84, 90, 82,
+  92, 103, 77, 83, 54, 77, 95, 84, 76, 80,
+  77, 84, 80, 86, 100, 92, 79, 83, 79, 87,
+  75, 82, 91, 77, 70, 95, 92, 82, 104, 73,
+  79, 78, 77, 74, 82, 71, 85, 73, 78, 80,
+  89, 85, 85, 78, 76, 82, 90, 87, 87, 101,
+  99, 78, 69, 87, 67, 79, 90, 74, 92, 93,
+  83, 76, 84, 78, 79, 89, 99, 79, 89, 76,
+  81, 103, 91, 76, 81, 87, 76, 74, 86, 79,
+  77, 78, 87, 95, 84, 74, 66, 90, 73, 94,
+  73, 91, 77, 78, 93, 82, 72, 113, 61, 72,
+  69, 96, 86, 91, 82, 77, 101, 82, 81, 75,
+  63, 74, 74, 94, 77, 96, 82, 84, 101, 85,
+  93, 72, 67, 90, 93, 82, 89, 82, 98, 113,
+  72, 86, 68, 71, 97, 81, 76, 84, 83, 86,
+  84, 81, 92, 93, 72, 81, 77, 81, 72, 90,
+  90, 77, 66, 92, 84, 90, 104, 71, 76, 75,
+  74, 76, 81, 70, 89, 72, 76, 89, 92, 87,
+  79, 90, 74, 77, 97, 90, 89, 104, 107, 74,
+  64, 81, 68, 79, 87, 72, 100, 98, 75, 72,
+  84, 79, 79, 90, 98, 73, 86, 74, 87, 107,
+  103, 76, 87, 91, 72, 69, 73, 81, 76, 72,
+  87, 100, 63, 72, 56, 92, 72, 99, 72, 103,
+  85, 80, 91, 72, 72, 97, 69, 77, 71, 93,
+  77, 87, 89, 82, 96, 82, 81, 86, 60, 76,
+  88, 96, 85, 95, 79, 81, 89, 75, 87, 72,
+  73, 82, 90, 79, 90, 83, 95, 94, 79, 81,
+  91, 80, 87, 85, 82, 85, 76, 84, 79, 80,
+  88, 90, 83, 78, 81, 89, 79, 78, 88, 88,
+  72, 96, 95, 79, 97, 74, 76, 80, 86, 72,
+  87, 71, 88, 78, 77, 90, 94, 86, 84, 79,
+  76, 75, 91, 86, 87, 100, 95, 77, 72, 83,
+  69, 79, 92, 78, 89, 89, 73, 82, 81, 79,
+  82, 87, 92, 79, 85, 77, 82, 93, 94, 76,
+  80, 88, 75, 75, 79, 75, 78, 80, 92, 86,
+  78, 76, 71, 86, 77, 90, 70, 87, 74, 83,
+  85, 98, 72, 99, 73, 78, 76, 90, 80, 98,
+  96, 88, 113, 92, 84, 76, 81, 78, 68, 95,
+  77, 89, 81, 84, 92, 85, 81, 75, 65, 91,
+  80, 85, 89, 90, 93, 102, 85, 83, 68, 85,
+  83, 83, 83, 83, 73, 87, 82, 88, 97, 96,
+  89, 91, 81, 84, 82, 82, 83, 81, 77, 90,
+  94, 74, 102, 71, 91, 85, 88, 81, 83, 69,
+  87, 73, 79, 80, 81, 80, 91, 77, 79, 83,
+  92, 88, 89, 91, 94, 87, 75, 99, 64, 80,
+  80, 74, 88, 80, 88, 84, 85, 78, 79, 90,
+  92, 75, 90, 80, 83, 96, 87, 77, 81, 90,
+  73, 70, 86, 73, 77, 74, 81, 86, 101, 71,
+  70, 78, 73, 90, 70, 89, 85, 84, 88, 83,
+  70, 104, 69, 78, 72, 87, 82, 96, 92, 86,
+  109, 87, 80, 73, 71, 77, 78, 101, 81, 86,
+  86, 89, 85, 78, 86, 72, 65, 85, 87, 78,
+  90, 93, 101, 106, 84, 89, 65, 80, 80, 79,
+  87, 83, 79, 86, 82, 83, 92, 90, 82, 84,
+  77, 77, 78, 84, 85, 82, 72, 92, 84, 76,
+  106, 68, 92, 86, 79, 80, 84, 68, 93, 72,
+  78, 87, 80, 87, 82, 83, 79, 78, 96, 90,
+  91, 92, 98, 85, 72, 92, 64, 84, 75, 73,
+  91, 84, 76, 87, 84, 78, 81, 90, 94, 68,
+  85, 76, 83, 98, 89, 78, 89, 89, 73, 67,
+  79, 76, 78, 67, 85, 83, 85, 71, 63, 77,
+  72, 91, 71, 95, 97, 84, 82, 70, 75, 98,
+  74, 81, 77, 90, 75, 90, 97, 89, 105, 89,
+  83, 83, 78, 80, 95, 97, 84, 93, 85, 86,
+  81, 70, 86, 70, 68, 78, 85, 72, 85, 91,
+  98, 96, 91, 86, 75, 85, 79, 82, 89, 85,
+  74, 87, 79, 85, 91, 87, 92, 77, 81, 84,
+  85, 81, 84, 89, 78, 96, 96, 75, 102, 71,
+  85, 94, 83, 77, 88, 75, 88, 75, 80, 93,
+  85, 83, 91, 77, 79, 81, 93, 87, 91, 91,
+  93, 82, 75, 88, 66, 81, 82, 79, 84, 81,
+  71, 88, 83, 74, 81, 88, 87, 72, 88, 79,
+  83, 88, 92, 78, 84, 88, 80, 75, 87, 71,
+  79, 81, 93, 79, 92, 72, 74, 78, 74, 87,
+  78, 78, 94, 93, 75, 82, 107, 67, 73, 93,
+  85, 67, 79, 96, 81, 87, 81, 83, 81, 87,
+  72, 94, 80, 78, 92, 75, 90, 95, 95, 94,
+  93, 77, 91, 88, 82, 93, 90, 88, 84, 87,
+  89, 80, 81, 85, 93, 88, 86, 88, 68, 73,
+  76, 93, 104, 71, 98, 84, 90, 83, 87, 93,
+  77, 78, 84, 78, 95, 84, 80, 80, 79, 92,
+  72, 84, 74, 78, 87, 80, 70, 99, 92, 88,
+  98, 68, 94, 73, 85, 93, 88, 80, 88, 102,
+  61, 86, 69, 86, 78, 92, 86, 82, 80, 100,
+  74, 88, 86, 70, 78, 79, 107, 74, 87, 64,
+  77, 94, 84, 94, 81, 85, 88, 87, 98, 68,
+  128, 77, 91, 87, 56, 76, 82, 81, 74, 89,
+  82, 101, 51, 85, 118, 60, 65, 94, 81, 60,
+  82, 77, 79, 97, 85, 99, 78, 89, 82, 70,
+  79, 76, 93, 77, 102, 95, 107, 97, 92, 74,
+  96, 84, 88, 79, 85, 96, 78, 81, 83, 82,
+  82, 83, 86, 97, 87, 90, 57, 64, 75, 73,
+  129, 70, 85, 83, 87, 78, 83, 92, 85, 74,
+  82, 82, 93, 82, 84, 74, 78, 84, 82, 72,
+  62, 70, 81, 70, 70, 88, 92, 81, 106, 61,
+  100, 84, 86, 82, 95, 65, 97, 102, 67, 80,
+  68, 81, 67, 91, 87, 72, 87, 81, 60, 80,
+  96, 70, 63, 82, 116, 70, 92, 69, 79, 101,
+  82, 89, 83, 85, 86, 85, 94, 65, 94, 68,
+  92, 83, 44, 83, 81, 75, 78, 90, 72, 95,
+  80, 89, 97, 73, 73, 89, 83, 72, 85, 75,
+  80, 86, 89, 77, 80, 78, 80, 95, 93, 77,
+  83, 79, 89, 94, 85, 88, 92, 82, 84, 95,
+  94, 82, 97, 90, 85, 90, 83, 81, 75, 89,
+  92, 94, 74, 90, 70, 79, 78, 89, 90, 72,
+  94, 89, 81, 84, 93, 93, 82, 80, 92, 69,
+  93, 82, 91, 88, 82, 82, 87, 84, 68, 78,
+  78, 83, 74, 78, 102, 92, 98, 77, 97, 113,
+  77, 87, 95, 81, 97, 107, 64, 88, 66, 88,
+  94, 88, 82, 90, 78, 101, 77, 81, 84, 69,
+  84, 80, 97, 75, 92, 71, 83, 89, 86, 90,
+  82, 88, 88, 86, 98, 81, 73, 87, 88, 78,
+  68, 89, 84, 88, 88, 75, 86, 87, 76, 86,
+  107, 74, 78, 89, 86, 74, 85, 77, 80, 96,
+  99, 97, 73, 85, 75, 89, 82, 76, 78, 69,
+  93, 94, 101, 88, 94, 82, 89, 82, 78, 92,
+  78, 84, 85, 89, 80, 75, 83, 86, 77, 89,
+  90, 87, 67, 77, 76, 79, 104, 76, 91, 90,
+  87, 77, 88, 101, 69, 73, 80, 77, 88, 71,
+  88, 86, 79, 70, 85, 74, 94, 83, 89, 67,
+  74, 92, 87, 89, 99, 66, 88, 68, 86, 86,
+  84, 86, 87, 81, 64, 84, 74, 85, 67, 82,
+  82, 77, 96, 83, 61, 78, 78, 70, 81, 74,
+  104, 82, 79, 82, 74, 98, 82, 92, 76, 79,
+  94, 87, 91, 64, 119, 85, 102, 81, 53, 83,
+  79, 82, 81, 87, 81, 93, 52, 81, 120, 67,
+  65, 95, 80, 67, 82, 69, 81, 109, 105, 117,
+  68, 89, 79, 67, 77, 78, 88, 67, 105, 96,
+  111, 86, 93, 76, 89, 77, 77, 75, 67, 79,
+  70, 76, 86, 75, 87, 84, 70, 97, 92, 82,
+  57, 68, 71, 62, 121, 76, 74, 79, 83, 70,
+  79, 98, 79, 69, 75, 82, 80, 67, 94, 84,
+  85, 62, 75, 64, 84, 81, 86, 58, 73, 87,
+  90, 78, 104, 55, 95, 75, 90, 76, 92, 72,
+  90, 74, 73, 84, 74, 88, 54, 82, 80, 71,
+  88, 70, 47, 75, 87, 71, 80, 71, 111, 80,
+  78, 80, 73, 105, 81, 88, 77, 76, 80, 82,
+  88, 62, 72, 80, 87, 80, 37, 89, 82, 77,
+  83, 98, 75, 88, 83, 90, 93, 73, 77, 84,
+  83, 80, 89, 84, 77, 95, 98, 85, 74, 73,
+  81, 96, 89, 78, 89, 74, 92, 98, 95, 79,
+  92, 84, 84, 86, 85, 85, 79, 83, 81, 87,
+  81, 77, 86, 87, 77, 92, 80, 86, 73, 77,
+  75, 86, 87, 77, 84, 76, 85, 82, 91, 97,
+  74, 73, 80, 71, 87, 76, 99, 89, 86, 66,
+  80, 78, 84, 82, 81, 74, 76, 85, 94, 89,
+  98, 76, 93, 111, 79, 80, 90, 91, 93, 93,
+  67, 81, 75, 88, 83, 79, 80, 86, 76, 88,
+  68, 78, 76, 69, 87, 73, 96, 82, 82, 83,
+  78, 92, 82, 87, 80, 82, 91, 84, 91, 73,
+  63, 92, 91, 76, 65, 87, 83, 85, 101, 76,
+  74, 84, 92, 85, 89, 83, 82, 82, 91, 84,
+  83, 88, 79, 90, 99, 80, 72, 87, 84, 88,
+  83, 81, 75, 71, 89, 86, 82, 88, 90, 86,
+  68, 80, 81, 92, 80, 79, 91, 89, 80, 73,
+  76, 94, 77, 83, 78, 95, 74, 93, 77, 85,
+  76, 86, 98, 87, 78, 90, 95, 89, 58, 85,
+  88, 86, 90, 77, 88, 91, 82, 82, 88, 89,
+  109, 89, 92, 76, 83, 82, 80, 91, 91, 99,
+  83, 75, 86, 85, 78, 105, 94, 73, 63, 92,
+  84, 87, 74, 88, 81, 89, 83, 95, 58, 95,
+  73, 67, 90, 85, 84, 83, 76, 78, 82, 82,
+  88, 92, 82, 86, 90, 94, 90, 73, 104, 100,
+  94, 83, 74, 87, 75, 84, 99, 87, 73, 88,
+  81, 79, 97, 82, 81, 85, 92, 81, 82, 86,
+  87, 97, 104, 86, 73, 85, 76, 84, 83, 83,
+  89, 70, 90, 86, 96, 85, 82, 83, 65, 77,
+  79, 83, 77, 79, 83, 90, 87, 69, 81, 96,
+  71, 89, 80, 79, 66, 90, 74, 85, 83, 83,
+  97, 81, 75, 94, 91, 83, 63, 88, 88, 90,
+  85, 79, 92, 92, 81, 87, 81, 87, 100, 91,
+  92, 73, 82, 86, 83, 84, 94, 88, 83, 91,
+  87, 78, 80, 101, 100, 71, 68, 90, 80, 84,
+  66, 87, 78, 87, 78, 89, 54, 95, 78, 66,
+  93, 80, 85, 84, 78, 76, 86, 84, 88, 79,
+  82, 82, 90, 89, 89, 75, 79, 97, 86, 89,
+  73, 90, 79, 84, 94, 97, 70, 87, 92, 87,
+  86, 81, 83, 80, 88, 84, 83, 88, 76, 88,
+  95, 75, 71, 79, 72, 87, 87, 83, 97, 73,
+  88, 91, 76, 84, 84, 87, 73, 84, 85, 88,
+  83, 85, 88, 83, 80, 73, 88, 92, 75, 86,
+  73, 78, 81, 88, 82, 87, 71, 83, 96, 72,
+  80, 96, 94, 83, 62, 86, 87, 85, 86, 82,
+  100, 90, 84, 84, 82, 89, 99, 88, 87, 81,
+  80, 95, 87, 92, 91, 101, 84, 107, 82, 81,
+  84, 106, 94, 79, 66, 83, 82, 87, 81, 83,
+  77, 91, 76, 96, 64, 90, 72, 67, 88, 86,
+  84, 85, 83, 72, 85, 80, 87, 81, 88, 88,
+  100, 88, 87, 79, 67, 97, 84, 82, 83, 88,
+  77, 82, 89, 76, 65, 88, 71, 85, 75, 85,
+  75, 92, 84, 77, 96, 91, 68, 75, 73, 87,
+  81, 78, 90, 81, 88, 97, 74, 82, 88, 80,
+  100, 104, 88, 83, 85, 102, 76, 79, 93, 83,
+  81, 93, 84, 70, 84, 75, 81, 85, 95, 93,
+  91, 78, 75, 73, 74, 87, 76, 98, 91, 82,
+  80, 100, 96, 89, 80, 76, 80, 79, 76, 96,
+  84, 95, 92, 80, 95, 90, 85, 81, 81, 70,
+  85, 81, 66, 73, 84, 121, 78, 82, 84, 88,
+  82, 88, 80, 73, 97, 86, 77, 82, 81, 74,
+  89, 85, 90, 84, 92, 80, 86, 85, 95, 96,
+  96, 81, 71, 78, 83, 79, 70, 71, 89, 80,
+  95, 96, 68, 93, 84, 90, 98, 87, 83, 73,
+  92, 80, 82, 89, 32, 78, 65, 79, 68, 84,
+  89, 98, 142, 74, 67, 65, 101, 87, 75, 78,
+  76, 66, 92, 77, 82, 86, 75, 73, 118, 76,
+  89, 84, 68, 78, 67, 80, 81, 79, 68, 105,
+  73, 65, 85, 118, 86, 57, 84, 76, 77, 70,
+  83, 70, 61, 90, 58, 87, 82, 83, 68, 98,
+  70, 64, 72, 88, 84, 79, 71, 103, 81, 93,
+  105, 77, 59, 80, 106, 62, 69, 93, 82, 78,
+  60, 95, 71, 90, 121, 73, 79, 101, 84, 77,
+  67, 72, 82, 70, 63, 95, 87, 68, 82, 73,
+  79, 93, 97, 82, 87, 82, 101, 121, 96, 64,
+  121, 64, 79, 79, 97, 64, 87, 64, 90, 76,
+  83, 92, 72, 71, 133, 76, 77, 62, 92, 81,
+  88, 87, 84, 82, 75, 80, 77, 91, 82, 79,
+  72, 72, 72, 77, 83, 79, 83, 84, 81, 85,
+  75, 97, 96, 83, 88, 79, 90, 72, 97, 88,
+  84, 67, 89, 97, 91, 88, 86, 91, 83, 80,
+  85, 77, 86, 94, 97, 72, 94, 81, 80, 89,
+  82, 79, 87, 71, 89, 79, 84, 100, 98, 88,
+  77, 64, 76, 73, 77, 95, 85, 88, 74, 81,
+  104, 88, 99, 87, 80, 100, 90, 81, 70, 63,
+  82, 57, 78, 88, 81, 84, 81, 76, 85, 86,
+  103, 89, 93, 81, 79, 78, 87, 96, 88, 88,
+  93, 82, 84, 94, 88, 95, 92, 82, 94, 81,
+  77, 75, 100, 86, 89, 90, 95, 90, 117, 91,
+  85, 91, 86, 87, 90, 79, 93, 66, 65, 87,
+  68, 87, 78, 83, 82, 90, 87, 78, 72, 93,
+  76, 80, 81, 89, 84, 64, 98, 86, 95, 93,
+  72, 75, 88, 80, 95, 100, 85, 82, 90, 97,
+  78, 73, 89, 82, 79, 92, 86, 69, 87, 81,
+  80, 91, 94, 107, 85, 78, 82, 85, 77, 83,
+  77, 76, 97, 71, 87, 87, 95, 90, 83, 64,
+  83, 72, 76, 80, 89, 90, 80, 68, 92, 93,
+  78, 81, 87, 70, 74, 84, 75, 70, 88, 128,
+  71, 76, 87, 84, 79, 86, 75, 81, 90, 80,
+  79, 81, 83, 76, 84, 85, 86, 89, 85, 83,
+  85, 86, 94, 98, 74, 81, 87, 81, 84, 88,
+  82, 77, 78, 83, 90, 96, 72, 91, 86, 88,
+  84, 83, 82, 74, 92, 81, 82, 92, 28, 77,
+  66, 73, 76, 86, 94, 98, 146, 76, 81, 80,
+  114, 80, 79, 70, 75, 67, 86, 77, 87, 80,
+  72, 73, 111, 70, 102, 86, 70, 86, 64, 71,
+  76, 85, 71, 105, 80, 77, 87, 134, 87, 59,
+  86, 81, 69, 66, 88, 65, 72, 94, 51, 96,
+  88, 83, 70, 84, 74, 63, 64, 93, 60, 84,
+  74, 81, 91, 79, 91, 65, 56, 77, 100, 59,
+  80, 102, 64, 91, 70, 94, 77, 70, 124, 82,
+  74, 98, 78, 77, 58, 68, 79, 66, 57, 91,
+  91, 84, 78, 76, 68, 81, 92, 84, 79, 82,
+  99, 125, 76, 66, 121, 59, 78, 77, 87, 68,
+  79, 66, 94, 73, 87, 91, 69, 74, 134, 71,
+  77, 62, 84, 82, 79, 88, 86, 88, 77, 84,
+  86, 94, 85, 81, 64, 79, 73, 80, 87, 82,
+  81, 78, 86, 88, 77, 94, 95, 78, 98, 84,
+  86, 79, 73, 91, 91, 44, 88, 101, 88, 85,
+  89, 92, 92, 76, 95, 74, 94, 103, 95, 70,
+  87, 83, 85, 90, 80, 77, 98, 80, 95, 69,
+  93, 85, 92, 94, 77, 56, 76, 68, 71, 86,
+  80, 94, 78, 71, 109, 93, 95, 92, 92, 114,
+  78, 83, 77, 53, 84, 62, 62, 86, 82, 70,
+  74, 77, 78, 87, 101, 85, 91, 77, 80, 77,
+  81, 92, 91, 78, 81, 86, 83, 96, 87, 91,
+  72, 88, 82, 88, 81, 84, 69, 90, 94, 89,
+  90, 98, 120, 90, 81, 91, 74, 87, 84, 82,
+  99, 70, 84, 82, 77, 87, 78, 79, 73, 90,
+  93, 82, 78, 92, 71, 94, 90, 89, 90, 78,
+  92, 77, 82, 95, 81, 77, 86, 79, 83, 82,
+  97, 88, 90, 103, 78, 86, 86, 87, 79, 91,
+  96, 72, 85, 77, 78, 87, 92, 91, 86, 82,
+  85, 84, 78, 83, 83, 68, 96, 83, 86, 95,
+  93, 89, 91, 74, 78, 77, 77, 88, 89, 91,
+  70, 70, 85, 85, 83, 83, 81, 68, 78, 83,
+  74, 70, 88, 121, 87, 83, 83, 85, 91, 83,
+  83, 88, 84, 87, 85, 82, 82, 76, 82, 87,
+  82, 91, 92, 84, 88, 89, 105, 95, 80, 84,
+  104, 82, 86, 90, 95, 79, 61, 89, 88, 90,
+  75, 84, 84, 87, 86, 91, 85, 76, 85, 72,
+  84, 89, 46, 81, 70, 67, 67, 95, 99, 102,
+  119, 82, 81, 89, 101, 79, 73, 75, 73, 70,
+  92, 93, 83, 71, 80, 75, 98, 71, 76, 82,
+  76, 101, 66, 79, 86, 91, 69, 101, 105, 66,
+  85, 100, 75, 74, 82, 81, 72, 77, 84, 79,
+  66, 86, 69, 86, 87, 82, 86, 91, 93, 77,
+  74, 93, 78, 89, 75, 90, 93, 92, 98, 67,
+  59, 71, 92, 68, 83, 97, 68, 83, 66, 83,
+  75, 86, 91, 94, 79, 95, 87, 82, 57, 82,
+  84, 81, 80, 82, 89, 81, 86, 81, 78, 83,
+  88, 84, 81, 90, 93, 105, 74, 81, 104, 62,
+  78, 78, 73, 76, 86, 80, 89, 82, 95, 83,
+  71, 76, 109, 82, 77, 72, 92, 80, 72, 86,
+  94, 77, 82, 82, 74, 91, 94, 81, 77, 91,
+  69, 91, 93, 86, 86, 85, 86, 74, 77, 93,
+  89, 82, 92, 83, 75, 77, 82, 90, 90, 62,
+  78, 99, 93, 81, 86, 85, 103, 73, 88, 78,
+  86, 94, 88, 73, 90, 81, 82, 80, 79, 82,
+  92, 107, 93, 89, 86, 98, 87, 88, 92, 69,
+  73, 73, 73, 100, 85, 88, 83, 73, 97, 87,
+  97, 90, 84, 100, 79, 83, 80, 55, 82, 60,
+  90, 89, 91, 73, 80, 74, 83, 93, 90, 88,
+  99, 76, 79, 72, 87, 84, 84, 83, 90, 84,
+  83, 90, 96, 89, 83, 83, 83, 92, 86, 77,
+  74, 83, 96, 89, 89, 88, 106, 87, 85, 91,
+  82, 86, 86, 81, 72, 84, 89, 91, 79, 82,
+  86, 74, 88, 90, 84, 82, 79, 89, 71, 77,
+  71, 73, 91, 85, 104, 92, 80, 85, 83, 99,
+  67, 84, 89, 87, 87, 76, 78, 100, 78, 85,
+  91, 91, 84, 76, 95, 80, 85, 76, 76, 76,
+  77, 76, 90, 86, 75, 95, 69, 78, 77, 90,
+  82, 83, 80, 82, 93, 83, 82, 84, 90, 74,
+  79, 80, 93, 105, 80, 84, 76, 81, 81, 82,
+  78, 93, 88, 83, 75, 88, 81, 69, 85, 95,
+  86, 87, 87, 94, 69, 81, 88, 80, 87, 89,
+  85, 81, 78, 84, 82, 76, 81, 59, 87, 79,
+  92, 79, 90, 86, 75, 66, 88, 89, 86, 79,
+  77, 68, 81, 106, 90, 75, 86, 86, 93, 78,
+  84, 80, 69, 89, 76, 88, 67, 78, 80, 74,
+  95, 92, 85, 96, 93, 85, 78, 78, 70, 84,
+  89, 85, 90, 88, 75, 80, 93, 98, 72, 95,
+  95, 93, 88, 81, 89, 101, 79, 79, 98, 92,
+  80, 73, 93, 76, 94, 76, 71, 74, 82, 80,
+  81, 85, 71, 97, 72, 78, 82, 90, 83, 75,
+  84, 85, 100, 78, 89, 87, 87, 73, 84, 80,
+  82, 110, 89, 77, 69, 84, 86, 75, 84, 81,
+  91, 80, 84, 77, 74, 67, 84, 91, 83, 89,
+  86, 92, 56, 81, 75, 77, 87, 79, 94, 76,
+  70, 83, 85, 92, 88, 55, 95, 84, 95, 83,
+  96, 89, 80, 70, 89, 84, 87, 86, 70, 61,
+  85, 105, 90, 80, 91, 86, 99, 74, 84, 85,
+  72, 85, 81, 86, 86, 85, 81, 77, 86, 88,
+  83, 78, 77, 90, 76, 78, 74, 78, 87, 86,
+  85, 92, 81, 82, 93, 104, 69, 87, 81, 87,
+  91, 81, 80, 110, 70, 84, 95, 88, 79, 80,
+  92, 83, 94, 81, 80, 75, 77, 88, 94, 83,
+  80, 86, 67, 79, 78, 81, 79, 81, 84, 83,
+  92, 87, 87, 83, 85, 73, 81, 84, 89, 91,
+  89, 82, 77, 82, 85, 87, 71, 81, 96, 84,
+  73, 83, 81, 69, 85, 91, 92, 86, 88, 92,
+  72, 78, 87, 78, 101, 86, 81, 83, 71, 88,
+  83, 86, 78, 59, 86, 79, 85, 81, 87, 90,
+  81, 68, 87, 90, 89, 79, 82, 69, 81, 102,
+  81, 79, 81, 80, 95, 74, 85, 81, 68, 75,
+  86, 83, 67, 82, 93, 86, 101, 79, 94, 94,
+  86, 78, 80, 89, 74, 93, 84, 81, 126, 105,
+  76, 70, 84, 99, 63, 78, 107, 82, 93, 77,
+  98, 77, 89, 96, 83, 81, 75, 73, 85, 88,
+  77, 71, 71, 92, 82, 84, 80, 106, 64, 90,
+  73, 83, 87, 82, 76, 67, 80, 92, 79, 88,
+  83, 67, 95, 69, 82, 80, 86, 91, 87, 87,
+  84, 76, 81, 75, 95, 100, 68, 79, 99, 61,
+  76, 69, 78, 85, 83, 75, 82, 82, 63, 83,
+  77, 79, 58, 78, 89, 73, 98, 70, 80, 84,
+  86, 56, 95, 83, 97, 82, 86, 97, 73, 78,
+  81, 83, 95, 84, 84, 67, 93, 91, 91, 84,
+  98, 92, 94, 88, 77, 97, 58, 100, 79, 78,
+  47, 75, 98, 91, 99, 82, 101, 122, 96, 69,
+  86, 97, 83, 113, 82, 82, 97, 91, 70, 68,
+  99, 95, 75, 84, 112, 100, 104, 77, 121, 71,
+  94, 74, 84, 94, 72, 71, 80, 90, 103, 63,
+  66, 98, 94, 83, 72, 110, 56, 71, 86, 89,
+  92, 81, 78, 53, 85, 101, 87, 83, 83, 77,
+  76, 67, 96, 85, 74, 84, 72, 78, 74, 70,
+  95, 62, 114, 86, 69, 77, 114, 43, 70, 76,
+  77, 83, 80, 68, 78, 94, 52, 76, 66, 78,
+  51, 63, 97, 67, 89, 60, 76, 91, 98, 57,
+  102, 76, 102, 84, 98, 105, 73, 92, 88, 83,
+  88, 94, 75, 64, 115, 86, 82, 97, 96, 100,
+  90, 88, 81, 107, 69, 92, 95, 81, 78, 80,
+  87, 84, 101, 78, 92, 94, 81, 78, 81, 90,
+  76, 94, 81, 79, 77, 102, 86, 69, 94, 103,
+  69, 80, 98, 87, 87, 85, 96, 88, 76, 79,
+  84, 80, 74, 77, 81, 89, 114, 76, 74, 90,
+  84, 93, 86, 94, 69, 79, 70, 87, 84, 85,
+  74, 71, 86, 85, 81, 95, 88, 71, 92, 72,
+  90, 79, 77, 77, 95, 87, 79, 75, 85, 81,
+  80, 81, 76, 83, 97, 64, 79, 83, 83, 81,
+  83, 83, 88, 88, 69, 79, 78, 79, 78, 76,
+  86, 80, 73, 76, 86, 87, 86, 56, 91, 83,
+  89, 84, 89, 97, 75, 81, 83, 88, 90, 82,
+  94, 71, 95, 91, 58, 87, 87, 88, 96, 82,
+  78, 92, 77, 73, 81, 96, 75, 89, 92, 82,
+  87, 78, 90, 88, 90, 73, 67, 100, 89, 96,
+  86, 80, 103, 92, 67, 69, 90, 89, 76, 76,
+  84, 76, 91, 80, 92, 85, 89, 93, 85, 81,
+  80, 80, 80, 91, 77, 73, 78, 83, 92, 92,
+  89, 98, 61, 84, 72, 88, 84, 86, 76, 74,
+  85, 92, 84, 86, 87, 74, 103, 74, 88, 85,
+  90, 85, 101, 81, 97, 69, 72, 69, 85, 96,
+  80, 85, 96, 64, 85, 73, 78, 79, 85, 69,
+  89, 83, 66, 100, 90, 81, 71, 83, 81, 73,
+  109, 78, 87, 88, 81, 57, 89, 90, 93, 79,
+  81, 104, 71, 73, 85, 79, 95, 83, 76, 75,
+  88, 77, 87, 87, 93, 93, 96, 92, 79, 91,
+  71, 92, 93, 91, 64, 76, 93, 89, 85, 78,
+  94, 109, 95, 75, 70, 108, 101, 113, 90, 80,
+  77, 89, 74, 61, 95, 89, 80, 77, 88, 87,
+  89, 75, 99, 72, 93, 77, 87, 89, 74, 81,
+  83, 83, 86, 71, 76, 84, 113, 81, 80, 94,
+  53, 83, 76, 94, 87, 86, 76, 64, 82, 97,
+  86, 84, 83, 79, 96, 71, 102, 92, 85, 89,
+  81, 67, 87, 65, 88, 51, 93, 81, 83, 82,
+  107, 54, 83, 80, 82, 76, 82, 71, 87, 79,
+  57, 96, 77, 87, 57, 74, 84, 65, 93, 73,
+  88, 86, 93, 60, 90, 82, 90, 82, 83, 102,
+  71, 82, 91, 81, 95, 83, 81, 68, 112, 75,
+  75, 89, 83, 99, 92, 88, 88, 96, 79, 95,
+  103, 92, 82, 72, 91, 81, 85, 78, 88, 87,
+  86, 89, 72, 100, 88, 94, 85, 81, 79, 90,
+  93, 70, 91, 92, 78, 77, 74, 87, 89, 82,
+  97, 81, 78, 83, 83, 81, 73, 79, 81, 92,
+  99, 77, 80, 80, 94, 86, 94, 93, 64, 88,
+  71, 92, 75, 80, 73, 80, 86, 83, 85, 88,
+  87, 77, 100, 79, 98, 83, 83, 83, 77, 79,
+  88, 69, 82, 71, 78, 86, 80, 85, 95, 66,
+  85, 84, 81, 72, 80, 84, 89, 85, 69, 85,
+  91, 82, 82, 79, 79, 80, 76, 78, 90, 76,
+  80, 57, 87, 91, 89, 82, 86, 96, 73, 72,
+  87, 89, 92, 85, 101, 76, 87, 83, 67, 86,
+  86, 90, 94, 89, 80, 90, 77, 84, 73, 95,
+  89, 92, 79, 91, 70, 83, 84, 72, 91, 83,
+  82, 110, 108, 107, 96, 93, 86, 89, 88, 80,
+  83, 83, 79, 94, 88, 85, 78, 88, 96, 86,
+  82, 82, 74, 88, 86, 95, 79, 76, 86, 89,
+  61, 88, 93, 86, 83, 87, 84, 82, 80, 81,
+  88, 87, 73, 92, 75, 79, 83, 65, 74, 72,
+  100, 66, 84, 87, 94, 80, 80, 74, 100, 92,
+  73, 84, 73, 79, 83, 68, 96, 85, 75, 85,
+  86, 77, 104, 73, 78, 75, 87, 82, 82, 88,
+  98, 80, 85, 92, 97, 77, 87, 97, 86, 81,
+  85, 87, 86, 93, 82, 90, 71, 87, 101, 93,
+  85, 82, 87, 80, 81, 83, 78, 90, 91, 84,
+  90, 92, 81, 88, 76, 84, 87, 94, 94, 74,
+  80, 91, 84, 79, 88, 66, 98, 78, 79, 109,
+  102, 99, 98, 98, 90, 85, 77, 81, 87, 85,
+  82, 97, 95, 84, 76, 106, 106, 86, 81, 77,
+  65, 95, 86, 90, 76, 72, 84, 86, 57, 96,
+  102, 74, 76, 85, 82, 81, 86, 83, 90, 79,
+  73, 77, 72, 82, 87, 74, 71, 67, 90, 70,
+  90, 81, 97, 76, 81, 63, 109, 85, 78, 87,
+  71, 86, 81, 64, 96, 80, 78, 89, 84, 77,
+  92, 70, 76, 76, 90, 72, 67, 90, 96, 84,
+  87, 85, 93, 82, 89, 90, 82, 82, 79, 93,
+  88, 92, 86, 82, 64, 76, 94, 94, 79, 75,
+  88, 77, 78, 80, 94, 84, 88, 82, 84, 82,
+  85, 94, 81, 82, 94, 89, 86, 85, 76, 94,
+  77, 83, 88, 74, 91, 85, 80, 102, 97, 104,
+  90, 97, 84, 89, 93, 77, 87, 82, 83, 92,
+  79, 77, 78, 96, 95, 83, 85, 76, 71, 89,
+  85, 93, 87, 83, 85, 89, 68, 94, 96, 73,
+  85, 87, 81, 72, 82, 81, 92, 83, 71, 91,
+  80, 79, 82, 77, 80, 79, 103, 70, 92, 87,
+  89, 88, 87, 84, 98, 93, 79, 80, 73, 88,
+  84, 70, 94, 85, 81, 87, 82, 88, 88, 78,
+  80, 68, 84, 75, 85, 84, 90, 81, 83, 96,
+  78, 76, 81, 93, 82, 82, 87, 89, 86, 87,
+  81, 91, 76, 87, 95, 102, 86, 86, 82, 82,
+  83, 78, 88, 90, 87, 80, 93, 89, 82, 87,
+  67, 73, 84, 71, 85, 78, 77, 80, 88, 80,
+  82, 81, 72, 83, 78, 93, 80, 78, 84, 79,
+  82, 91, 78, 100, 79, 70, 85, 80, 88, 81,
+  81, 95, 93, 77, 83, 92, 91, 67, 100, 62,
+  76, 103, 81, 72, 73, 75, 78, 84, 99, 68,
+  110, 83, 83, 76, 86, 106, 77, 85, 85, 81,
+  89, 90, 81, 86, 66, 76, 99, 86, 94, 66,
+  80, 108, 80, 79, 68, 77, 84, 81, 55, 86,
+  81, 83, 77, 77, 86, 58, 89, 84, 70, 78,
+  90, 66, 87, 78, 79, 91, 78, 77, 98, 115,
+  74, 99, 96, 89, 92, 76, 67, 87, 81, 79,
+  72, 85, 88, 87, 108, 83, 75, 82, 84, 97,
+  88, 91, 83, 73, 81, 75, 96, 86, 58, 74,
+  74, 59, 78, 72, 79, 74, 84, 78, 87, 80,
+  66, 106, 75, 77, 70, 66, 79, 77, 85, 94,
+  78, 102, 81, 66, 77, 77, 95, 84, 89, 100,
+  84, 73, 85, 91, 96, 54, 101, 60, 74, 148,
+  83, 66, 73, 65, 74, 88, 99, 61, 121, 82,
+  82, 81, 84, 104, 75, 74, 102, 81, 83, 96,
+  85, 74, 47, 101, 100, 88, 84, 41, 82, 113,
+  72, 62, 68, 82, 92, 83, 46, 108, 76, 77,
+  72, 71, 96, 53, 82, 83, 71, 72, 82, 48,
+  92, 79, 67, 99, 75, 73, 105, 133, 66, 95,
+  104, 90, 83, 87, 66, 90, 68, 74, 83, 71,
+  83, 88, 122, 86, 72, 85, 91, 93, 87, 90,
+  70, 76, 77, 55, 98, 94, 76, 81, 80, 76,
+  86, 83, 74, 85, 85, 84, 86, 79, 74, 97,
+  76, 88, 77, 81, 81, 82, 78, 89, 89, 93,
+  83, 72, 90, 79, 76, 76, 86, 96, 98, 81,
+  84, 82, 84, 68, 77, 71, 79, 96, 77, 76,
+  77, 81, 78, 84, 95, 74, 97, 78, 84, 74,
+  87, 82, 70, 89, 85, 82, 86, 86, 91, 85,
+  75, 71, 89, 86, 91, 83, 83, 111, 81, 83,
+  76, 75, 81, 82, 67, 80, 85, 82, 84, 79,
+  83, 74, 88, 88, 73, 77, 94, 62, 92, 78,
+  90, 88, 80, 84, 85, 100, 71, 89, 93, 89,
+  97, 78, 73, 85, 82, 82, 87, 87, 85, 93,
+  101, 84, 77, 86, 86, 89, 83, 85, 88, 74,
+  88, 76, 88, 85, 78, 75, 74, 87, 83, 85,
+  81, 101, 81, 80, 86, 84, 79, 113, 81, 78,
+  80, 95, 95, 85, 95, 94, 96, 86, 78, 85,
+  93, 82, 97, 87, 76, 96, 89, 80, 86, 94,
+  76, 87, 85, 72, 98, 119, 78, 91, 88, 90,
+  74, 95, 84, 71, 117, 83, 81, 85, 80, 77,
+  77, 84, 95, 80, 87, 77, 94, 68, 75, 82,
+  90, 67, 81, 65, 86, 94, 95, 87, 71, 67,
+  77, 81, 63, 82, 87, 91, 85, 71, 88, 79,
+  106, 80, 79, 88, 82, 85, 86, 77, 83, 90,
+  81, 79, 92, 95, 75, 89, 85, 85, 64, 67,
+  80, 97, 88, 85, 80, 84, 87, 97, 103, 85,
+  89, 79, 91, 100, 72, 97, 90, 77, 85, 73,
+  94, 89, 75, 82, 75, 87, 82, 75, 81, 101,
+  86, 80, 84, 87, 80, 93, 79, 81, 74, 95,
+  89, 85, 89, 81, 83, 82, 83, 83, 97, 84,
+  102, 87, 71, 110, 88, 74, 82, 85, 77, 87,
+  95, 64, 101, 112, 95, 90, 96, 85, 70, 80,
+  77, 66, 122, 69, 85, 88, 78, 90, 72, 72,
+  85, 77, 88, 77, 104, 60, 61, 82, 100, 55,
+  70, 64, 80, 78, 102, 88, 67, 68, 75, 84,
+  59, 82, 87, 89, 79, 79, 78, 92, 96, 70,
+  80, 89, 85, 79, 70, 77, 82, 102, 83, 72,
+  83, 98, 78, 81, 87, 85, 48, 54, 80, 103,
+  83, 77, 85, 73, 85, 96, 92, 68, 90, 75,
+  85, 107, 77, 94, 80, 77, 78, 64, 94, 85,
+  81, 80, 85, 84, 85, 99, 79, 97, 84, 83,
+  90, 81, 82, 75, 81, 80, 77, 93, 93, 87,
+  65, 92, 86, 88, 85, 88, 101, 81, 84, 81,
+  76, 105, 90, 75, 84, 82, 82, 84, 104, 78,
+  91, 110, 92, 92, 86, 86, 77, 80, 87, 76,
+  102, 77, 80, 81, 86, 96, 80, 91, 97, 78,
+  86, 80, 87, 71, 80, 85, 91, 74, 76, 80,
+  83, 99, 94, 90, 74, 69, 77, 87, 66, 76,
+  88, 90, 86, 91, 89, 97, 98, 79, 80, 83,
+  77, 74, 97, 77, 87, 82, 85, 84, 84, 91,
+  74, 84, 85, 87, 71, 77, 85, 93, 84, 91,
+  82, 88, 84, 101, 82, 92, 92, 84, 94, 96,
+  77, 97, 87, 75, 90, 76, 93, 90, 87, 89,
+  97, 76, 90, 74, 90, 83, 91, 77, 90, 83,
+  87, 82, 89, 89, 95, 80, 93, 85, 56, 87,
+  97, 99, 89, 72, 80, 81, 84, 88, 88, 95,
+  94, 92, 86, 87, 86, 79, 80, 86, 86, 86,
+  81, 96, 63, 92, 100, 86, 91, 85, 78, 86,
+  90, 77, 91, 81, 89, 101, 91, 80, 92, 90,
+  96, 91, 85, 71, 84, 92, 87, 98, 83, 88,
+  66, 79, 77, 85, 79, 83, 88, 83, 90, 82,
+  74, 81, 96, 80, 79, 92, 91, 111, 66, 93,
+  91, 77, 90, 83, 71, 88, 74, 74, 76, 82,
+  86, 63, 89, 94, 77, 80, 73, 73, 68, 79,
+  82, 82, 81, 94, 84, 90, 81, 73, 104, 90,
+  84, 82, 94, 79, 88, 70, 80, 90, 84, 79,
+  90, 85, 86, 83, 86, 76, 91, 83, 87, 85,
+  86, 90, 90, 74, 88, 85, 73, 85, 80, 92,
+  86, 68, 79, 81, 83, 91, 88, 93, 90, 91,
+  82, 81, 91, 79, 78, 85, 91, 89, 65, 90,
+  63, 84, 87, 85, 90, 84, 77, 84, 88, 79,
+  84, 86, 86, 94, 89, 85, 99, 89, 93, 90,
+  77, 70, 86, 92, 85, 91, 84, 86, 59, 75,
+  79, 86, 82, 82, 85, 82, 85, 86, 79, 84,
+  97, 78, 82, 92, 86, 108, 67, 92, 86, 77,
+  92, 80, 76, 87, 85, 82, 75, 87, 88, 70,
+  89, 87, 75, 83, 74, 72, 67, 77, 81, 78,
+  79, 89, 82, 89, 79, 72, 93, 83, 88, 82,
+  88, 81, 88, 71, 80, 86, 79, 83, 92, 100,
+  85, 92, 93, 80, 96, 83, 83, 85, 86, 76,
+  93, 88, 93, 79, 82, 88, 77, 92, 82, 74,
+  83, 88, 79, 83, 79, 93, 88, 88, 78, 80,
+  90, 81, 78, 94, 91, 86, 68, 85, 69, 90,
+  89, 73, 88, 94, 81, 78, 77, 80, 92, 81,
+  85, 94, 85, 80, 85, 88, 89, 83, 76, 84,
+  83, 92, 84, 92, 85, 83, 74, 77, 83, 88,
+  81, 88, 82, 86, 85, 88, 80, 91, 92, 79,
+  86, 90, 85, 99, 76, 93, 83, 81, 89, 84,
+  76, 89, 92, 71, 77, 85, 87, 72, 84, 75,
+  77, 84, 83, 81, 77, 82, 84, 83, 79, 84,
+  84, 91, 78, 66, 77, 88, 85, 89, 91, 79,
+  89, 81, 79, 83, 95, 76, 87, 70, 87, 98,
+  88, 68, 83, 81, 85, 77, 97, 72, 88, 67,
+  69, 84, 68, 79, 75, 97, 80, 79, 84, 80,
+  93, 101, 100, 81, 94, 84, 107, 95, 72, 105,
+  90, 64, 68, 88, 140, 83, 76, 124, 71, 94,
+  82, 75, 99, 77, 92, 86, 66, 88, 94, 71,
+  84, 87, 78, 73, 72, 89, 75, 73, 80, 81,
+  80, 64, 73, 74, 80, 115, 76, 79, 86, 100,
+  90, 84, 99, 82, 76, 71, 81, 88, 81, 69,
+  86, 110, 49, 83, 67, 87, 74, 86, 71, 80,
+  55, 80, 81, 81, 73, 69, 92, 114, 84, 68,
+  63, 76, 86, 85, 90, 89, 75, 96, 80, 81,
+  81, 123, 115, 95, 60, 77, 80, 84, 100, 80,
+  79, 89, 70, 73, 85, 75, 84, 85, 82, 68,
+  82, 82, 84, 84, 91, 76, 79, 55, 63, 83,
+  105, 78, 77, 88, 66, 72, 83, 75, 92, 109,
+  100, 76, 85, 92, 101, 78, 74, 99, 83, 65,
+  69, 89, 85, 77, 82, 109, 59, 94, 84, 73,
+  94, 78, 92, 78, 64, 90, 89, 78, 84, 91,
+  91, 72, 76, 84, 69, 70, 82, 77, 78, 67,
+  80, 79, 69, 107, 74, 86, 93, 90, 91, 87,
+  93, 82, 78, 95, 83, 87, 83, 75, 84, 111,
+  49, 82, 73, 86, 79, 82, 76, 81, 67, 85,
+  80, 73, 73, 75, 90, 107, 78, 69, 61, 75,
+  89, 85, 83, 83, 76, 92, 83, 83, 77, 124,
+  90, 92, 65, 75, 75, 86, 98, 79, 85, 86,
+  73, 83, 85, 106, 80, 90, 92, 79, 91, 87,
+  84, 90, 91, 68, 89, 81, 85, 88, 97, 83,
+  84, 91, 77, 78, 83, 83, 90, 102, 79, 93,
+  90, 95, 85, 78, 85, 88, 76, 84, 82, 88,
+  58, 86, 71, 90, 85, 73, 90, 93, 89, 79,
+  85, 87, 86, 90, 85, 92, 81, 84, 82, 79,
+  85, 71, 75, 80, 77, 93, 88, 88, 90, 91,
+  70, 78, 88, 92, 84, 88, 80, 86, 92, 85,
+  81, 104, 95, 80, 92, 93, 88, 94, 71, 85,
+  82, 79, 88, 81, 82, 85, 93, 71, 79, 75,
+  84, 72, 87, 84, 82, 81, 84, 83, 87, 88,
+  85, 84, 76, 89, 91, 91, 80, 66, 68, 84,
+  81, 83, 95, 85, 85, 85, 84, 78, 82, 93,
+  92, 68, 88, 108, 85, 69, 88, 83, 90, 85,
+  95, 73, 86, 91, 94, 80, 92, 77, 80, 94,
+  77, 96, 85, 84, 90, 93, 85, 75, 108, 89,
+  88, 90, 87, 96, 87, 73, 65, 84, 123, 87,
+  91, 121, 65, 99, 71, 86, 79, 86, 93, 98,
+  92, 89, 88, 65, 68, 74, 74, 65, 71, 91,
+  80, 74, 75, 86, 72, 66, 76, 67, 106, 120,
+  82, 77, 79, 93, 79, 74, 112, 88, 91, 65,
+  92, 93, 90, 72, 89, 76, 56, 77, 58, 94,
+  82, 100, 77, 89, 56, 79, 82, 92, 73, 70,
+  66, 98, 92, 82, 57, 74, 98, 84, 90, 91,
+  80, 93, 78, 80, 75, 105, 104, 74, 55, 78,
+  95, 89, 84, 95, 82, 86, 60, 84, 89, 68,
+  88, 100, 74, 69, 88, 83, 87, 85, 90, 74,
+  81, 79, 91, 79, 107, 84, 81, 86, 67, 91,
+  86, 77, 93, 96, 89, 67, 102, 86, 90, 80,
+  83, 97, 86, 72, 65, 83, 92, 78, 95, 106,
+  56, 88, 74, 80, 74, 85, 89, 91, 84, 80,
+  81, 71, 69, 80, 80, 61, 76, 87, 73, 77,
+  77, 80, 72, 74, 72, 70, 94, 120, 80, 80,
+  85, 86, 84, 72, 105, 86, 94, 101, 89, 92,
+  78, 78, 88, 77, 59, 79, 61, 91, 79, 89,
+  82, 90, 66, 81, 84, 78, 74, 74, 66, 93,
+  88, 80, 63, 76, 107, 85, 86, 88, 82, 93,
+  88, 80, 76, 112, 79, 80, 61, 81, 88, 88,
+  86, 93, 82, 90, 68, 91, 85, 107, 78, 85,
+  88, 80, 91, 82, 89, 91, 86, 82, 82, 86,
+  89, 80, 79, 87, 89, 92, 77, 77, 78, 88,
+  82, 91, 75, 87, 96, 96, 85, 77, 90, 89,
+  73, 92, 84, 88, 64, 82, 77, 86, 82, 72,
+  87, 97, 80, 85, 82, 84, 92, 74, 82, 87,
+  78, 83, 81, 76, 82, 78, 81, 84, 82, 90,
+  82, 94, 80, 85, 82, 92, 89, 92, 84, 87,
+  79, 81, 97, 84, 83, 108, 90, 88, 84, 87,
+  88, 86, 73, 85, 80, 82, 88, 82, 86, 91,
+  88, 77, 85, 78, 81, 75, 91, 88, 76, 84,
+  75, 81, 84, 87, 92, 88, 85, 92, 93, 94,
+  82, 68, 68, 76, 78, 87, 99, 87, 76, 90,
+  78, 79, 77, 92, 88, 82, 82, 80, 98, 87,
+  77, 84, 71, 88, 78, 84, 78, 89, 93, 75,
+  93, 88, 73, 83, 89, 90, 86, 85, 79, 79,
+  97, 81, 85, 73, 84, 85, 97, 82, 79, 94,
+  99, 79, 85, 80, 78, 96, 79, 93, 85, 76,
+  72, 107, 114, 87, 106, 70, 90, 79, 93, 80,
+  80, 86, 90, 75, 83, 89, 98, 82, 85, 88,
+  81, 70, 93, 82, 87, 93, 83, 83, 80, 65,
+  95, 88, 95, 85, 72, 100, 75, 79, 79, 82,
+  85, 85, 86, 75, 89, 77, 80, 80, 88, 92,
+  70, 71, 84, 88, 81, 78, 73, 78, 88, 84,
+  89, 77, 81, 87, 83, 90, 84, 85, 80, 90,
+  85, 87, 83, 81, 86, 71, 84, 91, 89, 81,
+  91, 93, 73, 70, 76, 85, 89, 85, 68, 87,
+  89, 95, 82, 77, 79, 93, 82, 72, 86, 86,
+  73, 88, 86, 72, 90, 79, 82, 81, 90, 83,
+  89, 68, 94, 79, 90, 80, 78, 74, 95, 71,
+  84, 66, 73, 90, 80, 72, 81, 84, 75, 103,
+  99, 80, 88, 85, 83, 85, 84, 79, 85, 77,
+  101, 94, 80, 82, 112, 82, 72, 75, 73, 81,
+  93, 94, 84, 83, 82, 61, 79, 57, 81, 94,
+  91, 88, 66, 94, 75, 86, 94, 82, 80, 84,
+  85, 82, 85, 68, 80, 83, 88, 82, 75, 70,
+  82, 89, 77, 74, 88, 74, 95, 84, 95, 88,
+  82, 85, 81, 99, 79, 84, 75, 93, 83, 84,
+  80, 80, 71, 86, 86, 91, 90, 91, 78, 94,
+  73, 87, 72, 88, 91, 86, 67, 91, 88, 90,
+  74, 77, 76, 88, 77, 76, 80, 83, 73, 86,
+  87, 76, 84, 80, 85, 81, 78, 89, 88, 79,
+  101, 73, 84, 84, 88, 72, 95, 70, 92, 69,
+  72, 100, 82, 81, 87, 84, 81, 90, 94, 87,
+  88, 98, 85, 89, 80, 79, 89, 86, 98, 92,
+  87, 79, 103, 84, 78, 73, 99, 84, 94, 97,
+  88, 85, 81, 66, 87, 62, 83, 105, 89, 89,
+  62, 91, 82, 84, 91, 79, 85, 78, 85, 79,
+  91, 68, 80, 83, 86, 83, 80, 80, 86, 87,
+  79, 76, 89, 66, 96, 81, 77, 93, 81, 87,
+  79, 93, 75, 81, 74, 92, 77, 82, 79, 82,
+  81, 86, 79, 82, 90, 69, 85, 74, 79, 83,
+  76, 79, 84, 84, 76, 87, 78, 95, 77, 91,
+  82, 96, 86, 74, 97, 91, 100, 92, 92, 81,
+  104, 81, 86, 78, 80, 77, 101, 67, 73, 78,
+  85, 78, 87, 98, 84, 90, 85, 64, 87, 95,
+  92, 99, 80, 86, 61, 96, 102, 79, 92, 50,
+  82, 44, 92, 96, 80, 89, 80, 46, 69, 85,
+  100, 66, 93, 85, 76, 86, 90, 84, 87, 86,
+  89, 99, 76, 80, 73, 70, 113, 109, 56, 82,
+  84, 77, 77, 89, 84, 73, 95, 83, 82, 73,
+  83, 72, 90, 90, 66, 67, 80, 98, 86, 83,
+  79, 76, 81, 97, 93, 79, 85, 94, 51, 99,
+  95, 82, 77, 85, 89, 85, 74, 67, 72, 88,
+  84, 120, 90, 70, 75, 70, 100, 77, 72, 85,
+  46, 94, 104, 80, 98, 81, 84, 80, 91, 85,
+  86, 121, 85, 77, 97, 90, 94, 87, 77, 79,
+  96, 81, 77, 74, 76, 96, 78, 64, 79, 74,
+  72, 62, 81, 82, 79, 61, 97, 79, 82, 63,
+  95, 43, 77, 71, 68, 75, 63, 81, 95, 78,
+  74, 118, 80, 82, 90, 91, 68, 83, 105, 77,
+  77, 73, 66, 99, 80, 84, 96, 91, 67, 82,
+  76, 73, 57, 79, 80, 101, 99, 77, 80, 94,
+  60, 78, 71, 83, 86, 106, 100, 94, 91, 68,
+  78, 92, 65, 65, 94, 99, 95, 76, 102, 117,
+  92, 78, 73, 79, 92, 76, 95, 86, 88, 83,
+  74, 76, 73, 104, 52, 76, 72, 93, 102, 76,
+  85, 109, 76, 68, 105, 89, 74, 84, 52, 92,
+  107, 81, 85, 76, 86, 80, 80, 79, 82, 139,
+  75, 81, 84, 80, 87, 83, 67, 76, 97, 75,
+  71, 77, 73, 87, 79, 72, 70, 74, 79, 60,
+  81, 79, 91, 78, 90, 84, 80, 78, 89, 47,
+  96, 70, 67, 81, 71, 99, 96, 113, 72, 97,
+  82, 81, 86, 101, 95, 80, 90, 72, 76, 69,
+  91, 93, 85, 86, 104, 94, 66, 61, 91, 75,
+  63, 105, 75, 92, 102, 80, 79, 83, 85, 78,
+  72, 87, 85, 87, 87, 85, 90, 80, 83, 89,
+  71, 103, 89, 94, 92, 78, 95, 105, 91, 73,
+  61, 86, 84, 84, 105, 71, 75, 76, 80, 76,
+  71, 91, 51, 73, 88, 88, 92, 68, 87, 73,
+  74, 78, 92, 83, 74, 88, 87, 81, 80, 79,
+  83, 74, 69, 99, 84, 85, 80, 70, 92, 94,
+  81, 84, 80, 88, 103, 77, 79, 74, 73, 80,
+  93, 79, 97, 79, 98, 72, 91, 101, 83, 91,
+  91, 67, 87, 81, 92, 102, 78, 73, 69, 96,
+  97, 91, 91, 88, 86, 49, 95, 92, 68, 89,
+  77, 52, 80, 87, 86, 75, 94, 83, 90, 85,
+  94, 91, 89, 85, 87, 108, 81, 89, 73, 72,
+  105, 96, 53, 79, 89, 77, 79, 87, 82, 85,
+  95, 84, 83, 76, 86, 74, 97, 86, 75, 83,
+  78, 93, 82, 80, 74, 73, 81, 81, 85, 77,
+  84, 98, 55, 85, 84, 82, 84, 87, 79, 84,
+  80, 71, 81, 85, 86, 100, 84, 68, 71, 73,
+  96, 71, 73, 91, 61, 84, 98, 75, 103, 70,
+  86, 95, 97, 78, 83, 97, 76, 84, 88, 79,
+  77, 96, 85, 80, 84, 71, 56, 78, 82, 108,
+  90, 67, 86, 83, 82, 76, 86, 87, 89, 69,
+  87, 76, 81, 72, 80, 52, 79, 73, 68, 89,
+  68, 93, 99, 83, 85, 108, 79, 76, 82, 89,
+  84, 87, 82, 78, 96, 86, 87, 86, 90, 79,
+  84, 86, 73, 76, 91, 87, 63, 85, 80, 93,
+  88, 89, 83, 90, 78, 88, 76, 90, 85, 98,
+  111, 98, 86, 77, 89, 87, 83, 76, 91, 92,
+  79, 77, 95, 92, 81, 80, 76, 75, 84, 79,
+  95, 72, 74, 80, 85, 86, 71, 100, 58, 83,
+  89, 78, 97, 69, 83, 94, 104, 68, 99, 88,
+  74, 84, 59, 85, 98, 72, 95, 87, 91, 83,
+  85, 78, 76, 107, 84, 92, 95, 81, 81, 89,
+  75, 78, 80, 86, 65, 82, 78, 91, 81, 88,
+  72, 86, 85, 75, 83, 86, 81, 79, 85, 77,
+  84, 76, 77, 56, 90, 85, 71, 91, 70, 90,
+  94, 103, 80, 84, 81, 72, 78, 99, 96, 88,
+  88, 73, 88, 90, 82, 88, 87, 84, 90, 93,
+  80, 72, 81, 91, 69, 96, 73, 97, 88, 98,
+  81, 87, 91, 82, 80, 87, 84, 83, 92, 86,
+  85, 87, 82, 82, 85, 83, 91, 89, 79, 83,
+  93, 81, 83, 78, 81, 76, 79, 83, 94, 75,
+  90, 76, 91, 85, 76, 87, 61, 75, 101, 75,
+  89, 70, 92, 84, 76, 78, 74, 82, 110, 88,
+  76, 69, 81, 65, 79, 95, 71, 91, 89, 105,
+  58, 84, 92, 97, 81, 91, 87, 71, 83, 77,
+  90, 76, 98, 83, 79, 82, 73, 86, 80, 71,
+  87, 85, 75, 87, 113, 70, 92, 79, 81, 88,
+  74, 88, 105, 79, 77, 75, 79, 89, 84, 95,
+  79, 106, 90, 84, 81, 70, 80, 79, 84, 92,
+  70, 72, 83, 77, 91, 76, 90, 87, 82, 84,
+  65, 65, 82, 88, 79, 96, 98, 81, 81, 85,
+  92, 97, 80, 77, 78, 84, 74, 74, 84, 90,
+  92, 73, 75, 86, 105, 81, 91, 88, 81, 87,
+  84, 97, 89, 87, 77, 83, 102, 76, 104, 104,
+  81, 74, 86, 80, 70, 90, 75, 80, 89, 70,
+  88, 85, 69, 77, 73, 73, 104, 82, 76, 70,
+  79, 68, 79, 87, 72, 91, 92, 107, 62, 90,
+  97, 87, 80, 88, 89, 70, 79, 76, 96, 76,
+  96, 78, 81, 73, 83, 86, 85, 68, 88, 77,
+  81, 90, 101, 77, 94, 76, 74, 83, 68, 96,
+  94, 69, 88, 77, 77, 86, 78, 85, 87, 113,
+  98, 75, 75, 69, 68, 73, 91, 100, 66, 64,
+  76, 80, 86, 70, 85, 81, 83, 81, 67, 59,
+  83, 84, 79, 89, 99, 72, 84, 84, 92, 109,
+  79, 80, 78, 75, 74, 79, 79, 97, 91, 68,
+  77, 85, 102, 82, 78, 88, 86, 91, 80, 100,
+  86, 84, 78, 84, 99, 77, 82, 109, 86, 71,
+  80, 86, 67, 92, 72, 80, 91, 76, 89, 84,
+  83, 81, 75, 85, 103, 88, 83, 72, 87, 69,
+  75, 85, 77, 92, 88, 99, 63, 91, 97, 95,
+  82, 92, 90, 75, 83, 79, 84, 72, 87, 85,
+  75, 69, 90, 110, 86, 74, 85, 82, 77, 86,
+  91, 76, 95, 89, 81, 88, 77, 88, 100, 81,
+  77, 81, 85, 90, 85, 99, 83, 96, 88, 83,
+  80, 75, 92, 76, 97, 91, 71, 67, 101, 86,
+  98, 73, 84, 90, 87, 81, 66, 69, 85, 90,
+  83, 94, 93, 76, 77, 85, 92, 97, 83, 82,
+  74, 86, 86, 81, 86, 93, 83, 82, 84, 85,
+  100, 79, 88, 93, 77, 88, 89, 98, 88, 88,
+  80, 83, 100, 78, 88, 96, 82, 78, 82, 81,
+  75, 90, 80, 87, 88, 76, 90, 77, 70, 84,
+  76, 87, 111, 90, 75, 74, 79, 71, 81, 82,
+  67, 98, 85, 100, 65, 90, 98, 94, 81, 92,
+  87, 60, 86, 79, 88, 74, 101, 92, 85, 86,
+  68, 81, 84, 87, 90, 78, 82, 87, 105, 73,
+  91, 85, 72, 91, 78, 81, 115, 66, 75, 83,
+  74, 95, 78, 95, 76, 96, 88, 85, 80, 70,
+  65, 73, 84, 75, 76, 55, 94, 80, 81, 75,
+  87, 82, 88, 92, 66, 68, 74, 102, 78, 71,
+  90, 74, 79, 80, 87, 85, 80, 71, 83, 84,
+  75, 84, 92, 88, 83, 68, 69, 91, 101, 84,
+  118, 92, 82, 86, 90, 92, 91, 85, 69, 90,
+  91, 80, 93, 95, 71, 70, 80, 70, 72, 79,
+  77, 85, 80, 67, 89, 82, 73, 85, 75, 77,
+  104, 78, 73, 75, 75, 73, 82, 91, 65, 97,
+  90, 105, 69, 92, 103, 89, 82, 89, 82, 54,
+  85, 80, 91, 71, 94, 95, 90, 79, 69, 74,
+  84, 82, 87, 72, 86, 89, 107, 79, 94, 89,
+  64, 83, 74, 82, 105, 73, 79, 82, 74, 88,
+  75, 84, 77, 94, 92, 80, 81, 72, 59, 75,
+  85, 68, 72, 62, 80, 83, 70, 76, 82, 74,
+  94, 79, 63, 61, 71, 104, 78, 70, 87, 70,
+  79, 78, 86, 89, 78, 80, 80, 76, 70, 87,
+  87, 91, 78, 63, 73, 86, 103, 87, 120, 88,
+  81, 87, 93, 91, 94, 84, 65, 83, 92, 78,
+  81, 96, 66, 68, 79, 71, 59, 80, 76, 88,
+  82, 71, 86, 89, 86, 79, 74, 89, 102, 84,
+  73, 73, 82, 77, 78, 89, 69, 94, 90, 97,
+  67, 97, 92, 96, 82, 88, 84, 65, 86, 77,
+  85, 72, 90, 99, 83, 78, 83, 96, 87, 88,
+  84, 77, 81, 84, 96, 76, 91, 92, 66, 90,
+  78, 81, 106, 80, 74, 87, 78, 84, 82, 97,
+  81, 90, 87, 84, 83, 74, 77, 74, 90, 73,
+  80, 67, 85, 85, 88, 70, 85, 84, 88, 80,
+  61, 69, 77, 100, 80, 83, 88, 80, 82, 80,
+  85, 87, 81, 77, 80, 87, 76, 83, 94, 92,
+  81, 71, 75, 80, 97, 81, 109, 95, 77, 85,
+  90, 95, 92, 86, 73, 81, 97, 83, 93, 89,
+  75, 76, 80, 77, 76, 81, 78, 91, 80, 69,
+  92, 77, 79, 87, 77, 88, 93, 103, 75, 74,
+  84, 75, 79, 88, 75, 102, 86, 87, 76, 93,
+  92, 99, 82, 85, 92, 75, 96, 78, 81, 83,
+  93, 88, 88, 94, 83, 83, 90, 95, 87, 91,
+  89, 89, 84, 76, 78, 92, 84, 91, 79, 85,
+  104, 73, 75, 91, 83, 93, 82, 97, 81, 89,
+  84, 82, 80, 79, 86, 71, 99, 76, 91, 85,
+  96, 77, 94, 72, 91, 82, 79, 86, 75, 72,
+  77, 90, 89, 83, 90, 76, 86, 89, 87, 81,
+  78, 82, 85, 97, 81, 70, 102, 82, 95, 75,
+  84, 89, 91, 83, 96, 92, 83, 87, 79, 92,
+  89, 88, 88, 94, 93, 81, 90, 93, 85, 74,
+  83, 71, 94, 84, 89, 100, 75, 74, 91, 77,
+  77, 89, 76, 81, 89, 93, 75, 74, 85, 76,
+  79, 98, 74, 98, 87, 85, 81, 90, 86, 93,
+  82, 81, 92, 72, 97, 75, 85, 82, 88, 102,
+  93, 88, 84, 79, 83, 91, 89, 84, 82, 89,
+  87, 77, 79, 89, 81, 81, 81, 83, 98, 78,
+  73, 93, 82, 95, 83, 89, 83, 83, 81, 84,
+  78, 75, 81, 70, 103, 68, 92, 84, 88, 75,
+  84, 70, 94, 79, 86, 78, 72, 69, 76, 91,
+  93, 83, 91, 73, 81, 86, 87, 82, 75, 84,
+  85, 91, 79, 76, 108, 80, 87, 70, 80, 88,
+  92, 84, 98, 104, 83, 88, 85, 98, 89, 83,
+  86, 88, 94, 88, 90, 88, 77, 74, 81, 76,
+  87, 81, 90, 105, 72, 74, 83, 82, 88, 83,
+  76, 90, 88, 94, 78, 76, 87, 80, 78, 86,
+  74, 98, 89, 83, 77, 98, 78, 99, 86, 83,
+  91, 77, 98, 75, 78, 85, 86, 98, 88, 85,
+  89, 90, 85, 92, 85, 87, 85, 85, 88, 80,
+  78, 90, 86, 90, 80, 84, 99, 77, 72, 94,
+  79, 88, 85, 99, 87, 86, 83, 84, 82, 79,
+  88, 75, 108, 75, 90, 85, 86, 81, 91, 68,
+  96, 83, 81, 85, 70, 73, 79, 86, 93, 89,
+  88, 82, 79, 86, 84, 84, 79, 86, 82, 98,
+  79, 72, 105, 80, 82, 77, 89, 73, 91, 80,
+  97, 94, 86, 91, 88, 95, 79, 86, 88, 89,
+  96, 89, 99, 88, 84, 77, 82, 75, 90, 85,
+  92, 104, 78, 81, 92, 100, 91, 85, 70, 73,
+  90, 78, 86, 92, 102, 106, 88, 74, 93, 68,
+  80, 87, 85, 98, 92, 82, 87, 82, 89, 86,
+  82, 88, 81, 94, 104, 80, 92, 86, 89, 70,
+  90, 80, 98, 81, 94, 85, 94, 91, 85, 73,
+  80, 74, 74, 88, 86, 92, 93, 80, 85, 91,
+  66, 84, 76, 90, 89, 69, 93, 72, 78, 86,
+  83, 93, 76, 95, 68, 92, 84, 89, 84, 78,
+  89, 74, 81, 82, 85, 87, 76, 71, 94, 84,
+  84, 93, 93, 97, 70, 80, 92, 76, 65, 98,
+  99, 92, 67, 75, 91, 87, 84, 83, 85, 93,
+  79, 105, 72, 98, 81, 84, 97, 79, 92, 94,
+  77, 87, 78, 91, 101, 85, 65, 89, 80, 87,
+  91, 94, 86, 107, 95, 87, 81, 75, 79, 75,
+  88, 85, 86, 82, 74, 74, 71, 80, 87, 79,
+  80, 100, 70, 85, 77, 89, 95, 95, 76, 82,
+  91, 85, 84, 83, 84, 73, 87, 85, 74, 81,
+  111, 78, 85, 87, 92, 85, 86, 103, 97, 89,
+  90, 84, 80, 81, 89, 82, 85, 87, 68, 72,
+  80, 89, 77, 115, 82, 70, 73, 70, 78, 76,
+  85, 80, 99, 94, 75, 81, 85, 71, 91, 82,
+  83, 89, 80, 79, 88, 81, 86, 89, 84, 77,
+  90, 79, 65, 83, 84, 88, 63, 88, 93, 81,
+  58, 80, 77, 97, 90, 83, 91, 81, 68, 83,
+  83, 77, 80, 88, 79, 83, 75, 79, 86, 79,
+  72, 78, 86, 72, 85, 79, 82, 87, 87, 81,
+  91, 85, 107, 87, 83, 102, 72, 77, 81, 85,
+  73, 65, 85, 85, 50, 96, 94, 75, 78, 91,
+  89, 100, 85, 96, 81, 78, 72, 82, 84, 99,
+  83, 87, 77, 82, 85, 86, 78, 89, 90, 80,
+  81, 81, 67, 84, 84, 108, 102, 92, 95, 86,
+  80, 79, 84, 73, 85, 86, 99, 75, 81, 92,
+  70, 128, 85, 81, 74, 68, 62, 69, 113, 77,
+  69, 84, 82, 79, 78, 91, 84, 77, 74, 82,
+  82, 77, 83, 95, 76, 88, 82, 67, 78, 74,
+  87, 93, 99, 81, 87, 80, 84, 73, 76, 77,
+  80, 73, 80, 89, 89, 78, 70, 70, 78, 86,
+  83, 92, 68, 80, 73, 84, 90, 85, 78, 79,
+  88, 84, 88, 79, 96, 88, 79, 78, 88, 98,
+  88, 89, 69, 77, 95, 76, 75, 88, 103, 119,
+  110, 76, 95, 78, 93, 95, 92, 100, 85, 79,
+  75, 78, 85, 90, 74, 90, 87, 85, 114, 73,
+  104, 90, 99, 72, 77, 83, 98, 88, 81, 84,
+  101, 100, 81, 79, 81, 67, 62, 97, 84, 89,
+  89, 96, 85, 83, 63, 91, 73, 94, 81, 69,
+  85, 71, 72, 89, 88, 97, 82, 80, 77, 79,
+  77, 88, 82, 64, 68, 92, 74, 77, 93, 88,
+  82, 75, 101, 80, 87, 97, 93, 86, 72, 73,
+  72, 73, 66, 93, 93, 95, 80, 76, 79, 88,
+  83, 82, 85, 84, 80, 109, 74, 103, 91, 100,
+  95, 77, 87, 85, 72, 88, 92, 71, 91, 101,
+  66, 87, 83, 86, 97, 92, 82, 101, 101, 94,
+  84, 70, 78, 71, 96, 83, 87, 85, 91, 92,
+  69, 93, 82, 75, 78, 99, 59, 85, 75, 90,
+  87, 89, 70, 90, 97, 75, 75, 77, 81, 75,
+  90, 84, 71, 78, 90, 88, 75, 80, 104, 78,
+  80, 104, 93, 72, 87, 99, 78, 74, 87, 87,
+  74, 79, 73, 70, 85, 90, 78, 123, 78, 61,
+  68, 66, 83, 72, 98, 72, 90, 90, 70, 87,
+  82, 68, 86, 111, 75, 86, 85, 76, 98, 90,
+  81, 91, 83, 79, 82, 74, 57, 82, 81, 81,
+  55, 81, 89, 79, 68, 86, 69, 75, 85, 82,
+  81, 76, 76, 77, 85, 80, 79, 91, 66, 91,
+  68, 84, 110, 77, 73, 76, 85, 78, 90, 79,
+  84, 86, 71, 88, 87, 78, 77, 81, 73, 90,
+  66, 74, 86, 85, 69, 72, 85, 94, 57, 87,
+  75, 66, 79, 86, 101, 106, 74, 97, 74, 73,
+  77, 77, 93, 82, 75, 84, 68, 87, 69, 82,
+  81, 89, 82, 78, 88, 73, 56, 76, 89, 106,
+  79, 76, 96, 90, 79, 72, 86, 74, 82, 87,
+  106, 71, 100, 85, 79, 138, 99, 76, 57, 76,
+  64, 76, 107, 87, 73, 77, 92, 92, 78, 96,
+  84, 93, 82, 73, 78, 68, 82, 91, 71, 85,
+  88, 68, 72, 76, 79, 104, 99, 75, 93, 69,
+  86, 75, 95, 87, 82, 70, 88, 92, 84, 98,
+  79, 65, 78, 79, 79, 91, 66, 86, 75, 92,
+  98, 82, 69, 83, 83, 78, 84, 77, 93, 90,
+  69, 81, 81, 100, 87, 104, 67, 76, 90, 65,
+  79, 90, 97, 106, 112, 87, 81, 95, 94, 91,
+  92, 91, 83, 75, 79, 80, 69, 88, 79, 88,
+  84, 86, 94, 80, 88, 85, 90, 78, 90, 82,
+  90, 94, 89, 82, 82, 96, 77, 73, 82, 66,
+  71, 89, 78, 79, 93, 92, 81, 72, 69, 88,
+  83, 95, 83, 83, 79, 73, 81, 84, 92, 92,
+  97, 76, 82, 82, 87, 79, 82, 71, 76, 81,
+  75, 84, 86, 91, 80, 74, 86, 76, 90, 88,
+  95, 91, 66, 94, 86, 80, 70, 81, 90, 87,
+  95, 79, 83, 95, 81, 81, 88, 85, 81, 100,
+  71, 99, 81, 94, 87, 86, 96, 84, 68, 90,
+  96, 65, 89, 85, 68, 88, 89, 79, 101, 84,
+  84, 105, 94, 92, 78, 67, 81, 74, 83, 87,
+  80, 76, 92, 113, 62, 88, 76, 73, 77, 86,
+  73, 94, 99, 94, 70, 81, 79, 88, 96, 86,
+  73, 77, 68, 76, 68, 84, 89, 77, 75, 87,
+  93, 85, 87, 76, 76, 92, 79, 87, 104, 97,
+  77, 77, 89, 79, 72, 76, 82, 72, 91, 79,
+  86, 128, 87, 64, 68, 66, 85, 74, 105, 81,
+  79, 95, 87, 93, 82, 79, 89, 87, 70, 88,
+  81, 72, 92, 92, 75, 88, 82, 80, 83, 75,
+  61, 84, 96, 74, 66, 76, 86, 73, 74, 82,
+  77, 77, 87, 83, 77, 83, 71, 76, 86, 78,
+  74, 88, 68, 96, 83, 86, 127, 84, 75, 79,
+  84, 69, 88, 81, 87, 80, 72, 84, 94, 76,
+  60, 77, 70, 96, 75, 84, 79, 84, 68, 79,
+  84, 83, 61, 80, 70, 77, 83, 81, 119, 94,
+  67, 91, 72, 81, 81, 80, 84, 72, 81, 90,
+  64, 98, 48, 83, 83, 83, 75, 76, 81, 76,
+  59, 81, 91, 96, 67, 85, 97, 89, 87, 74,
+  87, 82, 90, 94, 98, 77, 89, 86, 83, 109,
+  108, 76, 65, 81, 68, 83, 95, 76, 100, 83,
+  95, 97, 79, 103, 79, 77, 91, 85, 80, 71,
+  80, 83, 72, 77, 88, 74, 79, 77, 87, 103,
+  100, 79, 100, 68, 87, 77, 86, 79, 82, 87,
+  91, 91, 89, 80, 86, 70, 95, 83, 78, 86,
+  71, 84, 69, 77, 81, 80, 66, 86, 86, 79,
+  91, 85, 96, 89, 76, 78, 86, 89, 68, 89,
+  89, 106, 93, 92, 84, 82, 80, 90, 87, 86,
+  79, 82, 83, 98, 82, 79, 86, 85, 82, 74,
+  72, 90, 82, 88, 85, 92, 84, 75, 99, 80,
+  112, 104, 77, 91, 94, 81, 75, 79, 79, 78,
+  78, 83, 88, 88, 91, 90, 67, 91, 79, 82,
+  80, 89, 75, 86, 80, 92, 78, 83, 78, 79,
+  76, 80, 87, 86, 87, 79, 101, 103, 104, 77,
+  87, 92, 79, 103, 86, 66, 76, 85, 92, 77,
+  85, 85, 86, 88, 81, 69, 83, 89, 87, 103,
+  81, 84, 89, 86, 80, 89, 63, 76, 80, 88,
+  81, 77, 80, 84, 70, 86, 84, 75, 89, 89,
+  79, 91, 94, 86, 89, 82, 87, 80, 84, 93,
+  74, 81, 88, 83, 81, 95, 66, 91, 70, 95,
+  90, 100, 97, 86, 74, 84, 73, 74, 85, 82,
+  88, 106, 81, 74, 90, 79, 95, 84, 79, 82,
+  93, 94, 75, 103, 79, 94, 91, 59, 106, 89,
+  73, 105, 71, 63, 77, 74, 85, 74, 74, 108,
+  84, 95, 87, 88, 64, 80, 86, 62, 96, 65,
+  90, 68, 80, 102, 82, 84, 78, 76, 81, 72,
+  93, 91, 77, 78, 77, 96, 118, 85, 90, 93,
+  87, 95, 79, 58, 65, 70, 93, 104, 55, 75,
+  85, 55, 64, 87, 88, 77, 89, 119, 87, 77,
+  89, 90, 79, 92, 62, 95, 82, 86, 94, 89,
+  87, 82, 78, 94, 86, 81, 89, 90, 66, 89,
+  94, 93, 97, 88, 96, 82, 94, 94, 61, 80,
+  93, 86, 85, 87, 90, 89, 87, 89, 92, 90,
+  83, 79, 79, 93, 81, 102, 82, 83, 81, 93,
+  83, 77, 77, 89, 98, 76, 81, 88, 83, 86,
+  79, 102, 88, 83, 98, 87, 99, 96, 83, 87,
+  85, 75, 76, 81, 85, 80, 74, 83, 84, 102,
+  91, 88, 64, 98, 78, 79, 85, 82, 72, 87,
+  82, 87, 79, 83, 76, 81, 84, 79, 90, 85,
+  87, 70, 76, 103, 103, 84, 85, 87, 76, 90,
+  86, 73, 77, 92, 95, 92, 88, 87, 86, 91,
+  85, 73, 87, 81, 86, 94, 84, 83, 89, 86,
+  80, 93, 62, 92, 82, 88, 80, 80, 79, 86,
+  73, 83, 102, 78, 85, 87, 91, 81, 91, 87,
+  86, 82, 74, 76, 80, 87, 75, 79, 84, 82,
+  88, 85, 58, 87, 92, 88, 61, 88, 103, 78,
+  81, 108, 86, 88, 74, 73, 81, 75, 80, 77,
+  75, 72, 68, 72, 77, 76, 81, 82, 94, 86,
+  72, 81, 90, 100, 93, 82, 79, 93, 117, 74,
+  78, 71, 90, 97, 80, 77, 84, 91, 78, 80,
+  89, 93, 78, 94, 67, 132, 82, 100, 90, 70,
+  76, 72, 92, 67, 70, 72, 88, 74, 78, 73,
+  97, 92, 90, 74, 79, 81, 77, 69, 83, 73,
+  71, 121, 84, 92, 88, 85, 85, 104, 88, 78,
+  68, 93, 81, 77, 88, 73, 89, 88, 73, 83,
+  73, 71, 80, 87, 65, 73, 77, 90, 72, 89,
+  82, 75, 77, 81, 106, 77, 70, 80, 71, 77,
+  75, 66, 70, 86, 86, 83, 86, 79, 85, 81,
+  86, 76, 103, 75, 57, 85, 108, 73, 85, 105,
+  82, 124, 74, 70, 90, 59, 83, 83, 76, 85,
+  75, 70, 71, 67, 75, 78, 103, 80, 82, 73,
+  69, 86, 85, 79, 70, 91, 112, 68, 82, 75,
+  80, 105, 86, 59, 82, 76, 72, 70, 94, 116,
+  72, 86, 65, 115, 78, 102, 89, 72, 68, 67,
+  92, 71, 62, 78, 85, 71, 78, 66, 91, 85,
+  79, 72, 85, 66, 73, 76, 80, 69, 68, 122,
+  84, 85, 100, 82, 72, 121, 106, 71, 67, 84,
+  84, 63, 79, 67, 84, 89, 76, 88, 66, 67,
+  83, 84, 63, 80, 69, 103, 74, 90, 103, 75,
+  70, 76, 124, 67, 74, 75, 71, 71, 83, 67,
+  62, 87, 89, 80, 81, 78, 82, 84, 103, 89,
+  88, 76, 65, 93, 100, 78, 78, 111, 74, 116,
+  78, 75, 82, 72, 81, 83, 88, 76, 88, 79,
+  72, 78, 87, 83, 87, 83, 87, 80, 90, 79,
+  94, 87, 88, 92, 79, 71, 88, 75, 76, 90,
+  79, 86, 77, 79, 78, 84, 75, 91, 83, 87,
+  79, 76, 83, 93, 86, 70, 78, 75, 84, 71,
+  74, 71, 93, 73, 79, 76, 72, 91, 101, 84,
+  86, 81, 79, 92, 75, 78, 71, 114, 90, 74,
+  81, 87, 78, 98, 85, 77, 77, 80, 86, 83,
+  82, 73, 91, 89, 86, 88, 70, 69, 85, 87,
+  71, 74, 76, 89, 74, 93, 100, 83, 74, 87,
+  107, 77, 84, 79, 76, 84, 91, 69, 79, 86,
+  78, 86, 84, 81, 86, 87, 81, 89, 79, 89,
+  76, 81, 95, 82, 84, 101, 78, 115, 78, 80,
+  83, 82, 86, 77, 80, 79, 70, 79, 81, 69,
+  82, 89, 91, 77, 86, 87, 89, 100, 74, 77,
+  71, 94, 86, 79, 81, 77, 103, 93, 84, 99,
+  84, 92, 79, 87, 97, 99, 88, 83, 70, 59,
+  88, 92, 87, 72, 87, 87, 88, 73, 85, 72,
+  92, 82, 85, 80, 71, 83, 86, 78, 89, 83,
+  78, 66, 74, 84, 69, 99, 87, 90, 83, 97,
+  90, 101, 81, 111, 72, 105, 83, 70, 90, 72,
+  88, 87, 77, 86, 76, 75, 83, 88, 89, 73,
+  83, 84, 62, 95, 98, 85, 79, 92, 112, 79,
+  70, 88, 73, 88, 79, 68, 74, 78, 83, 93,
+  86, 75, 87, 84, 86, 80, 98, 78, 78, 79,
+  95, 81, 88, 93, 94, 115, 78, 68, 86, 65,
+  78, 86, 89, 82, 76, 78, 71, 67, 78, 80,
+  96, 67, 86, 78, 79, 112, 71, 88, 64, 85,
+  120, 90, 87, 75, 90, 105, 101, 71, 83, 76,
+  77, 78, 104, 107, 80, 82, 58, 99, 86, 100,
+  84, 65, 74, 79, 83, 80, 77, 77, 88, 79,
+  98, 70, 93, 75, 80, 74, 91, 76, 74, 79,
+  74, 89, 69, 96, 79, 74, 99, 109, 86, 121,
+  83, 92, 69, 98, 76, 58, 76, 71, 82, 92,
+  75, 87, 73, 66, 85, 85, 79, 74, 78, 91,
+  61, 91, 97, 76, 76, 84, 88, 70, 78, 82,
+  63, 85, 86, 61, 60, 83, 95, 86, 77, 72,
+  84, 88, 80, 93, 76, 76, 77, 85, 95, 87,
+  83, 101, 84, 81, 86, 83, 83, 85, 87, 91,
+  100, 69, 97, 78, 79, 75, 85, 92, 81, 71,
+  87, 90, 93, 83, 78, 86, 80, 94, 104, 77,
+  88, 74, 84, 89, 85, 97, 78, 73, 83, 92,
+  85, 78, 90, 84, 77, 117, 92, 92, 82, 78,
+  84, 90, 95, 75, 80, 72, 93, 91, 82, 89,
+  87, 90, 96, 79, 96, 82, 81, 90, 81, 82,
+  69, 94, 86, 78, 80, 97, 90, 85, 68, 103,
+  80, 92, 82, 79, 75, 73, 90, 89, 91, 85,
+  75, 80, 87, 89, 92, 73, 86, 84, 64, 93,
+  78, 91, 81, 88, 75, 83, 86, 85, 83, 84,
+  101, 71, 84, 81, 79, 94, 92, 82, 89, 60,
+  91, 101, 83, 98, 78, 99, 82, 84, 82, 76,
+  89, 88, 76, 100, 83, 86, 80, 82, 89, 88,
+  79, 81, 86, 81, 80, 79, 93, 74, 76, 84,
+  77, 89, 94, 86, 89, 89, 81, 76, 93, 79,
+  90, 85, 91, 88, 76, 79, 75, 86, 93, 94,
+  93, 87, 81, 87, 89, 95, 83, 80, 87, 84,
+  96, 96, 95, 75, 83, 86, 89, 73, 60, 75,
+  113, 84, 83, 72, 82, 92, 94, 68, 90, 84,
+  82, 71, 88, 76, 94, 77, 96, 75, 84, 103,
+  85, 70, 108, 78, 81, 83, 82, 70, 86, 52,
+  79, 88, 81, 80, 84, 86, 78, 91, 88, 83,
+  78, 90, 98, 74, 106, 77, 80, 77, 86, 91,
+  92, 82, 96, 84, 82, 81, 94, 108, 46, 82,
+  77, 71, 79, 91, 65, 93, 85, 84, 84, 100,
+  75, 77, 72, 86, 87, 79, 81, 67, 60, 107,
+  85, 81, 95, 90, 93, 56, 74, 81, 100, 86,
+  65, 50, 65, 73, 78, 53, 76, 88, 86, 68,
+  85, 82, 85, 97, 81, 90, 89, 57, 91, 77,
+  102, 78, 84, 85, 92, 73, 116, 80, 104, 98,
+  53, 84, 145, 82, 95, 122, 42, 66, 102, 105,
+  81, 75, 84, 81, 89, 60, 82, 82, 90, 69,
+  71, 86, 78, 106, 75, 77, 89, 123, 98, 70,
+  91, 67, 88, 78, 78, 83, 77, 153, 88, 86,
+  93, 102, 97, 82, 99, 101, 73, 87, 78, 70,
+  83, 99, 59, 82, 99, 79, 87, 99, 95, 79,
+  88, 86, 85, 119, 86, 109, 69, 88, 79, 108,
+  85, 102, 83, 91, 80, 86, 79, 67, 86, 89,
+  77, 91, 90, 88, 80, 79, 73, 92, 87, 95,
+  92, 83, 80, 67, 74, 84, 91, 102, 77, 83,
+  64, 77, 82, 86, 86, 94, 99, 87, 90, 93,
+  87, 108, 88, 96, 94, 78, 85, 90, 101, 85,
+  100, 84, 90, 80, 102, 79, 74, 63, 59, 87,
+  77, 83, 94, 66, 90, 83, 100, 83, 97, 77,
+  90, 83, 71, 88, 83, 87, 91, 82, 81, 75,
+  88, 84, 87, 75, 77, 81, 91, 82, 88, 76,
+  80, 80, 82, 84, 63, 123, 88, 88, 89, 78,
+  89, 89, 91, 94, 83, 73, 85, 90, 59, 67,
+  43, 77, 96, 79, 76, 100, 88, 89, 98, 73,
+  91, 108, 87, 78, 104, 92, 78, 74, 83, 77,
+  77, 87, 81, 79, 83, 123, 79, 87, 78, 67,
+  74, 82, 81, 81, 70, 77, 79, 75, 97, 87,
+  91, 74, 85, 80, 75, 75, 81, 79, 85, 82,
+  77, 76, 89, 92, 84, 85, 80, 74, 80, 79,
+  84, 69, 87, 92, 90, 85, 77, 72, 79, 91,
+  84, 71, 90, 92, 100, 90, 85, 78, 66, 63,
+  105, 91, 45, 80, 90, 81, 80, 75, 66, 73,
+  102, 64, 87, 92, 79, 71, 83, 87, 84, 83,
+  97, 89, 91, 103, 83, 67, 95, 84, 86, 86,
+  81, 75, 92, 80, 84, 91, 91, 81, 83, 85,
+  79, 73, 87, 80, 76, 79, 102, 70, 81, 86,
+  79, 86, 75, 79, 81, 73, 90, 95, 82, 82,
+  113, 101, 85, 79, 85, 113, 82, 69, 59, 93,
+  86, 86, 99, 129, 67, 67, 81, 72, 85, 84,
+  81, 90, 80, 97, 84, 72, 91, 91, 87, 61,
+  79, 89, 86, 95, 74, 97, 66, 75, 84, 51,
+  74, 100, 81, 78, 89, 87, 75, 135, 84, 55,
+  72, 63, 82, 79, 74, 59, 67, 65, 85, 68,
+  109, 99, 87, 72, 70, 87, 109, 67, 117, 92,
+  59, 83, 82, 86, 83, 69, 67, 93, 68, 83,
+  82, 77, 89, 88, 80, 91, 87, 123, 52, 79,
+  78, 87, 91, 74, 88, 90, 81, 84, 83, 80,
+  70, 137, 90, 88, 86, 88, 105, 81, 79, 69,
+  77, 87, 69, 86, 71, 89, 80, 97, 91, 74,
+  73, 81, 75, 71, 96, 83, 88, 99, 89, 73,
+  90, 89, 68, 107, 78, 98, 83, 81, 83, 77,
+  86, 83, 79, 86, 85, 89, 84, 74, 82, 85,
+  81, 77, 78, 79, 89, 82, 86, 72, 73, 77,
+  86, 98, 90, 96, 81, 97, 97, 87, 100, 93,
+  85, 97, 88, 80, 82, 85, 88, 78, 94, 86,
+  80, 86, 76, 84, 86, 74, 80, 84, 77, 88,
+  86, 61, 74, 87, 77, 66, 95, 67, 98, 84,
+  95, 85, 86, 76, 77, 87, 73, 91, 82, 84,
+  83, 89, 78, 84, 97, 89, 76, 73, 88, 93,
+  84, 68, 93, 81, 78, 86, 82, 76, 68, 57,
+  82, 86, 61, 79, 76, 86, 67, 81, 80, 71,
+  78, 92, 70, 71, 92, 79, 80, 69, 81, 80,
+  92, 77, 90, 74, 85, 89, 82, 70, 99, 83,
+  89, 84, 89, 74, 73, 79, 74, 89, 85, 107,
+  79, 87, 84, 85, 81, 80, 84, 80, 84, 79,
+  86, 74, 100, 84, 92, 74, 90, 82, 86, 80,
+  81, 97, 78, 88, 88, 74, 81, 100, 94, 98,
+  67, 82, 80, 77, 94, 73, 80, 98, 88, 80,
+  65, 85, 78, 71, 86, 77, 96, 89, 73, 81,
+  89, 69, 79, 77, 96, 83, 68, 76, 84, 80,
+  86, 81, 71, 90, 88, 74, 89, 80, 88, 84,
+  88, 83, 92, 86, 72, 90, 96, 87, 85, 84,
+  77, 89, 82, 87, 88, 72, 85, 73, 82, 90,
+  88, 74, 86, 78, 75, 74, 85, 72, 82, 94,
+  85, 82, 94, 83, 84, 92, 76, 86, 85, 74,
+  88, 91, 86, 79, 85, 75, 91, 82, 91, 87,
+  83, 75, 77, 82, 79, 84, 94, 87, 75, 77,
+  88, 82, 87, 77, 90, 99, 86, 70, 77, 70,
+  86, 85, 84, 67, 68, 86, 80, 90, 104, 99,
+  85, 82, 92, 81, 93, 96, 91, 95, 79, 89,
+  74, 81, 89, 76, 88, 95, 82, 79, 59, 71,
+  68, 60, 84, 77, 84, 92, 80, 77, 89, 82,
+  72, 76, 102, 73, 87, 87, 86, 85, 76, 84,
+  74, 95, 84, 84, 89, 78, 86, 90, 74, 82,
+  94, 95, 60, 81, 85, 83, 86, 79, 88, 90,
+  81, 83, 84, 74, 81, 66, 81, 86, 73, 74,
+  81, 82, 69, 73, 80, 75, 76, 94, 82, 68,
+  114, 76, 83, 86, 84, 88, 82, 76, 96, 82,
+  84, 81, 81, 66, 82, 94, 88, 70, 79, 96,
+  80, 75, 80, 84, 79, 87, 73, 87, 88, 83,
+  86, 79, 81, 82, 80, 77, 79, 84, 94, 77,
+  83, 74, 83, 81, 84, 89, 77, 86, 90, 94,
+  100, 80, 91, 97, 83, 98, 72, 80, 90, 64,
+  86, 76, 96, 91, 84, 87, 72, 81, 87, 80,
+  82, 80, 86, 80, 90, 75, 80, 88, 87, 74,
+  95, 87, 101, 67, 85, 88, 83, 82, 82, 75,
+  97, 86, 87, 81, 83, 82, 78, 81, 87, 84,
+  78, 88, 84, 97, 88, 77, 86, 80, 85, 83,
+  86, 82, 76, 77, 82, 85, 84, 83, 78, 84,
+  78, 82, 80, 69, 86, 80, 93, 83, 99, 78,
+  81, 83, 83, 79, 96, 82, 85, 85, 81, 83,
+  88, 83, 81, 85, 83, 85, 79, 78, 79, 82,
+  81, 78, 85, 88, 81, 88, 89, 79, 83, 89,
+  85, 87, 84, 96, 88, 84, 83, 86, 82, 89,
+  85, 80, 86, 85, 87, 89, 82, 86, 87, 81,
+  79, 90, 87, 91, 91, 86, 91, 85, 78, 81,
+  82, 82, 79, 87, 77, 83, 80, 91, 85, 95,
+  78, 88, 91, 85, 86, 77, 82, 86, 80, 91,
+  85, 79, 75, 76, 82, 82, 88, 83, 77, 86,
+  90, 84, 87, 89, 77, 78, 93, 82, 85, 82,
+  81, 83, 78, 90, 82, 78, 75, 87, 85, 82,
+  85, 84, 89, 84, 87, 75, 81, 85, 80, 85,
+  86, 84, 88, 87, 85, 83, 86, 75, 87, 83,
+  95, 86, 80, 74, 87, 82, 82, 80, 85, 84,
+  86, 81, 80, 85, 75, 73, 79, 80, 79, 76,
+  83, 86, 84, 86, 89, 77, 81, 88, 83, 88,
+  86, 94, 85, 80, 83, 85, 72, 87, 79, 79,
+  89, 80, 87, 83, 85, 81, 86, 76, 78, 90,
+  80, 89, 86, 84, 92, 83, 80, 79, 82, 79,
+  77, 84, 76, 83, 80, 85, 83, 91, 79, 89,
+  89, 82, 87, 76, 80, 86, 80, 90, 83, 79,
+  75, 72, 84, 80, 91, 84, 79, 87, 85, 83,
+  84, 84, 75, 76, 90, 83, 80, 87, 79, 81,
+  76, 84, 81, 74, 74, 88, 84, 79, 86, 85,
+  88, 81, 86, 77, 83, 83, 76, 85, 83, 87,
+  82, 90, 80, 83, 82, 73, 87, 80, 89, 86,
+  77, 77, 86, 78, 83, 82, 87, 85, 89, 83,
+  82, 83, 81, 77, 80, 85, 84, 78, 85, 87,
+  83, 91, 89, 84, 84, 95, 90, 83, 87, 92,
+  85, 81, 88, 86, 82, 82, 87, 86, 89, 85,
+  85, 90, 80, 82, 83, 84, 83, 87, 88, 92,
+  91, 84, 87, 83, 78, 82, 80, 80, 78, 86,
+  78, 89, 81, 87, 90, 90, 82, 89, 91, 88,
+  87, 80, 78, 87, 79, 90, 86, 80, 80, 75,
+  88, 86, 85, 92, 82, 83, 90, 81, 88, 82,
+  76, 77, 89, 83, 82, 89, 81, 86, 84, 90,
+  82, 83, 81, 87, 85, 76, 86, 84, 86, 80,
+  88, 78, 86, 86, 81, 87, 84, 87, 84, 95,
+  81, 80, 84, 76, 83, 82, 91, 86, 82, 78,
+  91, 79, 81, 80, 85, 77, 79, 85, 80, 87,
+  77, 83, 80, 79, 84, 80, 80, 84, 84, 82,
+  84, 82, 84, 84, 82, 79, 79, 99, 91, 93,
+  82, 89, 81, 91, 90, 85, 89, 82, 89, 87,
+  85, 78, 85, 83, 79, 99, 91, 86, 92, 77,
+  87, 82, 82, 84, 90, 81, 84, 86, 83, 84,
+  84, 86, 84, 88, 84, 88, 92, 89, 83, 79,
+  84, 86, 80, 90, 77, 77, 75, 74, 80, 85,
+  93, 82, 72, 94, 87, 73, 85, 86, 80, 82,
+  85, 83, 88, 84, 82, 84, 81, 93, 77, 77,
+  84, 90, 83, 94, 76, 82, 88, 87, 86, 81,
+  79, 81, 81, 81, 87, 84, 88, 85, 87, 85,
+  84, 78, 88, 86, 91, 80, 72, 82, 82, 87,
+  79, 77, 81, 78, 77, 79, 75, 82, 77, 79,
+  78, 80, 85, 82, 75, 84, 87, 81, 81, 79,
+  81, 81, 82, 81, 85, 101, 83, 90, 79, 89,
+  65, 87, 83, 82, 92, 76, 85, 80, 89, 77,
+  85, 78, 82, 101, 79, 85, 90, 72, 85, 83,
+  86, 85, 85, 81, 81, 83, 87, 83, 87, 83,
+  87, 84, 83, 92, 91, 91, 79, 84, 80, 88,
+  84, 85, 79, 81, 76, 72, 83, 90, 96, 81,
+  75, 96, 83, 75, 81, 79, 82, 80, 81, 86,
+  85, 87, 83, 79, 81, 88, 73, 72, 80, 92,
+  88, 100, 75, 83, 92, 84, 87, 84, 79, 77,
+  77, 79, 86, 83, 84, 81, 84, 88, 78, 82,
+  92, 85, 80, 73, 71, 85, 84, 80, 78, 81,
+  88, 82, 79, 86, 82, 82, 75, 80, 79, 84,
+  87, 81, 83, 87, 83, 83, 86, 86, 85, 92,
+  89, 75, 90, 92, 82, 89, 87, 88, 80, 81,
+  93, 88, 92, 83, 87, 85, 85, 79, 83, 77,
+  82, 87, 87, 89, 86, 78, 80, 84, 80, 82,
+  85, 78, 82, 82, 82, 88, 81, 85, 90, 91,
+  85, 83, 90, 86, 84, 76, 77, 86, 81, 88,
+  82, 78, 80, 76, 86, 86, 91, 93, 80, 86,
+  86, 78, 85, 78, 79, 85, 86, 83, 84, 89,
+  81, 85, 85, 91, 82, 79, 89, 88, 87, 84,
+  79, 83, 85, 83, 88, 81, 84, 82, 86, 83,
+  88, 86, 88, 87, 83, 78, 79, 81, 84, 83,
+  84, 86, 74, 80, 84, 86, 80, 79, 87, 78,
+  85, 94, 84, 75, 97, 87, 81, 84, 89, 80,
+  89, 89, 70, 91, 91, 91, 87, 88, 94, 84,
+  79, 82, 84, 83, 86, 90, 171, 80, 94, 90,
+  86, 94, 86, 81, 85, 96, 81, 115, 93, 77,
+  90, 87, 82, 75, 77, 83, 80, 86, 79, 94,
+  83, 96, 77, 81, 79, 95, 80, 102, 82, 82,
+  91, 94, 81, 86, 96, 80, 76, 84, 76, 80,
+  81, 82, 78, 81, 91, 83, 92, 67, 89, 72,
+  86, 83, 78, 89, 86, 86, 96, 80, 81, 94,
+  82, 87, 90, 85, 85, 88, 79, 85, 87, 80,
+  81, 88, 80, 79, 86, 91, 86, 81, 81, 82,
+  85, 85, 86, 78, 84, 83, 83, 81, 84, 92,
+  68, 78, 78, 82, 90, 80, 86, 78, 83, 87,
+  79, 76, 97, 85, 80, 83, 90, 81, 85, 82,
+  70, 83, 90, 91, 86, 85, 92, 84, 80, 79,
+  81, 82, 86, 90, 181, 85, 85, 88, 87, 83,
+  75, 78, 92, 96, 86, 118, 100, 76, 89, 87,
+  83, 76, 73, 80, 84, 84, 75, 90, 80, 93,
+  84, 80, 82, 93, 81, 94, 86, 86, 93, 100,
+  80, 91, 93, 79, 76, 90, 82, 80, 79, 87,
+  78, 86, 91, 81, 89, 66, 84, 72, 84, 77,
+  81, 88, 79, 90, 94, 78, 84, 94, 82, 82,
+  86, 83, 87, 87, 80, 94, 92, 82, 84, 85,
+  76, 79, 85, 89, 79, 77, 78, 81, 80, 77,
+  79, 84, 82, 87, 85, 82, 80, 83, 65, 77,
+  78, 77, 87, 82, 86, 83, 89, 93, 86, 79,
+  94, 87, 81, 85, 89, 81, 92, 80, 70, 89,
+  90, 96, 88, 96, 90, 76, 81, 78, 85, 79,
+  90, 88, 167, 89, 91, 95, 87, 86, 75, 81,
+  82, 100, 89, 112, 90, 68, 91, 89, 77, 79,
+  78, 80, 78, 84, 74, 84, 80, 92, 80, 89,
+  83, 94, 87, 101, 80, 76, 87, 91, 83, 86,
+  85, 79, 75, 87, 86, 77, 83, 81, 83, 87,
+  89, 87, 93, 64, 85, 75, 85, 81, 76, 92,
+  84, 85, 90, 82, 80, 90, 84, 84, 87, 81,
+  86, 85, 87, 79, 87, 76, 80, 86, 79, 84,
+  91, 90, 85, 88, 79, 83, 84, 81, 82, 78,
+  79, 84, 82, 79, 92, 99, 72, 80, 81, 86,
+  90, 79, 79, 102, 74, 94, 70, 71, 77, 94,
+  100, 92, 72, 78, 99, 72, 66, 79, 81, 80,
+  81, 83, 68, 92, 90, 85, 79, 91, 106, 94,
+  111, 88, 60, 81, 71, 83, 60, 91, 112, 82,
+  96, 80, 91, 69, 106, 70, 72, 89, 71, 94,
+  91, 83, 82, 87, 89, 74, 100, 96, 95, 60,
+  79, 81, 86, 85, 53, 90, 62, 68, 94, 90,
+  83, 113, 89, 77, 116, 66, 82, 98, 84, 78,
+  82, 77, 85, 77, 91, 90, 83, 78, 94, 71,
+  69, 85, 81, 99, 73, 98, 112, 82, 88, 78,
+  77, 112, 94, 91, 95, 92, 70, 80, 64, 79,
+  82, 66, 77, 41, 79, 92, 106, 91, 80, 75,
+  79, 91, 78, 86, 83, 89, 78, 73, 85, 61,
+  78, 78, 82, 94, 71, 80, 66, 99, 100, 96,
+  73, 72, 81, 85, 65, 72, 76, 66, 71, 82,
+  89, 95, 93, 82, 75, 76, 111, 93, 112, 81,
+  48, 81, 59, 82, 61, 96, 110, 86, 82, 72,
+  95, 63, 69, 62, 72, 97, 78, 78, 97, 75,
+  91, 96, 83, 64, 108, 88, 98, 55, 77, 78,
+  77, 96, 49, 81, 66, 66, 77, 74, 77, 114,
+  123, 75, 113, 71, 85, 101, 88, 94, 74, 73,
+  80, 71, 92, 99, 76, 86, 90, 73, 67, 69,
+  81, 94, 76, 84, 130, 79, 87, 76, 62, 118,
+  96, 84, 87, 93, 64, 76, 66, 76, 67, 68,
+  80, 38, 74, 87, 120, 83, 91, 79, 68, 83,
+  74, 83, 72, 87, 74, 72, 76, 58, 74, 74,
+  78, 88, 81, 79, 70, 94, 91, 94, 78, 79,
+  90, 89, 67, 78, 88, 73, 82, 79, 109, 84,
+  81, 96, 88, 84, 102, 90, 91, 78, 79, 73,
+  80, 81, 61, 88, 85, 87, 76, 83, 84, 74,
+  55, 74, 82, 86, 85, 72, 90, 85, 87, 86,
+  90, 73, 97, 76, 99, 66, 84, 81, 76, 85,
+  73, 92, 64, 75, 94, 87, 82, 108, 65, 66,
+  122, 68, 83, 103, 90, 80, 64, 84, 83, 79,
+  91, 99, 83, 84, 91, 68, 82, 79, 86, 81,
+  83, 94, 115, 86, 87, 82, 65, 108, 84, 86,
+  93, 96, 81, 79, 68, 75, 79, 78, 87, 47,
+  75, 91, 106, 97, 83, 82, 81, 84, 84, 81,
+  87, 84, 83, 81, 90, 59, 71, 82, 78, 77,
+  61, 91, 88, 74, 90, 79, 79, 64, 90, 108,
+  83, 72, 85, 81, 69, 82, 92, 88, 83, 82,
+  84, 94, 91, 91, 96, 107, 109, 74, 72, 75,
+  78, 75, 94, 79, 77, 72, 81, 85, 91, 89,
+  68, 68, 81, 90, 79, 87, 82, 102, 80, 80,
+  87, 86, 74, 87, 66, 103, 97, 78, 55, 89,
+  87, 63, 99, 89, 79, 98, 60, 82, 77, 90,
+  91, 66, 83, 73, 93, 75, 86, 90, 76, 81,
+  84, 88, 89, 90, 87, 84, 68, 78, 72, 96,
+  70, 88, 97, 92, 80, 65, 90, 72, 95, 78,
+  84, 75, 79, 94, 84, 76, 85, 70, 84, 77,
+  91, 80, 87, 79, 82, 124, 108, 94, 87, 80,
+  76, 85, 81, 86, 66, 91, 64, 78, 66, 72,
+  85, 75, 108, 74, 78, 62, 95, 74, 80, 76,
+  85, 81, 65, 90, 95, 72, 84, 84, 86, 100,
+  100, 97, 97, 84, 107, 68, 64, 68, 90, 74,
+  99, 76, 77, 85, 74, 68, 103, 94, 55, 82,
+  87, 71, 70, 82, 89, 96, 79, 72, 77, 94,
+  70, 87, 58, 110, 82, 66, 54, 87, 65, 42,
+  93, 86, 76, 71, 102, 71, 75, 88, 93, 60,
+  81, 83, 118, 67, 84, 92, 81, 83, 86, 86,
+  81, 80, 107, 80, 71, 89, 75, 94, 73, 92,
+  89, 88, 62, 55, 91, 68, 87, 76, 84, 63,
+  78, 99, 98, 78, 94, 64, 78, 79, 92, 64,
+  69, 73, 68, 115, 96, 95, 88, 78, 75, 90,
+  77, 87, 68, 84, 62, 77, 77, 79, 72, 79,
+  104, 88, 80, 65, 73, 61, 82, 75, 81, 71,
+  73, 85, 81, 81, 85, 90, 92, 92, 86, 85,
+  92, 66, 110, 78, 68, 74, 84, 85, 102, 76,
+  81, 73, 79, 91, 77, 80, 77, 93, 93, 81,
+  88, 79, 81, 90, 81, 72, 100, 90, 82, 74,
+  75, 95, 88, 85, 65, 83, 72, 59, 85, 82,
+  89, 93, 117, 74, 90, 75, 98, 78, 91, 91,
+  109, 70, 81, 85, 82, 89, 81, 81, 82, 82,
+  87, 82, 65, 82, 77, 88, 103, 85, 89, 84,
+  63, 85, 91, 89, 97, 80, 81, 74, 78, 88,
+  93, 70, 85, 60, 78, 82, 85, 82, 73, 81,
+  74, 107, 82, 88, 85, 80, 81, 81, 84, 79,
+  94, 66, 73, 88, 70, 101, 92, 78, 70, 83,
+  78, 83, 82, 82, 87, 82, 92, 92, 81, 88,
+  88, 87, 82, 69, 71, 95, 76, 84, 91, 105,
+  118, 84, 96, 90, 92, 88, 83, 89, 88, 71,
+  78, 86, 85, 96, 83, 70, 93, 99, 79, 85,
+  89, 81, 87, 100, 91, 86, 73, 96, 94, 74,
+  93, 89, 77, 84, 97, 88, 91, 84, 89, 64,
+  93, 87, 75, 99, 94, 72, 73, 95, 83, 86,
+  82, 76, 78, 91, 83, 84, 87, 94, 78, 83,
+  77, 77, 88, 84, 70, 87, 97, 93, 102, 76,
+  78, 90, 88, 82, 93, 85, 90, 97, 65, 81,
+  82, 96, 94, 74, 69, 77, 72, 90, 88, 96,
+  88, 78, 86, 84, 88, 78, 82, 85, 94, 79,
+  77, 88, 65, 82, 90, 72, 72, 81, 76, 84,
+  92, 86, 95, 80, 97, 99, 84, 98, 86, 88,
+  83, 67, 75, 88, 72, 83, 84, 89, 128, 84,
+  108, 94, 93, 82, 88, 91, 84, 72, 78, 101,
+  96, 101, 83, 59, 101, 87, 66, 89, 91, 81,
+  83, 102, 80, 79, 78, 95, 93, 76, 85, 79,
+  78, 84, 79, 83, 101, 89, 91, 69, 71, 84,
+  69, 92, 92, 68, 70, 101, 77, 87, 82, 68,
+  72, 86, 98, 85, 78, 86, 80, 82, 76, 77,
+  93, 89, 63, 91, 93, 94, 89, 69, 71, 65,
+  85, 78, 85, 91, 84, 101, 65, 84, 83, 99,
+  89, 76, 80, 86, 68, 95, 100, 79, 78, 82,
+  78, 87, 78, 77, 86, 91, 80, 96, 86, 87,
+  80, 83, 76, 79, 88, 85, 80, 80, 77, 82,
+  83, 85, 89, 83, 84, 89, 79, 92, 94, 75,
+  82, 96, 71, 81, 86, 80, 118, 83, 86, 84,
+  90, 98, 83, 90, 81, 81, 85, 82, 89, 84,
+  84, 81, 104, 104, 81, 83, 88, 85, 83, 86,
+  86, 65, 75, 91, 86, 79, 82, 95, 80, 77,
+  98, 72, 93, 83, 95, 75, 100, 87, 80, 89,
+  87, 77, 83, 95, 93, 76, 79, 77, 81, 95,
+  78, 90, 75, 87, 84, 85, 71, 82, 90, 87,
+  80, 86, 90, 88, 71, 79, 85, 71, 87, 79,
+  91, 83, 85, 91, 83, 78, 79, 87, 83, 82,
+  87, 87, 106, 88, 83, 95, 87, 83, 85, 86,
+  78, 78, 85, 84, 73, 82, 74, 77, 78, 87,
+  78, 98, 80, 83, 80, 74, 67, 77, 76, 90,
+  85, 85, 77, 90, 102, 89, 84, 77, 75, 86,
+  104, 78, 92, 79, 83, 84, 100, 84, 90, 94,
+  83, 82, 95, 75, 93, 65, 78, 92, 77, 86,
+  84, 83, 91, 76, 99, 79, 87, 78, 87, 80,
+  92, 91, 78, 80, 80, 86, 81, 85, 99, 74,
+  91, 84, 56, 80, 91, 97, 82, 101, 77, 67,
+  68, 90, 88, 68, 83, 83, 75, 93, 76, 85,
+  96, 75, 86, 93, 105, 81, 98, 82, 97, 118,
+  75, 77, 101, 68, 80, 81, 87, 92, 93, 76,
+  79, 81, 62, 81, 84, 89, 87, 81, 81, 88,
+  76, 97, 82, 80, 86, 92, 84, 85, 81, 93,
+  98, 84, 68, 85, 84, 72, 86, 69, 71, 94,
+  84, 80, 101, 77, 63, 86, 76, 83, 80, 72,
+  78, 74, 88, 84, 76, 79, 78, 76, 79, 74,
+  87, 85, 87, 94, 104, 82, 81, 104, 78, 74,
+  74, 75, 100, 68, 100, 95, 78, 90, 84, 91,
+  84, 87, 96, 85, 88, 86, 86, 76, 82, 78,
+  83, 82, 73, 87, 75, 82, 96, 69, 95, 81,
+  48, 82, 88, 101, 85, 97, 78, 66, 64, 92,
+  87, 75, 84, 76, 69, 96, 73, 77, 84, 88,
+  74, 82, 91, 73, 99, 74, 89, 123, 73, 73,
+  84, 76, 79, 98, 91, 92, 79, 79, 73, 83,
+  60, 79, 88, 85, 80, 84, 82, 92, 97, 90,
+  76, 85, 88, 91, 86, 77, 82, 87, 98, 83,
+  68, 70, 89, 84, 94, 85, 82, 102, 81, 83,
+  78, 75, 63, 86, 70, 87, 85, 94, 81, 83,
+  71, 78, 90, 80, 85, 88, 96, 84, 89, 90,
+  92, 89, 98, 87, 76, 91, 86, 83, 87, 81,
+  96, 71, 103, 92, 79, 90, 79, 88, 90, 75,
+  89, 77, 78, 86, 88, 88, 87, 93, 80, 82,
+  77, 92, 74, 76, 94, 80, 85, 73, 65, 90,
+  85, 86, 75, 94, 80, 75, 68, 75, 91, 68,
+  93, 89, 74, 87, 85, 88, 86, 69, 91, 80,
+  93, 75, 100, 76, 95, 94, 83, 81, 78, 69,
+  77, 82, 85, 92, 101, 81, 87, 83, 71, 83,
+  76, 79, 84, 91, 88, 80, 87, 94, 88, 77,
+  87, 91, 89, 90, 83, 91, 90, 90, 40, 86,
+  77, 85, 75, 69, 65, 72, 92, 82, 108, 65,
+  56, 94, 73, 90, 82, 75, 74, 80, 100, 90,
+  59, 74, 70, 79, 85, 82, 100, 79, 78, 94,
+  100, 72, 92, 81, 73, 83, 105, 70, 87, 72,
+  74, 92, 55, 81, 79, 92, 83, 80, 90, 97,
+  84, 99, 72, 84, 99, 78, 88, 65, 68, 126,
+  82, 86, 63, 123, 87, 75, 94, 65, 69, 58,
+  93, 99, 68, 64, 54, 80, 97, 68, 81, 86,
+  69, 111, 76, 81, 91, 85, 85, 96, 107, 81,
+  79, 62, 100, 128, 74, 60, 94, 74, 85, 82,
+  86, 87, 81, 66, 90, 90, 71, 70, 76, 77,
+  73, 68, 75, 94, 70, 75, 69, 84, 84, 100,
+  80, 78, 88, 84, 101, 95, 32, 84, 90, 70,
+  103, 32, 67, 62, 85, 78, 142, 73, 79, 102,
+  66, 77, 76, 54, 70, 70, 82, 99, 43, 69,
+  77, 70, 58, 73, 102, 92, 98, 104, 87, 70,
+  84, 110, 68, 81, 125, 82, 103, 74, 93, 97,
+  52, 61, 85, 105, 74, 87, 87, 117, 81, 118,
+  63, 94, 73, 70, 115, 56, 61, 136, 70, 100,
+  40, 170, 86, 72, 92, 45, 82, 62, 80, 96,
+  74, 54, 41, 100, 104, 78, 81, 74, 55, 95,
+  87, 85, 63, 117, 74, 75, 83, 75, 92, 56,
+  72, 155, 67, 51, 101, 86, 76, 98, 95, 86,
+  63, 65, 73, 95, 53, 70, 81, 80, 60, 65,
+  85, 106, 92, 78, 88, 89, 88, 101, 77, 68,
+  93, 73, 109, 93, 56, 60, 85, 93, 81, 69,
+  69, 96, 84, 84, 95, 61, 50, 82, 66, 97,
+  84, 99, 81, 84, 75, 73, 80, 84, 81, 86,
+  100, 91, 83, 81, 79, 105, 103, 74, 82, 88,
+  75, 89, 75, 75, 82, 70, 89, 87, 66, 95,
+  82, 84, 90, 78, 86, 73, 87, 90, 85, 69,
+  97, 80, 83, 87, 73, 116, 87, 52, 77, 93,
+  77, 81, 91, 89, 75, 65, 91, 99, 79, 70,
+  51, 77, 87, 73, 90, 92, 75, 92, 77, 82,
+  80, 55, 87, 95, 96, 81, 69, 69, 108, 95,
+  83, 66, 75, 72, 83, 93, 85, 87, 95, 76,
+  91, 82, 79, 77, 60, 70, 80, 94, 71, 77,
+  85, 74, 68, 74, 99, 90, 96, 91, 90, 81,
+  90, 104, 61, 81, 80, 91, 79, 77, 78, 79,
+  79, 90, 92, 81, 60, 100, 77, 87, 89, 94,
+  71, 85, 91, 94, 75, 94, 88, 83, 100, 87,
+  87, 75, 87, 80, 103, 72, 95, 85, 73, 87,
+  69, 76, 81, 75, 83, 85, 66, 87, 89, 97,
+  84, 78, 93, 85, 88, 79, 79, 79, 105, 81,
+  79, 71, 80, 96, 67, 88, 82, 92, 77, 94,
+  104, 80, 78, 66, 88, 92, 86, 72, 69, 85,
+  106, 64, 82, 94, 75, 113, 102, 76, 102, 86,
+  96, 108, 97, 83, 86, 65, 104, 91, 82, 69,
+  99, 71, 79, 85, 87, 90, 87, 74, 92, 84,
+  82, 71, 67, 78, 76, 82, 80, 91, 69, 85,
+  75, 72, 93, 90, 85, 81, 79, 89, 91, 87,
+  52, 83, 89, 84, 86, 54, 80, 72, 79, 84,
+  115, 87, 62, 88, 72, 75, 80, 74, 68, 80,
+  75, 84, 60, 92, 89, 71, 84, 80, 84, 92,
+  85, 92, 103, 71, 94, 104, 69, 78, 110, 70,
+  104, 84, 85, 82, 64, 59, 97, 99, 79, 88,
+  93, 89, 83, 87, 82, 85, 95, 75, 86, 66,
+  77, 100, 54, 91, 65, 119, 75, 92, 109, 68,
+  77, 74, 87, 86, 88, 66, 66, 87, 105, 71,
+  83, 85, 65, 107, 98, 89, 79, 105, 83, 93,
+  97, 83, 91, 61, 88, 108, 75, 66, 97, 82,
+  82, 84, 87, 88, 71, 78, 75, 85, 69, 70,
+  60, 83, 62, 79, 84, 84, 92, 83, 85, 80,
+  101, 89, 78, 72, 84, 84, 93, 92, 67, 73,
+  89, 86, 79, 88, 86, 88, 79, 88, 82, 77,
+  64, 86, 79, 89, 86, 110, 72, 83, 79, 79,
+  79, 99, 92, 87, 106, 87, 78, 82, 92, 83,
+  99, 76, 91, 88, 81, 86, 95, 76, 83, 83,
+  89, 89, 70, 81, 88, 91, 88, 74, 96, 86,
+  87, 79, 79, 80, 102, 89, 87, 84, 81, 91,
+  68, 71, 85, 87, 66, 91, 94, 96, 73, 77,
+  82, 96, 91, 72, 67, 72, 92, 73, 90, 99,
+  76, 91, 101, 78, 86, 65, 96, 97, 87, 86,
+  86, 67, 92, 80, 84, 80, 88, 68, 76, 95,
+  86, 90, 90, 84, 91, 81, 80, 87, 68, 71,
+  80, 95, 80, 93, 82, 90, 87, 74, 98, 89,
+  82, 85, 79, 83, 86, 91, 90, 84, 87, 82,
+  82, 89, 82, 73, 86, 100, 79, 89, 95, 91,
+  84, 80, 71, 93, 63, 84, 89, 79, 91, 85,
+  92, 78, 93, 74, 94, 92, 80, 82, 78, 92,
+  94, 84, 85, 81, 84, 91, 80, 87, 95, 79,
+  77, 91, 89, 82, 89, 91, 85, 96, 95, 63,
+  87, 85, 77, 73, 68, 87, 83, 83, 76, 82,
+  78, 88, 82, 82, 81, 95, 80, 79, 84, 87,
+  92, 80, 83, 81, 88, 73, 85, 82, 70, 73,
+  80, 101, 93, 91, 88, 68, 74, 81, 87, 89,
+  81, 82, 77, 86, 75, 56, 87, 81, 81, 72,
+  93, 87, 96, 85, 82, 101, 93, 86, 75, 85,
+  90, 78, 88, 91, 83, 71, 78, 91, 58, 74,
+  93, 100, 69, 90, 92, 86, 80, 78, 83, 87,
+  84, 68, 75, 105, 78, 87, 96, 86, 84, 79,
+  68, 89, 59, 87, 96, 73, 93, 88, 81, 77,
+  90, 78, 84, 92, 77, 83, 77, 92, 95, 81,
+  93, 85, 86, 95, 83, 87, 89, 81, 82, 92,
+  87, 77, 84, 89, 88, 92, 95, 64, 88, 88,
+  74, 71, 64, 86, 89, 87, 79, 84, 73, 90,
+  76, 80, 84, 90, 81, 76, 80, 84, 97, 75,
+  86, 84, 89, 74, 86, 80, 63, 73, 76, 101,
+  90, 85, 89, 65, 63, 83, 85, 84, 82, 82,
+  70, 87, 82, 60, 85, 86, 79, 75, 88, 81,
+  92, 88, 82, 104, 92, 84, 69, 85, 84, 80,
+  88, 92, 83, 69, 74, 91, 51, 75, 94, 96,
+  69, 93, 85, 86, 78, 77, 86, 86, 83, 77,
+  82, 95, 82, 91, 92, 82, 83, 87, 75, 89,
+  64, 84, 94, 77, 91, 87, 82, 79, 94, 75,
+  85, 90, 81, 81, 78, 87, 96, 80, 92, 82,
+  91, 100, 84, 82, 86, 79, 79, 91, 85, 80,
+  88, 88, 87, 89, 93, 65, 86, 94, 73, 75,
+  69, 89, 89, 84, 77, 80, 77, 84, 81, 84,
+  89, 84, 88, 76, 83, 87, 96, 81, 87, 90,
+  93, 76, 84, 82, 71, 84, 76, 100, 90, 86,
+  90, 75, 70, 89, 84, 87, 79, 78, 75, 86,
+  91, 66, 90, 84, 80, 75, 90, 84, 90, 87,
+  85, 98, 91, 84, 73, 92, 82, 76, 85, 86,
+  84, 73, 71, 90, 58, 79, 87, 95, 72, 91,
+  95, 76, 92, 82, 81, 81, 70, 85, 103, 91,
+  81, 85, 93, 83, 78, 90, 88, 83, 73, 79,
+  77, 76, 77, 81, 94, 77, 90, 72, 96, 80,
+  78, 84, 75, 85, 82, 76, 96, 65, 91, 78,
+  62, 75, 83, 79, 67, 94, 98, 86, 86, 93,
+  88, 93, 90, 72, 84, 83, 76, 79, 72, 94,
+  88, 75, 62, 85, 72, 80, 87, 80, 93, 81,
+  79, 78, 85, 87, 87, 71, 81, 80, 85, 75,
+  95, 77, 92, 78, 79, 100, 96, 90, 86, 73,
+  73, 88, 67, 83, 86, 77, 65, 85, 78, 64,
+  86, 86, 85, 74, 97, 108, 83, 79, 59, 93,
+  79, 87, 83, 88, 85, 83, 84, 81, 86, 70,
+  80, 95, 65, 73, 86, 98, 68, 84, 100, 76,
+  87, 85, 80, 81, 68, 86, 97, 89, 82, 83,
+  93, 85, 76, 94, 85, 75, 76, 84, 80, 71,
+  80, 84, 84, 73, 88, 73, 81, 82, 75, 86,
+  84, 82, 81, 80, 95, 63, 87, 73, 57, 75,
+  78, 76, 70, 96, 99, 84, 85, 92, 85, 89,
+  88, 71, 86, 80, 76, 73, 68, 97, 89, 80,
+  65, 88, 67, 80, 83, 81, 99, 78, 75, 77,
+  85, 82, 93, 67, 81, 87, 83, 75, 94, 73,
+  96, 86, 73, 95, 92, 84, 81, 70, 68, 85,
+  62, 81, 84, 74, 64, 82, 85, 68, 90, 87,
+  88, 76, 98, 108, 80, 84, 56, 91, 75, 83,
+  85, 88, 80, 85, 86, 80, 85, 67, 72, 88,
+  64, 77, 82, 96, 67, 91, 91, 81, 89, 84,
+  80, 80, 72, 89, 97, 87, 83, 87, 89, 91,
+  76, 93, 86, 79, 83, 81, 86, 79, 82, 84,
+  83, 79, 92, 73, 85, 83, 82, 82, 78, 79,
+  87, 83, 101, 68, 88, 83, 66, 72, 79, 80,
+  68, 90, 92, 80, 88, 89, 90, 94, 87, 74,
+  87, 85, 78, 78, 74, 95, 88, 79, 62, 83,
+  73, 78, 86, 84, 99, 85, 83, 76, 81, 83,
+  92, 77, 84, 89, 85, 75, 94, 80, 95, 96,
+  76, 92, 91, 85, 86, 76, 72, 87, 66, 83,
+  82, 77, 69, 83, 88, 70, 89, 86, 83, 76,
+  100, 107, 84, 82, 64, 85, 79, 87, 84, 94,
+  86, 84, 82, 78, 86, 72, 72, 91, 72, 74,
+  82, 93, 73, 87, 77, 83, 99, 81, 88, 90,
+  77, 93, 110, 77, 95, 93, 86, 84, 74, 85,
+  100, 81, 94, 86, 80, 72, 66, 78, 91, 84,
+  87, 74, 84, 81, 88, 83, 73, 76, 71, 79,
+  93, 72, 94, 70, 78, 63, 93, 82, 65, 90,
+  85, 88, 106, 83, 97, 94, 78, 100, 95, 87,
+  87, 82, 98, 85, 87, 84, 69, 87, 80, 71,
+  98, 95, 101, 85, 71, 91, 76, 80, 94, 75,
+  79, 88, 96, 68, 94, 88, 111, 100, 86, 97,
+  94, 92, 86, 82, 85, 92, 64, 90, 87, 88,
+  87, 86, 87, 103, 86, 68, 82, 83, 130, 112,
+  74, 82, 60, 58, 74, 80, 116, 98, 95, 78,
+  79, 68, 80, 81, 83, 87, 82, 71, 78, 99,
+  94, 69, 76, 83, 87, 85, 88, 83, 77, 93,
+  103, 80, 98, 92, 83, 89, 69, 80, 98, 76,
+  102, 96, 83, 70, 74, 81, 87, 82, 79, 73,
+  60, 77, 87, 81, 75, 79, 75, 82, 93, 76,
+  90, 65, 82, 68, 87, 80, 71, 87, 78, 97,
+  106, 79, 93, 94, 75, 104, 96, 91, 92, 76,
+  97, 90, 82, 90, 68, 92, 80, 73, 94, 102,
+  105, 80, 72, 94, 74, 70, 109, 78, 76, 93,
+  96, 68, 89, 82, 105, 98, 92, 92, 97, 91,
+  82, 80, 84, 90, 61, 96, 89, 87, 89, 81,
+  90, 119, 88, 68, 90, 87, 138, 115, 69, 89,
+  61, 55, 71, 82, 130, 93, 92, 76, 72, 68,
+  84, 78, 79, 76, 79, 80, 75, 99, 104, 71,
+  80, 83, 82, 87, 90, 72, 81, 100, 112, 79,
+  100, 89, 85, 92, 74, 86, 102, 77, 102, 86,
+  91, 73, 79, 81, 87, 88, 86, 76, 75, 75,
+  89, 78, 77, 74, 85, 85, 94, 73, 83, 72,
+  83, 65, 83, 85, 69, 86, 84, 98, 103, 84,
+  97, 94, 77, 101, 95, 88, 86, 83, 92, 85,
+  86, 84, 67, 88, 81, 70, 103, 93, 99, 84,
+  83, 88, 73, 77, 98, 78, 79, 95, 101, 71,
+  92, 89, 108, 93, 86, 90, 98, 92, 85, 81,
+  91, 90, 63, 89, 84, 92, 89, 86, 88, 108,
+  90, 72, 77, 84, 132, 105, 76, 85, 66, 54,
+  74, 82, 115, 90, 91, 80, 73, 71, 84, 78,
+  80, 84, 90, 70, 77, 96, 93, 78, 85, 75,
+  78, 86, 139, 84, 71, 79, 73, 81, 78, 91,
+  74, 106, 77, 77, 76, 77, 85, 80, 82, 87,
+  100, 73, 88, 75, 88, 86, 94, 94, 77, 91,
+  77, 95, 88, 85, 81, 85, 89, 77, 83, 82,
+  86, 89, 76, 83, 78, 85, 79, 84, 80, 77,
+  78, 77, 87, 95, 70, 75, 91, 74, 83, 79,
+  94, 69, 91, 76, 88, 78, 86, 99, 67, 85,
+  93, 91, 76, 74, 80, 88, 72, 76, 80, 89,
+  80, 83, 57, 79, 86, 91, 74, 95, 76, 76,
+  88, 81, 93, 78, 90, 92, 79, 81, 82, 78,
+  82, 82, 83, 77, 81, 103, 80, 74, 85, 78,
+  75, 76, 96, 86, 91, 91, 84, 82, 89, 92,
+  79, 72, 97, 82, 85, 88, 83, 79, 66, 86,
+  164, 75, 66, 81, 68, 77, 82, 107, 84, 103,
+  78, 79, 77, 76, 87, 82, 84, 81, 80, 75,
+  87, 74, 90, 84, 89, 91, 84, 99, 81, 98,
+  95, 93, 86, 76, 99, 82, 84, 79, 82, 107,
+  86, 78, 86, 73, 72, 85, 79, 86, 78, 83,
+  77, 93, 66, 80, 103, 70, 88, 71, 101, 72,
+  87, 76, 89, 77, 88, 94, 77, 84, 91, 87,
+  80, 65, 85, 83, 83, 78, 82, 93, 78, 79,
+  54, 82, 86, 91, 84, 104, 73, 85, 94, 80,
+  89, 83, 94, 100, 79, 78, 88, 90, 80, 83,
+  84, 80, 75, 108, 85, 82, 82, 78, 73, 81,
+  105, 76, 75, 87, 78, 85, 95, 99, 74, 71,
+  106, 80, 83, 89, 83, 86, 77, 85, 116, 91,
+  74, 82, 78, 78, 83, 89, 83, 88, 74, 80,
+  80, 81, 87, 78, 86, 82, 78, 76, 81, 76,
+  88, 84, 92, 82, 78, 91, 77, 78, 95, 95,
+  82, 86, 89, 80, 86, 84, 80, 85, 83, 85,
+  79, 91, 80, 85, 82, 78, 82, 77, 85, 86,
+  77, 71, 88, 80, 85, 81, 88, 74, 81, 80,
+  73, 78, 81, 89, 94, 89, 99, 90, 79, 78,
+  82, 89, 79, 76, 80, 85, 86, 79, 63, 76,
+  78, 84, 76, 95, 79, 89, 86, 81, 89, 80,
+  87, 91, 81, 83, 80, 95, 79, 84, 82, 76,
+  80, 93, 79, 77, 77, 74, 73, 88, 92, 83,
+  86, 89, 83, 81, 95, 88, 83, 77, 90, 82,
+  85, 86, 79, 79, 74, 80, 172, 87, 63, 81,
+  80, 74, 75, 93, 85, 100, 78, 76, 87, 70,
+  82, 75, 81, 87, 83, 78, 86, 74, 73, 76,
+  98, 90, 75, 88, 78, 107, 81, 81, 73, 82,
+  98, 82, 85, 81, 87, 99, 86, 84, 86, 85,
+  72, 79, 84, 84, 81, 82, 77, 96, 64, 79,
+  103, 69, 74, 73, 88, 67, 85, 81, 81, 76,
+  91, 76, 69, 72, 83, 87, 75, 71, 77, 92,
+  75, 75, 91, 83, 76, 82, 56, 80, 85, 95,
+  76, 89, 71, 79, 98, 74, 94, 81, 84, 100,
+  82, 88, 90, 86, 80, 78, 82, 80, 85, 103,
+  73, 79, 80, 83, 70, 82, 112, 65, 79, 87,
+  80, 83, 90, 80, 72, 65, 102, 80, 84, 75,
+  71, 82, 72, 76, 199, 74, 55, 83, 77, 73,
+  81, 106, 101, 108, 81, 78, 89, 71, 84, 83,
+  86, 88, 78, 81, 85, 70, 72, 77, 95, 89,
+  86, 93, 77, 109, 81, 90, 80, 80, 118, 89,
+  87, 85, 81, 122, 100, 74, 91, 72, 71, 74,
+  79, 90, 80, 87, 69, 97, 69, 83, 112, 63,
+  75, 66, 91, 71, 69, 86, 85, 71, 93, 75,
+  61, 67, 83, 84, 80, 63, 80, 92, 77, 84,
+  93, 86, 74, 80, 55, 86, 83, 93, 83, 93,
+  68, 80, 103, 75, 85, 85, 82, 115, 82, 84,
+  89, 80, 82, 80, 80, 78, 78, 105, 75, 86,
+  80, 81, 68, 81, 117, 60, 65, 81, 81, 83,
+  90, 88, 65, 72, 112, 78, 83, 75, 81, 84,
+  81, 83, 135, 87, 67, 80, 81, 74, 83, 87,
+  86, 90, 76, 77, 84, 74, 80, 80, 82, 84,
+  85, 81, 78, 75, 77, 73, 93, 82, 77, 85,
+  76, 81, 86, 97, 72, 86, 100, 81, 88, 81,
+  74, 88, 88, 79, 86, 84, 74, 86, 82, 85,
+  84, 87, 77, 89, 80, 78, 94, 78, 80, 77,
+  87, 73, 80, 83, 76, 74, 83, 83, 79, 80,
+  92, 86, 78, 76, 82, 94, 76, 79, 89, 80,
+  79, 82, 63, 85, 80, 96, 73, 87, 75, 82,
+  96, 82, 80, 83, 84, 96, 77, 85, 86, 87,
+  81, 82, 82, 82, 85, 91, 72, 78, 76, 81,
+  70, 86, 103, 74, 85, 85, 81, 82, 88, 79,
+  79, 72, 88, 85, 83, 74, 76, 82, 76, 83,
+  129, 84, 72, 82, 75, 75, 84, 90, 82, 89,
+  76, 76, 91, 82, 83, 73, 83, 76, 85, 82,
+  81, 80, 90, 79, 84, 77, 84, 83, 82, 105,
+  83, 80, 93, 85, 92, 75, 81, 82, 88, 78,
+  84, 93, 83, 85, 83, 81, 80, 91, 82, 82,
+  87, 89, 74, 67, 97, 80, 77, 87, 83, 76,
+  86, 78, 86, 85, 87, 85, 93, 81, 85, 85,
+  77, 81, 80, 92, 85, 74, 81, 93, 79, 78,
+  63, 85, 86, 93, 76, 88, 84, 83, 101, 82,
+  97, 85, 83, 87, 77, 82, 76, 93, 78, 78,
+  81, 86, 81, 93, 79, 74, 85, 76, 75, 84,
+  94, 89, 73, 83, 79, 85, 84, 83, 81, 72,
+  92, 80, 86, 90, 72, 85, 80, 86, 139, 75,
+  70, 80, 73, 73, 86, 99, 90, 94, 81, 81,
+  95, 81, 86, 85, 85, 73, 84, 80, 80, 80,
+  88, 77, 82, 90, 82, 91, 80, 102, 73, 84,
+  108, 89, 103, 79, 81, 80, 88, 90, 93, 82,
+  84, 74, 80, 78, 74, 91, 80, 84, 82, 89,
+  76, 72, 97, 80, 77, 80, 89, 78, 84, 75,
+  91, 80, 88, 93, 74, 76, 86, 81, 78, 72,
+  82, 84, 91, 74, 82, 99, 75, 79, 57, 89,
+  85, 87, 84, 84, 82, 86, 103, 84, 92, 86,
+  83, 94, 79, 76, 84, 87, 77, 79, 78, 82,
+  75, 94, 77, 80, 83, 74, 74, 83, 108, 79,
+  70, 80, 82, 86, 93, 85, 77, 74, 95, 84,
+  84, 91, 78, 81, 92, 88, 101, 89, 77, 77,
+  76, 75, 88, 86, 84, 96, 75, 80, 89, 83,
+  86, 79, 81, 74, 86, 86, 78, 80, 89, 76,
+  84, 87, 83, 87, 81, 81, 76, 94, 96, 84,
+  96, 76, 82, 83, 80, 72, 85, 88, 85, 87,
+  80, 86, 81, 92, 84, 83, 90, 84, 89, 66,
+  87, 88, 84, 80, 80, 78, 75, 78, 81, 84,
+  83, 85, 79, 86, 90, 86, 78, 85, 85, 88,
+  75, 73, 78, 92, 82, 82, 68, 93, 81, 91,
+  77, 86, 86, 79, 96, 86, 79, 85, 83, 85,
+  83, 81, 72, 89, 77, 80, 84, 87, 79, 86,
+  81, 74, 87, 76, 78, 86, 84, 88, 91, 83,
+  83, 86, 91, 82, 86, 78, 82, 86, 89, 90,
+  97, 89, 68, 94, 98, 81, 70, 98, 74, 89,
+  102, 91, 100, 77, 76, 82, 84, 87, 99, 75,
+  83, 83, 83, 78, 72, 87, 88, 105, 97, 77,
+  91, 102, 68, 94, 73, 96, 94, 100, 88, 80,
+  90, 82, 74, 80, 78, 65, 72, 84, 81, 71,
+  72, 85, 71, 83, 92, 96, 74, 80, 77, 105,
+  79, 84, 80, 97, 78, 72, 70, 82, 70, 91,
+  95, 76, 76, 96, 71, 85, 89, 100, 94, 90,
+  84, 89, 62, 82, 85, 75, 87, 89, 79, 75,
+  81, 89, 79, 88, 98, 80, 96, 81, 74, 70,
+  73, 77, 86, 93, 86, 103, 71, 96, 68, 78,
+  78, 67, 81, 90, 87, 88, 79, 76, 82, 89,
+  98, 74, 82, 86, 81, 96, 98, 86, 93, 88,
+  81, 91, 92, 85, 74, 95, 70, 87, 107, 90,
+  106, 84, 82, 79, 91, 91, 107, 79, 73, 80,
+  90, 77, 74, 84, 82, 101, 82, 74, 98, 108,
+  69, 93, 68, 89, 86, 96, 83, 78, 90, 79,
+  84, 81, 77, 70, 70, 80, 77, 72, 73, 94,
+  72, 85, 87, 78, 73, 81, 66, 120, 80, 81,
+  81, 101, 68, 64, 72, 88, 66, 84, 75, 69,
+  68, 100, 72, 85, 93, 91, 87, 91, 81, 89,
+  66, 84, 87, 79, 88, 89, 67, 77, 77, 90,
+  76, 86, 93, 82, 95, 85, 68, 71, 77, 84,
+  84, 93, 79, 90, 75, 96, 72, 80, 84, 73,
+  80, 91, 87, 78, 76, 73, 83, 84, 90, 75,
+  80, 88, 80, 98, 97, 85, 86, 80, 86, 91,
+  91, 90, 72, 93, 72, 92, 97, 90, 95, 92,
+  71, 83, 81, 82, 94, 79, 69, 88, 90, 81,
+  73, 87, 85, 101, 94, 78, 96, 113, 75, 91,
+  73, 101, 107, 99, 85, 81, 90, 81, 85, 81,
+  79, 69, 76, 87, 82, 69, 71, 100, 77, 79,
+  87, 71, 83, 80, 73, 98, 80, 87, 90, 91,
+  78, 76, 64, 78, 79, 94, 68, 73, 79, 89,
+  75, 90, 83, 89, 90, 89, 84, 88, 72, 87,
+  88, 77, 85, 88, 81, 77, 80, 84, 75, 84,
+  92, 80, 94, 82, 75, 80, 78, 77, 87, 90,
+  81, 100, 71, 92, 68, 78, 82, 70, 80, 93,
+  90, 85, 81, 78, 86, 90, 88, 76, 82, 82,
+  83, 94, 97, 86, 83, 88, 89, 86, 81, 84,
+  72, 87, 86, 84, 81, 99, 87, 85, 71, 74,
+  79, 70, 70, 73, 79, 88, 86, 81, 83, 83,
+  84, 87, 101, 85, 82, 90, 79, 78, 79, 88,
+  98, 83, 84, 75, 69, 80, 86, 82, 70, 79,
+  75, 83, 89, 79, 80, 88, 86, 78, 104, 91,
+  91, 82, 111, 84, 69, 78, 61, 79, 72, 77,
+  62, 76, 92, 80, 86, 77, 78, 75, 72, 85,
+  76, 104, 98, 85, 84, 92, 70, 75, 82, 94,
+  85, 82, 81, 82, 83, 81, 108, 78, 91, 76,
+  90, 65, 89, 67, 85, 70, 69, 92, 80, 136,
+  76, 89, 80, 81, 81, 53, 68, 85, 106, 102,
+  64, 87, 78, 87, 82, 88, 90, 65, 91, 99,
+  81, 71, 77, 86, 96, 81, 78, 88, 74, 85,
+  85, 83, 79, 90, 92, 93, 75, 72, 77, 70,
+  67, 76, 81, 90, 86, 79, 79, 85, 85, 85,
+  86, 87, 90, 96, 81, 84, 74, 75, 94, 81,
+  84, 76, 73, 89, 85, 85, 72, 71, 78, 86,
+  87, 79, 80, 109, 87, 76, 98, 106, 90, 81,
+  106, 89, 68, 75, 59, 78, 81, 74, 63, 78,
+  89, 77, 96, 75, 71, 77, 73, 85, 80, 87,
+  103, 86, 80, 91, 75, 75, 82, 103, 81, 86,
+  86, 78, 86, 79, 106, 78, 83, 79, 86, 69,
+  89, 69, 90, 73, 65, 93, 87, 138, 71, 90,
+  82, 78, 85, 60, 68, 80, 106, 91, 73, 84,
+  82, 95, 79, 88, 90, 60, 90, 98, 79, 69,
+  78, 85, 81, 86, 83, 86, 73, 80, 84, 88,
+  81, 88, 89, 87, 73, 72, 77, 71, 70, 75,
+  84, 81, 88, 88, 78, 88, 84, 88, 91, 85,
+  88, 93, 75, 84, 70, 84, 106, 84, 76, 75,
+  70, 84, 81, 80, 73, 67, 83, 101, 89, 79,
+  81, 84, 89, 80, 96, 90, 97, 81, 104, 83,
+  72, 83, 68, 80, 70, 74, 69, 77, 83, 80,
+  76, 76, 80, 75, 77, 88, 76, 81, 97, 85,
+  87, 87, 74, 87, 85, 99, 79, 79, 80, 82,
+  81, 79, 100, 80, 88, 80, 88, 72, 89, 71,
+  81, 72, 75, 90, 81, 127, 73, 83, 87, 77,
+  72, 60, 71, 87, 83, 91, 85, 89, 83, 84,
+  80, 83, 93, 71, 90, 90, 80, 79, 76, 86,
+  94, 82, 79, 90, 75, 76, 86, 85, 73, 80,
+  91, 92, 83, 81, 83, 85, 55, 75, 96, 88,
+  80, 89, 86, 91, 83, 82, 89, 84, 95, 76,
+  97, 79, 91, 88, 87, 80, 82, 83, 73, 78,
+  97, 87, 83, 88, 88, 87, 88, 92, 75, 94,
+  88, 82, 107, 70, 91, 72, 100, 87, 78, 101,
+  84, 75, 86, 76, 90, 84, 90, 81, 77, 76,
+  91, 77, 75, 85, 67, 88, 78, 79, 86, 79,
+  89, 82, 82, 82, 81, 72, 77, 90, 84, 89,
+  106, 85, 80, 88, 75, 74, 96, 79, 75, 85,
+  79, 92, 81, 106, 90, 87, 84, 76, 76, 79,
+  76, 85, 85, 87, 80, 92, 92, 91, 80, 80,
+  97, 67, 93, 86, 78, 86, 73, 87, 85, 81,
+  80, 78, 74, 77, 89, 88, 77, 75, 99, 88,
+  84, 85, 86, 86, 53, 76, 104, 82, 84, 90,
+  86, 91, 82, 81, 89, 87, 98, 73, 98, 76,
+  87, 78, 84, 87, 93, 80, 75, 80, 100, 91,
+  83, 94, 87, 86, 84, 91, 74, 90, 91, 82,
+  104, 81, 95, 70, 97, 90, 79, 102, 86, 77,
+  79, 77, 91, 88, 83, 81, 83, 72, 90, 80,
+  71, 79, 71, 81, 73, 81, 82, 77, 92, 87,
+  81, 86, 79, 73, 72, 89, 85, 86, 96, 86,
+  79, 86, 75, 77, 100, 81, 75, 81, 80, 94,
+  76, 93, 84, 87, 88, 73, 75, 82, 79, 76,
+  83, 86, 84, 90, 95, 96, 77, 81, 101, 67,
+  91, 83, 80, 86, 84, 84, 82, 84, 80, 72,
+  77, 71, 87, 87, 77, 81, 95, 82, 81, 82,
+  77, 84, 63, 77, 98, 82, 95, 89, 81, 89,
+  82, 82, 88, 89, 89, 71, 96, 79, 86, 85,
+  89, 80, 91, 81, 75, 77, 89, 90, 86, 84,
+  92, 90, 87, 90, 79, 81, 88, 87, 100, 84,
+  88, 78, 98, 86, 78, 94, 85, 77, 87, 82,
+  91, 82, 80, 86, 87, 80, 88, 76, 75, 82,
+  71, 85, 74, 77, 89, 78, 91, 93, 85, 86,
+  80, 73, 80, 84, 87, 81, 106, 86, 79, 92,
+  77, 77, 100, 75, 82, 74, 84, 89, 77, 100,
+  90, 83, 83, 74, 76, 78, 74, 80, 81, 85,
+  98, 89, 88, 83, 78, 82, 96, 72, 92, 83,
+  76, 87, 93, 83, 77, 95, 81, 91, 86, 78,
+  73, 105, 94, 85, 82, 81, 80, 80, 91, 90,
+  74, 76, 80, 78, 84, 72, 85, 80, 88, 84,
+  93, 88, 78, 90, 96, 79, 72, 85, 72, 70,
+  82, 78, 82, 94, 73, 88, 78, 80, 68, 85,
+  78, 97, 77, 80, 80, 82, 95, 79, 77, 89,
+  78, 80, 84, 89, 79, 89, 84, 81, 67, 73,
+  89, 82, 79, 94, 82, 79, 80, 106, 83, 81,
+  90, 86, 69, 82, 87, 85, 83, 100, 91, 99,
+  84, 85, 79, 85, 110, 83, 71, 81, 92, 84,
+  74, 78, 75, 74, 73, 77, 84, 84, 86, 86,
+  89, 102, 85, 88, 82, 80, 78, 78, 91, 81,
+  71, 81, 96, 80, 86, 74, 87, 99, 82, 91,
+  85, 85, 78, 88, 78, 90, 83, 82, 74, 115,
+  89, 80, 82, 81, 71, 80, 95, 83, 76, 78,
+  74, 76, 86, 75, 85, 74, 90, 86, 89, 83,
+  76, 87, 94, 81, 79, 84, 76, 72, 79, 83,
+  78, 94, 73, 86, 74, 70, 70, 87, 75, 99,
+  78, 79, 73, 79, 101, 79, 77, 86, 86, 86,
+  78, 88, 80, 86, 84, 75, 67, 83, 95, 77,
+  79, 95, 84, 77, 81, 107, 84, 84, 92, 87,
+  67, 78, 86, 90, 85, 100, 86, 105, 85, 89,
+  77, 90, 115, 79, 73, 71, 92, 78, 76, 79,
+  79, 81, 77, 76, 82, 87, 91, 88, 83, 100,
+  89, 88, 84, 87, 75, 81, 81, 83, 76, 76,
+  88, 81, 86, 74, 98, 95, 84, 96, 91, 85,
+  80, 92, 82, 82, 83, 81, 75, 100, 94, 83,
+  81, 78, 80, 79, 92, 91, 76, 79, 74, 81,
+  93, 75, 89, 81, 90, 87, 91, 80, 81, 93,
+  96, 87, 81, 76, 77, 75, 77, 79, 81, 94,
+  81, 92, 73, 80, 72, 87, 81, 93, 73, 76,
+  84, 83, 97, 74, 80, 84, 79, 84, 86, 87,
+  81, 89, 90, 79, 66, 77, 88, 81, 88, 89,
+  84, 79, 80, 99, 80, 90, 95, 86, 64, 87,
+  87, 93, 82, 94, 85, 93, 85, 90, 81, 83,
+  106, 88, 74, 81, 90, 85, 79, 79, 77, 85,
+  74, 78, 81, 84, 85, 86, 90, 101, 89, 89,
+  87, 93, 78, 77, 79, 84, 72, 82, 80, 85,
+  83, 77, 88, 92, 81, 87, 88, 80, 80, 83,
+  82, 86, 85, 81, 78, 119, 95, 85, 79, 80,
+  73, 80, 93, 92, 69, 83, 71, 87, 77, 75,
+  87, 76, 85, 84, 87, 84, 75, 85, 91, 77,
+  81, 88, 76, 78, 84, 69, 85, 100, 77, 83,
+  80, 81, 69, 82, 77, 105, 73, 78, 76, 85,
+  101, 85, 78, 97, 92, 78, 83, 88, 80, 89,
+  80, 85, 70, 84, 82, 81, 81, 101, 79, 85,
+  76, 114, 75, 86, 81, 80, 75, 76, 87, 91,
+  91, 85, 89, 96, 81, 79, 71, 90, 109, 77,
+  79, 81, 83, 87, 77, 81, 77, 74, 86, 75,
+  81, 94, 87, 84, 88, 108, 76, 84, 83, 82,
+  86, 79, 85, 77, 79, 80, 93, 82, 88, 81,
+  98, 78, 94, 88, 85, 79, 77, 73, 77, 82,
+  84, 85, 84, 140, 98, 86, 76, 82, 64, 77,
+  90, 77, 70, 86, 70, 99, 81, 82, 85, 69,
+  85, 86, 81, 83, 72, 80, 86, 83, 83, 93,
+  83, 82, 84, 69, 95, 114, 65, 76, 80, 70,
+  61, 84, 76, 126, 73, 83, 68, 80, 117, 85,
+  80, 99, 113, 87, 78, 90, 83, 91, 82, 85,
+  65, 98, 78, 80, 73, 125, 79, 79, 75, 127,
+  78, 84, 77, 83, 71, 71, 80, 92, 97, 79,
+  81, 109, 84, 80, 70, 86, 128, 66, 81, 75,
+  85, 82, 77, 83, 80, 86, 101, 76, 82, 102,
+  88, 86, 86, 109, 83, 78, 85, 85, 85, 88,
+  76, 77, 87, 78, 83, 90, 86, 84, 111, 74,
+  98, 101, 92, 84, 81, 82, 85, 75, 81, 84,
+  78, 111, 97, 83, 79, 81, 75, 78, 90, 95,
+  72, 83, 78, 86, 90, 79, 86, 77, 84, 88,
+  83, 86, 80, 87, 95, 85, 77, 85, 77, 78,
+  81, 69, 87, 98, 71, 87, 78, 82, 67, 90,
+  80, 100, 70, 78, 83, 83, 105, 81, 79, 94,
+  84, 80, 83, 84, 81, 88, 85, 86, 68, 83,
+  84, 82, 80, 98, 79, 84, 81, 105, 76, 89,
+  84, 82, 70, 81, 87, 97, 89, 82, 87, 93,
+  83, 85, 78, 86, 101, 83, 79, 85, 81, 90,
+  87, 83, 80, 87, 85, 78, 81, 90, 84, 85,
+  87, 102, 82, 84, 86, 94, 87, 81, 80, 79,
+  78, 80, 80, 83, 83, 79, 103, 76, 91, 84,
+  85, 81, 78, 84, 76, 91, 87, 84, 77, 103,
+  94, 82, 83, 83, 80, 76, 88, 96, 64, 79,
+  74, 76, 79, 74, 84, 80, 92, 84, 92, 83,
+  78, 90, 91, 72, 80, 89, 77, 79, 81, 76,
+  83, 99, 76, 82, 82, 79, 77, 94, 77, 102,
+  79, 73, 83, 86, 88, 84, 80, 83, 84, 75,
+  86, 93, 84, 86, 83, 89, 72, 78, 79, 84,
+  83, 96, 78, 97, 79, 103, 78, 85, 74, 86,
+  72, 83, 91, 80, 89, 84, 89, 87, 78, 83,
+  73, 99, 108, 82, 78, 87, 83, 90, 80, 79,
+  77, 81, 78, 76, 74, 85, 78, 83, 84, 99,
+  72, 93, 87, 81, 83, 84, 81, 84, 76, 74,
+  92, 81, 91, 79, 82, 81, 87, 87, 81, 78,
+  85, 79, 73, 80, 88, 86, 85, 112, 97, 85,
+  83, 79, 71, 76, 82, 89, 64, 80, 74, 83,
+  84, 79, 80, 76, 93, 84, 85, 82, 71, 87,
+  94, 73, 83, 86, 78, 82, 82, 74, 88, 98,
+  75, 81, 86, 72, 70, 86, 74, 110, 76, 74,
+  78, 84, 106, 85, 81, 83, 90, 76, 82, 100,
+  88, 87, 89, 91, 69, 76, 76, 90, 79, 103,
+  82, 94, 74, 106, 80, 86, 72, 87, 71, 75,
+  86, 85, 89, 80, 79, 93, 81, 81, 72, 90,
+  113, 74, 80, 87, 86, 86, 76, 84, 83, 80,
+  83, 78, 74, 83, 74, 84, 84, 96, 78, 89,
+  87, 82, 84, 85, 80, 80, 78, 78, 85, 79,
+  88, 82, 96, 81, 95, 93, 91, 80, 83, 84,
+  76, 74, 87, 85, 77, 97, 94, 81, 83, 80,
+  85, 74, 83, 99, 67, 82, 72, 77, 93, 75,
+  85, 80, 88, 88, 88, 82, 77, 91, 92, 82,
+  76, 81, 78, 79, 83, 76, 79, 92, 75, 84,
+  81, 76, 77, 85, 80, 99, 75, 69, 85, 85,
+  92, 83, 80, 83, 76, 80, 88, 93, 84, 87,
+  85, 93, 73, 78, 78, 85, 78, 96, 80, 95,
+  81, 95, 77, 95, 77, 87, 67, 86, 87, 98,
+  89, 88, 82, 88, 79, 84, 76, 92, 102, 88,
+  83, 91, 81, 93, 87, 81, 78, 81, 79, 81,
+  76, 83, 80, 84, 86, 96, 74, 91, 87, 90,
+  86, 85, 85, 87, 74, 74, 83, 83, 84, 75,
+  86, 82, 85, 87, 90, 89, 84, 101, 71, 72,
+  94, 76, 73, 92, 89, 81, 77, 61, 85, 79,
+  85, 82, 105, 89, 54, 86, 96, 99, 94, 86,
+  99, 97, 99, 82, 100, 93, 83, 78, 74, 93,
+  88, 77, 86, 79, 80, 77, 72, 89, 70, 90,
+  119, 87, 68, 88, 89, 83, 92, 93, 92, 77,
+  88, 91, 95, 72, 78, 74, 105, 81, 84, 61,
+  93, 74, 88, 99, 75, 93, 82, 69, 96, 86,
+  80, 76, 83, 78, 103, 85, 65, 69, 78, 81,
+  83, 80, 88, 72, 76, 79, 72, 90, 78, 68,
+  91, 78, 71, 74, 85, 75, 101, 67, 104, 71,
+  93, 76, 88, 89, 82, 84, 92, 85, 84, 75,
+  91, 69, 75, 67, 109, 89, 73, 75, 84, 86,
+  97, 100, 92, 85, 69, 102, 69, 72, 96, 75,
+  62, 83, 81, 63, 82, 77, 88, 75, 82, 76,
+  102, 83, 49, 74, 69, 112, 82, 83, 120, 95,
+  96, 81, 101, 96, 84, 80, 71, 78, 88, 79,
+  68, 70, 76, 86, 51, 78, 61, 91, 146, 78,
+  76, 82, 88, 81, 98, 90, 97, 84, 94, 92,
+  97, 66, 88, 72, 109, 94, 80, 64, 99, 67,
+  98, 105, 76, 87, 70, 62, 110, 85, 73, 76,
+  96, 77, 98, 69, 70, 82, 77, 75, 78, 65,
+  94, 76, 82, 72, 73, 101, 74, 64, 102, 77,
+  102, 79, 87, 76, 93, 71, 118, 82, 98, 78,
+  87, 84, 71, 92, 94, 76, 82, 71, 79, 73,
+  83, 55, 94, 78, 69, 76, 83, 85, 95, 95,
+  80, 88, 69, 100, 78, 95, 95, 77, 70, 96,
+  89, 82, 74, 90, 85, 77, 82, 76, 101, 77,
+  76, 83, 72, 102, 71, 92, 103, 98, 89, 78,
+  98, 91, 81, 94, 77, 82, 90, 77, 57, 79,
+  80, 78, 64, 83, 72, 83, 102, 71, 66, 88,
+  86, 76, 91, 96, 93, 86, 85, 94, 91, 72,
+  88, 77, 110, 86, 83, 68, 93, 80, 86, 85,
+  90, 84, 78, 76, 100, 90, 80, 86, 96, 79,
+  103, 85, 77, 99, 81, 79, 93, 75, 90, 84,
+  82, 75, 69, 92, 94, 75, 92, 80, 92, 78,
+  95, 81, 91, 66, 103, 71, 91, 74, 90, 84,
+  74, 88, 90, 94, 67, 73, 77, 77, 78, 72,
+  71, 87, 73, 78, 86, 81, 98, 98, 103, 79,
+  101, 93, 64, 76, 92, 79, 71, 85, 84, 88,
+  100, 84, 85, 67, 88, 75, 74, 79, 60, 98,
+  74, 97, 96, 92, 86, 86, 87, 84, 93, 96,
+  95, 85, 78, 85, 81, 86, 72, 78, 76, 85,
+  104, 85, 93, 101, 85, 88, 74, 86, 76, 84,
+  94, 80, 86, 61, 79, 82, 84, 86, 68, 83,
+  85, 73, 85, 70, 108, 77, 91, 88, 74, 90,
+  78, 79, 79, 85, 81, 95, 78, 85, 90, 88,
+  75, 70, 84, 81, 81, 78, 77, 71, 82, 72,
+  72, 112, 70, 79, 79, 91, 62, 81, 77, 78,
+  90, 70, 94, 98, 80, 88, 81, 82, 76, 70,
+  91, 79, 73, 88, 96, 87, 87, 65, 93, 81,
+  66, 86, 89, 81, 101, 85, 89, 98, 67, 85,
+  59, 71, 100, 76, 64, 72, 76, 70, 83, 70,
+  87, 69, 78, 63, 67, 82, 81, 78, 66, 110,
+  86, 101, 83, 83, 77, 77, 90, 92, 96, 79,
+  72, 69, 73, 102, 74, 68, 75, 91, 79, 76,
+  101, 97, 81, 91, 78, 80, 81, 64, 93, 81,
+  85, 68, 85, 77, 97, 97, 73, 81, 83, 79,
+  79, 64, 126, 88, 93, 81, 62, 84, 71, 80,
+  85, 93, 82, 88, 87, 82, 82, 82, 73, 78,
+  86, 83, 74, 70, 69, 75, 79, 76, 92, 137,
+  67, 83, 82, 91, 94, 91, 78, 98, 82, 76,
+  97, 104, 87, 92, 74, 78, 64, 73, 88, 71,
+  62, 95, 70, 110, 94, 62, 84, 71, 60, 90,
+  86, 77, 104, 87, 97, 101, 72, 96, 65, 86,
+  94, 79, 69, 85, 82, 91, 90, 73, 86, 71,
+  81, 67, 72, 76, 100, 91, 80, 97, 71, 92,
+  94, 82, 83, 79, 93, 96, 93, 87, 79, 81,
+  85, 87, 84, 79, 76, 87, 62, 86, 101, 96,
+  79, 95, 75, 91, 77, 78, 94, 84, 88, 89,
+  78, 86, 87, 83, 77, 80, 86, 78, 83, 75,
+  93, 83, 92, 79, 99, 89, 71, 83, 85, 84,
+  82, 86, 86, 81, 94, 88, 85, 88, 84, 80,
+  84, 75, 76, 74, 83, 73, 75, 107, 77, 81,
+  81, 90, 106, 79, 81, 93, 87, 69, 94, 96,
+  80, 82, 82, 77, 67, 74, 88, 86, 60, 78,
+  73, 86, 83, 66, 71, 81, 70, 86, 89, 74,
+  96, 87, 92, 79, 86, 92, 92, 70, 85, 88,
+  85, 86, 83, 94, 98, 82, 75, 63, 76, 71,
+  78, 82, 90, 91, 82, 89, 85, 87, 85, 76,
+  83, 88, 77, 84, 89, 83, 88, 86, 90, 78,
+  80, 86, 66, 97, 89, 93, 89, 92, 75, 93,
+  80, 97, 73, 86, 83, 81, 82, 83, 77, 90,
+  87, 89, 68, 89, 81, 74, 85, 83, 98, 89,
+  85, 86, 86, 86, 87, 86, 78, 92, 87, 96,
+  89, 86, 88, 91, 86, 79, 82, 83, 87, 90,
+  79, 86, 83, 76, 78, 96, 78, 94, 73, 81,
+  79, 83, 78, 91, 78, 68, 72, 98, 81, 90,
+  88, 78, 83, 86, 82, 77, 78, 79, 92, 91,
+  86, 89, 79, 83, 74, 85, 102, 85, 96, 73,
+  92, 84, 78, 88, 91, 83, 81, 88, 82, 79,
+  76, 80, 84, 82, 74, 63, 72, 73, 78, 83,
+  105, 80, 81, 79, 84, 97, 78, 72, 80, 82,
+  81, 88, 95, 82, 71, 79, 79, 78, 82, 81,
+  69, 92, 96, 94, 96, 80, 66, 90, 76, 91,
+  73, 77, 74, 81, 81, 78, 78, 86, 90, 87,
+  76, 85, 87, 69, 83, 75, 94, 92, 83, 87,
+  81, 79, 79, 93, 63, 87, 91, 93, 82, 80,
+  80, 84, 92, 85, 85, 89, 77, 90, 82, 85,
+  84, 81, 80, 102, 83, 101, 74, 79, 78, 79,
+  78, 103, 79, 73, 62, 92, 88, 94, 83, 69,
+  85, 95, 80, 79, 79, 88, 82, 102, 87, 99,
+  80, 76, 75, 91, 97, 83, 99, 71, 90, 91,
+  79, 88, 89, 89, 86, 86, 84, 85, 84, 94,
+  95, 77, 78, 68, 72, 70, 79, 79, 99, 93,
+  76, 82, 82, 84, 87, 75, 76, 93, 80, 90,
+  88, 83, 88, 86, 86, 84, 80, 86, 67, 92,
+  82, 93, 93, 83, 74, 88, 82, 101, 72, 85,
+  79, 83, 77, 74, 81, 91, 87, 90, 73, 94,
+  86, 73, 85, 85, 86, 91, 86, 87, 86, 89,
+  83, 90, 72, 90, 86, 91, 88, 83, 87, 91,
+  87, 91, 83, 87, 77, 89, 82, 82, 88, 78,
+  78, 96, 79, 87, 76, 86, 90, 80, 79, 91,
+  80, 68, 76, 98, 88, 88, 84, 77, 82, 86,
+  82, 87, 83, 78, 88, 91, 90, 94, 82, 85,
+  75, 86, 99, 79, 94, 74, 89, 76, 84, 79,
+  74, 89, 94, 82, 88, 74, 88, 83, 86, 73,
+  78, 74, 106, 99, 88, 74, 88, 84, 89, 76,
+  82, 92, 81, 69, 87, 77, 81, 81, 101, 82,
+  85, 94, 91, 72, 90, 72, 75, 104, 83, 80,
+  89, 81, 71, 90, 91, 93, 90, 81, 74, 92,
+  69, 83, 90, 85, 82, 84, 81, 92, 79, 88,
+  92, 97, 90, 73, 86, 76, 81, 86, 98, 80,
+  70, 95, 85, 85, 69, 92, 92, 89, 81, 72,
+  95, 90, 94, 70, 85, 59, 76, 90, 81, 81,
+  84, 95, 83, 76, 80, 85, 81, 88, 79, 85,
+  78, 73, 90, 87, 69, 79, 86, 77, 83, 72,
+  86, 83, 79, 78, 77, 80, 75, 76, 80, 85,
+  71, 84, 91, 87, 91, 78, 84, 78, 87, 71,
+  96, 74, 82, 76, 86, 85, 95, 84, 72, 72,
+  110, 93, 80, 76, 88, 87, 76, 89, 86, 90,
+  81, 65, 85, 83, 83, 86, 96, 87, 91, 86,
+  92, 68, 90, 79, 78, 113, 88, 77, 97, 88,
+  76, 87, 97, 96, 86, 90, 70, 91, 72, 88,
+  89, 84, 80, 89, 81, 98, 81, 90, 74, 108,
+  89, 80, 95, 77, 81, 91, 96, 63, 71, 87,
+  93, 83, 70, 98, 89, 88, 84, 78, 100, 96,
+  78, 69, 86, 69, 74, 75, 78, 87, 82, 96,
+  88, 73, 85, 91, 69, 88, 78, 87, 82, 76,
+  90, 88, 77, 73, 89, 78, 87, 79, 89, 83,
+  80, 90, 81, 88, 70, 77, 66, 84, 70, 88,
+  91, 92, 86, 80, 84, 83, 74, 81, 93, 76,
+  85, 77, 82, 86, 81, 84, 79, 77, 105, 99,
+  84, 77, 85, 88, 92, 77, 84, 94, 79, 76,
+  83, 77, 80, 87, 99, 83, 85, 88, 85, 82,
+  83, 76, 78, 100, 85, 83, 89, 79, 75, 83,
+  90, 88, 87, 80, 71, 94, 73, 81, 88, 85,
+  84, 84, 85, 91, 84, 93, 95, 95, 86, 77,
+  86, 76, 81, 88, 95, 73, 73, 88, 86, 86,
+  64, 86, 91, 92, 81, 88, 93, 99, 72, 71,
+  87, 65, 80, 79, 75, 87, 83, 93, 84, 79,
+  82, 82, 84, 85, 81, 86, 80, 75, 93, 88,
+  71, 74, 82, 78, 81, 85, 85, 89, 81, 81,
+  77, 82, 69, 78, 79, 84, 68, 79, 89, 91,
+  82, 83, 76, 78, 81, 92, 92, 93, 89, 68,
+  91, 87, 84, 84, 90, 65, 102, 88, 89, 71,
+  83, 81, 75, 70, 75, 88, 78, 77, 87, 83,
+  91, 76, 99, 75, 85, 92, 77, 93, 86, 89,
+  85, 74, 81, 81, 82, 89, 62, 82, 91, 91,
+  93, 84, 71, 83, 68, 88, 89, 85, 77, 83,
+  83, 89, 79, 87, 92, 89, 89, 76, 81, 77,
+  85, 80, 99, 86, 70, 101, 79, 82, 81, 91,
+  80, 85, 73, 69, 81, 92, 91, 69, 86, 80,
+  79, 117, 78, 89, 88, 94, 76, 91, 79, 89,
+  78, 89, 77, 82, 75, 83, 85, 78, 76, 86,
+  82, 74, 87, 69, 73, 81, 75, 83, 88, 76,
+  90, 77, 80, 98, 71, 79, 90, 82, 86, 88,
+  79, 74, 82, 67, 98, 92, 83, 62, 95, 86,
+  103, 90, 78, 62, 112, 71, 81, 74, 82, 84,
+  67, 79, 82, 92, 72, 72, 82, 88, 99, 86,
+  100, 81, 84, 76, 82, 96, 102, 91, 92, 68,
+  83, 74, 85, 97, 64, 85, 103, 94, 94, 94,
+  72, 77, 66, 88, 93, 83, 77, 92, 83, 93,
+  82, 86, 57, 94, 93, 82, 82, 66, 75, 85,
+  94, 72, 69, 91, 81, 87, 78, 103, 76, 87,
+  77, 78, 83, 109, 73, 63, 83, 85, 76, 80,
+  70, 108, 76, 96, 79, 95, 77, 102, 48, 78,
+  72, 81, 76, 84, 87, 75, 77, 78, 91, 71,
+  91, 69, 76, 86, 73, 90, 94, 80, 82, 79,
+  76, 100, 68, 78, 94, 87, 76, 89, 94, 89,
+  80, 74, 91, 85, 92, 72, 86, 83, 84, 87,
+  90, 68, 95, 88, 88, 82, 84, 86, 94, 72,
+  84, 89, 79, 81, 77, 86, 86, 83, 94, 76,
+  78, 82, 72, 107, 93, 86, 89, 75, 82, 85,
+  83, 84, 70, 81, 90, 92, 90, 86, 75, 85,
+  72, 85, 83, 85, 77, 82, 87, 88, 84, 90,
+  105, 85, 88, 79, 76, 94, 76, 82, 94, 84,
+  73, 88, 81, 84, 74, 85, 84, 86, 74, 98,
+  80, 109, 71, 75, 87, 84, 83, 95, 73, 89,
+  86, 96, 75, 91, 72, 86, 83, 77, 75, 83,
+  73, 85, 89, 80, 73, 81, 81, 71, 82, 83,
+  79, 86, 83, 80, 86, 80, 78, 79, 78, 93,
+  72, 78, 93, 87, 75, 83, 86, 102, 90, 101,
+  86, 89, 96, 78, 84, 91, 78, 93, 80, 97,
+  86, 88, 94, 94, 84, 91, 72, 64, 75, 80,
+  80, 92, 95, 82, 91, 84, 82, 71, 70, 100,
+  73, 102, 72, 82, 91, 69, 77, 94, 65, 77,
+  74, 76, 72, 85, 88, 75, 72, 74, 74, 83,
+  77, 81, 89, 84, 77, 73, 97, 71, 122, 63,
+  99, 88, 74, 115, 111, 77, 92, 110, 76, 92,
+  75, 85, 97, 75, 85, 76, 76, 81, 81, 93,
+  93, 100, 78, 86, 84, 147, 76, 87, 83, 79,
+  82, 78, 69, 70, 98, 93, 90, 83, 80, 99,
+  78, 93, 75, 84, 80, 68, 76, 86, 92, 85,
+  86, 79, 82, 76, 80, 69, 100, 98, 78, 73,
+  80, 75, 69, 81, 97, 97, 77, 88, 80, 102,
+  95, 83, 86, 91, 77, 92, 76, 87, 88, 84,
+  91, 91, 80, 83, 92, 60, 79, 82, 72, 97,
+  72, 81, 91, 86, 89, 77, 70, 86, 79, 114,
+  87, 80, 91, 69, 77, 85, 57, 73, 75, 79,
+  73, 89, 89, 78, 74, 69, 74, 83, 81, 76,
+  87, 91, 84, 70, 101, 59, 96, 57, 84, 82,
+  67, 112, 92, 77, 94, 113, 72, 94, 74, 91,
+  91, 82, 81, 74, 72, 99, 69, 105, 92, 98,
+  72, 92, 83, 136, 65, 94, 77, 71, 85, 79,
+  72, 77, 96, 88, 81, 83, 69, 95, 84, 86,
+  74, 86, 79, 65, 77, 82, 84, 87, 89, 78,
+  90, 72, 86, 70, 102, 102, 78, 75, 85, 75,
+  77, 76, 91, 98, 87, 69, 84, 91, 93, 82,
+  83, 93, 77, 90, 86, 92, 79, 88, 100, 92,
+  84, 96, 109, 64, 81, 81, 84, 91, 84, 82,
+  86, 83, 87, 76, 66, 85, 74, 100, 96, 81,
+  89, 72, 80, 95, 70, 75, 73, 78, 75, 89,
+  85, 76, 76, 78, 76, 83, 74, 82, 87, 88,
+  80, 79, 101, 74, 114, 67, 83, 85, 73, 121,
+  77, 75, 88, 113, 74, 89, 81, 85, 83, 76,
+  88, 76, 80, 102, 81, 101, 92, 104, 76, 83,
+  82, 132, 75, 82, 82, 83, 80, 78, 77, 65,
+  95, 82, 91, 85, 82, 98, 80, 95, 80, 81,
+  77, 66, 71, 83, 82, 88, 88, 75, 81, 77,
+  78, 76, 95, 92, 81, 83, 83, 79, 100, 62,
+  85, 49, 84, 68, 74, 66, 71, 55, 79, 87,
+  72, 91, 96, 81, 72, 71, 82, 86, 79, 82,
+  91, 76, 66, 65, 71, 83, 82, 82, 59, 88,
+  84, 75, 94, 105, 88, 132, 94, 72, 70, 62,
+  81, 62, 92, 71, 83, 82, 53, 67, 99, 79,
+  71, 77, 76, 83, 54, 70, 86, 129, 91, 68,
+  100, 87, 78, 87, 81, 88, 77, 73, 80, 111,
+  92, 94, 77, 93, 77, 92, 81, 67, 86, 74,
+  80, 92, 106, 74, 67, 119, 66, 92, 80, 85,
+  88, 72, 87, 72, 79, 71, 79, 97, 86, 84,
+  160, 92, 119, 75, 83, 86, 78, 84, 88, 85,
+  62, 86, 91, 96, 77, 111, 141, 77, 78, 66,
+  71, 63, 103, 73, 144, 57, 93, 92, 73, 58,
+  87, 86, 76, 64, 70, 39, 74, 88, 68, 100,
+  95, 81, 76, 71, 75, 79, 73, 83, 65, 80,
+  74, 73, 73, 84, 99, 95, 64, 82, 84, 73,
+  83, 105, 83, 123, 87, 76, 66, 70, 81, 65,
+  92, 82, 80, 92, 59, 68, 93, 74, 76, 80,
+  75, 86, 57, 69, 83, 109, 93, 73, 98, 85,
+  69, 90, 74, 83, 76, 70, 82, 105, 86, 90,
+  76, 88, 85, 75, 78, 69, 89, 70, 80, 81,
+  103, 74, 77, 110, 64, 86, 77, 94, 92, 72,
+  85, 69, 86, 77, 81, 90, 77, 91, 145, 91,
+  116, 77, 89, 84, 71, 84, 83, 89, 65, 66,
+  88, 95, 86, 106, 132, 77, 94, 65, 72, 67,
+  92, 78, 130, 62, 81, 93, 89, 68, 87, 89,
+  85, 96, 73, 70, 100, 85, 85, 88, 78, 90,
+  79, 69, 93, 94, 79, 84, 71, 85, 89, 78,
+  84, 82, 88, 88, 96, 91, 82, 93, 76, 93,
+  86, 87, 81, 86, 92, 80, 80, 86, 85, 96,
+  92, 82, 97, 79, 86, 86, 81, 87, 95, 87,
+  91, 81, 88, 87, 78, 86, 93, 61, 79, 78,
+  72, 84, 88, 86, 87, 86, 78, 89, 83, 87,
+  92, 76, 75, 76, 85, 84, 97, 79, 80, 72,
+  105, 77, 77, 93, 101, 95, 93, 87, 83, 88,
+  85, 75, 96, 89, 76, 78, 74, 87, 71, 91,
+  78, 86, 79, 88, 86, 78, 98, 67, 88, 88,
+  88, 72, 77, 88, 99, 88, 80, 79, 86, 84,
+  72, 89, 86, 72, 76, 66, 78, 67, 81, 74,
+  77, 65, 86, 89, 72, 81, 89, 89, 66, 74,
+  81, 88, 82, 80, 85, 93, 79, 75, 91, 83,
+  88, 95, 79, 93, 79, 90, 95, 93, 80, 119,
+  85, 76, 64, 69, 84, 69, 82, 88, 81, 81,
+  78, 74, 94, 80, 84, 84, 82, 84, 76, 76,
+  86, 97, 76, 78, 89, 88, 69, 88, 69, 71,
+  84, 72, 85, 99, 95, 80, 80, 90, 86, 89,
+  90, 61, 80, 87, 94, 85, 91, 69, 73, 101,
+  83, 96, 89, 65, 83, 81, 95, 75, 79, 73,
+  71, 79, 66, 78, 119, 88, 99, 90, 83, 77,
+  68, 89, 82, 87, 74, 97, 82, 103, 78, 82,
+  95, 83, 79, 65, 71, 65, 90, 91, 106, 70,
+  85, 84, 73, 68, 79, 80, 82, 75, 76, 55,
+  82, 92, 71, 87, 89, 88, 67, 76, 75, 82,
+  76, 82, 72, 95, 74, 77, 92, 80, 95, 104,
+  86, 86, 76, 83, 85, 89, 78, 108, 85, 80,
+  68, 71, 82, 69, 79, 82, 76, 90, 85, 74,
+  90, 80, 87, 86, 80, 81, 77, 77, 82, 87,
+  83, 81, 89, 86, 68, 91, 73, 70, 82, 76,
+  74, 96, 88, 80, 78, 88, 89, 77, 84, 64,
+  84, 83, 92, 75, 93, 73, 82, 99, 83, 90,
+  83, 72, 85, 84, 89, 75, 85, 76, 87, 76,
+  67, 78, 108, 85, 91, 86, 88, 77, 62, 89,
+  80, 85, 75, 75, 88, 99, 87, 79, 93, 88,
+  90, 67, 74, 70, 85, 98, 94, 74, 77, 81,
+  87, 71, 80, 82, 89, 98, 80, 79, 97, 84,
+  88, 84, 82, 94, 82, 78, 87, 88, 79, 89,
+  73, 89, 90, 83, 85, 83, 88, 85, 98, 90,
+  82, 93, 82, 87, 83, 81, 83, 89, 84, 79,
+  87, 91, 84, 90, 83, 85, 92, 81, 85, 91,
+  86, 89, 91, 80, 88, 84, 86, 84, 75, 87,
+  87, 62, 77, 83, 80, 86, 86, 84, 80, 79,
+  77, 83, 83, 80, 89, 76, 71, 79, 84, 86,
+  93, 81, 76, 71, 103, 81, 84, 90, 97, 82,
+  83, 93, 83, 84, 83, 80, 97, 86, 78, 87,
+  77, 82, 59, 90, 84, 85, 72, 86, 92, 81,
+  97, 65, 91, 89, 82, 66, 71, 86, 90, 78,
+  83, 81, 88, 85, 68, 87, 83, 84, 85, 72,
+  83, 87, 82, 92, 87, 84, 88, 90, 95, 86,
+  80, 84, 76, 74, 98, 90, 86, 91, 89, 99,
+  90, 87, 92, 70, 83, 88, 96, 102, 85, 103,
+  90, 74, 83, 84, 81, 76, 88, 67, 87, 92,
+  82, 89, 85, 88, 95, 82, 91, 86, 90, 90,
+  98, 89, 91, 84, 91, 87, 72, 88, 73, 79,
+  80, 83, 81, 90, 84, 84, 88, 72, 83, 75,
+  82, 81, 86, 82, 77, 74, 80, 91, 110, 81,
+  82, 67, 67, 81, 77, 104, 90, 68, 85, 95,
+  92, 88, 80, 84, 84, 83, 78, 81, 68, 81,
+  54, 93, 93, 78, 81, 91, 84, 85, 94, 83,
+  86, 96, 83, 59, 66, 82, 86, 80, 77, 70,
+  86, 101, 61, 96, 86, 87, 85, 72, 81, 89,
+  85, 95, 85, 86, 85, 92, 91, 85, 83, 81,
+  72, 78, 92, 87, 85, 86, 85, 98, 87, 88,
+  94, 70, 85, 91, 96, 96, 87, 97, 90, 75,
+  83, 81, 84, 77, 86, 67, 86, 90, 81, 85,
+  82, 86, 96, 83, 90, 88, 91, 88, 93, 90,
+  88, 85, 85, 85, 74, 88, 74, 78, 83, 84,
+  84, 86, 83, 83, 81, 73, 79, 76, 80, 77,
+  85, 81, 76, 75, 83, 89, 112, 81, 81, 69,
+  63, 81, 82, 102, 89, 75, 86, 96, 93, 86,
+  81, 83, 95, 84, 82, 78, 71, 81, 51, 90,
+  93, 79, 82, 90, 83, 82, 92, 80, 85, 93,
+  80, 60, 67, 85, 82, 82, 81, 76, 85, 111,
+  61, 92, 81, 81, 83, 69, 77, 89, 82, 88,
+  88, 89, 80, 83, 88, 81, 79, 87, 82, 83,
+  99, 84, 86, 86, 83, 87, 94, 89, 85, 81,
+  78, 88, 87, 96, 87, 97, 86, 91, 89, 87,
+  85, 84, 87, 77, 91, 97, 84, 86, 82, 86,
+  88, 84, 86, 84, 83, 87, 87, 80, 82, 94,
+  83, 89, 71, 92, 76, 77, 84, 84, 87, 95,
+  80, 84, 82, 71, 78, 75, 89, 69, 84, 78,
+  73, 81, 79, 83, 96, 78, 78, 60, 74, 86,
+  76, 100, 78, 79, 87, 90, 92, 90, 78, 82,
+  102, 87, 88, 85, 82, 78, 68, 88, 90, 86,
+  77, 87, 93, 85, 82, 72, 89, 86, 80, 66,
+  74, 82, 89, 82, 77, 66, 85, 90, 75, 90,
+  91, 80, 88, 91, 86, 85, 78, 79, 72, 90,
+  78, 83, 92, 81, 92, 81, 70, 98, 76, 80,
+  84, 70, 72, 83, 86, 108, 79, 83, 108, 85,
+  87, 80, 72, 108, 65, 83, 79, 81, 72, 94,
+  77, 80, 81, 88, 98, 60, 79, 87, 87, 73,
+  76, 75, 74, 95, 60, 80, 81, 82, 64, 91,
+  104, 85, 92, 104, 81, 101, 85, 85, 81, 77,
+  70, 69, 77, 80, 82, 72, 80, 78, 92, 95,
+  78, 102, 88, 78, 91, 85, 87, 109, 77, 101,
+  86, 81, 80, 61, 96, 86, 89, 98, 81, 88,
+  75, 76, 87, 81, 78, 83, 75, 94, 68, 83,
+  83, 87, 85, 80, 70, 69, 86, 92, 66, 90,
+  102, 84, 75, 90, 69, 89, 78, 67, 86, 90,
+  79, 82, 81, 78, 81, 74, 76, 86, 80, 89,
+  84, 72, 92, 78, 72, 94, 71, 79, 89, 71,
+  76, 86, 89, 106, 78, 81, 91, 79, 81, 83,
+  78, 90, 67, 88, 73, 78, 82, 93, 76, 79,
+  86, 96, 103, 67, 82, 76, 81, 77, 69, 69,
+  75, 91, 64, 73, 85, 77, 69, 83, 103, 86,
+  90, 96, 78, 100, 85, 86, 82, 71, 72, 67,
+  85, 82, 86, 69, 85, 83, 89, 91, 81, 97,
+  88, 78, 84, 81, 86, 97, 74, 105, 80, 77,
+  83, 59, 81, 86, 88, 102, 78, 83, 73, 76,
+  81, 83, 80, 83, 75, 94, 67, 85, 83, 90,
+  82, 84, 64, 67, 81, 87, 62, 87, 99, 81,
+  71, 88, 63, 89, 80, 68, 81, 88, 85, 84,
+  72, 77, 74, 81, 71, 87, 83, 84, 94, 81,
+  87, 91, 79, 99, 79, 93, 83, 79, 85, 89,
+  86, 104, 85, 85, 98, 71, 87, 90, 75, 88,
+  76, 88, 79, 81, 90, 96, 86, 75, 86, 93,
+  92, 69, 83, 78, 83, 83, 75, 77, 72, 84,
+  70, 78, 80, 85, 70, 97, 105, 79, 89, 99,
+  92, 95, 83, 88, 87, 89, 83, 71, 81, 82,
+  89, 73, 80, 91, 90, 96, 76, 91, 83, 81,
+  78, 80, 80, 93, 77, 99, 84, 81, 76, 66,
+  88, 84, 92, 101, 78, 92, 75, 82, 92, 80,
+  85, 85, 75, 93, 67, 84, 85, 88, 84, 86,
+  73, 73, 88, 90, 72, 87, 96, 92, 80, 92,
+  73, 87, 80, 71, 80, 75, 75, 87, 90, 85,
+  75, 75, 72, 88, 83, 79, 79, 80, 82, 88,
+  81, 90, 76, 86, 88, 74, 72, 87, 86, 89,
+  95, 83, 87, 83, 84, 85, 77, 105, 65, 82,
+  85, 86, 75, 83, 86, 74, 79, 87, 76, 77,
+  85, 82, 81, 79, 75, 67, 81, 88, 72, 100,
+  86, 85, 78, 91, 104, 78, 86, 87, 80, 88,
+  76, 86, 84, 82, 89, 76, 68, 69, 77, 76,
+  75, 75, 82, 81, 69, 89, 80, 80, 79, 87,
+  85, 85, 81, 101, 77, 74, 76, 72, 93, 78,
+  92, 90, 87, 86, 67, 85, 86, 80, 86, 82,
+  76, 86, 67, 84, 79, 94, 83, 80, 81, 74,
+  80, 93, 74, 79, 101, 84, 80, 84, 70, 93,
+  82, 70, 80, 83, 84, 81, 78, 83, 77, 72,
+  75, 89, 85, 86, 79, 83, 77, 89, 86, 89,
+  78, 91, 88, 83, 84, 92, 88, 81, 90, 82,
+  64, 75, 85, 89, 82, 94, 70, 87, 76, 86,
+  80, 79, 83, 74, 91, 94, 73, 84, 79, 77,
+  75, 83, 72, 75, 83, 87, 76, 84, 88, 84,
+  84, 83, 105, 83, 83, 83, 83, 85, 71, 89,
+  85, 83, 77, 73, 76, 69, 81, 76, 81, 84,
+  75, 77, 78, 80, 84, 72, 74, 88, 82, 80,
+  76, 97, 73, 70, 75, 68, 86, 72, 90, 88,
+  78, 86, 60, 77, 83, 81, 83, 85, 78, 82,
+  71, 82, 77, 93, 81, 80, 81, 79, 83, 90,
+  78, 81, 98, 83, 87, 82, 74, 90, 84, 74,
+  81, 81, 86, 84, 75, 82, 74, 72, 74, 87,
+  86, 86, 88, 93, 74, 91, 84, 91, 86, 93,
+  82, 91, 84, 95, 88, 86, 98, 86, 75, 73,
+  86, 98, 79, 93, 76, 74, 86, 85, 86, 83,
+  83, 73, 90, 92, 68, 89, 85, 85, 74, 89,
+  79, 87, 81, 88, 86, 76, 84, 85, 89, 91,
+  105, 79, 84, 91, 85, 83, 72, 85, 87, 94,
+  78, 76, 68, 70, 83, 78, 87, 95, 83, 83,
+  73, 81, 84, 76, 74, 89, 78, 80, 83, 94,
+  82, 73, 78, 70, 88, 73, 91, 87, 78, 95,
+  67, 77, 90, 81, 86, 92, 74, 81, 78, 87,
+  79, 92, 81, 84, 93, 87, 90, 90, 84, 80,
+  97, 90, 84, 87, 83, 87, 86, 83, 79, 86,
+  88, 88, 94, 84, 68, 68, 80, 82, 87, 80,
+  83, 95, 69, 90, 75, 82, 82, 96, 89, 91,
+  90, 100, 87, 77, 99, 78, 90, 81, 83, 96,
+  87, 104, 79, 99, 77, 89, 89, 71, 92, 83,
+  82, 87, 72, 96, 99, 88, 74, 93, 93, 85,
+  91, 88, 95, 92, 86, 83, 106, 91, 113, 78,
+  81, 80, 75, 81, 75, 82, 82, 95, 85, 89,
+  69, 70, 73, 82, 86, 92, 75, 78, 83, 79,
+  79, 82, 68, 97, 88, 68, 100, 98, 89, 77,
+  91, 74, 97, 75, 89, 90, 94, 86, 71, 85,
+  87, 82, 90, 81, 87, 73, 84, 96, 81, 95,
+  73, 84, 91, 95, 96, 92, 88, 77, 103, 86,
+  82, 87, 83, 91, 81, 92, 78, 89, 98, 83,
+  81, 93, 75, 66, 88, 82, 87, 84, 84, 94,
+  65, 87, 80, 83, 84, 100, 92, 102, 89, 100,
+  85, 75, 100, 78, 64, 81, 78, 101, 91, 94,
+  82, 93, 73, 89, 88, 65, 85, 83, 92, 96,
+  69, 111, 95, 91, 66, 96, 94, 94, 95, 83,
+  103, 97, 86, 86, 111, 86, 110, 80, 77, 80,
+  90, 83, 71, 80, 86, 96, 95, 84, 70, 69,
+  76, 80, 90, 96, 77, 77, 90, 75, 78, 82,
+  60, 101, 88, 68, 96, 87, 92, 77, 96, 68,
+  95, 68, 83, 87, 91, 88, 80, 88, 84, 83,
+  92, 79, 87, 72, 85, 97, 79, 93, 69, 87,
+  88, 91, 96, 91, 97, 83, 105, 90, 81, 82,
+  94, 90, 82, 98, 80, 88, 88, 89, 85, 95,
+  73, 62, 86, 77, 86, 84, 86, 93, 65, 92,
+  71, 81, 80, 101, 86, 107, 82, 104, 80, 72,
+  103, 83, 78, 82, 77, 101, 97, 99, 77, 81,
+  83, 89, 88, 71, 92, 84, 87, 87, 69, 111,
+  104, 99, 69, 103, 99, 88, 95, 86, 110, 97,
+  83, 84, 114, 91, 108, 83, 82, 89, 82, 87,
+  66, 79, 86, 85, 96, 87, 70, 71, 79, 85,
+  98, 96, 87, 80, 88, 77, 77, 87, 56, 106,
+  86, 61, 95, 89, 97, 83, 100, 70, 105, 70,
+  85, 83, 93, 90, 80, 93, 93, 82, 91, 83,
+  84, 68, 89, 98, 72, 95, 77, 91, 87, 94,
+  92, 89, 95, 84, 101, 88, 89, 87, 95, 86,
+  86, 103, 79, 86, 84, 72, 84, 87, 96, 72,
+  103, 75, 80, 85, 89, 94, 72, 88, 72, 78,
+  71, 78, 88, 89, 111, 70, 89, 89, 69, 68,
+  86, 86, 93, 88, 89, 80, 72, 104, 90, 72,
+  86, 72, 103, 78, 92, 85, 80, 94, 85, 90,
+  82, 90, 79, 74, 78, 85, 90, 88, 88, 73,
+  85, 82, 84, 85, 74, 74, 86, 71, 81, 89,
+  78, 88, 74, 82, 84, 74, 88, 81, 103, 92,
+  80, 66, 88, 87, 77, 75, 95, 85, 81, 82,
+  77, 91, 70, 85, 83, 84, 85, 113, 100, 90,
+  90, 79, 66, 77, 83, 80, 104, 77, 80, 88,
+  98, 66, 73, 79, 78, 91, 75, 94, 75, 79,
+  85, 106, 87, 71, 87, 91, 77, 86, 77, 80,
+  71, 90, 75, 51, 84, 85, 95, 66, 108, 70,
+  81, 85, 96, 86, 65, 89, 69, 90, 64, 76,
+  93, 91, 98, 61, 87, 73, 59, 48, 92, 85,
+  79, 109, 104, 81, 78, 76, 93, 68, 88, 67,
+  112, 64, 92, 81, 84, 109, 93, 84, 76, 91,
+  68, 84, 82, 93, 84, 82, 81, 75, 76, 92,
+  88, 89, 82, 73, 79, 69, 91, 90, 70, 90,
+  76, 71, 77, 74, 95, 68, 129, 90, 77, 65,
+  93, 83, 64, 73, 93, 71, 83, 88, 81, 96,
+  53, 95, 80, 84, 73, 115, 102, 81, 82, 87,
+  64, 87, 63, 82, 126, 63, 89, 83, 105, 56,
+  81, 75, 74, 84, 83, 94, 75, 95, 106, 104,
+  88, 61, 86, 90, 86, 90, 73, 88, 83, 86,
+  69, 63, 85, 102, 94, 69, 95, 76, 83, 85,
+  85, 84, 76, 88, 72, 81, 70, 76, 85, 87,
+  84, 71, 95, 84, 70, 67, 82, 82, 86, 107,
+  93, 96, 77, 75, 91, 71, 89, 74, 104, 74,
+  82, 82, 82, 102, 89, 92, 79, 90, 77, 72,
+  80, 89, 90, 70, 84, 74, 80, 85, 84, 88,
+  75, 75, 84, 68, 76, 87, 76, 78, 80, 81,
+  82, 74, 93, 82, 101, 90, 78, 70, 92, 85,
+  71, 90, 95, 81, 82, 88, 80, 98, 61, 98,
+  88, 85, 99, 111, 96, 88, 82, 77, 73, 82,
+  79, 80, 104, 77, 77, 84, 93, 72, 81, 78,
+  75, 89, 82, 95, 76, 85, 94, 102, 71, 71,
+  85, 91, 85, 86, 79, 82, 70, 82, 83, 69,
+  85, 83, 92, 71, 96, 67, 84, 74, 80, 90,
+  73, 88, 69, 80, 62, 85, 99, 86, 110, 76,
+  85, 88, 75, 52, 97, 85, 74, 83, 88, 75,
+  74, 109, 87, 89, 85, 64, 99, 78, 68, 81,
+  80, 101, 83, 88, 84, 77, 89, 82, 80, 93,
+  79, 92, 80, 78, 75, 100, 80, 82, 77, 71,
+  81, 64, 85, 88, 87, 73, 86, 80, 90, 74,
+  89, 84, 96, 90, 89, 80, 94, 85, 69, 76,
+  87, 81, 77, 84, 86, 87, 59, 73, 75, 78,
+  74, 96, 96, 96, 90, 86, 70, 92, 77, 80,
+  100, 93, 88, 77, 94, 66, 84, 84, 79, 86,
+  89, 80, 75, 86, 87, 106, 100, 62, 105, 86,
+  85, 83, 84, 87, 77, 95, 81, 53, 94, 78,
+  96, 68, 79, 67, 84, 68, 97, 93, 62, 97,
+  70, 77, 48, 84, 85, 102, 80, 73, 80, 83,
+  70, 36, 101, 91, 66, 117, 115, 83, 76, 78,
+  84, 97, 96, 63, 75, 79, 74, 72, 79, 101,
+  93, 94, 80, 75, 86, 80, 86, 113, 70, 87,
+  73, 87, 70, 114, 81, 84, 74, 73, 66, 66,
+  91, 80, 98, 68, 73, 75, 84, 64, 93, 70,
+  98, 91, 78, 99, 105, 93, 66, 78, 85, 74,
+  70, 90, 89, 85, 49, 66, 69, 84, 54, 81,
+  105, 88, 84, 95, 54, 87, 56, 88, 118, 89,
+  84, 68, 117, 50, 101, 74, 80, 70, 93, 75,
+  71, 104, 100, 93, 99, 48, 106, 85, 105, 76,
+  83, 109, 70, 100, 79, 62, 88, 102, 89, 65,
+  89, 72, 82, 73, 80, 88, 77, 87, 69, 79,
+  57, 83, 68, 91, 81, 74, 93, 86, 76, 52,
+  89, 83, 71, 111, 97, 87, 78, 71, 85, 88,
+  87, 65, 92, 81, 89, 75, 80, 102, 84, 82,
+  85, 75, 89, 79, 82, 96, 80, 81, 79, 82,
+  72, 100, 80, 90, 79, 74, 86, 64, 87, 87,
+  84, 73, 73, 86, 92, 74, 92, 83, 90, 93,
+  82, 87, 97, 89, 70, 99, 87, 85, 80, 92,
+  92, 90, 56, 82, 76, 78, 82, 91, 94, 92,
+  77, 80, 71, 81, 74, 84, 99, 96, 84, 75,
+  89, 69, 94, 85, 82, 80, 92, 83, 90, 88,
+  92, 99, 74, 65, 98, 88, 89, 82, 85, 91,
+  69, 77, 84, 85, 82, 83, 89, 68, 99, 73,
+  84, 75, 87, 93, 75, 87, 61, 81, 71, 85,
+  89, 88, 93, 79, 94, 88, 88, 67, 89, 89,
+  76, 80, 89, 77, 77, 105, 77, 93, 79, 73,
+  92, 90, 76, 81, 78, 95, 78, 84, 87, 77,
+  77, 83, 79, 96, 91, 83, 80, 76, 74, 93,
+  78, 82, 79, 81, 95, 68, 84, 92, 90, 84,
+  87, 89, 94, 78, 86, 96, 88, 87, 92, 82,
+  95, 80, 82, 85, 83, 90, 87, 90, 90, 83,
+  60, 77, 86, 74, 81, 89, 83, 100, 76, 85,
+  81, 97, 84, 79, 86, 94, 78, 84, 78, 82,
+  88, 82, 90, 86, 84, 82, 73, 74, 89, 87,
+  90, 79, 101, 88, 84, 74, 92, 90, 65, 86,
+  78, 74, 79, 81, 82, 68, 87, 71, 87, 70,
+  96, 89, 76, 96, 65, 80, 57, 81, 79, 94,
+  84, 80, 85, 86, 92, 46, 92, 87, 66, 98,
+  104, 77, 71, 93, 70, 103, 88, 74, 71, 92,
+  73, 71, 76, 96, 76, 91, 83, 80, 76, 82,
+  81, 109, 81, 84, 71, 82, 69, 98, 78, 81,
+  76, 75, 100, 66, 90, 83, 103, 87, 86, 85,
+  100, 78, 85, 88, 83, 92, 86, 95, 102, 79,
+  77, 88, 82, 90, 81, 94, 86, 76, 43, 80,
+  78, 71, 66, 74, 86, 102, 73, 91, 75, 100,
+  72, 82, 90, 97, 69, 68, 71, 76, 91, 77,
+  88, 80, 85, 79, 80, 72, 87, 81, 88, 72,
+  99, 86, 92, 62, 92, 100, 70, 92, 73, 77,
+  83, 88, 90, 67, 93, 72, 80, 79, 90, 82,
+  79, 87, 64, 81, 66, 82, 77, 85, 87, 81,
+  91, 87, 92, 62, 85, 86, 75, 95, 99, 85,
+  81, 78, 75, 95, 98, 73, 85, 93, 87, 77,
+  76, 93, 73, 80, 90, 76, 78, 84, 77, 102,
+  90, 86, 77, 82, 72, 93, 81, 81, 85, 82,
+  101, 68, 79, 89, 91, 91, 75, 96, 96, 82,
+  88, 93, 82, 92, 87, 85, 96, 80, 83, 92,
+  84, 98, 86, 96, 90, 78, 54, 83, 83, 75,
+  83, 82, 85, 99, 87, 84, 80, 86, 86, 81,
+  89, 95, 75, 81, 77, 79, 90, 81, 92, 85,
+  86, 87, 95, 73, 90, 86, 82, 83, 96, 90,
+  82, 71, 97, 92, 99, 85, 81, 83, 84, 88,
+  107, 96, 78, 79, 66, 88, 85, 88, 83, 85,
+  93, 90, 92, 80, 70, 82, 99, 91, 85, 85,
+  80, 65, 95, 85, 81, 84, 101, 83, 84, 87,
+  89, 77, 83, 84, 93, 78, 92, 84, 94, 94,
+  87, 80, 90, 84, 78, 90, 81, 76, 74, 81,
+  89, 88, 74, 84, 79, 83, 77, 94, 92, 81,
+  84, 78, 85, 75, 73, 75, 89, 94, 68, 93,
+  94, 73, 84, 86, 84, 87, 80, 75, 89, 84,
+  81, 77, 90, 81, 60, 81, 86, 102, 82, 86,
+  76, 87, 77, 64, 68, 85, 82, 81, 69, 86,
+  87, 90, 65, 110, 87, 86, 92, 74, 79, 74,
+  73, 82, 99, 79, 60, 95, 57, 93, 83, 85,
+  104, 90, 100, 79, 78, 79, 92, 80, 101, 103,
+  82, 76, 64, 86, 96, 86, 85, 91, 101, 89,
+  89, 79, 89, 82, 83, 91, 84, 87, 82, 64,
+  79, 86, 80, 85, 103, 77, 83, 79, 83, 79,
+  88, 89, 84, 64, 91, 82, 80, 98, 90, 70,
+  88, 88, 82, 89, 80, 84, 71, 84, 82, 91,
+  63, 84, 73, 78, 75, 88, 74, 80, 81, 74,
+  82, 61, 69, 68, 94, 89, 69, 86, 88, 78,
+  88, 95, 84, 88, 83, 71, 80, 83, 80, 63,
+  93, 85, 69, 70, 71, 105, 72, 79, 73, 86,
+  81, 67, 59, 71, 80, 79, 66, 73, 81, 90,
+  69, 107, 81, 83, 91, 76, 76, 63, 74, 80,
+  93, 76, 77, 96, 63, 91, 86, 86, 109, 90,
+  97, 77, 73, 80, 89, 96, 105, 92, 77, 79,
+  66, 86, 87, 85, 86, 84, 90, 86, 98, 84,
+  95, 82, 82, 90, 77, 86, 83, 62, 81, 89,
+  84, 79, 99, 80, 90, 88, 85, 76, 90, 85,
+  92, 73, 71, 86, 92, 91, 89, 65, 93, 83,
+  80, 87, 84, 84, 76, 87, 96, 87, 74, 82,
+  76, 80, 74, 96, 90, 79, 85, 86, 84, 81,
+  78, 73, 88, 94, 70, 88, 91, 89, 87, 84,
+  87, 85, 85, 67, 89, 83, 74, 77, 90, 76,
+  66, 83, 84, 99, 83, 82, 76, 86, 83, 71,
+  64, 77, 78, 80, 69, 88, 88, 87, 67, 105,
+  77, 84, 89, 83, 77, 78, 86, 79, 93, 79,
+  79, 93, 63, 92, 83, 87, 105, 90, 75, 92,
+  76, 96, 86, 72, 84, 97, 91, 81, 67, 86,
+  77, 71, 73, 102, 81, 82, 89, 84, 70, 84,
+  78, 90, 83, 78, 88, 81, 87, 81, 73, 88,
+  90, 75, 70, 85, 87, 75, 102, 84, 78, 73,
+  80, 78, 72, 81, 84, 88, 87, 81, 75, 86,
+  75, 76, 78, 87, 81, 82, 94, 82, 84, 83,
+  71, 79, 95, 71, 93, 93, 93, 85, 77, 82,
+  91, 101, 74, 88, 79, 80, 77, 76, 84, 83,
+  94, 95, 84, 82, 81, 84, 85, 88, 76, 89,
+  76, 98, 86, 75, 76, 80, 80, 94, 64, 89,
+  100, 82, 78, 121, 75, 83, 64, 83, 75, 70,
+  77, 75, 90, 95, 76, 76, 86, 84, 81, 75,
+  85, 90, 87, 78, 91, 91, 75, 86, 83, 101,
+  89, 69, 70, 97, 111, 85, 74, 89, 78, 82,
+  74, 99, 84, 80, 97, 79, 83, 87, 65, 90,
+  81, 71, 87, 96, 97, 79, 70, 93, 92, 76,
+  73, 80, 80, 81, 86, 72, 66, 63, 77, 82,
+  59, 83, 78, 84, 79, 83, 73, 94, 81, 76,
+  82, 84, 79, 74, 83, 79, 87, 81, 64, 84,
+  80, 61, 97, 95, 100, 85, 73, 66, 101, 104,
+  74, 83, 73, 87, 84, 63, 82, 83, 104, 96,
+  86, 84, 75, 88, 79, 80, 92, 82, 61, 93,
+  91, 67, 86, 78, 76, 116, 64, 93, 109, 78,
+  68, 137, 72, 90, 68, 70, 67, 67, 74, 75,
+  93, 90, 77, 75, 75, 88, 84, 65, 93, 85,
+  85, 74, 91, 97, 77, 77, 74, 93, 90, 79,
+  84, 99, 97, 81, 69, 86, 78, 100, 78, 102,
+  81, 81, 90, 82, 84, 86, 71, 91, 74, 81,
+  91, 84, 82, 77, 80, 87, 97, 82, 83, 91,
+  82, 80, 71, 83, 75, 77, 72, 81, 70, 83,
+  86, 83, 89, 86, 76, 91, 83, 79, 82, 77,
+  84, 79, 93, 79, 81, 84, 71, 78, 87, 71,
+  87, 97, 97, 89, 68, 78, 91, 99, 77, 81,
+  74, 84, 85, 73, 86, 82, 91, 84, 91, 83,
+  75, 83, 85, 82, 79, 80, 78, 97, 86, 78,
+  77, 81, 84, 98, 64, 94, 96, 81, 82, 122,
+  75, 85, 69, 81, 69, 69, 75, 86, 85, 98,
+  80, 75, 83, 86, 86, 73, 91, 89, 86, 76,
+  94, 97, 62, 97, 95, 83, 77, 89, 77, 83,
+  98, 81, 81, 91, 84, 84, 66, 92, 84, 79,
+  94, 97, 80, 92, 75, 79, 69, 71, 90, 87,
+  81, 80, 88, 85, 71, 72, 72, 98, 79, 75,
+  95, 79, 78, 73, 78, 84, 69, 67, 83, 93,
+  87, 76, 88, 93, 75, 76, 72, 83, 78, 82,
+  107, 80, 88, 89, 89, 69, 93, 72, 83, 99,
+  91, 85, 70, 100, 81, 92, 85, 82, 87, 93,
+  75, 82, 83, 87, 95, 114, 98, 71, 88, 101,
+  80, 93, 89, 75, 79, 88, 81, 86, 76, 81,
+  86, 97, 80, 79, 100, 89, 86, 94, 80, 95,
+  81, 69, 75, 66, 67, 89, 100, 103, 82, 88,
+  74, 91, 82, 84, 99, 80, 98, 83, 83, 89,
+  44, 89, 86, 80, 81, 85, 67, 79, 103, 86,
+  95, 92, 83, 97, 65, 85, 81, 83, 87, 103,
+  77, 99, 75, 79, 66, 75, 90, 100, 99, 83,
+  93, 81, 72, 78, 82, 88, 84, 79, 97, 67,
+  86, 83, 78, 87, 61, 63, 83, 102, 79, 74,
+  88, 101, 77, 68, 72, 100, 70, 77, 116, 85,
+  93, 90, 78, 79, 97, 80, 86, 110, 100, 78,
+  86, 101, 77, 94, 88, 73, 89, 95, 88, 68,
+  76, 88, 91, 101, 115, 72, 83, 114, 72, 84,
+  97, 82, 90, 82, 82, 85, 75, 85, 90, 112,
+  82, 92, 111, 90, 90, 114, 77, 103, 82, 64,
+  73, 73, 65, 87, 104, 118, 81, 89, 71, 90,
+  86, 77, 97, 79, 92, 81, 85, 97, 67, 77,
+  72, 87, 82, 76, 79, 93, 101, 83, 87, 89,
+  85, 92, 75, 88, 81, 84, 88, 95, 79, 83,
+  84, 76, 66, 81, 92, 89, 80, 77, 92, 81,
+  75, 74, 76, 99, 80, 81, 76, 76, 76, 81,
+  80, 85, 67, 65, 87, 100, 91, 79, 89, 81,
+  83, 77, 77, 88, 76, 82, 111, 80, 82, 82,
+  89, 65, 92, 76, 78, 101, 94, 75, 94, 100,
+  87, 95, 87, 85, 85, 87, 83, 82, 82, 84,
+  87, 92, 96, 74, 87, 94, 80, 90, 89, 78,
+  83, 86, 91, 90, 75, 85, 87, 93, 77, 98,
+  99, 88, 89, 98, 78, 94, 81, 71, 72, 66,
+  71, 93, 89, 101, 80, 88, 78, 82, 93, 78,
+  104, 83, 96, 79, 85, 89, 94, 73, 98, 94,
+  70, 75, 88, 73, 77, 74, 83, 82, 96, 81,
+  81, 85, 77, 68, 91, 85, 90, 87, 86, 86,
+  91, 63, 100, 84, 92, 73, 107, 99, 78, 93,
+  85, 70, 90, 89, 73, 79, 75, 107, 68, 95,
+  81, 81, 91, 83, 73, 82, 75, 94, 83, 74,
+  76, 101, 70, 72, 84, 95, 84, 86, 77, 74,
+  79, 74, 102, 75, 85, 72, 68, 87, 83, 105,
+  77, 63, 82, 70, 84, 75, 92, 96, 97, 86,
+  110, 76, 85, 78, 91, 80, 73, 80, 85, 88,
+  66, 83, 91, 75, 88, 74, 72, 91, 79, 83,
+  92, 85, 77, 88, 86, 77, 94, 79, 67, 83,
+  90, 90, 72, 90, 94, 75, 87, 90, 86, 72,
+  78, 73, 85, 103, 75, 82, 87, 93, 76, 60,
+  85, 77, 76, 77, 80, 76, 86, 97, 89, 91,
+  71, 70, 80, 84, 72, 68, 70, 91, 91, 67,
+  106, 84, 102, 69, 109, 95, 79, 92, 76, 61,
+  98, 101, 99, 76, 81, 95, 78, 95, 81, 70,
+  94, 67, 70, 76, 81, 87, 79, 76, 69, 92,
+  57, 76, 88, 99, 87, 103, 90, 77, 71, 78,
+  103, 69, 92, 79, 77, 89, 81, 109, 76, 67,
+  81, 65, 93, 62, 99, 95, 86, 79, 101, 91,
+  75, 79, 95, 75, 80, 78, 94, 88, 71, 86,
+  87, 80, 101, 57, 70, 87, 86, 83, 93, 86,
+  85, 94, 87, 71, 88, 86, 65, 71, 89, 104,
+  63, 88, 91, 71, 89, 89, 81, 74, 78, 80,
+  83, 91, 88, 87, 77, 95, 76, 86, 87, 79,
+  80, 76, 83, 81, 103, 84, 83, 80, 77, 71,
+  89, 86, 66, 76, 76, 83, 93, 66, 105, 85,
+  83, 76, 98, 94, 75, 84, 82, 79, 90, 93,
+  89, 85, 78, 100, 87, 91, 85, 81, 82, 88,
+  68, 85, 77, 85, 83, 84, 79, 75, 64, 77,
+  87, 95, 84, 91, 83, 69, 78, 74, 95, 79,
+  79, 89, 85, 91, 85, 109, 79, 65, 79, 85,
+  73, 71, 92, 84, 94, 77, 103, 89, 77, 75,
+  91, 77, 75, 74, 86, 85, 74, 82, 86, 76,
+  101, 74, 74, 87, 82, 84, 93, 90, 84, 91,
+  90, 80, 70, 75, 70, 83, 95, 87, 69, 90,
+  91, 79, 93, 89, 81, 79, 76, 70, 86, 98,
+  64, 81, 103, 82, 88, 63, 71, 69, 93, 87,
+  78, 100, 95, 107, 68, 72, 78, 68, 78, 81,
+  92, 89, 79, 80, 79, 70, 99, 75, 105, 83,
+  87, 93, 76, 81, 78, 91, 76, 95, 69, 79,
+  87, 78, 73, 81, 85, 98, 68, 75, 92, 81,
+  83, 91, 88, 77, 76, 69, 68, 63, 93, 76,
+  74, 100, 82, 86, 74, 103, 81, 94, 75, 100,
+  56, 71, 84, 87, 71, 90, 75, 84, 91, 76,
+  87, 75, 80, 78, 91, 82, 84, 88, 74, 92,
+  86, 81, 80, 78, 80, 88, 77, 74, 78, 84,
+  78, 73, 86, 82, 92, 81, 80, 83, 73, 76,
+  104, 59, 69, 93, 98, 113, 107, 82, 94, 66,
+  92, 95, 77, 85, 92, 93, 75, 83, 36, 90,
+  72, 85, 86, 71, 60, 78, 98, 97, 68, 92,
+  42, 86, 72, 74, 68, 75, 91, 90, 67, 57,
+  87, 91, 71, 80, 107, 72, 107, 66, 67, 86,
+  73, 81, 73, 78, 62, 84, 71, 57, 86, 55,
+  63, 70, 90, 100, 76, 57, 107, 70, 94, 66,
+  84, 81, 94, 80, 81, 57, 88, 78, 69, 118,
+  99, 56, 92, 83, 72, 91, 67, 130, 78, 63,
+  100, 67, 89, 116, 76, 66, 104, 64, 86, 78,
+  69, 87, 65, 74, 93, 94, 56, 80, 112, 95,
+  64, 72, 117, 75, 85, 71, 76, 75, 75, 112,
+  95, 79, 116, 81, 110, 81, 80, 60, 89, 61,
+  92, 94, 82, 95, 110, 68, 64, 56, 90, 87,
+  71, 114, 100, 102, 70, 59, 69, 94, 58, 78,
+  82, 78, 77, 75, 93, 86, 82, 99, 109, 70,
+  73, 73, 75, 66, 83, 82, 68, 73, 79, 81,
+  78, 77, 101, 82, 101, 78, 81, 90, 80, 88,
+  87, 95, 78, 100, 114, 80, 96, 80, 93, 86,
+  79, 84, 61, 87, 88, 82, 81, 86, 90, 82,
+  88, 95, 78, 71, 92, 78, 75, 106, 83, 86,
+  77, 111, 69, 90, 72, 102, 102, 78, 86, 82,
+  71, 87, 77, 70, 106, 73, 93, 77, 75, 88,
+  96, 86, 89, 81, 77, 96, 97, 84, 82, 80,
+  80, 79, 82, 76, 103, 84, 77, 108, 88, 82,
+  95, 83, 91, 86, 81, 80, 78, 60, 76, 84,
+  83, 85, 72, 81, 92, 70, 88, 95, 75, 90,
+  91, 87, 75, 79, 73, 95, 101, 72, 86, 83,
+  89, 85, 89, 75, 76, 86, 87, 78, 92, 77,
+  80, 81, 76, 84, 63, 83, 80, 73, 86, 86,
+  75, 78, 83, 91, 77, 87, 99, 78, 75, 100,
+  87, 90, 96, 85, 81, 80, 76, 91, 94, 99,
+  72, 75, 88, 87, 83, 86, 83, 79, 80, 98,
+  85, 79, 96, 78, 79, 90, 86, 103, 73, 110,
+  77, 90, 78, 88, 97, 68, 92, 75, 73, 95,
+  80, 88, 83, 95, 88, 83, 87, 84, 94, 78,
+  83, 79, 87, 112, 85, 78, 79, 93, 104, 81,
+  76, 93, 100, 76, 89, 61, 82, 89, 84, 93,
+  74, 86, 84, 101, 84, 84, 89, 87, 82, 78,
+  115, 81, 93, 80, 85, 89, 81, 88, 80, 83,
+  81, 95, 68, 106, 92, 74, 98, 96, 79, 99,
+  97, 72, 80, 75, 62, 84, 80, 85, 72, 76,
+  91, 80, 62, 64, 86, 78, 86, 103, 62, 82,
+  74, 56, 88, 90, 81, 86, 66, 94, 79, 73,
+  75, 72, 72, 71, 57, 86, 106, 105, 85, 79,
+  106, 80, 94, 82, 81, 84, 78, 83, 113, 81,
+  95, 79, 70, 89, 95, 73, 72, 95, 67, 89,
+  74, 73, 92, 60, 88, 75, 83, 114, 77, 81,
+  61, 105, 86, 91, 97, 85, 89, 75, 92, 82,
+  86, 114, 96, 84, 70, 90, 118, 70, 79, 86,
+  85, 83, 83, 69, 99, 86, 83, 72, 95, 78,
+  85, 97, 80, 75, 113, 91, 77, 73, 95, 67,
+  74, 70, 93, 75, 87, 121, 94, 78, 75, 87,
+  80, 87, 97, 74, 90, 85, 92, 85, 85, 74,
+  81, 86, 90, 90, 92, 71, 73, 79, 78, 88,
+  78, 81, 84, 79, 82, 85, 76, 80, 75, 67,
+  80, 86, 99, 92, 95, 100, 85, 86, 69, 81,
+  82, 83, 66, 95, 92, 105, 74, 94, 91, 92,
+  77, 90, 82, 79, 82, 78, 84, 75, 94, 74,
+  77, 89, 84, 104, 78, 105, 74, 87, 82, 94,
+  108, 72, 87, 79, 69, 85, 83, 78, 82, 96,
+  91, 83, 76, 92, 99, 77, 90, 81, 84, 108,
+  85, 78, 81, 91, 93, 83, 77, 90, 91, 78,
+  89, 87, 83, 89, 83, 87, 79, 80, 80, 91,
+  90, 82, 87, 89, 92, 70, 70, 80, 91, 76,
+  96, 88, 93, 90, 77, 81, 79, 94, 85, 73,
+  87, 92, 96, 84, 89, 86, 72, 92, 91, 64,
+  61, 93, 89, 74, 85, 88, 96, 87, 82, 68,
+  91, 81, 106, 107, 82, 86, 93, 76, 77, 92,
+  93, 76, 70, 79, 80, 79, 83, 100, 83, 73,
+  75, 66, 93, 72, 69, 73, 94, 78, 71, 74,
+  67, 73, 78, 70, 83, 90, 74, 88, 84, 71,
+  93, 79, 95, 87, 81, 96, 77, 90, 76, 77,
+  86, 85, 82, 87, 94, 79, 101, 98, 69, 101,
+  97, 96, 64, 86, 97, 68, 80, 89, 90, 90,
+  97, 113, 78, 89, 75, 110, 80, 89, 88, 63,
+  81, 88, 91, 77, 76, 68, 77, 104, 82, 85,
+  95, 91, 71, 75, 89, 84, 60, 65, 97, 98,
+  95, 84, 62, 89, 90, 82, 82, 82, 75, 89,
+  99, 78, 85, 75, 75, 93, 96, 75, 67, 91,
+  92, 72, 89, 86, 97, 82, 83, 68, 87, 87,
+  100, 104, 75, 86, 88, 74, 79, 91, 90, 80,
+  65, 75, 79, 77, 81, 97, 85, 77, 73, 73,
+  99, 73, 69, 78, 89, 80, 66, 73, 75, 74,
+  80, 73, 78, 90, 76, 77, 92, 74, 88, 82,
+  85, 84, 75, 95, 79, 84, 78, 83, 82, 80,
+  84, 81, 99, 65, 102, 99, 71, 101, 95, 81,
+  68, 86, 94, 68, 80, 96, 83, 91, 99, 108,
+  75, 91, 81, 115, 79, 87, 80, 65, 76, 90,
+  92, 77, 74, 67, 75, 105, 82, 86, 92, 89,
+  73, 81, 73, 84, 59, 70, 89, 102, 89, 80,
+  68, 83, 91, 78, 83, 84, 78, 92, 94, 84,
+  85, 81, 75, 92, 93, 67, 70, 87, 87, 76,
+  88, 85, 94, 88, 79, 71, 91, 84, 91, 97,
+  80, 88, 90, 77, 76, 95, 97, 78, 78, 90,
+  84, 81, 81, 96, 85, 76, 77, 76, 92, 76,
+  70, 90, 93, 79, 73, 76, 71, 74, 78, 76,
+  87, 83, 76, 82, 79, 71, 92, 79, 98, 85,
+  78, 99, 80, 85, 88, 74, 85, 82, 87, 86,
+  96, 71, 99, 92, 70, 98, 96, 91, 68, 84,
+  94, 74, 79, 94, 91, 103, 94, 112, 81, 90,
+  75, 105, 79, 92, 88, 78, 79, 88, 91, 78,
+  83, 72, 75, 101, 82, 87, 96, 94, 68, 76,
+  79, 84, 61, 68, 86, 94, 91, 84, 63, 87,
+  92, 80, 87, 72, 85, 88, 103, 88, 93, 92,
+  76, 90, 85, 69, 64, 91, 93, 83, 87, 87,
+  93, 91, 83, 67, 86, 84, 104, 103, 83, 86,
+  89, 73, 83, 91, 92, 82, 79, 83, 78, 79,
+  77, 92, 84, 82, 78, 75, 100, 69, 74, 76,
+  90, 77, 77, 71, 70, 77, 81, 73, 77, 92,
+  78, 85, 84, 76, 84, 86, 90, 91, 79, 77,
+  79, 81, 82, 80, 87, 81, 85, 86, 90, 83,
+  89, 107, 67, 93, 95, 80, 68, 82, 89, 74,
+  81, 81, 81, 82, 99, 112, 78, 100, 81, 109,
+  88, 81, 77, 63, 81, 90, 86, 70, 80, 72,
+  71, 95, 81, 82, 93, 87, 66, 83, 85, 86,
+  66, 66, 89, 98, 95, 84, 65, 91, 97, 77,
+  89, 77, 77, 85, 102, 78, 93, 79, 79, 90,
+  89, 78, 65, 89, 99, 80, 92, 88, 94, 81,
+  84, 68, 81, 91, 106, 93, 78, 84, 84, 78,
+  82, 89, 86, 81, 76, 74, 80, 77, 82, 89,
+  86, 90, 77, 79, 102, 73, 81, 80, 83, 79,
+  77, 73, 77, 76, 84, 74, 75, 93, 82, 76,
+  88, 79, 80, 94, 82, 94, 77, 73, 81, 80,
+  77, 81, 85, 78, 89, 77, 94, 69, 89, 109,
+  68, 96, 93, 75, 72, 80, 87, 74, 82, 83,
+  71, 80, 96, 103, 72, 99, 88, 112, 86, 75,
+  74, 63, 77, 91, 85, 72, 77, 73, 63, 97,
+  81, 83, 88, 83, 72, 86, 74, 89, 68, 71,
+  74, 100, 84, 75, 70, 89, 97, 75, 81, 86,
+  84, 88, 99, 83, 89, 86, 80, 88, 90, 70,
+  66, 86, 88, 88, 88, 86, 92, 87, 81, 70,
+  88, 87, 99, 95, 79, 85, 86, 81, 84, 92,
+  96, 83, 78, 87, 80, 80, 84, 90, 84, 85,
+  76, 81, 96, 75, 78, 94, 88, 79, 80, 77,
+  73, 78, 81, 72, 81, 89, 83, 81, 80, 75,
+  84, 86, 94, 90, 81, 81, 79, 81, 84, 74,
+  86, 80, 85, 89, 90, 72, 90, 103, 70, 93,
+  97, 89, 71, 81, 92, 76, 83, 91, 85, 85,
+  94, 110, 78, 97, 82, 103, 81, 84, 84, 69,
+  79, 89, 84, 71, 80, 73, 70, 94, 82, 84,
+  94, 88, 66, 80, 82, 86, 68, 71, 77, 95,
+  95, 85, 63, 90, 96, 78, 89, 70, 82, 81,
+  91, 90, 96, 103, 80, 85, 81, 74, 66, 85,
+  88, 85, 85, 82, 86, 87, 80, 72, 83, 77,
+  99, 100, 95, 86, 89, 79, 79, 87, 99, 85,
+  84, 87, 79, 81, 74, 87, 81, 88, 76, 79,
+  93, 70, 80, 76, 89, 75, 72, 77, 67, 74,
+  85, 76, 82, 78, 82, 82, 78, 74, 84, 74,
+  100, 92, 79, 80, 80, 94, 93, 80, 83, 84,
+  88, 85, 88, 77, 92, 99, 66, 86, 95, 83,
+  65, 80, 87, 81, 87, 83, 85, 82, 92, 117,
+  79, 96, 71, 106, 86, 84, 91, 69, 82, 90,
+  83, 73, 78, 75, 79, 97, 81, 80, 94, 84,
+  70, 83, 83, 95, 71, 68, 87, 95, 98, 81,
+  59, 92, 88, 84, 90, 76, 79, 78, 90, 73,
+  99, 92, 83, 86, 86, 82, 65, 83, 92, 85,
+  86, 81, 91, 83, 79, 71, 79, 83, 103, 92,
+  91, 85, 85, 87, 75, 88, 98, 79, 82, 76,
+  80, 82, 77, 86, 81, 89, 76, 80, 92, 71,
+  83, 77, 87, 79, 74, 78, 73, 76, 84, 78,
+  81, 82, 83, 82, 77, 76, 81, 77, 88, 92,
+  81, 84, 85, 90, 78, 80, 83, 83, 94, 86,
+  89, 68, 92, 102, 71, 90, 96, 79, 69, 78,
+  87, 79, 86, 84, 81, 82, 95, 114, 71, 97,
+  79, 105, 88, 80, 89, 68, 80, 90, 83, 73,
+  77, 75, 79, 98, 80, 81, 89, 81, 75, 81,
+  74, 98, 74, 71, 77, 95, 97, 73, 66, 93,
+  87, 81, 83, 83, 86, 81, 92, 79, 92, 93,
+  84, 85, 84, 77, 66, 85, 84, 84, 84, 80,
+  86, 89, 80, 73, 90, 82, 99, 89, 88, 83,
+  86, 86, 76, 91, 98, 83, 77, 88, 81, 82,
+  85, 83, 81, 83, 77, 83, 93, 76, 83, 90,
+  86, 77, 74, 87, 70, 76, 88, 74, 84, 76,
+  88, 78, 77, 73, 85, 80, 107, 91, 80, 79,
+  79, 96, 84, 74, 82, 82, 89, 86, 89, 73,
+  89, 92, 71, 87, 97, 89, 70, 81, 88, 88,
+  86, 87, 86, 84, 89, 113, 79, 92, 76, 101,
+  85, 85, 95, 72, 80, 88, 84, 76, 79, 78,
+  79, 92, 79, 81, 92, 86, 69, 82, 87, 95,
+  73, 73, 80, 90, 97, 81, 57, 91, 89, 80,
+  73, 104, 73, 88, 71, 84, 87, 87, 84, 86,
+  74, 76, 79, 71, 87, 74, 79, 83, 88, 86,
+  97, 82, 91, 92, 103, 79, 88, 85, 98, 112,
+  74, 85, 83, 79, 78, 84, 89, 88, 148, 90,
+  84, 93, 67, 91, 86, 83, 87, 76, 84, 76,
+  86, 76, 90, 77, 75, 114, 76, 78, 83, 86,
+  85, 75, 96, 83, 66, 76, 84, 83, 76, 83,
+  81, 103, 78, 83, 91, 75, 86, 89, 79, 78,
+  83, 81, 85, 99, 78, 94, 84, 98, 84, 90,
+  87, 70, 73, 79, 80, 80, 90, 78, 73, 89,
+  80, 71, 96, 94, 87, 85, 85, 88, 88, 77,
+  80, 79, 76, 84, 79, 99, 77, 85, 85, 91,
+  81, 87, 84, 74, 80, 91, 89, 88, 66, 89,
+  63, 79, 90, 74, 74, 86, 82, 83, 77, 75,
+  71, 63, 75, 72, 87, 70, 76, 76, 92, 77,
+  84, 89, 101, 69, 81, 81, 120, 106, 78, 79,
+  81, 74, 68, 100, 84, 78, 156, 89, 87, 78,
+  79, 92, 98, 93, 83, 79, 86, 73, 82, 78,
+  84, 77, 67, 104, 76, 80, 94, 81, 84, 82,
+  90, 100, 50, 79, 79, 82, 81, 83, 116, 92,
+  86, 92, 86, 80, 77, 83, 88, 75, 77, 74,
+  85, 80, 85, 97, 82, 110, 73, 81, 75, 88,
+  81, 81, 82, 73, 87, 80, 78, 95, 83, 82,
+  90, 95, 88, 77, 71, 87, 82, 73, 77, 81,
+  70, 77, 72, 92, 72, 85, 76, 87, 88, 95,
+  81, 72, 77, 83, 84, 91, 68, 87, 79, 96,
+  68, 78, 87, 95, 87, 89, 75, 75, 77, 68,
+  86, 91, 83, 93, 84, 82, 90, 74, 92, 88,
+  97, 78, 83, 90, 61, 84, 82, 84, 89, 70,
+  77, 94, 57, 85, 93, 87, 96, 72, 77, 90,
+  85, 93, 90, 77, 71, 89, 84, 90, 83, 78,
+  91, 74, 81, 96, 90, 87, 83, 71, 83, 68,
+  91, 65, 85, 86, 78, 98, 70, 79, 109, 88,
+  83, 75, 77, 77, 81, 73, 102, 76, 76, 89,
+  77, 96, 88, 67, 77, 82, 81, 87, 84, 78,
+  82, 74, 89, 79, 70, 80, 85, 83, 76, 96,
+  83, 89, 85, 87, 78, 73, 71, 93, 81, 92,
+  79, 78, 87, 84, 81, 81, 88, 83, 100, 92,
+  96, 82, 83, 78, 84, 102, 76, 95, 54, 88,
+  95, 89, 95, 81, 78, 77, 87, 70, 93, 81,
+  85, 89, 86, 92, 100, 88, 106, 97, 100, 83,
+  89, 87, 90, 93, 76, 86, 81, 78, 89, 78,
+  80, 80, 98, 84, 82, 78, 68, 84, 78, 91,
+  85, 80, 75, 85, 79, 86, 88, 73, 95, 95,
+  77, 89, 85, 90, 81, 72, 89, 73, 81, 72,
+  82, 78, 79, 83, 85, 78, 84, 87, 92, 75,
+  84, 90, 77, 78, 96, 72, 81, 98, 75, 89,
+  76, 78, 87, 94, 91, 77, 80, 81, 87, 78,
+  82, 70, 75, 86, 82, 67, 80, 88, 80, 87,
+  88, 85, 83, 89, 73, 80, 89, 90, 71, 73,
+  80, 81, 83, 82, 80, 76, 94, 92, 81, 87,
+  77, 78, 76, 105, 61, 83, 75, 78, 78, 77,
+  88, 82, 78, 75, 71, 58, 79, 68, 87, 70,
+  75, 80, 91, 76, 91, 89, 100, 74, 84, 83,
+  119, 97, 76, 84, 77, 73, 73, 92, 84, 79,
+  149, 83, 86, 73, 75, 83, 87, 92, 85, 71,
+  85, 74, 81, 81, 87, 78, 76, 99, 67, 79,
+  83, 83, 85, 85, 91, 93, 57, 73, 74, 72,
+  85, 67, 108, 88, 78, 89, 86, 75, 85, 87,
+  90, 75, 74, 74, 82, 90, 78, 93, 75, 105,
+  73, 84, 78, 79, 84, 80, 83, 79, 87, 81,
+  74, 83, 75, 75, 90, 91, 79, 72, 69, 75,
+  74, 75, 77, 78, 71, 80, 65, 82, 61, 86,
+  76, 84, 87, 85, 84, 67, 69, 83, 80, 80,
+  78, 87, 57, 83, 80, 75, 77, 82, 80, 82,
+  76, 76, 75, 67, 74, 75, 89, 83, 84, 79,
+  91, 74, 86, 85, 97, 77, 84, 81, 104, 88,
+  90, 93, 82, 70, 75, 105, 90, 82, 135, 87,
+  98, 79, 84, 83, 92, 93, 90, 75, 91, 80,
+  72, 83, 85, 78, 81, 75, 72, 82, 85, 84,
+  91, 93, 93, 96, 62, 72, 72, 93, 92, 84,
+  92, 90, 93, 92, 86, 80, 76, 81, 96, 76,
+  82, 80, 80, 79, 85, 89, 78, 98, 63, 72,
+  79, 92, 86, 78, 88, 73, 87, 87, 78, 80,
+  78, 79, 82, 95, 86, 73, 70, 77, 79, 67,
+  81, 94, 74, 83, 71, 94, 72, 90, 77, 89,
+  93, 93, 85, 71, 78, 86, 86, 81, 98, 96,
+  84, 81, 59, 89, 95, 83, 80, 85, 78, 86,
+  93, 82, 83, 83, 85, 85, 88, 102, 99, 89,
+  106, 88, 96, 89, 82, 88, 80, 94, 86, 86,
+  83, 83, 89, 85, 96, 88, 109, 88, 91, 83,
+  73, 91, 83, 87, 80, 82, 75, 87, 86, 88,
+  79, 77, 103, 101, 86, 103, 93, 88, 83, 79,
+  95, 81, 87, 92, 78, 85, 73, 92, 102, 95,
+  80, 80, 86, 82, 80, 89, 75, 82, 100, 78,
+  76, 90, 92, 90, 74, 85, 85, 82, 81, 75,
+  82, 73, 85, 87, 78, 75, 75, 90, 77, 79,
+  83, 94, 87, 94, 85, 92, 86, 92, 79, 82,
+  88, 84, 75, 91, 87, 89, 92, 93, 80, 89,
+  87, 92, 91, 91, 83, 78, 86, 106, 83, 91,
+  59, 96, 90, 81, 88, 84, 81, 81, 74, 81,
+  85, 83, 89, 88, 83, 95, 93, 71, 103, 95,
+  91, 80, 89, 84, 85, 85, 85, 87, 87, 75,
+  83, 88, 87, 82, 91, 76, 85, 79, 76, 77,
+  81, 94, 84, 77, 80, 90, 93, 80, 85, 76,
+  89, 75, 75, 95, 79, 90, 87, 83, 93, 79,
+  88, 67, 81, 80, 80, 84, 87, 96, 85, 83,
+  86, 81, 86, 92, 84, 77, 90, 78, 83, 97,
+  78, 91, 82, 83, 89, 90, 90, 76, 82, 80,
+  89, 79, 87, 81, 74, 79, 80, 82, 83, 95,
+  87, 87, 86, 73, 80, 82, 79, 85, 81, 89,
+  74, 87, 80, 88, 79, 84, 90, 83, 91, 78,
+  80, 93, 75, 77, 79, 90, 68, 92, 74, 86,
+  82, 74, 80, 85, 83, 75, 86, 79, 73, 71,
+  89, 79, 84, 90, 85, 65, 98, 93, 93, 76,
+  92, 84, 86, 85, 98, 85, 81, 78, 70, 99,
+  89, 90, 120, 86, 92, 84, 76, 73, 77, 88,
+  96, 83, 93, 77, 81, 79, 83, 78, 73, 63,
+  74, 85, 80, 97, 93, 91, 92, 100, 79, 63,
+  80, 87, 95, 86, 93, 107, 80, 86, 87, 79,
+  79, 86, 87, 76, 80, 78, 85, 92, 94, 90,
+  80, 95, 78, 86, 82, 85, 86, 86, 83, 75,
+  90, 86, 77, 82, 72, 69, 86, 96, 87, 81,
+  71, 74, 81, 62, 83, 86, 77, 85, 78, 98,
+  84, 90, 85, 82, 99, 94, 81, 67, 75, 97,
+  79, 82, 107, 92, 78, 92, 85, 88, 78, 84,
+  75, 79, 68, 81, 86, 97, 97, 90, 90, 86,
+  76, 69, 76, 83, 101, 83, 87, 78, 88, 90,
+  90, 88, 83, 80, 75, 108, 89, 83, 85, 88,
+  83, 80, 85, 76, 98, 79, 80, 75, 88, 88,
+  85, 82, 89, 77, 78, 82, 83, 87, 76, 88,
+  82, 81, 81, 85, 83, 82, 87, 88, 84, 78,
+  102, 80, 95, 91, 84, 79, 83, 80, 79, 82,
+  86, 78, 86, 89, 82, 76, 73, 80, 83, 86,
+  89, 72, 65, 85, 82, 99, 80, 74, 90, 84,
+  91, 76, 76, 85, 81, 102, 77, 79, 78, 88,
+  82, 75, 73, 92, 78, 86, 71, 77, 82, 86,
+  86, 88, 74, 75, 94, 83, 88, 88, 87, 73,
+  131, 94, 88, 90, 99, 94, 76, 75, 67, 75,
+  72, 79, 93, 83, 97, 82, 86, 85, 73, 70,
+  81, 85, 88, 84, 110, 79, 94, 82, 91, 85,
+  94, 89, 80, 88, 90, 83, 78, 92, 95, 81,
+  84, 82, 82, 91, 96, 84, 87, 80, 78, 75,
+  83, 79, 78, 85, 86, 79, 66, 85, 82, 78,
+  83, 72, 87, 82, 74, 86, 100, 77, 89, 74,
+  79, 99, 77, 76, 85, 74, 69, 97, 69, 80,
+  84, 92, 95, 71, 75, 88, 79, 91, 83, 76,
+  52, 73, 74, 115, 71, 75, 86, 94, 88, 77,
+  69, 86, 78, 103, 82, 72, 72, 90, 104, 76,
+  85, 93, 77, 80, 78, 87, 84, 96, 90, 81,
+  79, 68, 104, 75, 91, 92, 88, 74, 88, 73,
+  98, 86, 80, 99, 78, 88, 90, 88, 70, 93,
+  69, 84, 92, 89, 90, 79, 75, 83, 95, 78,
+  82, 83, 91, 75, 88, 89, 87, 91, 81, 78,
+  77, 82, 87, 98, 81, 89, 81, 84, 82, 76,
+  73, 89, 78, 78, 83, 79, 92, 80, 88, 82,
+  78, 74, 82, 86, 86, 88, 91, 82, 76, 90,
+  80, 72, 91, 86, 86, 81, 92, 71, 79, 78,
+  86, 75, 82, 85, 85, 89, 72, 73, 83, 95,
+  80, 73, 80, 91, 85, 82, 90, 76, 75, 87,
+  86, 88, 89, 78, 84, 81, 89, 83, 83, 65,
+  82, 98, 81, 79, 83, 85, 80, 85, 87, 81,
+  84, 86, 80, 82, 99, 76, 81, 89, 89, 84,
+  95, 93, 80, 87, 87, 77, 119, 84, 84, 69,
+  97, 74, 72, 87, 69, 81, 73, 78, 75, 108,
+  81, 76, 81, 79, 77, 83, 75, 78, 91, 87,
+  78, 80, 87, 88, 105, 94, 93, 84, 76, 127,
+  91, 83, 112, 84, 72, 74, 84, 76, 99, 86,
+  63, 68, 73, 86, 91, 78, 85, 76, 83, 81,
+  64, 87, 87, 82, 84, 80, 88, 81, 81, 80,
+  90, 81, 80, 90, 99, 67, 107, 83, 79, 75,
+  75, 77, 82, 75, 113, 73, 84, 73, 77, 83,
+  104, 80, 90, 95, 78, 72, 73, 84, 79, 89,
+  91, 74, 75, 78, 81, 83, 81, 100, 94, 99,
+  78, 91, 76, 90, 68, 88, 71, 105, 71, 87,
+  89, 71, 65, 93, 84, 99, 69, 67, 82, 71,
+  83, 90, 78, 70, 148, 82, 97, 82, 119, 78,
+  67, 81, 58, 81, 74, 70, 89, 84, 90, 74,
+  85, 80, 84, 92, 80, 88, 70, 82, 112, 77,
+  84, 75, 103, 105, 101, 92, 81, 125, 85, 93,
+  95, 98, 118, 71, 86, 69, 73, 99, 69, 61,
+  76, 68, 83, 73, 80, 76, 82, 85, 56, 88,
+  75, 86, 75, 93, 101, 72, 80, 84, 69, 81,
+  92, 96, 108, 70, 74, 88, 76, 74, 72, 73,
+  80, 90, 84, 74, 82, 67, 91, 78, 125, 101,
+  79, 106, 72, 68, 67, 75, 63, 110, 76, 80,
+  71, 83, 82, 69, 67, 73, 97, 98, 71, 104,
+  76, 91, 76, 81, 76, 117, 68, 83, 100, 80,
+  84, 100, 84, 86, 68, 61, 81, 64, 86, 99,
+  76, 60, 94, 72, 82, 70, 79, 102, 74, 87,
+  89, 85, 79, 86, 71, 77, 75, 74, 82, 75,
+  77, 86, 97, 82, 73, 87, 87, 73, 87, 87,
+  96, 102, 80, 83, 72, 86, 81, 99, 97, 81,
+  98, 75, 82, 81, 66, 83, 68, 71, 71, 71,
+  86, 89, 89, 82, 84, 74, 75, 88, 92, 81,
+  96, 75, 85, 78, 77, 63, 82, 82, 87, 87,
+  89, 82, 68, 82, 86, 79, 70, 83, 93, 96,
+  79, 75, 78, 80, 75, 76, 87, 87, 83, 94,
+  84, 77, 76, 83, 84, 82, 85, 73, 75, 74,
+  89, 85, 87, 59, 90, 96, 90, 87, 83, 82,
+  71, 98, 78, 87, 84, 87, 89, 92, 102, 76,
+  86, 103, 99, 78, 82, 87, 81, 87, 81, 87,
+  84, 84, 82, 54, 77, 82, 81, 84, 84, 87,
+  80, 90, 78, 94, 73, 71, 68, 78, 82, 73,
+  88, 91, 74, 95, 70, 80, 93, 89, 92, 81,
+  82, 85, 98, 99, 99, 79, 105, 76, 73, 78,
+  83, 67, 94, 78, 64, 90, 71, 61, 86, 108,
+  81, 89, 87, 82, 80, 81, 89, 74, 90, 71,
+  84, 85, 71, 78, 85, 83, 74, 79, 85, 81,
+  92, 68, 93, 80, 73, 93, 88, 85, 116, 68,
+  79, 84, 86, 85, 84, 76, 87, 89, 90, 103,
+  93, 75, 81, 67, 93, 77, 89, 71, 70, 101,
+  90, 81, 85, 93, 91, 67, 80, 95, 100, 102,
+  80, 95, 92, 79, 80, 82, 72, 74, 89, 105,
+  77, 85, 83, 86, 86, 89, 73, 107, 89, 76,
+  79, 60, 79, 74, 76, 84, 75, 84, 78, 86,
+  66, 87, 78, 69, 68, 78, 75, 83, 87, 96,
+  80, 90, 72, 75, 94, 77, 89, 109, 76, 78,
+  85, 102, 91, 80, 107, 71, 92, 72, 90, 62,
+  79, 80, 61, 83, 70, 67, 79, 106, 78, 86,
+  85, 78, 71, 80, 92, 70, 93, 77, 89, 87,
+  79, 83, 83, 81, 74, 87, 79, 94, 81, 68,
+  95, 79, 71, 91, 93, 72, 106, 61, 79, 80,
+  80, 82, 86, 91, 84, 92, 86, 88, 83, 76,
+  84, 67, 94, 71, 84, 71, 74, 87, 85, 76,
+  88, 93, 95, 77, 84, 90, 78, 103, 76, 100,
+  95, 85, 92, 83, 86, 72, 82, 109, 98, 85,
+  74, 84, 77, 98, 74, 105, 83, 84, 77, 63,
+  77, 77, 85, 79, 98, 82, 82, 93, 86, 84,
+  72, 75, 67, 79, 81, 72, 92, 86, 83, 101,
+  75, 82, 88, 92, 84, 111, 80, 85, 98, 89,
+  77, 85, 102, 79, 94, 84, 75, 72, 86, 87,
+  70, 94, 75, 83, 82, 103, 80, 95, 88, 82,
+  86, 86, 89, 75, 88, 80, 82, 79, 68, 68,
+  85, 83, 79, 74, 79, 89, 76, 76, 89, 81,
+  72, 83, 90, 74, 76, 72, 79, 92, 85, 75,
+  88, 85, 75, 86, 98, 91, 90, 78, 76, 76,
+  78, 81, 87, 73, 96, 107, 82, 72, 85, 92,
+  98, 69, 84, 88, 97, 99, 89, 81, 96, 78,
+  75, 79, 84, 67, 93, 93, 118, 84, 91, 93,
+  87, 85, 79, 108, 89, 84, 79, 78, 90, 75,
+  73, 82, 86, 79, 78, 91, 80, 85, 73, 83,
+  75, 84, 76, 99, 84, 73, 100, 87, 77, 89,
+  68, 82, 88, 69, 74, 68, 75, 82, 89, 96,
+  82, 76, 77, 102, 84, 91, 81, 93, 93, 80,
+  84, 87, 79, 81, 80, 98, 87, 67, 88, 74,
+  82, 84, 97, 80, 82, 90, 94, 67, 74, 71,
+  75, 81, 102, 77, 78, 84, 87, 67, 91, 86,
+  79, 95, 88, 96, 95, 93, 87, 78, 84, 86,
+  80, 81, 104, 79, 94, 81, 70, 80, 88, 86,
+  82, 81, 95, 90, 76, 77, 67, 82, 79, 104,
+  76, 78, 84, 76, 78, 80, 76, 92, 76, 83,
+  82, 74, 73, 84, 87, 71, 92, 84, 96, 89,
+  80, 85, 94, 78, 80, 90, 82, 77, 63, 77,
+  94, 85, 73, 77, 82, 92, 103, 69, 87, 92,
+  96, 90, 89, 83, 131, 71, 72, 77, 83, 94,
+  87, 82, 100, 91, 63, 78, 98, 85, 90, 84,
+  82, 70, 64, 91, 77, 67, 84, 76, 81, 83,
+  93, 92, 73, 80, 77, 72, 79, 72, 67, 67,
+  89, 100, 104, 103, 85, 90, 64, 68, 85, 89,
+  91, 90, 72, 100, 67, 89, 80, 79, 187, 105,
+  86, 73, 78, 82, 67, 78, 77, 89, 77, 94,
+  65, 79, 79, 108, 84, 96, 79, 95, 113, 60,
+  86, 56, 81, 109, 93, 84, 107, 68, 97, 69,
+  89, 88, 92, 99, 79, 80, 76, 87, 77, 99,
+  100, 87, 85, 142, 84, 77, 68, 91, 82, 67,
+  93, 87, 87, 85, 80, 115, 67, 70, 85, 75,
+  73, 82, 89, 80, 87, 76, 88, 90, 98, 92,
+  77, 80, 80, 79, 91, 77, 78, 88, 86, 105,
+  92, 105, 67, 79, 80, 83, 89, 81, 84, 78,
+  74, 85, 88, 70, 86, 83, 89, 88, 90, 87,
+  75, 86, 80, 72, 85, 70, 63, 71, 81, 91,
+  103, 94, 86, 89, 67, 60, 67, 83, 86, 83,
+  77, 93, 67, 83, 81, 85, 139, 82, 86, 78,
+  82, 87, 78, 83, 79, 90, 81, 89, 74, 79,
+  91, 112, 83, 90, 87, 91, 107, 66, 81, 71,
+  82, 111, 83, 80, 94, 75, 87, 74, 84, 84,
+  90, 91, 78, 83, 80, 78, 73, 91, 93, 81,
+  79, 114, 89, 79, 80, 92, 83, 65, 88, 87,
+  83, 73, 89, 76, 84, 84, 81, 82, 83, 81,
+  84, 84, 76, 86, 74, 85, 78, 90, 78, 80,
+  77, 93, 83, 94, 72, 81, 85, 71, 79, 72,
+  81, 87, 94, 92, 74, 82, 75, 105, 85, 90,
+  94, 96, 84, 84, 81, 88, 81, 82, 84, 107,
+  86, 72, 84, 69, 83, 87, 96, 80, 76, 85,
+  90, 69, 78, 78, 74, 74, 92, 78, 80, 70,
+  91, 80, 91, 85, 73, 93, 84, 94, 93, 91,
+  95, 76, 84, 80, 83, 80, 104, 87, 100, 79,
+  71, 83, 89, 85, 80, 90, 88, 97, 76, 85,
+  71, 84, 75, 91, 75, 83, 90, 79, 83, 87,
+  83, 90, 72, 82, 78, 79, 81, 81, 74, 72,
+  91, 85, 93, 77, 80, 88, 89, 74, 79, 87,
+  83, 73, 73, 89, 84, 89, 71, 71, 69, 81,
+  97, 74, 76, 78, 82, 95, 81, 81, 97, 81,
+  79, 86, 92, 88, 88, 91, 77, 91, 80, 90,
+  122, 98, 88, 100, 76, 76, 68, 81, 78, 72,
+  61, 89, 86, 77, 101, 96, 73, 86, 81, 70,
+  72, 70, 75, 74, 87, 97, 84, 100, 81, 82,
+  69, 73, 66, 90, 104, 79, 84, 94, 97, 83,
+  88, 91, 132, 106, 105, 73, 78, 79, 81, 81,
+  84, 88, 88, 95, 67, 79, 86, 81, 82, 88,
+  95, 80, 85, 70, 87, 74, 77, 89, 90, 87,
+  87, 98, 83, 76, 80, 76, 72, 99, 78, 84,
+  74, 83, 73, 90, 83, 102, 72, 105, 75, 77,
+  71, 78, 73, 74, 86, 83, 92, 82, 76, 95,
+  73, 81, 81, 80, 74, 72, 73, 75, 89, 76,
+  76, 80, 86, 98, 88, 80, 85, 83, 83, 87,
+  85, 88, 89, 127, 74, 102, 80, 83, 83, 89,
+  83, 95, 85, 82, 75, 80, 80, 72, 71, 84,
+  81, 87, 100, 92, 75, 82, 80, 71, 78, 75,
+  69, 78, 77, 95, 80, 96, 88, 88, 78, 69,
+  65, 89, 97, 88, 69, 94, 92, 85, 84, 96,
+  122, 80, 88, 80, 79, 84, 83, 93, 84, 101,
+  83, 91, 69, 75, 95, 79, 81, 83, 88, 80,
+  91, 76, 82, 81, 81, 89, 84, 84, 82, 99,
+  83, 78, 77, 72, 74, 95, 76, 77, 78, 83,
+  90, 85, 84, 97, 83, 95, 78, 79, 79, 84,
+  75, 71, 85, 86, 82, 78, 84, 93, 86, 75,
+  81, 84, 82, 78, 90, 85, 81, 84, 74, 81,
+  87, 85, 81, 88, 69, 84, 97, 81, 82, 83,
+  79, 80, 78, 79, 83, 83, 76, 80, 81, 84,
+  83, 89, 85, 88, 90, 100, 96, 86, 79, 86,
+  82, 76, 83, 100, 81, 79, 80, 80, 85, 92,
+  88, 84, 85, 82, 87, 84, 87, 90, 85, 80,
+  82, 84, 81, 62, 80, 79, 86, 77, 80, 85,
+  83, 93, 88, 92, 93, 83, 90, 81, 77, 78,
+  90, 85, 95, 80, 72, 87, 84, 82, 95, 97,
+  83, 100, 84, 90, 78, 85, 82, 82, 75, 88,
+  89, 73, 94, 86, 84, 79, 85, 87, 87, 83,
+  90, 75, 81, 78, 79, 82, 88, 81, 88, 89,
+  89, 81, 75, 77, 87, 76, 90, 75, 79, 85,
+  75, 71, 82, 84, 80, 85, 67, 81, 84, 83,
+  84, 84, 73, 91, 89, 92, 84, 84, 81, 75,
+  77, 83, 93, 80, 72, 81, 79, 72, 87, 94,
+  81, 86, 89, 92, 93, 93, 80, 84, 85, 84,
+  82, 100, 84, 72, 84, 80, 90, 93, 90, 78,
+  80, 83, 87, 79, 77, 90, 82, 78, 75, 93,
+  76, 60, 90, 90, 82, 89, 76, 79, 88, 83,
+  91, 92, 93, 77, 89, 77, 81, 81, 83, 90,
+  101, 82, 78, 79, 81, 82, 84, 94, 82, 103,
+  77, 87, 74, 84, 75, 84, 73, 88, 86, 72,
+  80, 91, 82, 78, 81, 82, 74, 80, 82, 79,
+  85, 73, 83, 80, 96, 90, 77, 85, 93, 89,
+  75, 78, 83, 64, 87, 74, 83, 83, 76, 71,
+  80, 82, 74, 86, 65, 82, 85, 87, 87, 85,
+  92, 89, 79, 94, 81, 88, 83, 71, 75, 88,
+  91, 79, 78, 78, 78, 78, 86, 94, 80, 86,
+  89, 90, 100, 89, 77, 91, 82, 81, 79, 95,
+  82, 76, 86, 76, 84, 93, 84, 78, 82, 81,
+  87, 84, 83, 89, 77, 77, 79, 91, 74, 61,
+  90, 87, 82, 90, 81, 82, 82, 87, 89, 92,
+  93, 73, 88, 76, 74, 77, 79, 90, 102, 84,
+  74, 81, 83, 83, 90, 91, 82, 103, 78, 85,
+  77, 84, 77, 84, 77, 86, 90, 66, 81, 88,
+  82, 78, 82, 80, 79, 79, 81, 82, 87, 72,
+  84, 83, 94, 88, 81, 85, 94, 68, 98, 66,
+  82, 81, 78, 73, 82, 83, 70, 84, 86, 80,
+  68, 79, 78, 82, 71, 81, 78, 75, 102, 82,
+  83, 92, 80, 63, 97, 102, 81, 69, 74, 91,
+  96, 77, 79, 84, 91, 84, 82, 77, 89, 72,
+  91, 88, 93, 79, 87, 73, 85, 84, 77, 78,
+  77, 81, 86, 84, 86, 95, 70, 79, 79, 80,
+  100, 90, 88, 96, 82, 99, 73, 102, 96, 97,
+  82, 86, 77, 77, 76, 73, 84, 79, 84, 111,
+  72, 71, 93, 86, 87, 79, 87, 82, 67, 82,
+  84, 74, 85, 94, 90, 88, 91, 93, 72, 98,
+  95, 85, 77, 99, 93, 71, 71, 71, 65, 96,
+  100, 99, 109, 67, 73, 80, 72, 71, 91, 71,
+  88, 107, 81, 80, 97, 79, 85, 67, 85, 71,
+  77, 74, 86, 73, 59, 86, 92, 78, 77, 77,
+  85, 82, 60, 98, 86, 74, 82, 82, 84, 87,
+  91, 51, 101, 106, 75, 77, 75, 81, 103, 69,
+  87, 79, 83, 88, 86, 82, 84, 70, 88, 75,
+  84, 71, 106, 67, 85, 85, 75, 79, 75, 84,
+  88, 81, 91, 86, 62, 75, 81, 85, 88, 88,
+  87, 86, 81, 106, 86, 117, 103, 94, 95, 75,
+  74, 84, 85, 81, 81, 77, 70, 85, 72, 71,
+  83, 92, 91, 85, 98, 93, 64, 84, 86, 80,
+  89, 93, 88, 83, 91, 89, 71, 104, 104, 82,
+  75, 108, 96, 71, 79, 68, 72, 88, 90, 79,
+  75, 62, 63, 81, 69, 71, 82, 83, 84, 104,
+  68, 74, 92, 83, 80, 61, 81, 89, 80, 75,
+  92, 86, 67, 87, 87, 84, 76, 78, 78, 81,
+  80, 105, 90, 74, 73, 80, 83, 93, 92, 66,
+  92, 79, 85, 83, 73, 68, 94, 79, 88, 86,
+  83, 86, 85, 76, 75, 69, 94, 87, 91, 87,
+  84, 74, 84, 86, 78, 81, 79, 85, 86, 89,
+  83, 89, 72, 86, 79, 81, 99, 89, 86, 89,
+  79, 85, 95, 104, 123, 89, 97, 86, 79, 95,
+  86, 77, 83, 83, 79, 81, 75, 73, 92, 87,
+  84, 82, 87, 95, 72, 82, 75, 79, 83, 97,
+  96, 86, 88, 100, 74, 100, 86, 86, 78, 93,
+  92, 74, 81, 73, 67, 102, 85, 95, 82, 74,
+  81, 75, 78, 76, 92, 78, 88, 99, 86, 80,
+  82, 75, 82, 88, 89, 90, 87, 66, 81, 70,
+  71, 78, 87, 81, 78, 86, 73, 88, 69, 85,
+  88, 77, 92, 82, 81, 93, 66, 50, 107, 101,
+  98, 76, 73, 109, 96, 78, 79, 96, 82, 84,
+  84, 87, 97, 81, 97, 85, 93, 95, 93, 75,
+  81, 87, 76, 73, 76, 85, 86, 90, 85, 107,
+  87, 78, 82, 92, 98, 90, 85, 93, 93, 89,
+  91, 78, 75, 91, 76, 74, 77, 71, 78, 73,
+  81, 72, 78, 85, 74, 78, 91, 82, 86, 70,
+  96, 76, 63, 82, 99, 78, 96, 94, 81, 90,
+  77, 97, 81, 100, 99, 76, 80, 111, 81, 57,
+  76, 81, 71, 93, 82, 82, 103, 63, 64, 91,
+  79, 64, 80, 66, 85, 95, 70, 78, 79, 97,
+  82, 92, 94, 71, 92, 66, 86, 54, 49, 80,
+  95, 75, 95, 86, 81, 87, 56, 90, 90, 78,
+  74, 83, 76, 102, 68, 40, 112, 89, 109, 91,
+  79, 91, 92, 67, 83, 110, 88, 93, 76, 102,
+  101, 83, 100, 66, 90, 76, 114, 66, 84, 81,
+  86, 76, 69, 83, 86, 84, 89, 100, 73, 68,
+  79, 102, 73, 92, 102, 98, 90, 83, 73, 91,
+  73, 95, 83, 60, 77, 76, 70, 83, 79, 76,
+  73, 60, 74, 89, 77, 85, 92, 76, 121, 63,
+  54, 82, 86, 85, 100, 89, 84, 87, 63, 76,
+  88, 106, 111, 73, 78, 121, 86, 60, 89, 81,
+  79, 76, 72, 68, 69, 58, 54, 91, 71, 67,
+  68, 75, 70, 91, 67, 78, 86, 89, 92, 74,
+  82, 95, 87, 69, 84, 69, 66, 78, 81, 81,
+  83, 85, 75, 85, 77, 115, 83, 82, 77, 75,
+  74, 88, 77, 51, 93, 73, 95, 85, 69, 74,
+  98, 79, 88, 87, 83, 84, 83, 82, 88, 75,
+  92, 75, 93, 86, 85, 74, 80, 83, 73, 73,
+  77, 79, 89, 95, 84, 96, 82, 82, 82, 83,
+  100, 85, 82, 88, 85, 93, 94, 81, 103, 86,
+  88, 70, 80, 101, 81, 75, 82, 73, 76, 74,
+  78, 89, 89, 93, 85, 74, 89, 79, 65, 78,
+  88, 69, 95, 98, 85, 85, 80, 86, 80, 102,
+  88, 79, 81, 104, 84, 62, 88, 85, 71, 93,
+  79, 83, 98, 69, 67, 90, 78, 68, 78, 72,
+  81, 96, 71, 81, 74, 78, 74, 83, 75, 93,
+  76, 74, 78, 78, 83, 90, 86, 75, 70, 78,
+  74, 82, 87, 86, 94, 75, 93, 83, 76, 93,
+  90, 65, 87, 84, 94, 79, 79, 110, 93, 85,
+  90, 98, 80, 96, 83, 77, 89, 73, 90, 94,
+  95, 89, 83, 82, 83, 90, 78, 76, 78, 92,
+  92, 84, 84, 100, 96, 76, 88, 77, 96, 86,
+  79, 83, 91, 94, 102, 79, 77, 83, 76, 88,
+  86, 77, 92, 68, 78, 77, 82, 100, 73, 87,
+  105, 72, 97, 78, 84, 83, 72, 80, 104, 76,
+  90, 83, 81, 102, 96, 103, 78, 104, 94, 76,
+  87, 93, 74, 69, 79, 84, 78, 86, 77, 87,
+  81, 72, 79, 91, 91, 68, 79, 60, 97, 80,
+  78, 85, 75, 81, 87, 97, 84, 79, 72, 69,
+  81, 60, 71, 88, 92, 79, 82, 88, 83, 86,
+  78, 102, 88, 81, 83, 78, 72, 98, 86, 52,
+  84, 83, 100, 92, 78, 103, 84, 76, 86, 110,
+  80, 94, 91, 80, 102, 77, 89, 72, 90, 77,
+  94, 78, 81, 89, 81, 75, 78, 84, 86, 77,
+  93, 99, 92, 67, 91, 83, 82, 86, 91, 94,
+  89, 102, 78, 85, 72, 89, 77, 83, 83, 78,
+  84, 69, 75, 75, 76, 76, 76, 108, 92, 79,
+  94, 73, 86, 79, 72, 81, 104, 86, 93, 79,
+  81, 98, 84, 85, 74, 109, 89, 75, 86, 102,
+  61, 66, 82, 87, 73, 85, 80, 83, 76, 68,
+  67, 90, 85, 71, 70, 64, 88, 78, 73, 82,
+  75, 83, 92, 74, 78, 96, 79, 71, 82, 77,
+  79, 87, 89, 81, 76, 82, 78, 81, 85, 105,
+  81, 81, 84, 79, 73, 95, 91, 65, 75, 74,
+  94, 88, 78, 81, 88, 85, 87, 92, 80, 98,
+  86, 78, 93, 75, 88, 78, 91, 85, 82, 78,
+  82, 92, 75, 77, 76, 73, 91, 87, 85, 94,
+  87, 79, 86, 73, 94, 83, 87, 87, 85, 98,
+  77, 80, 96, 81, 85, 85, 84, 98, 91, 69,
+  80, 80, 80, 83, 78, 103, 84, 79, 96, 76,
+  83, 77, 73, 83, 93, 75, 90, 87, 85, 95,
+  92, 77, 81, 107, 89, 77, 87, 92, 78, 72,
+  86, 86, 77, 102, 88, 87, 113, 75, 82, 89,
+  98, 73, 80, 70, 97, 79, 81, 88, 75, 72,
+  81, 86, 82, 98, 64, 95, 91, 96, 67, 81,
+  57, 89, 67, 82, 80, 78, 80, 100, 71, 77,
+  97, 83, 78, 77, 101, 85, 101, 74, 82, 90,
+  78, 91, 109, 84, 92, 100, 77, 82, 82, 74,
+  39, 81, 77, 85, 95, 77, 96, 80, 77, 71,
+  76, 77, 93, 92, 103, 65, 91, 82, 75, 83,
+  84, 58, 65, 73, 71, 88, 85, 85, 108, 80,
+  99, 96, 86, 86, 71, 103, 80, 81, 84, 69,
+  86, 94, 77, 79, 85, 92, 73, 84, 99, 87,
+  75, 84, 120, 76, 77, 76, 76, 88, 81, 101,
+  91, 96, 90, 91, 100, 88, 73, 76, 80, 84,
+  83, 86, 81, 98, 70, 83, 91, 59, 77, 81,
+  84, 87, 94, 102, 80, 77, 87, 86, 69, 82,
+  84, 84, 78, 72, 94, 86, 72, 93, 117, 88,
+  79, 93, 77, 64, 87, 84, 60, 65, 86, 93,
+  96, 70, 105, 90, 107, 85, 100, 81, 61, 99,
+  83, 77, 79, 104, 93, 92, 88, 78, 110, 92,
+  81, 98, 80, 93, 78, 73, 79, 93, 83, 77,
+  81, 90, 64, 69, 79, 92, 92, 76, 81, 69,
+  58, 61, 69, 76, 84, 85, 105, 85, 72, 103,
+  73, 62, 78, 93, 89, 76, 88, 79, 98, 77,
+  78, 82, 93, 93, 77, 79, 67, 81, 79, 88,
+  79, 76, 87, 86, 110, 65, 82, 90, 87, 90,
+  92, 85, 88, 76, 81, 81, 80, 97, 70, 84,
+  85, 108, 69, 81, 82, 64, 86, 86, 76, 66,
+  83, 93, 82, 80, 81, 93, 61, 91, 84, 84,
+  93, 59, 87, 73, 81, 83, 89, 92, 92, 87,
+  75, 78, 81, 81, 81, 82, 86, 82, 93, 82,
+  91, 75, 70, 103, 100, 85, 81, 79, 92, 81,
+  92, 89, 81, 78, 86, 93, 98, 88, 90, 84,
+  76, 92, 66, 79, 85, 83, 92, 102, 83, 87,
+  73, 85, 86, 91, 84, 88, 74, 81, 78, 71,
+  94, 85, 62, 74, 70, 89, 82, 104, 76, 74,
+  82, 71, 83, 101, 92, 87, 93, 70, 94, 86,
+  85, 84, 88, 90, 68, 76, 80, 97, 72, 91,
+  92, 88, 105, 81, 78, 83, 92, 82, 86, 99,
+  62, 86, 82, 88, 80, 98, 83, 80, 101, 83,
+  75, 86, 76, 85, 94, 82, 82, 83, 80, 78,
+  96, 88, 65, 86, 76, 75, 91, 72, 67, 97,
+  90, 86, 77, 74, 59, 74, 64, 88, 84, 84,
+  83, 84, 89, 81, 77, 82, 84, 97, 68, 79,
+  88, 73, 88, 104, 86, 75, 68, 77, 80, 82,
+  79, 90, 69, 77, 16, 79, 92, 88, 99, 64,
+  105, 86, 88, 72, 84, 85, 80, 60, 118, 72,
+  92, 90, 79, 79, 93, 68, 52, 91, 78, 88,
+  89, 81, 60, 71, 95, 88, 91, 103, 77, 70,
+  81, 90, 86, 84, 82, 93, 86, 81, 73, 79,
+  83, 110, 118, 61, 71, 90, 113, 80, 74, 81,
+  69, 93, 82, 68, 85, 97, 94, 81, 90, 93,
+  82, 83, 80, 70, 99, 83, 75, 79, 79, 85,
+  91, 77, 82, 86, 82, 107, 98, 90, 82, 83,
+  75, 90, 77, 79, 73, 103, 59, 86, 82, 99,
+  67, 86, 67, 71, 69, 74, 76, 80, 74, 109,
+  68, 75, 78, 91, 76, 73, 108, 81, 124, 65,
+  73, 90, 65, 79, 94, 95, 77, 87, 80, 76,
+  79, 65, 79, 66, 82, 95, 73, 86, 85, 76,
+  77, 72, 87, 70, 104, 94, 95, 53, 80, 74,
+  91, 86, 80, 59, 55, 65, 50, 94, 74, 102,
+  142, 69, 86, 87, 84, 80, 72, 92, 79, 63,
+  78, 67, 82, 98, 60, 80, 91, 105, 49, 71,
+  98, 87, 68, 72, 127, 72, 84, 74, 71, 71,
+  84, 116, 89, 92, 90, 89, 106, 74, 72, 64,
+  77, 102, 80, 100, 70, 88, 60, 74, 73, 57,
+  77, 86, 67, 74, 83, 87, 69, 72, 78, 91,
+  64, 91, 87, 76, 80, 66, 90, 87, 80, 91,
+  118, 82, 81, 85, 75, 72, 83, 80, 81, 68,
+  86, 94, 91, 83, 106, 88, 88, 95, 103, 83,
+  66, 91, 79, 80, 84, 90, 87, 91, 84, 81,
+  113, 91, 81, 100, 66, 87, 77, 82, 86, 102,
+  96, 89, 82, 101, 66, 72, 84, 83, 83, 84,
+  70, 94, 71, 71, 84, 84, 72, 77, 69, 89,
+  79, 102, 71, 74, 76, 78, 80, 92, 91, 83,
+  100, 87, 83, 88, 90, 88, 78, 80, 67, 75,
+  86, 103, 66, 90, 92, 85, 99, 67, 81, 85,
+  82, 86, 86, 77, 65, 75, 73, 88, 87, 89,
+  73, 81, 86, 96, 83, 79, 75, 78, 90, 92,
+  83, 70, 85, 81, 87, 77, 79, 79, 88, 68,
+  99, 83, 98, 98, 85, 75, 73, 81, 74, 71,
+  81, 93, 77, 93, 67, 71, 91, 82, 84, 81,
+  91, 88, 63, 69, 71, 83, 81, 89, 100, 74,
+  67, 83, 78, 89, 99, 100, 70, 89, 70, 103,
+  91, 87, 95, 78, 108, 82, 94, 92, 75, 80,
+  67, 89, 103, 101, 89, 84, 72, 77, 92, 74,
+  74, 115, 85, 68, 91, 91, 79, 81, 84, 90,
+  83, 75, 87, 69, 88, 97, 103, 94, 81, 82,
+  99, 86, 78, 81, 104, 116, 73, 80, 79, 82,
+  98, 92, 72, 93, 77, 87, 94, 65, 70, 107,
+  88, 74, 87, 94, 87, 86, 91, 81, 79, 81,
+  82, 89, 88, 85, 101, 91, 71, 84, 76, 96,
+  81, 95, 77, 101, 75, 90, 104, 67, 71, 82,
+  73, 99, 87, 96, 76, 93, 55, 80, 67, 76,
+  77, 84, 81, 99, 73, 92, 84, 92, 89, 84,
+  86, 82, 88, 54, 79, 105, 81, 67, 75, 92,
+  77, 86, 66, 68, 80, 72, 65, 69, 82, 82,
+  84, 80, 88, 77, 103, 82, 97, 74, 94, 63,
+  119, 74, 98, 88, 95, 78, 94, 78, 68, 84,
+  66, 83, 77, 84, 92, 68, 96, 87, 91, 98,
+  72, 82, 73, 66, 89, 86, 81, 102, 81, 88,
+  78, 95, 79, 96, 107, 73, 75, 80, 119, 72,
+  80, 78, 57, 86, 90, 76, 86, 94, 93, 79,
+  110, 91, 78, 74, 80, 85, 83, 96, 82, 76,
+  81, 76, 92, 75, 74, 86, 77, 94, 82, 91,
+  82, 90, 80, 80, 77, 79, 87, 74, 78, 75,
+  82, 96, 78, 93, 123, 76, 63, 66, 70, 72,
+  86, 91, 85, 86, 83, 90, 86, 82, 97, 87,
+  80, 86, 93, 88, 72, 91, 88, 91, 92, 88,
+  90, 92, 87, 76, 101, 88, 79, 104, 65, 103,
+  83, 82, 89, 100, 96, 78, 89, 80, 79, 66,
+  92, 81, 94, 84, 83, 98, 69, 78, 70, 80,
+  80, 85, 104, 81, 89, 93, 73, 82, 77, 77,
+  80, 77, 91, 81, 93, 94, 80, 83, 88, 99,
+  72, 79, 89, 79, 86, 99, 83, 91, 88, 78,
+  73, 74, 82, 94, 84, 88, 80, 85, 80, 85,
+  71, 84, 87, 83, 70, 75, 84, 81, 91, 78,
+  82, 77, 90, 87, 83, 74, 85, 82, 84, 84,
+  70, 77, 81, 86, 62, 97, 86, 76, 91, 101,
+  80, 88, 89, 87, 73, 80, 77, 75, 87, 86,
+  78, 84, 85, 91, 87, 93, 83, 88, 98, 99,
+  76, 86, 73, 89, 75, 95, 94, 89, 81, 64,
+  97, 76, 84, 75, 75, 83, 81, 108, 75, 80,
+  73, 86, 94, 84, 92, 83, 90, 80, 79, 93,
+  89, 105, 85, 84, 94, 72, 76, 78, 77, 86,
+  86, 82, 82, 80, 84, 76, 91, 80, 88, 84,
+  86, 81, 92, 73, 73, 93, 81, 108, 84, 95,
+  79, 80, 77, 87, 104, 89, 80, 73, 100, 102,
+  93, 104, 89, 85, 85, 93, 90, 90, 83, 79,
+  74, 88, 77, 86, 77, 85, 73, 78, 83, 90,
+  79, 82, 103, 96, 71, 90, 83, 82, 69, 91,
+  72, 77, 48, 93, 91, 68, 82, 85, 80, 102,
+  112, 65, 81, 75, 80, 93, 80, 85, 89, 74,
+  91, 85, 91, 97, 80, 64, 102, 98, 88, 82,
+  90, 79, 98, 82, 88, 93, 71, 81, 85, 96,
+  90, 86, 66, 80, 71, 106, 55, 95, 69, 83,
+  99, 87, 80, 72, 79, 71, 81, 93, 90, 76,
+  72, 108, 85, 76, 96, 88, 59, 68, 79, 80,
+  76, 85, 87, 68, 88, 102, 74, 93, 92, 86,
+  101, 76, 87, 88, 82, 97, 82, 88, 53, 67,
+  75, 89, 75, 96, 81, 70, 74, 95, 76, 84,
+  76, 86, 73, 89, 87, 88, 74, 76, 93, 86,
+  69, 83, 82, 96, 73, 77, 89, 99, 83, 85,
+  89, 85, 65, 88, 87, 100, 73, 83, 93, 90,
+  65, 73, 85, 80, 91, 95, 73, 88, 84, 83,
+  69, 87, 81, 71, 82, 81, 80, 87, 95, 91,
+  93, 87, 90, 87, 90, 82, 83, 87, 76, 79,
+  90, 78, 87, 87, 81, 71, 87, 80, 73, 80,
+  74, 85, 92, 74, 85, 79, 69, 79, 85, 77,
+  85, 86, 76, 80, 80, 91, 88, 102, 93, 80,
+  86, 67, 86, 81, 83, 80, 78, 79, 74, 75,
+  90, 84, 95, 91, 84, 78, 82, 78, 103, 86,
+  75, 97, 79, 102, 85, 84, 74, 77, 80, 91,
+  113, 85, 75, 81, 78, 98, 90, 76, 91, 85,
+  85, 93, 87, 93, 83, 76, 89, 85, 80, 74,
+  84, 107, 98, 77, 90, 89, 77, 82, 90, 95,
+  69, 97, 80, 83, 89, 68, 87, 75, 63, 88,
+  82, 82, 86, 93, 77, 83, 80, 76, 69, 76,
+  76, 78, 83, 86, 83, 97, 95, 92, 79, 87,
+  83, 82, 100, 95, 74, 86, 74, 92, 69, 104,
+  84, 89, 82, 61, 100, 67, 80, 75, 87, 76,
+  74, 113, 78, 80, 75, 96, 79, 76, 93, 81,
+  89, 75, 79, 92, 80, 102, 80, 80, 83, 70,
+  84, 77, 73, 81, 85, 80, 91, 86, 86, 80,
+  86, 77, 78, 74, 79, 78, 80, 68, 73, 92,
+  83, 103, 78, 84, 73, 80, 77, 77, 101, 82,
+  83, 77, 84, 94, 90, 105, 90, 82, 94, 103,
+  92, 90, 74, 72, 80, 92, 75, 80, 79, 79,
+  81, 78, 72, 82, 88, 80, 100, 87, 70, 91,
+  70, 81, 91, 95, 81, 73, 47, 81, 96, 77,
+  81, 76, 78, 93, 138, 64, 87, 77, 86, 91,
+  78, 84, 91, 97, 73, 94, 82, 89, 78, 62,
+  101, 88, 97, 87, 94, 85, 89, 80, 72, 92,
+  80, 74, 80, 112, 97, 92, 77, 60, 67, 99,
+  50, 88, 72, 83, 94, 81, 76, 76, 74, 67,
+  75, 89, 79, 70, 65, 123, 57, 80, 93, 80,
+  63, 59, 72, 75, 71, 94, 84, 65, 83, 106,
+  62, 85, 93, 79, 107, 65, 92, 91, 75, 76,
+  91, 80, 54, 51, 69, 81, 60, 88, 83, 73,
+  75, 81, 51, 76, 70, 82, 79, 96, 87, 87,
+  77, 68, 109, 92, 69, 73, 81, 80, 72, 88,
+  98, 80, 75, 86, 90, 77, 63, 80, 77, 108,
+  83, 82, 87, 82, 76, 91, 74, 81, 91, 90,
+  71, 80, 73, 83, 63, 84, 83, 73, 84, 80,
+  77, 108, 79, 92, 80, 83, 88, 87, 93, 81,
+  63, 86, 74, 88, 89, 84, 79, 87, 72, 67,
+  101, 67, 81, 77, 89, 77, 78, 63, 88, 82,
+  72, 86, 70, 74, 89, 85, 81, 77, 84, 88,
+  79, 107, 87, 73, 86, 63, 89, 82, 78, 77,
+  88, 77, 84, 83, 89, 88, 87, 104, 79, 72,
+  75, 74, 95, 96, 72, 95, 79, 101, 73, 81,
+  73, 87, 82, 85, 120, 85, 80, 84, 68, 96,
+  99, 81, 92, 84, 94, 100, 88, 93, 74, 65,
+  83, 94, 78, 82, 77, 97, 108, 74, 75, 91,
+  62, 83, 80, 92, 70, 94, 71, 75, 99, 73,
+  96, 83, 69, 83, 87, 87, 97, 86, 79, 87,
+  92, 79, 76, 80, 82, 74, 86, 87, 78, 96,
+  94, 93, 85, 82, 83, 81, 89, 82, 91, 87,
+  78, 91, 74, 98, 75, 91, 78, 68, 88, 84,
+  85, 73, 84, 75, 86, 103, 76, 87, 74, 92,
+  84, 67, 95, 83, 85, 74, 82, 96, 80, 95,
+  86, 96, 85, 68, 89, 82, 73, 85, 91, 83,
+  105, 91, 88, 89, 88, 78, 84, 79, 76, 76,
+  87, 77, 80, 85, 83, 105, 85, 82, 76, 94,
+  77, 82, 90, 89, 85, 86, 81, 88, 87, 108,
+  93, 82, 98, 97, 97, 95, 79, 78, 97, 85,
+  84, 77, 88, 78, 71, 82, 83, 83, 97, 79,
+  98, 90, 76, 94, 74, 84, 86, 98, 93, 82,
+  55, 78, 90, 82, 97, 75, 76, 93, 135, 72,
+  88, 83, 89, 89, 75, 75, 87, 100, 81, 97,
+  76, 75, 73, 59, 90, 91, 80, 89, 88, 83,
+  86, 87, 76, 95, 84, 78, 87, 92, 84, 92,
+  70, 58, 76, 89, 46, 95, 72, 94, 94, 67,
+  82, 87, 70, 65, 79, 91, 77, 74, 75, 131,
+  84, 76, 92, 82, 71, 80, 100, 77, 91, 94,
+  83, 65, 86, 94, 72, 80, 87, 75, 97, 81,
+  88, 92, 77, 87, 90, 73, 55, 78, 72, 78,
+  61, 89, 75, 79, 87, 78, 71, 95, 72, 78,
+  82, 108, 86, 87, 66, 76, 104, 93, 69, 75,
+  88, 78, 84, 87, 104, 75, 75, 82, 94, 73,
+  66, 88, 78, 91, 96, 96, 67, 83, 77, 88,
+  87, 86, 96, 87, 70, 84, 93, 90, 72, 86,
+  88, 73, 88, 79, 86, 98, 82, 92, 78, 83,
+  85, 88, 81, 82, 81, 88, 81, 79, 83, 81,
+  75, 90, 92, 72, 89, 83, 72, 75, 85, 66,
+  78, 58, 86, 86, 75, 88, 78, 71, 93, 90,
+  80, 77, 79, 94, 84, 92, 94, 85, 81, 65,
+  91, 83, 77, 86, 92, 81, 90, 91, 90, 88,
+  82, 93, 74, 79, 74, 78, 96, 96, 81, 91,
+  75, 91, 78, 82, 75, 97, 80, 85, 100, 92,
+  82, 88, 89, 83, 90, 94, 92, 83, 99, 98,
+  92, 96, 87, 73, 84, 91, 85, 83, 72, 85,
+  106, 80, 85, 92, 65, 82, 84, 93, 71, 96,
+  72, 85, 88, 72, 95, 80, 78, 72, 79, 76,
+  86, 91, 97, 76, 86, 95, 80, 78, 78, 79,
+  79, 82, 76, 93, 77, 79, 99, 88, 96, 85,
+  87, 82, 80, 93, 84, 101, 81, 73, 81, 89,
+  80, 86, 94, 84, 99, 84, 95, 81, 88, 81,
+  86, 80, 97, 83, 82, 62, 71, 72, 86, 84,
+  89, 81, 68, 91, 92, 77, 84, 66, 84, 91,
+  95, 82, 91, 87, 96, 73, 96, 85, 92, 84,
+  76, 85, 74, 85, 93, 97, 83, 85, 92, 87,
+  78, 91, 86, 81, 82, 81, 76, 66, 82, 91,
+  83, 93, 91, 85, 87, 79, 82, 97, 78, 86,
+  84, 77, 79, 87, 99, 78, 94, 79, 91, 84,
+  89, 67, 90, 72, 85, 82, 90, 85, 81, 69,
+  89, 76, 83, 83, 92, 77, 76, 71, 81, 85,
+  89, 79, 93, 92, 78, 73, 80, 82, 76, 90,
+  87, 100, 77, 79, 98, 90, 92, 83, 88, 81,
+  79, 82, 66, 106, 79, 81, 82, 73, 90, 91,
+  95, 92, 83, 97, 101, 62, 81, 76, 84, 92,
+  99, 87, 81, 60, 63, 91, 79, 89, 96, 89,
+  66, 73, 92, 78, 83, 68, 89, 108, 97, 86,
+  84, 102, 89, 79, 105, 73, 88, 83, 82, 78,
+  77, 88, 92, 95, 86, 90, 85, 99, 85, 85,
+  78, 81, 76, 70, 69, 66, 76, 98, 83, 83,
+  92, 103, 94, 78, 67, 108, 84, 89, 81, 86,
+  83, 81, 107, 80, 90, 77, 76, 80, 78, 69,
+  86, 75, 80, 93, 85, 79, 75, 66, 87, 82,
+  83, 87, 80, 77, 73, 79, 89, 91, 96, 82,
+  88, 77, 79, 79, 82, 82, 81, 85, 96, 94,
+  80, 84, 89, 85, 93, 88, 86, 80, 83, 85,
+  74, 89, 75, 97, 84, 83, 91, 89, 94, 86,
+  67, 86, 95, 77, 87, 79, 86, 80, 97, 86,
+  82, 68, 71, 90, 85, 84, 88, 82, 72, 81,
+  88, 79, 77, 72, 81, 94, 99, 83, 86, 89,
+  97, 75, 96, 82, 93, 73, 84, 82, 74, 86,
+  92, 88, 84, 84, 78, 86, 79, 89, 87, 86,
+  81, 77, 73, 67, 80, 93, 87, 92, 89, 98,
+  89, 78, 83, 94, 77, 82, 82, 78, 78, 85,
+  101, 88, 76, 82, 87, 80, 84, 70, 92, 75,
+  87, 84, 89, 82, 88, 67, 91, 71, 89, 77,
+  92, 75, 88, 79, 74, 92, 98, 76, 89, 83,
+  82, 78, 79, 77, 75, 90, 80, 94, 71, 78,
+  101, 85, 76, 89, 90, 86, 91, 90, 73, 127,
+  74, 71, 73, 74, 87, 77, 96, 87, 123, 92,
+  106, 80, 80, 80, 80, 76, 89, 81, 80, 64,
+  65, 82, 87, 90, 88, 90, 75, 83, 91, 73,
+  76, 70, 79, 97, 82, 81, 90, 83, 85, 75,
+  88, 91, 82, 84, 77, 84, 77, 90, 84, 96,
+  83, 82, 88, 95, 74, 89, 72, 87, 84, 73,
+  71, 70, 78, 95, 69, 87, 78, 82, 87, 81,
+  85, 93, 79, 88, 81, 80, 80, 94, 111, 82,
+  88, 74, 84, 75, 84, 72, 78, 79, 77, 89,
+  86, 77, 87, 58, 91, 77, 74, 80, 101, 70,
+  90, 73, 69, 85, 93, 76, 90, 92, 76, 79,
+  80, 74, 68, 109, 100, 97, 74, 84, 97, 89,
+  70, 81, 91, 84, 88, 70, 60, 132, 93, 83,
+  77, 66, 92, 87, 121, 101, 100, 108, 123, 58,
+  80, 72, 86, 95, 85, 85, 79, 59, 54, 92,
+  84, 98, 95, 99, 67, 62, 97, 80, 73, 77,
+  83, 117, 83, 70, 78, 98, 77, 77, 98, 72,
+  73, 88, 83, 79, 82, 97, 81, 78, 87, 85,
+  85, 98, 79, 78, 67, 82, 76, 56, 64, 64,
+  69, 95, 74, 77, 86, 88, 88, 82, 73, 95,
+  85, 91, 69, 84, 87, 84, 113, 80, 90, 59,
+  71, 68, 70, 80, 82, 70, 70, 106, 76, 74,
+  74, 60, 90, 89, 84, 83, 92, 69, 88, 80,
+  75, 92, 98, 79, 92, 87, 79, 79, 82, 78,
+  76, 102, 118, 92, 87, 86, 88, 88, 77, 86,
+  89, 79, 91, 74, 68, 99, 76, 100, 75, 75,
+  95, 83, 101, 88, 74, 92, 111, 73, 76, 76,
+  80, 79, 86, 88, 78, 68, 66, 82, 85, 90,
+  84, 88, 75, 75, 91, 78, 74, 76, 81, 99,
+  85, 76, 85, 85, 86, 77, 91, 85, 87, 80,
+  80, 86, 77, 92, 86, 76, 86, 83, 81, 89,
+  73, 86, 71, 75, 82, 74, 71, 71, 77, 96,
+  85, 85, 77, 93, 85, 81, 81, 89, 80, 82,
+  77, 78, 90, 91, 110, 85, 81, 69, 92, 76,
+  79, 79, 94, 80, 77, 87, 83, 84, 88, 63,
+  84, 76, 78, 84, 71, 82, 88, 86, 85, 85,
+  102, 77, 88, 64, 77, 89, 78, 80, 92, 85,
+  78, 83, 75, 80, 84, 81, 88, 86, 84, 78,
+  81, 93, 90, 108, 80, 79, 84, 85, 81, 72,
+  98, 72, 109, 80, 95, 90, 84, 86, 71, 69,
+  90, 75, 78, 75, 77, 85, 88, 82, 81, 87,
+  78, 87, 85, 84, 77, 68, 75, 80, 76, 78,
+  82, 84, 89, 77, 89, 89, 88, 94, 92, 84,
+  76, 89, 88, 88, 79, 87, 89, 83, 81, 83,
+  75, 86, 85, 83, 78, 75, 86, 92, 72, 96,
+  82, 82, 88, 79, 96, 85, 81, 83, 83, 75,
+  94, 85, 100, 84, 85, 86, 77, 77, 82, 72,
+  81, 78, 84, 80, 85, 87, 92, 77, 81, 80,
+  77, 79, 75, 75, 90, 77, 81, 86, 100, 80,
+  86, 84, 74, 93, 77, 87, 90, 93, 96, 76,
+  84, 79, 82, 83, 87, 85, 90, 80, 77, 83,
+  81, 103, 85, 81, 82, 87, 81, 74, 119, 67,
+  100, 93, 103, 80, 77, 81, 69, 71, 92, 79,
+  74, 76, 70, 90, 91, 86, 83, 85, 70, 73,
+  98, 73, 75, 68, 80, 83, 76, 76, 80, 86,
+  85, 78, 91, 75, 81, 85, 90, 82, 79, 102,
+  80, 84, 85, 90, 88, 78, 90, 87, 70, 88,
+  90, 75, 73, 76, 76, 95, 73, 87, 83, 71,
+  79, 77, 98, 74, 81, 85, 80, 77, 101, 77,
+  101, 82, 88, 75, 75, 79, 77, 80, 94, 71,
+  76, 78, 79, 92, 93, 81, 84, 86, 82, 84,
+  73, 78, 89, 85, 83, 88, 102, 77, 90, 87,
+  74, 87, 77, 83, 95, 91, 101, 81, 91, 82,
+  77, 86, 90, 86, 82, 83, 84, 81, 88, 94,
+  79, 87, 83, 85, 82, 75, 103, 72, 76, 80,
+  100, 81, 76, 88, 73, 69, 88, 82, 78, 80,
+  76, 80, 88, 83, 79, 82, 77, 81, 89, 80,
+  79, 72, 79, 79, 78, 82, 76, 86, 90, 75,
+  92, 85, 88, 80, 84, 84, 76, 86, 86, 84,
+  84, 90, 85, 79, 79, 80, 74, 75, 87, 85,
+  77, 77, 85, 93, 84, 90, 82, 73, 89, 77,
+  96, 86, 84, 80, 83, 77, 105, 84, 100, 83,
+  88, 82, 90, 80, 83, 79, 93, 80, 81, 82,
+  81, 96, 91, 83, 84, 84, 88, 81, 83, 77,
+  74, 95, 93, 72, 86, 90, 110, 87, 58, 104,
+  75, 82, 83, 99, 70, 99, 98, 102, 66, 85,
+  102, 70, 85, 81, 83, 74, 109, 79, 86, 84,
+  86, 97, 82, 95, 83, 59, 87, 75, 79, 106,
+  81, 86, 87, 93, 84, 119, 88, 77, 113, 90,
+  85, 85, 98, 81, 78, 79, 85, 58, 66, 99,
+  82, 87, 77, 62, 94, 70, 109, 86, 68, 83,
+  85, 95, 71, 74, 107, 85, 95, 101, 69, 90,
+  85, 64, 115, 67, 96, 100, 71, 75, 94, 65,
+  67, 78, 93, 104, 71, 76, 81, 71, 84, 84,
+  82, 100, 77, 106, 80, 57, 90, 76, 81, 90,
+  79, 72, 87, 94, 63, 94, 100, 94, 116, 92,
+  78, 128, 89, 72, 86, 83, 84, 73, 70, 81,
+  85, 86, 82, 101, 83, 73, 64, 85, 76, 101,
+  89, 106, 70, 92, 117, 82, 78, 72, 105, 83,
+  91, 84, 94, 93, 111, 77, 80, 89, 69, 100,
+  107, 73, 84, 69, 76, 72, 87, 81, 75, 76,
+  84, 84, 85, 76, 80, 80, 88, 83, 95, 80,
+  85, 82, 84, 86, 93, 69, 55, 89, 112, 103,
+  78, 78, 88, 81, 93, 89, 74, 80, 88, 109,
+  67, 61, 85, 85, 87, 124, 81, 88, 80, 77,
+  75, 74, 96, 91, 88, 76, 86, 78, 81, 73,
+  85, 82, 75, 71, 83, 81, 83, 83, 83, 90,
+  73, 107, 74, 81, 95, 80, 73, 86, 83, 78,
+  88, 80, 74, 86, 89, 87, 78, 89, 83, 92,
+  90, 74, 99, 84, 83, 87, 69, 75, 84, 86,
+  79, 92, 86, 76, 71, 84, 76, 96, 84, 90,
+  88, 83, 89, 75, 86, 73, 88, 83, 83, 87,
+  95, 94, 91, 73, 78, 93, 73, 90, 105, 74,
+  85, 74, 71, 74, 91, 76, 79, 88, 87, 81,
+  80, 73, 80, 85, 77, 91, 84, 78, 76, 90,
+  87, 94, 95, 71, 70, 82, 89, 105, 81, 85,
+  85, 87, 84, 86, 86, 76, 92, 89, 78, 71,
+  70, 80, 79, 109, 93, 79, 91, 84, 71, 79,
+  84, 102, 94, 79, 83, 89, 88, 88, 82, 69,
+  84, 86, 89, 84, 84, 93, 82, 77, 70, 92,
+  82, 111, 86, 80, 76, 83, 80, 81, 86, 75,
+  83, 78, 76, 84, 66, 89, 78, 72, 84, 72,
+  84, 83, 84, 68, 68, 89, 79, 79, 87, 88,
+  93, 79, 59, 81, 82, 102, 85, 107, 68, 85,
+  110, 86, 77, 67, 101, 76, 94, 83, 87, 81,
+  106, 81, 77, 82, 80, 97, 95, 75, 89, 71,
+  79, 74, 83, 90, 77, 79, 83, 83, 71, 88,
+  82, 75, 87, 85, 95, 77, 88, 80, 83, 86,
+  105, 65, 56, 82, 107, 112, 81, 100, 79, 71,
+  96, 98, 70, 88, 85, 105, 72, 77, 88, 71,
+  89, 115, 74, 84, 88, 79, 69, 79, 91, 103,
+  84, 75, 91, 81, 84, 75, 86, 87, 87, 85,
+  87, 83, 70, 86, 86, 87, 64, 96, 70, 99,
+  92, 79, 90, 86, 84, 79, 85, 83, 76, 84,
+  83, 81, 84, 86, 83, 89, 86, 75, 87, 82,
+  89, 77, 82, 76, 72, 91, 79, 97, 74, 66,
+  86, 78, 89, 101, 83, 98, 90, 78, 100, 72,
+  93, 78, 78, 83, 95, 88, 101, 92, 78, 78,
+  69, 79, 60, 90, 119, 70, 86, 75, 65, 92,
+  96, 77, 75, 71, 83, 68, 81, 68, 74, 91,
+  71, 76, 85, 84, 70, 88, 81, 82, 101, 73,
+  60, 75, 92, 103, 88, 90, 75, 81, 70, 84,
+  84, 72, 91, 98, 68, 84, 81, 86, 77, 95,
+  98, 84, 81, 95, 61, 71, 73, 70, 78, 84,
+  70, 101, 90, 90, 80, 67, 67, 69, 90, 90,
+  80, 89, 76, 72, 66, 77, 85, 111, 85, 77,
+  81, 70, 77, 78, 81, 78, 86, 70, 67, 72,
+  66, 88, 84, 56, 94, 76, 88, 82, 91, 80,
+  80, 77, 79, 90, 86, 86, 91, 80, 91, 84,
+  86, 81, 83, 73, 96, 79, 66, 76, 89, 72,
+  80, 84, 92, 93, 93, 82, 78, 79, 81, 79,
+  64, 75, 98, 79, 83, 86, 76, 83, 88, 78,
+  86, 82, 87, 72, 82, 76, 79, 97, 62, 87,
+  75, 88, 76, 86, 85, 91, 91, 79, 78, 82,
+  77, 73, 92, 79, 82, 87, 73, 85, 89, 75,
+  90, 89, 86, 95, 73, 82, 82, 79, 92, 78,
+  87, 95, 70, 80, 78, 88, 87, 83, 72, 87,
+  87, 104, 81, 82, 83, 88, 91, 89, 85, 91,
+  82, 72, 82, 81, 91, 101, 80, 76, 79, 77,
+  82, 77, 85, 88, 98, 72, 79, 76, 68, 89,
+  77, 70, 95, 79, 88, 75, 86, 73, 79, 84,
+  79, 84, 89, 83, 92, 86, 71, 74, 89, 100,
+  86, 95, 72, 81, 98, 83, 94, 75, 87, 88,
+  86, 85, 90, 90, 91, 92, 72, 76, 78, 85,
+  99, 79, 88, 79, 81, 77, 83, 87, 84, 81,
+  80, 81, 78, 82, 75, 83, 86, 86, 92, 87,
+  88, 84, 80, 74, 99, 81, 65, 87, 93, 83,
+  88, 83, 83, 82, 80, 88, 76, 82, 86, 104,
+  71, 87, 80, 76, 80, 107, 82, 86, 89, 83,
+  73, 81, 84, 81, 93, 85, 84, 88, 94, 86,
+  85, 78, 83, 79, 87, 86, 84, 86, 89, 81,
+  75, 83, 73, 91, 84, 81, 91, 86, 72, 81,
+  88, 78, 87, 73, 77, 73, 78, 94, 81, 82,
+  89, 81, 84, 72, 84, 76, 82, 77, 71, 89,
+  86, 94, 81, 81, 92, 80, 90, 93, 78, 83,
+  93, 77, 93, 79, 98, 77, 78, 90, 92, 92,
+  93, 86, 77, 91, 76, 75, 76, 82, 97, 78,
+  92, 81, 76, 83, 84, 82, 85, 76, 83, 76,
+  89, 73, 75, 93, 70, 78, 79, 94, 81, 86,
+  82, 81, 93, 78, 84, 83, 87, 73, 98, 74,
+  84, 92, 74, 81, 84, 77, 86, 91, 68, 92,
+  80, 89, 79, 92, 86, 89, 81, 97, 74, 69,
+  78, 76, 88, 90, 75, 91, 89, 93, 74, 78,
+  79, 74, 87, 88, 82, 86, 91, 74, 80, 80,
+  86, 83, 79, 81, 81, 75, 74, 81, 86, 85,
+  98, 73, 79, 72, 68, 92, 74, 71, 80, 79,
+  84, 79, 82, 74, 76, 79, 73, 97, 87, 95,
+  100, 82, 91, 78, 79, 88, 81, 73, 92, 82,
+  87, 87, 98, 76, 85, 91, 86, 92, 84, 84,
+  81, 96, 79, 82, 84, 81, 93, 85, 87, 84,
+  85, 79, 79, 80, 84, 88, 82, 80, 83, 94,
+  82, 94, 73, 82, 76, 88, 91, 85, 86, 88,
+  91, 78, 92, 90, 91, 74, 97, 84, 91, 93,
+  83, 82, 91, 78, 86, 85, 75, 88, 77, 84,
+  84, 98, 81, 75, 84, 91, 84, 77, 86, 83,
+  96, 89, 81, 76, 83, 89, 76, 93, 86, 89,
+  95, 84, 79, 87, 89, 80, 79, 78, 82, 77,
+  79, 85, 79, 76, 96, 86, 89, 90, 94, 80,
+  91, 73, 81, 87, 77, 84, 80, 98, 87, 75,
+  95, 89, 91, 104, 89, 69, 72, 84, 88, 92,
+  75, 88, 88, 83, 97, 72, 82, 82, 73, 75,
+  82, 87, 82, 82, 73, 65, 78, 85, 101, 97,
+  70, 85, 76, 89, 53, 107, 89, 62, 82, 86,
+  91, 104, 74, 92, 101, 87, 89, 91, 67, 83,
+  67, 93, 92, 95, 85, 66, 75, 74, 77, 77,
+  71, 115, 92, 79, 95, 76, 97, 66, 87, 88,
+  74, 91, 75, 73, 93, 102, 82, 102, 91, 79,
+  94, 83, 82, 74, 88, 96, 79, 93, 85, 90,
+  91, 88, 57, 80, 86, 107, 90, 75, 76, 101,
+  91, 86, 92, 86, 80, 97, 98, 71, 94, 76,
+  83, 109, 81, 82, 93, 93, 70, 84, 91, 86,
+  91, 89, 81, 90, 63, 92, 82, 94, 72, 99,
+  78, 117, 89, 92, 85, 81, 60, 73, 65, 87,
+  82, 73, 109, 106, 81, 77, 95, 84, 71, 93,
+  91, 93, 90, 69, 61, 96, 85, 90, 72, 106,
+  62, 111, 70, 78, 89, 51, 77, 70, 89, 89,
+  57, 84, 91, 70, 102, 70, 78, 83, 81, 87,
+  112, 89, 78, 84, 84, 78, 82, 71, 71, 86,
+  79, 88, 82, 73, 95, 71, 107, 74, 78, 109,
+  63, 79, 63, 87, 82, 98, 77, 93, 83, 96,
+  79, 84, 73, 82, 112, 80, 68, 87, 109, 79,
+  64, 71, 80, 89, 70, 49, 98, 99, 76, 86,
+  103, 77, 65, 77, 80, 69, 104, 90, 64, 88,
+  92, 81, 85, 71, 74, 80, 89, 103, 93, 78,
+  79, 73, 79, 72, 95, 79, 74, 94, 80, 88,
+  91, 91, 75, 89, 126, 86, 60, 79, 75, 78,
+  93, 87, 90, 78, 79, 93, 78, 80, 102, 91,
+  77, 101, 84, 95, 83, 93, 80, 82, 70, 99,
+  82, 81, 92, 66, 82, 85, 86, 87, 74, 99,
+  70, 92, 79, 96, 80, 76, 90, 83, 86, 84,
+  91, 78, 109, 66, 76, 102, 62, 79, 95, 82,
+  74, 112, 82, 88, 89, 77, 67, 81, 74, 77,
+  71, 69, 84, 99, 79, 84, 80, 81, 87, 93,
+  72, 83, 94, 86, 82, 90, 92, 79, 81, 81,
+  92, 76, 83, 70, 80, 99, 87, 89, 73, 80,
+  67, 85, 93, 81, 73, 79, 81, 109, 89, 83,
+  87, 83, 88, 89, 88, 77, 93, 81, 79, 85,
+  83, 90, 66, 93, 89, 74, 73, 109, 89, 89,
+  83, 77, 75, 72, 57, 88, 83, 78, 101, 103,
+  58, 80, 77, 85, 74, 87, 100, 89, 97, 74,
+  68, 87, 75, 77, 72, 90, 93, 92, 76, 84,
+  85, 63, 82, 69, 95, 89, 77, 75, 91, 72,
+  83, 67, 81, 74, 88, 107, 100, 71, 85, 74,
+  92, 74, 82, 56, 49, 86, 79, 94, 82, 97,
+  101, 72, 95, 79, 86, 102, 72, 70, 91, 70,
+  85, 81, 77, 91, 81, 84, 84, 81, 75, 91,
+  87, 86, 71, 89, 107, 69, 73, 75, 93, 81,
+  84, 72, 93, 96, 95, 82, 84, 80, 75, 75,
+  83, 70, 86, 88, 90, 101, 79, 81, 79, 86,
+  83, 84, 82, 98, 87, 78, 79, 75, 86, 72,
+  123, 95, 69, 91, 55, 98, 80, 102, 80, 75,
+  65, 80, 55, 80, 81, 73, 96, 111, 70, 83,
+  98, 81, 71, 72, 113, 93, 118, 77, 62, 93,
+  62, 74, 66, 98, 90, 81, 68, 63, 96, 56,
+  67, 56, 90, 66, 84, 86, 78, 64, 81, 68,
+  80, 65, 97, 78, 100, 61, 76, 80, 106, 79,
+  72, 59, 62, 63, 60, 86, 74, 117, 61, 79,
+  93, 78, 86, 87, 76, 73, 81, 54, 84, 72,
+  72, 106, 73, 98, 83, 101, 55, 73, 87, 78,
+  63, 76, 113, 59, 80, 77, 69, 54, 86, 53,
+  107, 93, 89, 89, 94, 72, 63, 58, 91, 73,
+  70, 86, 92, 81, 99, 69, 58, 81, 82, 84,
+  70, 89, 78, 85, 72, 62, 84, 65, 101, 77,
+  84, 77, 82, 70, 87, 79, 77, 80, 134, 79,
+  69, 81, 84, 71, 85, 90, 94, 69, 70, 99,
+  92, 82, 100, 89, 94, 97, 106, 90, 69, 82,
+  105, 86, 80, 82, 79, 90, 86, 85, 87, 91,
+  81, 88, 106, 104, 67, 87, 80, 94, 90, 73,
+  87, 73, 78, 79, 96, 78, 101, 79, 75, 88,
+  57, 69, 80, 87, 74, 84, 69, 86, 75, 76,
+  85, 63, 79, 73, 95, 69, 91, 91, 91, 88,
+  85, 69, 89, 79, 91, 91, 77, 72, 84, 100,
+  80, 85, 92, 93, 78, 66, 82, 88, 79, 91,
+  106, 67, 72, 88, 77, 82, 106, 80, 58, 78,
+  105, 98, 62, 80, 82, 82, 83, 92, 75, 70,
+  97, 81, 93, 89, 74, 95, 78, 74, 110, 82,
+  75, 76, 93, 78, 84, 78, 86, 88, 57, 76,
+  83, 84, 74, 100, 65, 79, 87, 89, 96, 93,
+  88, 82, 79, 83, 104, 94, 78, 66, 84, 82,
+  106, 87, 86, 80, 82, 81, 85, 85, 86, 80,
+  105, 79, 83, 78, 83, 83, 89, 81, 101, 100,
+  84, 68, 85, 73, 96, 86, 79, 75, 66, 75,
+  87, 88, 86, 79, 76, 88, 85, 95, 100, 85,
+  85, 79, 82, 66, 101, 79, 84, 85, 86, 85,
+  82, 83, 83, 79, 72, 79, 83, 98, 95, 79,
+  98, 90, 111, 71, 82, 71, 80, 94, 89, 66,
+  85, 92, 104, 72, 73, 77, 64, 81, 95, 92,
+  82, 92, 92, 92, 100, 87, 78, 85, 75, 89,
+  83, 83, 81, 80, 98, 72, 100, 84, 85, 64,
+  85, 68, 81, 83, 106, 75, 74, 70, 86, 77,
+  80, 85, 90, 81, 80, 91, 101, 89, 84, 85,
+  93, 77, 122, 94, 78, 79, 89, 80, 93, 86,
+  87, 80, 82, 81, 80, 90, 74, 85, 115, 93,
+  69, 74, 84, 90, 95, 79, 89, 90, 78, 71,
+  87, 78, 102, 91, 79, 83, 74, 66, 95, 88,
+  87, 62, 60, 82, 80, 92, 96, 65, 85, 69,
+  91, 64, 101, 85, 88, 83, 87, 73, 77, 85,
+  81, 77, 68, 75, 88, 106, 82, 84, 102, 101,
+  91, 68, 76, 61, 76, 89, 91, 74, 92, 95,
+  97, 79, 91, 86, 62, 76, 88, 83, 75, 91,
+  87, 88, 90, 86, 80, 74, 78, 97, 85, 92,
+  75, 82, 84, 92, 90, 84, 89, 66, 82, 71,
+  81, 84, 104, 79, 75, 74, 90, 78, 70, 92,
+  92, 89, 97, 92, 91, 81, 78, 78, 75, 84,
+  104, 85, 94, 81, 103, 81, 78, 95, 104, 75,
+  81, 85, 88, 93, 81, 81, 96, 104, 74, 88,
+  91, 94, 98, 95, 84, 84, 76, 80, 98, 77,
+  89, 98, 78, 80, 83, 77, 100, 89, 84, 70,
+  67, 83, 78, 86, 87, 61, 82, 83, 85, 83,
+  98, 101, 92, 79, 80, 67, 82, 84, 82, 85,
+  82, 67, 94, 96, 71, 92, 97, 88, 77, 95,
+  71, 80, 79, 84, 80, 60, 76, 93, 85, 81,
+  86, 88, 74, 87, 103, 96, 86, 101, 80, 90,
+  74, 78, 73, 77, 82, 87, 90, 99, 83, 76,
+  85, 83, 82, 94, 93, 71, 88, 72, 83, 81,
+  101, 84, 89, 74, 79, 92, 73, 79, 74, 89,
+  66, 93, 97, 79, 82, 76, 102, 100, 102, 89,
+  73, 87, 85, 79, 92, 72, 115, 86, 73, 118,
+  89, 77, 72, 74, 99, 90, 72, 76, 91, 79,
+  85, 76, 71, 95, 92, 94, 103, 88, 80, 87,
+  83, 113, 68, 81, 66, 75, 100, 95, 106, 103,
+  76, 89, 86, 76, 86, 63, 85, 78, 81, 87,
+  84, 88, 92, 64, 81, 85, 89, 74, 82, 79,
+  87, 72, 86, 84, 75, 91, 87, 56, 84, 84,
+  85, 84, 89, 102, 69, 92, 85, 89, 72, 97,
+  85, 74, 79, 77, 73, 81, 100, 81, 90, 80,
+  73, 64, 90, 82, 93, 75, 73, 87, 85, 72,
+  91, 69, 97, 65, 78, 76, 82, 88, 107, 107,
+  98, 65, 81, 78, 63, 73, 79, 107, 74, 106,
+  83, 85, 81, 72, 97, 88, 115, 95, 69, 81,
+  97, 80, 93, 68, 86, 100, 59, 155, 84, 85,
+  67, 70, 92, 78, 73, 80, 75, 97, 93, 75,
+  70, 77, 88, 87, 111, 80, 83, 85, 78, 125,
+  59, 83, 64, 70, 113, 75, 90, 111, 71, 77,
+  96, 69, 91, 83, 91, 83, 82, 85, 89, 68,
+  100, 59, 70, 80, 91, 76, 82, 66, 92, 79,
+  78, 90, 70, 93, 101, 63, 77, 83, 84, 86,
+  88, 100, 59, 90, 91, 91, 95, 96, 82, 75,
+  86, 75, 75, 82, 100, 86, 85, 83, 80, 59,
+  97, 70, 94, 82, 94, 83, 87, 86, 84, 79,
+  83, 81, 86, 80, 80, 71, 72, 105, 78, 75,
+  79, 91, 84, 82, 95, 88, 91, 82, 77, 78,
+  87, 90, 87, 77, 94, 87, 83, 71, 90, 92,
+  90, 77, 72, 81, 85, 99, 77, 70, 81, 84,
+  90, 73, 74, 72, 96, 78, 80, 83, 77, 75,
+  89, 82, 96, 99, 84, 78, 94, 79, 73, 71,
+  64, 86, 97, 87, 77, 88, 84, 89, 96, 86,
+  78, 96, 96, 75, 83, 81, 84, 76, 82, 68,
+  84, 83, 89, 80, 92, 83, 96, 76, 100, 88,
+  90, 87, 84, 69, 91, 105, 81, 83, 88, 97,
+  74, 90, 87, 86, 93, 90, 87, 90, 85, 74,
+  97, 90, 90, 81, 96, 71, 77, 71, 92, 82,
+  103, 83, 74, 78, 84, 84, 78, 96, 91, 83,
+  92, 74, 90, 75, 93, 100, 93, 77, 79, 81,
+  75, 68, 80, 96, 60, 99, 86, 79, 93, 80,
+  94, 78, 104, 84, 74, 99, 96, 75, 75, 79,
+  70, 80, 98, 117, 103, 75, 80, 84, 97, 89,
+  82, 79, 100, 90, 81, 76, 80, 90, 78, 94,
+  96, 87, 90, 90, 89, 106, 84, 74, 76, 73,
+  93, 85, 91, 107, 74, 104, 81, 71, 92, 74,
+  78, 83, 94, 88, 86, 71, 84, 84, 80, 81,
+  92, 66, 88, 98, 95, 80, 72, 83, 73, 94,
+  73, 71, 93, 100, 78, 89, 86, 78, 73, 88,
+  81, 79, 87, 84, 76, 76, 89, 91, 65, 85,
+  105, 89, 78, 80, 79, 65, 81, 74, 83, 78,
+  62, 81, 80, 79, 82, 70, 90, 78, 88, 71,
+  90, 76, 103, 88, 98, 85, 77, 76, 66, 69,
+  95, 88, 85, 103, 73, 75, 85, 74, 90, 81,
+  93, 89, 70, 85, 85, 73, 70, 83, 98, 85,
+  108, 125, 89, 85, 85, 77, 85, 76, 81, 90,
+  91, 106, 78, 73, 78, 95, 67, 90, 104, 81,
+  95, 85, 83, 102, 71, 80, 80, 68, 86, 80,
+  89, 112, 70, 110, 78, 65, 100, 83, 70, 90,
+  96, 81, 82, 70, 82, 95, 72, 76, 91, 58,
+  82, 83, 97, 81, 63, 93, 69, 96, 86, 75,
+  87, 99, 73, 94, 75, 70, 65, 86, 75, 79,
+  92, 87, 72, 71, 91, 86, 91, 83, 112, 97,
+  69, 86, 71, 59, 83, 69, 78, 80, 80, 84,
+  83, 85, 82, 80, 82, 81, 88, 77, 85, 73,
+  87, 88, 87, 77, 82, 84, 88, 81, 91, 82,
+  94, 92, 79, 80, 92, 91, 84, 93, 91, 86,
+  83, 78, 87, 92, 78, 79, 100, 77, 93, 97,
+  77, 71, 87, 84, 91, 84, 78, 76, 104, 72,
+  77, 82, 79, 93, 84, 88, 96, 100, 90, 75,
+  93, 83, 76, 72, 67, 88, 95, 84, 82, 96,
+  77, 96, 94, 75, 85, 84, 74, 80, 90, 83,
+  88, 77, 84, 87, 80, 76, 85, 76, 97, 74,
+  90, 81, 76, 74, 84, 91, 98, 73, 96, 103,
+  85, 89, 87, 87, 80, 85, 86, 80, 88, 83,
+  85, 78, 84, 87, 103, 87, 84, 88, 80, 84,
+  85, 74, 83, 76, 89, 82, 87, 79, 84, 90,
+  82, 82, 81, 86, 80, 85, 81, 93, 89, 92,
+  78, 73, 73, 89, 90, 85, 102, 97, 91, 76,
+  84, 83, 96, 99, 94, 71, 82, 83, 95, 86,
+  82, 84, 82, 80, 72, 81, 98, 89, 83, 73,
+  85, 100, 68, 86, 85, 84, 78, 73, 79, 84,
+  80, 76, 89, 69, 82, 85, 93, 73, 83, 86,
+  81, 74, 62, 99, 86, 84, 77, 86, 83, 92,
+  88, 85, 83, 80, 82, 79, 91, 78, 87, 80,
+  82, 89, 94, 87, 74, 74, 90, 80, 92, 85,
+  91, 68, 87, 86, 77, 71, 93, 76, 92, 87,
+  98, 89, 87, 87, 89, 73, 81, 75, 87, 83,
+  78, 75, 81, 88, 84, 81, 80, 76, 80, 76,
+  77, 79, 93, 72, 86, 81, 72, 89, 87, 87,
+  68, 82, 82, 85, 82, 92, 94, 80, 80, 71,
+  72, 86, 92, 84, 90, 97, 90, 73, 78, 79,
+  101, 98, 87, 77, 70, 92, 96, 81, 81, 89,
+  85, 76, 81, 83, 97, 81, 95, 76, 84, 103,
+  69, 69, 77, 94, 80, 81, 80, 84, 88, 76,
+  81, 67, 80, 92, 101, 78, 76, 83, 80, 74,
+  60, 103, 85, 91, 86, 87, 83, 89, 84, 78,
+  83, 80, 82, 82, 89, 74, 88, 82, 73, 92,
+  88, 85, 67, 81, 93, 81, 82, 86, 88, 72,
+  87, 89, 70, 75, 94, 84, 85, 90, 100, 88,
+  88, 86, 97, 72, 76, 83, 80, 80, 81, 63,
+  98, 80, 84, 84, 79, 82, 74, 71, 82, 77,
+  95, 75, 81, 85, 73, 89, 84, 86, 76, 83,
+  79, 86, 82, 83, 98, 85, 85, 80, 76, 88,
+  89, 88, 80, 84, 83, 80, 84, 84, 90, 104,
+  86, 85, 82, 89, 93, 77, 80, 94, 77, 77,
+  104, 77, 102, 94, 96, 76, 86, 93, 70, 75,
+  80, 80, 81, 72, 79, 89, 86, 90, 91, 74,
+  84, 83, 87, 74, 81, 84, 78, 72, 61, 93,
+  91, 86, 84, 85, 82, 88, 90, 78, 79, 81,
+  83, 79, 84, 76, 86, 85, 85, 88, 93, 75,
+  78, 80, 86, 86, 94, 85, 78, 66, 92, 86,
+  82, 78, 97, 85, 87, 86, 96, 87, 87, 84,
+  86, 73, 77, 79, 89, 85, 78, 80, 88, 91,
+  88, 86, 80, 82, 83, 80, 77, 77, 92, 75,
+  71, 77, 81, 80, 94, 85, 83, 79, 77, 89,
+  82, 82, 126, 84, 83, 82, 83, 97, 86, 77,
+  90, 98, 88, 78, 99, 79, 89, 98, 105, 101,
+  79, 79, 56, 73, 75, 79, 89, 73, 97, 87,
+  81, 72, 98, 78, 78, 61, 83, 99, 76, 97,
+  78, 101, 83, 89, 75, 82, 66, 78, 82, 80,
+  88, 67, 82, 121, 92, 76, 80, 72, 69, 99,
+  92, 87, 82, 78, 82, 66, 95, 73, 96, 86,
+  82, 66, 87, 76, 90, 82, 92, 78, 71, 78,
+  58, 76, 71, 84, 84, 76, 85, 79, 91, 84,
+  102, 73, 94, 79, 72, 66, 70, 93, 89, 78,
+  87, 99, 84, 86, 86, 80, 67, 77, 87, 100,
+  100, 99, 76, 98, 77, 77, 86, 86, 72, 73,
+  79, 79, 93, 76, 81, 76, 80, 93, 82, 88,
+  106, 104, 78, 80, 85, 83, 85, 79, 78, 94,
+  72, 85, 97, 82, 83, 97, 92, 76, 93, 88,
+  65, 72, 86, 87, 88, 79, 61, 98, 85, 94,
+  102, 92, 84, 82, 90, 76, 73, 97, 80, 104,
+  81, 84, 82, 59, 69, 80, 86, 79, 84, 79,
+  92, 111, 74, 78, 70, 87, 76, 74, 88, 79,
+  80, 78, 94, 78, 95, 104, 92, 81, 88, 77,
+  94, 72, 88, 76, 82, 73, 82, 82, 60, 85,
+  75, 85, 85, 78, 90, 89, 71, 89, 95, 96,
+  94, 80, 77, 73, 63, 91, 93, 80, 106, 100,
+  81, 80, 96, 86, 74, 85, 90, 86, 76, 86,
+  79, 91, 85, 73, 79, 86, 75, 59, 97, 82,
+  80, 84, 76, 76, 87, 85, 78, 86, 68, 100,
+  77, 88, 92, 79, 80, 93, 81, 65, 80, 84,
+  89, 85, 80, 82, 93, 84, 80, 78, 80, 81,
+  78, 90, 82, 85, 74, 77, 73, 73, 84, 85,
+  83, 103, 97, 90, 80, 80, 85, 72, 80, 84,
+  83, 83, 96, 97, 99, 89, 76, 91, 101, 75,
+  80, 77, 75, 95, 88, 70, 68, 62, 92, 74,
+  90, 99, 83, 85, 82, 80, 94, 91, 86, 79,
+  79, 81, 97, 79, 86, 86, 86, 90, 93, 91,
+  97, 77, 75, 88, 80, 86, 98, 84, 87, 80,
+  98, 81, 86, 85, 81, 82, 87, 78, 71, 79,
+  89, 79, 89, 82, 74, 79, 85, 82, 84, 82,
+  82, 83, 74, 76, 108, 88, 95, 92, 88, 92,
+  84, 81, 76, 83, 84, 81, 118, 101, 97, 77,
+  84, 73, 96, 66, 81, 97, 76, 91, 97, 79,
+  90, 100, 97, 87, 102, 70, 64, 86, 90, 69,
+  75, 81, 91, 82, 78, 105, 85, 80, 63, 51,
+  95, 123, 85, 89, 85, 117, 90, 84, 76, 102,
+  65, 88, 68, 81, 86, 62, 77, 134, 84, 68,
+  80, 66, 93, 74, 82, 115, 59, 94, 76, 70,
+  99, 63, 81, 98, 96, 72, 114, 66, 101, 87,
+  83, 71, 94, 61, 62, 70, 72, 88, 64, 75,
+  98, 88, 100, 92, 79, 75, 94, 76, 81, 85,
+  79, 87, 100, 85, 95, 80, 89, 71, 100, 85,
+  57, 90, 99, 83, 96, 85, 92, 118, 83, 73,
+  86, 94, 78, 79, 86, 83, 85, 77, 83, 77,
+  74, 88, 80, 91, 97, 74, 80, 79, 89, 80,
+  95, 78, 69, 70, 82, 85, 104, 82, 86, 99,
+  83, 84, 80, 88, 69, 64, 73, 87, 79, 80,
+  90, 93, 85, 82, 92, 96, 77, 80, 89, 75,
+  79, 89, 89, 99, 81, 78, 84, 95, 63, 80,
+  77, 85, 80, 72, 84, 86, 86, 61, 77, 77,
+  89, 76, 95, 103, 69, 86, 85, 78, 96, 116,
+  84, 87, 91, 81, 109, 83, 86, 85, 75, 69,
+  83, 76, 67, 66, 76, 91, 63, 78, 94, 96,
+  85, 95, 86, 86, 87, 82, 78, 78, 67, 84,
+  96, 78, 89, 86, 87, 83, 85, 83, 94, 87,
+  88, 80, 62, 78, 75, 99, 86, 75, 81, 79,
+  70, 59, 75, 77, 80, 100, 79, 77, 80, 86,
+  74, 94, 60, 85, 69, 86, 86, 94, 86, 99,
+  87, 59, 78, 80, 87, 88, 79, 83, 81, 85,
+  71, 78, 76, 85, 69, 90, 83, 88, 67, 72,
+  86, 63, 87, 83, 90, 104, 92, 87, 83, 75,
+  92, 63, 78, 83, 88, 78, 97, 88, 103, 88,
+  76, 88, 106, 69, 97, 75, 73, 102, 83, 82,
+  75, 69, 95, 68, 82, 106, 82, 94, 78, 77,
+  86, 89, 80, 86, 73, 76, 105, 78, 77, 89,
+  78, 83, 89, 90, 93, 83, 73, 95, 87, 91,
+  99, 86, 78, 82, 95, 80, 86, 79, 70, 80,
+  79, 75, 73, 94, 83, 84, 85, 84, 77, 85,
+  83, 81, 79, 81, 77, 87, 76, 72, 92, 79,
+  93, 90, 97, 91, 83, 75, 65, 83, 81, 87,
+  88, 80, 83, 80, 83, 80, 90, 80, 86, 100,
+  77, 88, 84, 84, 81, 92, 96, 77, 79, 80,
+  67, 90, 83, 84, 82, 80, 60, 87, 88, 77,
+  76, 71, 81, 83, 75, 120, 84, 91, 76, 83,
+  86, 77, 76, 76, 76, 74, 76, 78, 93, 106,
+  94, 112, 91, 66, 88, 88, 87, 91, 77, 80,
+  86, 91, 65, 78, 95, 73, 88, 93, 87, 66,
+  98, 87, 97, 85, 86, 76, 62, 71, 64, 76,
+  73, 94, 76, 89, 86, 91, 85, 102, 75, 85,
+  91, 77, 96, 84, 82, 85, 75, 75, 80, 90,
+  77, 87, 82, 82, 66, 90, 81, 93, 86, 83,
+  85, 98, 85, 82, 88, 84, 87, 94, 75, 86,
+  84, 80, 83, 74, 70, 82, 81, 91, 99, 60,
+  76, 77, 89, 79, 86, 85, 78, 86, 77, 85,
+  100, 82, 76, 89, 84, 87, 75, 92, 73, 71,
+  71, 94, 79, 90, 123, 88, 95, 85, 70, 85,
+  81, 87, 75, 66, 80, 93, 75, 89, 84, 78,
+  78, 92, 77, 81, 85, 85, 89, 95, 88, 101,
+  83, 78, 89, 87, 93, 84, 86, 80, 83, 89,
+  69, 85, 98, 114, 79, 94, 88, 76, 104, 76,
+  88, 89, 78, 74, 68, 74, 64, 81, 73, 98,
+  71, 82, 86, 99, 94, 98, 80, 72, 85, 81,
+  86, 94, 75, 81, 89, 85, 75, 87, 80, 77,
+  77, 85, 102, 89, 88, 86, 71, 82, 79, 95,
+  83, 79, 87, 85, 78, 74, 62, 84, 74, 102,
+  81, 77, 83, 80, 73, 89, 79, 89, 71, 89,
+  91, 90, 82, 89, 92, 69, 73, 82, 92, 82,
+  80, 79, 91, 81, 84, 78, 77, 81, 71, 88,
+  78, 89, 102, 71, 87, 82, 85, 84, 78, 89,
+  87, 78, 86, 81, 88, 78, 80, 83, 78, 98,
+  95, 93, 94, 83, 77, 78, 103, 76, 87, 79,
+  77, 88, 77, 83, 96, 77, 82, 77, 72, 102,
+  87, 98, 83, 81, 82, 90, 91, 74, 73, 78,
+  97, 80, 91, 92, 77, 86, 81, 86, 86, 75,
+  84, 97, 93, 87, 99, 71, 83, 81, 86, 87,
+  80, 81, 87, 88, 92, 74, 81, 80, 86, 91,
+  85, 82, 83, 83, 95, 79, 88, 91, 71, 83,
+  75, 81, 74, 70, 115, 96, 64, 93, 90, 76,
+  87, 91, 77, 84, 94, 84, 56, 81, 72, 84,
+  85, 102, 110, 95, 100, 82, 78, 73, 89, 79,
+  127, 122, 102, 91, 81, 84, 80, 92, 104, 97,
+  91, 67, 115, 76, 75, 100, 69, 112, 94, 118,
+  77, 88, 75, 99, 88, 79, 110, 87, 89, 73,
+  106, 82, 72, 76, 80, 64, 69, 54, 74, 93,
+  70, 89, 94, 86, 85, 93, 65, 80, 85, 80,
+  94, 64, 86, 71, 96, 101, 74, 92, 92, 91,
+  74, 88, 86, 80, 96, 89, 89, 77, 80, 64,
+  103, 81, 91, 91, 99, 85, 89, 86, 91, 80,
+  80, 68, 81, 94, 74, 93, 80, 90, 103, 92,
+  89, 95, 77, 72, 98, 74, 89, 85, 77, 92,
+  72, 68, 104, 87, 90, 95, 88, 86, 73, 86,
+  78, 80, 89, 96, 72, 75, 85, 88, 88, 88,
+  111, 69, 100, 80, 92, 90, 75, 85, 106, 122,
+  82, 79, 81, 77, 79, 88, 82, 84, 91, 82,
+  83, 79, 68, 79, 78, 92, 79, 102, 84, 84,
+  83, 84, 80, 90, 90, 70, 86, 75, 79, 86,
+  77, 77, 87, 42, 72, 62, 80, 72, 71, 78,
+  75, 84, 85, 89, 77, 68, 75, 84, 76, 98,
+  86, 84, 87, 99, 76, 80, 97, 85, 83, 88,
+  73, 65, 71, 97, 75, 84, 86, 75, 89, 79,
+  73, 73, 84, 85, 81, 74, 84, 77, 84, 79,
+  95, 83, 87, 93, 70, 73, 106, 85, 74, 81,
+  89, 82, 97, 82, 76, 90, 86, 85, 83, 68,
+  81, 83, 99, 69, 81, 91, 77, 76, 84, 83,
+  93, 94, 86, 65, 94, 91, 87, 75, 97, 75,
+  87, 79, 94, 86, 69, 83, 95, 96, 74, 78,
+  82, 74, 76, 76, 61, 78, 102, 103, 67, 88,
+  72, 79, 78, 74, 78, 80, 89, 86, 89, 90,
+  81, 96, 63, 81, 80, 80, 72, 86, 87, 81,
+  85, 57, 79, 91, 93, 80, 78, 75, 72, 87,
+  77, 76, 91, 70, 80, 80, 78, 107, 82, 91,
+  81, 85, 89, 70, 97, 87, 83, 88, 78, 62,
+  71, 92, 72, 90, 90, 98, 93, 84, 76, 66,
+  74, 84, 83, 82, 84, 81, 74, 88, 83, 82,
+  92, 92, 73, 80, 91, 88, 75, 72, 88, 89,
+  70, 85, 67, 97, 85, 81, 77, 72, 100, 90,
+  82, 83, 89, 86, 79, 91, 83, 82, 84, 88,
+  65, 74, 78, 85, 88, 85, 109, 90, 97, 78,
+  88, 86, 84, 88, 99, 116, 87, 84, 77, 76,
+  67, 79, 72, 79, 96, 70, 88, 53, 73, 81,
+  76, 89, 83, 86, 84, 86, 69, 85, 80, 85,
+  90, 89, 82, 86, 84, 90, 83, 85, 93, 83,
+  69, 65, 76, 80, 62, 89, 71, 75, 91, 93,
+  68, 72, 75, 80, 92, 67, 91, 76, 85, 100,
+  71, 92, 85, 86, 78, 83, 85, 69, 76, 90,
+  74, 87, 81, 68, 75, 84, 79, 78, 91, 75,
+  77, 84, 79, 88, 106, 74, 83, 85, 84, 82,
+  78, 82, 113, 82, 85, 96, 93, 84, 96, 80,
+  83, 88, 83, 78, 77, 78, 88, 82, 90, 68,
+  87, 91, 86, 86, 90, 89, 83, 92, 89, 76,
+  93, 89, 92, 78, 98, 81, 77, 77, 98, 83,
+  75, 88, 88, 94, 81, 80, 88, 75, 80, 83,
+  63, 81, 108, 90, 72, 74, 67, 76, 92, 73,
+  80, 71, 86, 85, 94, 84, 75, 95, 82, 86,
+  83, 99, 79, 87, 82, 92, 93, 71, 67, 93,
+  86, 71, 72, 77, 70, 85, 83, 79, 84, 71,
+  81, 87, 64, 98, 90, 92, 80, 87, 93, 89,
+  84, 80, 90, 80, 78, 62, 75, 95, 71, 93,
+  83, 91, 74, 88, 77, 63, 88, 79, 79, 83,
+  81, 94, 88, 83, 94, 84, 93, 79, 78, 78,
+  81, 86, 84, 82, 90, 93, 69, 84, 67, 88,
+  89, 76, 84, 81, 80, 85, 79, 84, 78, 90,
+  92, 81, 91, 85, 93, 84, 92, 74, 91, 95,
+  77, 75, 84, 89, 86, 80, 94, 76, 76, 83,
+  77, 82, 78, 85, 82, 78, 87, 85, 75, 86,
+  99, 89, 74, 101, 84, 81, 84, 77, 88, 82,
+  87, 91, 91, 85, 85, 88, 76, 84, 84, 100,
+  80, 75, 89, 92, 84, 89, 91, 110, 95, 70,
+  80, 84, 79, 89, 78, 82, 88, 79, 89, 88,
+  65, 95, 86, 88, 76, 84, 95, 80, 82, 88,
+  81, 77, 78, 77, 85, 80, 78, 89, 80, 97,
+  84, 89, 90, 80, 80, 82, 80, 89, 84, 89,
+  64, 90, 75, 88, 94, 85, 82, 91, 80, 87,
+  86, 83, 79, 88, 61, 80, 70, 81, 89, 88,
+  78, 71, 94, 88, 82, 96, 81, 85, 76, 84,
+  89, 87, 83, 86, 81, 74, 79, 100, 86, 79,
+  101, 79, 83, 83, 100, 83, 82, 87, 97, 102,
+  90, 83, 78, 77, 71, 82, 62, 81, 103, 82,
+  76, 58, 69, 76, 86, 83, 92, 66, 88, 82,
+  89, 85, 78, 90, 73, 94, 74, 94, 81, 93,
+  86, 84, 88, 92, 83, 83, 91, 74, 63, 76,
+  85, 80, 87, 84, 76, 69, 77, 83, 72, 80,
+  89, 92, 79, 96, 75, 89, 87, 82, 90, 85,
+  76, 73, 77, 96, 72, 91, 79, 82, 66, 83,
+  81, 71, 87, 77, 85, 84, 74, 88, 92, 89,
+  97, 89, 88, 81, 77, 80, 108, 82, 83, 86,
+  94, 88, 71, 83, 72, 89, 84, 73, 84, 75,
+  84, 87, 82, 74, 81, 85, 86, 84, 89, 94,
+  84, 84, 95, 76, 88, 96, 82, 77, 82, 79,
+  80, 79, 100, 79, 84, 85, 81, 99, 85, 82,
+  88, 77, 91, 79, 76, 83, 102, 91, 76, 93,
+  77, 80, 99, 70, 87, 67, 92, 80, 92, 82,
+  84, 90, 81, 89, 85, 99, 81, 84, 82, 96,
+  88, 87, 80, 106, 87, 78, 71, 86, 74, 94,
+  81, 76, 87, 77, 90, 83, 60, 91, 84, 91,
+  74, 85, 92, 86, 79, 84, 88, 80, 77, 76,
+  88, 98, 78, 92, 84, 96, 73, 90, 86, 71,
+  84, 84, 84, 85, 83, 89, 81, 90, 91, 89,
+  93, 77, 83, 83, 71, 90, 85, 86, 85, 90,
+  54, 84, 66, 83, 85, 82, 87, 83, 79, 91,
+  76, 87, 76, 83, 93, 85, 86, 86, 96, 78,
+  88, 76, 85, 99, 76, 78, 81, 84, 92, 83,
+  99, 75, 92, 82, 69, 92, 86, 87, 86, 82,
+  95, 80, 85, 77, 86, 81, 81, 111, 91, 83,
+  85, 74, 100, 82, 86, 86, 84, 76, 93, 82,
+  86, 89, 87, 100, 82, 82, 84, 96, 96, 97,
+  97, 102, 83, 82, 73, 93, 84, 98, 80, 83,
+  91, 84, 92, 86, 77, 77, 80, 87, 79, 90,
+  92, 74, 80, 86, 85, 80, 86, 92, 97, 89,
+  89, 85, 76, 86, 82, 84, 92, 90, 80, 83,
+  83, 84, 86, 93, 77, 87, 76, 93, 88, 85,
+  84, 84, 79, 85, 90, 87, 76, 85, 68, 77,
+  81, 75, 85, 92, 107, 78, 97, 92, 71, 103,
+  76, 79, 69, 90, 76, 88, 86, 74, 73, 85,
+  85, 85, 93, 76, 86, 70, 106, 87, 94, 77,
+  83, 85, 93, 95, 87, 86, 80, 73, 90, 88,
+  91, 77, 66, 82, 79, 89, 70, 88, 81, 86,
+  81, 84, 77, 78, 99, 90, 91, 79, 89, 99,
+  82, 90, 60, 81, 73, 73, 87, 79, 95, 61,
+  83, 89, 86, 66, 85, 85, 68, 77, 76, 80,
+  86, 107, 96, 96, 81, 96, 76, 72, 72, 76,
+  94, 81, 107, 69, 67, 80, 84, 72, 87, 78,
+  83, 83, 89, 80, 86, 91, 75, 86, 97, 95,
+  72, 83, 83, 79, 81, 74, 92, 79, 109, 103,
+  87, 92, 85, 79, 108, 68, 84, 91, 81, 100,
+  91, 83, 123, 94, 102, 92, 73, 83, 74, 81,
+  72, 83, 76, 95, 106, 88, 76, 84, 82, 72,
+  89, 67, 80, 82, 81, 84, 83, 77, 85, 83,
+  92, 91, 92, 98, 79, 81, 90, 79, 94, 77,
+  83, 76, 74, 85, 82, 92, 80, 73, 85, 93,
+  76, 73, 93, 108, 93, 90, 83, 114, 77, 84,
+  49, 84, 76, 67, 89, 78, 87, 60, 89, 74,
+  89, 61, 99, 87, 54, 80, 79, 72, 84, 88,
+  101, 97, 79, 110, 88, 82, 73, 86, 79, 83,
+  125, 73, 68, 80, 79, 67, 71, 75, 91, 74,
+  90, 82, 83, 82, 74, 85, 98, 95, 78, 88,
+  98, 76, 89, 70, 91, 75, 112, 96, 80, 101,
+  93, 85, 98, 70, 81, 89, 80, 92, 86, 95,
+  97, 97, 88, 93, 74, 104, 77, 80, 64, 89,
+  81, 84, 86, 86, 71, 86, 83, 85, 99, 80,
+  76, 74, 97, 86, 85, 78, 84, 83, 94, 87,
+  84, 99, 77, 84, 90, 82, 92, 73, 73, 81,
+  84, 83, 82, 91, 82, 75, 80, 106, 77, 81,
+  101, 81, 90, 87, 95, 92, 89, 88, 66, 82,
+  78, 81, 88, 85, 100, 62, 90, 85, 73, 73,
+  95, 88, 69, 78, 88, 82, 83, 80, 96, 90,
+  83, 96, 80, 90, 78, 80, 86, 81, 103, 83,
+  70, 84, 85, 75, 83, 78, 87, 81, 84, 72,
+  87, 80, 77, 83, 97, 90, 80, 85, 84, 79,
+  68, 80, 90, 94, 102, 91, 83, 92, 89, 92,
+  88, 74, 79, 94, 86, 90, 91, 84, 96, 77,
+  99, 84, 87, 95, 69, 77, 88, 87, 78, 89,
+  83, 82, 74, 75, 74, 72, 75, 77, 93, 76,
+  81, 85, 88, 85, 83, 81, 97, 78, 79, 92,
+  87, 86, 85, 95, 75, 85, 57, 78, 74, 88,
+  91, 78, 88, 100, 69, 89, 88, 84, 93, 82,
+  87, 93, 83, 67, 79, 78, 64, 81, 71, 96,
+  68, 79, 82, 86, 85, 98, 86, 49, 88, 90,
+  77, 81, 63, 88, 79, 83, 77, 91, 80, 78,
+  80, 75, 73, 92, 88, 77, 96, 74, 75, 76,
+  86, 81, 90, 90, 78, 90, 76, 97, 73, 100,
+  77, 86, 78, 111, 74, 83, 82, 67, 83, 75,
+  76, 85, 112, 91, 70, 92, 79, 101, 84, 79,
+  80, 80, 83, 89, 81, 86, 90, 79, 89, 78,
+  96, 75, 66, 77, 90, 84, 84, 92, 73, 68,
+  73, 75, 70, 66, 62, 75, 96, 80, 78, 90,
+  80, 82, 91, 78, 100, 83, 68, 86, 83, 87,
+  81, 94, 73, 89, 71, 67, 76, 75, 93, 70,
+  100, 102, 59, 88, 89, 74, 85, 56, 89, 98,
+  64, 100, 86, 70, 61, 81, 70, 105, 63, 81,
+  67, 91, 95, 97, 85, 43, 90, 91, 80, 78,
+  57, 80, 83, 83, 80, 94, 81, 78, 82, 85,
+  76, 100, 81, 77, 72, 77, 74, 73, 80, 72,
+  74, 87, 79, 95, 91, 107, 72, 87, 79, 88,
+  78, 128, 83, 73, 87, 64, 67, 68, 73, 80,
+  108, 100, 85, 99, 76, 119, 80, 82, 71, 79,
+  78, 83, 84, 89, 94, 79, 84, 87, 86, 81,
+  73, 75, 84, 87, 86, 84, 92, 68, 72, 80,
+  76, 74, 77, 82, 92, 75, 97, 87, 79, 84,
+  85, 80, 97, 88, 74, 86, 86, 81, 85, 88,
+  73, 85, 90, 77, 75, 80, 89, 83, 94, 83,
+  64, 88, 88, 84, 96, 69, 87, 96, 82, 118,
+  89, 82, 66, 85, 71, 86, 69, 85, 81, 91,
+  93, 101, 82, 75, 84, 97, 77, 80, 67, 86,
+  80, 84, 78, 84, 83, 79, 82, 83, 77, 92,
+  84, 83, 92, 83, 73, 76, 84, 76, 73, 83,
+  79, 91, 102, 91, 82, 72, 78, 84, 83, 108,
+  88, 78, 87, 65, 59, 78, 79, 83, 91, 94,
+  93, 88, 77, 103, 81, 85, 73, 88, 87, 86,
+  81, 83, 93, 76, 98, 86, 96, 86, 74, 76,
+  83, 85, 76, 86, 88, 85, 63, 86, 80, 85,
+  90, 83, 86, 86, 84, 79, 90, 87, 83, 81,
+  89, 70, 78, 91, 97, 96, 73, 83, 88, 78,
+  74, 91, 78, 90, 82, 83, 86, 98, 81, 88,
+  78, 89, 68, 71, 87, 82, 96, 76, 83, 62,
+  79, 80, 82, 89, 87, 71, 87, 85, 90, 99,
+  76, 83, 98, 81, 86, 86, 76, 88, 69, 66,
+  73, 89, 74, 77, 83, 87, 86, 91, 86, 95,
+  80, 79, 81, 79, 96, 86, 91, 85, 77, 92,
+  80, 82, 89, 94, 79, 81, 68, 94, 97, 95,
+  82, 89, 86, 91, 76, 98, 83, 74, 87, 88,
+  90, 81, 84, 90, 92, 80, 88, 75, 77, 78,
+  92, 78, 95, 77, 105, 71, 75, 77, 89, 87,
+  81, 85, 82, 81, 65, 86, 81, 86, 82, 84,
+  92, 96, 79, 76, 86, 91, 77, 83, 86, 69,
+  74, 84, 98, 100, 78, 91, 92, 86, 82, 83,
+  79, 82, 86, 73, 100, 98, 67, 77, 69, 89,
+  62, 57, 87, 84, 79, 78, 83, 66, 74, 87,
+  84, 93, 87, 80, 76, 91, 88, 98, 72, 81,
+  90, 81, 92, 81, 73, 85, 75, 70, 66, 92,
+  75, 69, 83, 89, 83, 90, 85, 87, 65, 78,
+  77, 77, 89, 92, 85, 83, 81, 100, 82, 81,
+  86, 80, 82, 82, 66, 96, 98, 86, 81, 83,
+  78, 90, 70, 87, 82, 63, 96, 92, 95, 87,
+  84, 93, 97, 81, 80, 73, 86, 73, 90, 77,
+  95, 87, 91, 78, 78, 72, 88, 87, 83, 81,
+  88, 87, 67, 86, 80, 86, 87, 84, 85, 89,
+  95, 83, 84, 87, 82, 82, 86, 76, 75, 87,
+  93, 91, 80, 91, 87, 83, 90, 88, 82, 85,
+  79, 78, 85, 95, 74, 76, 77, 88, 65, 73,
+  85, 86, 94, 86, 88, 68, 81, 82, 82, 85,
+  83, 78, 85, 83, 87, 98, 74, 98, 90, 87,
+  83, 85, 77, 90, 75, 76, 69, 85, 75, 76,
+  87, 82, 82, 91, 93, 92, 76, 78, 81, 84,
+  98, 87, 78, 86, 81, 92, 93, 80, 93, 84,
+  79, 80, 73, 97, 99, 84, 77, 85, 75, 93,
+  77, 81, 80, 79, 100, 84, 88, 79, 91, 97,
+  90, 88, 88, 80, 79, 76, 87, 80, 118, 91,
+  82, 87, 75, 71, 101, 89, 86, 81, 97, 76,
+  61, 79, 86, 76, 84, 88, 101, 88, 86, 86,
+  93, 86, 92, 88, 94, 97, 93, 93, 89, 81,
+  99, 104, 97, 94, 88, 70, 93, 84, 106, 73,
+  60, 95, 94, 90, 92, 94, 82, 69, 94, 91,
+  65, 88, 109, 70, 124, 85, 66, 125, 74, 76,
+  74, 76, 83, 91, 91, 60, 93, 101, 86, 81,
+  87, 100, 80, 87, 73, 68, 83, 55, 88, 87,
+  78, 79, 91, 76, 87, 92, 82, 82, 95, 94,
+  78, 94, 80, 78, 95, 83, 75, 84, 89, 88,
+  85, 81, 91, 80, 74, 83, 76, 67, 81, 93,
+  97, 97, 74, 86, 82, 91, 74, 83, 94, 78,
+  91, 89, 71, 76, 78, 76, 113, 97, 75, 84,
+  73, 65, 102, 92, 92, 79, 103, 84, 62, 78,
+  85, 75, 82, 78, 107, 85, 87, 83, 91, 82,
+  86, 91, 85, 94, 92, 89, 85, 86, 98, 102,
+  84, 108, 87, 66, 102, 79, 105, 75, 54, 105,
+  81, 95, 89, 92, 79, 79, 90, 89, 60, 91,
+  100, 68, 129, 89, 67, 128, 72, 78, 87, 78,
+  84, 91, 95, 69, 87, 98, 82, 79, 84, 100,
+  89, 89, 64, 70, 77, 55, 86, 96, 75, 82,
+  93, 86, 79, 88, 85, 93, 93, 95, 77, 93,
+  79, 84, 111, 87, 78, 88, 91, 91, 84, 87,
+  90, 78, 69, 77, 82, 69, 80, 97, 95, 101,
+  94, 95, 86, 85, 75, 84, 91, 72, 89, 89,
+  71, 74, 87, 73, 94, 94, 84, 80, 72, 69,
+  100, 89, 91, 76, 91, 83, 58, 84, 91, 76,
+  84, 81, 98, 88, 85, 81, 84, 84, 88, 87,
+  91, 101, 93, 85, 89, 80, 98, 91, 87, 85,
+  82, 76, 93, 81, 103, 77, 66, 95, 80, 84,
+  94, 90, 87, 82, 93, 86, 67, 93, 105, 72,
+  117, 87, 65, 102, 82, 70, 78, 79, 81, 92,
+  89, 67, 79, 96, 88, 86, 84, 98, 81, 90,
+  65, 70, 80, 57, 95, 87, 75, 80, 94, 73,
+  82, 97, 82, 81, 94, 94, 83, 86, 79, 83,
+  106, 78, 79, 79, 89, 87, 83, 84, 88, 80,
+  70, 83, 80, 76, 83, 94, 91, 103, 84, 83,
+  78, 91, 72, 87, 93, 81, 88, 92, 77, 81,
+  87, 73, 77, 72, 81, 73, 101, 86, 84, 84,
+  90, 85, 77, 87, 65, 74, 72, 84, 75, 76,
+  110, 79, 85, 74, 86, 114, 84, 80, 92, 100,
+  82, 95, 87, 71, 84, 80, 108, 83, 78, 57,
+  95, 74, 112, 87, 78, 77, 72, 74, 94, 76,
+  93, 74, 90, 85, 74, 89, 110, 79, 98, 78,
+  81, 90, 95, 75, 63, 79, 77, 81, 73, 71,
+  69, 77, 99, 102, 75, 94, 76, 85, 93, 69,
+  85, 71, 86, 69, 85, 72, 82, 70, 89, 77,
+  79, 77, 83, 85, 74, 69, 84, 87, 78, 86,
+  78, 79, 92, 86, 79, 71, 82, 96, 97, 81,
+  72, 65, 75, 71, 99, 87, 70, 84, 83, 100,
+  75, 74, 89, 92, 81, 74, 69, 92, 81, 70,
+  75, 77, 77, 72, 102, 80, 84, 84, 91, 86,
+  75, 87, 66, 71, 78, 84, 71, 74, 119, 76,
+  82, 66, 89, 105, 81, 82, 88, 106, 82, 95,
+  91, 73, 81, 76, 107, 82, 82, 56, 97, 74,
+  110, 91, 68, 86, 65, 76, 93, 76, 94, 87,
+  87, 85, 75, 90, 110, 76, 101, 77, 76, 94,
+  108, 72, 69, 79, 70, 86, 73, 76, 64, 77,
+  97, 92, 75, 95, 76, 80, 93, 73, 82, 75,
+  89, 73, 83, 77, 74, 74, 83, 78, 84, 79,
+  78, 85, 73, 67, 81, 87, 83, 90, 84, 73,
+  87, 88, 77, 71, 82, 94, 94, 77, 79, 61,
+  74, 77, 104, 96, 73, 86, 79, 93, 74, 77,
+  88, 88, 84, 76, 62, 91, 90, 71, 72, 76,
+  82, 74, 96, 75, 90, 86, 86, 78, 75, 76,
+  66, 79, 75, 86, 74, 75, 103, 80, 81, 75,
+  83, 106, 78, 78, 88, 104, 87, 97, 92, 70,
+  87, 79, 97, 81, 87, 69, 91, 78, 97, 90,
+  81, 85, 70, 80, 93, 75, 93, 81, 91, 84,
+  75, 82, 102, 77, 91, 83, 76, 79, 92, 75,
+  70, 83, 76, 80, 77, 77, 62, 82, 93, 98,
+  80, 94, 76, 80, 77, 74, 83, 71, 90, 75,
+  82, 78, 70, 77, 82, 79, 82, 78, 85, 90,
+  73, 67, 85, 85, 85, 85, 86, 70, 91, 84,
+  86, 77, 88, 90, 91, 83, 85, 69, 80, 84,
+  91, 91, 64, 85, 81, 95, 76, 77, 84, 91,
+  81, 81, 76, 90, 101, 67, 63, 80, 96, 96,
+  89, 91, 77, 77, 83, 83, 90, 86, 88, 87,
+  67, 109, 84, 79, 83, 84, 74, 80, 87, 111,
+  84, 76, 78, 97, 83, 89, 91, 74, 85, 77,
+  79, 84, 86, 85, 91, 72, 86, 88, 95, 62,
+  77, 77, 85, 78, 93, 82, 84, 79, 84, 83,
+  88, 97, 63, 79, 95, 75, 80, 91, 77, 96,
+  74, 81, 74, 75, 89, 73, 99, 104, 87, 89,
+  70, 81, 94, 77, 89, 66, 84, 72, 95, 71,
+  86, 84, 84, 77, 64, 91, 69, 83, 80, 71,
+  96, 97, 79, 84, 82, 92, 92, 86, 81, 79,
+  82, 92, 78, 105, 108, 86, 90, 73, 75, 82,
+  62, 79, 85, 78, 78, 84, 77, 93, 83, 80,
+  94, 87, 96, 76, 76, 77, 97, 80, 90, 90,
+  77, 78, 81, 83, 83, 88, 93, 82, 71, 110,
+  85, 82, 78, 79, 83, 82, 87, 106, 79, 76,
+  77, 99, 83, 93, 93, 72, 86, 64, 77, 82,
+  91, 84, 86, 77, 86, 87, 91, 64, 76, 75,
+  88, 76, 101, 91, 81, 82, 85, 82, 92, 89,
+  63, 76, 93, 75, 80, 91, 78, 95, 79, 78,
+  78, 80, 76, 73, 96, 93, 88, 89, 73, 78,
+  91, 85, 85, 76, 87, 74, 94, 75, 76, 91,
+  86, 81, 67, 82, 67, 88, 76, 70, 93, 95,
+  77, 88, 82, 78, 92, 87, 75, 82, 83, 88,
+  82, 101, 113, 80, 87, 77, 80, 90, 59, 79,
+  83, 73, 78, 83, 79, 92, 87, 83, 94, 89,
+  96, 79, 86, 78, 91, 76, 80, 83, 78, 80,
+  82, 82, 87, 72, 91, 84, 67, 101, 80, 85,
+  74, 88, 94, 79, 86, 101, 78, 77, 70, 97,
+  82, 94, 88, 68, 91, 71, 79, 84, 93, 84,
+  95, 73, 85, 89, 100, 69, 79, 82, 85, 74,
+  87, 85, 80, 79, 85, 81, 88, 88, 64, 80,
+  87, 76, 78, 93, 84, 94, 76, 80, 74, 88,
+  66, 79, 95, 99, 91, 87, 72, 82, 85, 79,
+  85, 72, 84, 85, 87, 78, 70, 90, 80, 78,
+  64, 82, 74, 88, 77, 68, 93, 92, 75, 84,
+  86, 71, 94, 85, 85, 80, 87, 90, 75, 100,
+  105, 83, 89, 83, 83, 86, 68, 83, 88, 79,
+  83, 81, 70, 94, 84, 84, 95, 86, 74, 86,
+  78, 79, 73, 82, 124, 115, 55, 90, 89, 85,
+  82, 78, 71, 90, 93, 66, 77, 92, 72, 93,
+  92, 65, 78, 73, 80, 88, 87, 83, 75, 75,
+  98, 72, 79, 92, 75, 86, 88, 80, 75, 78,
+  75, 82, 77, 110, 79, 75, 76, 83, 77, 81,
+  105, 88, 90, 81, 83, 72, 98, 80, 85, 79,
+  83, 86, 84, 81, 76, 69, 75, 83, 82, 76,
+  89, 77, 87, 98, 142, 81, 84, 90, 133, 74,
+  81, 87, 73, 86, 78, 81, 99, 69, 84, 86,
+  75, 88, 84, 86, 73, 95, 74, 89, 116, 72,
+  85, 115, 83, 90, 101, 81, 76, 74, 73, 76,
+  70, 80, 79, 73, 81, 77, 94, 73, 86, 81,
+  66, 86, 83, 79, 79, 86, 77, 80, 84, 82,
+  74, 78, 120, 101, 52, 84, 87, 89, 91, 87,
+  78, 92, 93, 68, 76, 86, 79, 99, 79, 67,
+  75, 73, 75, 81, 81, 82, 81, 75, 85, 75,
+  81, 80, 78, 85, 80, 81, 79, 78, 80, 76,
+  76, 112, 87, 81, 76, 84, 71, 75, 99, 86,
+  84, 80, 74, 69, 93, 83, 91, 82, 84, 84,
+  78, 76, 76, 75, 81, 76, 78, 78, 86, 72,
+  92, 89, 139, 80, 87, 92, 120, 69, 90, 91,
+  73, 89, 84, 71, 96, 83, 78, 88, 72, 100,
+  93, 85, 67, 100, 77, 86, 107, 76, 86, 112,
+  75, 88, 99, 78, 74, 68, 81, 74, 72, 84,
+  83, 78, 75, 76, 102, 76, 80, 80, 73, 91,
+  82, 79, 76, 92, 73, 75, 83, 82, 73, 87,
+  123, 101, 58, 87, 84, 83, 82, 88, 76, 88,
+  95, 64, 76, 87, 78, 91, 83, 71, 70, 77,
+  82, 87, 80, 81, 79, 72, 98, 77, 88, 81,
+  77, 87, 75, 80, 74, 85, 73, 85, 77, 111,
+  75, 80, 75, 82, 79, 78, 105, 85, 91, 77,
+  90, 70, 96, 73, 87, 76, 83, 83, 82, 78,
+  78, 74, 79, 77, 78, 72, 87, 77, 91, 101,
+  140, 89, 89, 89, 130, 75, 87, 88, 74, 84,
+  84, 87, 96, 73, 84, 87, 78, 93, 91, 86,
+  71, 96, 71, 85, 113, 78, 85, 102, 82, 92,
+  101, 82, 77, 78, 80, 75, 75, 79, 81, 72,
+  78, 79, 92, 68, 85, 80, 67, 84, 82, 80,
+  78, 87, 86, 87, 83, 79, 81, 84, 108, 110,
+  59, 87, 89, 84, 78, 88, 79, 90, 92, 64,
+  85, 90, 80, 90, 92, 66, 83, 69, 80, 87,
+  83, 76, 85, 73, 89, 83, 82, 90, 80, 80,
+  81, 76, 70, 71, 86, 79, 81, 109, 82, 77,
+  70, 79, 80, 78, 101, 87, 79, 76, 78, 76,
+  92, 82, 93, 73, 84, 80, 86, 77, 80, 74,
+  74, 77, 78, 82, 79, 75, 80, 94, 135, 86,
+  85, 93, 119, 80, 79, 84, 72, 79, 79, 79,
+  96, 86, 90, 86, 76, 89, 91, 89, 79, 104,
+  82, 88, 103, 74, 89, 108, 85, 87, 102, 78,
+  82, 77, 79, 70, 70, 85, 82, 79, 80, 74,
+  97, 72, 91, 82, 65, 90, 83, 87, 79, 95,
+  95, 83, 83, 88, 81, 80, 109, 99, 58, 86,
+  92, 92, 95, 91, 86, 97, 93, 67, 89, 87,
+  87, 98, 72, 67, 84, 67, 73, 84, 75, 83,
+  89, 76, 81, 82, 82, 81, 81, 81, 91, 78,
+  73, 80, 89, 77, 80, 107, 91, 82, 75, 83,
+  76, 76, 94, 84, 74, 86, 71, 76, 84, 87,
+  96, 72, 84, 90, 77, 81, 79, 83, 77, 72,
+  80, 91, 72, 76, 85, 85, 133, 78, 83, 96,
+  107, 77, 85, 86, 75, 82, 81, 71, 96, 87,
+  87, 80, 73, 108, 97, 85, 83, 112, 87, 84,
+  87, 79, 98, 104, 88, 93, 100, 78, 84, 72,
+  88, 68, 77, 85, 82, 83, 76, 75, 110, 77,
+  79, 82, 73, 98, 84, 90, 84, 103, 78, 79,
+  83, 85, 79, 93, 104, 91, 62, 83, 87, 80,
+  80, 85, 80, 91, 92, 66, 85, 87, 83, 82,
+  85, 73, 75, 73, 80, 86, 79, 83, 81, 71,
+  88, 80, 78, 84, 75, 78, 85, 76, 72, 71,
+  76, 83, 80, 109, 81, 81, 71, 78, 82, 73,
+  101, 85, 80, 86, 86, 76, 93, 73, 91, 73,
+  83, 77, 85, 74, 83, 76, 75, 77, 77, 74,
+  77, 80, 83, 97, 128, 85, 87, 86, 116, 76,
+  80, 92, 72, 78, 85, 88, 95, 92, 92, 85,
+  79, 89, 91, 88, 77, 97, 76, 85, 109, 81,
+  88, 92, 86, 87, 102, 80, 78, 80, 75, 70,
+  73, 82, 77, 74, 82, 73, 91, 70, 91, 78,
+  68, 88, 82, 87, 80, 93, 81, 90, 84, 77,
+  87, 82, 106, 105, 52, 87, 88, 79, 79, 95,
+  86, 90, 94, 59, 75, 84, 75, 94, 78, 69,
+  80, 74, 81, 85, 87, 76, 80, 69, 94, 83,
+  76, 86, 75, 70, 70, 80, 71, 81, 79, 88,
+  82, 113, 77, 83, 69, 77, 86, 92, 111, 88,
+  87, 72, 78, 78, 93, 73, 98, 74, 78, 88,
+  89, 90, 82, 68, 72, 84, 79, 72, 75, 74,
+  82, 99, 138, 78, 88, 91, 124, 72, 77, 84,
+  71, 72, 74, 84, 90, 84, 89, 95, 77, 85,
+  88, 100, 79, 101, 78, 91, 105, 79, 87, 114,
+  89, 85, 98, 77, 81, 84, 84, 73, 78, 86,
+  85, 76, 79, 76, 90, 75, 90, 83, 62, 91,
+  79, 83, 76, 87, 83, 81, 80, 85, 86, 73,
+  99, 105, 54, 85, 92, 92, 85, 84, 86, 92,
+  90, 63, 79, 81, 81, 92, 76, 66, 78, 69,
+  83, 85, 85, 86, 74, 70, 90, 82, 74, 80,
+  76, 70, 85, 77, 77, 72, 76, 82, 80, 118,
+  80, 82, 75, 77, 83, 83, 102, 87, 85, 83,
+  82, 77, 85, 76, 100, 77, 78, 84, 87, 86,
+  82, 71, 69, 89, 79, 75, 76, 83, 82, 98,
+  126, 78, 85, 87, 110, 70, 75, 98, 70, 74,
+  77, 80, 87, 86, 98, 94, 74, 91, 95, 94,
+  82, 101, 79, 91, 109, 79, 90, 112, 87, 90,
+  100, 77, 84, 83, 84, 73, 78, 84, 82, 74,
+  85, 74, 93, 80, 87, 85, 66, 95, 77, 89,
+  78, 92, 74, 77, 77, 79, 84, 77, 108, 91,
+  57, 85, 89, 77, 86, 83, 87, 90, 91, 64,
+  76, 81, 82, 86, 91, 75, 79, 77, 78, 83,
+  87, 81, 79, 68, 90, 80, 75, 80, 73, 74,
+  98, 79, 76, 83, 67, 89, 82, 108, 77, 76,
+  72, 74, 88, 83, 111, 88, 88, 96, 83, 81,
+  95, 73, 96, 76, 77, 86, 87, 92, 81, 69,
+  74, 91, 85, 72, 71, 78, 80, 99, 139, 83,
+  81, 88, 121, 71, 77, 92, 75, 74, 78, 93,
+  93, 91, 90, 89, 77, 86, 82, 98, 75, 98,
+  77, 90, 108, 74, 87, 99, 90, 85, 97, 76,
+  78, 85, 74, 72, 75, 73, 80, 74, 82, 76,
+  89, 78, 93, 82, 66, 87, 79, 86, 78, 85,
+  80, 83, 88, 82, 76, 89, 99, 81, 82, 92,
+  80, 84, 86, 75, 81, 87, 84, 96, 95, 92,
+  79, 97, 87, 81, 86, 93, 82, 81, 87, 77,
+  96, 76, 89, 80, 93, 74, 68, 82, 77, 92,
+  91, 72, 81, 104, 75, 86, 90, 82, 75, 90,
+  66, 115, 96, 77, 94, 55, 92, 89, 73, 93,
+  93, 74, 72, 68, 85, 78, 81, 88, 95, 92,
+  65, 69, 82, 88, 102, 83, 89, 98, 98, 76,
+  98, 77, 73, 84, 96, 73, 83, 82, 86, 78,
+  79, 64, 78, 74, 80, 85, 81, 80, 84, 75,
+  72, 77, 87, 87, 88, 82, 75, 102, 92, 88,
+  92, 86, 90, 82, 78, 85, 92, 80, 83, 91,
+  87, 98, 82, 85, 103, 90, 85, 95, 84, 71,
+  88, 75, 86, 79, 80, 82, 73, 88, 77, 84,
+  93, 113, 59, 87, 87, 77, 79, 81, 73, 101,
+  76, 99, 90, 76, 95, 80, 90, 76, 96, 81,
+  79, 76, 88, 88, 71, 69, 72, 95, 80, 104,
+  81, 76, 85, 82, 90, 79, 87, 78, 88, 91,
+  93, 76, 72, 51, 94, 63, 81, 79, 87, 85,
+  82, 72, 51, 79, 113, 77, 85, 73, 38, 78,
+  83, 89, 81, 78, 81, 124, 89, 91, 80, 83,
+  87, 89, 76, 75, 85, 78, 66, 86, 80, 67,
+  83, 81, 79, 78, 90, 85, 84, 98, 65, 87,
+  82, 80, 85, 82, 66, 86, 101, 72, 98, 70,
+  82, 92, 83, 94, 90, 86, 88, 81, 84, 83,
+  85, 79, 73, 89, 84, 103, 92, 74, 90, 83,
+  87, 74, 68, 84, 80, 84, 74, 81, 83, 126,
+  54, 95, 90, 71, 79, 77, 80, 91, 81, 87,
+  84, 62, 87, 84, 96, 84, 89, 92, 82, 82,
+  94, 89, 88, 80, 91, 68, 84, 85, 87, 75,
+  88, 82, 83, 95, 91, 65, 113, 90, 85, 80,
+  62, 80, 90, 75, 97, 80, 72, 94, 103, 74,
+  69, 80, 100, 82, 78, 80, 48, 73, 93, 93,
+  67, 86, 64, 117, 98, 90, 79, 94, 76, 92,
+  68, 94, 84, 84, 67, 80, 83, 92, 85, 83,
+  102, 85, 89, 92, 88, 98, 88, 104, 88, 79,
+  87, 88, 79, 82, 89, 69, 88, 73, 72, 99,
+  96, 96, 92, 94, 81, 77, 85, 75, 83, 74,
+  71, 95, 84, 81, 76, 81, 74, 82, 75, 87,
+  100, 82, 86, 95, 88, 82, 96, 60, 85, 92,
+  82, 98, 92, 89, 81, 96, 84, 80, 77, 85,
+  79, 85, 89, 77, 95, 71, 98, 85, 100, 80,
+  65, 80, 81, 85, 81, 75, 87, 99, 80, 90,
+  85, 83, 76, 89, 66, 102, 86, 80, 93, 67,
+  87, 89, 74, 95, 90, 78, 59, 69, 72, 81,
+  84, 87, 94, 64, 95, 80, 79, 90, 105, 86,
+  85, 114, 84, 74, 93, 75, 85, 78, 89, 72,
+  85, 86, 79, 79, 82, 73, 79, 71, 82, 80,
+  87, 79, 89, 80, 76, 76, 80, 88, 86, 79,
+  76, 95, 85, 93, 91, 96, 85, 75, 53, 74,
+  78, 82, 82, 84, 70, 93, 90, 90, 100, 81,
+  85, 102, 102, 69, 54, 80, 78, 72, 86, 82,
+  74, 93, 93, 79, 97, 80, 56, 84, 78, 76,
+  83, 72, 67, 104, 72, 90, 85, 79, 90, 85,
+  87, 83, 84, 80, 87, 80, 123, 90, 100, 78,
+  101, 80, 91, 104, 87, 73, 95, 70, 79, 65,
+  84, 78, 87, 75, 80, 84, 85, 65, 87, 64,
+  72, 83, 84, 92, 79, 79, 36, 94, 93, 83,
+  83, 63, 64, 85, 91, 76, 84, 78, 83, 153,
+  89, 88, 73, 74, 92, 80, 73, 75, 79, 93,
+  64, 96, 78, 76, 87, 74, 92, 78, 90, 86,
+  80, 98, 70, 82, 81, 84, 72, 75, 65, 82,
+  92, 76, 81, 80, 78, 80, 67, 83, 79, 86,
+  92, 85, 64, 81, 80, 84, 69, 74, 81, 114,
+  104, 67, 68, 86, 82, 75, 74, 80, 76, 85,
+  74, 83, 79, 100, 48, 75, 78, 64, 80, 65,
+  72, 78, 80, 86, 84, 72, 90, 85, 89, 93,
+  78, 100, 80, 81, 88, 83, 94, 83, 112, 61,
+  94, 85, 79, 68, 94, 75, 81, 81, 89, 66,
+  110, 64, 78, 86, 78, 94, 82, 75, 83, 72,
+  78, 103, 111, 85, 65, 86, 92, 84, 84, 84,
+  68, 79, 97, 75, 69, 79, 83, 113, 105, 91,
+  72, 88, 74, 77, 62, 93, 71, 103, 84, 94,
+  81, 93, 87, 73, 99, 78, 86, 93, 73, 95,
+  84, 105, 83, 84, 83, 87, 79, 82, 95, 77,
+  86, 75, 73, 94, 95, 101, 80, 84, 87, 90,
+  85, 69, 73, 80, 72, 88, 76, 81, 77, 77,
+  82, 91, 79, 78, 94, 79, 86, 90, 84, 80,
+  87, 61, 101, 94, 82, 93, 85, 93, 86, 76,
+  78, 80, 75, 88, 81, 79, 80, 82, 83, 84,
+  93, 83, 95, 75, 83, 85, 69, 80, 86, 73,
+  71, 98, 81, 85, 85, 71, 81, 82, 74, 91,
+  74, 86, 89, 89, 96, 100, 91, 92, 85, 84,
+  82, 80, 103, 77, 89, 87, 83, 93, 102, 84,
+  79, 86, 99, 83, 89, 104, 90, 81, 91, 78,
+  75, 82, 89, 79, 85, 85, 85, 82, 71, 88,
+  89, 87, 88, 87, 83, 84, 86, 83, 88, 92,
+  82, 87, 100, 85, 82, 91, 79, 94, 89, 96,
+  80, 68, 71, 80, 66, 89, 83, 81, 64, 92,
+  78, 86, 100, 86, 86, 85, 83, 80, 68, 91,
+  72, 62, 93, 82, 84, 86, 85, 73, 95, 64,
+  86, 95, 80, 90, 87, 88, 80, 72, 68, 86,
+  71, 94, 95, 77, 79, 88, 79, 88, 90, 73,
+  84, 68, 87, 88, 92, 89, 84, 83, 71, 94,
+  80, 74, 84, 72, 84, 86, 88, 91, 88, 83,
+  81, 98, 90, 87, 87, 82, 84, 76, 89, 89,
+  66, 82, 85, 83, 78, 86, 89, 80, 85, 84,
+  91, 76, 88, 91, 96, 77, 88, 78, 81, 77,
+  93, 84, 78, 77, 95, 98, 70, 91, 79, 81,
+  75, 79, 87, 80, 89, 77, 78, 91, 75, 86,
+  79, 81, 77, 92, 76, 87, 84, 85, 83, 73,
+  78, 73, 57, 85, 87, 78, 65, 89, 80, 86,
+  90, 83, 82, 91, 90, 81, 91, 89, 71, 83,
+  85, 79, 77, 84, 79, 79, 89, 79, 73, 81,
+  79, 87, 86, 87, 84, 79, 97, 87, 74, 94,
+  93, 84, 83, 90, 89, 98, 84, 72, 84, 91,
+  82, 96, 97, 78, 89, 83, 69, 83, 84, 72,
+  90, 89, 87, 83, 95, 85, 91, 83, 79, 99,
+  85, 84, 91, 84, 85, 88, 95, 86, 75, 80,
+  79, 87, 80, 83, 83, 81, 90, 80, 88, 74,
+  95, 100, 94, 78, 89, 85, 77, 93, 86, 88,
+  72, 93, 96, 101, 80, 82, 77, 78, 83, 74,
+  90, 76, 85, 64, 77, 86, 80, 84, 82, 80,
+  95, 87, 84, 95, 88, 77, 84, 91, 90, 90,
+  73, 82, 90, 81, 77, 92, 83, 87, 93, 90,
+  83, 83, 66, 69, 70, 93, 79, 62, 72, 101,
+  96, 76, 83, 84, 73, 89, 77, 89, 84, 76,
+  87, 93, 90, 97, 79, 83, 86, 78, 84, 79,
+  61, 97, 86, 84, 80, 74, 80, 91, 81, 90,
+  77, 70, 94, 82, 75, 92, 58, 82, 94, 130,
+  87, 76, 88, 89, 76, 84, 90, 79, 86, 82,
+  100, 98, 71, 80, 85, 77, 81, 79, 89, 104,
+  92, 77, 84, 78, 85, 76, 86, 73, 68, 82,
+  88, 84, 86, 85, 82, 56, 88, 81, 85, 93,
+  75, 83, 95, 74, 76, 85, 87, 84, 89, 79,
+  97, 90, 79, 79, 86, 81, 76, 82, 79, 88,
+  78, 70, 82, 81, 92, 87, 81, 80, 96, 83,
+  89, 81, 107, 76, 115, 72, 77, 79, 90, 81,
+  90, 70, 72, 83, 89, 67, 76, 83, 80, 87,
+  78, 86, 79, 87, 83, 83, 81, 91, 87, 76,
+  85, 83, 89, 82, 80, 82, 90, 71, 70, 83,
+  87, 70, 80, 86, 78, 89, 82, 77, 78, 75,
+  81, 84, 68, 84, 77, 84, 97, 105, 81, 74,
+  87, 88, 81, 69, 81, 81, 91, 82, 73, 97,
+  78, 68, 82, 76, 77, 87, 80, 88, 85, 78,
+  81, 84, 84, 93, 80, 77, 80, 79, 83, 91,
+  88, 78, 69, 64, 80, 82, 85, 78, 84, 81,
+  63, 78, 76, 88, 83, 82, 79, 79, 99, 66,
+  70, 81, 77, 77, 75, 79, 89, 82, 81, 102,
+  84, 79, 77, 88, 73, 72, 92, 92, 87, 69,
+  107, 92, 70, 81, 81, 84, 81, 83, 98, 80,
+  81, 83, 91, 87, 83, 71, 77, 92, 72, 80,
+  89, 86, 85, 87, 79, 94, 74, 76, 75, 68,
+  88, 86, 93, 81, 85, 75, 80, 84, 88, 84,
+  82, 95, 78, 88, 82, 81, 85, 78, 85, 93,
+  73, 87, 92, 84, 99, 91, 87, 75, 81, 82,
+  86, 63, 81, 83, 90, 84, 72, 91, 81, 76,
+  84, 90, 85, 88, 81, 84, 83, 88, 86, 84,
+  86, 94, 87, 84, 88, 83, 78, 87, 83, 82,
+  65, 74, 87, 83, 82, 76, 88, 66, 62, 95,
+  84, 89, 89, 84, 82, 84, 100, 81, 72, 89,
+  74, 83, 85, 89, 86, 85, 73, 109, 74, 79,
+  81, 86, 79, 86, 78, 92, 89, 76, 89, 96,
+  49, 87, 86, 90, 79, 84, 59, 75, 65, 93,
+  87, 48, 73, 97, 96, 76, 93, 81, 73, 96,
+  74, 83, 73, 71, 98, 102, 109, 105, 95, 79,
+  79, 75, 89, 84, 89, 97, 84, 82, 85, 76,
+  74, 97, 89, 95, 82, 75, 97, 85, 58, 101,
+  64, 87, 78, 156, 90, 79, 86, 110, 81, 99,
+  91, 94, 78, 81, 103, 89, 69, 88, 81, 71,
+  101, 80, 91, 121, 98, 81, 105, 88, 69, 86,
+  91, 74, 66, 83, 92, 79, 86, 80, 89, 56,
+  94, 77, 92, 106, 74, 76, 100, 81, 75, 83,
+  89, 80, 93, 79, 117, 121, 82, 84, 94, 85,
+  105, 99, 79, 89, 83, 50, 87, 91, 103, 88,
+  94, 91, 103, 74, 89, 85, 110, 61, 124, 73,
+  80, 75, 107, 88, 87, 71, 67, 83, 92, 58,
+  78, 90, 71, 83, 80, 78, 82, 91, 79, 84,
+  77, 97, 95, 79, 100, 76, 92, 79, 69, 88,
+  88, 69, 91, 80, 88, 65, 80, 85, 77, 91,
+  87, 73, 68, 80, 75, 85, 63, 81, 80, 91,
+  84, 126, 78, 75, 91, 87, 83, 76, 85, 86,
+  80, 82, 68, 92, 79, 66, 77, 62, 77, 86,
+  78, 95, 88, 74, 89, 87, 90, 97, 84, 77,
+  75, 81, 82, 94, 90, 77, 69, 60, 76, 79,
+  101, 81, 90, 81, 73, 83, 69, 91, 91, 77,
+  78, 79, 106, 68, 67, 91, 76, 81, 85, 82,
+  93, 75, 79, 95, 88, 80, 82, 91, 76, 74,
+  92, 88, 83, 60, 112, 86, 74, 81, 80, 80,
+  84, 84, 91, 77, 80, 76, 90, 79, 84, 74,
+  71, 92, 70, 76, 89, 88, 79, 85, 76, 100,
+  75, 74, 83, 70, 93, 83, 84, 87, 87, 72,
+  78, 85, 91, 70, 90, 89, 83, 87, 85, 80,
+  77, 82, 80, 85, 72, 80, 93, 89, 93, 95,
+  82, 77, 82, 83, 82, 66, 92, 89, 85, 88,
+  67, 87, 88, 80, 83, 77, 82, 92, 77, 80,
+  84, 93, 91, 79, 90, 87, 85, 83, 86, 79,
+  81, 86, 84, 84, 62, 70, 85, 80, 85, 76,
+  98, 79, 70, 91, 73, 88, 88, 84, 81, 88,
+  98, 72, 71, 87, 77, 86, 86, 84, 89, 81,
+  74, 109, 81, 77, 83, 87, 84, 78, 82, 85,
+  85, 74, 91, 98, 42, 87, 86, 84, 77, 83,
+  60, 79, 66, 98, 85, 47, 75, 96, 87, 80,
+  94, 85, 75, 88, 76, 81, 73, 76, 94, 92,
+  107, 97, 87, 76, 80, 82, 97, 80, 97, 96,
+  90, 77, 84, 68, 68, 92, 87, 98, 87, 71,
+  102, 85, 60, 97, 73, 88, 72, 150, 97, 81,
+  82, 104, 74, 104, 86, 85, 83, 80, 108, 85,
+  81, 89, 97, 72, 86, 75, 88, 111, 86, 83,
+  95, 96, 64, 92, 84, 84, 70, 79, 89, 82,
+  84, 83, 88, 59, 88, 89, 88, 103, 74, 82,
+  96, 87, 77, 83, 85, 81, 88, 86, 101, 116,
+  97, 79, 88, 84, 93, 89, 88, 93, 97, 55,
+  95, 90, 105, 87, 91, 91, 99, 74, 82, 93,
+  119, 65, 114, 75, 79, 82, 103, 82, 84, 75,
+  65, 82, 89, 62, 77, 90, 68, 88, 83, 78,
+  83, 85, 78, 85, 73, 96, 86, 80, 103, 80,
+  94, 81, 73, 85, 84, 70, 99, 93, 90, 63,
+  72, 79, 71, 90, 86, 74, 79, 85, 87, 91,
+  59, 82, 93, 86, 71, 128, 81, 79, 79, 89,
+  82, 82, 87, 77, 84, 82, 75, 83, 82, 72,
+  83, 71, 75, 86, 76, 95, 80, 78, 94, 98,
+  89, 95, 80, 88, 83, 80, 76, 91, 89, 77,
+  69, 62, 77, 88, 94, 76, 89, 80, 71, 84,
+  73, 89, 94, 80, 78, 82, 93, 74, 77, 84,
+  81, 80, 84, 79, 92, 78, 76, 97, 91, 78,
+  83, 90, 79, 80, 90, 86, 81, 78, 106, 86,
+  63, 84, 78, 78, 83, 81, 91, 81, 74, 76,
+  90, 75, 79, 76, 65, 91, 69, 70, 91, 90,
+  80, 89, 72, 99, 71, 77, 92, 72, 96, 83,
+  84, 86, 84, 70, 84, 94, 93, 71, 87, 84,
+  81, 86, 86, 79, 81, 84, 86, 91, 77, 82,
+  101, 85, 78, 103, 78, 78, 76, 82, 84, 69,
+  86, 81, 90, 84, 68, 87, 92, 80, 83, 79,
+  76, 90, 75, 82, 79, 92, 77, 84, 92, 84,
+  84, 91, 93, 78, 74, 91, 85, 80, 59, 71,
+  86, 86, 86, 67, 99, 79, 77, 84, 77, 91,
+  87, 88, 80, 84, 87, 66, 76, 87, 84, 87,
+  83, 72, 92, 82, 73, 106, 83, 75, 78, 91,
+  79, 80, 87, 84, 83, 86, 93, 93, 36, 87,
+  85, 83, 77, 82, 70, 83, 90, 80, 97, 81,
+  84, 84, 75, 70, 75, 77, 78, 81, 78, 83,
+  72, 75, 73, 84, 104, 79, 62, 71, 79, 89,
+  81, 76, 97, 71, 108, 76, 75, 73, 67, 72,
+  75, 78, 87, 83, 82, 75, 68, 90, 89, 93,
+  96, 70, 79, 87, 86, 87, 88, 95, 79, 79,
+  70, 82, 93, 92, 98, 69, 93, 90, 93, 84,
+  75, 78, 75, 69, 56, 70, 82, 106, 81, 63,
+  84, 78, 89, 83, 95, 97, 85, 87, 90, 105,
+  78, 84, 99, 82, 74, 83, 79, 75, 62, 93,
+  77, 85, 74, 85, 86, 70, 80, 69, 95, 73,
+  99, 83, 81, 96, 83, 97, 72, 83, 90, 97,
+  84, 95, 90, 102, 96, 84, 86, 74, 90, 84,
+  79, 85, 70, 91, 63, 81, 96, 71, 84, 87,
+  71, 74, 76, 67, 84, 85, 81, 85, 72, 74,
+  73, 81, 74, 79, 71, 75, 76, 89, 77, 79,
+  97, 70, 101, 75, 74, 84, 68, 78, 73, 82,
+  87, 79, 88, 75, 104, 85, 88, 95, 93, 81,
+  84, 85, 90, 85, 86, 94, 82, 89, 73, 82,
+  95, 96, 100, 76, 96, 89, 94, 86, 70, 77,
+  74, 68, 81, 71, 85, 106, 84, 67, 84, 70,
+  95, 83, 89, 92, 82, 75, 85, 96, 83, 83,
+  95, 85, 76, 102, 77, 77, 69, 93, 77, 85,
+  74, 84, 90, 89, 85, 72, 103, 74, 101, 81,
+  83, 94, 73, 102, 74, 79, 84, 90, 74, 97,
+  94, 96, 81, 86, 85, 80, 88, 81, 80, 83,
+  78, 87, 55, 86, 89, 69, 80, 86, 83, 75,
+  79, 80, 89, 88, 83, 76, 72, 80, 73, 78,
+  71, 75, 86, 74, 83, 85, 81, 72, 95, 70,
+  80, 73, 76, 87, 68, 90, 79, 86, 83, 78,
+  79, 77, 104, 83, 90, 78, 92, 95, 73, 81,
+  88, 81, 85, 89, 76, 85, 80, 83, 84, 90,
+  91, 72, 91, 85, 87, 83, 69, 78, 81, 72,
+  82, 69, 91, 80, 88, 69, 73, 79, 90, 83,
+  83, 94, 90, 77, 92, 92, 102, 76, 96, 90,
+  84, 88, 73, 78, 82, 91, 74, 86, 74, 93,
+  84, 86, 78, 76, 74, 79, 88, 82, 87, 82,
+  76, 82, 71, 86, 85, 92, 80, 89, 82, 85,
+  78, 78, 83, 79, 86, 75, 75, 90, 89, 84,
+  75, 88, 85, 78, 74, 91, 82, 82, 82, 89,
+  76, 76, 78, 81, 88, 80, 94, 82, 124, 97,
+  86, 65, 79, 90, 81, 95, 82, 84, 95, 83,
+  85, 80, 86, 82, 78, 87, 84, 75, 92, 80,
+  84, 93, 86, 112, 82, 73, 89, 87, 83, 84,
+  90, 98, 108, 77, 95, 74, 90, 91, 69, 72,
+  90, 92, 86, 82, 71, 101, 77, 71, 64, 79,
+  79, 97, 84, 93, 99, 90, 66, 82, 86, 85,
+  86, 76, 80, 77, 75, 82, 79, 69, 87, 76,
+  82, 79, 71, 87, 108, 92, 84, 80, 87, 64,
+  111, 65, 106, 79, 87, 86, 88, 88, 67, 88,
+  82, 79, 82, 87, 104, 101, 88, 88, 78, 103,
+  83, 98, 88, 78, 96, 77, 93, 91, 77, 92,
+  83, 91, 71, 96, 83, 91, 77, 83, 77, 80,
+  84, 85, 92, 76, 100, 82, 96, 99, 76, 65,
+  79, 85, 84, 100, 75, 93, 96, 102, 86, 80,
+  80, 92, 82, 92, 79, 69, 90, 78, 115, 89,
+  81, 119, 80, 68, 94, 86, 85, 79, 87, 97,
+  116, 81, 97, 78, 86, 90, 77, 82, 94, 85,
+  86, 78, 68, 104, 71, 71, 77, 86, 79, 101,
+  84, 103, 108, 77, 68, 83, 82, 81, 88, 75,
+  76, 74, 71, 82, 74, 71, 90, 84, 80, 78,
+  74, 88, 114, 92, 68, 83, 87, 89, 122, 66,
+  113, 80, 91, 85, 87, 80, 66, 96, 85, 69,
+  83, 86, 81, 102, 92, 86, 68, 107, 83, 105,
+  90, 72, 96, 76, 76, 91, 82, 86, 86, 74,
+  84, 86, 82, 73, 85, 97, 92, 81, 83, 83,
+  75, 85, 78, 76, 83, 88, 87, 68, 86, 80,
+  74, 80, 93, 92, 83, 81, 81, 82, 72, 100,
+  77, 88, 83, 82, 93, 82, 115, 88, 80, 100,
+  87, 93, 79, 91, 92, 86, 91, 87, 87, 82,
+  83, 75, 82, 85, 78, 77, 88, 87, 94, 84,
+  72, 86, 76, 69, 91, 83, 83, 86, 88, 76,
+  72, 76, 76, 82, 85, 91, 83, 85, 86, 76,
+  98, 74, 85, 81, 82, 82, 85, 75, 70, 85,
+  83, 87, 74, 81, 88, 78, 82, 71, 87, 78,
+  86, 80, 80, 93, 68, 76, 75, 84, 84, 89,
+  88, 99, 90, 80, 70, 89, 87, 83, 87, 76,
+  78, 76, 87, 75, 81, 91, 85, 75, 74, 81,
+  80, 67, 77, 86, 78, 82, 75, 73, 90, 81,
+  87, 79, 103, 86, 85, 77, 74, 101, 88, 80,
+  80, 86, 82, 91, 78, 83, 72, 86, 83, 94,
+  84, 82, 73, 88, 90, 94, 96, 100, 88, 81,
+  91, 77, 78, 82, 93, 86, 102, 86, 97, 70,
+  98, 86, 79, 70, 89, 95, 84, 79, 86, 87,
+  82, 76, 82, 73, 67, 89, 85, 83, 75, 82,
+  87, 89, 79, 92, 86, 77, 83, 78, 77, 85,
+  83, 74, 83, 77, 87, 85, 69, 85, 109, 100,
+  97, 80, 78, 72, 95, 62, 71, 89, 86, 81,
+  85, 100, 78, 83, 76, 83, 80, 85, 95, 91,
+  83, 90, 75, 89, 86, 102, 87, 77, 89, 82,
+  99, 84, 96, 96, 85, 85, 72, 88, 83, 75,
+  78, 82, 73, 84, 81, 79, 98, 78, 96, 87,
+  94, 87, 79, 75, 71, 92, 92, 86, 72, 89,
+  80, 106, 82, 79, 76, 90, 83, 103, 83, 71,
+  70, 83, 101, 90, 94, 102, 89, 72, 93, 74,
+  82, 76, 90, 84, 103, 80, 97, 76, 90, 85,
+  80, 75, 93, 83, 81, 80, 80, 93, 86, 73,
+  75, 76, 71, 88, 84, 91, 83, 82, 80, 91,
+  77, 90, 85, 79, 79, 80, 73, 90, 80, 74,
+  85, 74, 83, 81, 78, 86, 113, 99, 79, 82,
+  78, 83, 105, 61, 72, 102, 94, 82, 87, 90,
+  79, 88, 78, 74, 84, 90, 77, 91, 76, 92,
+  74, 90, 83, 108, 91, 76, 91, 80, 77, 85,
+  98, 88, 92, 69, 83, 83, 86, 69, 85, 93,
+  90, 86, 76, 79, 81, 79, 78, 80, 86, 89,
+  85, 74, 75, 84, 82, 79, 91, 81, 86, 83,
+  77, 76, 80, 92, 83, 96, 81, 93, 86, 86,
+  103, 88, 83, 96, 96, 88, 82, 86, 86, 85,
+  88, 77, 78, 80, 88, 76, 85, 91, 82, 76,
+  88, 98, 95, 79, 80, 80, 84, 75, 89, 82,
+  78, 89, 83, 81, 69, 84, 77, 81, 74, 96,
+  81, 83, 88, 77, 89, 81, 85, 81, 80, 87,
+  91, 84, 71, 84, 84, 93, 83, 79, 84, 84,
+  82, 64, 80, 75, 84, 87, 87, 95, 83, 82,
+  75, 81, 91, 83, 80, 94, 92, 85, 79, 93,
+  86, 87, 85, 83, 79, 82, 86, 85, 81, 71,
+  74, 77, 82, 82, 91, 85, 80, 78, 89, 86,
+  79, 83, 74, 83, 83, 92, 77, 90, 90, 82,
+  94, 82, 81, 124, 92, 85, 84, 86, 93, 90,
+  79, 91, 78, 82, 90, 82, 99, 84, 84, 90,
+  82, 92, 95, 95, 74, 85, 85, 82, 79, 89,
+  87, 79, 77, 81, 80, 85, 85, 84, 89, 78,
+  87, 70, 79, 97, 83, 88, 75, 88, 79, 77,
+  79, 77, 81, 82, 75, 79, 88, 80, 79, 80,
+  85, 86, 79, 80, 88, 64, 73, 75, 91, 88,
+  86, 69, 78, 91, 86, 82, 75, 77, 74, 77,
+  89, 85, 75, 80, 82, 74, 85, 93, 80, 90,
+  90, 85, 81, 87, 99, 68, 81, 80, 91, 83,
+  90, 60, 80, 108, 86, 88, 76, 70, 75, 83,
+  83, 83, 103, 102, 80, 82, 93, 89, 80, 82,
+  74, 86, 78, 92, 82, 97, 78, 80, 83, 79,
+  82, 141, 86, 82, 79, 90, 100, 87, 84, 86,
+  77, 93, 87, 80, 96, 84, 92, 80, 79, 100,
+  94, 79, 70, 94, 85, 80, 77, 89, 97, 88,
+  73, 82, 71, 81, 86, 87, 87, 84, 84, 78,
+  80, 91, 73, 90, 75, 82, 80, 81, 76, 72,
+  84, 86, 79, 76, 92, 74, 78, 74, 76, 79,
+  72, 76, 89, 65, 74, 83, 91, 87, 78, 66,
+  75, 92, 88, 84, 80, 73, 84, 78, 115, 77,
+  72, 84, 83, 77, 78, 94, 88, 73, 90, 84,
+  71, 101, 109, 73, 83, 73, 96, 82, 99, 61,
+  88, 114, 85, 84, 78, 72, 81, 90, 85, 85,
+  85, 81, 80, 74, 88, 89, 80, 83, 79, 79,
+  81, 92, 87, 89, 72, 83, 82, 85, 80, 114,
+  91, 83, 88, 83, 91, 92, 83, 97, 84, 84,
+  81, 81, 93, 85, 79, 86, 83, 94, 91, 79,
+  79, 78, 87, 79, 81, 89, 86, 89, 83, 79,
+  81, 87, 83, 82, 88, 79, 86, 70, 82, 94,
+  82, 86, 82, 85, 81, 80, 83, 77, 78, 87,
+  83, 82, 82, 79, 84, 82, 84, 82, 98, 77,
+  86, 72, 77, 86, 94, 88, 83, 75, 84, 88,
+  91, 87, 75, 77, 74, 76, 86, 80, 75, 82,
+  82, 74, 82, 91, 80, 73, 82, 86, 79, 88,
+  97, 70, 81, 85, 86, 87, 93, 66, 79, 97,
+  86, 84, 80, 78, 78, 77, 73, 77, 106, 96,
+  74, 73, 81, 86, 68, 91, 73, 78, 73, 91,
+  81, 94, 90, 81, 87, 79, 84, 136, 84, 75,
+  76, 78, 86, 78, 79, 88, 73, 107, 95, 82,
+  82, 94, 75, 85, 91, 97, 93, 94, 66, 85,
+  84, 82, 83, 87, 87, 86, 72, 88, 90, 72,
+  77, 87, 80, 78, 89, 80, 78, 89, 91, 78,
+  88, 82, 87, 75, 72, 74, 90, 85, 72, 74,
+  95, 78, 79, 72, 85, 80, 81, 79, 97, 68,
+  78, 72, 77, 84, 84, 74, 67, 90, 84, 87,
+  84, 79, 73, 77, 101, 92, 76, 74, 86, 71,
+  94, 88, 75, 99, 85, 87, 80, 95, 98, 70,
+  84, 86, 102, 79, 95, 63, 92, 106, 92, 91,
+  87, 89, 74, 81, 69, 80, 127, 121, 73, 73,
+  93, 91, 71, 94, 71, 79, 68, 91, 81, 105,
+  75, 83, 72, 72, 89, 160, 79, 77, 63, 95,
+  100, 72, 74, 80, 71, 126, 99, 82, 70, 97,
+  84, 74, 87, 94, 92, 77, 64, 102, 87, 87,
+  80, 87, 98, 89, 71, 91, 73, 61, 72, 86,
+  79, 86, 80, 95, 73, 78, 84, 83, 78, 77,
+  92, 75, 66, 73, 107, 77, 71, 70, 100, 69,
+  82, 83, 74, 82, 74, 73, 103, 67, 79, 69,
+  74, 76, 73, 69, 66, 92, 86, 91, 93, 75,
+  86, 78, 130, 93, 77, 76, 94, 72, 85, 83,
+  85, 76, 86, 83, 79, 113, 104, 74, 81, 81,
+  107, 79, 106, 59, 95, 115, 77, 89, 81, 73,
+  84, 96, 77, 83, 94, 86, 77, 68, 80, 91,
+  71, 92, 81, 80, 73, 91, 80, 94, 73, 84,
+  77, 85, 83, 124, 85, 85, 79, 83, 85, 88,
+  76, 95, 74, 99, 88, 81, 81, 86, 82, 82,
+  86, 85, 92, 78, 75, 77, 84, 76, 86, 87,
+  88, 82, 79, 86, 86, 81, 80, 88, 79, 74,
+  90, 77, 83, 88, 88, 83, 82, 82, 85, 80,
+  80, 79, 83, 77, 78, 75, 88, 80, 83, 91,
+  83, 86, 100, 76, 91, 72, 82, 76, 82, 88,
+  73, 79, 72, 88, 87, 87, 82, 83, 74, 75,
+  96, 87, 77, 77, 82, 71, 82, 86, 75, 73,
+  81, 83, 90, 93, 95, 76, 73, 87, 98, 85,
+  97, 70, 88, 95, 82, 85, 82, 72, 77, 80,
+  77, 72, 93, 92, 70, 81, 79, 87, 74, 86,
+  70, 74, 84, 87, 82, 87, 80, 77, 92, 85,
+  86, 113, 91, 78, 69, 72, 81, 86, 96, 76,
+  81, 106, 89, 84, 84, 82, 85, 85, 88, 93,
+  83, 80, 69, 75, 90, 75, 86, 82, 80, 83,
+  82, 70, 92, 80, 88, 87, 81, 82, 86, 79,
+  72, 95, 89, 78, 86, 81, 89, 68, 72, 86,
+  85, 90, 79, 70, 96, 85, 80, 71, 87, 84,
+  80, 76, 91, 78, 75, 68, 75, 89, 87, 73,
+  71, 90, 75, 92, 75, 76, 77, 76, 81, 97,
+  81, 75, 81, 71, 89, 76, 62, 103, 86, 94,
+  84, 81, 89, 75, 80, 84, 96, 83, 83, 88,
+  96, 85, 81, 90, 85, 74, 70, 84, 75, 76,
+  100, 104, 69, 85, 85, 91, 73, 86, 66, 74,
+  77, 89, 81, 87, 79, 81, 81, 80, 86, 127,
+  84, 89, 63, 82, 86, 79, 84, 77, 82, 123,
+  90, 83, 80, 77, 82, 81, 83, 88, 77, 76,
+  72, 86, 91, 77, 81, 86, 87, 87, 81, 69,
+  83, 74, 84, 80, 79, 86, 101, 86, 71, 87,
+  92, 87, 75, 80, 101, 65, 73, 86, 88, 79,
+  83, 66, 100, 84, 76, 77, 84, 86, 81, 73,
+  91, 72, 75, 66, 76, 86, 81, 68, 72, 89,
+  78, 94, 80, 78, 84, 75, 97, 113, 77, 78,
+  83, 70, 81, 71, 69, 84, 84, 91, 88, 88,
+  90, 78, 76, 82, 100, 78, 91, 86, 100, 86,
+  79, 87, 76, 73, 80, 90, 80, 80, 90, 84,
+  72, 75, 81, 92, 79, 86, 75, 76, 84, 86,
+  84, 86, 87, 82, 82, 90, 82, 111, 93, 102,
+  77, 77, 82, 86, 86, 88, 83, 102, 88, 87,
+  86, 80, 85, 84, 87, 83, 81, 80, 77, 72,
+  88, 73, 87, 85, 87, 84, 87, 72, 91, 82,
+  87, 84, 79, 79, 88, 81, 74, 90, 86, 80,
+  77, 79, 87, 73, 79, 87, 81, 78, 76, 72,
+  90, 83, 81, 82, 84, 84, 99, 69, 86, 82,
+  79, 70, 82, 90, 81, 76, 79, 88, 86, 93,
+  78, 82, 77, 75, 79, 84, 83, 76, 79, 73,
+  84, 76, 65, 78, 78, 79, 86, 77, 87, 78,
+  78, 82, 92, 85, 84, 92, 93, 85, 94, 83,
+  83, 84, 87, 72, 84, 71, 74, 53, 75, 90,
+  81, 99, 70, 77, 86, 94, 72, 85, 98, 97,
+  107, 71, 91, 87, 88, 72, 95, 88, 89, 97,
+  94, 81, 91, 100, 87, 97, 82, 72, 78, 82,
+  88, 83, 79, 97, 92, 87, 80, 84, 94, 75,
+  74, 86, 96, 92, 79, 73, 78, 81, 82, 81,
+  84, 86, 83, 70, 78, 93, 87, 84, 89, 68,
+  78, 94, 75, 81, 81, 93, 92, 86, 83, 82,
+  87, 83, 76, 82, 72, 81, 88, 83, 65, 76,
+  99, 93, 69, 86, 96, 79, 104, 76, 91, 88,
+  95, 76, 82, 97, 88, 85, 72, 103, 72, 85,
+  68, 100, 83, 73, 81, 86, 59, 81, 89, 71,
+  75, 68, 96, 87, 92, 82, 101, 95, 83, 91,
+  98, 82, 87, 67, 77, 46, 81, 76, 86, 91,
+  70, 83, 92, 89, 74, 92, 90, 113, 89, 81,
+  94, 73, 90, 69, 102, 88, 84, 121, 102, 71,
+  89, 83, 91, 125, 89, 78, 80, 73, 94, 90,
+  73, 113, 110, 87, 85, 81, 83, 77, 79, 93,
+  87, 85, 78, 74, 73, 74, 83, 80, 81, 91,
+  70, 70, 85, 85, 90, 80, 85, 61, 62, 91,
+  80, 72, 98, 97, 84, 92, 84, 84, 89, 79,
+  70, 79, 72, 82, 84, 79, 57, 84, 86, 101,
+  53, 86, 111, 89, 98, 77, 83, 83, 111, 73,
+  99, 93, 82, 80, 75, 95, 78, 91, 63, 72,
+  85, 68, 87, 86, 44, 77, 90, 70, 72, 59,
+  98, 82, 94, 89, 90, 87, 79, 83, 90, 93,
+  87, 76, 73, 61, 79, 90, 86, 84, 74, 73,
+  84, 94, 76, 91, 84, 90, 75, 69, 93, 90,
+  82, 72, 88, 95, 92, 108, 91, 87, 87, 86,
+  89, 94, 90, 73, 77, 82, 90, 77, 81, 96,
+  88, 87, 76, 86, 93, 78, 77, 86, 85, 85,
+  73, 75, 76, 80, 86, 76, 92, 79, 78, 76,
+  77, 97, 75, 81, 84, 72, 89, 86, 75, 91,
+  73, 83, 82, 85, 86, 87, 80, 93, 85, 79,
+  97, 87, 91, 83, 70, 96, 96, 93, 80, 86,
+  90, 77, 82, 74, 88, 81, 89, 77, 74, 98,
+  81, 83, 74, 104, 83, 80, 76, 78, 79, 79,
+  94, 84, 63, 84, 83, 75, 81, 76, 94, 97,
+  89, 78, 91, 83, 71, 79, 88, 75, 88, 88,
+  82, 74, 77, 90, 73, 104, 75, 87, 88, 94,
+  69, 83, 89, 94, 88, 75, 82, 86, 82, 81,
+  96, 84, 84, 97, 85, 86, 88, 98, 88, 101,
+  80, 72, 79, 75, 79, 81, 69, 89, 89, 78,
+  87, 88, 92, 75, 80, 79, 91, 93, 83, 76,
+  87, 85, 78, 76, 81, 86, 84, 76, 72, 87,
+  95, 83, 90, 72, 92, 83, 80, 82, 91, 89,
+  91, 82, 86, 73, 83, 82, 82, 77, 73, 86,
+  94, 81, 80, 70, 95, 96, 82, 91, 96, 82,
+  100, 77, 86, 90, 96, 80, 71, 97, 91, 84,
+  74, 97, 76, 88, 70, 104, 81, 79, 78, 100,
+  66, 78, 85, 82, 74, 76, 94, 77, 70, 78,
+  98, 87, 77, 92, 97, 78, 92, 83, 80, 73,
+  81, 81, 72, 90, 76, 88, 91, 96, 70, 89,
+  78, 109, 82, 77, 85, 71, 83, 77, 98, 92,
+  80, 116, 85, 82, 93, 87, 91, 139, 94, 70,
+  84, 63, 81, 87, 58, 93, 108, 73, 97, 83,
+  81, 82, 87, 79, 86, 85, 87, 76, 84, 81,
+  84, 80, 80, 91, 75, 74, 77, 87, 109, 80,
+  84, 65, 82, 75, 83, 76, 99, 87, 89, 76,
+  89, 72, 88, 86, 79, 77, 72, 90, 93, 77,
+  71, 67, 82, 106, 73, 93, 98, 90, 94, 74,
+  72, 79, 106, 76, 67, 111, 86, 79, 73, 90,
+  73, 101, 65, 75, 82, 78, 84, 100, 58, 78,
+  88, 77, 73, 68, 95, 76, 71, 76, 83, 80,
+  79, 81, 87, 78, 90, 85, 83, 80, 80, 89,
+  78, 81, 79, 83, 83, 91, 72, 83, 76, 92,
+  72, 73, 83, 88, 79, 81, 89, 89, 82, 96,
+  85, 84, 87, 87, 85, 105, 90, 74, 81, 77,
+  87, 79, 72, 88, 90, 86, 81, 86, 91, 81,
+  82, 79, 86, 82, 77, 74, 88, 83, 80, 71,
+  84, 78, 77, 81, 79, 95, 84, 82, 77, 77,
+  94, 81, 78, 85, 81, 80, 73, 82, 89, 83,
+  76, 93, 85, 78, 98, 93, 96, 82, 86, 84,
+  95, 94, 82, 95, 93, 81, 84, 78, 86, 74,
+  91, 78, 66, 95, 89, 83, 73, 97, 86, 79,
+  74, 77, 83, 85, 92, 100, 74, 80, 83, 87,
+  76, 77, 94, 88, 74, 77, 87, 82, 62, 80,
+  79, 78, 79, 89, 85, 91, 73, 85, 73, 98,
+  84, 81, 83, 84, 70, 81, 86, 87, 72, 71,
+  81, 97, 70, 78, 79, 80, 88, 88, 81, 93,
+  84, 81, 96, 96, 87, 78, 80, 70, 88, 76,
+  77, 72, 95, 87, 91, 88, 92, 67, 80, 80,
+  91, 86, 85, 85, 90, 86, 75, 79, 89, 98,
+  79, 89, 79, 87, 88, 84, 84, 71, 99, 79,
+  75, 79, 77, 83, 88, 83, 83, 79, 87, 88,
+  94, 66, 76, 92, 93, 89, 101, 72, 90, 94,
+  93, 87, 94, 86, 89, 81, 86, 89, 91, 84,
+  65, 80, 84, 94, 89, 87, 82, 81, 68, 85,
+  78, 92, 73, 99, 85, 77, 87, 90, 74, 84,
+  91, 96, 72, 94, 87, 88, 72, 88, 85, 72,
+  90, 86, 80, 84, 76, 80, 73, 94, 81, 79,
+  85, 88, 75, 88, 82, 89, 77, 74, 86, 89,
+  67, 73, 95, 87, 89, 89, 82, 86, 80, 78,
+  90, 103, 94, 80, 82, 64, 80, 84, 66, 68,
+  111, 73, 95, 91, 85, 82, 88, 74, 85, 79,
+  89, 88, 98, 84, 80, 83, 92, 93, 72, 86,
+  82, 86, 102, 78, 77, 65, 95, 78, 76, 81,
+  79, 80, 91, 72, 84, 81, 84, 87, 98, 68,
+  73, 100, 97, 87, 95, 68, 95, 101, 93, 92,
+  91, 86, 89, 72, 77, 80, 84, 81, 45, 82,
+  90, 92, 86, 94, 77, 90, 64, 81, 81, 98,
+  80, 103, 82, 74, 94, 85, 80, 78, 94, 100,
+  67, 91, 88, 84, 75, 81, 76, 74, 78, 89,
+  81, 92, 75, 83, 77, 90, 85, 77, 82, 83,
+  65, 86, 83, 91, 84, 72, 81, 92, 70, 81,
+  75, 87, 85, 85, 81, 79, 84, 88, 89, 98,
+  90, 80, 82, 72, 85, 80, 82, 75, 91, 86,
+  88, 86, 89, 76, 80, 80, 86, 74, 84, 86,
+  90, 83, 78, 79, 87, 87, 79, 90, 86, 93,
+  83, 88, 67, 76, 93, 80, 74, 80, 75, 85,
+  76, 84, 82, 84, 83, 85, 96, 68, 77, 93,
+  90, 89, 103, 74, 94, 90, 88, 90, 94, 81,
+  88, 82, 88, 78, 92, 83, 68, 86, 78, 91,
+  85, 82, 90, 80, 71, 81, 84, 93, 88, 99,
+  88, 80, 97, 87, 72, 84, 90, 93, 76, 93,
+  96, 69, 80, 88, 89, 84, 81, 87, 80, 84,
+  89, 84, 80, 74, 85, 69, 79, 77, 80, 90,
+  91, 82, 81, 83, 92, 77, 87, 82, 91, 81,
+  81, 77, 71, 91, 76, 87, 76, 86, 93, 80,
+  78, 95, 88, 91, 89, 93, 85, 80, 80, 79,
+  97, 86, 82, 80, 87, 221, 79, 86, 83, 84,
+  87, 78, 78, 85, 88, 84, 79, 94, 83, 75,
+  92, 84, 79, 81, 90, 78, 75, 103, 92, 87,
+  77, 87, 85, 80, 86, 87, 87, 92, 75, 80,
+  74, 85, 78, 85, 94, 87, 82, 84, 105, 85,
+  78, 81, 83, 94, 93, 88, 83, 90, 95, 86,
+  79, 81, 92, 83, 69, 97, 89, 87, 84, 82,
+  87, 87, 82, 80, 88, 85, 86, 88, 83, 79,
+  84, 88, 86, 73, 82, 90, 89, 87, 83, 93,
+  77, 75, 82, 85, 78, 80, 86, 92, 87, 76,
+  78, 82, 83, 74, 101, 81, 87, 82, 75, 83,
+  73, 82, 79, 80, 86, 84, 67, 76, 85, 86,
+  86, 93, 86, 85, 86, 81, 75, 77, 99, 82,
+  82, 79, 83, 159, 79, 88, 82, 84, 82, 74,
+  87, 74, 87, 78, 72, 83, 73, 84, 69, 76,
+  92, 86, 89, 82, 76, 84, 90, 85, 84, 92,
+  86, 92, 75, 86, 85, 81, 82, 81, 75, 95,
+  78, 79, 89, 78, 83, 83, 85, 79, 85, 82,
+  78, 91, 90, 82, 88, 90, 91, 87, 78, 79,
+  90, 85, 80, 74, 79, 85, 75, 84, 86, 82,
+  82, 81, 79, 83, 81, 85, 87, 82, 97, 81,
+  89, 74, 80, 81, 85, 83, 87, 88, 85, 78,
+  86, 89, 80, 87, 90, 99, 88, 81, 82, 81,
+  81, 80, 93, 78, 92, 88, 84, 84, 77, 86,
+  79, 86, 87, 89, 70, 88, 93, 83, 87, 91,
+  85, 78, 88, 89, 74, 88, 88, 76, 82, 80,
+  77, 87, 82, 87, 83, 84, 88, 87, 88, 90,
+  85, 72, 83, 87, 80, 98, 72, 85, 85, 93,
+  90, 84, 79, 86, 82, 77, 88, 83, 84, 95,
+  93, 88, 91, 88, 79, 77, 74, 90, 85, 81,
+  90, 78, 84, 89, 72, 71, 80, 86, 79, 92,
+  85, 87, 85, 85, 85, 86, 89, 85, 82, 82,
+  94, 77, 82, 88, 87, 81, 79, 86, 81, 82,
+  84, 86, 84, 90, 87, 74, 80, 91, 84, 79,
+  85, 84, 81, 85, 91, 84, 80, 76, 89, 81,
+  84, 82, 85, 89, 89, 80, 76, 84, 86, 81,
+  85, 83, 88, 81, 75, 81, 84, 86, 88, 89,
+  78, 86, 83, 86, 78, 77, 83, 85, 85, 94,
+  74, 84, 79, 94, 93, 82, 86, 84, 85, 115,
+  79, 81, 86, 92, 85, 84, 83, 84, 84, 83,
+  78, 92, 85, 70, 80, 79, 83, 81, 82, 84,
+  77, 82, 86, 87, 82, 77, 87, 84, 82, 87,
+  87, 81, 76, 92, 79, 80, 86, 92, 87, 81,
+  83, 84, 91, 82, 80, 89, 83, 90, 79, 83,
+  90, 84, 83, 82, 81, 81, 86, 87, 70, 77,
+  82, 83, 82, 81, 88, 90, 88, 87, 87, 84,
+  82, 84, 88, 83, 90, 89, 83, 72, 80, 81,
+  84, 87, 84, 87, 78, 87, 82, 84, 79, 76,
+  85, 90, 81, 74, 80, 89, 81, 74, 94, 83,
+  83, 86, 81, 89, 85, 78, 88, 83, 86, 89,
+  73, 80, 83, 87, 86, 86, 83, 85, 88, 90,
+  82, 89, 96, 79, 88, 83, 85, 110, 81, 85,
+  87, 80, 80, 76, 85, 78, 81, 81, 78, 80,
+  81, 71, 53, 77, 83, 83, 85, 79, 85, 77,
+  83, 84, 86, 81, 83, 91, 83, 83, 79, 81,
+  86, 91, 72, 79, 79, 82, 77, 78, 86, 79,
+  88, 78, 78, 92, 87, 89, 83, 80, 91, 87,
+  92, 81, 84, 78, 90, 79, 79, 73, 72, 82,
+  80, 89, 85, 85, 80, 84, 81, 82, 82, 88,
+  89, 82, 90, 84, 91, 79, 77, 75, 78, 82,
+  90, 83, 79, 82, 83, 78, 74, 75, 87, 97,
+  86, 82, 79, 86, 83, 77, 92, 79, 91, 87,
+  93, 88, 82, 89, 89, 90, 85, 93, 73, 91,
+  90, 91, 87, 85, 83, 76, 98, 98, 88, 90,
+  94, 76, 86, 81, 78, 77, 83, 86, 84, 79,
+  85, 89, 82, 89, 75, 80, 82, 90, 86, 80,
+  51, 88, 78, 86, 91, 78, 85, 85, 83, 81,
+  86, 85, 85, 89, 93, 85, 85, 94, 81, 79,
+  74, 73, 85, 79, 83, 83, 85, 86, 83, 76,
+  73, 87, 89, 92, 88, 81, 91, 82, 92, 82,
+  92, 86, 85, 74, 87, 83, 80, 84, 87, 92,
+  81, 85, 77, 79, 85, 85, 83, 95, 94, 84,
+  79, 82, 84, 86, 84, 75, 75, 88, 90, 81,
+  90, 92, 82, 75, 78, 79, 84, 89, 81, 83,
+  75, 85, 84, 77, 81, 85, 86, 91, 81, 82,
+  83, 85, 98, 84, 86, 87, 97, 82, 80, 94,
+  76, 83, 85, 82, 83, 86, 78, 99, 91, 81,
+  82, 83, 88, 83, 79, 78, 84, 84, 83, 79,
+  83, 82, 85, 96, 80, 82, 82, 80, 94, 84,
+  72, 81, 84, 81, 79, 78, 76, 92, 80, 76,
+  82, 83, 88, 88, 81, 84, 88, 86, 73, 77,
+  83, 85, 85, 76, 84, 78, 86, 81, 85, 88,
+  87, 90, 84, 84, 88, 84, 82, 81, 79, 80,
+  82, 80, 93, 77, 78, 82, 87, 84, 84, 88,
+  77, 88, 86, 81, 81, 93, 87, 92, 98, 87,
+  88, 76, 83, 75, 82, 87, 87, 78, 83, 101,
+  80, 77, 78, 78, 91, 90, 77, 76, 86, 88,
+  83, 80, 85, 85, 84, 93, 83, 85, 85, 77,
+  96, 79, 82, 86, 85, 84, 82, 87, 81, 82,
+  82, 87, 85, 86, 82, 98, 87, 78, 84, 85,
+  87, 76, 77, 78, 86, 79, 81, 86, 82, 77,
+  82, 88, 84, 74, 78, 78, 66, 75, 78, 86,
+  83, 80, 83, 76, 78, 90, 83, 72, 83, 84,
+  88, 87, 79, 83, 90, 87, 72, 81, 84, 89,
+  80, 83, 87, 78, 79, 81, 79, 88, 84, 86,
+  81, 75, 87, 82, 85, 81, 89, 79, 84, 78,
+  90, 73, 70, 82, 83, 86, 84, 88, 78, 88,
+  86, 82, 84, 91, 84, 86, 98, 90, 91, 83,
+  84, 73, 78, 84, 87, 75, 78, 88, 84, 76,
+  74, 81, 89, 94, 83, 86, 90, 87, 85, 82,
+  86, 83, 91, 84, 83, 84, 89, 83, 85, 90,
+  71, 87, 78, 94, 85, 76, 85, 84, 83, 82,
+  86, 88, 89, 101, 84, 78, 85, 81, 81, 62,
+  83, 75, 82, 80, 85, 93, 78, 76, 86, 81,
+  85, 84, 80, 79, 62, 81, 80, 89, 87, 84,
+  83, 81, 80, 84, 82, 73, 86, 88, 87, 89,
+  90, 83, 77, 83, 81, 75, 89, 87, 85, 91,
+  86, 81, 80, 79, 77, 89, 80, 89, 81, 74,
+  96, 78, 85, 77, 92, 85, 83, 81, 75, 77,
+  80, 82, 83, 85, 85, 88, 77, 83, 89, 86,
+  82, 91, 88, 68, 98, 87, 79, 76, 91, 83,
+  68, 85, 78, 81, 100, 90, 80, 92, 85, 81,
+  78, 94, 80, 93, 85, 85, 90, 87, 70, 84,
+  88, 99, 99, 84, 79, 85, 92, 80, 69, 82,
+  92, 83, 77, 73, 95, 98, 91, 87, 92, 94,
+  80, 83, 95, 78, 85, 85, 73, 81, 79, 80,
+  81, 98, 80, 81, 96, 74, 82, 76, 84, 81,
+  79, 94, 95, 82, 88, 82, 89, 72, 81, 95,
+  87, 87, 83, 72, 97, 82, 79, 79, 88, 86,
+  73, 102, 82, 86, 79, 75, 76, 101, 86, 85,
+  83, 87, 80, 76, 102, 73, 89, 77, 79, 94,
+  86, 62, 85, 89, 81, 81, 79, 73, 96, 88,
+  85, 83, 93, 70, 65, 82, 95, 97, 84, 75,
+  80, 84, 77, 82, 81, 75, 94, 75, 56, 84,
+  88, 87, 105, 96, 78, 86, 87, 78, 85, 115,
+  89, 88, 80, 76, 82, 77, 56, 78, 98, 99,
+  94, 87, 60, 97, 84, 76, 61, 74, 93, 75,
+  74, 63, 89, 122, 105, 71, 81, 82, 66, 60,
+  102, 61, 75, 81, 54, 86, 76, 81, 72, 112,
+  92, 76, 100, 81, 75, 76, 80, 88, 75, 78,
+  88, 81, 79, 80, 98, 59, 77, 86, 93, 83,
+  83, 93, 89, 84, 97, 78, 82, 91, 69, 104,
+  81, 92, 79, 70, 81, 137, 87, 86, 84, 81,
+  70, 90, 96, 71, 81, 69, 84, 115, 84, 68,
+  87, 77, 76, 79, 77, 60, 81, 94, 92, 79,
+  92, 70, 40, 76, 90, 96, 86, 61, 85, 98,
+  90, 89, 72, 84, 86, 85, 69, 85, 78, 86,
+  95, 87, 80, 90, 88, 77, 80, 88, 86, 96,
+  70, 81, 79, 88, 78, 81, 84, 96, 93, 83,
+  77, 76, 95, 78, 75, 78, 86, 82, 75, 74,
+  79, 92, 94, 84, 86, 87, 76, 83, 94, 84,
+  81, 89, 77, 80, 81, 80, 80, 97, 86, 84,
+  92, 69, 82, 80, 73, 78, 79, 86, 91, 89,
+  86, 82, 89, 73, 84, 87, 93, 90, 82, 68,
+  96, 84, 78, 81, 83, 83, 71, 97, 83, 96,
+  87, 77, 87, 96, 88, 84, 94, 88, 82, 90,
+  97, 71, 89, 78, 73, 89, 84, 70, 94, 90,
+  83, 92, 71, 74, 98, 87, 88, 83, 91, 74,
+  68, 81, 90, 94, 83, 83, 103, 70, 81, 83,
+  78, 79, 91, 78, 66, 86, 95, 88, 91, 76,
+  74, 98, 82, 74, 87, 86, 84, 88, 86, 92,
+  83, 88, 79, 88, 91, 94, 94, 76, 88, 94,
+  96, 89, 75, 69, 99, 70, 65, 76, 94, 80,
+  91, 96, 81, 102, 74, 76, 100, 75, 86, 91,
+  74, 98, 69, 76, 86, 98, 85, 84, 81, 79,
+  72, 77, 77, 78, 73, 73, 112, 87, 82, 79,
+  85, 76, 80, 89, 87, 85, 84, 77, 95, 83,
+  83, 84, 87, 89, 75, 92, 76, 71, 81, 72,
+  80, 98, 85, 83, 82, 94, 72, 85, 95, 76,
+  91, 89, 80, 79, 82, 73, 85, 85, 77, 86,
+  71, 71, 77, 80, 73, 80, 88, 75, 72, 77,
+  88, 84, 89, 76, 96, 87, 77, 82, 77, 69,
+  93, 70, 55, 93, 120, 90, 103, 93, 71, 109,
+  88, 75, 105, 106, 97, 77, 69, 88, 69, 72,
+  70, 85, 101, 101, 93, 80, 70, 104, 92, 81,
+  66, 75, 91, 50, 60, 66, 105, 96, 105, 81,
+  66, 81, 59, 51, 115, 63, 71, 84, 45, 88,
+  69, 79, 65, 140, 94, 73, 73, 93, 56, 75,
+  72, 94, 65, 60, 80, 85, 74, 84, 85, 65,
+  77, 90, 95, 83, 86, 99, 87, 85, 104, 93,
+  80, 96, 70, 99, 79, 72, 73, 60, 84, 122,
+  80, 84, 74, 91, 73, 78, 96, 79, 84, 74,
+  82, 105, 76, 73, 95, 70, 65, 79, 80, 60,
+  73, 77, 71, 83, 95, 77, 36, 66, 81, 84,
+  96, 68, 96, 98, 99, 85, 74, 91, 90, 78,
+  67, 88, 89, 92, 87, 99, 74, 89, 83, 70,
+  90, 82, 85, 101, 70, 87, 72, 90, 83, 84,
+  88, 97, 95, 86, 84, 82, 95, 87, 80, 72,
+  82, 71, 56, 74, 82, 84, 96, 88, 77, 81,
+  77, 76, 98, 92, 80, 94, 76, 66, 72, 74,
+  79, 93, 89, 84, 79, 69, 73, 76, 76, 80,
+  78, 78, 75, 93, 78, 78, 85, 78, 86, 91,
+  84, 85, 84, 73, 95, 88, 82, 87, 83, 86,
+  74, 89, 78, 77, 80, 70, 82, 95, 87, 81,
+  89, 95, 74, 71, 94, 78, 86, 91, 76, 78,
+  77, 77, 97, 84, 79, 92, 83, 79, 106, 79,
+  76, 86, 90, 79, 74, 80, 83, 83, 90, 84,
+  96, 74, 82, 85, 73, 84, 79, 86, 84, 81,
+  84, 95, 83, 87, 64, 105, 82, 77, 95, 82,
+  87, 93, 82, 101, 78, 89, 94, 84, 77, 92,
+  84, 78, 87, 78, 100, 92, 87, 78, 97, 79,
+  75, 73, 73, 72, 76, 100, 86, 91, 79, 98,
+  89, 84, 96, 95, 99, 94, 74, 80, 108, 81,
+  86, 89, 80, 87, 81, 78, 75, 77, 75, 89,
+  93, 88, 83, 76, 85, 81, 86, 87, 87, 60,
+  80, 65, 96, 74, 66, 98, 84, 80, 91, 89,
+  77, 80, 91, 82, 85, 72, 82, 75, 92, 96,
+  78, 93, 87, 73, 103, 98, 75, 69, 77, 89,
+  92, 86, 90, 84, 76, 92, 69, 75, 77, 72,
+  98, 83, 89, 83, 83, 82, 86, 88, 94, 79,
+  76, 87, 65, 70, 79, 79, 82, 86, 102, 97,
+  86, 95, 72, 106, 81, 83, 104, 77, 83, 85,
+  70, 100, 76, 75, 98, 84, 90, 95, 84, 86,
+  100, 78, 104, 74, 84, 82, 91, 65, 69, 62,
+  89, 72, 76, 100, 75, 81, 67, 97, 91, 95,
+  92, 92, 87, 93, 69, 85, 94, 94, 89, 81,
+  63, 93, 73, 73, 72, 81, 65, 82, 87, 78,
+  80, 77, 82, 75, 88, 75, 94, 50, 82, 67,
+  97, 87, 70, 98, 80, 83, 95, 102, 72, 75,
+  86, 79, 84, 73, 92, 76, 80, 96, 82, 79,
+  82, 76, 106, 110, 76, 75, 77, 90, 107, 82,
+  86, 79, 80, 94, 73, 70, 66, 77, 96, 84,
+  81, 79, 72, 86, 86, 103, 88, 83, 87, 82,
+  77, 82, 81, 80, 81, 86, 82, 95, 81, 96,
+  68, 103, 80, 75, 91, 77, 72, 94, 80, 101,
+  81, 91, 92, 82, 76, 93, 89, 87, 89, 87,
+  99, 77, 87, 75, 78, 81, 71, 72, 91, 79,
+  76, 97, 86, 89, 79, 99, 88, 88, 95, 96,
+  96, 80, 75, 82, 96, 82, 91, 89, 77, 79,
+  81, 76, 79, 80, 71, 89, 70, 86, 79, 72,
+  86, 84, 85, 80, 90, 58, 85, 64, 89, 97,
+  67, 93, 85, 82, 90, 93, 76, 75, 89, 85,
+  90, 76, 79, 74, 85, 93, 80, 70, 89, 74,
+  108, 97, 74, 74, 82, 94, 92, 84, 91, 85,
+  83, 98, 94, 77, 80, 76, 84, 83, 93, 86,
+  85, 86, 91, 89, 81, 79, 81, 76, 72, 78,
+  79, 86, 89, 76, 87, 83, 76, 84, 75, 81,
+  73, 86, 89, 80, 89, 74, 88, 79, 80, 79,
+  92, 86, 101, 79, 91, 82, 99, 76, 79, 95,
+  82, 79, 82, 73, 91, 83, 78, 87, 80, 93,
+  71, 87, 84, 84, 82, 87, 68, 92, 97, 80,
+  78, 84, 76, 76, 75, 83, 79, 85, 92, 89,
+  81, 84, 84, 85, 85, 78, 73, 73, 89, 84,
+  101, 84, 82, 87, 76, 78, 86, 77, 85, 80,
+  81, 76, 82, 85, 95, 77, 78, 86, 77, 85,
+  87, 88, 85, 96, 94, 80, 84, 73, 91, 75,
+  75, 86, 80, 71, 79, 92, 90, 81, 89, 89,
+  85, 81, 86, 88, 89, 87, 81, 76, 91, 83,
+  88, 94, 80, 80, 83, 80, 74, 78, 74, 90,
+  98, 71, 94, 76, 75, 83, 75, 81, 73, 82,
+  102, 86, 79, 76, 80, 75, 87, 73, 94, 85,
+  93, 79, 82, 93, 111, 79, 77, 83, 85, 72,
+  83, 74, 86, 84, 76, 85, 71, 90, 72, 86,
+  86, 93, 92, 87, 68, 98, 107, 85, 88, 76,
+  68, 72, 80, 95, 82, 90, 91, 89, 79, 80,
+  81, 90, 82, 76, 76, 73, 85, 99, 114, 83,
+  82, 91, 80, 75, 89, 80, 82, 83, 88, 76,
+  78, 77, 106, 82, 80, 78, 82, 81, 104, 86,
+  79, 95, 96, 86, 86, 73, 84, 72, 79, 86,
+  81, 77, 72, 99, 93, 86, 86, 91, 85, 77,
+  81, 93, 81, 88, 84, 77, 99, 83, 85, 98,
+  83, 78, 82, 72, 72, 85, 78, 86, 85, 75,
+  83, 82, 78, 83, 74, 80, 79, 87, 87, 82,
+  81, 76, 76, 78, 85, 79, 93, 84, 99, 83,
+  90, 91, 97, 84, 78, 81, 85, 79, 80, 73,
+  87, 80, 88, 85, 77, 91, 73, 86, 82, 80,
+  84, 88, 70, 92, 97, 86, 79, 85, 74, 80,
+  79, 83, 82, 82, 97, 90, 80, 87, 83, 86,
+  89, 73, 78, 71, 86, 77, 96, 81, 80, 84,
+  77, 74, 88, 86, 83, 81, 82, 76, 84, 86,
+  93, 80, 80, 88, 73, 84, 81, 86, 80, 90,
+  91, 85, 84, 78, 88, 75, 74, 90, 78, 73,
+  79, 90, 92, 82, 80, 92, 82, 81, 86, 90,
+  78, 82, 80, 77, 86, 82, 85, 91, 79, 80,
+  82, 79, 77, 77, 74, 84, 98, 73, 101, 82,
+  74, 85, 78, 76, 73, 81, 97, 80, 86, 82,
+  86, 79, 85, 75, 81, 90, 84, 78, 74, 86,
+  108, 71, 82, 98, 76, 84, 79, 66, 77, 87,
+  78, 82, 73, 95, 73, 85, 84, 85, 88, 87,
+  67, 101, 104, 87, 84, 77, 76, 73, 74, 96,
+  76, 81, 89, 84, 74, 84, 94, 78, 85, 74,
+  79, 77, 92, 90, 112, 91, 80, 81, 82, 75,
+  88, 73, 89, 82, 79, 78, 78, 71, 98, 80,
+  80, 78, 85, 90, 105, 90, 90, 96, 92, 76,
+  82, 75, 83, 82, 80, 79, 78, 76, 80, 92,
+  93, 81, 80, 87, 87, 76, 80, 99, 91, 91,
+  81, 76, 92, 81, 88, 100, 77, 77, 90, 83,
+  79, 85, 72, 88, 120, 71, 109, 72, 75, 83,
+  84, 72, 70, 78, 118, 81, 82, 84, 82, 78,
+  88, 70, 86, 99, 81, 81, 62, 103, 126, 70,
+  82, 85, 77, 79, 83, 68, 70, 86, 76, 76,
+  72, 100, 71, 86, 81, 101, 101, 101, 61, 108,
+  123, 85, 83, 75, 69, 67, 69, 114, 73, 90,
+  88, 93, 68, 75, 94, 78, 80, 69, 89, 84,
+  83, 106, 135, 82, 79, 85, 81, 74, 91, 87,
+  90, 83, 85, 79, 79, 67, 106, 79, 80, 67,
+  99, 89, 127, 90, 83, 105, 96, 81, 85, 77,
+  73, 83, 83, 76, 78, 82, 79, 92, 99, 84,
+  79, 90, 88, 73, 76, 101, 81, 92, 78, 70,
+  100, 80, 87, 112, 78, 76, 87, 75, 79, 85,
+  72, 89, 97, 72, 96, 84, 76, 79, 78, 76,
+  79, 85, 97, 83, 84, 76, 76, 82, 85, 75,
+  80, 89, 81, 87, 80, 97, 103, 82, 79, 82,
+  82, 80, 84, 69, 76, 82, 83, 83, 75, 94,
+  80, 88, 84, 82, 88, 86, 68, 101, 102, 82,
+  80, 82, 72, 80, 76, 93, 76, 80, 86, 84,
+  77, 85, 90, 79, 93, 73, 80, 81, 90, 87,
+  103, 73, 77, 80, 80, 77, 92, 98, 91, 81,
+  81, 80, 80, 80, 101, 78, 84, 81, 79, 87,
+  97, 88, 79, 94, 92, 82, 85, 79, 78, 80,
+  78, 82, 79, 77, 84, 88, 98, 81, 78, 85,
+  85, 76, 79, 94, 76, 88, 81, 78, 90, 82,
+  86, 95, 78, 87, 83, 74, 71, 77, 80, 88,
+  89, 72, 88, 93, 81, 85, 77, 75, 76, 84,
+  83, 81, 81, 83, 78, 78, 87, 78, 84, 84,
+  90, 77, 74, 86, 100, 77, 78, 98, 83, 87,
+  74, 75, 79, 85, 78, 83, 77, 93, 80, 91,
+  87, 72, 87, 88, 72, 101, 96, 85, 83, 74,
+  79, 74, 78, 84, 83, 81, 87, 85, 76, 88,
+  88, 80, 83, 80, 71, 80, 93, 80, 97, 83,
+  83, 84, 83, 85, 94, 80, 89, 84, 77, 75,
+  79, 75, 91, 80, 80, 82, 85, 90, 84, 86,
+  93, 98, 90, 76, 80, 78, 83, 79, 75, 80,
+  75, 75, 83, 92, 90, 82, 85, 90, 78, 79,
+  82, 92, 90, 85, 82, 78, 83, 80, 87, 85,
+  81, 84, 91, 78, 75, 79, 76, 91, 97, 72,
+  92, 85, 84, 80, 80, 69, 72, 84, 95, 82,
+  82, 81, 78, 75, 88, 75, 91, 91, 85, 78,
+  70, 98, 113, 74, 76, 88, 82, 86, 81, 75,
+  70, 85, 83, 84, 79, 93, 82, 90, 84, 81,
+  92, 90, 70, 102, 103, 82, 81, 72, 66, 74,
+  73, 88, 79, 88, 90, 89, 73, 84, 89, 84,
+  85, 76, 71, 87, 89, 89, 105, 87, 81, 84,
+  81, 87, 95, 93, 90, 84, 81, 73, 76, 76,
+  103, 80, 80, 77, 89, 87, 92, 88, 89, 100,
+  96, 76, 79, 77, 75, 85, 80, 81, 78, 77,
+  81, 91, 94, 82, 84, 88, 84, 75, 76, 89,
+  81, 88, 82, 74, 92, 79, 87, 91, 77, 80,
+  84, 72, 75, 74, 79, 92, 90, 73, 83, 93,
+  82, 75, 76, 77, 79, 85, 87, 76, 84, 77,
+  73, 78, 90, 78, 82, 84, 88, 81, 83, 94,
+  91, 83, 78, 83, 85, 82, 82, 78, 77, 83,
+  82, 83, 77, 92, 87, 87, 87, 70, 85, 82,
+  71, 98, 96, 82, 76, 78, 75, 76, 80, 87,
+  82, 80, 79, 86, 82, 87, 85, 83, 88, 81,
+  69, 81, 93, 80, 97, 86, 82, 84, 77, 87,
+  94, 95, 93, 82, 82, 79, 83, 85, 92, 82,
+  84, 87, 83, 89, 78, 87, 85, 101, 91, 76,
+  83, 79, 81, 79, 75, 84, 79, 73, 83, 87,
+  91, 78, 87, 93, 79, 80, 82, 89, 83, 87,
+  83, 80, 83, 80, 86, 81, 87, 76, 82, 89,
+  80, 75, 102, 87, 106, 81, 77, 94, 67, 91,
+  117, 78, 76, 84, 74, 72, 78, 69, 73, 80,
+  91, 70, 92, 88, 94, 62, 85, 74, 80, 88,
+  75, 83, 72, 85, 96, 88, 70, 130, 77, 94,
+  101, 75, 81, 86, 67, 101, 83, 76, 91, 94,
+  78, 82, 84, 63, 80, 88, 67, 77, 81, 105,
+  93, 104, 79, 89, 73, 97, 75, 86, 79, 67,
+  93, 86, 112, 82, 73, 76, 93, 89, 93, 78,
+  91, 84, 75, 79, 82, 75, 91, 81, 86, 76,
+  70, 86, 74, 96, 79, 77, 98, 67, 90, 74,
+  85, 86, 86, 90, 77, 88, 86, 93, 88, 92,
+  74, 80, 95, 76, 76, 64, 95, 83, 67, 82,
+  72, 78, 88, 77, 95, 83, 80, 87, 85, 79,
+  94, 83, 91, 82, 82, 90, 69, 91, 111, 82,
+  76, 89, 75, 79, 73, 78, 70, 81, 86, 76,
+  91, 90, 80, 69, 83, 74, 83, 85, 77, 82,
+  74, 85, 95, 91, 78, 114, 75, 92, 107, 74,
+  79, 85, 77, 108, 79, 79, 83, 90, 82, 79,
+  73, 72, 82, 96, 75, 79, 81, 94, 89, 106,
+  80, 96, 77, 104, 74, 95, 81, 66, 95, 77,
+  110, 73, 80, 71, 94, 81, 92, 74, 90, 75,
+  82, 73, 78, 87, 81, 86, 88, 88, 75, 85,
+  72, 108, 83, 73, 102, 79, 86, 80, 86, 88,
+  78, 85, 78, 87, 85, 100, 89, 84, 73, 75,
+  82, 78, 76, 59, 80, 84, 54, 79, 76, 82,
+  85, 85, 85, 89, 75, 88, 86, 85, 94, 87,
+  99, 82, 78, 99, 68, 97, 111, 79, 75, 81,
+  79, 72, 79, 74, 69, 79, 82, 73, 91, 86,
+  92, 71, 82, 73, 82, 86, 74, 104, 73, 82,
+  90, 88, 73, 122, 83, 93, 101, 75, 81, 88,
+  70, 100, 83, 77, 88, 95, 76, 84, 92, 62,
+  86, 85, 76, 76, 86, 102, 92, 101, 78, 90,
+  74, 91, 84, 83, 83, 70, 95, 85, 109, 75,
+  79, 74, 93, 84, 94, 85, 89, 78, 95, 75,
+  76, 89, 93, 84, 86, 76, 74, 83, 76, 95,
+  86, 81, 100, 76, 90, 74, 82, 83, 88, 89,
+  75, 86, 90, 89, 91, 81, 69, 77, 78, 79,
+  76, 69, 67, 81, 70, 82, 72, 78, 88, 79,
+  100, 79, 76, 88, 72, 84, 102, 92, 100, 86,
+  76, 85, 75, 100, 112, 74, 84, 87, 83, 76,
+  76, 59, 83, 80, 89, 71, 84, 89, 74, 63,
+  81, 70, 82, 88, 99, 86, 73, 84, 80, 78,
+  73, 127, 92, 90, 97, 78, 82, 90, 72, 97,
+  87, 80, 77, 95, 85, 79, 81, 66, 76, 93,
+  61, 80, 76, 93, 85, 106, 85, 76, 78, 87,
+  80, 92, 76, 79, 90, 82, 105, 90, 76, 77,
+  91, 87, 82, 78, 86, 81, 75, 80, 85, 64,
+  85, 70, 83, 82, 80, 95, 73, 96, 83, 70,
+  84, 72, 82, 73, 81, 83, 85, 92, 72, 87,
+  90, 96, 89, 86, 68, 88, 94, 78, 71, 72,
+  86, 88, 64, 77, 74, 76, 91, 90, 122, 85,
+  80, 90, 77, 84, 104, 86, 95, 95, 86, 79,
+  82, 84, 118, 87, 92, 83, 86, 84, 80, 70,
+  70, 88, 93, 86, 82, 94, 62, 79, 83, 83,
+  87, 92, 96, 76, 75, 95, 93, 89, 81, 152,
+  80, 91, 111, 82, 83, 93, 85, 117, 77, 94,
+  76, 92, 102, 80, 79, 83, 75, 111, 74, 76,
+  70, 120, 80, 126, 96, 92, 86, 89, 76, 118,
+  69, 75, 99, 79, 114, 75, 76, 78, 94, 83,
+  85, 66, 95, 82, 72, 75, 90, 71, 80, 66,
+  81, 106, 77, 105, 75, 112, 90, 69, 87, 82,
+  79, 78, 87, 88, 82, 85, 83, 89, 100, 101,
+  92, 71, 64, 85, 79, 85, 74, 71, 64, 99,
+  52, 69, 87, 76, 92, 115, 90, 86, 87, 87,
+  76, 99, 95, 89, 95, 87, 74, 85, 70, 80,
+  106, 83, 85, 86, 86, 74, 89, 57, 74, 76,
+  81, 74, 78, 86, 72, 89, 79, 80, 84, 81,
+  80, 100, 79, 85, 100, 84, 76, 115, 77, 89,
+  94, 80, 84, 96, 74, 95, 90, 82, 75, 94,
+  85, 81, 83, 65, 81, 89, 68, 77, 76, 87,
+  83, 102, 86, 80, 78, 84, 84, 86, 80, 77,
+  97, 84, 103, 83, 80, 78, 91, 86, 83, 93,
+  83, 80, 86, 76, 83, 80, 84, 73, 83, 83,
+  77, 91, 74, 95, 83, 74, 82, 77, 86, 74,
+  80, 81, 85, 88, 74, 84, 101, 92, 91, 76,
+  66, 88, 81, 80, 71, 72, 57, 89, 65, 80,
+  74, 79, 90, 92, 99, 85, 73, 86, 80, 81,
+  100, 99, 99, 85, 76, 95, 75, 98, 113, 77,
+  86, 83, 86, 78, 86, 73, 74, 77, 82, 69,
+  92, 87, 84, 69, 82, 70, 83, 90, 89, 86,
+  77, 84, 86, 77, 87, 135, 90, 99, 92, 79,
+  87, 94, 73, 89, 90, 81, 83, 94, 78, 88,
+  87, 65, 81, 88, 64, 82, 75, 98, 92, 111,
+  86, 72, 76, 88, 85, 83, 80, 83, 90, 83,
+  99, 82, 86, 72, 96, 78, 82, 71, 94, 76,
+  76, 79, 75, 76, 93, 75, 84, 84, 82, 93,
+  69, 92, 87, 75, 90, 73, 93, 71, 79, 79,
+  89, 106, 77, 83, 85, 94, 92, 83, 77, 82,
+  84, 79, 74, 79, 79, 84, 66, 81, 77, 88,
+  84, 81, 108, 81, 80, 83, 82, 83, 100, 95,
+  89, 80, 76, 90, 76, 83, 109, 86, 90, 86,
+  90, 84, 88, 82, 71, 77, 78, 66, 94, 90,
+  74, 86, 80, 79, 92, 86, 91, 79, 80, 84,
+  89, 80, 93, 122, 86, 96, 91, 84, 93, 86,
+  77, 91, 89, 86, 77, 91, 86, 81, 80, 74,
+  78, 90, 77, 85, 73, 90, 81, 109, 97, 77,
+  79, 97, 75, 80, 79, 84, 90, 75, 92, 78,
+  95, 66, 98, 76, 84, 71, 89, 80, 76, 73,
+  80, 75, 90, 75, 79, 90, 80, 92, 67, 99,
+  87, 73, 91, 70, 81, 77, 72, 86, 82, 104,
+  81, 84, 90, 105, 91, 75, 81, 78, 82, 80,
+  72, 79, 69, 83, 57, 72, 81, 90, 77, 96,
+  96, 86, 91, 82, 81, 88, 99, 94, 97, 85,
+  76, 93, 72, 82, 110, 85, 87, 82, 90, 77,
+  87, 72, 73, 77, 81, 72, 87, 85, 82, 88,
+  82, 78, 83, 89, 78, 98, 80, 86, 98, 80,
+  89, 130, 79, 95, 96, 80, 86, 86, 75, 87,
+  89, 81, 79, 92, 77, 82, 85, 69, 80, 83,
+  75, 79, 72, 99, 84, 110, 93, 74, 77, 86,
+  81, 83, 80, 83, 87, 84, 97, 80, 84, 74,
+  96, 85, 85, 89, 95, 79, 81, 77, 78, 83,
+  89, 67, 87, 86, 80, 90, 73, 91, 81, 78,
+  86, 72, 93, 71, 79, 80, 86, 100, 80, 84,
+  92, 93, 94, 75, 77, 87, 84, 82, 77, 79,
+  56, 81, 69, 79, 80, 95, 86, 82, 83, 88,
+  87, 95, 81, 84, 81, 76, 79, 60, 86, 89,
+  71, 78, 79, 90, 76, 83, 84, 97, 92, 88,
+  80, 77, 87, 83, 88, 91, 92, 86, 80, 83,
+  75, 83, 86, 63, 80, 97, 80, 78, 80, 76,
+  89, 83, 75, 90, 84, 96, 77, 77, 78, 89,
+  75, 88, 94, 83, 74, 84, 82, 79, 93, 78,
+  78, 81, 96, 77, 69, 78, 92, 93, 86, 82,
+  89, 85, 90, 71, 81, 100, 77, 90, 83, 77,
+  83, 79, 85, 86, 81, 81, 90, 76, 89, 77,
+  89, 86, 75, 87, 72, 82, 89, 100, 79, 71,
+  74, 81, 80, 85, 70, 79, 81, 90, 80, 85,
+  105, 117, 85, 77, 86, 76, 92, 88, 83, 90,
+  71, 78, 89, 105, 98, 86, 85, 93, 88, 112,
+  79, 90, 83, 72, 82, 60, 93, 93, 87, 79,
+  83, 99, 79, 88, 87, 99, 93, 91, 76, 74,
+  88, 79, 94, 113, 98, 86, 79, 58, 80, 90,
+  91, 82, 78, 96, 80, 72, 83, 82, 95, 89,
+  73, 80, 87, 82, 64, 83, 78, 88, 76, 79,
+  89, 88, 74, 85, 87, 90, 106, 70, 79, 79,
+  72, 78, 78, 86, 84, 90, 81, 85, 69, 84,
+  84, 74, 90, 82, 82, 89, 86, 75, 89, 69,
+  89, 79, 88, 92, 94, 73, 80, 73, 78, 85,
+  65, 96, 73, 91, 89, 89, 79, 79, 104, 82,
+  68, 87, 75, 83, 75, 91, 76, 94, 104, 82,
+  79, 91, 81, 77, 92, 82, 81, 89, 72, 83,
+  93, 90, 107, 93, 80, 79, 91, 105, 84, 99,
+  83, 82, 77, 70, 90, 91, 80, 79, 82, 92,
+  83, 83, 76, 89, 88, 81, 85, 84, 86, 86,
+  84, 91, 79, 91, 85, 67, 80, 91, 87, 125,
+  82, 93, 81, 72, 78, 78, 92, 89, 80, 93,
+  83, 78, 81, 79, 80, 82, 76, 80, 88, 89,
+  80, 83, 87, 82, 94, 70, 82, 77, 82, 78,
+  82, 84, 93, 93, 91, 77, 81, 88, 73, 79,
+  89, 71, 87, 88, 81, 80, 84, 82, 80, 78,
+  116, 79, 90, 77, 88, 80, 91, 90, 80, 91,
+  77, 83, 79, 91, 81, 81, 82, 81, 87, 83,
+  70, 85, 78, 86, 74, 91, 99, 74, 83, 81,
+  88, 78, 95, 88, 73, 91, 72, 75, 87, 114,
+  91, 83, 82, 86, 91, 96, 77, 85, 82, 79,
+  76, 74, 86, 87, 65, 80, 79, 90, 73, 69,
+  92, 93, 95, 91, 75, 75, 85, 90, 87, 94,
+  99, 82, 79, 91, 80, 81, 80, 52, 83, 74,
+  82, 73, 93, 72, 85, 82, 71, 88, 90, 95,
+  75, 78, 80, 82, 81, 80, 88, 83, 79, 86,
+  95, 78, 83, 87, 70, 73, 92, 76, 78, 81,
+  79, 76, 92, 81, 91, 80, 87, 76, 83, 108,
+  74, 92, 84, 77, 84, 74, 84, 73, 79, 91,
+  88, 78, 91, 79, 101, 90, 80, 84, 80, 83,
+  89, 91, 77, 76, 80, 79, 88, 84, 78, 84,
+  87, 86, 81, 92, 87, 126, 85, 89, 78, 80,
+  96, 77, 81, 84, 80, 91, 85, 112, 89, 84,
+  89, 88, 92, 115, 75, 81, 85, 77, 80, 76,
+  96, 97, 79, 84, 78, 94, 74, 70, 118, 88,
+  88, 100, 77, 69, 83, 90, 90, 118, 111, 87,
+  78, 60, 79, 84, 87, 76, 77, 66, 80, 73,
+  100, 70, 93, 89, 71, 78, 95, 87, 55, 85,
+  83, 81, 78, 71, 87, 93, 75, 83, 98, 85,
+  86, 71, 65, 75, 73, 76, 80, 83, 74, 62,
+  85, 84, 78, 79, 82, 77, 86, 85, 81, 90,
+  85, 78, 91, 71, 92, 64, 89, 97, 94, 76,
+  80, 82, 91, 92, 64, 89, 74, 90, 94, 82,
+  77, 72, 114, 80, 70, 79, 82, 92, 83, 82,
+  79, 90, 81, 84, 89, 93, 80, 69, 100, 72,
+  81, 75, 72, 99, 86, 96, 99, 89, 82, 81,
+  83, 104, 81, 90, 83, 81, 77, 86, 92, 89,
+  79, 90, 81, 94, 76, 75, 94, 81, 81, 85,
+  98, 82, 88, 92, 83, 95, 89, 92, 81, 68,
+  84, 88, 86, 131, 85, 70, 81, 73, 85, 71,
+  87, 86, 77, 86, 89, 79, 77, 84, 78, 84,
+  85, 76, 84, 86, 79, 81, 98, 83, 86, 67,
+  69, 72, 69, 75, 89, 83, 83, 82, 79, 72,
+  80, 80, 74, 81, 88, 70, 78, 87, 81, 79,
+  84, 86, 80, 66, 118, 79, 85, 78, 89, 75,
+  100, 94, 76, 83, 83, 82, 79, 83, 77, 79,
+  92, 78, 90, 82, 76, 92, 84, 84, 76, 90,
+  82, 73, 88, 89, 94, 76, 96, 81, 74, 83,
+  84, 88, 81, 118, 86, 85, 88, 91, 91, 90,
+  80, 80, 74, 77, 87, 80, 74, 91, 74, 90,
+  74, 80, 79, 68, 88, 87, 90, 85, 83, 78,
+  91, 91, 86, 67, 67, 79, 76, 103, 86, 95,
+  62, 59, 98, 65, 81, 77, 83, 60, 97, 77,
+  81, 82, 90, 102, 85, 80, 82, 84, 88, 74,
+  83, 79, 83, 81, 90, 81, 78, 86, 78, 80,
+  79, 79, 83, 80, 76, 80, 80, 76, 96, 85,
+  82, 72, 86, 97, 71, 84, 75, 85, 97, 82,
+  90, 59, 67, 80, 82, 79, 92, 79, 106, 93,
+  91, 85, 90, 80, 88, 86, 72, 79, 77, 71,
+  105, 87, 77, 76, 101, 79, 82, 82, 71, 121,
+  89, 95, 75, 91, 87, 77, 85, 82, 90, 95,
+  73, 173, 79, 74, 90, 87, 87, 98, 77, 84,
+  80, 71, 86, 89, 79, 99, 81, 89, 75, 81,
+  73, 73, 97, 80, 90, 92, 82, 76, 88, 94,
+  85, 79, 74, 77, 79, 87, 86, 93, 67, 83,
+  88, 61, 81, 75, 87, 51, 94, 85, 81, 82,
+  88, 93, 74, 82, 83, 87, 88, 68, 85, 87,
+  81, 79, 99, 88, 81, 81, 68, 84, 75, 78,
+  81, 91, 77, 81, 84, 73, 96, 83, 78, 78,
+  82, 84, 78, 79, 74, 90, 96, 77, 95, 54,
+  82, 87, 79, 79, 85, 85, 113, 99, 91, 91,
+  87, 82, 96, 84, 75, 76, 78, 72, 104, 92,
+  76, 80, 103, 77, 82, 84, 64, 86, 92, 100,
+  77, 92, 91, 76, 82, 86, 85, 92, 76, 194,
+  85, 77, 92, 82, 76, 92, 78, 90, 74, 80,
+  86, 89, 76, 92, 81, 88, 76, 82, 82, 71,
+  85, 74, 86, 88, 89, 83, 90, 91, 78, 65,
+  57, 83, 82, 84, 89, 91, 80, 121, 91, 67,
+  87, 72, 81, 60, 89, 78, 86, 85, 91, 84,
+  88, 87, 84, 86, 92, 75, 76, 85, 82, 80,
+  97, 84, 81, 75, 78, 80, 68, 78, 87, 84,
+  80, 83, 76, 73, 87, 82, 72, 75, 91, 80,
+  74, 80, 74, 82, 93, 74, 89, 52, 106, 73,
+  76, 83, 89, 81, 103, 96, 91, 81, 90, 79,
+  90, 83, 70, 74, 85, 69, 106, 90, 74, 79,
+  94, 81, 78, 80, 72, 71, 91, 107, 81, 92,
+  87, 81, 80, 84, 95, 93, 70, 184, 79, 81,
+  87, 73, 92, 82, 91, 104, 75, 78, 81, 81,
+  80, 94, 77, 103, 80, 81, 77, 88, 77, 86,
+  106, 77, 60, 87, 79, 103, 87, 93, 87, 103,
+  83, 69, 78, 84, 89, 74, 86, 88, 76, 72,
+  88, 73, 71, 80, 82, 80, 71, 87, 80, 102,
+  67, 95, 81, 86, 83, 84, 74, 70, 83, 92,
+  94, 83, 79, 78, 86, 90, 87, 94, 82, 90,
+  75, 86, 93, 87, 77, 80, 84, 86, 75, 84,
+  91, 82, 87, 94, 96, 87, 90, 88, 92, 91,
+  76, 79, 77, 91, 65, 77, 81, 87, 114, 87,
+  80, 85, 96, 82, 86, 78, 77, 86, 89, 77,
+  78, 81, 90, 84, 93, 88, 80, 77, 80, 95,
+  80, 95, 79, 84, 92, 85, 88, 94, 105, 74,
+  72, 75, 82, 76, 85, 86, 73, 69, 86, 128,
+  90, 87, 76, 83, 81, 112, 92, 86, 99, 78,
+  68, 73, 90, 108, 87, 91, 89, 93, 99, 63,
+  76, 72, 89, 64, 86, 75, 81, 82, 75, 84,
+  92, 94, 92, 81, 76, 81, 59, 81, 75, 89,
+  90, 82, 91, 86, 82, 59, 87, 97, 101, 63,
+  86, 93, 69, 89, 85, 89, 66, 86, 63, 68,
+  75, 86, 74, 75, 83, 74, 79, 82, 83, 83,
+  94, 80, 114, 75, 86, 89, 92, 104, 85, 82,
+  66, 91, 66, 82, 73, 95, 86, 75, 77, 84,
+  96, 87, 61, 76, 84, 93, 79, 85, 76, 89,
+  93, 79, 90, 84, 72, 81, 86, 79, 88, 100,
+  74, 88, 70, 83, 108, 85, 100, 76, 78, 81,
+  87, 52, 74, 88, 76, 77, 88, 120, 84, 65,
+  76, 86, 73, 105, 84, 85, 69, 76, 87, 82,
+  101, 113, 90, 93, 87, 78, 93, 72, 76, 69,
+  106, 85, 86, 83, 87, 79, 76, 83, 107, 83,
+  88, 83, 87, 81, 65, 93, 71, 90, 82, 90,
+  84, 86, 77, 64, 98, 90, 96, 68, 83, 87,
+  82, 83, 88, 92, 71, 82, 87, 77, 90, 88,
+  81, 81, 87, 83, 94, 83, 92, 78, 94, 81,
+  100, 71, 86, 90, 89, 100, 79, 85, 70, 97,
+  70, 81, 79, 92, 62, 74, 78, 81, 98, 80,
+  73, 78, 76, 89, 84, 82, 74, 86, 90, 92,
+  95, 88, 71, 73, 78, 93, 76, 98, 84, 83,
+  79, 82, 99, 92, 90, 75, 89, 80, 95, 99,
+  82, 75, 85, 77, 87, 86, 78, 92, 83, 79,
+  82, 98, 75, 84, 108, 82, 57, 87, 75, 95,
+  75, 88, 93, 91, 87, 73, 86, 89, 82, 77,
+  80, 91, 88, 79, 92, 75, 62, 84, 80, 86,
+  79, 87, 84, 100, 66, 93, 79, 87, 80, 82,
+  80, 68, 89, 87, 86, 83, 80, 67, 84, 85,
+  79, 90, 77, 75, 82, 91, 84, 87, 82, 78,
+  73, 85, 77, 85, 90, 67, 87, 85, 97, 83,
+  89, 87, 91, 87, 78, 82, 87, 93, 66, 82,
+  76, 89, 122, 83, 77, 90, 86, 83, 87, 84,
+  75, 89, 89, 84, 77, 91, 88, 82, 85, 81,
+  76, 85, 80, 87, 81, 89, 74, 87, 89, 83,
+  80, 88, 104, 76, 74, 61, 73, 74, 90, 91,
+  80, 61, 98, 129, 102, 81, 70, 74, 107, 124,
+  107, 86, 94, 77, 69, 69, 85, 101, 81, 80,
+  86, 80, 111, 66, 79, 73, 77, 60, 80, 68,
+  85, 84, 77, 108, 85, 101, 92, 88, 76, 75,
+  56, 78, 64, 79, 88, 83, 99, 82, 96, 53,
+  92, 102, 96, 64, 79, 102, 72, 86, 74, 93,
+  57, 69, 60, 74, 66, 79, 77, 75, 76, 71,
+  77, 88, 70, 70, 104, 74, 119, 77, 86, 90,
+  80, 90, 83, 74, 73, 95, 61, 84, 74, 100,
+  93, 71, 71, 78, 83, 92, 63, 81, 78, 97,
+  77, 86, 79, 101, 91, 81, 82, 76, 67, 91,
+  93, 76, 81, 102, 66, 92, 61, 76, 118, 81,
+  94, 75, 90, 71, 87, 58, 78, 85, 81, 70,
+  97, 111, 92, 77, 71, 84, 92, 115, 91, 87,
+  63, 73, 89, 79, 98, 102, 82, 87, 91, 77,
+  97, 78, 77, 68, 88, 78, 77, 82, 86, 84,
+  82, 94, 115, 95, 87, 89, 89, 76, 65, 90,
+  64, 84, 83, 91, 88, 83, 88, 63, 101, 90,
+  92, 69, 80, 86, 78, 79, 85, 99, 62, 68,
+  79, 80, 75, 80, 86, 80, 81, 80, 84, 83,
+  86, 64, 97, 87, 102, 76, 83, 91, 82, 91,
+  81, 74, 76, 96, 66, 84, 77, 95, 72, 72,
+  70, 72, 87, 85, 73, 82, 69, 92, 78, 84,
+  69, 98, 89, 94, 85, 81, 68, 85, 85, 85,
+  68, 98, 72, 87, 73, 74, 102, 85, 88, 76,
+  75, 86, 88, 99, 81, 71, 72, 86, 91, 82,
+  78, 89, 79, 90, 96, 98, 94, 79, 95, 84,
+  64, 88, 78, 86, 77, 89, 86, 77, 94, 79,
+  83, 98, 76, 82, 78, 93, 96, 77, 83, 75,
+  63, 79, 75, 74, 89, 93, 89, 97, 76, 85,
+  77, 84, 79, 71, 79, 81, 87, 85, 86, 81,
+  88, 71, 89, 81, 80, 85, 82, 82, 85, 87,
+  91, 82, 77, 86, 76, 84, 86, 92, 78, 88,
+  88, 79, 90, 82, 80, 86, 92, 85, 81, 87,
+  85, 98, 78, 78, 89, 85, 99, 88, 78, 95,
+  86, 84, 93, 84, 74, 81, 83, 81, 80, 94,
+  80, 88, 86, 88, 77, 84, 84, 92, 89, 87,
+  81, 87, 92, 84, 83, 78, 95, 79, 79, 77,
+  63, 74, 87, 83, 68, 74, 96, 115, 91, 86,
+  70, 87, 118, 120, 107, 82, 87, 73, 73, 74,
+  83, 91, 80, 89, 84, 72, 98, 77, 86, 81,
+  66, 68, 84, 68, 88, 78, 80, 87, 77, 96,
+  84, 76, 84, 74, 59, 79, 78, 83, 78, 79,
+  92, 83, 80, 69, 91, 92, 92, 64, 86, 94,
+  84, 84, 82, 88, 70, 87, 72, 73, 77, 75,
+  80, 79, 78, 77, 95, 86, 61, 96, 92, 78,
+  98, 78, 82, 91, 91, 84, 83, 91, 75, 99,
+  82, 83, 92, 92, 88, 83, 78, 87, 85, 93,
+  94, 84, 80, 90, 73, 87, 76, 101, 85, 84,
+  82, 83, 66, 90, 94, 82, 85, 91, 67, 94,
+  71, 79, 110, 77, 85, 77, 87, 81, 77, 62,
+  80, 76, 65, 79, 94, 100, 84, 97, 72, 95,
+  106, 108, 98, 80, 63, 73, 92, 82, 90, 92,
+  81, 92, 82, 77, 97, 81, 82, 78, 75, 81,
+  80, 82, 83, 77, 88, 81, 106, 88, 81, 74,
+  91, 74, 73, 86, 77, 89, 76, 86, 86, 83,
+  80, 80, 97, 86, 94, 76, 86, 88, 89, 83,
+  91, 93, 68, 82, 72, 78, 80, 78, 85, 82,
+  81, 82, 94, 86, 73, 85, 86, 82, 91, 82,
+  84, 86, 91, 89, 82, 84, 83, 98, 80, 87,
+  92, 92, 82, 83, 76, 85, 85, 86, 94, 88,
+  72, 87, 74, 83, 70, 99, 86, 84, 84, 87,
+  70, 86, 92, 88, 79, 91, 74, 90, 77, 81,
+  97, 79, 71, 78, 90, 82, 76, 72, 76, 91,
+  77, 84, 65, 135, 75, 119, 72, 90, 85, 93,
+  82, 120, 91, 70, 103, 85, 70, 73, 89, 89,
+  94, 73, 69, 85, 90, 94, 91, 78, 95, 74,
+  101, 75, 82, 82, 76, 103, 94, 84, 84, 91,
+  82, 74, 93, 72, 80, 80, 84, 92, 87, 87,
+  85, 101, 83, 90, 101, 72, 74, 74, 75, 99,
+  84, 85, 85, 77, 78, 76, 80, 75, 74, 92,
+  80, 82, 84, 95, 86, 105, 75, 75, 89, 82,
+  81, 76, 93, 84, 85, 83, 82, 81, 65, 82,
+  76, 84, 99, 79, 79, 79, 92, 85, 88, 90,
+  72, 83, 89, 92, 81, 96, 72, 82, 77, 82,
+  75, 80, 95, 76, 81, 86, 61, 90, 82, 94,
+  81, 97, 83, 96, 67, 90, 81, 78, 84, 82,
+  72, 99, 102, 99, 90, 91, 75, 87, 88, 95,
+  85, 75, 86, 90, 81, 67, 82, 90, 85, 80,
+  68, 81, 79, 84, 85, 67, 97, 73, 95, 91,
+  82, 88, 80, 88, 85, 87, 78, 100, 75, 84,
+  92, 100, 87, 89, 93, 91, 66, 90, 81, 90,
+  84, 70, 86, 79, 84, 80, 70, 79, 78, 93,
+  85, 91, 74, 76, 77, 83, 78, 73, 80, 100,
+  94, 91, 89, 80, 78, 73, 98, 76, 87, 76,
+  73, 83, 80, 92, 70, 69, 79, 82, 79, 81,
+  84, 74, 84, 76, 83, 79, 88, 83, 88, 87,
+  80, 80, 86, 94, 78, 85, 84, 87, 87, 77,
+  91, 75, 98, 81, 80, 80, 81, 89, 80, 89,
+  75, 88, 63, 74, 80, 78, 88, 74, 70, 71,
+  90, 69, 97, 81, 81, 81, 90, 73, 87, 84,
+  92, 87, 83, 77, 80, 81, 83, 92, 91, 80,
+  70, 83, 93, 73, 103, 75, 92, 92, 85, 87,
+  73, 69, 70, 81, 84, 90, 77, 77, 78, 100,
+  83, 98, 94, 90, 68, 100, 75, 84, 86, 79,
+  74, 76, 92, 96, 93, 87, 89, 85, 83, 106,
+  81, 81, 79, 78, 80, 75, 88, 110, 92, 73,
+  78, 73, 84, 84, 88, 78, 98, 82, 58, 81,
+  78, 101, 73, 72, 77, 77, 84, 89, 79, 82,
+  92, 77, 81, 83, 80, 92, 80, 88, 90, 81,
+  87, 86, 82, 83, 88, 88, 89, 99, 92, 96,
+  82, 89, 89, 80, 92, 87, 61, 69, 75, 76,
+  81, 69, 78, 91, 60, 92, 68, 128, 67, 161,
+  68, 79, 97, 100, 77, 123, 88, 61, 94, 79,
+  74, 77, 90, 95, 99, 59, 68, 87, 91, 86,
+  104, 79, 103, 66, 82, 76, 70, 82, 102, 118,
+  78, 78, 76, 94, 76, 71, 109, 66, 72, 79,
+  86, 83, 107, 67, 91, 95, 74, 85, 98, 56,
+  74, 73, 63, 105, 93, 79, 79, 72, 78, 71,
+  94, 74, 74, 95, 78, 89, 72, 87, 84, 105,
+  76, 66, 87, 77, 68, 80, 87, 86, 83, 78,
+  76, 93, 75, 77, 81, 83, 87, 100, 86, 83,
+  85, 86, 90, 88, 62, 80, 83, 108, 87, 107,
+  66, 77, 66, 81, 73, 85, 84, 72, 64, 87,
+  60, 79, 81, 84, 90, 87, 76, 104, 99, 88,
+  77, 75, 72, 88, 72, 88, 99, 160, 86, 81,
+  91, 84, 89, 93, 83, 77, 70, 89, 91, 79,
+  84, 96, 92, 75, 74, 83, 90, 92, 82, 59,
+  98, 79, 65, 83, 83, 95, 100, 106, 76, 87,
+  83, 113, 83, 73, 93, 84, 88, 87, 90, 79,
+  75, 84, 75, 83, 88, 82, 78, 71, 65, 71,
+  75, 77, 98, 76, 78, 86, 68, 78, 87, 80,
+  76, 68, 76, 100, 89, 74, 103, 67, 93, 76,
+  94, 72, 75, 69, 69, 92, 85, 106, 80, 89,
+  82, 84, 77, 78, 74, 89, 85, 78, 81, 89,
+  89, 79, 84, 80, 80, 112, 84, 87, 81, 78,
+  70, 92, 80, 79, 83, 66, 103, 78, 76, 75,
+  75, 80, 83, 91, 77, 95, 90, 62, 78, 84,
+  87, 74, 76, 73, 82, 80, 94, 93, 83, 76,
+  87, 79, 80, 87, 88, 88, 94, 83, 83, 86,
+  89, 81, 88, 84, 79, 89, 94, 75, 86, 83,
+  87, 81, 87, 75, 85, 76, 72, 79, 78, 84,
+  84, 79, 77, 90, 91, 89, 95, 89, 73, 104,
+  71, 76, 96, 88, 70, 80, 82, 81, 97, 85,
+  97, 83, 80, 89, 81, 85, 79, 83, 82, 77,
+  88, 94, 95, 58, 87, 72, 91, 89, 83, 81,
+  85, 89, 69, 90, 85, 104, 76, 77, 79, 77,
+  80, 87, 78, 81, 87, 76, 81, 93, 75, 84,
+  76, 82, 89, 98, 86, 79, 86, 82, 78, 92,
+  76, 94, 73, 87, 99, 87, 88, 87, 85, 80,
+  71, 75, 71, 70, 61, 70, 86, 110, 74, 87,
+  74, 116, 70, 124, 64, 89, 91, 94, 78, 102,
+  78, 78, 87, 90, 69, 74, 88, 91, 92, 61,
+  76, 87, 88, 85, 106, 92, 108, 82, 87, 87,
+  83, 82, 100, 89, 55, 74, 80, 90, 77, 88,
+  97, 79, 82, 76, 83, 82, 101, 73, 95, 95,
+  69, 76, 93, 65, 65, 83, 62, 86, 78, 72,
+  69, 75, 97, 72, 95, 89, 75, 102, 105, 76,
+  81, 84, 83, 102, 85, 69, 82, 88, 86, 83,
+  112, 77, 87, 71, 75, 84, 74, 65, 79, 84,
+  86, 83, 88, 83, 84, 71, 90, 99, 76, 98,
+  91, 78, 83, 107, 76, 88, 82, 86, 85, 81,
+  69, 79, 76, 93, 73, 81, 82, 94, 81, 75,
+  70, 89, 94, 87, 84, 92, 64, 90, 75, 90,
+  85, 146, 70, 74, 95, 90, 83, 101, 77, 84,
+  75, 85, 79, 69, 79, 92, 89, 73, 83, 82,
+  81, 98, 94, 76, 102, 84, 64, 82, 94, 80,
+  93, 99, 64, 90, 75, 109, 81, 77, 78, 81,
+  86, 82, 82, 66, 103, 83, 80, 83, 85, 99,
+  86, 89, 78, 71, 75, 90, 80, 71, 77, 67,
+  93, 81, 88, 82, 80, 72, 104, 79, 83, 68,
+  92, 80, 88, 84, 85, 74, 68, 72, 79, 76,
+  80, 96, 87, 84, 81, 77, 68, 79, 68, 91,
+  78, 78, 73, 88, 93, 95, 72, 87, 80, 123,
+  79, 87, 96, 74, 77, 92, 78, 84, 74, 71,
+  88, 84, 79, 85, 79, 81, 84, 84, 83, 90,
+  86, 77, 79, 89, 76, 78, 80, 77, 97, 98,
+  79, 79, 84, 82, 86, 90, 78, 94, 96, 85,
+  89, 75, 79, 82, 78, 82, 85, 88, 78, 87,
+  88, 84, 95, 80, 90, 90, 93, 79, 85, 80,
+  67, 90, 74, 98, 80, 81, 75, 97, 88, 84,
+  88, 74, 94, 85, 78, 78, 88, 92, 84, 83,
+  86, 83, 86, 86, 83, 84, 82, 81, 97, 85,
+  80, 87, 84, 76, 89, 84, 82, 62, 90, 82,
+  83, 84, 83, 87, 75, 91, 75, 87, 79, 102,
+  80, 74, 83, 79, 71, 85, 73, 86, 81, 76,
+  78, 90, 80, 93, 72, 80, 90, 102, 77, 83,
+  99, 82, 89, 92, 73, 92, 78, 80, 91, 82,
+  87, 95, 79, 85, 83, 73, 89, 107, 80, 78,
+  98, 55, 65, 69, 79, 89, 83, 81, 101, 84,
+  98, 94, 88, 79, 83, 85, 81, 83, 93, 89,
+  81, 72, 97, 92, 87, 91, 76, 90, 85, 76,
+  84, 89, 89, 87, 76, 76, 92, 72, 70, 67,
+  102, 86, 105, 77, 92, 82, 82, 75, 85, 90,
+  82, 81, 79, 78, 87, 91, 77, 78, 80, 71,
+  83, 79, 88, 86, 79, 83, 84, 73, 85, 84,
+  76, 79, 85, 86, 75, 83, 67, 89, 83, 81,
+  85, 93, 84, 95, 71, 77, 89, 104, 70, 109,
+  99, 69, 87, 85, 77, 83, 78, 107, 94, 79,
+  88, 92, 89, 64, 84, 69, 70, 101, 97, 79,
+  103, 95, 81, 81, 91, 79, 78, 100, 79, 84,
+  77, 79, 76, 95, 83, 117, 76, 67, 110, 57,
+  69, 63, 75, 84, 81, 80, 113, 87, 100, 94,
+  86, 83, 93, 79, 73, 89, 90, 93, 80, 69,
+  102, 89, 87, 86, 77, 78, 87, 80, 86, 88,
+  84, 83, 76, 75, 95, 75, 73, 70, 104, 81,
+  116, 73, 97, 70, 93, 77, 81, 89, 72, 81,
+  72, 77, 91, 90, 75, 78, 70, 75, 91, 78,
+  89, 78, 81, 74, 81, 73, 94, 69, 72, 82,
+  88, 83, 80, 90, 68, 75, 78, 81, 90, 95,
+  85, 102, 70, 74, 71, 100, 69, 109, 89, 75,
+  99, 85, 78, 86, 74, 109, 90, 73, 90, 95,
+  92, 62, 88, 67, 76, 85, 83, 81, 83, 86,
+  77, 82, 89, 79, 73, 111, 71, 84, 78, 75,
+  82, 97, 86, 99, 82, 77, 93, 62, 65, 73,
+  81, 94, 82, 90, 100, 88, 98, 90, 93, 91,
+  81, 84, 80, 78, 84, 88, 85, 72, 90, 84,
+  80, 86, 78, 73, 87, 93, 89, 86, 84, 85,
+  77, 73, 80, 77, 76, 69, 97, 75, 97, 81,
+  88, 83, 78, 81, 86, 91, 85, 83, 76, 75,
+  92, 91, 78, 74, 76, 72, 81, 76, 89, 81,
+  102, 84, 87, 74, 88, 88, 78, 88, 88, 87,
+  75, 82, 70, 78, 84, 82, 97, 93, 85, 97,
+  71, 81, 93, 99, 73, 101, 103, 78, 93, 89,
+  77, 84, 72, 106, 89, 84, 83, 88, 86, 67,
+  86, 71, 72, 83, 84, 78, 79, 89, 87, 85,
+  86, 80, 74, 93, 81, 84, 82, 79, 74, 72,
+  79, 106, 83, 83, 98, 65, 69, 69, 79, 84,
+  84, 81, 102, 94, 104, 91, 90, 77, 93, 78,
+  78, 78, 92, 90, 74, 70, 104, 88, 84, 94,
+  76, 94, 73, 83, 88, 89, 93, 86, 81, 76,
+  91, 74, 77, 73, 91, 89, 99, 80, 84, 74,
+  87, 80, 80, 88, 79, 77, 80, 81, 82, 98,
+  78, 79, 70, 72, 90, 79, 88, 71, 85, 76,
+  84, 74, 68, 82, 77, 79, 82, 90, 76, 75,
+  73, 80, 87, 83, 87, 103, 76, 102, 77, 91,
+  93, 102, 69, 109, 98, 68, 76, 87, 71, 82,
+  73, 101, 82, 69, 89, 88, 82, 66, 92, 77,
+  64, 98, 84, 80, 88, 92, 79, 72, 87, 81,
+  73, 102, 79, 88, 80, 79, 71, 82, 77, 115,
+  79, 71, 104, 66, 73, 62, 73, 79, 80, 86,
+  111, 96, 103, 90, 88, 80, 97, 77, 74, 82,
+  82, 92, 71, 66, 106, 82, 80, 81, 78, 81,
+  77, 83, 87, 85, 85, 81, 80, 75, 101, 73,
+  79, 74, 90, 82, 108, 75, 88, 68, 92, 82,
+  76, 83, 74, 76, 75, 79, 89, 102, 78, 80,
+  69, 78, 94, 79, 96, 69, 78, 65, 81, 68,
+  69, 62, 74, 84, 87, 85, 77, 81, 75, 75,
+  79, 82, 86, 108, 77, 107, 74, 83, 78, 95,
+  68, 108, 88, 75, 89, 89, 73, 78, 68, 102,
+  78, 64, 91, 86, 79, 63, 97, 74, 63, 86,
+  77, 81, 78, 83, 71, 76, 88, 80, 60, 111,
+  68, 85, 77, 77, 79, 90, 84, 97, 88, 79,
+  97, 71, 67, 75, 81, 92, 81, 93, 94, 93,
+  100, 91, 93, 90, 85, 83, 87, 74, 76, 86,
+  78, 70, 95, 76, 82, 85, 80, 74, 80, 93,
+  86, 90, 82, 81, 81, 75, 89, 82, 81, 77,
+  82, 75, 95, 82, 81, 80, 77, 82, 83, 84,
+  84, 79, 82, 78, 83, 97, 84, 75, 65, 72,
+  83, 80, 97, 74, 86, 77, 81, 76, 78, 85,
+  82, 91, 85, 83, 73, 75, 78, 80, 86, 82,
+  91, 100, 77, 96, 76, 82, 94, 96, 73, 98,
+  99, 77, 92, 90, 73, 79, 71, 100, 80, 76,
+  87, 85, 85, 68, 93, 80, 71, 85, 86, 81,
+  81, 91, 84, 75, 87, 82, 71, 97, 81, 86,
+  81, 78, 81, 77, 80, 98, 85, 87, 81, 72,
+  68, 79, 80, 90, 82, 84, 96, 94, 98, 78,
+  90, 77, 97, 89, 76, 70, 87, 82, 86, 73,
+  86, 79, 85, 102, 83, 98, 63, 91, 89, 95,
+  93, 85, 87, 80, 94, 80, 88, 78, 83, 86,
+  83, 89, 82, 83, 77, 81, 87, 89, 90, 82,
+  92, 80, 80, 90, 86, 75, 75, 74, 90, 79,
+  84, 77, 91, 82, 85, 86, 64, 85, 90, 82,
+  79, 86, 79, 77, 77, 84, 83, 84, 88, 92,
+  85, 103, 78, 101, 102, 88, 75, 105, 107, 73,
+  75, 90, 73, 84, 76, 99, 88, 80, 90, 84,
+  83, 77, 86, 77, 72, 91, 86, 79, 81, 96,
+  89, 70, 85, 79, 71, 97, 89, 95, 83, 85,
+  79, 76, 80, 99, 82, 71, 81, 71, 71, 77,
+  81, 88, 80, 85, 90, 95, 98, 75, 92, 75,
+  96, 87, 80, 71, 76, 75, 84, 70, 86, 78,
+  88, 93, 85, 86, 66, 85, 93, 91, 88, 80,
+  88, 81, 94, 78, 85, 77, 75, 81, 90, 87,
+  84, 80, 79, 81, 81, 86, 93, 81, 90, 82,
+  79, 100, 90, 82, 68, 77, 86, 80, 86, 76,
+  81, 75, 83, 81, 57, 75, 91, 82, 85, 84,
+  79, 80, 77, 81, 83, 81, 82, 95, 84, 100,
+  75, 95, 101, 80, 71, 102, 104, 76, 84, 90,
+  73, 83, 71, 98, 83, 78, 90, 81, 78, 74,
+  85, 76, 70, 86, 88, 83, 78, 90, 85, 72,
+  85, 82, 64, 100, 88, 90, 78, 86, 88, 83,
+  87, 92, 89, 78, 81, 76, 66, 83, 81, 96,
+  78, 88, 89, 92, 96, 82, 90, 84, 88, 92,
+  87, 69, 76, 78, 89, 73, 77, 71, 88, 95,
+  88, 84, 75, 90, 86, 96, 88, 80, 84, 76,
+  90, 83, 89, 84, 76, 82, 85, 87, 79, 87,
+  71, 80, 87, 81, 94, 82, 92, 81, 78, 89,
+  91, 72, 76, 73, 84, 78, 87, 82, 82, 83,
+  83, 86, 70, 86, 89, 88, 84, 82, 74, 78,
+  81, 92, 82, 85, 85, 89, 82, 93, 78, 89,
+  102, 89, 76, 92, 105, 78, 89, 85, 78, 83,
+  77, 98, 85, 83, 91, 82, 84, 78, 84, 82,
+  78, 91, 89, 81, 89, 97, 88, 70, 88, 83,
+  72, 97, 88, 93, 85, 87, 64, 84, 89, 68,
+  79, 95, 77, 80, 73, 78, 70, 94, 85, 96,
+  78, 77, 86, 91, 67, 74, 83, 87, 90, 78,
+  91, 93, 65, 83, 103, 88, 93, 71, 70, 74,
+  82, 97, 84, 78, 89, 88, 79, 66, 70, 68,
+  80, 93, 87, 86, 69, 77, 91, 75, 96, 75,
+  70, 89, 78, 80, 77, 101, 82, 75, 88, 80,
+  112, 69, 95, 87, 86, 109, 85, 67, 91, 79,
+  85, 101, 77, 78, 103, 78, 79, 90, 69, 93,
+  70, 73, 108, 100, 81, 137, 82, 80, 71, 80,
+  80, 89, 85, 76, 100, 97, 78, 84, 72, 77,
+  87, 72, 78, 81, 100, 72, 77, 78, 65, 73,
+  88, 81, 97, 82, 83, 87, 127, 80, 107, 88,
+  65, 118, 87, 84, 66, 94, 79, 63, 93, 74,
+  85, 76, 64, 67, 66, 93, 86, 87, 86, 79,
+  99, 87, 60, 74, 78, 70, 76, 89, 97, 93,
+  62, 77, 100, 88, 97, 77, 77, 65, 99, 70,
+  82, 67, 85, 91, 76, 69, 84, 61, 93, 97,
+  86, 81, 77, 67, 88, 67, 91, 72, 66, 79,
+  79, 81, 59, 93, 87, 88, 92, 85, 87, 62,
+  94, 93, 93, 95, 81, 66, 88, 70, 92, 94,
+  80, 76, 106, 89, 75, 92, 83, 88, 75, 76,
+  76, 83, 81, 150, 86, 81, 64, 91, 74, 90,
+  93, 77, 90, 113, 63, 76, 63, 81, 79, 68,
+  72, 74, 107, 61, 89, 83, 69, 86, 82, 73,
+  65, 89, 79, 81, 113, 69, 96, 89, 47, 122,
+  93, 87, 69, 98, 90, 73, 74, 84, 73, 73,
+  79, 79, 68, 95, 73, 80, 82, 84, 87, 87,
+  77, 82, 74, 94, 87, 77, 82, 90, 72, 88,
+  104, 74, 89, 85, 82, 72, 88, 71, 87, 76,
+  78, 87, 77, 67, 87, 76, 76, 90, 94, 81,
+  65, 86, 81, 81, 89, 78, 77, 78, 75, 85,
+  82, 91, 82, 79, 90, 84, 117, 68, 86, 81,
+  87, 102, 101, 67, 84, 78, 88, 95, 74, 88,
+  102, 75, 83, 90, 71, 96, 77, 76, 69, 108,
+  85, 129, 78, 92, 79, 75, 93, 85, 88, 76,
+  83, 93, 88, 89, 79, 80, 83, 76, 95, 81,
+  92, 86, 83, 74, 67, 119, 92, 79, 75, 78,
+  80, 91, 93, 83, 101, 87, 75, 102, 83, 90,
+  77, 72, 82, 77, 86, 96, 88, 94, 67, 74,
+  79, 83, 81, 94, 91, 82, 102, 90, 72, 77,
+  85, 90, 92, 87, 89, 95, 71, 83, 90, 87,
+  99, 77, 74, 82, 83, 101, 77, 77, 87, 87,
+  78, 89, 75, 79, 87, 81, 86, 89, 81, 66,
+  94, 70, 96, 68, 74, 88, 81, 77, 71, 93,
+  85, 77, 76, 92, 98, 74, 96, 77, 94, 76,
+  85, 88, 103, 79, 77, 107, 73, 79, 83, 91,
+  82, 86, 79, 82, 83, 97, 108, 80, 82, 115,
+  85, 87, 79, 78, 77, 90, 85, 79, 95, 95,
+  61, 87, 75, 76, 71, 71, 80, 83, 97, 63,
+  82, 84, 67, 61, 76, 69, 89, 91, 83, 78,
+  112, 69, 99, 88, 58, 92, 85, 78, 85, 78,
+  73, 73, 105, 76, 102, 90, 54, 65, 77, 82,
+  93, 91, 97, 83, 124, 78, 69, 79, 79, 80,
+  76, 102, 100, 94, 69, 78, 87, 85, 105, 91,
+  78, 74, 89, 75, 71, 67, 95, 98, 73, 110,
+  80, 72, 98, 90, 86, 87, 89, 55, 91, 69,
+  90, 63, 67, 76, 82, 83, 59, 79, 91, 84,
+  74, 105, 79, 73, 107, 72, 107, 74, 75, 85,
+  104, 74, 76, 93, 76, 84, 74, 107, 77, 89,
+  99, 79, 93, 111, 71, 64, 83, 106, 80, 77,
+  75, 102, 66, 90, 93, 80, 85, 109, 45, 76,
+  71, 78, 57, 74, 69, 75, 96, 51, 88, 89,
+  75, 71, 76, 67, 67, 104, 82, 76, 90, 63,
+  91, 85, 35, 87, 89, 79, 75, 92, 80, 79,
+  83, 89, 86, 82, 74, 73, 76, 80, 74, 80,
+  88, 88, 99, 89, 80, 88, 81, 91, 89, 82,
+  87, 88, 77, 87, 88, 76, 94, 91, 84, 75,
+  85, 79, 71, 81, 82, 85, 79, 83, 90, 83,
+  87, 88, 94, 84, 80, 71, 88, 78, 85, 70,
+  75, 76, 80, 80, 77, 85, 84, 80, 78, 90,
+  102, 75, 92, 76, 86, 80, 87, 79, 97, 81,
+  85, 96, 69, 98, 77, 85, 81, 86, 79, 97,
+  84, 101, 65, 87, 86, 116, 83, 83, 84, 82,
+  85, 87, 84, 77, 85, 86, 76, 80, 76, 78,
+  66, 72, 92, 79, 93, 72, 82, 79, 71, 112,
+  83, 73, 79, 83, 79, 81, 82, 72, 92, 89,
+  64, 85, 87, 82, 79, 75, 87, 80, 72, 97,
+  86, 87, 79, 86, 77, 90, 88, 89, 94, 86,
+  95, 85, 82, 84, 82, 101, 86, 76, 81, 93,
+  83, 91, 90, 91, 87, 78, 81, 86, 79, 104,
+  76, 80, 80, 86, 78, 91, 86, 83, 77, 65,
+  86, 89, 75, 75, 82, 79, 94, 76, 79, 88,
+  78, 87, 85, 83, 87, 71, 81, 83, 118, 74,
+  88, 73, 86, 87, 84, 88, 95, 79, 80, 91,
+  78, 83, 96, 77, 89, 77, 78, 83, 79, 91,
+  105, 87, 88, 99, 80, 94, 90, 75, 77, 89,
+  79, 72, 93, 74, 85, 85, 86, 80, 82, 75,
+  85, 93, 88, 73, 85, 78, 66, 69, 89, 76,
+  93, 82, 82, 90, 97, 73, 95, 84, 70, 78,
+  84, 82, 78, 74, 82, 80, 81, 79, 93, 82,
+  67, 79, 74, 88, 90, 83, 99, 81, 109, 78,
+  78, 82, 88, 94, 80, 79, 87, 91, 81, 84,
+  86, 94, 81, 91, 85, 77, 83, 81, 71, 79,
+  86, 95, 79, 101, 87, 81, 83, 77, 84, 83,
+  81, 65, 77, 78, 95, 74, 76, 81, 78, 92,
+  80, 69, 90, 81, 85, 83, 109, 70, 90, 70,
+  95, 94, 82, 82, 98, 78, 80, 80, 79, 88,
+  93, 85, 88, 72, 87, 89, 83, 103, 80, 77,
+  83, 94, 74, 93, 87, 82, 69, 91, 84, 73,
+  86, 85, 81, 85, 78, 82, 73, 84, 81, 83,
+  79, 70, 85, 85, 67, 76, 88, 74, 79, 88,
+  83, 86, 80, 69, 79, 81, 56, 75, 85, 77,
+  76, 83, 79, 83, 72, 83, 89, 78, 79, 84,
+  77, 85, 80, 82, 97, 85, 92, 80, 85, 88,
+  89, 102, 88, 73, 79, 89, 86, 92, 88, 84,
+  81, 88, 86, 82, 81, 82, 75, 85, 81, 90,
+  80, 89, 86, 84, 82, 76, 85, 82, 76, 76,
+  82, 84, 88, 79, 77, 79, 76, 91, 88, 82,
+  86, 78, 83, 82, 113, 77, 83, 75, 83, 81,
+  93, 85, 93, 83, 85, 87, 75, 102, 84, 78,
+  90, 80, 79, 100, 79, 94, 76, 88, 88, 98,
+  81, 87, 93, 79, 85, 91, 80, 75, 88, 72,
+  89, 86, 87, 83, 76, 75, 91, 87, 85, 74,
+  85, 72, 71, 103, 90, 78, 82, 76, 78, 90,
+  79, 78, 86, 84, 75, 78, 84, 81, 103, 88,
+  84, 81, 75, 92, 80, 81, 90, 81, 72, 73,
+  76, 71, 72, 84, 70, 92, 82, 103, 80, 92,
+  77, 76, 77, 93, 86, 80, 92, 94, 73, 70,
+  84, 82, 82, 79, 87, 97, 105, 83, 76, 57,
+  86, 75, 93, 91, 96, 63, 99, 78, 89, 71,
+  72, 86, 80, 81, 87, 100, 68, 95, 71, 93,
+  104, 80, 77, 108, 88, 82, 89, 78, 85, 71,
+  107, 68, 80, 94, 81, 68, 95, 83, 80, 88,
+  78, 89, 60, 92, 85, 80, 81, 88, 93, 89,
+  81, 89, 103, 64, 80, 81, 86, 92, 97, 76,
+  79, 83, 85, 103, 88, 86, 74, 76, 62, 87,
+  61, 96, 70, 76, 73, 100, 81, 75, 76, 85,
+  80, 75, 74, 87, 73, 71, 138, 83, 85, 77,
+  84, 68, 71, 88, 82, 83, 84, 79, 124, 88,
+  71, 80, 74, 74, 79, 85, 80, 126, 66, 89,
+  82, 79, 74, 84, 85, 85, 92, 74, 80, 91,
+  77, 94, 75, 71, 98, 105, 75, 61, 89, 77,
+  110, 74, 98, 90, 102, 99, 74, 99, 80, 79,
+  80, 70, 56, 98, 80, 74, 89, 62, 96, 116,
+  68, 111, 85, 63, 77, 71, 86, 87, 72, 80,
+  91, 74, 79, 88, 83, 79, 70, 62, 83, 74,
+  47, 86, 81, 99, 76, 77, 71, 76, 75, 91,
+  71, 56, 95, 78, 83, 84, 90, 82, 106, 83,
+  83, 107, 72, 81, 86, 83, 85, 84, 84, 84,
+  70, 78, 79, 95, 89, 73, 77, 105, 74, 108,
+  71, 83, 77, 91, 81, 79, 91, 83, 78, 75,
+  82, 81, 87, 81, 71, 70, 64, 95, 70, 85,
+  76, 89, 83, 104, 93, 91, 92, 79, 82, 95,
+  83, 80, 87, 93, 81, 81, 75, 81, 85, 86,
+  83, 99, 71, 84, 80, 68, 78, 85, 82, 100,
+  87, 77, 101, 78, 82, 69, 73, 86, 79, 76,
+  93, 93, 78, 96, 76, 94, 88, 80, 85, 99,
+  79, 80, 94, 81, 63, 69, 103, 66, 90, 91,
+  81, 71, 98, 75, 84, 92, 84, 84, 72, 86,
+  96, 79, 78, 86, 96, 89, 87, 84, 99, 62,
+  86, 83, 83, 95, 97, 83, 77, 84, 87, 94,
+  85, 81, 77, 72, 82, 92, 68, 88, 82, 77,
+  89, 93, 83, 76, 73, 84, 87, 77, 76, 92,
+  75, 80, 103, 89, 86, 81, 72, 89, 78, 81,
+  89, 78, 67, 76, 48, 91, 74, 83, 73, 88,
+  75, 101, 86, 81, 79, 76, 76, 92, 72, 73,
+  90, 81, 78, 65, 81, 87, 74, 76, 71, 85,
+  71, 73, 74, 53, 89, 75, 103, 98, 85, 70,
+  94, 76, 91, 65, 76, 84, 81, 70, 91, 96,
+  67, 100, 70, 88, 110, 64, 84, 90, 93, 89,
+  85, 83, 65, 59, 105, 74, 80, 101, 81, 63,
+  91, 78, 75, 87, 72, 89, 60, 87, 91, 83,
+  72, 88, 89, 98, 80, 82, 102, 62, 80, 93,
+  72, 88, 90, 79, 75, 82, 85, 94, 99, 83,
+  74, 75, 75, 88, 62, 103, 61, 75, 71, 88,
+  71, 76, 83, 81, 78, 80, 64, 92, 68, 65,
+  168, 86, 96, 99, 87, 71, 69, 95, 91, 83,
+  76, 83, 141, 106, 74, 86, 78, 57, 73, 81,
+  79, 141, 64, 96, 80, 74, 64, 81, 90, 88,
+  99, 86, 93, 96, 80, 93, 73, 93, 130, 100,
+  64, 59, 89, 82, 106, 68, 92, 90, 105, 91,
+  74, 133, 84, 84, 88, 92, 57, 112, 78, 70,
+  65, 61, 93, 124, 66, 132, 73, 57, 84, 50,
+  99, 78, 53, 83, 84, 71, 80, 88, 77, 88,
+  68, 67, 98, 68, 47, 88, 76, 117, 86, 69,
+  69, 65, 75, 86, 68, 55, 108, 86, 92, 87,
+  74, 57, 114, 83, 72, 117, 87, 83, 89, 80,
+  99, 79, 90, 79, 64, 73, 88, 89, 82, 64,
+  73, 93, 74, 123, 65, 72, 66, 94, 80, 71,
+  79, 84, 79, 81, 82, 81, 92, 77, 66, 74,
+  48, 86, 74, 88, 77, 93, 80, 101, 96, 70,
+  92, 79, 79, 98, 78, 72, 85, 83, 72, 83,
+  76, 86, 72, 84, 75, 90, 85, 75, 82, 61,
+  84, 79, 95, 108, 75, 66, 93, 78, 88, 59,
+  75, 84, 82, 73, 95, 90, 78, 103, 80, 95,
+  98, 64, 83, 86, 86, 94, 87, 86, 64, 62,
+  101, 77, 84, 98, 78, 77, 90, 69, 79, 89,
+  79, 89, 69, 88, 98, 77, 66, 92, 85, 104,
+  81, 80, 98, 62, 83, 90, 79, 87, 92, 86,
+  70, 84, 86, 92, 90, 77, 74, 75, 75, 95,
+  64, 95, 62, 78, 94, 85, 78, 80, 68, 81,
+  83, 76, 66, 94, 72, 71, 103, 77, 88, 91,
+  87, 89, 83, 77, 82, 79, 73, 78, 86, 98,
+  71, 76, 74, 95, 90, 90, 94, 108, 78, 78,
+  85, 88, 84, 80, 85, 82, 95, 78, 82, 89,
+  80, 73, 76, 83, 79, 88, 82, 69, 93, 75,
+  81, 87, 86, 77, 91, 78, 93, 79, 74, 90,
+  83, 86, 78, 93, 67, 100, 86, 86, 97, 87,
+  78, 100, 94, 96, 85, 91, 75, 65, 102, 82,
+  82, 97, 90, 70, 93, 81, 76, 92, 79, 92,
+  69, 78, 86, 90, 78, 87, 85, 88, 81, 81,
+  90, 79, 88, 76, 82, 92, 81, 78, 82, 80,
+  89, 71, 107, 88, 89, 72, 97, 87, 76, 97,
+  74, 85, 69, 85, 94, 90, 86, 93, 79, 87,
+  65, 97, 76, 81, 97, 84, 78, 100, 84, 71,
+  75, 88, 75, 75, 82, 90, 90, 74, 83, 78,
+  79, 72, 84, 87, 85, 105, 73, 82, 79, 81,
+  82, 72, 80, 89, 71, 88, 89, 77, 78, 93,
+  74, 86, 85, 86, 77, 64, 85, 72, 86, 81,
+  77, 82, 90, 87, 88, 79, 80, 84, 84, 67,
+  57, 80, 67, 99, 81, 87, 97, 99, 81, 95,
+  83, 96, 78, 77, 83, 73, 91, 82, 85, 75,
+  89, 84, 92, 79, 72, 84, 73, 79, 53, 86,
+  92, 96, 67, 83, 71, 82, 70, 96, 86, 84,
+  90, 89, 77, 85, 79, 70, 89, 84, 77, 88,
+  92, 77, 80, 75, 92, 82, 74, 92, 70, 72,
+  88, 76, 80, 78, 79, 95, 73, 100, 60, 94,
+  72, 83, 88, 79, 82, 88, 87, 78, 88, 74,
+  89, 78, 72, 80, 82, 91, 73, 83, 79, 100,
+  95, 94, 95, 91, 80, 79, 77, 93, 91, 80,
+  80, 83, 85, 90, 83, 76, 77, 84, 80, 84,
+  104, 94, 83, 72, 98, 80, 80, 94, 74, 82,
+  87, 81, 91, 82, 73, 88, 87, 77, 86, 95,
+  77, 99, 86, 83, 89, 78, 78, 97, 79, 97,
+  83, 86, 88, 66, 95, 83, 85, 96, 86, 78,
+  84, 72, 79, 94, 87, 80, 70, 79, 94, 83,
+  77, 86, 82, 106, 80, 80, 89, 74, 88, 80,
+  93, 92, 79, 94, 81, 81, 89, 75, 100, 83,
+  86, 72, 95, 89, 77, 87, 74, 79, 75, 80,
+  92, 91, 72, 90, 81, 86, 66, 90, 81, 79,
+  83, 80, 103, 69, 73, 87, 86, 73, 72, 87,
+  84, 78, 83, 48, 57, 82, 87, 103, 85, 78,
+  77, 74, 95, 84, 81, 106, 83, 88, 92, 88,
+  96, 87, 74, 88, 87, 79, 86, 80, 82, 78,
+  72, 74, 83, 78, 76, 73, 88, 85, 78, 75,
+  72, 86, 65, 73, 87, 83, 102, 74, 74, 98,
+  76, 79, 94, 70, 96, 69, 76, 102, 72, 118,
+  87, 86, 98, 96, 75, 82, 76, 87, 82, 68,
+  81, 79, 91, 118, 80, 84, 89, 85, 73, 85,
+  85, 87, 84, 86, 82, 82, 77, 56, 100, 83,
+  93, 85, 104, 93, 77, 87, 81, 80, 81, 72,
+  81, 92, 77, 86, 121, 71, 119, 88, 104, 76,
+  65, 72, 96, 85, 82, 80, 89, 69, 69, 84,
+  90, 72, 82, 83, 86, 67, 64, 87, 88, 66,
+  87, 69, 57, 77, 86, 116, 94, 91, 86, 58,
+  85, 85, 95, 122, 84, 98, 94, 95, 100, 79,
+  70, 74, 88, 69, 82, 77, 60, 73, 63, 76,
+  86, 83, 74, 62, 90, 78, 81, 69, 68, 82,
+  65, 80, 83, 91, 90, 68, 79, 104, 72, 78,
+  88, 62, 96, 61, 73, 102, 61, 114, 99, 90,
+  90, 81, 88, 80, 69, 75, 84, 82, 78, 78,
+  80, 85, 96, 76, 76, 79, 71, 100, 85, 89,
+  82, 96, 70, 97, 94, 55, 96, 82, 73, 83,
+  108, 97, 90, 92, 74, 80, 90, 70, 87, 96,
+  80, 73, 109, 60, 84, 89, 104, 83, 70, 72,
+  89, 85, 85, 82, 83, 63, 79, 80, 86, 74,
+  78, 92, 84, 75, 76, 91, 89, 81, 83, 82,
+  55, 86, 90, 100, 91, 91, 89, 76, 79, 86,
+  86, 101, 92, 90, 87, 80, 94, 79, 75, 65,
+  96, 108, 95, 82, 52, 74, 71, 74, 80, 82,
+  79, 72, 91, 84, 79, 77, 76, 81, 70, 75,
+  90, 99, 106, 76, 75, 94, 76, 85, 92, 69,
+  97, 68, 92, 105, 67, 97, 109, 89, 104, 89,
+  90, 86, 79, 86, 84, 70, 85, 83, 85, 79,
+  85, 81, 84, 85, 75, 90, 86, 105, 83, 91,
+  89, 84, 81, 59, 80, 87, 94, 90, 99, 93,
+  81, 99, 81, 84, 80, 76, 84, 93, 77, 87,
+  97, 68, 84, 87, 105, 81, 78, 69, 89, 87,
+  81, 82, 89, 71, 76, 78, 97, 83, 70, 96,
+  96, 73, 68, 76, 83, 73, 79, 73, 81, 89,
+  84, 101, 91, 71, 85, 79, 87, 87, 91, 112,
+  83, 91, 97, 90, 102, 80, 71, 103, 80, 69,
+  79, 80, 67, 87, 79, 71, 78, 75, 81, 62,
+  90, 87, 79, 61, 63, 80, 64, 84, 82, 80,
+  91, 95, 72, 108, 92, 78, 79, 89, 108, 74,
+  87, 92, 86, 90, 97, 77, 80, 84, 75, 80,
+  74, 78, 91, 78, 72, 88, 79, 87, 84, 71,
+  99, 80, 73, 78, 85, 83, 80, 91, 79, 81,
+  87, 69, 99, 93, 73, 90, 102, 93, 95, 82,
+  82, 78, 79, 74, 93, 85, 77, 89, 85, 67,
+  99, 90, 104, 86, 84, 76, 99, 80, 94, 77,
+  88, 56, 70, 100, 82, 92, 87, 71, 93, 71,
+  75, 66, 87, 63, 87, 64, 81, 85, 87, 89,
+  97, 57, 88, 63, 75, 100, 120, 136, 79, 100,
+  98, 90, 121, 84, 73, 87, 80, 59, 78, 94,
+  66, 92, 86, 84, 83, 61, 79, 64, 100, 77,
+  87, 60, 60, 71, 69, 104, 74, 71, 73, 94,
+  82, 92, 104, 78, 75, 90, 73, 67, 105, 88,
+  86, 77, 69, 93, 74, 86, 79, 80, 79, 70,
+  86, 98, 68, 91, 84, 53, 90, 81, 75, 73,
+  75, 90, 78, 76, 86, 100, 68, 99, 102, 78,
+  110, 91, 68, 76, 103, 97, 98, 77, 77, 73,
+  75, 76, 93, 77, 81, 68, 66, 72, 63, 98,
+  101, 92, 86, 82, 101, 83, 95, 75, 79, 58,
+  69, 105, 100, 84, 71, 89, 94, 68, 71, 77,
+  85, 75, 82, 68, 76, 93, 89, 98, 91, 84,
+  85, 82, 88, 87, 100, 107, 84, 91, 89, 75,
+  100, 82, 68, 72, 87, 96, 85, 86, 68, 83,
+  81, 74, 81, 83, 86, 57, 95, 80, 78, 65,
+  71, 76, 65, 88, 81, 85, 91, 92, 78, 97,
+  88, 75, 81, 82, 103, 72, 97, 94, 79, 92,
+  102, 82, 82, 84, 92, 80, 79, 82, 94, 79,
+  73, 88, 81, 72, 86, 83, 85, 83, 72, 86,
+  85, 79, 80, 91, 78, 85, 86, 78, 90, 90,
+  74, 84, 92, 93, 88, 87, 84, 78, 81, 75,
+  95, 79, 74, 88, 78, 68, 90, 89, 101, 90,
+  78, 77, 87, 78, 91, 81, 86, 57, 86, 79,
+  92, 83, 69, 88, 82, 76, 74, 83, 86, 86,
+  79, 88, 80, 87, 79, 86, 91, 84, 91, 91,
+  97, 90, 87, 96, 88, 85, 91, 84, 92, 90,
+  77, 110, 76, 90, 82, 78, 59, 84, 84, 74,
+  84, 67, 73, 59, 90, 80, 77, 76, 69, 76,
+  71, 85, 84, 88, 93, 90, 85, 91, 91, 80,
+  89, 84, 110, 79, 90, 76, 90, 85, 107, 87,
+  78, 81, 72, 78, 83, 87, 92, 81, 66, 72,
+  81, 89, 75, 80, 94, 77, 95, 89, 75, 77,
+  90, 101, 89, 83, 70, 75, 92, 85, 92, 90,
+  89, 86, 88, 70, 88, 78, 76, 84, 84, 79,
+  69, 86, 75, 72, 88, 89, 91, 90, 90, 75,
+  93, 81, 90, 87, 92, 82, 83, 80, 90, 93,
+  84, 78, 77, 75, 76, 83, 84, 77, 78, 72,
+  82, 81, 84, 88, 95, 81, 91, 77, 86, 89,
+  99, 94, 82, 92, 85, 87, 95, 93, 74, 98,
+  75, 78, 79, 84, 64, 81, 93, 71, 88, 60,
+  70, 68, 89, 82, 81, 75, 65, 76, 68, 95,
+  80, 81, 83, 84, 86, 76, 99, 86, 92, 73,
+  91, 69, 89, 77, 89, 103, 86, 91, 75, 87,
+  72, 75, 93, 78, 95, 100, 58, 62, 79, 70,
+  75, 87, 79, 86, 89, 98, 72, 87, 99, 101,
+  85, 91, 76, 84, 95, 82, 92, 89, 87, 87,
+  84, 69, 85, 75, 64, 80, 82, 90, 71, 77,
+  80, 76, 78, 91, 88, 97, 91, 79, 87, 75,
+  88, 95, 89, 76, 90, 97, 91, 89, 69, 100,
+  79, 72, 78, 88, 90, 89, 81, 61, 76, 86,
+  83, 84, 91, 87, 84, 94, 83, 92, 94, 87,
+  85, 87, 81, 80, 89, 95, 72, 92, 80, 100,
+  82, 83, 85, 81, 82, 77, 80, 72, 79, 68,
+  89, 84, 81, 79, 69, 89, 66, 83, 82, 77,
+  93, 87, 89, 88, 93, 80, 91, 79, 100, 74,
+  86, 76, 90, 95, 92, 90, 79, 81, 76, 80,
+  89, 81, 91, 86, 64, 71, 82, 76, 74, 85,
+  82, 89, 94, 91, 76, 79, 92, 98, 88, 76,
+  72, 81, 93, 83, 88, 82, 86, 86, 87, 75,
+  84, 77, 75, 84, 86, 77, 67, 90, 85, 78,
+  100, 86, 89, 96, 94, 78, 85, 78, 84, 96,
+  89, 80, 83, 81, 89, 86, 90, 88, 83, 86,
+  76, 87, 88, 82, 86, 82, 78, 91, 100, 88,
+  75, 77, 89, 81, 92, 83, 85, 83, 79, 81,
+  87, 82, 84, 79, 89, 83, 88, 92, 89, 78,
+  68, 76, 78, 113, 78, 88, 96, 95, 79, 88,
+  86, 75, 87, 80, 88, 83, 68, 83, 84, 77,
+  82, 98, 67, 77, 84, 93, 99, 95, 82, 89,
+  94, 84, 87, 92, 87, 78, 83, 88, 84, 91,
+  80, 91, 89, 87, 75, 81, 77, 89, 93, 75,
+  91, 76, 71, 82, 86, 88, 83, 83, 85, 77,
+  85, 82, 82, 93, 85, 76, 93, 84, 86, 88,
+  83, 89, 78, 78, 87, 79, 93, 92, 80, 81,
+  81, 75, 71, 79, 84, 81, 77, 89, 95, 88,
+  96, 80, 85, 81, 102, 96, 92, 86, 66, 84,
+  94, 74, 93, 85, 82, 87, 99, 85, 86, 76,
+  82, 76, 85, 84, 94, 88, 72, 83, 79, 91,
+  76, 80, 87, 82, 97, 78, 96, 60, 78, 79,
+  84, 108, 87, 80, 114, 96, 74, 96, 92, 73,
+  83, 77, 78, 84, 75, 88, 73, 78, 74, 95,
+  60, 78, 84, 91, 93, 94, 80, 91, 93, 77,
+  87, 106, 87, 81, 82, 88, 71, 91, 84, 115,
+  90, 84, 92, 80, 72, 92, 85, 76, 92, 76,
+  69, 85, 73, 96, 80, 90, 90, 77, 82, 97,
+  80, 77, 79, 75, 90, 82, 87, 77, 89, 83,
+  79, 82, 86, 79, 90, 85, 82, 84, 76, 72,
+  79, 71, 86, 82, 75, 94, 91, 98, 84, 83,
+  79, 82, 81, 94, 85, 89, 77, 85, 88, 84,
+  83, 75, 77, 86, 96, 89, 82, 80, 78, 81,
+  84, 80, 90, 80, 79, 81, 80, 81, 83, 89,
+  88, 87, 83, 82, 87, 76, 80, 79, 72, 109,
+  88, 85, 102, 89, 81, 89, 83, 74, 89, 80,
+  80, 82, 71, 89, 91, 82, 78, 96, 71, 82,
+  84, 94, 96, 95, 81, 91, 90, 83, 85, 93,
+  87, 80, 85, 89, 86, 93, 76, 96, 89, 86,
+  77, 86, 80, 97, 80, 75, 94, 75, 69, 81,
+  77, 90, 85, 84, 86, 80, 86, 81, 82, 81,
+  82, 75, 97, 90, 89, 87, 82, 86, 76, 77,
+  88, 90, 84, 97, 88, 77, 82, 73, 75, 82,
+  82, 85, 79, 87, 100, 86, 80, 76, 77, 80,
+  85, 82, 82, 88, 82, 78, 97, 82, 93, 80,
+  77, 85, 107, 90, 83, 79, 93, 73, 85, 78,
+  83, 86, 82, 77, 87, 72, 85, 77, 88, 90,
+  94, 87, 75, 84, 68, 73, 75, 96, 74, 96,
+  93, 92, 68, 92, 98, 77, 82, 82, 81, 82,
+  79, 90, 83, 75, 89, 102, 76, 75, 72, 92,
+  96, 93, 79, 86, 107, 84, 93, 87, 85, 76,
+  78, 90, 75, 86, 73, 86, 87, 79, 76, 76,
+  82, 102, 94, 74, 82, 75, 87, 79, 84, 94,
+  83, 90, 87, 88, 95, 90, 74, 93, 80, 76,
+  88, 90, 75, 88, 83, 84, 72, 75, 86, 80,
+  75, 93, 78, 98, 90, 71, 69, 81, 88, 84,
+  85, 76, 90, 75, 88, 85, 84, 77, 99, 84,
+  89, 87, 70, 74, 109, 81, 104, 77, 75, 99,
+  116, 83, 102, 79, 82, 67, 78, 83, 98, 100,
+  81, 81, 81, 89, 82, 91, 93, 86, 98, 70,
+  89, 88, 76, 76, 69, 85, 80, 86, 108, 93,
+  55, 86, 102, 75, 81, 74, 84, 86, 82, 76,
+  77, 73, 73, 113, 77, 68, 71, 95, 83, 78,
+  84, 84, 107, 77, 75, 95, 95, 70, 71, 97,
+  61, 78, 65, 110, 88, 85, 97, 78, 72, 118,
+  78, 74, 86, 78, 99, 72, 68, 109, 75, 88,
+  96, 89, 73, 100, 67, 71, 72, 76, 83, 85,
+  72, 79, 89, 79, 80, 80, 89, 70, 74, 79,
+  73, 107, 89, 67, 81, 76, 102, 83, 90, 78,
+  92, 85, 77, 83, 106, 80, 77, 86, 83, 87,
+  81, 74, 93, 78, 84, 75, 78, 82, 98, 91,
+  87, 87, 74, 76, 76, 77, 98, 78, 78, 77,
+  82, 86, 85, 100, 86, 85, 84, 76, 81, 92,
+  88, 72, 70, 91, 86, 91, 93, 88, 74, 88,
+  99, 76, 89, 86, 78, 81, 83, 78, 88, 76,
+  84, 94, 80, 83, 70, 90, 91, 90, 83, 83,
+  97, 89, 78, 89, 90, 77, 77, 90, 77, 87,
+  64, 90, 87, 78, 78, 92, 87, 113, 77, 79,
+  86, 69, 87, 77, 79, 91, 79, 89, 86, 90,
+  77, 88, 75, 74, 75, 75, 79, 99, 74, 88,
+  80, 82, 81, 75, 85, 87, 81, 97, 81, 95,
+  90, 72, 70, 84, 85, 86, 88, 80, 93, 78,
+  71, 73, 68, 80, 80, 77, 85, 80, 97, 88,
+  89, 82, 80, 71, 66, 91, 91, 79, 79, 86,
+  83, 86, 75, 64, 75, 79, 85, 89, 86, 72,
+  84, 82, 88, 83, 96, 91, 91, 81, 72, 64,
+  76, 70, 77, 91, 76, 80, 96, 72, 96, 81,
+  75, 75, 79, 81, 85, 83, 87, 83, 110, 91,
+  76, 81, 86, 84, 89, 86, 66, 87, 104, 81,
+  93, 66, 90, 76, 82, 79, 91, 79, 109, 60,
+  87, 66, 72, 79, 89, 105, 94, 78, 91, 69,
+  92, 81, 91, 76, 86, 80, 81, 78, 113, 79,
+  88, 85, 98, 77, 86, 80, 76, 99, 72, 85,
+  69, 83, 70, 81, 85, 101, 72, 86, 89, 89,
+  69, 94, 84, 81, 86, 73, 83, 75, 67, 70,
+  89, 81, 79, 70, 84, 79, 92, 89, 94, 84,
+  78, 77, 69, 94, 88, 79, 90, 87, 74, 76,
+  72, 66, 84, 75, 87, 82, 89, 87, 84, 92,
+  88, 81, 87, 76, 91, 105, 78, 56, 68, 61,
+  69, 80, 69, 77, 97, 65, 106, 77, 74, 74,
+  84, 87, 87, 84, 84, 72, 99, 94, 86, 79,
+  83, 82, 81, 71, 70, 84, 115, 92, 81, 67,
+  100, 71, 83, 82, 95, 66, 104, 55, 87, 71,
+  74, 84, 82, 121, 90, 84, 90, 72, 92, 77,
+  87, 84, 89, 73, 93, 79, 92, 80, 79, 77,
+  95, 78, 79, 103, 72, 88, 72, 83, 73, 88,
+  75, 74, 95, 95, 68, 97, 92, 87, 73, 95,
+  84, 78, 84, 77, 82, 72, 64, 74, 105, 80,
+  77, 69, 85, 79, 94, 85, 86, 78, 79, 77,
+  68, 90, 83, 81, 76, 87, 79, 88, 79, 69,
+  90, 75, 83, 86, 83, 105, 89, 90, 90, 81,
+  82, 81, 92, 85, 82, 67, 76, 71, 79, 88,
+  75, 81, 108, 84, 103, 81, 82, 84, 81, 75,
+  84, 70, 82, 81, 112, 86, 75, 87, 81, 79,
+  84, 88, 69, 83, 95, 86, 70, 68, 92, 80,
+  81, 79, 90, 71, 89, 61, 85, 72, 72, 95,
+  89, 110, 88, 87, 92, 69, 92, 76, 96, 76,
+  81, 82, 78, 77, 82, 76, 90, 75, 95, 78,
+  86, 89, 73, 95, 73, 83, 82, 77, 74, 81,
+  94, 103, 80, 85, 92, 90, 69, 96, 85, 81,
+  90, 82, 83, 76, 86, 86, 81, 65, 85, 76,
+  78, 70, 87, 51, 86, 82, 77, 84, 82, 85,
+  69, 83, 83, 76, 91, 93, 88, 80, 84, 84,
+  84, 70, 81, 80, 86, 75, 85, 74, 88, 76,
+  80, 73, 88, 80, 82, 67, 88, 71, 87, 89,
+  77, 88, 88, 75, 83, 91, 71, 67, 102, 84,
+  79, 69, 97, 94, 85, 68, 120, 79, 81, 76,
+  76, 91, 87, 79, 81, 74, 82, 96, 82, 84,
+  81, 81, 73, 70, 86, 87, 90, 91, 97, 140,
+  77, 96, 88, 79, 88, 98, 92, 83, 81, 83,
+  90, 83, 89, 80, 92, 86, 148, 78, 69, 75,
+  78, 85, 80, 82, 79, 80, 94, 81, 83, 88,
+  95, 74, 91, 89, 81, 84, 74, 73, 87, 53,
+  77, 78, 82, 85, 82, 73, 85, 85, 78, 70,
+  85, 49, 91, 86, 76, 86, 86, 85, 69, 86,
+  75, 81, 91, 92, 74, 77, 85, 85, 84, 77,
+  90, 76, 88, 69, 87, 79, 94, 99, 84, 75,
+  86, 72, 78, 69, 86, 75, 91, 85, 77, 78,
+  85, 72, 88, 87, 73, 66, 100, 88, 77, 66,
+  94, 96, 91, 67, 125, 75, 71, 75, 72, 92,
+  85, 78, 88, 73, 75, 93, 78, 83, 87, 70,
+  81, 69, 88, 85, 85, 86, 99, 130, 82, 97,
+  86, 75, 82, 96, 90, 84, 76, 87, 88, 89,
+  77, 76, 88, 94, 158, 81, 69, 77, 81, 88,
+  79, 77, 78, 79, 94, 68, 85, 87, 82, 70,
+  83, 91, 84, 81, 73, 73, 87, 47, 71, 78,
+  83, 80, 79, 74, 86, 95, 83, 78, 92, 58,
+  83, 82, 84, 78, 83, 85, 76, 83, 85, 78,
+  88, 80, 77, 93, 92, 87, 84, 62, 83, 81,
+  88, 71, 93, 77, 91, 115, 75, 81, 80, 76,
+  79, 71, 79, 77, 94, 96, 93, 83, 99, 82,
+  83, 86, 72, 74, 100, 84, 92, 75, 89, 86,
+  78, 74, 110, 77, 71, 79, 91, 90, 89, 82,
+  76, 72, 86, 83, 78, 82, 79, 67, 83, 75,
+  87, 79, 95, 93, 96, 114, 110, 79, 83, 83,
+  91, 88, 92, 87, 76, 89, 88, 78, 72, 96,
+  88, 89, 113, 75, 85, 77, 68, 89, 81, 87,
+  76, 76, 84, 65, 87, 90, 85, 84, 93, 91,
+  89, 89, 91, 68, 86, 70, 85, 88, 88, 77,
+  94, 65, 93, 74, 70, 75, 77, 29, 105, 88,
+  79, 95, 92, 86, 82, 81, 84, 89, 97, 105,
+  81, 77, 78, 90, 79, 90, 95, 83, 85, 80,
+  70, 79, 89, 60, 92, 79, 88, 81, 85, 75,
+  83, 69, 84, 87, 88, 92, 74, 73, 84, 74,
+  76, 70, 87, 81, 71, 71, 94, 111, 87, 70,
+  100, 82, 82, 67, 73, 85, 80, 76, 90, 76,
+  69, 78, 84, 82, 95, 97, 81, 80, 84, 92,
+  75, 70, 99, 82, 67, 107, 85, 68, 69, 80,
+  86, 86, 86, 82, 83, 97, 98, 70, 74, 80,
+  182, 81, 51, 83, 84, 86, 74, 81, 82, 80,
+  91, 104, 77, 87, 89, 52, 78, 88, 88, 86,
+  68, 85, 87, 63, 62, 82, 81, 82, 87, 75,
+  89, 79, 69, 74, 75, 26, 115, 90, 78, 93,
+  97, 87, 88, 86, 86, 87, 82, 111, 70, 78,
+  81, 92, 80, 97, 109, 87, 85, 65, 71, 82,
+  94, 102, 95, 78, 94, 79, 82, 86, 94, 67,
+  87, 81, 85, 77, 66, 76, 88, 73, 78, 66,
+  79, 80, 70, 67, 98, 110, 93, 68, 98, 79,
+  64, 73, 81, 82, 75, 70, 84, 76, 62, 74,
+  72, 82, 101, 79, 84, 82, 86, 91, 74, 74,
+  99, 66, 77, 99, 82, 65, 66, 79, 81, 83,
+  79, 83, 81, 99, 85, 64, 71, 92, 221, 84,
+  51, 81, 91, 84, 70, 77, 81, 82, 95, 70,
+  79, 84, 82, 45, 69, 89, 77, 76, 67, 83,
+  83, 57, 51, 80, 85, 77, 82, 77, 91, 95,
+  76, 82, 88, 52, 90, 85, 92, 85, 87, 95,
+  82, 81, 76, 76, 80, 75, 80, 95, 96, 87,
+  74, 80, 96, 78, 88, 77, 80, 84, 92, 126,
+  89, 86, 85, 85, 84, 72, 87, 77, 92, 100,
+  96, 80, 92, 77, 89, 89, 73, 71, 97, 83,
+  88, 70, 91, 89, 79, 67, 93, 74, 74, 75,
+  89, 85, 95, 83, 81, 68, 74, 83, 71, 86,
+  78, 69, 90, 80, 87, 90, 85, 95, 90, 79,
+  123, 81, 86, 80, 80, 88, 88, 89, 73, 85,
+  82, 83, 75, 93, 79, 95, 98, 78, 79, 88,
+  73, 89, 76, 82, 80, 81, 84, 62, 86, 88,
+  96, 76, 90, 92, 90, 81, 85, 69, 90, 91,
+  75, 83, 90, 82, 85, 61, 90, 78, 76, 86,
+  69, 50, 83, 89, 77, 93, 83, 78, 73, 80,
+  81, 83, 90, 94, 79, 79, 80, 93, 90, 88,
+  79, 80, 82, 96, 85, 85, 81, 69, 94, 78,
+  82, 83, 87, 79, 87, 71, 87, 93, 97, 95,
+  76, 79, 82, 74, 72, 73, 94, 82, 84, 78,
+  89, 96, 84, 79, 90, 83, 83, 74, 86, 90,
+  92, 86, 91, 79, 83, 72, 85, 86, 89, 86,
+  83, 81, 82, 90, 82, 75, 101, 74, 67, 102,
+  82, 84, 83, 79, 91, 93, 93, 85, 76, 83,
+  93, 81, 85, 88, 116, 77, 70, 88, 74, 88,
+  94, 86, 84, 92, 82, 104, 80, 87, 81, 70,
+  90, 87, 87, 85, 75, 81, 91, 108, 71, 83,
+  92, 83, 88, 69, 91, 80, 78, 84, 70, 48,
+  89, 89, 82, 88, 85, 86, 74, 84, 79, 77,
+  86, 95, 76, 80, 81, 92, 90, 95, 92, 93,
+  80, 85, 84, 82, 81, 89, 89, 80, 92, 80,
+  84, 78, 90, 72, 84, 91, 91, 80, 72, 79,
+  80, 83, 76, 70, 93, 83, 87, 74, 89, 100,
+  86, 75, 85, 81, 77, 77, 93, 86, 92, 90,
+  86, 77, 78, 74, 78, 85, 89, 78, 85, 81,
+  83, 92, 80, 81, 97, 72, 74, 95, 81, 80,
+  77, 74, 94, 95, 85, 86, 75, 81, 93, 78,
+  82, 77, 118, 79, 77, 88, 74, 87, 88, 88,
+  84, 87, 80, 76, 86, 86, 88, 66, 87, 88,
+  84, 82, 72, 76, 87, 121, 70, 83, 83, 76,
+  80, 69, 85, 94, 78, 86, 85, 66, 75, 81,
+  90, 86, 87, 84, 79, 76, 81, 74, 84, 78,
+  83, 94, 86, 93, 80, 79, 82, 78, 85, 89,
+  87, 84, 88, 119, 87, 84, 89, 88, 88, 77,
+  90, 81, 92, 93, 97, 81, 90, 83, 85, 88,
+  69, 77, 91, 81, 96, 78, 86, 81, 80, 73,
+  85, 70, 72, 84, 97, 88, 97, 90, 80, 73,
+  82, 81, 74, 90, 90, 69, 85, 82, 83, 84,
+  79, 86, 88, 72, 106, 83, 83, 90, 88, 81,
+  90, 92, 84, 83, 78, 78, 84, 88, 83, 88,
+  99, 75, 79, 87, 67, 90, 90, 85, 85, 86,
+  82, 71, 91, 96, 86, 80, 91, 85, 95, 83,
+  92, 78, 90, 110, 84, 84, 88, 77, 93, 84,
+  86, 92, 70, 96, 77, 88, 93, 86, 88, 83,
+  75, 68, 77, 85, 76, 103, 76, 80, 93, 75,
+  67, 73, 64, 85, 83, 94, 84, 81, 84, 79,
+  83, 90, 70, 79, 91, 73, 73, 78, 70, 82,
+  82, 80, 85, 86, 74, 71, 92, 95, 86, 79,
+  70, 93, 91, 77, 95, 91, 76, 91, 84, 83,
+  91, 67, 83, 85, 84, 67, 85, 87, 83, 85,
+  75, 76, 83, 89, 82, 54, 70, 115, 76, 92,
+  81, 92, 75, 97, 121, 76, 79, 100, 85, 77,
+  95, 85, 84, 90, 89, 72, 89, 77, 89, 81,
+  82, 76, 77, 91, 90, 70, 77, 82, 71, 91,
+  85, 109, 95, 87, 66, 72, 92, 96, 73, 79,
+  87, 89, 85, 86, 79, 85, 97, 81, 93, 87,
+  72, 98, 82, 88, 93, 86, 87, 91, 82, 68,
+  75, 82, 75, 102, 72, 80, 86, 83, 71, 76,
+  67, 85, 90, 89, 81, 80, 79, 80, 80, 84,
+  72, 81, 89, 73, 77, 83, 72, 91, 87, 75,
+  89, 77, 68, 72, 91, 104, 89, 84, 72, 100,
+  88, 80, 99, 89, 75, 89, 87, 90, 92, 76,
+  81, 74, 75, 61, 85, 83, 80, 84, 78, 74,
+  84, 77, 88, 59, 72, 115, 79, 90, 79, 87,
+  80, 91, 130, 87, 77, 95, 81, 75, 89, 85,
+  82, 94, 86, 76, 86, 83, 92, 82, 79, 78,
+  76, 98, 98, 72, 85, 80, 69, 79, 86, 96,
+  75, 84, 64, 76, 79, 90, 75, 78, 88, 87,
+  85, 88, 83, 82, 85, 83, 87, 97, 75, 93,
+  78, 86, 81, 86, 88, 93, 77, 71, 78, 88,
+  78, 97, 72, 80, 90, 77, 77, 83, 69, 86,
+  85, 87, 93, 89, 86, 81, 88, 96, 88, 76,
+  78, 78, 71, 79, 77, 70, 77, 83, 83, 95,
+  81, 75, 87, 84, 86, 79, 81, 77, 90, 76,
+  87, 89, 81, 95, 76, 75, 84, 64, 90, 87,
+  83, 75, 90, 92, 85, 81, 80, 76, 83, 82,
+  88, 61, 72, 106, 80, 95, 83, 83, 92, 89,
+  100, 86, 80, 100, 92, 80, 93, 83, 87, 90,
+  81, 80, 86, 97, 85, 84, 81, 82, 69, 87,
+  95, 73, 81, 91, 76, 80, 82, 95, 80, 89,
+  72, 73, 74, 94, 73, 80, 83, 91, 87, 86,
+  74, 81, 96, 75, 83, 90, 57, 87, 67, 82,
+  89, 95, 83, 106, 87, 71, 77, 64, 71, 105,
+  79, 77, 85, 86, 68, 67, 61, 79, 91, 89,
+  82, 82, 75, 87, 89, 86, 80, 83, 82, 75,
+  86, 61, 69, 90, 75, 86, 80, 94, 65, 70,
+  99, 103, 85, 91, 65, 97, 77, 95, 104, 79,
+  76, 74, 89, 82, 83, 58, 87, 72, 77, 52,
+  82, 86, 70, 76, 77, 74, 80, 87, 81, 76,
+  71, 151, 79, 70, 84, 89, 77, 97, 151, 68,
+  66, 84, 89, 72, 98, 85, 89, 84, 75, 69,
+  74, 77, 88, 81, 90, 81, 74, 85, 85, 66,
+  89, 71, 66, 85, 96, 113, 77, 85, 59, 83,
+  91, 104, 79, 68, 96, 83, 82, 89, 73, 89,
+  93, 72, 88, 81, 62, 91, 75, 83, 90, 91,
+  87, 102, 93, 74, 77, 68, 72, 106, 71, 79,
+  80, 91, 71, 69, 69, 81, 94, 78, 75, 74,
+  74, 85, 76, 82, 75, 82, 99, 76, 83, 67,
+  77, 97, 74, 78, 79, 80, 61, 69, 95, 104,
+  90, 95, 64, 123, 78, 95, 99, 73, 72, 73,
+  83, 85, 76, 66, 91, 65, 75, 58, 93, 79,
+  73, 78, 77, 67, 81, 80, 87, 81, 72, 150,
+  83, 73, 84, 84, 78, 91, 155, 68, 69, 78,
+  82, 69, 84, 84, 87, 83, 74, 75, 72, 78,
+  92, 82, 86, 82, 74, 86, 95, 66, 94, 71,
+  68, 73, 94, 99, 74, 82, 56, 86, 76, 96,
+  81, 67, 97, 81, 78, 93, 75, 90, 78, 80,
+  78, 99, 67, 88, 72, 83, 85, 94, 83, 85,
+  85, 75, 77, 74, 71, 102, 71, 71, 89, 85,
+  81, 78, 70, 81, 87, 88, 86, 87, 81, 90,
+  90, 95, 96, 79, 84, 73, 89, 65, 81, 73,
+  75, 86, 76, 100, 74, 75, 92, 79, 85, 87,
+  79, 95, 82, 89, 96, 77, 83, 84, 82, 74,
+  77, 60, 95, 78, 80, 78, 82, 94, 79, 75,
+  80, 70, 87, 89, 88, 83, 73, 127, 80, 88,
+  88, 87, 89, 88, 107, 79, 70, 75, 94, 82,
+  88, 86, 88, 86, 75, 74, 73, 91, 83, 86,
+  85, 80, 73, 79, 86, 69, 87, 78, 74, 78,
+  87, 102, 85, 84, 68, 85, 72, 99, 74, 72,
+  89, 85, 81, 90, 90, 81, 85, 85, 85, 88,
+  74, 87, 88, 85, 87, 81, 85, 87, 77, 73,
+  86, 85, 76, 85, 87, 78, 75, 91, 76, 72,
+  84, 84, 83, 87, 82, 82, 85, 91, 86, 83,
+  83, 97, 69, 77, 97, 76, 79, 73, 82, 98,
+  84, 94, 80, 70, 88, 79, 98, 85, 91, 77,
+  105, 87, 80, 81, 88, 95, 95, 90, 82, 73,
+  94, 90, 88, 75, 86, 86, 88, 77, 84, 88,
+  76, 80, 78, 62, 76, 79, 91, 70, 76, 85,
+  77, 76, 99, 89, 87, 90, 95, 86, 106, 79,
+  88, 86, 83, 83, 81, 88, 94, 84, 86, 90,
+  73, 75, 92, 82, 73, 92, 79, 89, 87, 96,
+  92, 92, 81, 87, 87, 84, 74, 82, 81, 92,
+  89, 79, 93, 89, 78, 81, 82, 80, 69, 87,
+  93, 85, 90, 78, 85, 78, 81, 74, 87, 87,
+  79, 92, 82, 79, 75, 94, 83, 73, 86, 86,
+  78, 81, 73, 84, 83, 91, 78, 81, 84, 95,
+  79, 71, 91, 74, 79, 74, 83, 93, 83, 88,
+  78, 71, 85, 74, 102, 85, 89, 85, 109, 83,
+  83, 81, 88, 99, 94, 92, 76, 76, 99, 95,
+  86, 79, 80, 82, 92, 76, 86, 82, 79, 77,
+  76, 66, 77, 74, 92, 79, 79, 82, 79, 69,
+  86, 90, 87, 80, 91, 87, 95, 79, 87, 88,
+  80, 89, 82, 91, 97, 85, 83, 93, 77, 71,
+  98, 82, 71, 91, 80, 83, 87, 94, 87, 90,
+  79, 83, 79, 82, 76, 82, 83, 93, 89, 84,
+  90, 87, 81, 81, 88, 87, 78, 82, 88, 87,
+  87, 86, 91, 72, 73, 79, 86, 90, 80, 86,
+  81, 79, 87, 86, 85, 75, 82, 85, 83, 90,
+  83, 83, 86, 94, 88, 86, 95, 91, 79, 82,
+  97, 71, 84, 72, 79, 93, 83, 91, 85, 76,
+  85, 78, 93, 85, 93, 78, 92, 84, 79, 74,
+  89, 97, 89, 82, 81, 74, 93, 89, 85, 92,
+  78, 88, 88, 79, 82, 77, 79, 92, 85, 65,
+  86, 80, 90, 86, 77, 87, 84, 80, 84, 83,
+  86, 70, 100, 86, 88, 79, 86, 84, 78, 79,
+  84, 83, 90, 87, 85, 81, 81, 74, 90, 80,
+  74, 96, 83, 80, 90, 85, 97, 94, 83, 88,
+  76, 84, 71, 80, 85, 91, 90, 80, 85, 87,
+  85, 78, 79, 91, 80, 97, 82, 58, 90, 94,
+  78, 86, 68, 85, 74, 87, 88, 85, 92, 88,
+  78, 79, 88, 79, 84, 67, 78, 73, 94, 85,
+  84, 87, 77, 91, 83, 75, 94, 73, 90, 59,
+  82, 96, 84, 90, 84, 88, 78, 89, 80, 83,
+  78, 91, 89, 86, 85, 87, 97, 89, 94, 80,
+  81, 86, 77, 83, 86, 95, 81, 77, 92, 83,
+  92, 87, 90, 81, 85, 89, 62, 75, 85, 85,
+  95, 86, 81, 107, 95, 86, 76, 90, 98, 95,
+  107, 89, 84, 96, 98, 81, 91, 96, 92, 79,
+  84, 88, 103, 78, 75, 85, 76, 82, 89, 90,
+  96, 65, 87, 83, 84, 83, 76, 83, 76, 75,
+  78, 92, 85, 61, 86, 83, 88, 91, 80, 77,
+  82, 83, 76, 103, 84, 84, 83, 89, 73, 88,
+  75, 82, 77, 78, 83, 83, 78, 91, 72, 71,
+  91, 91, 87, 73, 86, 81, 93, 80, 83, 89,
+  85, 86, 82, 75, 83, 78, 74, 56, 83, 93,
+  85, 76, 87, 84, 84, 96, 81, 83, 87, 82,
+  85, 88, 95, 86, 89, 90, 94, 81, 81, 76,
+  74, 88, 77, 91, 76, 84, 80, 86, 87, 78,
+  81, 81, 85, 80, 71, 86, 85, 89, 89, 83,
+  80, 102, 95, 85, 83, 88, 102, 83, 94, 89,
+  76, 90, 93, 81, 76, 80, 85, 71, 84, 86,
+  85, 72, 81, 88, 62, 80, 86, 83, 79, 62,
+  88, 90, 96, 84, 81, 85, 86, 83, 71, 96,
+  80, 63, 80, 83, 102, 84, 87, 82, 85, 78,
+  77, 107, 88, 101, 77, 84, 89, 88, 87, 79,
+  89, 71, 83, 82, 88, 82, 81, 67, 101, 96,
+  91, 83, 75, 91, 90, 69, 87, 82, 85, 90,
+  92, 71, 87, 81, 80, 71, 83, 93, 91, 76,
+  95, 80, 95, 92, 73, 83, 84, 80, 85, 88,
+  98, 82, 85, 89, 87, 86, 83, 79, 90, 92,
+  85, 92, 80, 94, 89, 79, 88, 86, 83, 64,
+  79, 87, 79, 78, 84, 84, 96, 79, 90, 87,
+  124, 80, 84, 90, 94, 81, 78, 89, 81, 85,
+  95, 79, 92, 75, 96, 79, 100, 83, 65, 84,
+  84, 96, 81, 77, 93, 83, 68, 53, 88, 96,
+  87, 80, 105, 92, 98, 84, 65, 103, 74, 77,
+  75, 85, 83, 94, 91, 80, 78, 86, 83, 71,
+  85, 41, 69, 87, 80, 95, 77, 89, 71, 92,
+  66, 92, 86, 95, 78, 94, 79, 70, 93, 83,
+  101, 75, 70, 96, 77, 76, 70, 91, 94, 124,
+  98, 72, 86, 76, 89, 85, 88, 86, 84, 94,
+  79, 74, 84, 80, 75, 84, 80, 87, 63, 80,
+  85, 71, 78, 79, 90, 83, 70, 92, 75, 73,
+  77, 84, 86, 74, 83, 84, 88, 64, 94, 93,
+  66, 79, 84, 84, 62, 71, 67, 69, 97, 87,
+  79, 78, 62, 89, 95, 97, 75, 89, 91, 85,
+  93, 85, 70, 85, 80, 90, 148, 85, 83, 79,
+  88, 82, 92, 92, 90, 78, 81, 80, 67, 106,
+  63, 80, 76, 73, 77, 60, 93, 77, 73, 91,
+  80, 85, 78, 76, 76, 96, 72, 74, 77, 72,
+  67, 84, 69, 92, 75, 88, 76, 83, 80, 90,
+  72, 97, 65, 78, 91, 75, 86, 75, 110, 77,
+  81, 103, 70, 88, 77, 86, 85, 95, 83, 79,
+  83, 75, 81, 92, 80, 81, 81, 90, 87, 82,
+  82, 84, 84, 75, 83, 82, 82, 73, 89, 76,
+  85, 82, 87, 55, 59, 85, 63, 87, 79, 91,
+  68, 81, 86, 86, 78, 85, 96, 87, 65, 86,
+  86, 84, 64, 77, 70, 66, 124, 92, 72, 82,
+  85, 93, 94, 102, 94, 90, 90, 79, 68, 75,
+  74, 81, 84, 86, 118, 78, 93, 85, 65, 71,
+  86, 90, 84, 60, 73, 86, 95, 99, 63, 84,
+  73, 78, 62, 76, 83, 68, 80, 79, 104, 76,
+  80, 76, 87, 64, 78, 100, 81, 95, 79, 84,
+  92, 91, 84, 84, 91, 63, 93, 83, 84, 79,
+  74, 66, 102, 101, 85, 74, 92, 81, 94, 79,
+  87, 90, 80, 88, 95, 59, 83, 91, 88, 76,
+  75, 97, 82, 77, 93, 88, 94, 89, 79, 86,
+  91, 79, 88, 86, 95, 79, 93, 93, 82, 80,
+  83, 55, 69, 85, 75, 96, 91, 86, 74, 80,
+  83, 88, 78, 70, 77, 80, 67, 84, 92, 95,
+  104, 75, 94, 75, 165, 78, 79, 86, 106, 88,
+  86, 89, 79, 87, 88, 75, 86, 78, 87, 86,
+  80, 82, 49, 79, 94, 96, 76, 81, 93, 76,
+  70, 51, 78, 98, 80, 75, 95, 90, 93, 81,
+  78, 106, 81, 85, 71, 82, 84, 96, 89, 92,
+  82, 83, 72, 65, 87, 40, 75, 82, 78, 102,
+  75, 88, 73, 78, 75, 93, 86, 88, 86, 93,
+  86, 74, 102, 88, 84, 81, 80, 87, 87, 78,
+  67, 93, 83, 135, 80, 72, 89, 85, 82, 81,
+  75, 89, 84, 91, 73, 80, 81, 89, 73, 89,
+  77, 90, 70, 81, 75, 83, 62, 83, 101, 90,
+  79, 91, 74, 80, 87, 79, 78, 83, 93, 79,
+  93, 75, 89, 88, 87, 80, 87, 81, 72, 77,
+  78, 70, 109, 84, 80, 70, 64, 81, 90, 103,
+  65, 68, 91, 79, 97, 90, 75, 88, 68, 89,
+  110, 90, 88, 78, 77, 96, 86, 96, 80, 94,
+  81, 98, 82, 98, 90, 91, 81, 84, 95, 64,
+  97, 102, 82, 85, 81, 93, 76, 86, 77, 87,
+  70, 70, 87, 68, 72, 91, 74, 83, 74, 89,
+  79, 75, 85, 86, 81, 87, 76, 80, 100, 73,
+  98, 88, 98, 77, 81, 102, 80, 89, 72, 85,
+  84, 109, 91, 77, 84, 76, 78, 88, 73, 85,
+  84, 83, 86, 80, 83, 93, 81, 81, 78, 79,
+  85, 74, 86, 76, 68, 78, 96, 68, 69, 88,
+  66, 86, 87, 86, 75, 79, 90, 88, 87, 89,
+  88, 91, 75, 86, 87, 83, 74, 79, 75, 69,
+  115, 83, 74, 77, 87, 84, 90, 100, 83, 70,
+  99, 76, 75, 82, 80, 86, 81, 84, 107, 85,
+  92, 85, 77, 81, 83, 90, 79, 68, 83, 92,
+  92, 86, 80, 91, 79, 79, 75, 76, 89, 94,
+  85, 80, 97, 75, 81, 79, 87, 69, 73, 91,
+  82, 94, 81, 85, 87, 95, 83, 88, 87, 60,
+  84, 84, 90, 82, 80, 69, 102, 92, 89, 78,
+  81, 77, 95, 87, 91, 97, 80, 91, 91, 66,
+  86, 88, 91, 74, 74, 97, 76, 84, 88, 93,
+  91, 90, 77, 91, 84, 81, 86, 80, 90, 81,
+  96, 91, 75, 78, 88, 61, 84, 89, 74, 99,
+  93, 91, 71, 84, 81, 88, 80, 73, 84, 79,
+  68, 78, 87, 89, 98, 76, 92, 73, 144, 72,
+  78, 87, 104, 84, 89, 89, 78, 76, 100, 76,
+  86, 79, 86, 92, 93, 85, 71, 87, 87, 89,
+  85, 78, 93, 82, 80, 59, 86, 98, 78, 74,
+  102, 86, 94, 82, 67, 115, 79, 90, 78, 82,
+  71, 99, 86, 93, 100, 83, 89, 90, 89, 86,
+  71, 64, 58, 89, 87, 91, 85, 105, 97, 112,
+  82, 67, 102, 94, 73, 97, 92, 91, 80, 75,
+  90, 88, 93, 76, 95, 86, 93, 92, 58, 81,
+  89, 74, 88, 97, 74, 104, 82, 73, 86, 81,
+  89, 87, 65, 91, 93, 89, 84, 113, 82, 82,
+  76, 86, 74, 66, 111, 73, 69, 72, 82, 90,
+  87, 65, 94, 77, 98, 84, 83, 80, 91, 85,
+  97, 93, 85, 96, 86, 84, 95, 71, 92, 88,
+  78, 90, 83, 95, 91, 88, 97, 80, 84, 99,
+  80, 88, 75, 83, 99, 84, 90, 74, 85, 78,
+  82, 83, 91, 99, 89, 79, 70, 79, 90, 76,
+  67, 86, 89, 97, 84, 83, 84, 85, 100, 91,
+  79, 76, 74, 69, 78, 84, 75, 80, 80, 86,
+  83, 70, 73, 71, 76, 79, 74, 84, 84, 102,
+  79, 77, 75, 69, 88, 78, 95, 80, 83, 68,
+  93, 91, 82, 84, 80, 84, 89, 81, 83, 78,
+  93, 83, 73, 86, 85, 86, 72, 83, 89, 78,
+  83, 81, 77, 91, 71, 91, 59, 87, 88, 108,
+  75, 114, 71, 73, 68, 84, 66, 73, 98, 105,
+  76, 78, 76, 73, 78, 72, 82, 81, 79, 77,
+  76, 89, 82, 86, 86, 89, 78, 86, 85, 82,
+  85, 88, 82, 89, 77, 75, 91, 84, 82, 92,
+  89, 86, 77, 90, 80, 87, 77, 76, 89, 85,
+  77, 81, 62, 90, 60, 94, 98, 83, 76, 90,
+  78, 71, 80, 86, 84, 74, 112, 86, 90, 81,
+  74, 66, 83, 85, 71, 83, 84, 91, 74, 83,
+  75, 71, 82, 77, 86, 81, 88, 103, 76, 83,
+  87, 72, 87, 79, 93, 95, 95, 97, 87, 83,
+  86, 106, 79, 94, 73, 90, 93, 77, 93, 81,
+  73, 85, 96, 82, 76, 82, 82, 74, 83, 74,
+  75, 87, 78, 86, 69, 72, 82, 107, 76, 118,
+  81, 67, 80, 95, 65, 80, 73, 103, 79, 80,
+  85, 74, 76, 100, 96, 74, 76, 75, 90, 79,
+  84, 99, 78, 95, 82, 87, 75, 79, 86, 88,
+  86, 89, 79, 83, 95, 81, 81, 81, 93, 86,
+  74, 87, 66, 82, 80, 74, 102, 96, 79, 85,
+  85, 97, 91, 91, 96, 79, 73, 88, 74, 73,
+  79, 95, 86, 78, 67, 110, 87, 96, 92, 76,
+  84, 87, 90, 87, 75, 72, 60, 78, 85, 94,
+  84, 104, 107, 124, 80, 63, 96, 95, 85, 100,
+  91, 94, 77, 73, 92, 87, 85, 66, 78, 78,
+  91, 89, 70, 79, 83, 76, 81, 91, 72, 104,
+  87, 74, 90, 80, 91, 88, 72, 82, 94, 78,
+  97, 98, 92, 88, 80, 72, 84, 48, 94, 62,
+  74, 83, 73, 102, 75, 64, 92, 80, 98, 93,
+  72, 71, 85, 85, 88, 101, 89, 97, 81, 79,
+  91, 67, 109, 93, 85, 90, 79, 96, 85, 79,
+  97, 71, 85, 93, 76, 82, 80, 86, 98, 83,
+  102, 81, 99, 83, 82, 75, 102, 100, 80, 79,
+  82, 73, 84, 91, 71, 78, 89, 109, 81, 76,
+  83, 91, 97, 91, 86, 70, 81, 62, 65, 75,
+  76, 85, 88, 91, 85, 86, 73, 71, 83, 63,
+  69, 76, 78, 119, 61, 69, 71, 65, 62, 78,
+  112, 79, 88, 65, 90, 97, 69, 80, 84, 78,
+  68, 92, 67, 74, 96, 86, 75, 70, 83, 104,
+  70, 85, 76, 96, 76, 84, 74, 63, 83, 76,
+  70, 73, 79, 121, 82, 115, 42, 97, 70, 74,
+  79, 65, 78, 78, 72, 84, 70, 69, 69, 60,
+  87, 81, 68, 71, 71, 91, 90, 79, 77, 104,
+  65, 80, 79, 76, 77, 75, 76, 93, 75, 70,
+  78, 84, 76, 77, 94, 88, 78, 81, 88, 91,
+  71, 77, 94, 82, 68, 72, 74, 73, 63, 88,
+  89, 88, 73, 87, 71, 61, 83, 76, 83, 77,
+  103, 84, 87, 81, 78, 54, 79, 78, 75, 88,
+  90, 86, 86, 73, 80, 74, 91, 64, 76, 81,
+  93, 103, 55, 78, 77, 73, 65, 84, 109, 101,
+  94, 92, 86, 78, 77, 108, 84, 93, 96, 95,
+  78, 68, 83, 84, 77, 74, 93, 82, 74, 88,
+  75, 83, 82, 72, 72, 77, 88, 84, 76, 69,
+  72, 113, 80, 133, 61, 99, 78, 87, 79, 65,
+  82, 73, 74, 97, 88, 69, 69, 118, 99, 69,
+  67, 72, 84, 73, 81, 96, 58, 106, 73, 82,
+  80, 87, 85, 76, 87, 97, 73, 75, 95, 87,
+  73, 71, 96, 85, 74, 78, 81, 83, 69, 79,
+  93, 95, 76, 67, 76, 80, 103, 85, 89, 85,
+  75, 82, 76, 68, 79, 90, 86, 80, 77, 106,
+  102, 89, 92, 82, 88, 78, 87, 88, 82, 72,
+  63, 84, 88, 96, 87, 103, 94, 111, 79, 71,
+  96, 95, 91, 94, 88, 84, 73, 79, 90, 85,
+  87, 65, 89, 70, 98, 88, 85, 89, 77, 94,
+  91, 89, 80, 96, 81, 83, 83, 74, 91, 92,
+  77, 87, 98, 90, 82, 95, 89, 77, 82, 75,
+  80, 63, 89, 78, 86, 77, 79, 110, 79, 68,
+  85, 87, 96, 85, 87, 81, 78, 83, 89, 95,
+  95, 104, 90, 77, 87, 70, 97, 89, 86, 94,
+  79, 84, 83, 79, 96, 79, 87, 88, 80, 91,
+  82, 92, 89, 87, 99, 83, 101, 82, 97, 77,
+  94, 97, 80, 90, 81, 76, 94, 89, 70, 82,
+  82, 94, 80, 84, 86, 86, 95, 81, 96, 80,
+  83, 69, 77, 76, 67, 85, 92, 86, 84, 91,
+  73, 75, 85, 65, 72, 78, 82, 116, 60, 80,
+  73, 67, 78, 76, 91, 74, 103, 69, 88, 94,
+  86, 65, 98, 80, 59, 84, 81, 87, 92, 80,
+  77, 60, 81, 93, 78, 84, 78, 98, 77, 74,
+  82, 74, 77, 77, 72, 81, 85, 111, 83, 129,
+  52, 83, 76, 87, 92, 76, 76, 82, 78, 87,
+  76, 71, 83, 72, 97, 74, 72, 85, 79, 94,
+  94, 86, 77, 99, 82, 78, 77, 79, 85, 81,
+  75, 87, 77, 76, 85, 87, 76, 70, 91, 90,
+  84, 81, 86, 88, 78, 78, 97, 88, 72, 77,
+  99, 79, 47, 89, 97, 86, 76, 84, 73, 63,
+  85, 87, 84, 84, 95, 89, 97, 92, 76, 70,
+  85, 76, 70, 87, 91, 90, 84, 62, 78, 79,
+  92, 79, 84, 91, 100, 98, 73, 88, 78, 76,
+  86, 86, 89, 103, 89, 86, 87, 72, 74, 89,
+  91, 92, 94, 89, 91, 82, 74, 81, 80, 77,
+  88, 82, 72, 85, 85, 90, 82, 67, 93, 79,
+  80, 84, 77, 82, 85, 91, 77, 121, 71, 85,
+  82, 96, 89, 81, 84, 86, 83, 97, 90, 72,
+  85, 102, 85, 67, 72, 87, 83, 88, 86, 100,
+  70, 88, 85, 82, 79, 102, 86, 80, 86, 89,
+  80, 72, 101, 86, 70, 84, 94, 88, 87, 86,
+  87, 86, 71, 82, 85, 94, 83, 76, 79, 85,
+  88, 78, 94, 84, 77, 84, 76, 71, 83, 100,
+  87, 88, 92, 86, 110, 77, 79, 92, 76, 83,
+  65, 93, 97, 103, 80, 97, 73, 98, 81, 73,
+  92, 105, 105, 90, 78, 87, 71, 79, 95, 87,
+  90, 79, 114, 77, 79, 71, 79, 95, 87, 81,
+  98, 77, 86, 80, 74, 95, 95, 95, 81, 67,
+  72, 82, 81, 73, 79, 80, 88, 86, 82, 79,
+  93, 84, 78, 71, 75, 76, 67, 81, 81, 91,
+  88, 72, 89, 84, 67, 98, 85, 79, 88, 89,
+  82, 76, 88, 79, 89, 86, 74, 96, 86, 80,
+  74, 98, 88, 90, 87, 80, 75, 83, 74, 79,
+  91, 90, 83, 89, 81, 72, 81, 89, 81, 76,
+  67, 75, 74, 94, 81, 85, 84, 90, 62, 73,
+  87, 74, 88, 77, 65, 98, 80, 93, 96, 87,
+  112, 73, 91, 75, 90, 97, 66, 74, 55, 85,
+  91, 112, 86, 99, 62, 99, 88, 88, 103, 97,
+  77, 95, 99, 73, 87, 67, 86, 83, 95, 72,
+  144, 98, 77, 84, 86, 73, 89, 83, 106, 76,
+  93, 76, 98, 116, 105, 114, 76, 69, 69, 73,
+  91, 64, 66, 81, 78, 91, 99, 78, 84, 76,
+  92, 59, 83, 83, 62, 75, 73, 100, 87, 64,
+  89, 77, 42, 108, 78, 81, 106, 74, 73, 71,
+  89, 83, 81, 77, 69, 88, 88, 70, 71, 91,
+  77, 104, 85, 78, 73, 81, 87, 87, 78, 60,
+  79, 71, 73, 67, 71, 89, 73, 69, 66, 80,
+  83, 112, 77, 83, 82, 88, 76, 66, 81, 64,
+  85, 90, 52, 88, 71, 93, 122, 79, 85, 73,
+  71, 84, 79, 65, 87, 83, 73, 94, 91, 89,
+  88, 88, 76, 96, 78, 71, 86, 93, 73, 86,
+  82, 90, 86, 86, 87, 84, 84, 81, 99, 79,
+  81, 85, 80, 80, 89, 89, 84, 79, 75, 76,
+  102, 88, 91, 91, 81, 94, 68, 86, 85, 80,
+  82, 84, 73, 76, 77, 85, 96, 90, 84, 67,
+  81, 70, 72, 87, 84, 94, 92, 81, 89, 79,
+  67, 78, 80, 86, 86, 72, 79, 79, 90, 78,
+  81, 82, 78, 81, 87, 86, 78, 101, 90, 100,
+  87, 78, 96, 85, 71, 71, 88, 91, 90, 81,
+  82, 80, 85, 90, 74, 80, 73, 76, 87, 85,
+  77, 87, 85, 97, 95, 81, 88, 84, 83, 79,
+  75, 94, 80, 89, 90, 90, 94, 93, 90, 77,
+  86, 83, 79, 90, 58, 85, 97, 118, 83, 93,
+  67, 88, 92, 91, 96, 111, 115, 79, 87, 91,
+  77, 71, 100, 89, 94, 71, 95, 75, 89, 73,
+  89, 99, 84, 84, 92, 79, 94, 98, 69, 110,
+  84, 85, 78, 64, 84, 78, 82, 77, 84, 89,
+  88, 86, 90, 65, 89, 78, 69, 75, 80, 73,
+  66, 76, 68, 95, 81, 73, 79, 82, 68, 102,
+  102, 79, 94, 93, 82, 81, 78, 90, 83, 67,
+  83, 90, 88, 73, 67, 86, 80, 78, 89, 80,
+  50, 83, 86, 78, 120, 72, 68, 97, 84, 70,
+  82, 87, 79, 82, 79, 90, 77, 101, 78, 88,
+  83, 91, 62, 73, 81, 71, 84, 77, 65, 89,
+  69, 85, 103, 75, 114, 68, 75, 84, 86, 94,
+  57, 91, 46, 74, 91, 137, 85, 99, 59, 65,
+  111, 111, 118, 77, 72, 86, 92, 71, 113, 56,
+  109, 84, 104, 89, 106, 107, 94, 74, 91, 63,
+  77, 72, 94, 76, 77, 94, 93, 128, 86, 121,
+  84, 74, 80, 68, 93, 73, 67, 95, 100, 90,
+  118, 64, 75, 75, 67, 83, 81, 85, 84, 71,
+  66, 95, 78, 78, 80, 75, 46, 102, 95, 77,
+  121, 75, 72, 77, 75, 93, 89, 82, 77, 79,
+  90, 59, 62, 82, 69, 71, 80, 81, 29, 84,
+  108, 102, 95, 46, 58, 75, 82, 65, 72, 95,
+  88, 70, 79, 91, 85, 131, 79, 82, 86, 85,
+  85, 55, 83, 64, 71, 91, 47, 74, 56, 81,
+  133, 63, 80, 69, 72, 92, 84, 74, 82, 86,
+  67, 91, 93, 110, 97, 90, 69, 87, 86, 92,
+  91, 88, 70, 81, 79, 91, 113, 73, 91, 86,
+  86, 97, 89, 89, 85, 97, 78, 73, 79, 91,
+  82, 82, 90, 92, 116, 100, 85, 90, 92, 97,
+  84, 81, 85, 81, 88, 92, 77, 79, 86, 70,
+  93, 78, 77, 77, 83, 63, 72, 81, 86, 93,
+  74, 78, 75, 79, 59, 92, 94, 87, 92, 76,
+  70, 82, 89, 89, 79, 93, 83, 82, 88, 85,
+  75, 91, 82, 94, 88, 78, 81, 87, 86, 69,
+  78, 73, 78, 76, 82, 76, 86, 86, 75, 88,
+  80, 89, 86, 91, 83, 88, 89, 96, 95, 80,
+  83, 76, 65, 79, 72, 90, 73, 82, 97, 79,
+  87, 87, 79, 82, 93, 90, 85, 98, 69, 94,
+  93, 94, 93, 79, 71, 92, 100, 83, 85, 92,
+  82, 88, 62, 92, 82, 86, 91, 87, 80, 71,
+  81, 74, 87, 80, 84, 92, 82, 85, 86, 88,
+  90, 86, 79, 93, 70, 81, 89, 65, 84, 76,
+  79, 90, 82, 97, 90, 93, 80, 76, 95, 85,
+  79, 89, 92, 75, 79, 84, 81, 88, 80, 86,
+  80, 74, 84, 92, 93, 94, 87, 84, 83, 79,
+  83, 76, 88, 85, 87, 87, 85, 88, 77, 72,
+  95, 82, 90, 86, 63, 72, 75, 72, 112, 82,
+  79, 98, 87, 79, 76, 76, 77, 95, 90, 89,
+  69, 80, 77, 88, 93, 98, 85, 85, 88, 87,
+  96, 82, 75, 101, 78, 82, 86, 74, 91, 84,
+  73, 82, 94, 74, 75, 99, 64, 94, 95, 98,
+  91, 89, 69, 95, 107, 91, 87, 91, 70, 77,
+  79, 84, 99, 73, 92, 88, 89, 90, 80, 77,
+  89, 81, 84, 77, 85, 72, 87, 86, 87, 76,
+  73, 106, 68, 82, 99, 70, 79, 78, 76, 83,
+  82, 95, 84, 86, 81, 74, 84, 100, 74, 85,
+  99, 81, 89, 81, 75, 91, 78, 78, 75, 79,
+  70, 87, 103, 93, 84, 79, 88, 71, 86, 81,
+  82, 84, 88, 82, 86, 90, 77, 66, 87, 73,
+  82, 82, 56, 73, 84, 83, 93, 67, 75, 94,
+  89, 71, 80, 81, 84, 90, 87, 91, 76, 82,
+  77, 81, 102, 92, 91, 81, 88, 88, 80, 71,
+  70, 103, 70, 78, 104, 70, 82, 80, 77, 86,
+  86, 56, 86, 94, 71, 93, 93, 92, 94, 85,
+  76, 89, 93, 83, 85, 80, 86, 87, 90, 87,
+  106, 86, 87, 86, 76, 85, 82, 82, 86, 90,
+  78, 78, 82, 86, 82, 88, 84, 80, 86, 88,
+  71, 82, 100, 93, 81, 77, 79, 85, 81, 92,
+  91, 80, 79, 77, 96, 82, 81, 88, 91, 64,
+  94, 89, 90, 86, 75, 82, 75, 67, 84, 90,
+  97, 97, 85, 77, 77, 83, 88, 80, 85, 91,
+  86, 83, 90, 93, 82, 81, 98, 87, 88, 86,
+  81, 79, 78, 74, 80, 84, 84, 89, 82, 81,
+  75, 82, 77, 95, 87, 84, 85, 77, 79, 86,
+  99, 93, 89, 84, 88, 90, 71, 84, 75, 92,
+  82, 83, 88, 78, 74, 72, 110, 81, 81, 81,
+  85, 91, 82, 83, 76, 72, 89, 98, 74, 92,
+  85, 92, 85, 86, 83, 83, 85, 103, 82, 74,
+  84, 77, 84, 68, 73, 85, 91, 74, 58, 79,
+  79, 79, 78, 92, 79, 89, 85, 84, 81, 87,
+  84, 83, 95, 78, 83, 105, 99, 81, 70, 83,
+  80, 84, 83, 83, 89, 81, 96, 105, 88, 88,
+  111, 74, 84, 88, 81, 90, 78, 91, 82, 91,
+  77, 78, 88, 88, 79, 81, 86, 74, 78, 90,
+  92, 98, 87, 78, 82, 94, 79, 89, 85, 84,
+  82, 74, 87, 81, 74, 76, 73, 84, 88, 81,
+  81, 74, 81, 76, 90, 79, 75, 89, 101, 89,
+  90, 87, 80, 92, 93, 91, 82, 81, 87, 90,
+  73, 87, 78, 93, 89, 84, 92, 72, 78, 81,
+  80, 87, 74, 80, 93, 98, 74, 79, 91, 91,
+  86, 90, 84, 75, 76, 103, 81, 70, 83, 77,
+  104, 67, 60, 88, 87, 85, 52, 65, 79, 68,
+  92, 70, 76, 89, 78, 86, 86, 84, 90, 62,
+  84, 57, 96, 97, 97, 78, 59, 108, 86, 84,
+  89, 81, 88, 71, 114, 100, 90, 90, 104, 63,
+  84, 79, 98, 91, 74, 84, 79, 83, 75, 59,
+  107, 75, 77, 93, 77, 71, 78, 86, 87, 95,
+  94, 75, 83, 97, 77, 77, 94, 90, 89, 69,
+  91, 81, 71, 84, 78, 84, 89, 83, 113, 84,
+  85, 65, 79, 67, 68, 87, 106, 86, 89, 76,
+  66, 90, 87, 95, 81, 82, 80, 86, 79, 73,
+  68, 94, 75, 77, 75, 79, 84, 84, 83, 87,
+  74, 80, 93, 76, 72, 87, 84, 92, 89, 81,
+  89, 78, 76, 103, 90, 78, 90, 83, 80, 68,
+  69, 86, 92, 83, 68, 86, 87, 80, 100, 88,
+  79, 92, 85, 85, 85, 84, 83, 81, 97, 82,
+  83, 95, 101, 82, 80, 103, 78, 77, 82, 85,
+  90, 85, 89, 89, 77, 93, 98, 82, 91, 86,
+  95, 89, 89, 87, 81, 89, 83, 75, 105, 90,
+  85, 75, 84, 83, 71, 81, 91, 93, 78, 76,
+  81, 98, 81, 94, 81, 85, 85, 77, 88, 86,
+  72, 94, 75, 82, 89, 79, 79, 77, 84, 83,
+  76, 73, 80, 92, 65, 88, 82, 93, 81, 95,
+  87, 90, 86, 85, 86, 89, 76, 99, 83, 67,
+  86, 73, 101, 89, 89, 87, 63, 81, 97, 73,
+  88, 79, 74, 85, 95, 77, 82, 92, 92, 93,
+  83, 98, 80, 71, 90, 77, 102, 72, 65, 68,
+  95, 82, 111, 87, 62, 83, 76, 84, 86, 90,
+  83, 71, 91, 89, 88, 86, 86, 69, 78, 78,
+  80, 81, 60, 82, 82, 83, 78, 99, 73, 95,
+  83, 111, 75, 106, 80, 71, 93, 80, 89, 85,
+  80, 87, 91, 92, 79, 132, 87, 82, 63, 77,
+  92, 69, 74, 79, 90, 104, 75, 77, 79, 86,
+  88, 78, 95, 78, 96, 79, 85, 73, 68, 69,
+  73, 88, 94, 94, 88, 79, 74, 77, 77, 82,
+  78, 85, 81, 88, 100, 86, 75, 80, 86, 104,
+  69, 85, 70, 83, 84, 85, 84, 102, 76, 76,
+  111, 88, 82, 86, 50, 97, 111, 85, 76, 71,
+  90, 76, 119, 71, 89, 123, 79, 73, 85, 95,
+  86, 62, 83, 77, 119, 108, 61, 66, 85, 98,
+  100, 76, 80, 84, 73, 43, 85, 95, 69, 64,
+  119, 68, 84, 84, 84, 34, 87, 50, 59, 79,
+  43, 85, 105, 80, 88, 110, 75, 83, 86, 117,
+  72, 97, 79, 73, 82, 80, 75, 79, 81, 73,
+  94, 90, 95, 91, 84, 74, 46, 85, 74, 70,
+  76, 83, 82, 106, 31, 74, 72, 87, 94, 71,
+  112, 89, 101, 82, 79, 78, 74, 93, 88, 93,
+  101, 88, 126, 99, 70, 63, 69, 76, 79, 82,
+  107, 82, 86, 80, 69, 79, 88, 120, 59, 101,
+  48, 80, 95, 64, 80, 103, 101, 74, 78, 92,
+  86, 80, 65, 81, 83, 81, 90, 78, 81, 80,
+  91, 80, 80, 87, 84, 92, 83, 97, 87, 69,
+  92, 82, 101, 105, 65, 80, 92, 76, 84, 102,
+  89, 85, 95, 89, 87, 87, 89, 65, 91, 88,
+  86, 123, 93, 76, 69, 87, 78, 84, 80, 72,
+  72, 59, 79, 96, 84, 91, 75, 87, 68, 105,
+  71, 72, 88, 80, 88, 91, 87, 87, 85, 91,
+  80, 66, 84, 85, 69, 69, 92, 97, 65, 81,
+  87, 101, 69, 67, 82, 93, 94, 83, 78, 73,
+  97, 72, 86, 79, 72, 92, 72, 89, 90, 85,
+  86, 82, 64, 85, 88, 77, 81, 92, 60, 83,
+  87, 90, 77, 82, 96, 96, 72, 85, 58, 86,
+  84, 94, 75, 76, 84, 88, 83, 79, 90, 89,
+  85, 86, 77, 72, 85, 70, 80, 90, 74, 93,
+  83, 86, 87, 75, 82, 95, 74, 83, 94, 81,
+  76, 87, 70, 78, 103, 73, 95, 84, 76, 92,
+  87, 96, 83, 78, 98, 83, 76, 89, 99, 87,
+  82, 78, 90, 98, 94, 84, 80, 97, 82, 87,
+  71, 78, 83, 75, 100, 92, 78, 82, 83, 78,
+  85, 82, 101, 85, 94, 84, 97, 86, 80, 81,
+  99, 74, 83, 94, 91, 77, 84, 81, 87, 97,
+  94, 94, 79, 102, 85, 74, 87, 67, 88, 75,
+  92, 65, 71, 88, 77, 82, 83, 80, 75, 69,
+  81, 77, 84, 86, 81, 84, 81, 82, 63, 92,
+  83, 84, 77, 87, 83, 83, 81, 86, 80, 84,
+  77, 75, 94, 82, 77, 80, 90, 91, 83, 89,
+  85, 70, 77, 89, 89, 89, 80, 90, 81, 88,
+  86, 69, 83, 93, 75, 72, 96, 80, 91, 101,
+  67, 75, 107, 80, 90, 72, 82, 96, 81, 82,
+  90, 77, 84, 74, 78, 86, 100, 68, 83, 64,
+  91, 105, 89, 81, 68, 99, 83, 86, 83, 74,
+  76, 60, 113, 87, 73, 88, 82, 66, 85, 82,
+  98, 87, 93, 74, 89, 77, 87, 67, 100, 63,
+  75, 104, 85, 78, 86, 88, 81, 99, 105, 106,
+  81, 93, 88, 64, 95, 64, 93, 76, 87, 69,
+  73, 75, 76, 83, 83, 87, 87, 78, 82, 70,
+  91, 76, 74, 76, 108, 91, 70, 88, 76, 88,
+  90, 93, 80, 87, 65, 90, 81, 84, 69, 71,
+  110, 85, 80, 77, 88, 87, 84, 85, 77, 68,
+  86, 91, 85, 87, 75, 90, 75, 84, 87, 84,
+  84, 100, 83, 82, 91, 83, 72, 99, 74, 76,
+  97, 67, 81, 83, 87, 89, 69, 99, 83, 78,
+  89, 79, 77, 90, 96, 80, 89, 79, 81, 108,
+  97, 87, 83, 67, 72, 75, 68, 84, 85, 78,
+  89, 78, 76, 84, 82, 78, 84, 90, 70, 90,
+  89, 83, 92, 89, 76, 73, 83, 75, 85, 76,
+  94, 92, 86, 84, 79, 90, 85, 92, 83, 91,
+  87, 81, 73, 72, 86, 73, 82, 71, 75, 65,
+  77, 81, 81, 80, 75, 81, 82, 81, 104, 83,
+  82, 79, 89, 89, 80, 97, 83, 79, 90, 81,
+  82, 85, 77, 89, 79, 86, 77, 76, 95, 85,
+  85, 86, 77, 83, 81, 87, 87, 63, 92, 100,
+  72, 83, 83, 78, 87, 87, 100, 76, 98, 90,
+  83, 78, 79, 82, 94, 93, 100, 78, 70, 79,
+  74, 91, 89, 84, 75, 84, 79, 81, 83, 80,
+  81, 83, 82, 75, 83, 87, 78, 65, 76, 85,
+  90, 87, 77, 75, 75, 89, 91, 89, 85, 80,
+  88, 78, 100, 85, 79, 97, 78, 85, 83, 97,
+  85, 70, 69, 85, 70, 78, 82, 91, 73, 95,
+  73, 87, 83, 94, 83, 94, 79, 72, 72, 93,
+  73, 81, 91, 97, 93, 83, 83, 77, 85, 81,
+  88, 93, 98, 89, 85, 71, 74, 83, 78, 81,
+  77, 96, 105, 92, 73, 104, 93, 92, 81, 93,
+  86, 80, 79, 85, 88, 76, 81, 77, 82, 81,
+  77, 70, 78, 74, 79, 76, 105, 80, 80, 68,
+  97, 100, 102, 72, 106, 76, 81, 79, 83, 87,
+  84, 81, 96, 73, 129, 83, 68, 80, 81, 74,
+  89, 80, 78, 83, 63, 84, 104, 91, 75, 91,
+  83, 65, 68, 76, 78, 81, 78, 87, 89, 82,
+  77, 70, 63, 88, 107, 69, 81, 90, 85, 68,
+  90, 98, 61, 102, 87, 68, 70, 98, 76, 60,
+  64, 82, 82, 77, 82, 101, 79, 76, 80, 82,
+  83, 104, 84, 93, 77, 84, 67, 100, 76, 85,
+  93, 110, 78, 76, 70, 92, 78, 79, 83, 82,
+  114, 91, 85, 72, 88, 81, 76, 78, 79, 86,
+  69, 92, 79, 112, 87, 110, 80, 92, 82, 77,
+  92, 75, 80, 92, 81, 86, 86, 90, 72, 85,
+  81, 88, 82, 66, 77, 61, 77, 91, 92, 80,
+  83, 89, 92, 80, 76, 86, 87, 78, 80, 84,
+  83, 74, 99, 81, 78, 84, 96, 84, 95, 87,
+  76, 78, 78, 83, 94, 78, 82, 100, 93, 95,
+  82, 88, 80, 85, 73, 84, 87, 77, 77, 76,
+  75, 85, 87, 86, 85, 78, 91, 77, 77, 89,
+  83, 82, 96, 83, 92, 90, 88, 77, 71, 84,
+  89, 84, 80, 86, 76, 85, 76, 72, 91, 91,
+  83, 94, 78, 100, 76, 98, 93, 83, 97, 98,
+  70, 83, 78, 97, 87, 78, 84, 89, 89, 87,
+  82, 68, 83, 80, 76, 87, 82, 92, 78, 92,
+  74, 98, 85, 90, 82, 96, 82, 76, 81, 85,
+  80, 79, 93, 93, 105, 96, 78, 68, 87, 82,
+  71, 74, 74, 70, 72, 86, 82, 71, 75, 85,
+  93, 73, 80, 94, 80, 74, 82, 78, 103, 69,
+  112, 90, 75, 107, 99, 105, 76, 98, 77, 87,
+  80, 96, 68, 86, 63, 87, 111, 98, 77, 83,
+  79, 79, 73, 87, 82, 98, 81, 70, 91, 94,
+  76, 101, 91, 77, 96, 68, 80, 90, 84, 83,
+  98, 98, 77, 86, 85, 62, 70, 105, 77, 74,
+  86, 74, 86, 79, 77, 81, 95, 90, 85, 87,
+  71, 90, 84, 85, 65, 70, 97, 85, 95, 81,
+  71, 84, 83, 78, 91, 75, 102, 92, 79, 70,
+  82, 84, 73, 90, 82, 95, 70, 95, 80, 74,
+  83, 71, 75, 92, 83, 81, 72, 69, 72, 80,
+  95, 107, 118, 83, 86, 55, 87, 75, 57, 83,
+  109, 77, 94, 74, 97, 84, 78, 76, 82, 69,
+  76, 85, 88, 70, 73, 86, 109, 82, 147, 85,
+  85, 95, 78, 76, 68, 96, 87, 92, 69, 112,
+  84, 110, 56, 76, 138, 83, 40, 84, 91, 86,
+  67, 97, 67, 96, 70, 70, 92, 113, 84, 74,
+  74, 97, 73, 68, 89, 121, 68, 72, 71, 89,
+  60, 74, 88, 51, 82, 89, 61, 66, 87, 78,
+  91, 86, 90, 89, 89, 85, 84, 82, 76, 77,
+  80, 87, 53, 68, 96, 106, 108, 67, 58, 90,
+  75, 77, 97, 71, 129, 98, 76, 72, 88, 105,
+  77, 89, 82, 93, 64, 108, 124, 67, 86, 83,
+  62, 105, 82, 76, 84, 60, 82, 91, 101, 92,
+  100, 84, 72, 69, 87, 82, 73, 77, 78, 86,
+  73, 86, 85, 68, 76, 91, 80, 75, 91, 92,
+  77, 71, 77, 77, 91, 104, 106, 77, 80, 86,
+  81, 93, 80, 100, 70, 79, 87, 94, 92, 82,
+  68, 87, 108, 109, 77, 84, 78, 88, 72, 84,
+  77, 94, 81, 74, 83, 85, 76, 108, 97, 79,
+  91, 71, 88, 89, 81, 81, 79, 96, 78, 84,
+  80, 65, 70, 89, 66, 81, 86, 72, 79, 99,
+  79, 93, 91, 87, 85, 85, 74, 80, 85, 79,
+  73, 69, 103, 90, 85, 80, 76, 75, 85, 76,
+  83, 76, 90, 85, 82, 72, 81, 88, 76, 93,
+  91, 96, 109, 91, 77, 79, 83, 71, 75, 89,
+  85, 76, 71, 74, 81, 80, 85, 88, 76, 85,
+  80, 84, 82, 93, 69, 88, 83, 72, 72, 104,
+  81, 69, 92, 82, 81, 74, 83, 86, 82, 78,
+  87, 81, 84, 64, 77, 97, 74, 92, 80, 95,
+  98, 79, 76, 82, 91, 86, 92, 72, 71, 98,
+  75, 77, 95, 100, 72, 79, 76, 85, 75, 80,
+  85, 76, 83, 83, 69, 93, 114, 85, 86, 84,
+  80, 76, 84, 80, 88, 83, 106, 86, 66, 92,
+  75, 75, 109, 90, 77, 85, 88, 87, 80, 75,
+  84, 85, 80, 90, 90, 87, 78, 77, 78, 78,
+  90, 75, 63, 98, 91, 86, 91, 80, 79, 71,
+  71, 81, 84, 84, 82, 71, 84, 87, 94, 81,
+  63, 86, 82, 94, 84, 74, 78, 86, 88, 95,
+  75, 78, 86, 74, 82, 97, 76, 73, 86, 66,
+  82, 87, 61, 87, 89, 84, 79, 110, 78, 63,
+  74, 75, 78, 71, 83, 88, 76, 71, 91, 77,
+  90, 86, 69, 98, 73, 81, 77, 75, 104, 78,
+  78, 81, 105, 83, 73, 70, 67, 89, 82, 61,
+  97, 98, 82, 83, 68, 80, 71, 86, 78, 85,
+  99, 84, 55, 94, 121, 91, 87, 79, 90, 82,
+  80, 93, 86, 89, 104, 90, 69, 91, 67, 67,
+  96, 83, 78, 93, 68, 82, 77, 89, 84, 80,
+  83, 91, 81, 85, 89, 78, 75, 79, 83, 84,
+  85, 96, 87, 89, 85, 75, 100, 73, 72, 82,
+  75, 82, 75, 73, 76, 85, 101, 70, 79, 94,
+  87, 85, 88, 69, 70, 85, 95, 100, 59, 68,
+  84, 74, 83, 83, 72, 73, 80, 83, 79, 92,
+  74, 89, 85, 89, 69, 100, 84, 67, 91, 86,
+  99, 74, 87, 81, 73, 73, 86, 79, 76, 89,
+  72, 94, 77, 70, 68, 80, 93, 82, 82, 78,
+  95, 84, 74, 74, 70, 90, 69, 81, 95, 100,
+  74, 78, 75, 83, 78, 89, 83, 83, 84, 77,
+  68, 94, 115, 86, 89, 90, 89, 74, 84, 73,
+  74, 80, 105, 90, 69, 94, 73, 70, 96, 88,
+  78, 81, 77, 81, 82, 85, 85, 88, 82, 89,
+  94, 79, 78, 77, 86, 78, 90, 84, 87, 88,
+  94, 80, 91, 80, 83, 76, 68, 83, 86, 88,
+  83, 81, 88, 84, 93, 80, 109, 82, 76, 104,
+  102, 79, 78, 85, 88, 89, 77, 86, 87, 101,
+  75, 81, 97, 79, 75, 100, 81, 91, 74, 77,
+  77, 75, 73, 93, 92, 100, 94, 102, 77, 89,
+  89, 73, 93, 100, 86, 80, 84, 79, 75, 88,
+  86, 65, 71, 79, 82, 72, 101, 98, 90, 72,
+  68, 89, 78, 75, 78, 78, 85, 77, 77, 95,
+  89, 102, 104, 97, 109, 93, 84, 76, 78, 60,
+  85, 69, 68, 94, 99, 72, 98, 80, 69, 71,
+  102, 91, 81, 79, 65, 57, 77, 93, 95, 90,
+  86, 94, 85, 79, 79, 59, 103, 77, 90, 84,
+  77, 74, 93, 78, 83, 79, 86, 88, 54, 59,
+  88, 82, 84, 73, 85, 80, 86, 92, 75, 77,
+  92, 77, 70, 82, 85, 73, 78, 99, 81, 88,
+  95, 100, 97, 84, 86, 106, 86, 81, 94, 87,
+  88, 83, 75, 87, 88, 88, 83, 74, 91, 92,
+  63, 86, 83, 86, 74, 102, 86, 93, 97, 78,
+  86, 67, 88, 85, 88, 83, 77, 91, 88, 82,
+  75, 90, 84, 83, 89, 88, 86, 72, 71, 81,
+  75, 81, 86, 78, 80, 80, 74, 97, 91, 79,
+  86, 77, 89, 69, 80, 82, 99, 68, 86, 80,
+  64, 77, 90, 76, 85, 113, 70, 80, 100, 79,
+  79, 79, 83, 76, 74, 71, 90, 75, 68, 90,
+  82, 83, 85, 84, 59, 72, 95, 87, 82, 61,
+  90, 72, 89, 73, 81, 73, 76, 73, 95, 90,
+  84, 76, 85, 81, 68, 74, 78, 76, 76, 82,
+  84, 107, 102, 72, 79, 84, 92, 81, 81, 79,
+  94, 85, 81, 71, 94, 75, 90, 89, 90, 68,
+  73, 80, 90, 87, 87, 78, 104, 93, 70, 85,
+  90, 83, 77, 85, 97, 85, 77, 83, 83, 68,
+  82, 84, 84, 76, 98, 98, 89, 91, 80, 84,
+  86, 90, 77, 89, 80, 81, 73, 84, 78, 80,
+  87, 70, 81, 75, 71, 102, 94, 81, 79, 79,
+  81, 80, 84, 85, 104, 80, 76, 98, 78, 84,
+  80, 83, 79, 87, 77, 76, 88, 86, 82, 77,
+  79, 85, 99, 76, 83, 84, 75, 74, 81, 87,
+  88, 81, 78, 78, 97, 90, 95, 79, 92, 86,
+  93, 85, 82, 77, 89, 87, 94, 89, 87, 78,
+  75, 84, 75, 86, 91, 73, 74, 88, 89, 95,
+  88, 84, 79, 83, 98, 87, 87, 79, 93, 82,
+  83, 83, 81, 95, 87, 77, 81, 93, 67, 91,
+  76, 93, 77, 75, 68, 89, 70, 83, 84, 96,
+  86, 120, 69, 87, 99, 87, 100, 86, 101, 87,
+  95, 66, 67, 86, 104, 70, 113, 97, 84, 77,
+  82, 84, 80, 85, 69, 72, 74, 85, 83, 83,
+  78, 79, 81, 75, 88, 90, 97, 69, 98, 54,
+  78, 77, 80, 63, 88, 49, 60, 70, 96, 83,
+  89, 87, 65, 107, 89, 98, 85, 73, 68, 120,
+  68, 95, 84, 71, 96, 120, 74, 78, 84, 79,
+  81, 80, 114, 70, 79, 72, 93, 69, 88, 78,
+  74, 83, 64, 62, 97, 90, 84, 78, 87, 71,
+  92, 76, 80, 82, 75, 85, 44, 123, 85, 83,
+  73, 79, 82, 86, 100, 80, 80, 74, 80, 118,
+  75, 71, 75, 92, 88, 95, 86, 72, 78, 77,
+  87, 83, 100, 111, 76, 71, 77, 77, 71, 91,
+  84, 68, 65, 86, 95, 71, 83, 79, 90, 73,
+  100, 90, 87, 105, 113, 88, 97, 83, 72, 73,
+  100, 95, 97, 76, 59, 80, 107, 90, 71, 78,
+  91, 79, 86, 73, 71, 86, 61, 63, 84, 110,
+  90, 66, 82, 92, 67, 71, 78, 102, 82, 83,
+  67, 112, 59, 84, 90, 59, 84, 113, 85, 76,
+  82, 81, 78, 77, 95, 88, 95, 101, 63, 73,
+  87, 86, 107, 84, 77, 98, 84, 72, 88, 60,
+  86, 98, 100, 94, 85, 73, 93, 88, 78, 64,
+  80, 92, 55, 83, 91, 140, 67, 99, 103, 70,
+  95, 78, 79, 60, 87, 76, 85, 66, 82, 83,
+  83, 95, 84, 75, 81, 77, 86, 78, 89, 92,
+  85, 86, 83, 80, 89, 79, 80, 83, 81, 70,
+  77, 86, 82, 70, 81, 79, 82, 89, 101, 97,
+  92, 91, 84, 82, 82, 88, 76, 67, 94, 80,
+  86, 86, 67, 78, 97, 94, 72, 77, 87, 80,
+  94, 78, 74, 90, 68, 89, 89, 93, 95, 85,
+  80, 95, 92, 78, 83, 92, 81, 74, 75, 85,
+  74, 93, 83, 66, 75, 85, 86, 77, 83, 89,
+  86, 77, 80, 92, 83, 84, 98, 74, 91, 87,
+  108, 91, 79, 96, 83, 85, 80, 78, 86, 101,
+  96, 89, 75, 80, 87, 88, 85, 77, 86, 86,
+  63, 83, 101, 97, 76, 94, 87, 87, 95, 80,
+  87, 78, 86, 78, 81, 85, 82, 91, 84, 83,
+  92, 85, 77, 96, 79, 90, 81, 85, 75, 92,
+  68, 86, 79, 101, 84, 93, 78, 94, 78, 88,
+  93, 94, 93, 87, 94, 63, 72, 92, 104, 75,
+  113, 89, 75, 87, 78, 89, 95, 83, 92, 80,
+  94, 94, 82, 78, 83, 74, 76, 92, 87, 98,
+  101, 79, 92, 71, 74, 76, 78, 76, 89, 65,
+  68, 83, 73, 86, 83, 79, 78, 91, 91, 90,
+  82, 77, 73, 96, 83, 90, 90, 78, 95, 88,
+  81, 77, 82, 73, 87, 87, 98, 74, 83, 76,
+  97, 78, 82, 78, 63, 92, 77, 75, 99, 87,
+  76, 74, 73, 83, 92, 73, 83, 81, 78, 75,
+  69, 111, 55, 86, 88, 81, 74, 84, 95, 86,
+  88, 82, 78, 99, 75, 74, 66, 90, 93, 72,
+  86, 82, 80, 82, 80, 93, 100, 84, 68, 78,
+  72, 79, 72, 84, 80, 78, 65, 91, 92, 76,
+  99, 84, 89, 79, 81, 92, 97, 98, 98, 75,
+  78, 87, 78, 79, 101, 80, 95, 79, 70, 95,
+  89, 78, 83, 78, 80, 84, 86, 83, 87, 102,
+  71, 76, 80, 86, 84, 78, 89, 89, 78, 82,
+  70, 82, 87, 83, 80, 87, 84, 83, 81, 70,
+  77, 82, 98, 77, 82, 87, 82, 68, 77, 88,
+  82, 91, 81, 77, 99, 83, 108, 86, 81, 87,
+  85, 73, 76, 83, 82, 91, 95, 89, 81, 83,
+  73, 89, 93, 64, 83, 88, 71, 76, 96, 105,
+  62, 93, 95, 92, 86, 77, 83, 76, 90, 84,
+  79, 72, 81, 75, 73, 87, 85, 76, 83, 80,
+  83, 86, 86, 96, 92, 75, 76, 77, 82, 76,
+  74, 87, 81, 73, 88, 83, 81, 76, 92, 82,
+  85, 94, 80, 92, 93, 87, 90, 73, 70, 78,
+  84, 72, 89, 73, 88, 91, 79, 89, 74, 73,
+  82, 73, 83, 81, 93, 85, 84, 105, 85, 86,
+  85, 86, 81, 84, 80, 83, 95, 80, 78, 81,
+  90, 76, 81, 80, 86, 82, 80, 78, 75, 79,
+  84, 79, 82, 89, 82, 79, 75, 90, 82, 83,
+  94, 87, 106, 82, 101, 81, 82, 82, 81, 81,
+  77, 83, 79, 87, 89, 88, 85, 87, 80, 81,
+  104, 76, 83, 83, 75, 82, 100, 72, 106, 88,
+  81, 105, 94, 86, 87, 86, 84, 86, 81, 81,
+  93, 64, 63, 81, 96, 86, 83, 93, 81, 83,
+  94, 79, 70, 85, 89, 89, 96, 82, 90, 79,
+  44, 75, 60, 94, 71, 83, 79, 88, 87, 80,
+  87, 80, 82, 105, 84, 89, 76, 78, 75, 78,
+  76, 60, 93, 77, 75, 77, 89, 100, 81, 85,
+  88, 77, 83, 90, 71, 85, 75, 91, 73, 84,
+  100, 80, 71, 89, 68, 84, 80, 77, 103, 55,
+  91, 67, 90, 86, 77, 72, 90, 77, 102, 84,
+  83, 91, 90, 78, 82, 87, 89, 85, 93, 84,
+  77, 101, 76, 83, 86, 78, 91, 102, 83, 84,
+  72, 86, 80, 85, 84, 88, 72, 77, 73, 88,
+  83, 88, 85, 86, 78, 74, 90, 83, 74, 72,
+  76, 91, 74, 83, 68, 88, 91, 89, 90, 72,
+  80, 78, 73, 87, 81, 76, 84, 89, 88, 88,
+  84, 82, 97, 79, 83, 95, 81, 80, 67, 86,
+  72, 94, 75, 83, 80, 88, 78, 71, 87, 83,
+  87, 94, 89, 83, 88, 84, 82, 79, 79, 94,
+  88, 86, 89, 75, 76, 94, 88, 91, 83, 78,
+  82, 82, 81, 85, 89, 82, 83, 77, 94, 81,
+  76, 106, 76, 116, 79, 84, 86, 75, 75, 84,
+  88, 85, 79, 75, 93, 85, 91, 96, 85, 84,
+  81, 74, 89, 77, 73, 85, 90, 82, 72, 90,
+  87, 77, 78, 88, 82, 90, 80, 90, 84, 85,
+  80, 87, 86, 85, 76, 86, 75, 86, 96, 86,
+  92, 85, 79, 90, 80, 86, 83, 82, 72, 88,
+  61, 82, 78, 80, 94, 94, 88, 74, 103, 84,
+  72, 98, 80, 69, 82, 91, 73, 82, 93, 74,
+  92, 83, 70, 101, 74, 80, 84, 80, 92, 93,
+  86, 87, 81, 86, 76, 77, 84, 86, 83, 97,
+  93, 81, 92, 82, 90, 75, 85, 100, 87, 90,
+  92, 81, 81, 99, 88, 95, 78, 83, 88, 77,
+  79, 82, 95, 79, 78, 80, 91, 81, 83, 100,
+  100, 95, 72, 88, 80, 95, 76, 87, 84, 87,
+  78, 87, 93, 88, 84, 84, 83, 82, 84, 82,
+  85, 69, 75, 93, 89, 81, 80, 97, 93, 73,
+  85, 89, 68, 73, 88, 87, 92, 80, 75, 84,
+  86, 78, 88, 90, 78, 93, 100, 92, 88, 84,
+  79, 92, 96, 92, 92, 87, 80, 89, 68, 79,
+  89, 85, 82, 89, 83, 73, 61, 85, 102, 75,
+  81, 92, 78, 81, 88, 78, 68, 87, 80, 98,
+  101, 76, 82, 83, 66, 85, 64, 96, 75, 71,
+  90, 86, 108, 80, 85, 86, 85, 104, 84, 85,
+  80, 76, 83, 70, 73, 51, 87, 88, 67, 103,
+  97, 98, 84, 78, 76, 93, 90, 89, 94, 89,
+  68, 85, 87, 84, 97, 76, 83, 80, 57, 55,
+  83, 79, 114, 63, 119, 61, 80, 92, 85, 78,
+  80, 79, 116, 65, 84, 92, 90, 79, 83, 86,
+  95, 86, 80, 86, 83, 107, 71, 79, 82, 67,
+  82, 86, 110, 87, 74, 102, 87, 84, 83, 81,
+  78, 76, 77, 73, 73, 91, 72, 88, 82, 79,
+  79, 85, 80, 70, 77, 88, 102, 83, 81, 92,
+  86, 76, 86, 72, 67, 86, 91, 72, 82, 95,
+  76, 89, 94, 82, 79, 89, 96, 86, 99, 86,
+  92, 79, 75, 84, 62, 93, 71, 85, 81, 89,
+  90, 67, 87, 82, 87, 94, 80, 86, 80, 84,
+  72, 79, 79, 74, 87, 80, 88, 79, 74, 95,
+  88, 83, 87, 84, 81, 91, 89, 71, 78, 87,
+  80, 77, 92, 81, 88, 80, 64, 89, 81, 83,
+  96, 71, 87, 70, 85, 89, 79, 72, 82, 81,
+  94, 93, 86, 86, 81, 75, 91, 75, 88, 85,
+  79, 92, 73, 89, 74, 92, 86, 86, 92, 94,
+  90, 84, 77, 98, 84, 85, 77, 71, 75, 78,
+  76, 81, 84, 81, 87, 89, 81, 85, 74, 84,
+  78, 72, 74, 89, 78, 90, 75, 77, 97, 88,
+  90, 65, 83, 79, 82, 78, 86, 87, 73, 86,
+  84, 80, 87, 87, 95, 74, 79, 93, 83, 74,
+  85, 82, 80, 96, 73, 89, 83, 87, 75, 75,
+  86, 79, 86, 94, 90, 77, 82, 82, 82, 82,
+  81, 100, 84, 83, 100, 78, 75, 95, 88, 90,
+  84, 84, 82, 88, 80, 77, 84, 86, 75, 75,
+  88, 89, 86, 96, 82, 103, 77, 86, 83, 78,
+  74, 81, 88, 82, 79, 78, 85, 75, 81, 99,
+  82, 84, 80, 78, 96, 62, 84, 86, 79, 85,
+  76, 98, 81, 86, 79, 88, 81, 95, 90, 90,
+  82, 92, 78, 87, 84, 72, 80, 85, 81, 86,
+  89, 88, 86, 85, 85, 87, 80, 89, 87, 78,
+  74, 86, 62, 87, 81, 75, 88, 89, 75, 79,
+  66, 83, 88, 76, 80, 78, 100, 79, 74, 87,
+  83, 89, 68, 96, 101, 76, 77, 91, 94, 93,
+  94, 91, 77, 69, 98, 71, 122, 73, 91, 85,
+  85, 101, 86, 83, 97, 88, 88, 68, 75, 60,
+  88, 99, 69, 122, 94, 110, 74, 86, 83, 103,
+  94, 78, 104, 106, 87, 67, 126, 93, 92, 72,
+  80, 58, 67, 47, 79, 97, 101, 80, 110, 80,
+  80, 92, 78, 85, 89, 85, 108, 70, 84, 84,
+  94, 83, 78, 96, 96, 84, 81, 84, 99, 101,
+  88, 76, 89, 75, 74, 84, 136, 93, 85, 87,
+  92, 84, 97, 93, 83, 87, 79, 68, 73, 86,
+  65, 94, 86, 97, 87, 105, 86, 78, 81, 88,
+  106, 70, 95, 88, 86, 75, 70, 74, 55, 84,
+  96, 75, 78, 88, 83, 80, 91, 86, 86, 85,
+  75, 91, 99, 84, 87, 88, 87, 79, 82, 89,
+  73, 78, 90, 82, 87, 62, 84, 84, 84, 95,
+  71, 94, 93, 78, 89, 80, 74, 71, 92, 82,
+  76, 90, 79, 104, 79, 79, 81, 86, 84, 96,
+  88, 89, 80, 73, 98, 87, 95, 72, 86, 47,
+  69, 61, 81, 80, 88, 77, 118, 77, 82, 92,
+  78, 77, 79, 84, 109, 91, 90, 82, 83, 75,
+  83, 87, 93, 86, 86, 85, 85, 92, 77, 79,
+  75, 80, 91, 83, 108, 81, 74, 102, 87, 81,
+  80, 81, 77, 81, 74, 69, 74, 77, 69, 100,
+  80, 91, 86, 85, 76, 74, 84, 86, 100, 75,
+  81, 86, 85, 78, 76, 62, 63, 84, 91, 68,
+  86, 93, 79, 82, 92, 87, 88, 91, 82, 87,
+  93, 91, 93, 81, 81, 79, 74, 97, 69, 83,
+  89, 86, 82, 58, 82, 84, 85, 95, 82, 79,
+  94, 82, 73, 100, 77, 83, 90, 76, 85, 75,
+  74, 94, 82, 87, 81, 83, 80, 103, 75, 81,
+  82, 79, 84, 82, 92, 83, 89, 66, 77, 84,
+  83, 80, 92, 84, 89, 74, 86, 86, 74, 74,
+  77, 73, 102, 97, 87, 81, 80, 74, 85, 76,
+  95, 85, 77, 89, 80, 106, 71, 83, 78, 88,
+  96, 94, 102, 84, 77, 96, 84, 83, 81, 65,
+  78, 84, 72, 77, 78, 78, 80, 97, 78, 86,
+  71, 88, 79, 72, 75, 89, 77, 85, 85, 83,
+  89, 83, 68, 51, 93, 76, 52, 75, 76, 76,
+  96, 80, 57, 101, 93, 76, 82, 66, 82, 71,
+  74, 90, 83, 91, 90, 81, 92, 85, 104, 94,
+  96, 95, 90, 76, 101, 88, 94, 98, 61, 78,
+  74, 67, 77, 85, 85, 52, 71, 53, 91, 77,
+  95, 108, 61, 66, 78, 82, 59, 71, 79, 66,
+  78, 99, 120, 98, 84, 94, 87, 47, 127, 166,
+  82, 74, 74, 123, 73, 79, 67, 75, 127, 80,
+  98, 85, 75, 68, 85, 114, 80, 92, 81, 93,
+  67, 75, 84, 94, 84, 100, 84, 62, 71, 103,
+  83, 83, 55, 85, 114, 86, 77, 70, 87, 60,
+  87, 82, 86, 84, 73, 89, 71, 89, 68, 74,
+  86, 72, 87, 133, 78, 74, 35, 84, 74, 114,
+  71, 66, 68, 82, 68, 72, 81, 77, 88, 85,
+  66, 96, 90, 68, 85, 72, 91, 77, 67, 85,
+  86, 82, 79, 85, 87, 86, 95, 91, 107, 96,
+  86, 85, 95, 88, 81, 101, 70, 80, 80, 66,
+  87, 94, 88, 60, 80, 69, 92, 96, 92, 97,
+  69, 57, 83, 83, 64, 73, 72, 73, 74, 94,
+  112, 90, 82, 87, 90, 52, 96, 153, 91, 71,
+  86, 121, 72, 79, 73, 73, 121, 66, 101, 79,
+  79, 68, 84, 95, 77, 88, 82, 91, 66, 73,
+  81, 104, 86, 99, 92, 71, 79, 102, 93, 73,
+  58, 113, 106, 91, 76, 73, 88, 68, 85, 69,
+  83, 85, 72, 86, 75, 89, 72, 74, 86, 67,
+  93, 105, 83, 73, 43, 84, 79, 95, 79, 89,
+  77, 80, 89, 105, 93, 87, 90, 83, 83, 81,
+  86, 77, 74, 86, 89, 100, 93, 83, 91, 76,
+  78, 91, 76, 88, 72, 91, 85, 81, 84, 79,
+  79, 78, 80, 96, 80, 78, 78, 81, 71, 86,
+  89, 97, 83, 86, 82, 68, 86, 82, 83, 92,
+  95, 86, 95, 83, 89, 71, 81, 70, 84, 85,
+  80, 64, 96, 75, 79, 72, 91, 78, 93, 77,
+  91, 80, 80, 88, 76, 83, 90, 106, 101, 86,
+  83, 85, 79, 74, 95, 76, 104, 74, 90, 83,
+  86, 85, 101, 92, 93, 71, 84, 85, 65, 74,
+  72, 82, 82, 80, 83, 86, 85, 95, 80, 76,
+  85, 83, 70, 83, 94, 86, 83, 83, 96, 86,
+  88, 94, 91, 87, 96, 82, 89, 64, 75, 82,
+  82, 75, 94, 86, 88, 84, 76, 80, 96, 77,
+  83, 72, 67, 77, 82, 83, 86, 105, 68, 91,
+  88, 77, 106, 88, 89, 81, 90, 85, 92, 94,
+  111, 90, 74, 81, 73, 81, 92, 84, 95, 72,
+  85, 72, 82, 67, 84, 82, 75, 86, 88, 88,
+  80, 81, 62, 78, 72, 79, 87, 94, 91, 95,
+  91, 62, 77, 110, 71, 70, 84, 110, 86, 77,
+  76, 77, 95, 80, 79, 76, 79, 72, 90, 84,
+  66, 86, 88, 82, 81, 88, 84, 79, 86, 74,
+  84, 73, 69, 94, 79, 86, 53, 84, 88, 80,
+  84, 72, 89, 81, 91, 70, 82, 79, 75, 86,
+  73, 80, 75, 75, 80, 84, 76, 82, 91, 75,
+  65, 83, 68, 79, 91, 79, 70, 85, 88, 67,
+  95, 83, 82, 87, 82, 78, 101, 74, 87, 79,
+  69, 85, 79, 80, 90, 103, 79, 92, 81, 78,
+  93, 87, 93, 109, 90, 84, 89, 79, 73, 87,
+  77, 79, 94, 85, 94, 85, 85, 79, 89, 76,
+  87, 75, 84, 77, 76, 82, 88, 88, 85, 70,
+  64, 83, 75, 74, 82, 82, 91, 84, 85, 71,
+  68, 89, 67, 78, 84, 103, 85, 78, 77, 73,
+  87, 71, 71, 71, 81, 78, 91, 90, 64, 93,
+  76, 82, 86, 86, 77, 74, 90, 75, 79, 74,
+  79, 88, 83, 82, 55, 72, 83, 85, 81, 74,
+  86, 88, 84, 66, 83, 83, 80, 80, 84, 89,
+  97, 75, 83, 81, 89, 66, 90, 75, 66, 85,
+  75, 74, 86, 88, 81, 76, 87, 88, 88, 87,
+  93, 81, 93, 76, 90, 78, 82, 80, 81, 91,
+  90, 85, 90, 84, 84, 84, 73, 87, 69, 84,
+  83, 85, 85, 81, 82, 77, 79, 90, 81, 93,
+  95, 81, 75, 81, 87, 97, 83, 80, 78, 76,
+  88, 78, 82, 86, 91, 93, 95, 91, 90, 78,
+  81, 81, 76, 79, 79, 72, 92, 80, 80, 72,
+  85, 78, 93, 80, 86, 81, 85, 84, 73, 82,
+  76, 94, 96, 97, 80, 81, 79, 82, 88, 77,
+  102, 84, 85, 72, 79, 82, 89, 92, 89, 75,
+  75, 85, 72, 66, 72, 80, 91, 79, 81, 95,
+  90, 86, 75, 81, 87, 78, 82, 84, 93, 85,
+  82, 78, 86, 79, 88, 88, 96, 84, 87, 77,
+  94, 88, 89, 75, 111, 91, 92, 86, 86, 83,
+  90, 78, 93, 78, 75, 83, 76, 84, 93, 101,
+  87, 104, 74, 93, 77, 78, 77, 87, 85, 70,
+  90, 89, 88, 93, 76, 73, 79, 90, 74, 93,
+  91, 68, 71, 100, 86, 89, 79, 82, 77, 71,
+  91, 110, 90, 93, 88, 94, 84, 92, 94, 69,
+  74, 80, 68, 85, 99, 90, 84, 82, 77, 83,
+  89, 58, 93, 79, 79, 88, 70, 73, 88, 78,
+  96, 95, 65, 76, 80, 91, 88, 70, 80, 90,
+  87, 83, 89, 78, 84, 80, 84, 78, 86, 88,
+  76, 97, 68, 76, 92, 100, 91, 90, 90, 89,
+  77, 75, 82, 89, 94, 78, 84, 84, 82, 84,
+  83, 81, 84, 90, 119, 92, 81, 71, 89, 96,
+  85, 75, 105, 75, 92, 86, 85, 85, 92, 78,
+  99, 83, 86, 86, 77, 88, 92, 96, 72, 103,
+  80, 92, 84, 78, 82, 85, 81, 90, 88, 92,
+  86, 80, 73, 78, 85, 87, 93, 98, 92, 73,
+  80, 95, 83, 84, 88, 68, 72, 77, 90, 105,
+  90, 91, 88, 81, 88, 91, 96, 77, 73, 83,
+  70, 86, 93, 98, 82, 77, 82, 90, 88, 63,
+  95, 75, 81, 84, 74, 81, 76, 72, 95, 96,
+  77, 92, 79, 94, 78, 69, 84, 91, 83, 79,
+  88, 82, 77, 79, 88, 77, 82, 87, 79, 95,
+  70, 79, 86, 93, 84, 88, 89, 90, 80, 76,
+  85, 84, 100, 82, 103, 84, 89, 83, 83, 82,
+  79, 88, 111, 93, 85, 77, 88, 92, 92, 78,
+  86, 83, 83, 87, 82, 89, 91, 76, 88, 87,
+  85, 82, 83, 84, 85, 90, 82, 80, 87, 91,
+  81, 86, 72, 80, 79, 92, 82, 88, 83, 77,
+  82, 79, 86, 89, 99, 74, 87, 76, 84, 96,
+  88, 88, 78, 76, 76, 75, 89, 90, 88, 85,
+  89, 93, 96, 92, 83, 87, 81, 79, 74, 85,
+  96, 85, 81, 84, 82, 86, 87, 71, 83, 81,
+  88, 85, 75, 82, 81, 90, 94, 101, 77, 79,
+  81, 91, 85, 72, 91, 96, 86, 79, 87, 85,
+  81, 92, 93, 80, 74, 78, 88, 82, 78, 76,
+  90, 80, 82, 82, 85, 91, 80, 77, 87, 81,
+  90, 83, 100, 90, 83, 84, 90, 77, 68, 98,
+  104, 85, 82, 84, 85, 89, 77, 84, 79, 95,
+  97, 78, 79, 81, 84, 78, 93, 86, 76, 96,
+  76, 100, 101, 94, 83, 102, 79, 74, 83, 102,
+  71, 80, 92, 78, 79, 86, 84, 84, 75, 81,
+  77, 94, 97, 92, 85, 79, 91, 83, 62, 94,
+  83, 83, 85, 83, 81, 80, 80, 77, 95, 76,
+  86, 74, 86, 88, 96, 82, 81, 84, 73, 82,
+  96, 83, 75, 85, 84, 91, 85, 68, 87, 93,
+  87, 76, 74, 86, 85, 83, 87, 80, 86, 100,
+  85, 72, 76, 80, 108, 97, 90, 92, 82, 86,
+  88, 73, 89, 89, 84, 71, 90, 80, 83, 86,
+  87, 86, 77, 85, 84, 79, 91, 90, 68, 99,
+  72, 86, 96, 91, 75, 78, 97, 73, 82, 81,
+  98, 77, 58, 92, 74, 79, 74, 79, 81, 83,
+  93, 81, 78, 82, 87, 74, 65, 97, 76, 99,
+  92, 96, 93, 81, 88, 76, 77, 89, 78, 80,
+  85, 69, 69, 86, 74, 87, 71, 82, 69, 100,
+  75, 74, 105, 61, 78, 87, 72, 94, 70, 72,
+  77, 82, 79, 81, 81, 68, 88, 63, 79, 60,
+  92, 89, 105, 79, 86, 75, 74, 62, 84, 82,
+  70, 105, 74, 73, 100, 74, 82, 95, 84, 84,
+  77, 62, 82, 88, 75, 90, 74, 98, 91, 66,
+  69, 80, 109, 114, 95, 82, 104, 74, 84, 80,
+  72, 90, 103, 87, 72, 83, 65, 83, 72, 86,
+  68, 91, 79, 76, 88, 92, 67, 86, 77, 75,
+  78, 84, 85, 76, 83, 66, 83, 85, 96, 70,
+  85, 82, 86, 78, 78, 77, 95, 84, 78, 85,
+  83, 78, 88, 91, 84, 96, 77, 98, 96, 101,
+  97, 97, 96, 77, 83, 103, 77, 80, 82, 72,
+  88, 85, 84, 93, 76, 85, 83, 99, 80, 92,
+  90, 85, 76, 85, 59, 93, 81, 80, 87, 82,
+  74, 84, 78, 73, 94, 73, 80, 73, 87, 85,
+  89, 77, 78, 84, 66, 86, 88, 79, 86, 75,
+  79, 83, 89, 74, 88, 90, 88, 81, 91, 86,
+  80, 83, 91, 83, 83, 92, 92, 81, 84, 79,
+  112, 86, 91, 90, 84, 84, 91, 79, 91, 94,
+  84, 84, 90, 80, 78, 82, 77, 84, 76, 83,
+  91, 79, 90, 84, 76, 90, 80, 83, 96, 88,
+  82, 75, 94, 74, 83, 83, 99, 84, 99, 78,
+  82, 87, 74, 80, 72, 73, 75, 83, 80, 70,
+  75, 77, 79, 92, 77, 83, 85, 100, 78, 96,
+  105, 78, 84, 80, 81, 84, 94, 71, 90, 87,
+  78, 67, 87, 80, 90, 80, 108, 66, 88, 81,
+  80, 84, 89, 88, 88, 71, 80, 79, 91, 91,
+  90, 67, 84, 102, 82, 85, 95, 79, 88, 83,
+  93, 73, 71, 61, 87, 76, 76, 81, 87, 94,
+  86, 92, 85, 70, 98, 95, 67, 81, 90, 69,
+  79, 88, 62, 87, 80, 86, 89, 77, 80, 93,
+  86, 75, 92, 80, 87, 78, 83, 74, 90, 70,
+  97, 82, 78, 83, 87, 80, 76, 83, 71, 93,
+  85, 87, 84, 103, 76, 76, 62, 89, 94, 80,
+  72, 83, 82, 77, 75, 81, 157, 85, 90, 92,
+  68, 72, 74, 69, 87, 85, 80, 82, 127, 115,
+  79, 76, 88, 62, 94, 76, 70, 135, 78, 74,
+  81, 67, 88, 89, 95, 77, 111, 97, 83, 71,
+  93, 68, 106, 60, 123, 68, 68, 106, 82, 93,
+  113, 51, 96, 81, 67, 83, 97, 141, 89, 69,
+  96, 124, 58, 101, 113, 61, 98, 57, 103, 88,
+  42, 107, 76, 65, 66, 58, 88, 88, 47, 88,
+  82, 52, 105, 84, 72, 86, 93, 77, 78, 75,
+  60, 64, 71, 102, 139, 67, 58, 76, 89, 60,
+  69, 71, 105, 90, 89, 82, 86, 102, 113, 84,
+  79, 77, 71, 85, 92, 84, 96, 81, 98, 76,
+  109, 112, 62, 74, 64, 77, 97, 75, 72, 95,
+  101, 60, 75, 100, 87, 74, 82, 88, 79, 105,
+  71, 78, 81, 85, 76, 72, 68, 101, 78, 94,
+  82, 82, 80, 94, 82, 89, 89, 81, 75, 83,
+  84, 82, 87, 80, 95, 91, 76, 90, 80, 85,
+  99, 81, 70, 73, 93, 88, 81, 87, 86, 87,
+  84, 96, 85, 78, 88, 81, 93, 68, 92, 77,
+  75, 82, 90, 78, 85, 89, 95, 71, 64, 58,
+  73, 73, 84, 66, 75, 88, 83, 94, 86, 73,
+  88, 69, 85, 83, 88, 71, 84, 104, 65, 75,
+  91, 81, 91, 84, 81, 102, 91, 75, 89, 82,
+  90, 80, 81, 78, 89, 105, 92, 83, 78, 73,
+  78, 83, 77, 89, 83, 96, 85, 89, 87, 87,
+  86, 79, 67, 87, 79, 76, 80, 81, 83, 78,
+  81, 83, 88, 89, 81, 88, 70, 85, 80, 79,
+  82, 85, 76, 76, 74, 87, 82, 89, 82, 84,
+  85, 98, 69, 98, 85, 80, 83, 87, 98, 90,
+  91, 81, 92, 87, 73, 78, 101, 82, 74, 95,
+  73, 76, 92, 98, 84, 80, 75, 92, 88, 76,
+  81, 79, 108, 83, 90, 73, 77, 53, 83, 77,
+  87, 86, 74, 100, 91, 78, 83, 68, 82, 82,
+  91, 67, 78, 97, 93, 90, 87, 76, 95, 90,
+  86, 81, 87, 74, 84, 81, 70, 87, 89, 91,
+  84, 80, 89, 90, 82, 69, 93, 79, 73, 67,
+  70, 83, 85, 79, 88, 82, 86, 101, 91, 84,
+  67, 77, 85, 85, 76, 96, 87, 103, 71, 75,
+  78, 84, 83, 80, 86, 78, 84, 85, 75, 71,
+  111, 91, 84, 99, 63, 73, 77, 80, 99, 84,
+  84, 87, 120, 101, 81, 81, 98, 72, 87, 84,
+  73, 105, 78, 81, 73, 72, 112, 90, 88, 97,
+  75, 90, 87, 75, 97, 81, 81, 86, 106, 70,
+  92, 105, 76, 77, 83, 66, 82, 79, 76, 86,
+  114, 96, 95, 70, 69, 91, 67, 73, 90, 74,
+  66, 88, 98, 86, 72, 94, 83, 58, 93, 61,
+  84, 91, 83, 91, 69, 58, 88, 86, 83, 89,
+  91, 79, 83, 83, 74, 90, 84, 91, 97, 59,
+  66, 86, 86, 55, 85, 82, 80, 73, 76, 92,
+  85, 83, 93, 81, 66, 101, 80, 88, 61, 72,
+  80, 56, 75, 84, 76, 99, 86, 71, 70, 80,
+  79, 78, 89, 88, 90, 79, 63, 76, 79, 79,
+  67, 88, 77, 88, 84, 81, 92, 90, 76, 82,
+  82, 87, 78, 98, 84, 90, 88, 93, 89, 85,
+  89, 80, 74, 91, 96, 92, 86, 102, 85, 84,
+  73, 87, 85, 91, 82, 94, 87, 79, 94, 90,
+  78, 84, 78, 81, 80, 87, 86, 82, 99, 82,
+  97, 76, 86, 92, 83, 81, 84, 86, 76, 99,
+  98, 76, 74, 76, 86, 83, 88, 74, 72, 99,
+  94, 96, 80, 82, 85, 66, 85, 76, 87, 75,
+  84, 103, 76, 86, 90, 78, 78, 82, 90, 92,
+  85, 68, 87, 80, 80, 69, 93, 81, 85, 93,
+  94, 82, 86, 99, 79, 83, 64, 78, 66, 89,
+  78, 89, 71, 86, 104, 79, 76, 87, 84, 84,
+  92, 79, 80, 88, 83, 70, 86, 79, 81, 71,
+  83, 89, 98, 92, 78, 85, 86, 87, 88, 71,
+  78, 75, 79, 79, 74, 90, 78, 98, 91, 76,
+  74, 99, 89, 83, 91, 87, 90, 84, 82, 84,
+  78, 88, 92, 87, 78, 83, 85, 70, 92, 76,
+  83, 79, 81, 83, 81, 78, 101, 83, 83, 81,
+  80, 74, 101, 83, 78, 108, 91, 81, 77, 78,
+  92, 84, 83, 79, 71, 85, 83, 82, 89, 76,
+  71, 80, 85, 84, 88, 87, 87, 124, 81, 81,
+  79, 81, 81, 90, 79, 80, 83, 80, 76, 71,
+  81, 75, 80, 92, 82, 81, 102, 88, 75, 79,
+  84, 78, 100, 93, 82, 84, 76, 69, 81, 87,
+  84, 73, 90, 75, 80, 83, 95, 84, 78, 77,
+  79, 86, 78, 78, 82, 83, 71, 75, 86, 80,
+  94, 83, 78, 84, 88, 93, 82, 76, 75, 75,
+  80, 80, 79, 86, 81, 92, 85, 76, 76, 93,
+  87, 85, 87, 88, 87, 86, 79, 83, 79, 88,
+  89, 83, 73, 82, 86, 69, 84, 77, 84, 79,
+  84, 80, 83, 76, 98, 76, 79, 82, 79, 76,
+  103, 84, 72, 103, 90, 87, 80, 75, 91, 82,
+  83, 81, 73, 87, 80, 80, 88, 73, 74, 78,
+  87, 82, 92, 84, 88, 125, 81, 81, 83, 76,
+  82, 89, 82, 83, 83, 83, 73, 68, 84, 76,
+  79, 91, 80, 81, 103, 83, 76, 82, 85, 76,
+  102, 94, 86, 84, 76, 67, 85, 83, 81, 72,
+  81, 76, 80, 82, 84, 82, 73, 77, 77, 83,
+  76, 76, 92, 89, 78, 77, 91, 83, 91, 84,
+  82, 87, 86, 83, 88, 79, 80, 81, 79, 83,
+  75, 89, 86, 97, 89, 79, 75, 102, 91, 84,
+  83, 85, 89, 87, 82, 85, 85, 91, 87, 87,
+  76, 79, 85, 71, 79, 72, 80, 78, 83, 85,
+  85, 79, 101, 83, 81, 83, 83, 81, 99, 91,
+  83, 100, 92, 84, 77, 76, 93, 85, 87, 78,
+  76, 86, 89, 85, 86, 79, 75, 80, 86, 86,
+  90, 88, 89, 102, 79, 88, 85, 82, 89, 98,
+  80, 85, 83, 90, 81, 76, 84, 75, 84, 88,
+  77, 79, 101, 82, 79, 79, 85, 83, 99, 94,
+  85, 88, 77, 75, 80, 83, 87, 77, 79, 80,
+  84, 86, 81, 84, 78, 81, 74, 84, 80, 82,
+  81, 84, 80, 74, 67, 90, 115, 94, 65, 87,
+  88, 84, 88, 75, 84, 81, 87, 74, 84, 89,
+  74, 88, 87, 69, 85, 96, 84, 88, 95, 95,
+  88, 84, 88, 88, 82, 80, 91, 88, 81, 75,
+  78, 75, 87, 88, 85, 84, 86, 89, 76, 73,
+  100, 71, 78, 80, 69, 75, 91, 76, 71, 121,
+  89, 78, 86, 79, 82, 79, 79, 78, 81, 77,
+  88, 75, 103, 80, 74, 77, 80, 80, 91, 101,
+  82, 171, 84, 71, 87, 78, 81, 88, 70, 70,
+  83, 83, 76, 67, 84, 87, 79, 85, 88, 91,
+  84, 91, 72, 83, 82, 77, 90, 85, 74, 78,
+  85, 70, 95, 87, 67, 63, 85, 84, 83, 82,
+  90, 74, 85, 70, 78, 81, 78, 73, 75, 87,
+  74, 78, 69, 79, 116, 83, 62, 86, 90, 87,
+  81, 79, 81, 85, 90, 75, 86, 86, 78, 84,
+  81, 70, 93, 90, 83, 91, 97, 92, 89, 84,
+  89, 85, 86, 80, 84, 86, 77, 70, 78, 75,
+  80, 85, 87, 82, 94, 84, 80, 71, 100, 67,
+  77, 79, 65, 75, 91, 73, 64, 127, 86, 80,
+  88, 73, 79, 77, 81, 81, 85, 75, 79, 75,
+  99, 76, 80, 78, 81, 85, 92, 96, 82, 180,
+  90, 75, 95, 76, 82, 84, 75, 73, 88, 77,
+  71, 67, 83, 89, 77, 83, 88, 91, 84, 74,
+  72, 86, 81, 72, 92, 86, 82, 75, 84, 66,
+  103, 80, 65, 64, 75, 87, 83, 82, 79, 75,
+  83, 70, 75, 78, 75, 72, 89, 89, 85, 79,
+  75, 86, 105, 83, 67, 89, 85, 81, 87, 82,
+  85, 87, 88, 77, 87, 84, 84, 92, 91, 77,
+  84, 96, 86, 88, 86, 85, 90, 85, 89, 82,
+  99, 86, 85, 87, 75, 73, 83, 77, 76, 80,
+  86, 83, 88, 80, 80, 75, 103, 76, 76, 79,
+  75, 80, 89, 84, 79, 106, 87, 81, 88, 75,
+  83, 82, 84, 75, 83, 85, 82, 78, 96, 80,
+  75, 76, 81, 92, 92, 100, 86, 142, 83, 84,
+  91, 83, 89, 90, 75, 79, 85, 81, 81, 69,
+  84, 86, 84, 82, 84, 89, 85, 69, 75, 82,
+  85, 83, 91, 87, 77, 84, 85, 75, 93, 81,
+  76, 75, 79, 85, 84, 87, 79, 77, 82, 74,
+  75, 80, 80, 79, 82, 77, 81, 82, 74, 90,
+  109, 96, 70, 89, 89, 78, 93, 72, 82, 83,
+  89, 72, 87, 88, 75, 90, 88, 76, 84, 91,
+  92, 89, 91, 92, 86, 77, 85, 87, 80, 79,
+  85, 90, 78, 80, 83, 74, 83, 84, 84, 88,
+  80, 87, 73, 75, 95, 74, 73, 80, 72, 76,
+  82, 79, 85, 107, 80, 78, 85, 78, 87, 84,
+  78, 73, 76, 84, 93, 80, 105, 85, 73, 77,
+  77, 82, 79, 98, 76, 139, 83, 74, 84, 81,
+  81, 91, 74, 71, 74, 89, 80, 70, 91, 83,
+  78, 82, 75, 90, 82, 94, 69, 84, 87, 83,
+  93, 76, 73, 83, 92, 76, 87, 89, 68, 68,
+  85, 84, 80, 78, 83, 79, 83, 74, 78, 89,
+  78, 80, 73, 80, 75, 83, 75, 82, 108, 90,
+  67, 89, 93, 81, 84, 79, 84, 88, 93, 72,
+  87, 83, 80, 86, 83, 76, 87, 85, 89, 92,
+  94, 85, 87, 78, 87, 87, 84, 77, 77, 92,
+  74, 76, 83, 72, 77, 86, 84, 86, 82, 85,
+  74, 74, 97, 72, 68, 80, 66, 78, 83, 76,
+  78, 109, 74, 78, 84, 74, 86, 79, 83, 74,
+  84, 84, 83, 79, 103, 84, 77, 81, 77, 85,
+  74, 96, 75, 150, 86, 78, 87, 81, 80, 87,
+  80, 72, 80, 85, 74, 73, 94, 87, 74, 82,
+  77, 91, 81, 81, 69, 85, 86, 81, 96, 77,
+  74, 79, 93, 70, 94, 81, 64, 75, 80, 84,
+  78, 74, 74, 80, 83, 74, 76, 86, 76, 77,
+  92, 85, 86, 84, 78, 89, 101, 87, 72, 90,
+  85, 79, 91, 85, 83, 87, 90, 71, 87, 84,
+  86, 96, 91, 80, 77, 89, 90, 87, 83, 78,
+  91, 81, 87, 83, 96, 88, 83, 91, 75, 78,
+  87, 75, 78, 80, 85, 86, 80, 83, 78, 77,
+  99, 80, 70, 81, 78, 81, 83, 87, 90, 96,
+  80, 81, 88, 76, 89, 87, 81, 75, 80, 91,
+  82, 79, 94, 83, 71, 78, 79, 88, 82, 98,
+  79, 119, 84, 83, 86, 87, 87, 91, 76, 76,
+  75, 80, 84, 72, 91, 81, 82, 80, 78, 87,
+  83, 73, 74, 82, 88, 88, 92, 80, 76, 83,
+  95, 80, 83, 81, 80, 82, 86, 85, 81, 83,
+  81, 82, 81, 75, 76, 90, 80, 85, 79, 83,
+  99, 85, 77, 94, 79, 72, 84, 100, 83, 80,
+  79, 72, 89, 92, 79, 96, 67, 82, 76, 85,
+  85, 97, 81, 77, 80, 78, 87, 91, 85, 92,
+  75, 86, 95, 94, 95, 88, 81, 93, 74, 91,
+  78, 76, 84, 69, 86, 67, 64, 84, 82, 78,
+  101, 76, 83, 83, 87, 86, 62, 97, 88, 96,
+  78, 83, 94, 83, 80, 82, 86, 92, 80, 93,
+  88, 93, 85, 87, 95, 97, 78, 86, 91, 84,
+  76, 85, 66, 90, 85, 69, 86, 76, 80, 84,
+  104, 90, 81, 77, 86, 75, 80, 78, 78, 97,
+  85, 87, 87, 91, 78, 85, 69, 109, 76, 93,
+  78, 88, 86, 91, 77, 68, 91, 85, 85, 85,
+  67, 81, 77, 98, 84, 79, 87, 79, 89, 89,
+  80, 85, 87, 70, 79, 108, 79, 78, 90, 76,
+  92, 81, 84, 103, 66, 72, 82, 78, 77, 93,
+  84, 81, 78, 71, 102, 89, 93, 83, 68, 91,
+  96, 82, 89, 81, 76, 95, 72, 96, 79, 83,
+  81, 74, 103, 77, 62, 83, 78, 79, 109, 68,
+  83, 84, 87, 81, 63, 94, 91, 96, 75, 94,
+  83, 79, 80, 84, 87, 90, 87, 93, 82, 90,
+  88, 83, 90, 87, 83, 84, 87, 84, 79, 78,
+  70, 78, 86, 76, 74, 89, 69, 80, 95, 97,
+  83, 84, 79, 73, 91, 65, 73, 89, 81, 85,
+  75, 86, 84, 82, 66, 102, 73, 95, 85, 88,
+  80, 92, 83, 73, 94, 75, 83, 86, 67, 85,
+  81, 105, 81, 72, 76, 75, 80, 90, 84, 88,
+  82, 72, 91, 100, 87, 77, 84, 79, 83, 91,
+  82, 97, 72, 77, 78, 83, 88, 96, 79, 75,
+  74, 83, 85, 91, 90, 82, 73, 95, 96, 79,
+  96, 93, 72, 90, 79, 93, 78, 78, 87, 76,
+  89, 94, 64, 81, 84, 80, 102, 82, 81, 86,
+  89, 82, 63, 98, 84, 93, 79, 85, 92, 82,
+  80, 86, 87, 88, 81, 93, 89, 85, 87, 93,
+  100, 88, 84, 85, 87, 83, 71, 76, 68, 80,
+  86, 77, 85, 76, 77, 94, 100, 96, 95, 79,
+  87, 75, 80, 76, 82, 92, 82, 85, 86, 91,
+  76, 88, 68, 97, 74, 92, 78, 93, 81, 88,
+  90, 69, 90, 81, 80, 85, 70, 82, 81, 93,
+  83, 82, 86, 79, 89, 73, 80, 94, 88, 76,
+  81, 96, 83, 77, 81, 76, 91, 90, 82, 91,
+  52, 82, 72, 79, 80, 97, 79, 85, 75, 69,
+  103, 88, 94, 94, 68, 91, 90, 98, 91, 73,
+  80, 83, 77, 88, 91, 77, 82, 71, 79, 72,
+  66, 73, 79, 80, 100, 70, 88, 80, 92, 86,
+  71, 105, 87, 92, 85, 79, 89, 71, 81, 82,
+  72, 89, 86, 93, 93, 95, 84, 89, 79, 83,
+  77, 81, 88, 83, 73, 88, 74, 90, 91, 74,
+  80, 77, 75, 84, 108, 95, 74, 83, 81, 79,
+  73, 63, 68, 98, 83, 93, 70, 86, 79, 86,
+  85, 115, 80, 84, 84, 81, 85, 88, 75, 67,
+  97, 80, 83, 82, 68, 93, 74, 88, 84, 69,
+  93, 79, 68, 75, 79, 74, 95, 73, 83, 108,
+  83, 77, 92, 75, 104, 91, 93, 96, 48, 70,
+  83, 69, 82, 92, 88, 87, 70, 66, 112, 91,
+  101, 78, 71, 91, 94, 82, 79, 63, 75, 93,
+  72, 86, 80, 76, 79, 68, 98, 72, 60, 84,
+  75, 73, 104, 64, 85, 73, 90, 88, 72, 110,
+  86, 88, 82, 93, 75, 71, 86, 96, 68, 78,
+  72, 99, 98, 96, 84, 94, 78, 81, 75, 81,
+  95, 81, 69, 84, 71, 84, 84, 78, 73, 95,
+  67, 75, 98, 91, 78, 87, 73, 78, 93, 47,
+  66, 85, 77, 91, 55, 80, 90, 80, 84, 134,
+  79, 89, 93, 85, 68, 92, 79, 68, 107, 70,
+  84, 82, 76, 109, 81, 89, 83, 69, 88, 76,
+  76, 79, 82, 75, 87, 73, 86, 96, 84, 75,
+  80, 86, 90, 92, 85, 89, 57, 80, 90, 79,
+  94, 92, 77, 80, 71, 74, 99, 97, 91, 82,
+  67, 88, 93, 86, 85, 78, 80, 85, 81, 86,
+  69, 78, 81, 73, 82, 85, 67, 71, 83, 80,
+  95, 74, 83, 83, 93, 83, 74, 103, 80, 92,
+  92, 79, 97, 76, 84, 92, 75, 88, 86, 92,
+  94, 82, 85, 89, 86, 92, 82, 81, 81, 78,
+  74, 80, 77, 86, 83, 80, 80, 81, 72, 81,
+  93, 95, 88, 86, 81, 80, 86, 63, 74, 88,
+  81, 90, 68, 91, 77, 89, 82, 104, 80, 89,
+  84, 99, 78, 90, 98, 67, 96, 77, 80, 81,
+  66, 86, 81, 87, 84, 72, 81, 84, 78, 70,
+  95, 91, 81, 74, 83, 89, 85, 78, 87, 81,
+  83, 83, 76, 90, 70, 86, 75, 85, 80, 102,
+  84, 83, 84, 73, 84, 89, 84, 95, 73, 90,
+  92, 93, 91, 70, 76, 91, 91, 79, 100, 83,
+  80, 80, 82, 76, 70, 82, 74, 82, 100, 79,
+  84, 86, 95, 80, 67, 93, 87, 99, 92, 84,
+  90, 78, 86, 81, 69, 84, 86, 87, 100, 102,
+  88, 83, 86, 85, 93, 74, 89, 83, 80, 88,
+  70, 88, 88, 76, 94, 78, 76, 91, 97, 94,
+  71, 89, 90, 73, 72, 66, 74, 98, 91, 90,
+  81, 80, 83, 93, 96, 112, 86, 93, 78, 78,
+  76, 89, 81, 67, 91, 92, 81, 82, 67, 88,
+  78, 91, 86, 82, 95, 79, 70, 67, 86, 75,
+  81, 69, 82, 100, 83, 74, 91, 78, 92, 85,
+  76, 90, 57, 79, 82, 77, 82, 97, 83, 84,
+  76, 69, 94, 95, 89, 89, 74, 93, 85, 84,
+  83, 57, 77, 94, 101, 76, 94, 80, 86, 72,
+  84, 79, 70, 87, 72, 78, 101, 71, 79, 83,
+  89, 82, 70, 99, 83, 88, 97, 95, 82, 77,
+  86, 85, 62, 82, 79, 94, 100, 107, 85, 86,
+  85, 83, 85, 70, 99, 76, 72, 85, 72, 88,
+  84, 82, 84, 86, 70, 80, 104, 89, 74, 90,
+  82, 75, 82, 52, 71, 98, 89, 89, 74, 79,
+  85, 84, 88, 123, 93, 94, 82, 83, 74, 87,
+  91, 72, 93, 83, 82, 82, 67, 100, 81, 90,
+  82, 75, 88, 76, 70, 74, 89, 82, 78, 71,
+  87, 91, 85, 78, 86, 80, 81, 84, 72, 86,
+  74, 86, 89, 85, 95, 99, 77, 74, 75, 75,
+  79, 104, 88, 97, 73, 84, 84, 84, 83, 69,
+  86, 92, 101, 77, 70, 80, 79, 79, 83, 89,
+  70, 83, 79, 91, 94, 83, 79, 78, 90, 81,
+  73, 88, 79, 98, 96, 85, 94, 82, 89, 87,
+  68, 84, 78, 86, 93, 93, 87, 87, 89, 87,
+  89, 70, 88, 78, 80, 77, 74, 89, 79, 85,
+  96, 81, 76, 78, 94, 86, 84, 82, 89, 72,
+  81, 66, 74, 98, 90, 87, 77, 85, 76, 94,
+  91, 107, 92, 88, 78, 91, 85, 90, 101, 65,
+  89, 87, 91, 84, 66, 83, 85, 90, 86, 82,
+  84, 82, 84, 79, 93, 86, 91, 77, 72, 83,
+  74, 104, 81, 92, 88, 94, 89, 75, 80, 86,
+  92, 74, 78, 85, 95, 73, 102, 75, 105, 86,
+  95, 69, 77, 95, 85, 99, 82, 69, 92, 87,
+  82, 76, 78, 88, 78, 97, 78, 80, 86, 79,
+  78, 75, 91, 76, 95, 94, 77, 77, 76, 91,
+  89, 90, 105, 75, 73, 67, 85, 83, 87, 75,
+  93, 81, 83, 92, 86, 67, 82, 83, 89, 74,
+  93, 90, 97, 76, 75, 112, 88, 75, 83, 87,
+  78, 84, 79, 97, 76, 74, 85, 82, 74, 84,
+  57, 92, 75, 72, 86, 72, 84, 80, 84, 68,
+  86, 94, 72, 81, 89, 94, 73, 90, 79, 76,
+  99, 77, 74, 68, 77, 77, 77, 89, 72, 83,
+  59, 81, 98, 77, 86, 68, 66, 76, 72, 88,
+  76, 103, 88, 95, 83, 84, 74, 76, 86, 71,
+  70, 82, 98, 80, 87, 67, 101, 92, 96, 68,
+  82, 98, 90, 76, 81, 68, 78, 92, 82, 73,
+  88, 89, 84, 86, 75, 87, 83, 84, 83, 82,
+  95, 95, 91, 86, 77, 74, 84, 92, 93, 93,
+  96, 81, 69, 74, 86, 87, 90, 68, 74, 65,
+  82, 81, 88, 76, 79, 82, 89, 78, 91, 94,
+  95, 68, 85, 110, 92, 69, 90, 94, 81, 85,
+  74, 103, 72, 84, 86, 94, 76, 87, 61, 82,
+  63, 74, 87, 71, 80, 75, 88, 75, 91, 89,
+  70, 80, 82, 78, 75, 87, 72, 83, 99, 75,
+  67, 58, 78, 67, 74, 93, 75, 84, 71, 95,
+  87, 80, 83, 70, 77, 79, 76, 94, 77, 101,
+  86, 88, 92, 85, 78, 80, 80, 83, 74, 74,
+  99, 84, 89, 73, 93, 94, 96, 76, 90, 91,
+  88, 74, 86, 82, 75, 86, 86, 90, 79, 96,
+  85, 81, 74, 100, 78, 84, 84, 84, 98, 98,
+  98, 82, 78, 75, 92, 79, 90, 90, 93, 76,
+  81, 82, 91, 87, 92, 83, 77, 72, 81, 76,
+  91, 74, 86, 76, 75, 82, 95, 92, 91, 76,
+  86, 107, 96, 80, 82, 91, 83, 88, 77, 104,
+  75, 89, 94, 94, 87, 97, 67, 82, 70, 77,
+  90, 78, 83, 81, 87, 72, 88, 89, 71, 74,
+  89, 79, 88, 84, 77, 76, 98, 78, 73, 63,
+  81, 63, 77, 92, 87, 85, 87, 84, 84, 86,
+  69, 86, 83, 94, 80, 97, 81, 69, 67, 89,
+  90, 77, 92, 97, 85, 80, 81, 85, 74, 67,
+  107, 95, 100, 78, 98, 74, 73, 88, 80, 100,
+  79, 71, 83, 77, 87, 69, 71, 73, 71, 90,
+  76, 85, 97, 79, 79, 73, 81, 72, 97, 88,
+  81, 76, 77, 87, 77, 88, 94, 76, 78, 67,
+  89, 85, 75, 93, 77, 78, 84, 99, 93, 83,
+  89, 78, 84, 68, 83, 77, 81, 81, 69, 92,
+  85, 80, 69, 74, 79, 92, 76, 88, 82, 73,
+  88, 76, 74, 84, 62, 122, 86, 79, 94, 85,
+  87, 91, 78, 74, 70, 81, 94, 86, 104, 96,
+  83, 96, 91, 63, 86, 84, 67, 91, 83, 92,
+  80, 85, 80, 86, 62, 76, 92, 79, 65, 73,
+  62, 82, 76, 85, 84, 78, 80, 95, 81, 78,
+  82, 81, 87, 66, 66, 86, 83, 65, 109, 78,
+  104, 76, 104, 71, 72, 88, 82, 92, 73, 61,
+  79, 80, 82, 64, 98, 76, 71, 107, 71, 86,
+  93, 80, 81, 74, 87, 74, 85, 96, 77, 71,
+  77, 87, 74, 92, 87, 75, 75, 60, 98, 81,
+  74, 67, 89, 68, 81, 104, 83, 73, 82, 85,
+  91, 75, 87, 87, 99, 75, 72, 95, 90, 64,
+  76, 82, 67, 89, 67, 105, 75, 74, 75, 80,
+  69, 81, 56, 110, 73, 77, 92, 79, 79, 78,
+  74, 75, 80, 89, 85, 82, 89, 88, 73, 87,
+  80, 73, 85, 86, 64, 71, 79, 91, 75, 87,
+  74, 86, 64, 89, 82, 74, 72, 69, 70, 83,
+  79, 86, 86, 91, 79, 100, 80, 83, 89, 83,
+  88, 76, 80, 91, 97, 72, 109, 76, 90, 85,
+  102, 73, 86, 93, 83, 88, 70, 69, 77, 82,
+  79, 76, 91, 84, 76, 90, 72, 89, 91, 86,
+  87, 77, 99, 80, 81, 86, 78, 73, 77, 85,
+  78, 89, 84, 74, 79, 65, 116, 79, 75, 78,
+  71, 72, 79, 89, 83, 75, 85, 90, 86, 81,
+  94, 91, 105, 89, 81, 93, 95, 71, 77, 90,
+  75, 82, 74, 107, 71, 79, 80, 80, 70, 87,
+  60, 80, 66, 79, 91, 75, 77, 82, 80, 79,
+  79, 93, 80, 85, 91, 87, 93, 82, 74, 72,
+  78, 82, 63, 62, 82, 85, 76, 89, 85, 88,
+  92, 79, 64, 87, 77, 90, 93, 77, 91, 90,
+  90, 61, 60, 70, 83, 86, 110, 97, 75, 97,
+  96, 82, 72, 83, 86, 106, 79, 78, 83, 86,
+  83, 79, 88, 106, 83, 84, 82, 87, 99, 72,
+  74, 86, 78, 87, 79, 77, 92, 81, 96, 84,
+  79, 78, 94, 77, 90, 94, 80, 84, 64, 72,
+  93, 85, 87, 98, 75, 94, 85, 97, 71, 92,
+  91, 87, 96, 102, 73, 77, 81, 79, 71, 86,
+  64, 94, 92, 95, 90, 97, 84, 75, 98, 79,
+  92, 74, 86, 79, 86, 90, 76, 80, 86, 92,
+  76, 85, 92, 93, 102, 105, 92, 103, 75, 76,
+  101, 79, 86, 91, 111, 94, 83, 76, 90, 87,
+  83, 99, 112, 73, 79, 89, 91, 95, 89, 74,
+  74, 87, 72, 88, 82, 82, 92, 87, 86, 74,
+  67, 77, 86, 84, 104, 93, 83, 101, 92, 80,
+  66, 67, 90, 100, 95, 83, 92, 98, 78, 80,
+  84, 121, 76, 84, 71, 82, 98, 60, 94, 82,
+  78, 93, 73, 87, 84, 75, 91, 79, 82, 82,
+  88, 83, 94, 91, 74, 76, 67, 83, 87, 87,
+  83, 95, 76, 92, 75, 78, 87, 88, 92, 100,
+  84, 99, 79, 87, 82, 69, 76, 80, 75, 91,
+  88, 103, 86, 89, 77, 74, 86, 71, 83, 83,
+  86, 90, 85, 93, 66, 79, 73, 111, 95, 78,
+  95, 85, 102, 94, 78, 93, 82, 83, 101, 78,
+  83, 94, 103, 95, 92, 91, 89, 92, 77, 94,
+  103, 74, 91, 83, 92, 97, 76, 84, 77, 83,
+  77, 76, 75, 81, 88, 79, 97, 78, 71, 81,
+  78, 78, 102, 90, 86, 96, 88, 92, 83, 71,
+  97, 85, 85, 89, 91, 91, 83, 89, 83, 114,
+  70, 82, 80, 91, 84, 66, 94, 81, 72, 95,
+  73, 89, 90, 83, 92, 80, 95, 81, 81, 90,
+  99, 83, 73, 79, 74, 84, 88, 88, 86, 92,
+  91, 82, 78, 79, 89, 92, 93, 97, 77, 94,
+  83, 85, 85, 74, 85, 80, 89, 103, 90, 99,
+  88, 86, 81, 86, 79, 74, 79, 99, 81, 87,
+  79, 88, 67, 82, 70, 100, 77, 77, 92, 89,
+  83, 92, 76, 96, 77, 93, 87, 86, 80, 91,
+  102, 86, 88, 87, 84, 92, 76, 73, 97, 80,
+  89, 76, 69, 101, 71, 96, 91, 77, 77, 75,
+  94, 84, 92, 86, 76, 96, 81, 100, 77, 85,
+  107, 86, 81, 81, 96, 91, 85, 75, 86, 87,
+  85, 77, 86, 101, 92, 90, 77, 80, 83, 88,
+  84, 64, 95, 74, 88, 94, 86, 95, 84, 83,
+  74, 80, 82, 80, 84, 102, 95, 87, 90, 75,
+  80, 92, 94, 94, 89, 83, 76, 79, 75, 86,
+  81, 90, 83, 72, 87, 90, 73, 95, 102, 74,
+  92, 82, 93, 90, 84, 97, 72, 83, 100, 74,
+  74, 89, 78, 100, 85, 72, 82, 87, 97, 75,
+  80, 91, 76, 99, 86, 84, 107, 73, 99, 84,
+  92, 84, 74, 90, 98, 69, 90, 106, 75, 88,
+  78, 107, 83, 96, 87, 87, 80, 97, 87, 87,
+  70, 93, 71, 87, 79, 85, 81, 80, 79, 84,
+  83, 95, 88, 75, 81, 91, 76, 74, 83, 79,
+  70, 89, 72, 85, 86, 85, 73, 78, 90, 86,
+  81, 99, 76, 106, 75, 91, 82, 80, 81, 93,
+  80, 87, 91, 92, 85, 73, 89, 95, 84, 85,
+  81, 86, 84, 84, 79, 96, 83, 79, 86, 89,
+  88, 86, 81, 79, 72, 85, 71, 84, 77, 79,
+  83, 83, 74, 75, 78, 82, 84, 73, 85, 86,
+  89, 89, 73, 94, 87, 77, 97, 84, 76, 85,
+  80, 86, 88, 78, 78, 87, 89, 80, 79, 76,
+  75, 97, 76, 88, 81, 80, 79, 87, 68, 77,
+  76, 82, 77, 83, 77, 78, 64, 87, 84, 81,
+  74, 86, 78, 83, 78, 82, 79, 71, 89, 83,
+  74, 82, 84, 80, 78, 88, 73, 84, 79, 92,
+  97, 84, 83, 74, 83, 71, 70, 72, 83, 81,
+  75, 83, 82, 95, 70, 82, 89, 96, 88, 83,
+  75, 92, 87, 96, 91, 77, 77, 95, 71, 95,
+  72, 85, 91, 77, 83, 92, 84, 91, 73, 84,
+  88, 73, 82, 86, 81, 96, 88, 78, 83, 77,
+  82, 81, 84, 88, 85, 87, 81, 88, 76, 85,
+  92, 76, 89, 75, 78, 87, 78, 100, 82, 85,
+  82, 94, 92, 74, 92, 91, 85, 85, 88, 85,
+  83, 87, 84, 75, 79, 89, 82, 78, 83, 84,
+  80, 88, 75, 83, 68, 89, 68, 82, 78, 81,
+  73, 79, 81, 78, 81, 85, 86, 71, 84, 77,
+  77, 86, 77, 87, 80, 78, 77, 100, 78, 111,
+  96, 85, 71, 84, 113, 105, 96, 80, 76, 92,
+  85, 98, 90, 94, 119, 87, 75, 92, 87, 84,
+  88, 68, 97, 101, 94, 87, 71, 107, 103, 74,
+  88, 84, 84, 124, 94, 54, 71, 85, 94, 91,
+  81, 106, 93, 70, 79, 81, 76, 90, 85, 102,
+  103, 83, 97, 59, 75, 80, 73, 92, 82, 77,
+  74, 75, 71, 82, 96, 93, 78, 71, 107, 86,
+  81, 94, 121, 80, 82, 83, 89, 87, 99, 114,
+  64, 76, 98, 78, 74, 81, 87, 79, 76, 82,
+  92, 83, 111, 77, 88, 84, 79, 74, 103, 85,
+  105, 89, 99, 86, 88, 84, 82, 96, 103, 66,
+  82, 95, 86, 97, 76, 99, 83, 96, 87, 99,
+  76, 78, 92, 83, 74, 88, 103, 85, 81, 94,
+  80, 80, 80, 92, 81, 88, 87, 86, 81, 82,
+  79, 80, 79, 81, 67, 93, 75, 82, 88, 86,
+  75, 77, 95, 93, 79, 102, 78, 98, 68, 87,
+  81, 84, 84, 92, 76, 88, 94, 95, 76, 83,
+  83, 85, 89, 87, 77, 99, 83, 81, 77, 82,
+  80, 69, 93, 89, 81, 79, 77, 60, 73, 76,
+  80, 80, 82, 84, 72, 89, 75, 79, 79, 84,
+  89, 75, 72, 91, 87, 87, 79, 120, 85, 77,
+  107, 92, 73, 83, 77, 74, 88, 87, 69, 89,
+  82, 84, 69, 69, 76, 75, 81, 89, 76, 83,
+  83, 87, 71, 76, 86, 80, 74, 86, 80, 73,
+  83, 90, 81, 78, 79, 86, 76, 89, 85, 77,
+  80, 66, 86, 81, 83, 76, 83, 78, 84, 76,
+  71, 87, 77, 85, 96, 80, 84, 72, 81, 69,
+  65, 77, 86, 74, 82, 86, 86, 101, 69, 79,
+  91, 88, 94, 80, 77, 100, 83, 93, 85, 67,
+  81, 101, 79, 95, 79, 90, 93, 78, 74, 89,
+  88, 94, 73, 84, 90, 73, 81, 81, 79, 95,
+  94, 82, 95, 78, 81, 75, 77, 84, 91, 87,
+  79, 78, 75, 93, 84, 79, 84, 81, 75, 87,
+  74, 106, 86, 80, 87, 94, 91, 75, 99, 91,
+  87, 89, 88, 77, 88, 86, 79, 87, 70, 95,
+  77, 77, 77, 80, 77, 91, 71, 74, 75, 91,
+  75, 87, 88, 80, 66, 77, 83, 74, 84, 86,
+  88, 74, 82, 85, 79, 88, 87, 84, 80, 77,
+  88, 92, 81, 95, 86, 70, 81, 84, 84, 76,
+  88, 69, 72, 93, 74, 83, 79, 82, 93, 85,
+  74, 80, 89, 81, 76, 85, 90, 87, 85, 91,
+  86, 95, 91, 88, 75, 88, 89, 89, 100, 71,
+  73, 73, 83, 85, 72, 82, 94, 74, 94, 76,
+  73, 88, 83, 93, 88, 92, 98, 81, 73, 83,
+  75, 85, 93, 79, 80, 74, 77, 85, 99, 95,
+  73, 73, 102, 86, 89, 83, 78, 72, 105, 79,
+  88, 97, 84, 112, 92, 87, 98, 83, 89, 78,
+  88, 78, 95, 83, 84, 84, 93, 81, 90, 76,
+  81, 87, 77, 83, 72, 89, 83, 84, 85, 92,
+  88, 90, 79, 67, 99, 92, 81, 84, 73, 83,
+  81, 89, 82, 84, 77, 106, 82, 75, 85, 86,
+  90, 75, 77, 75, 81, 79, 74, 81, 79, 83,
+  87, 75, 77, 75, 78, 73, 67, 75, 79, 82,
+  78, 84, 82, 93, 77, 80, 86, 86, 97, 87,
+  77, 97, 70, 77, 82, 72, 85, 95, 83, 84,
+  79, 92, 80, 77, 81, 84, 91, 89, 77, 91,
+  87, 76, 79, 84, 79, 84, 90, 95, 94, 76,
+  81, 78, 77, 82, 90, 86, 89, 83, 71, 84,
+  77, 86, 85, 78, 76, 79, 78, 91, 88, 90,
+  77, 97, 90, 85, 85, 92, 90, 81, 80, 79,
+  98, 88, 69, 88, 79, 93, 70, 70, 76, 81,
+  75, 87, 76, 81, 85, 89, 80, 86, 87, 85,
+  67, 80, 88, 79, 70, 88, 84, 79, 83, 88,
+  76, 83, 85, 91, 80, 78, 86, 81, 75, 80,
+  79, 76, 74, 82, 78, 95, 80, 84, 91, 75,
+  85, 75, 81, 71, 70, 78, 89, 82, 84, 91,
+  82, 94, 78, 87, 82, 80, 91, 81, 82, 96,
+  82, 87, 83, 80, 79, 95, 87, 97, 76, 87,
+  87, 77, 72, 97, 84, 93, 75, 82, 93, 80,
+  89, 84, 82, 92, 92, 88, 102, 83, 79, 84,
+  86, 88, 91, 83, 87, 85, 77, 87, 90, 84,
+  86, 80, 81, 92, 69, 102, 87, 81, 84, 87,
+  83, 81, 80, 88, 93, 89, 90, 83, 85, 87,
+  88, 81, 83, 93, 80, 81, 84, 84, 86, 88,
+  81, 79, 80, 91, 84, 87, 88, 85, 73, 79,
+  85, 75, 81, 90, 89, 80, 82, 82, 84, 86,
+  80, 75, 88, 87, 95, 74, 84, 94, 87, 89,
+  84, 80, 74, 82, 84, 79, 96, 82, 78, 73,
+  85, 83, 83, 72, 83, 81, 72, 86, 97, 86,
+  73, 102, 87, 84, 79, 80, 94, 91, 96, 85,
+  82, 68, 80, 76, 82, 77, 71, 75, 89, 80,
+  74, 86, 73, 92, 73, 89, 79, 84, 87, 85,
+  75, 84, 90, 96, 71, 77, 88, 72, 77, 80,
+  88, 91, 81, 88, 71, 91, 88, 80, 80, 89,
+  87, 86, 82, 85, 73, 70, 99, 103, 79, 81,
+  80, 79, 75, 89, 100, 79, 94, 86, 66, 89,
+  84, 81, 79, 93, 83, 79, 94, 77, 91, 97,
+  90, 82, 76, 82, 76, 85, 79, 89, 72, 91,
+  77, 113, 105, 85, 84, 81, 81, 75, 82, 82,
+  82, 82, 85, 84, 77, 88, 89, 77, 78, 71,
+  71, 80, 72, 77, 93, 82, 83, 73, 85, 81,
+  67, 67, 72, 72, 77, 97, 87, 85, 70, 104,
+  87, 89, 74, 76, 93, 83, 87, 70, 74, 91,
+  81, 68, 75, 76, 73, 78, 86, 73, 61, 91,
+  66, 97, 66, 92, 69, 79, 83, 75, 68, 79,
+  82, 112, 76, 83, 75, 93, 77, 76, 96, 104,
+  85, 101, 74, 98, 80, 81, 92, 85, 83, 81,
+  88, 75, 71, 66, 94, 84, 89, 88, 76, 91,
+  72, 96, 85, 83, 95, 93, 67, 96, 86, 78,
+  81, 98, 91, 104, 95, 76, 115, 91, 82, 80,
+  78, 84, 74, 95, 71, 75, 76, 106, 66, 128,
+  134, 84, 84, 86, 70, 61, 85, 81, 98, 78,
+  95, 93, 78, 90, 86, 77, 78, 85, 76, 86,
+  82, 79, 80, 83, 74, 74, 87, 81, 79, 69,
+  76, 81, 83, 83, 88, 87, 74, 104, 86, 94,
+  81, 80, 98, 82, 83, 74, 72, 73, 78, 73,
+  82, 78, 77, 79, 83, 77, 71, 99, 73, 88,
+  75, 91, 77, 81, 86, 77, 78, 81, 81, 93,
+  73, 84, 87, 73, 75, 79, 75, 99, 86, 79,
+  74, 92, 91, 78, 96, 93, 86, 95, 80, 82,
+  75, 72, 97, 70, 81, 85, 95, 83, 74, 86,
+  98, 80, 92, 88, 84, 89, 83, 83, 84, 92,
+  87, 88, 94, 74, 90, 96, 88, 78, 76, 81,
+  79, 84, 80, 79, 81, 88, 75, 111, 109, 80,
+  84, 78, 79, 78, 83, 73, 86, 83, 89, 74,
+  84, 93, 81, 91, 86, 76, 71, 80, 83, 89,
+  83, 72, 84, 80, 86, 92, 82, 80, 79, 68,
+  79, 86, 95, 84, 73, 101, 88, 76, 84, 81,
+  87, 89, 103, 91, 86, 85, 79, 73, 99, 79,
+  90, 76, 89, 83, 78, 85, 79, 90, 75, 86,
+  77, 87, 80, 90, 81, 88, 93, 95, 80, 77,
+  89, 74, 89, 78, 78, 91, 79, 100, 77, 97,
+  80, 78, 83, 87, 93, 83, 80, 80, 70, 72,
+  91, 99, 74, 85, 77, 78, 74, 86, 89, 76,
+  94, 84, 72, 95, 87, 80, 66, 89, 80, 78,
+  86, 81, 94, 85, 85, 84, 76, 79, 78, 81,
+  75, 100, 83, 79, 62, 125, 98, 83, 76, 79,
+  79, 67, 82, 79, 84, 77, 77, 78, 75, 79,
+  75, 91, 82, 69, 69, 75, 75, 94, 75, 74,
+  90, 89, 90, 86, 67, 78, 78, 55, 90, 90,
+  76, 83, 68, 104, 86, 90, 80, 69, 79, 87,
+  92, 75, 71, 126, 75, 66, 103, 78, 84, 75,
+  91, 77, 67, 88, 79, 95, 70, 88, 67, 83,
+  66, 81, 78, 87, 91, 120, 79, 78, 73, 85,
+  87, 68, 71, 109, 76, 90, 72, 118, 71, 70,
+  101, 92, 94, 79, 82, 76, 67, 74, 80, 80,
+  88, 94, 83, 84, 74, 95, 79, 77, 101, 84,
+  67, 109, 88, 76, 75, 85, 81, 77, 78, 81,
+  119, 84, 76, 82, 73, 86, 83, 84, 73, 81,
+  87, 91, 65, 149, 119, 81, 76, 87, 68, 56,
+  83, 78, 93, 73, 91, 83, 81, 88, 80, 79,
+  81, 78, 74, 79, 82, 91, 73, 85, 81, 79,
+  89, 91, 77, 74, 94, 73, 89, 84, 81, 85,
+  74, 102, 86, 101, 85, 73, 86, 83, 86, 70,
+  81, 92, 77, 71, 104, 84, 80, 79, 86, 83,
+  75, 90, 78, 88, 77, 93, 73, 86, 82, 81,
+  81, 85, 88, 93, 81, 80, 87, 72, 90, 79,
+  73, 96, 79, 91, 75, 99, 87, 77, 100, 91,
+  93, 96, 76, 86, 71, 72, 91, 69, 78, 92,
+  105, 79, 75, 83, 85, 78, 95, 83, 86, 96,
+  86, 82, 85, 90, 83, 73, 85, 77, 88, 89,
+  82, 77, 75, 81, 88, 81, 77, 76, 86, 89,
+  79, 122, 103, 81, 81, 77, 75, 72, 83, 76,
+  87, 81, 89, 73, 76, 84, 78, 81, 88, 83,
+  75, 90, 80, 88, 81, 80, 80, 81, 82, 83,
+  92, 70, 84, 81, 80, 90, 96, 83, 80, 94,
+  87, 76, 83, 86, 83, 89, 98, 76, 77, 91,
+  94, 73, 93, 78, 86, 81, 88, 83, 97, 81,
+  79, 83, 80, 82, 75, 92, 76, 91, 84, 84,
+  88, 83, 85, 84, 95, 78, 83, 77, 79, 81,
+  79, 99, 77, 79, 95, 81, 85, 81, 100, 83,
+  81, 75, 74, 89, 89, 83, 76, 88, 77, 83,
+  80, 72, 89, 75, 94, 81, 76, 90, 82, 82,
+  72, 90, 73, 76, 81, 80, 82, 88, 81, 86,
+  81, 78, 79, 81, 79, 96, 81, 90, 73, 109,
+  97, 89, 73, 76, 80, 70, 81, 82, 86, 90,
+  81, 75, 74, 82, 74, 83, 90, 75, 74, 92,
+  78, 87, 72, 85, 81, 89, 78, 78, 81, 73,
+  87, 64, 88, 90, 78, 78, 80, 101, 86, 93,
+  80, 76, 83, 85, 97, 71, 70, 110, 84, 68,
+  101, 77, 89, 78, 95, 83, 90, 81, 83, 86,
+  82, 83, 72, 89, 71, 84, 85, 82, 89, 90,
+  79, 81, 89, 83, 87, 71, 69, 78, 74, 87,
+  76, 94, 90, 78, 88, 87, 96, 80, 78, 72,
+  73, 94, 84, 76, 77, 88, 81, 82, 81, 77,
+  88, 72, 103, 75, 74, 90, 87, 85, 76, 91,
+  75, 78, 82, 82, 87, 84, 76, 89, 79, 79,
+  86, 80, 78, 80, 87, 87, 72, 128, 100, 91,
+  76, 74, 72, 72, 82, 79, 86, 88, 87, 81,
+  79, 84, 84, 73, 87, 80, 78, 88, 81, 88,
+  73, 95, 79, 84, 83, 84, 89, 73, 93, 74,
+  84, 88, 82, 82, 83, 97, 84, 99, 85, 83,
+  86, 81, 86, 74, 80, 92, 79, 74, 96, 79,
+  85, 83, 86, 92, 92, 85, 80, 83, 82, 85,
+  75, 91, 79, 79, 79, 84, 81, 84, 87, 86,
+  91, 76, 85, 78, 78, 83, 77, 82, 78, 80,
+  95, 81, 90, 80, 98, 82, 71, 78, 74, 87,
+  91, 72, 77, 90, 97, 77, 79, 73, 88, 78,
+  94, 80, 86, 91, 81, 84, 86, 95, 76, 86,
+  82, 80, 77, 85, 80, 87, 82, 80, 90, 82,
+  79, 77, 85, 88, 71, 108, 97, 89, 75, 75,
+  78, 73, 82, 81, 88, 93, 76, 85, 86, 75,
+  68, 82, 72, 80, 68, 83, 79, 76, 68, 85,
+  62, 94, 89, 83, 98, 109, 62, 68, 99, 101,
+  74, 94, 78, 69, 105, 78, 84, 81, 68, 76,
+  80, 95, 74, 92, 74, 77, 93, 78, 67, 72,
+  92, 97, 90, 78, 97, 81, 71, 78, 76, 77,
+  103, 55, 127, 74, 74, 87, 80, 94, 100, 59,
+  69, 72, 80, 79, 90, 85, 95, 81, 103, 82,
+  89, 99, 72, 90, 71, 79, 86, 92, 93, 97,
+  73, 94, 76, 81, 93, 87, 109, 69, 84, 94,
+  105, 78, 89, 80, 77, 94, 85, 55, 82, 93,
+  88, 79, 96, 69, 84, 74, 85, 83, 75, 92,
+  75, 86, 79, 80, 82, 80, 63, 84, 84, 75,
+  102, 88, 81, 74, 83, 63, 101, 85, 85, 98,
+  69, 77, 83, 97, 75, 78, 99, 83, 68, 82,
+  66, 71, 83, 98, 84, 77, 95, 94, 90, 90,
+  83, 81, 123, 98, 72, 82, 49, 82, 90, 86,
+  82, 77, 75, 81, 89, 81, 89, 60, 87, 129,
+  71, 109, 93, 88, 77, 92, 88, 68, 84, 88,
+  69, 57, 66, 92, 93, 90, 85, 57, 58, 62,
+  72, 73, 81, 91, 87, 97, 79, 80, 78, 68,
+  78, 104, 79, 74, 78, 70, 101, 94, 72, 90,
+  100, 111, 55, 88, 72, 79, 85, 98, 87, 73,
+  87, 74, 91, 71, 86, 59, 94, 84, 83, 75,
+  84, 80, 73, 75, 88, 96, 68, 91, 64, 92,
+  106, 79, 67, 70, 82, 83, 82, 78, 76, 84,
+  77, 81, 88, 69, 71, 92, 78, 77, 81, 79,
+  83, 90, 91, 101, 101, 85, 91, 86, 81, 73,
+  87, 87, 101, 77, 76, 88, 91, 90, 89, 79,
+  78, 101, 93, 84, 84, 88, 93, 74, 88, 85,
+  77, 88, 89, 79, 84, 79, 81, 97, 76, 81,
+  71, 87, 90, 103, 89, 85, 78, 113, 62, 81,
+  87, 89, 96, 83, 84, 75, 79, 87, 89, 88,
+  67, 85, 86, 82, 77, 85, 76, 68, 84, 80,
+  85, 87, 91, 99, 80, 86, 95, 85, 99, 90,
+  96, 94, 74, 89, 96, 92, 68, 91, 101, 89,
+  98, 82, 94, 79, 92, 80, 86, 84, 62, 101,
+  93, 82, 85, 95, 80, 88, 97, 84, 76, 87,
+  84, 77, 89, 89, 74, 85, 86, 81, 85, 81,
+  68, 94, 85, 78, 69, 63, 83, 83, 79, 80,
+  80, 79, 73, 97, 65, 84, 87, 73, 94, 106,
+  57, 71, 78, 98, 78, 98, 72, 67, 97, 69,
+  82, 86, 59, 76, 62, 83, 77, 87, 78, 70,
+  96, 74, 74, 74, 93, 87, 90, 93, 91, 74,
+  75, 75, 85, 76, 102, 65, 128, 66, 75, 92,
+  83, 93, 103, 71, 64, 78, 73, 80, 101, 97,
+  69, 69, 113, 91, 94, 87, 83, 72, 72, 71,
+  83, 84, 85, 89, 76, 95, 69, 81, 92, 79,
+  94, 66, 89, 89, 93, 79, 88, 86, 75, 86,
+  85, 57, 85, 98, 94, 95, 100, 77, 86, 73,
+  85, 82, 74, 87, 74, 77, 71, 81, 88, 88,
+  64, 83, 83, 79, 88, 91, 82, 73, 76, 75,
+  89, 84, 90, 94, 72, 71, 87, 90, 79, 81,
+  97, 82, 68, 84, 74, 64, 77, 96, 83, 60,
+  76, 90, 96, 95, 69, 82, 99, 86, 75, 74,
+  41, 89, 83, 87, 82, 65, 75, 86, 92, 74,
+  88, 58, 85, 121, 77, 133, 91, 88, 73, 85,
+  89, 72, 81, 69, 64, 58, 63, 96, 94, 84,
+  85, 64, 62, 62, 66, 68, 98, 76, 88, 84,
+  83, 86, 86, 55, 78, 89, 73, 75, 78, 63,
+  101, 88, 68, 94, 99, 105, 54, 80, 58, 81,
+  83, 96, 67, 76, 84, 81, 70, 66, 80, 67,
+  91, 86, 78, 82, 85, 83, 67, 74, 95, 96,
+  63, 86, 70, 69, 83, 74, 60, 68, 78, 87,
+  84, 77, 73, 86, 70, 80, 85, 73, 84, 89,
+  70, 76, 86, 85, 88, 85, 92, 105, 80, 86,
+  98, 82, 88, 82, 88, 88, 99, 75, 78, 83,
+  89, 90, 75, 82, 61, 96, 93, 86, 92, 86,
+  84, 78, 83, 78, 77, 79, 81, 73, 84, 80,
+  83, 98, 84, 85, 77, 87, 84, 95, 87, 95,
+  76, 119, 64, 83, 80, 79, 90, 89, 78, 69,
+  77, 89, 91, 87, 83, 80, 76, 68, 86, 87,
+  82, 72, 82, 72, 79, 90, 94, 96, 81, 81,
+  97, 88, 92, 95, 92, 78, 85, 84, 92, 88,
+  69, 85, 90, 97, 80, 90, 88, 87, 86, 80,
+  75, 91, 65, 97, 86, 86, 94, 97, 81, 85,
+  97, 78, 72, 85, 78, 69, 74, 94, 71, 85,
+  82, 80, 80, 81, 73, 107, 91, 80, 67, 74,
+  84, 88, 77, 80, 76, 72, 69, 95, 56, 81,
+  74, 72, 95, 102, 61, 83, 103, 97, 81, 99,
+  78, 74, 88, 61, 75, 87, 69, 77, 69, 95,
+  87, 82, 84, 73, 87, 74, 83, 76, 89, 96,
+  83, 89, 97, 71, 74, 72, 87, 78, 98, 71,
+  128, 68, 73, 87, 86, 98, 96, 67, 74, 77,
+  75, 84, 90, 96, 65, 76, 114, 91, 97, 97,
+  75, 94, 80, 71, 89, 85, 88, 92, 76, 91,
+  76, 80, 81, 83, 100, 71, 90, 79, 103, 76,
+  90, 77, 67, 83, 90, 61, 89, 92, 97, 79,
+  118, 76, 95, 75, 87, 77, 77, 100, 65, 82,
+  88, 76, 89, 96, 73, 83, 80, 81, 93, 92,
+  84, 72, 76, 79, 77, 92, 85, 102, 70, 75,
+  86, 90, 76, 81, 99, 86, 59, 82, 67, 73,
+  83, 90, 95, 74, 87, 91, 102, 86, 79, 89,
+  113, 58, 84, 84, 48, 98, 97, 90, 96, 78,
+  89, 87, 98, 81, 92, 62, 76, 124, 74, 116,
+  94, 81, 82, 84, 87, 67, 81, 80, 74, 54,
+  73, 89, 97, 94, 88, 57, 76, 57, 71, 76,
+  98, 78, 95, 87, 92, 86, 84, 66, 77, 106,
+  79, 77, 74, 76, 101, 92, 72, 95, 102, 107,
+  59, 80, 75, 86, 85, 91, 78, 77, 85, 77,
+  58, 77, 77, 70, 95, 82, 84, 83, 86, 88,
+  78, 66, 93, 95, 70, 93, 67, 85, 80, 82,
+  72, 73, 90, 80, 88, 77, 81, 90, 82, 78,
+  83, 65, 78, 97, 71, 74, 88, 85, 95, 86,
+  85, 101, 88, 77, 80, 84, 81, 89, 89, 85,
+  104, 78, 83, 90, 92, 81, 80, 90, 81, 80,
+  99, 85, 84, 99, 90, 78, 87, 85, 82, 96,
+  86, 81, 88, 85, 77, 98, 82, 87, 86, 89,
+  78, 94, 91, 88, 69, 122, 64, 76, 79, 83,
+  90, 86, 82, 68, 83, 85, 96, 81, 89, 81,
+  83, 76, 85, 84, 78, 68, 75, 80, 92, 90,
+  84, 107, 87, 85, 91, 94, 94, 101, 98, 85,
+  83, 94, 98, 93, 63, 85, 82, 93, 73, 93,
+  84, 81, 87, 75, 88, 86, 64, 93, 86, 91,
+  97, 87, 85, 92, 91, 79, 77, 91, 81, 65,
+  86, 90, 80, 82, 90, 81, 85, 81, 80, 78,
+  90, 105, 69, 86, 81, 71, 95, 91, 88, 82,
+  87, 79, 84, 82, 71, 73, 104, 69, 94, 82,
+  114, 94, 83, 74, 69, 89, 91, 81, 89, 97,
+  92, 79, 74, 91, 74, 86, 79, 82, 105, 77,
+  85, 89, 75, 78, 103, 82, 78, 87, 96, 73,
+  81, 108, 91, 87, 84, 91, 87, 83, 77, 95,
+  71, 82, 80, 80, 85, 101, 78, 83, 88, 87,
+  64, 86, 76, 84, 87, 101, 80, 77, 85, 79,
+  73, 75, 83, 84, 83, 74, 70, 89, 74, 97,
+  99, 86, 75, 83, 82, 93, 91, 63, 70, 79,
+  92, 81, 89, 91, 87, 79, 85, 79, 84, 90,
+  85, 86, 87, 93, 94, 81, 89, 87, 94, 73,
+  75, 83, 96, 86, 84, 84, 68, 90, 80, 106,
+  72, 96, 74, 62, 94, 89, 86, 77, 85, 79,
+  76, 73, 74, 78, 102, 77, 90, 83, 103, 88,
+  88, 75, 74, 87, 96, 78, 97, 95, 92, 81,
+  83, 73, 83, 97, 84, 81, 110, 75, 93, 94,
+  74, 77, 103, 86, 87, 87, 95, 81, 89, 127,
+  87, 86, 75, 87, 83, 75, 88, 100, 67, 89,
+  68, 82, 89, 94, 75, 82, 82, 87, 55, 90,
+  78, 82, 78, 87, 77, 74, 84, 85, 75, 74,
+  85, 87, 83, 76, 63, 89, 69, 107, 88, 83,
+  63, 76, 65, 90, 99, 60, 70, 84, 90, 78,
+  77, 84, 76, 72, 90, 75, 96, 91, 85, 80,
+  94, 89, 75, 74, 87, 93, 81, 73, 83, 79,
+  108, 85, 76, 78, 82, 98, 88, 87, 71, 107,
+  83, 71, 96, 93, 86, 81, 80, 73, 79, 90,
+  78, 70, 101, 71, 81, 80, 89, 89, 85, 78,
+  69, 85, 86, 78, 87, 96, 88, 80, 80, 82,
+  77, 89, 76, 87, 96, 78, 86, 83, 81, 88,
+  90, 98, 80, 84, 92, 70, 85, 103, 91, 82,
+  86, 91, 85, 80, 78, 92, 74, 80, 81, 85,
+  76, 93, 73, 74, 94, 87, 70, 85, 75, 91,
+  83, 78, 78, 77, 79, 80, 87, 89, 74, 85,
+  84, 74, 75, 98, 75, 107, 102, 86, 84, 81,
+  80, 88, 104, 63, 69, 85, 96, 85, 84, 83,
+  83, 78, 87, 83, 97, 85, 88, 91, 82, 86,
+  81, 85, 90, 91, 79, 76, 65, 87, 87, 85,
+  86, 80, 69, 70, 77, 122, 82, 73, 84, 71,
+  105, 93, 76, 84, 86, 100, 80, 89, 72, 71,
+  83, 74, 93, 74, 119, 94, 81, 75, 98, 74,
+  99, 79, 85, 83, 91, 74, 85, 95, 80, 73,
+  77, 72, 94, 94, 81, 105, 79, 89, 100, 96,
+  93, 84, 92, 78, 79, 116, 83, 100, 87, 80,
+  81, 95, 75, 97, 74, 75, 79, 65, 84, 113,
+  104, 76, 107, 88, 75, 83, 67, 70, 98, 92,
+  85, 85, 97, 86, 92, 70, 81, 81, 86, 74,
+  70, 78, 60, 89, 75, 89, 64, 75, 63, 88,
+  90, 73, 70, 93, 87, 74, 85, 98, 89, 72,
+  83, 52, 88, 86, 84, 92, 81, 91, 71, 68,
+  76, 82, 91, 63, 90, 71, 91, 86, 78, 75,
+  68, 91, 97, 156, 86, 75, 76, 50, 114, 85,
+  73, 77, 83, 85, 84, 99, 69, 67, 74, 74,
+  94, 82, 83, 83, 98, 81, 122, 66, 111, 83,
+  81, 107, 102, 75, 87, 74, 82, 73, 87, 73,
+  82, 84, 93, 102, 72, 85, 111, 93, 102, 90,
+  99, 93, 99, 150, 82, 89, 67, 81, 66, 85,
+  83, 104, 76, 92, 73, 67, 90, 90, 103, 76,
+  79, 81, 62, 83, 67, 47, 96, 90, 79, 79,
+  105, 105, 106, 82, 77, 91, 92, 71, 70, 76,
+  47, 94, 56, 94, 46, 63, 36, 86, 98, 65,
+  74, 86, 73, 69, 78, 79, 86, 62, 99, 48,
+  106, 71, 83, 87, 82, 87, 76, 55, 58, 87,
+  84, 62, 117, 60, 110, 92, 51, 70, 77, 89,
+  97, 101, 76, 104, 82, 65, 96, 93, 76, 88,
+  74, 78, 77, 92, 82, 73, 87, 78, 79, 76,
+  73, 87, 91, 75, 94, 70, 95, 86, 82, 97,
+  84, 78, 84, 68, 80, 78, 82, 78, 92, 90,
+  84, 100, 80, 88, 89, 88, 90, 83, 89, 81,
+  80, 107, 78, 80, 88, 84, 80, 88, 73, 97,
+  77, 69, 84, 72, 82, 107, 88, 79, 78, 87,
+  71, 88, 69, 75, 88, 85, 73, 80, 88, 88,
+  108, 97, 74, 91, 89, 79, 75, 83, 63, 99,
+  77, 93, 71, 68, 63, 88, 99, 64, 69, 78,
+  87, 76, 83, 95, 83, 72, 85, 63, 103, 91,
+  88, 92, 83, 95, 98, 69, 76, 86, 72, 67,
+  75, 76, 82, 88, 85, 74, 76, 76, 81, 97,
+  88, 77, 73, 83, 99, 97, 71, 71, 83, 95,
+  81, 99, 69, 63, 76, 89, 83, 76, 107, 102,
+  82, 76, 106, 67, 81, 84, 72, 77, 74, 68,
+  89, 101, 88, 70, 75, 73, 78, 84, 74, 84,
+  68, 85, 81, 89, 100, 79, 81, 67, 82, 103,
+  76, 101, 103, 77, 84, 91, 68, 95, 83, 85,
+  75, 65, 82, 100, 90, 79, 98, 87, 106, 90,
+  68, 91, 97, 91, 113, 80, 82, 75, 104, 81,
+  87, 81, 81, 83, 72, 81, 67, 82, 81, 82,
+  72, 72, 68, 75, 71, 78, 67, 93, 91, 81,
+  86, 106, 73, 75, 64, 69, 81, 92, 82, 91,
+  80, 80, 74, 85, 83, 89, 93, 71, 86, 64,
+  74, 85, 99, 74, 79, 83, 90, 118, 94, 79,
+  57, 62, 103, 91, 67, 67, 83, 89, 88, 103,
+  74, 61, 72, 92, 85, 74, 79, 96, 92, 72,
+  117, 60, 99, 98, 76, 93, 87, 70, 86, 82,
+  80, 50, 82, 68, 66, 72, 77, 96, 61, 85,
+  76, 98, 98, 80, 82, 78, 97, 112, 69, 85,
+  90, 75, 80, 91, 73, 106, 83, 96, 79, 64,
+  85, 99, 102, 82, 89, 85, 97, 84, 51, 68,
+  100, 90, 106, 76, 85, 78, 132, 88, 94, 87,
+  86, 79, 78, 73, 56, 88, 61, 89, 59, 61,
+  53, 78, 76, 75, 62, 88, 86, 81, 90, 110,
+  73, 72, 60, 60, 86, 87, 77, 87, 98, 83,
+  92, 74, 65, 96, 80, 70, 97, 49, 75, 84,
+  82, 73, 81, 84, 75, 89, 86, 99, 71, 77,
+  93, 94, 76, 73, 76, 80, 79, 94, 82, 68,
+  80, 78, 78, 77, 72, 94, 87, 70, 99, 66,
+  79, 101, 73, 86, 69, 74, 86, 75, 85, 67,
+  82, 77, 78, 82, 79, 90, 67, 84, 76, 91,
+  92, 75, 81, 81, 83, 96, 79, 71, 97, 80,
+  89, 87, 68, 90, 86, 78, 77, 71, 78, 98,
+  90, 84, 78, 86, 95, 92, 61, 96, 90, 81,
+  97, 73, 77, 81, 104, 94, 81, 84, 82, 92,
+  77, 86, 69, 85, 88, 81, 75, 68, 69, 80,
+  91, 64, 70, 72, 91, 80, 89, 100, 76, 79,
+  63, 77, 92, 90, 85, 87, 91, 90, 103, 87,
+  84, 89, 81, 73, 76, 74, 73, 82, 101, 80,
+  81, 77, 79, 83, 76, 85, 75, 94, 81, 90,
+  68, 86, 88, 106, 71, 83, 84, 72, 85, 87,
+  87, 98, 90, 87, 79, 71, 85, 89, 95, 80,
+  84, 72, 84, 74, 79, 85, 67, 85, 93, 74,
+  90, 76, 89, 81, 86, 84, 78, 75, 88, 95,
+  98, 81, 95, 89, 79, 80, 64, 73, 80, 75,
+  92, 91, 85, 80, 62, 79, 123, 90, 84, 59,
+  79, 76, 99, 92, 78, 78, 75, 89, 82, 80,
+  82, 92, 88, 88, 73, 91, 98, 80, 86, 80,
+  79, 89, 95, 78, 93, 80, 68, 76, 87, 86,
+  78, 81, 92, 75, 89, 84, 79, 87, 81, 98,
+  70, 99, 75, 89, 84, 81, 81, 90, 77, 85,
+  83, 79, 96, 88, 81, 90, 80, 87, 77, 79,
+  83, 92, 102, 79, 69, 93, 78, 90, 75, 81,
+  83, 98, 68, 85, 93, 78, 93, 93, 86, 95,
+  85, 78, 91, 65, 80, 97, 94, 85, 81, 85,
+  95, 68, 77, 74, 57, 87, 121, 67, 96, 70,
+  94, 97, 92, 86, 87, 75, 86, 90, 100, 74,
+  89, 94, 71, 89, 64, 79, 74, 69, 95, 100,
+  85, 79, 55, 71, 122, 97, 98, 66, 67, 70,
+  100, 94, 77, 70, 68, 78, 82, 77, 80, 88,
+  92, 92, 73, 87, 84, 91, 77, 77, 76, 98,
+  89, 84, 90, 92, 75, 76, 88, 74, 83, 85,
+  91, 75, 81, 79, 74, 79, 80, 91, 64, 135,
+  78, 82, 84, 74, 77, 93, 77, 86, 85, 77,
+  94, 87, 80, 91, 83, 84, 72, 87, 81, 85,
+  74, 88, 76, 103, 86, 89, 67, 91, 95, 84,
+  68, 88, 81, 72, 84, 83, 78, 94, 86, 89,
+  71, 71, 85, 83, 93, 90, 77, 82, 86, 77,
+  84, 86, 71, 87, 116, 78, 85, 76, 85, 85,
+  89, 82, 80, 87, 89, 94, 97, 82, 99, 91,
+  83, 91, 77, 66, 79, 82, 92, 91, 79, 81,
+  70, 80, 101, 91, 79, 72, 78, 79, 97, 81,
+  76, 75, 75, 73, 77, 85, 80, 88, 84, 83,
+  75, 85, 86, 88, 84, 78, 81, 87, 92, 74,
+  93, 80, 67, 74, 79, 81, 80, 88, 91, 76,
+  90, 80, 89, 85, 79, 96, 66, 97, 73, 98,
+  78, 83, 82, 86, 78, 84, 88, 78, 96, 88,
+  83, 90, 77, 88, 80, 62, 73, 74, 106, 76,
+  71, 85, 73, 93, 85, 80, 71, 78, 66, 74,
+  90, 85, 90, 103, 95, 95, 105, 75, 84, 66,
+  83, 97, 105, 99, 78, 86, 92, 70, 84, 95,
+  67, 78, 141, 69, 89, 65, 95, 101, 93, 73,
+  75, 71, 87, 85, 92, 67, 73, 88, 68, 85,
+  86, 74, 73, 68, 74, 107, 81, 81, 67, 72,
+  92, 93, 93, 69, 73, 63, 95, 92, 77, 81,
+  82, 85, 109, 72, 66, 77, 83, 103, 78, 77,
+  91, 105, 64, 88, 90, 77, 85, 59, 94, 95,
+  81, 79, 78, 87, 93, 81, 87, 82, 86, 88,
+  72, 81, 84, 85, 77, 135, 69, 84, 89, 83,
+  80, 87, 58, 78, 84, 72, 72, 78, 69, 88,
+  83, 84, 78, 62, 65, 76, 137, 76, 77, 81,
+  67, 98, 90, 70, 60, 108, 73, 71, 93, 85,
+  87, 112, 102, 99, 72, 67, 81, 64, 75, 98,
+  101, 109, 82, 85, 86, 70, 83, 89, 47, 70,
+  136, 72, 90, 54, 97, 117, 101, 75, 77, 71,
+  89, 76, 86, 64, 70, 93, 60, 77, 90, 83,
+  65, 57, 78, 128, 75, 77, 69, 70, 68, 95,
+  118, 64, 66, 58, 92, 77, 90, 74, 72, 75,
+  105, 67, 67, 74, 83, 88, 90, 70, 75, 104,
+  57, 85, 87, 77, 70, 61, 94, 105, 82, 87,
+  78, 76, 74, 80, 92, 81, 90, 95, 64, 72,
+  81, 74, 80, 173, 80, 77, 87, 68, 71, 86,
+  59, 78, 90, 68, 61, 77, 74, 87, 90, 75,
+  81, 68, 70, 81, 86, 93, 77, 92, 80, 89,
+  88, 78, 79, 125, 67, 75, 89, 77, 90, 88,
+  90, 97, 75, 77, 64, 70, 89, 92, 99, 109,
+  79, 94, 92, 74, 84, 92, 69, 82, 102, 73,
+  79, 69, 92, 88, 88, 75, 82, 84, 87, 92,
+  88, 72, 79, 85, 79, 74, 93, 73, 74, 81,
+  83, 97, 81, 74, 74, 79, 76, 87, 92, 77,
+  70, 77, 92, 83, 86, 84, 78, 80, 89, 76,
+  70, 76, 79, 82, 78, 76, 83, 99, 73, 84,
+  91, 99, 85, 61, 94, 89, 79, 77, 76, 83,
+  95, 98, 85, 79, 87, 85, 83, 76, 84, 89,
+  81, 114, 72, 93, 88, 90, 78, 81, 70, 76,
+  96, 77, 81, 83, 75, 88, 83, 92, 81, 83,
+  83, 75, 64, 103, 86, 89, 88, 84, 78, 93,
+  91, 60, 76, 96, 75, 101, 82, 81, 83, 78,
+  97, 83, 83, 81, 89, 88, 85, 94, 89, 91,
+  91, 72, 76, 89, 83, 79, 104, 82, 81, 76,
+  84, 87, 77, 77, 87, 78, 80, 88, 100, 89,
+  84, 90, 81, 93, 82, 75, 80, 93, 87, 76,
+  89, 86, 93, 83, 82, 77, 80, 75, 78, 80,
+  98, 81, 77, 84, 83, 87, 92, 83, 84, 95,
+  84, 92, 85, 84, 95, 74, 98, 84, 84, 82,
+  83, 74, 93, 71, 80, 81, 88, 87, 90, 80,
+  84, 74, 84, 91, 78, 85, 81, 94, 87, 74,
+  74, 85, 93, 98, 81, 85, 82, 75, 92, 79,
+  100, 84, 80, 92, 78, 85, 82, 84, 77, 73,
+  66, 83, 93, 93, 83, 86, 77, 94, 90, 78,
+  78, 95, 68, 97, 75, 77, 88, 75, 83, 82,
+  80, 81, 98, 92, 77, 94, 92, 92, 97, 71,
+  88, 77, 81, 71, 75, 83, 77, 75, 90, 80,
+  69, 83, 90, 77, 96, 94, 93, 89, 89, 91,
+  78, 86, 83, 76, 84, 85, 89, 74, 90, 86,
+  77, 84, 76, 59, 84, 66, 73, 91, 95, 80,
+  84, 90, 78, 84, 103, 79, 89, 95, 83, 82,
+  85, 85, 85, 66, 99, 91, 91, 79, 89, 79,
+  80, 63, 85, 80, 95, 80, 91, 69, 89, 70,
+  89, 90, 76, 82, 82, 102, 93, 69, 87, 87,
+  95, 101, 67, 89, 86, 83, 94, 80, 103, 92,
+  84, 93, 83, 88, 84, 79, 85, 76, 70, 96,
+  88, 92, 89, 81, 78, 85, 89, 98, 83, 91,
+  77, 90, 82, 81, 81, 85, 94, 82, 76, 84,
+  86, 83, 78, 84, 91, 87, 86, 78, 90, 87,
+  82, 78, 67, 80, 78, 75, 81, 83, 77, 80,
+  93, 84, 80, 84, 94, 96, 87, 89, 84, 77,
+  83, 79, 76, 93, 88, 75, 85, 88, 101, 84,
+  83, 79, 79, 76, 87, 81, 96, 82, 85, 83,
+  79, 90, 93, 82, 90, 88, 80, 81, 89, 86,
+  84, 73, 97, 83, 83, 90, 83, 83, 92, 72,
+  82, 81, 85, 83, 92, 79, 83, 71, 83, 95,
+  80, 88, 77, 95, 88, 77, 77, 96, 97, 88,
+  74, 82, 88, 75, 84, 82, 95, 88, 82, 87,
+  83, 85, 95, 86, 84, 93, 86, 92, 72, 104,
+  99, 85, 83, 76, 100, 64, 64, 106, 88, 92,
+  80, 78, 84, 84, 96, 88, 71, 66, 84, 90,
+  90, 85, 81, 85, 100, 73, 84, 91, 80, 87,
+  104, 77, 90, 80, 84, 89, 86, 90, 79, 87,
+  82, 95, 80, 94, 85, 88, 104, 82, 92, 90,
+  92, 81, 77, 78, 85, 83, 83, 83, 92, 76,
+  93, 79, 105, 82, 111, 111, 70, 89, 87, 80,
+  85, 68, 102, 75, 82, 86, 92, 72, 80, 86,
+  90, 74, 84, 115, 89, 80, 96, 67, 93, 75,
+  77, 90, 97, 73, 86, 85, 76, 72, 78, 85,
+  73, 99, 88, 90, 84, 83, 83, 68, 78, 75,
+  92, 79, 68, 78, 79, 112, 91, 85, 82, 87,
+  93, 78, 93, 102, 95, 97, 69, 112, 105, 87,
+  81, 76, 93, 79, 70, 106, 84, 97, 85, 76,
+  89, 92, 99, 89, 71, 63, 100, 95, 87, 82,
+  74, 80, 98, 66, 89, 87, 73, 89, 75, 69,
+  98, 71, 87, 86, 90, 100, 80, 79, 75, 93,
+  86, 98, 85, 81, 109, 68, 93, 86, 92, 84,
+  77, 78, 85, 77, 101, 70, 92, 69, 92, 87,
+  84, 74, 129, 111, 72, 84, 87, 88, 79, 57,
+  97, 77, 86, 87, 78, 78, 83, 74, 82, 77,
+  89, 116, 89, 80, 107, 63, 86, 73, 72, 81,
+  93, 75, 84, 88, 76, 71, 77, 86, 74, 101,
+  90, 93, 93, 85, 77, 58, 97, 76, 83, 77,
+  77, 75, 81, 123, 86, 95, 83, 86, 98, 73,
+  102, 95, 90, 86, 79, 95, 92, 87, 87, 81,
+  96, 108, 68, 101, 82, 88, 88, 82, 86, 92,
+  85, 92, 71, 72, 85, 86, 81, 82, 83, 81,
+  102, 71, 85, 91, 76, 83, 69, 79, 90, 82,
+  83, 85, 80, 88, 77, 83, 80, 97, 75, 108,
+  88, 87, 112, 74, 90, 85, 94, 85, 75, 79,
+  84, 81, 85, 85, 89, 80, 94, 79, 75, 78,
+  115, 102, 77, 90, 85, 89, 80, 76, 106, 69,
+  84, 74, 88, 79, 74, 80, 94, 74, 83, 107,
+  93, 86, 95, 70, 89, 77, 80, 90, 86, 72,
+  90, 82, 77, 73, 79, 83, 74, 99, 98, 85,
+  86, 86, 92, 71, 101, 80, 92, 79, 81, 78,
+  81, 116, 91, 93, 90, 91, 90, 82, 85, 74,
+  75, 70, 72, 70, 71, 75, 79, 82, 90, 67,
+  76, 77, 84, 82, 66, 92, 76, 59, 85, 80,
+  91, 76, 70, 76, 104, 84, 93, 86, 79, 95,
+  74, 90, 104, 80, 97, 82, 80, 84, 80, 81,
+  83, 71, 86, 89, 83, 74, 80, 67, 81, 93,
+  70, 96, 82, 84, 82, 92, 99, 75, 98, 90,
+  89, 73, 98, 77, 90, 78, 86, 98, 76, 91,
+  86, 60, 82, 77, 95, 81, 78, 107, 73, 100,
+  101, 71, 77, 88, 66, 76, 66, 90, 72, 81,
+  81, 71, 86, 96, 84, 77, 81, 87, 87, 92,
+  89, 67, 78, 81, 89, 72, 86, 81, 59, 82,
+  83, 98, 78, 92, 85, 75, 73, 84, 71, 69,
+  69, 87, 68, 73, 94, 80, 78, 64, 83, 65,
+  73, 69, 64, 71, 78, 84, 86, 84, 80, 77,
+  83, 84, 63, 89, 81, 55, 66, 74, 87, 82,
+  75, 68, 105, 79, 104, 82, 72, 92, 84, 79,
+  104, 80, 75, 77, 81, 80, 90, 84, 92, 68,
+  83, 83, 85, 67, 79, 63, 81, 90, 63, 81,
+  80, 83, 76, 89, 95, 78, 99, 88, 74, 66,
+  91, 72, 100, 71, 71, 95, 72, 83, 97, 51,
+  77, 89, 103, 74, 79, 110, 67, 77, 116, 69,
+  78, 82, 48, 80, 66, 89, 65, 82, 79, 72,
+  82, 94, 90, 64, 68, 81, 81, 94, 102, 60,
+  74, 83, 95, 66, 96, 82, 57, 78, 86, 87,
+  64, 94, 82, 74, 75, 76, 74, 56, 73, 94,
+  69, 67, 88, 74, 87, 78, 77, 89, 67, 71,
+  77, 79, 85, 82, 83, 100, 72, 80, 81, 84,
+  75, 96, 81, 64, 66, 81, 76, 74, 80, 77,
+  92, 76, 89, 83, 84, 77, 75, 84, 87, 76,
+  59, 77, 77, 87, 84, 82, 80, 76, 79, 92,
+  78, 77, 79, 81, 81, 91, 84, 80, 86, 81,
+  85, 88, 93, 73, 100, 81, 90, 79, 87, 77,
+  98, 78, 75, 94, 87, 90, 93, 64, 88, 94,
+  94, 85, 81, 97, 76, 69, 96, 71, 79, 82,
+  75, 75, 72, 106, 73, 81, 90, 70, 82, 92,
+  88, 77, 78, 99, 90, 88, 85, 68, 79, 76,
+  86, 79, 87, 83, 67, 85, 93, 90, 76, 92,
+  88, 68, 82, 87, 78, 79, 75, 89, 72, 80,
+  88, 88, 85, 87, 92, 80, 78, 71, 75, 81,
+  82, 87, 94, 92, 82, 75, 85, 77, 79, 83,
+  85, 66, 84, 92, 82, 80, 84, 87, 92, 87,
+  98, 83, 85, 104, 91, 84, 81, 100, 57, 83,
+  89, 91, 87, 82, 86, 83, 84, 90, 85, 83,
+  90, 78, 84, 92, 74, 78, 83, 77, 86, 86,
+  95, 93, 91, 84, 98, 75, 85, 72, 87, 78,
+  86, 92, 80, 81, 84, 72, 80, 87, 86, 89,
+  78, 87, 78, 83, 83, 84, 78, 78, 81, 74,
+  78, 83, 87, 89, 84, 79, 92, 88, 85, 90,
+  87, 93, 88, 90, 82, 80, 88, 83, 87, 76,
+  75, 86, 71, 90, 79, 80, 75, 102, 87, 89,
+  83, 87, 79, 72, 65, 93, 70, 79, 93, 78,
+  80, 80, 95, 75, 80, 70, 68, 77, 82, 86,
+  99, 78, 83, 79, 89, 82, 81, 81, 86, 54,
+  75, 93, 84, 83, 82, 79, 101, 85, 106, 90,
+  80, 106, 86, 76, 87, 99, 86, 85, 94, 96,
+  85, 82, 83, 74, 83, 86, 94, 82, 87, 68,
+  85, 85, 68, 79, 80, 75, 84, 84, 104, 94,
+  89, 84, 85, 73, 100, 66, 91, 90, 74, 99,
+  74, 80, 81, 64, 80, 99, 81, 93, 78, 79,
+  76, 81, 88, 91, 81, 86, 72, 73, 71, 77,
+  85, 97, 75, 83, 92, 86, 90, 87, 78, 75,
+  87, 91, 83, 77, 85, 87, 85, 77, 75, 82,
+  68, 84, 75, 90, 82, 103, 86, 97, 86, 83,
+  83, 62, 62, 92, 64, 78, 85, 79, 92, 92,
+  84, 100, 72, 67, 78, 80, 85, 83, 92, 67,
+  76, 79, 88, 82, 83, 88, 89, 59, 80, 96,
+  82, 77, 82, 87, 88, 92, 89, 89, 83, 89,
+  84, 84, 80, 97, 100, 83, 91, 92, 78, 87,
+  87, 78, 83, 88, 84, 91, 87, 80, 83, 89,
+  80, 93, 83, 76, 89, 83, 93, 80, 86, 80,
+  88, 82, 85, 74, 86, 87, 81, 99, 84, 82,
+  78, 76, 85, 97, 86, 93, 78, 90, 74, 78,
+  85, 86, 85, 83, 85, 75, 73, 78, 89, 86,
+  81, 79, 90, 86, 90, 84, 87, 69, 88, 86,
+  76, 80, 86, 81, 87, 83, 77, 85, 78, 84,
+  77, 87, 97, 102, 85, 84, 86, 87, 82, 83,
+  71, 92, 71, 85, 55, 88, 86, 106, 87, 67,
+  88, 84, 82, 77, 96, 90, 79, 95, 79, 73,
+  67, 72, 107, 98, 83, 97, 75, 82, 90, 83,
+  101, 72, 113, 93, 89, 78, 92, 74, 79, 88,
+  74, 120, 91, 75, 113, 67, 92, 93, 61, 95,
+  63, 105, 94, 75, 90, 106, 77, 103, 96, 92,
+  89, 85, 108, 76, 76, 100, 128, 75, 90, 76,
+  82, 91, 70, 77, 98, 90, 61, 71, 85, 82,
+  71, 84, 114, 75, 84, 91, 101, 82, 83, 87,
+  98, 97, 80, 115, 93, 78, 55, 75, 78, 91,
+  92, 85, 63, 123, 81, 81, 86, 87, 77, 71,
+  99, 96, 122, 60, 122, 86, 94, 96, 87, 87,
+  85, 77, 89, 89, 100, 74, 109, 70, 83, 76,
+  93, 77, 61, 79, 77, 109, 86, 64, 82, 79,
+  78, 84, 92, 90, 72, 93, 81, 77, 71, 72,
+  101, 93, 93, 85, 74, 77, 86, 87, 98, 70,
+  70, 95, 85, 76, 81, 77, 82, 75, 74, 112,
+  91, 78, 99, 64, 86, 88, 64, 86, 56, 95,
+  87, 78, 80, 102, 74, 100, 90, 92, 85, 79,
+  94, 81, 76, 89, 128, 70, 95, 77, 79, 90,
+  73, 79, 92, 98, 61, 77, 86, 80, 74, 85,
+  106, 79, 80, 85, 95, 79, 75, 90, 97, 91,
+  68, 111, 80, 82, 58, 74, 79, 82, 87, 88,
+  74, 109, 85, 77, 85, 83, 74, 68, 91, 91,
+  122, 64, 120, 87, 85, 91, 84, 82, 84, 78,
+  90, 87, 110, 80, 102, 74, 81, 80, 90, 72,
+  66, 76, 73, 100, 83, 73, 86, 83, 83, 80,
+  87, 88, 77, 85, 81, 78, 74, 79, 97, 87,
+  89, 83, 77, 85, 84, 80, 99, 72, 101, 89,
+  80, 75, 83, 81, 77, 73, 74, 103, 87, 81,
+  101, 67, 83, 91, 67, 93, 61, 91, 88, 77,
+  84, 98, 79, 87, 95, 83, 88, 82, 98, 80,
+  77, 90, 120, 74, 83, 76, 82, 86, 77, 79,
+  90, 91, 64, 74, 97, 80, 79, 92, 96, 79,
+  79, 90, 87, 80, 79, 89, 96, 89, 81, 102,
+  86, 79, 61, 74, 82, 80, 83, 85, 94, 101,
+  83, 79, 82, 83, 78, 72, 96, 90, 110, 74,
+  104, 82, 85, 86, 77, 85, 93, 76, 89, 88,
+  104, 77, 92, 69, 85, 80, 85, 74, 82, 80,
+  83, 99, 78, 77, 86, 89, 77, 85, 86, 82,
+  90, 89, 87, 76, 72, 94, 93, 84, 78, 82,
+  80, 91, 88, 91, 94, 67, 98, 91, 90, 69,
+  81, 73, 79, 81, 82, 90, 82, 80, 87, 69,
+  84, 79, 93, 90, 64, 84, 83, 85, 83, 93,
+  81, 69, 93, 74, 86, 91, 67, 87, 86, 82,
+  112, 83, 76, 85, 73, 81, 64, 92, 80, 83,
+  75, 81, 81, 85, 83, 79, 90, 82, 92, 84,
+  74, 73, 79, 86, 90, 82, 81, 101, 68, 82,
+  58, 81, 85, 81, 76, 89, 53, 75, 87, 81,
+  84, 82, 70, 56, 98, 83, 105, 90, 118, 81,
+  79, 85, 84, 73, 82, 79, 82, 83, 109, 93,
+  60, 82, 82, 87, 74, 80, 90, 74, 75, 97,
+  75, 77, 86, 87, 75, 92, 83, 87, 87, 81,
+  90, 82, 78, 89, 84, 81, 88, 76, 84, 93,
+  77, 94, 99, 67, 79, 87, 83, 64, 79, 76,
+  78, 69, 82, 87, 81, 81, 81, 73, 75, 77,
+  98, 92, 52, 78, 81, 85, 78, 87, 77, 67,
+  86, 84, 85, 86, 66, 88, 86, 78, 101, 85,
+  73, 86, 68, 80, 66, 95, 79, 85, 78, 81,
+  81, 82, 87, 76, 86, 87, 88, 84, 75, 74,
+  82, 87, 86, 80, 75, 107, 56, 85, 54, 83,
+  89, 79, 74, 94, 65, 68, 85, 79, 85, 80,
+  75, 60, 90, 79, 109, 97, 110, 79, 77, 88,
+  79, 71, 74, 81, 80, 83, 96, 103, 56, 84,
+  79, 86, 73, 81, 87, 76, 70, 93, 78, 82,
+  87, 86, 77, 86, 79, 82, 87, 77, 83, 83,
+  76, 91, 84, 80, 88, 78, 84, 94, 75, 83,
+  95, 71, 93, 85, 85, 67, 83, 81, 86, 77,
+  82, 88, 81, 83, 83, 73, 79, 83, 89, 91,
+  58, 82, 81, 81, 79, 88, 81, 66, 86, 86,
+  87, 92, 69, 88, 87, 82, 102, 84, 75, 84,
+  69, 80, 75, 91, 82, 82, 75, 81, 93, 83,
+  84, 80, 89, 83, 85, 88, 74, 80, 83, 85,
+  82, 83, 85, 96, 67, 82, 59, 80, 90, 75,
+  78, 87, 82, 72, 89, 86, 86, 81, 74, 64,
+  98, 82, 100, 95, 97, 77, 78, 85, 74, 72,
+  82, 81, 81, 87, 83, 96, 58, 79, 83, 85,
+  73, 78, 87, 85, 85, 87, 82, 97, 83, 83,
+  86, 86, 73, 82, 96, 83, 88, 79, 61, 101,
+  75, 92, 70, 76, 87, 107, 90, 81, 92, 71,
+  85, 88, 80, 77, 90, 90, 89, 83, 81, 83,
+  75, 90, 69, 84, 85, 80, 94, 90, 75, 83,
+  91, 83, 87, 86, 92, 56, 92, 78, 89, 91,
+  59, 85, 87, 96, 81, 93, 76, 94, 73, 79,
+  73, 87, 86, 86, 87, 82, 87, 91, 91, 82,
+  84, 81, 82, 84, 69, 82, 85, 90, 90, 78,
+  83, 97, 68, 79, 70, 84, 87, 83, 79, 90,
+  67, 68, 79, 88, 82, 85, 70, 77, 90, 84,
+  91, 105, 105, 78, 78, 89, 83, 82, 80, 85,
+  82, 86, 90, 92, 43, 83, 90, 96, 68, 80,
+  90, 83, 80, 88, 87, 102, 80, 79, 83, 92,
+  72, 87, 95, 81, 88, 87, 66, 92, 68, 93,
+  80, 75, 100, 107, 82, 79, 85, 70, 80, 87,
+  77, 73, 83, 90, 87, 80, 85, 86, 78, 93,
+  70, 85, 74, 83, 93, 89, 73, 78, 89, 84,
+  80, 83, 88, 61, 92, 83, 88, 88, 61, 85,
+  91, 90, 77, 94, 77, 95, 74, 78, 80, 90,
+  85, 85, 88, 81, 92, 85, 94, 81, 79, 82,
+  79, 85, 66, 74, 93, 92, 90, 88, 78, 87,
+  57, 84, 67, 86, 91, 79, 85, 90, 82, 68,
+  76, 93, 84, 82, 76, 76, 84, 83, 83, 109,
+  94, 79, 79, 89, 81, 88, 81, 87, 81, 86,
+  77, 96, 41, 86, 93, 93, 74, 84, 92, 79,
+  80, 90, 83, 93, 83, 78, 83, 83, 69, 86,
+  93, 76, 82, 85, 61, 93, 75, 86, 84, 76,
+  92, 105, 81, 79, 88, 71, 81, 88, 82, 73,
+  88, 90, 88, 81, 81, 83, 80, 91, 74, 86,
+  75, 82, 91, 85, 73, 82, 87, 80, 84, 85,
+  89, 61, 92, 88, 92, 91, 60, 84, 87, 92,
+  82, 91, 74, 92, 64, 77, 78, 85, 79, 83,
+  83, 82, 93, 91, 88, 80, 80, 78, 77, 86,
+  71, 74, 91, 90, 84, 85, 85, 91, 72, 82,
+  69, 82, 88, 76, 83, 87, 91, 75, 81, 90,
+  86, 83, 72, 75, 89, 84, 87, 101, 92, 76,
+  74, 86, 80, 79, 90, 85, 83, 85, 83, 87,
+  53, 87, 93, 90, 69, 77, 88, 84, 86, 87,
+  74, 85, 73, 81, 78, 91, 88, 85, 79, 70,
+  82, 82, 77, 104, 86, 81, 86, 73, 87, 86,
+  95, 83, 73, 78, 92, 99, 101, 84, 82, 84,
+  90, 78, 87, 81, 83, 83, 79, 83, 77, 81,
+  74, 71, 90, 84, 79, 88, 70, 86, 88, 80,
+  86, 71, 70, 78, 65, 85, 89, 85, 88, 84,
+  76, 87, 84, 85, 88, 95, 70, 82, 75, 93,
+  80, 76, 84, 85, 93, 85, 84, 72, 72, 90,
+  93, 73, 92, 96, 74, 78, 78, 74, 70, 71,
+  75, 81, 86, 84, 70, 68, 76, 79, 87, 78,
+  87, 94, 80, 89, 72, 95, 80, 86, 99, 72,
+  86, 79, 81, 90, 90, 105, 92, 88, 80, 90,
+  81, 89, 91, 80, 80, 86, 72, 86, 79, 73,
+  77, 85, 79, 87, 87, 82, 76, 72, 80, 83,
+  77, 96, 86, 83, 80, 82, 79, 81, 84, 87,
+  75, 78, 87, 95, 103, 88, 83, 79, 91, 75,
+  92, 79, 72, 79, 76, 83, 88, 87, 76, 71,
+  93, 82, 76, 86, 79, 86, 90, 86, 81, 77,
+  72, 77, 64, 89, 97, 92, 88, 88, 71, 87,
+  82, 87, 93, 79, 74, 77, 73, 92, 85, 78,
+  85, 89, 104, 85, 88, 72, 76, 81, 93, 73,
+  78, 93, 77, 80, 76, 78, 74, 69, 81, 77,
+  90, 90, 81, 72, 74, 81, 84, 80, 86, 92,
+  85, 89, 78, 92, 78, 89, 95, 77, 81, 76,
+  71, 89, 92, 108, 90, 90, 83, 89, 82, 86,
+  93, 82, 85, 83, 66, 86, 79, 81, 74, 88,
+  83, 91, 88, 83, 75, 81, 82, 85, 85, 105,
+  85, 83, 78, 84, 87, 84, 69, 82, 78, 81,
+  87, 88, 91, 87, 85, 84, 99, 76, 92, 80,
+  69, 81, 79, 85, 95, 84, 76, 74, 90, 87,
+  73, 89, 74, 86, 88, 78, 92, 83, 68, 76,
+  69, 86, 90, 83, 87, 83, 85, 88, 75, 88,
+  92, 82, 88, 85, 79, 90, 93, 77, 82, 93,
+  102, 89, 87, 70, 77, 72, 89, 71, 77, 95,
+  77, 84, 77, 87, 73, 75, 90, 82, 84, 88,
+  84, 73, 81, 88, 88, 79, 83, 91, 81, 89,
+  69, 97, 77, 90, 95, 95, 77, 76, 70, 88,
+  87, 103, 83, 84, 85, 92, 78, 80, 92, 81,
+  80, 85, 95, 104, 74, 88, 79, 71, 97, 82,
+  74, 80, 90, 68, 72, 108, 81, 82, 76, 77,
+  88, 71, 79, 89, 98, 83, 80, 68, 89, 86,
+  95, 78, 80, 86, 85, 74, 79, 90, 92, 82,
+  79, 90, 70, 96, 72, 91, 101, 82, 84, 77,
+  77, 86, 86, 91, 77, 83, 77, 85, 77, 100,
+  77, 81, 70, 80, 71, 76, 94, 86, 91, 60,
+  77, 77, 69, 75, 78, 76, 88, 101, 85, 89,
+  81, 86, 84, 77, 97, 91, 87, 71, 90, 73,
+  59, 78, 69, 78, 59, 71, 88, 70, 73, 82,
+  61, 84, 86, 70, 87, 111, 83, 83, 70, 75,
+  83, 73, 87, 66, 97, 83, 81, 87, 95, 103,
+  90, 83, 80, 91, 91, 88, 79, 81, 66, 88,
+  83, 94, 79, 79, 78, 76, 99, 77, 73, 79,
+  67, 82, 70, 108, 78, 75, 68, 79, 75, 95,
+  77, 91, 78, 81, 88, 67, 81, 79, 84, 75,
+  74, 88, 72, 67, 84, 93, 81, 83, 88, 85,
+  71, 85, 72, 81, 100, 87, 80, 73, 85, 101,
+  92, 92, 73, 90, 90, 84, 79, 103, 83, 106,
+  73, 90, 71, 85, 95, 93, 105, 58, 85, 68,
+  68, 69, 77, 83, 83, 83, 94, 91, 80, 89,
+  91, 75, 92, 101, 71, 61, 90, 69, 66, 82,
+  70, 72, 66, 63, 85, 78, 84, 104, 63, 94,
+  82, 74, 88, 126, 87, 75, 68, 67, 75, 76,
+  81, 64, 98, 80, 83, 91, 98, 105, 78, 81,
+  80, 85, 84, 83, 72, 88, 75, 102, 74, 101,
+  79, 83, 79, 75, 95, 83, 74, 80, 93, 92,
+  73, 110, 89, 85, 77, 78, 71, 76, 90, 91,
+  73, 85, 84, 73, 85, 84, 91, 88, 80, 93,
+  89, 68, 81, 89, 70, 88, 79, 90, 92, 98,
+  71, 81, 98, 98, 75, 80, 81, 86, 88, 89,
+  75, 83, 77, 91, 78, 98, 77, 78, 71, 81,
+  77, 77, 84, 85, 92, 61, 84, 74, 73, 73,
+  84, 74, 80, 85, 93, 91, 88, 83, 84, 76,
+  98, 94, 79, 70, 90, 78, 62, 80, 68, 80,
+  62, 68, 84, 75, 97, 71, 67, 96, 85, 72,
+  82, 105, 86, 81, 70, 80, 78, 81, 87, 89,
+  91, 72, 78, 88, 96, 102, 73, 82, 78, 90,
+  89, 80, 79, 82, 84, 93, 101, 100, 77, 93,
+  75, 79, 104, 80, 69, 82, 104, 82, 72, 94,
+  82, 64, 74, 82, 90, 91, 87, 77, 87, 80,
+  92, 73, 87, 81, 82, 79, 75, 74, 91, 91,
+  81, 89, 83, 85, 85, 100, 96, 90, 84, 91,
+  82, 88, 86, 82, 100, 84, 91, 99, 80, 73,
+  87, 78, 97, 98, 77, 81, 77, 73, 76, 71,
+  74, 93, 84, 71, 68, 79, 86, 84, 73, 97,
+  98, 108, 74, 90, 73, 89, 98, 79, 89, 93,
+  83, 69, 85, 77, 60, 91, 87, 77, 69, 67,
+  84, 75, 67, 102, 77, 86, 86, 68, 80, 111,
+  88, 79, 70, 81, 80, 69, 83, 75, 96, 90,
+  91, 86, 92, 127, 88, 87, 88, 80, 93, 79,
+  71, 88, 68, 80, 69, 77, 75, 95, 73, 77,
+  100, 79, 68, 79, 64, 82, 74, 79, 74, 60,
+  64, 79, 102, 120, 93, 79, 78, 76, 106, 74,
+  78, 75, 75, 72, 72, 77, 79, 84, 82, 93,
+  85, 76, 97, 95, 87, 71, 101, 99, 76, 90,
+  77, 79, 104, 92, 91, 91, 84, 86, 102, 69,
+  115, 106, 82, 112, 79, 81, 79, 80, 72, 108,
+  87, 72, 87, 75, 102, 89, 67, 117, 100, 92,
+  76, 87, 67, 81, 99, 85, 76, 94, 69, 64,
+  73, 74, 73, 99, 83, 76, 74, 58, 77, 91,
+  69, 135, 88, 100, 91, 72, 87, 140, 98, 68,
+  70, 73, 68, 71, 83, 72, 85, 102, 99, 93,
+  97, 149, 89, 83, 84, 73, 83, 73, 73, 99,
+  85, 81, 78, 93, 77, 83, 74, 75, 105, 82,
+  71, 76, 102, 76, 72, 99, 84, 63, 73, 76,
+  90, 78, 92, 82, 76, 80, 92, 75, 82, 90,
+  84, 91, 76, 95, 89, 78, 84, 90, 79, 89,
+  85, 89, 87, 90, 85, 90, 80, 98, 88, 85,
+  101, 79, 91, 94, 79, 96, 82, 84, 101, 99,
+  75, 80, 77, 70, 81, 73, 75, 90, 85, 71,
+  96, 78, 88, 85, 64, 93, 95, 83, 90, 89,
+  77, 89, 93, 94, 89, 93, 81, 71, 84, 80,
+  64, 92, 85, 79, 65, 65, 83, 77, 87, 87,
+  78, 94, 86, 70, 83, 104, 91, 77, 72, 82,
+  76, 70, 83, 96, 79, 86, 79, 88, 90, 121,
+  81, 90, 90, 79, 92, 75, 70, 87, 90, 88,
+  71, 70, 83, 78, 105, 82, 80, 69, 79, 84,
+  81, 90, 90, 87, 91, 100, 81, 90, 88, 85,
+  75, 93, 80, 85, 84, 73, 78, 76, 91, 87,
+  97, 77, 82, 79, 85, 82, 78, 80, 91, 68,
+  92, 84, 82, 85, 84, 93, 95, 85, 81, 82,
+  76, 92, 78, 90, 95, 91, 78, 86, 83, 92,
+  93, 73, 77, 91, 91, 88, 81, 85, 81, 80,
+  94, 84, 91, 78, 77, 77, 90, 91, 88, 88,
+  79, 74, 96, 77, 91, 77, 79, 85, 82, 81,
+  84, 90, 82, 96, 88, 83, 84, 82, 74, 90,
+  88, 84, 89, 90, 80, 89, 76, 78, 92, 99,
+  83, 89, 88, 100, 78, 89, 83, 86, 86, 88,
+  76, 82, 82, 86, 91, 86, 78, 92, 85, 87,
+  74, 83, 94, 84, 94, 77, 81, 75, 74, 101,
+  86, 94, 76, 69, 92, 90, 89, 88, 66, 101,
+  87, 85, 83, 78, 77, 69, 86, 86, 78, 79,
+  76, 82, 83, 86, 74, 65, 85, 51, 76, 83,
+  76, 89, 93, 87, 96, 72, 91, 91, 85, 74,
+  94, 83, 100, 80, 92, 85, 85, 92, 93, 76,
+  65, 63, 85, 76, 80, 79, 73, 79, 102, 83,
+  84, 82, 72, 75, 85, 70, 89, 85, 81, 70,
+  81, 83, 84, 94, 85, 84, 84, 84, 82, 88,
+  92, 69, 85, 80, 77, 83, 75, 78, 78, 83,
+  80, 89, 79, 87, 80, 71, 82, 86, 80, 90,
+  75, 99, 87, 83, 85, 86, 83, 85, 85, 82,
+  85, 83, 82, 78, 84, 81, 94, 87, 75, 95,
+  85, 84, 94, 88, 80, 73, 80, 112, 70, 87,
+  71, 62, 90, 87, 72, 88, 87, 101, 87, 82,
+  95, 84, 82, 80, 81, 92, 68, 76, 88, 99,
+  102, 89, 82, 75, 84, 63, 80, 85, 78, 96,
+  83, 102, 88, 70, 99, 96, 89, 68, 106, 85,
+  93, 70, 98, 84, 85, 80, 88, 70, 67, 65,
+  78, 73, 83, 79, 94, 95, 96, 94, 77, 80,
+  74, 80, 82, 78, 90, 87, 83, 87, 73, 90,
+  88, 102, 90, 80, 88, 91, 87, 80, 99, 70,
+  88, 76, 86, 92, 85, 93, 86, 82, 80, 91,
+  78, 87, 76, 70, 89, 75, 75, 96, 80, 96,
+  85, 85, 78, 94, 81, 82, 76, 79, 95, 91,
+  84, 83, 88, 88, 80, 87, 73, 79, 76, 79,
+  92, 82, 75, 85, 85, 112, 85, 95, 93, 87,
+  91, 85, 90, 85, 86, 100, 84, 86, 81, 82,
+  89, 74, 77, 87, 76, 68, 71, 76, 84, 86,
+  79, 92, 83, 68, 80, 81, 76, 91, 84, 90,
+  89, 77, 74, 89, 90, 72, 86, 66, 89, 67,
+  85, 81, 83, 78, 88, 54, 66, 61, 94, 81,
+  73, 100, 62, 78, 92, 81, 81, 85, 73, 79,
+  72, 85, 91, 86, 89, 75, 78, 85, 95, 88,
+  83, 87, 86, 78, 80, 93, 95, 77, 82, 81,
+  75, 84, 75, 71, 80, 81, 84, 75, 83, 87,
+  74, 71, 87, 76, 81, 95, 83, 103, 88, 84,
+  77, 95, 88, 86, 84, 80, 89, 79, 87, 85,
+  76, 69, 124, 86, 73, 94, 64, 76, 95, 88,
+  68, 77, 80, 143, 77, 75, 79, 73, 88, 83,
+  83, 92, 114, 99, 88, 76, 92, 79, 146, 82,
+  77, 86, 54, 69, 68, 79, 97, 78, 68, 74,
+  91, 61, 64, 80, 81, 93, 94, 96, 80, 73,
+  74, 109, 94, 58, 97, 46, 92, 53, 89, 75,
+  94, 84, 85, 51, 46, 52, 80, 71, 79, 111,
+  41, 74, 85, 88, 82, 72, 74, 80, 79, 69,
+  84, 83, 86, 88, 70, 91, 90, 116, 80, 82,
+  73, 72, 84, 75, 91, 63, 79, 73, 64, 75,
+  79, 60, 76, 81, 75, 86, 90, 87, 81, 69,
+  93, 67, 72, 91, 97, 96, 120, 74, 71, 92,
+  76, 86, 68, 72, 91, 83, 78, 87, 77, 64,
+  92, 78, 81, 87, 76, 81, 88, 88, 77, 76,
+  91, 101, 90, 74, 78, 83, 87, 85, 84, 80,
+  102, 92, 103, 99, 82, 78, 114, 86, 79, 93,
+  67, 73, 93, 88, 112, 83, 80, 78, 85, 71,
+  78, 84, 89, 100, 84, 89, 75, 79, 87, 93,
+  95, 74, 99, 66, 88, 64, 88, 88, 93, 88,
+  89, 59, 62, 63, 81, 87, 79, 82, 74, 88,
+  85, 92, 91, 82, 72, 78, 84, 88, 87, 88,
+  86, 93, 72, 83, 91, 88, 75, 99, 87, 74,
+  86, 87, 92, 81, 94, 90, 78, 78, 82, 72,
+  87, 81, 87, 88, 72, 91, 79, 70, 88, 67,
+  81, 88, 93, 80, 79, 84, 69, 83, 83, 81,
+  75, 79, 101, 87, 89, 93, 87, 86, 70, 81,
+  82, 94, 74, 83, 96, 94, 77, 75, 81, 112,
+  65, 79, 89, 65, 89, 85, 75, 94, 82, 93,
+  77, 84, 88, 90, 88, 77, 79, 89, 58, 66,
+  88, 91, 94, 85, 90, 91, 82, 71, 82, 77,
+  75, 83, 79, 93, 93, 69, 87, 85, 87, 70,
+  99, 80, 86, 67, 101, 84, 87, 86, 94, 67,
+  74, 67, 83, 81, 82, 93, 93, 83, 92, 84,
+  82, 87, 74, 108, 91, 75, 92, 79, 93, 80,
+  75, 93, 88, 108, 84, 79, 92, 81, 87, 81,
+  100, 71, 79, 79, 85, 93, 86, 88, 97, 82,
+  87, 75, 79, 103, 90, 69, 72, 78, 83, 94,
+  88, 100, 96, 80, 80, 93, 85, 92, 81, 78,
+  94, 85, 86, 89, 74, 76, 85, 81, 74, 97,
+  82, 82, 95, 89, 79, 74, 78, 96, 82, 76,
+  85, 79, 94, 82, 82, 79, 85, 91, 87, 95,
+  81, 80, 102, 70, 89, 82, 67, 86, 81, 86,
+  84, 88, 76, 75, 92, 62, 68, 75, 81, 88,
+  91, 89, 86, 76, 98, 81, 94, 76, 96, 72,
+  89, 78, 88, 92, 90, 90, 91, 79, 67, 60,
+  82, 91, 86, 76, 71, 73, 95, 91, 90, 87,
+  83, 86, 95, 67, 95, 85, 89, 79, 78, 89,
+  85, 90, 89, 86, 96, 78, 90, 86, 99, 71,
+  87, 88, 77, 87, 82, 84, 86, 80, 84, 87,
+  77, 102, 87, 73, 77, 86, 77, 80, 90, 81,
+  87, 78, 77, 79, 79, 84, 77, 81, 88, 91,
+  85, 86, 85, 82, 68, 78, 81, 81, 95, 89,
+  75, 85, 82, 82, 80, 70, 98, 85, 86, 96,
+  79, 90, 86, 78, 89, 78, 81, 96, 80, 73,
+  61, 67, 89, 86, 96, 86, 97, 87, 81, 84,
+  83, 77, 78, 66, 83, 84, 82, 89, 81, 86,
+  88, 84, 86, 78, 87, 88, 87, 81, 81, 93,
+  73, 81, 86, 93, 86, 82, 84, 83, 90, 81,
+  90, 83, 86, 80, 79, 93, 90, 77, 82, 90,
+  92, 79, 99, 86, 83, 76, 85, 85, 80, 74,
+  78, 86, 96, 76, 93, 92, 80, 80, 94, 90,
+  81, 79, 74, 93, 84, 85, 73, 85, 63, 96,
+  62, 70, 84, 88, 75, 83, 98, 77, 56, 88,
+  73, 76, 72, 82, 69, 79, 78, 91, 80, 90,
+  95, 94, 79, 93, 88, 81, 85, 89, 73, 82,
+  84, 85, 79, 81, 81, 77, 82, 84, 116, 76,
+  90, 83, 77, 89, 83, 86, 75, 119, 96, 76,
+  72, 84, 81, 81, 85, 78, 81, 80, 82, 84,
+  88, 79, 82, 88, 92, 93, 82, 79, 88, 77,
+  82, 71, 77, 81, 80, 81, 80, 75, 83, 81,
+  74, 73, 90, 82, 89, 86, 84, 75, 88, 73,
+  79, 77, 83, 68, 85, 72, 84, 79, 80, 82,
+  84, 75, 78, 88, 81, 79, 82, 78, 90, 82,
+  71, 88, 87, 85, 82, 93, 115, 75, 78, 99,
+  77, 84, 84, 77, 76, 81, 73, 84, 84, 85,
+  84, 92, 88, 81, 88, 87, 86, 97, 81, 80,
+  68, 89, 81, 105, 75, 82, 94, 72, 93, 85,
+  80, 95, 87, 82, 76, 99, 75, 104, 90, 87,
+  83, 84, 78, 75, 86, 75, 139, 80, 85, 84,
+  82, 94, 84, 79, 76, 130, 77, 77, 67, 75,
+  87, 84, 80, 88, 76, 77, 82, 75, 89, 78,
+  83, 83, 97, 96, 78, 81, 91, 78, 84, 67,
+  74, 83, 74, 84, 83, 74, 81, 83, 73, 76,
+  94, 79, 90, 84, 78, 71, 82, 73, 79, 78,
+  90, 69, 80, 78, 91, 81, 78, 89, 82, 73,
+  81, 84, 79, 78, 81, 81, 86, 77, 76, 88,
+  87, 80, 82, 93, 133, 76, 80, 102, 76, 81,
+  115, 79, 74, 76, 76, 89, 79, 83, 83, 91,
+  101, 85, 88, 85, 89, 105, 88, 84, 75, 85,
+  77, 121, 76, 79, 99, 78, 92, 83, 84, 85,
+  88, 77, 86, 90, 73, 80, 86, 84, 82, 82,
+  81, 77, 83, 83, 112, 81, 87, 82, 83, 90,
+  90, 86, 79, 114, 93, 82, 69, 78, 83, 82,
+  84, 88, 79, 78, 79, 82, 84, 76, 86, 87,
+  95, 87, 78, 79, 91, 80, 76, 72, 78, 76,
+  79, 87, 84, 75, 81, 81, 73, 73, 89, 82,
+  92, 87, 84, 75, 90, 82, 84, 79, 82, 75,
+  84, 72, 83, 80, 76, 80, 85, 74, 75, 79,
+  79, 80, 76, 78, 89, 81, 71, 80, 91, 88,
+  72, 93, 109, 72, 86, 93, 78, 77, 82, 78,
+  75, 82, 75, 83, 84, 86, 81, 90, 93, 81,
+  85, 87, 82, 94, 80, 78, 80, 88, 79, 103,
+  77, 85, 93, 71, 91, 91, 77, 100, 89, 73,
+  83, 83, 72, 95, 92, 82, 75, 80, 79, 80,
+  85, 86, 127, 79, 92, 86, 85, 90, 84, 82,
+  73, 126, 79, 77, 70, 85, 88, 85, 75, 76,
+  85, 77, 82, 77, 86, 72, 81, 83, 86, 90,
+  82, 79, 88, 77, 78, 73, 76, 81, 75, 76,
+  83, 71, 86, 79, 74, 72, 88, 78, 94, 87,
+  84, 76, 89, 74, 83, 70, 78, 70, 87, 78,
+  83, 76, 87, 79, 81, 75, 78, 86, 84, 78,
+  80, 77, 85, 78, 67, 84, 80, 79, 87, 90,
+  119, 79, 83, 90, 87, 84, 101, 77, 71, 80,
+  74, 85, 87, 86, 79, 88, 86, 81, 86, 92,
+  89, 100, 85, 87, 79, 91, 85, 116, 72, 82,
+  93, 78, 99, 84, 83, 116, 94, 78, 72, 96,
+  78, 134, 101, 89, 81, 82, 79, 76, 90, 75,
+  172, 82, 88, 95, 81, 96, 89, 76, 76, 147,
+  59, 78, 68, 80, 100, 93, 72, 94, 91, 76,
+  85, 67, 82, 75, 79, 74, 88, 89, 77, 74,
+  88, 81, 76, 67, 75, 86, 74, 79, 93, 70,
+  84, 83, 76, 70, 93, 86, 86, 86, 78, 76,
+  86, 73, 74, 72, 85, 69, 82, 97, 97, 80,
+  78, 82, 78, 75, 92, 81, 88, 69, 80, 85,
+  81, 79, 78, 79, 76, 74, 101, 83, 150, 80,
+  79, 95, 88, 79, 152, 79, 71, 86, 78, 89,
+  91, 86, 76, 81, 105, 80, 87, 88, 84, 115,
+  93, 90, 86, 93, 84, 141, 76, 76, 105, 89,
+  86, 80, 91, 94, 89, 83, 84, 86, 73, 95,
+  94, 84, 79, 84, 79, 80, 85, 90, 126, 80,
+  90, 84, 80, 90, 91, 83, 76, 122, 78, 78,
+  73, 84, 91, 88, 82, 95, 81, 75, 78, 75,
+  84, 72, 89, 83, 88, 91, 81, 72, 89, 82,
+  71, 71, 78, 80, 74, 82, 85, 72, 79, 83,
+  77, 76, 89, 81, 94, 86, 85, 78, 89, 80,
+  82, 73, 77, 77, 83, 77, 83, 77, 79, 77,
+  81, 72, 79, 82, 83, 78, 81, 76, 84, 79,
+  69, 82, 81, 80, 75, 92, 113, 76, 86, 88,
+  88, 82, 94, 79, 71, 78, 76, 81, 86, 88,
+  79, 90, 92, 79, 83, 94, 77, 94, 84, 87,
+  84, 91, 81, 111, 76, 87, 95, 77, 88, 90,
+  81, 89, 85, 77, 90, 71, 76, 79, 89, 81,
+  81, 77, 78, 79, 87, 90, 107, 77, 83, 82,
+  80, 96, 90, 80, 75, 116, 98, 82, 75, 89,
+  81, 85, 77, 81, 84, 77, 87, 75, 86, 86,
+  81, 84, 89, 86, 86, 81, 82, 80, 83, 76,
+  82, 75, 75, 79, 82, 74, 89, 83, 76, 77,
+  85, 81, 91, 85, 78, 75, 88, 79, 82, 77,
+  71, 77, 89, 78, 76, 74, 88, 87, 80, 82,
+  73, 78, 88, 79, 77, 78, 85, 77, 67, 82,
+  87, 87, 84, 85, 110, 80, 89, 96, 81, 85,
+  74, 74, 72, 77, 73, 83, 73, 86, 82, 96,
+  81, 84, 83, 94, 82, 94, 85, 80, 82, 90,
+  81, 85, 75, 94, 82, 72, 89, 86, 91, 96,
+  93, 77, 83, 74, 80, 91, 85, 80, 78, 81,
+  88, 79, 88, 88, 115, 79, 85, 84, 80, 101,
+  93, 79, 76, 118, 78, 78, 68, 86, 84, 91,
+  76, 86, 83, 78, 88, 71, 84, 84, 82, 81,
+  86, 89, 86, 83, 87, 81, 81, 72, 82, 79,
+  71, 78, 87, 74, 88, 84, 73, 75, 87, 77,
+  94, 84, 78, 72, 94, 87, 80, 71, 73, 82,
+  93, 83, 80, 79, 85, 89, 80, 81, 74, 76,
+  87, 73, 83, 78, 84, 77, 69, 81, 86, 80,
+  91, 82, 116, 77, 90, 95, 86, 78, 92, 75,
+  72, 84, 75, 84, 74, 87, 84, 95, 88, 85,
+  83, 94, 79, 94, 83, 79, 84, 91, 81, 96,
+  79, 103, 86, 74, 86, 85, 88, 83, 86, 74,
+  92, 74, 76, 81, 90, 84, 80, 82, 80, 79,
+  85, 89, 107, 79, 84, 85, 80, 94, 89, 81,
+  74, 111, 94, 74, 81, 83, 80, 89, 82, 81,
+  83, 76, 79, 77, 86, 88, 82, 83, 91, 88,
+  83, 83, 81, 81, 81, 77, 79, 72, 75, 77,
+  85, 75, 87, 86, 79, 79, 87, 81, 91, 87,
+  79, 76, 90, 82, 81, 78, 74, 82, 86, 80,
+  78, 81, 83, 86, 81, 83, 71, 75, 89, 81,
+  82, 76, 86, 74, 65, 81, 88, 87, 80, 88,
+  110, 81, 90, 94, 83, 79, 72, 74, 73, 76,
+  75, 81, 73, 90, 87, 95, 83, 80, 85, 97,
+  74, 92, 85, 77, 85, 90, 77, 87, 79, 100,
+  86, 72, 89, 77, 78, 93, 66, 85, 95, 85,
+  69, 75, 88, 76, 69, 74, 89, 85, 77, 85,
+  84, 92, 82, 76, 81, 80, 76, 90, 90, 75,
+  90, 102, 88, 85, 84, 77, 80, 70, 72, 80,
+  73, 78, 76, 89, 83, 99, 76, 85, 84, 89,
+  93, 105, 71, 82, 90, 99, 84, 83, 71, 105,
+  73, 80, 85, 81, 72, 81, 89, 109, 100, 74,
+  82, 86, 81, 91, 80, 80, 88, 101, 95, 79,
+  71, 98, 108, 61, 77, 84, 92, 76, 81, 68,
+  100, 70, 91, 86, 79, 73, 92, 83, 85, 80,
+  78, 77, 94, 87, 79, 85, 87, 76, 80, 113,
+  75, 69, 86, 68, 75, 85, 85, 94, 95, 80,
+  87, 73, 56, 78, 71, 77, 113, 87, 74, 95,
+  85, 81, 76, 87, 63, 80, 98, 90, 72, 75,
+  93, 78, 72, 71, 90, 88, 82, 81, 88, 99,
+  80, 74, 82, 82, 80, 97, 90, 78, 81, 87,
+  85, 85, 85, 76, 85, 84, 74, 84, 74, 92,
+  78, 92, 85, 100, 81, 79, 83, 83, 91, 111,
+  65, 79, 93, 102, 89, 80, 75, 98, 76, 80,
+  78, 84, 67, 82, 82, 106, 95, 82, 77, 84,
+  79, 92, 85, 81, 91, 108, 96, 85, 77, 103,
+  106, 57, 75, 83, 102, 77, 84, 65, 103, 74,
+  92, 84, 82, 76, 87, 84, 91, 81, 83, 79,
+  99, 96, 86, 81, 89, 72, 81, 114, 82, 69,
+  85, 68, 79, 84, 88, 89, 85, 79, 88, 76,
+  60, 74, 74, 79, 123, 92, 73, 97, 89, 77,
+  77, 88, 68, 82, 94, 92, 66, 77, 86, 77,
+  72, 72, 91, 82, 78, 82, 82, 103, 81, 80,
+  87, 82, 75, 88, 96, 75, 82, 82, 87, 81,
+  86, 75, 94, 83, 72, 81, 78, 78, 79, 87,
+  89, 91, 79, 80, 80, 83, 91, 103, 72, 77,
+  92, 98, 82, 83, 70, 104, 77, 77, 85, 82,
+  71, 84, 92, 102, 96, 76, 81, 87, 79, 90,
+  82, 82, 86, 91, 91, 92, 79, 95, 106, 64,
+  80, 80, 92, 74, 82, 73, 96, 70, 91, 82,
+  80, 74, 81, 81, 84, 81, 87, 81, 93, 103,
+  79, 85, 86, 76, 82, 109, 81, 73, 83, 70,
+  76, 80, 84, 86, 84, 78, 87, 77, 65, 76,
+  69, 79, 107, 88, 77, 97, 96, 80, 75, 86,
+  75, 90, 95, 81, 77, 75, 91, 82, 79, 74,
+  87, 82, 74, 84, 80, 99, 75, 81, 76, 82,
+  80, 86, 84, 70, 77, 88, 84, 76, 84, 83,
+  87, 72, 73, 84, 77, 76, 81, 82, 85, 97,
+  81, 87, 75, 95, 95, 98, 69, 82, 97, 98,
+  88, 82, 78, 106, 73, 95, 94, 75, 76, 86,
+  88, 109, 84, 76, 89, 87, 84, 97, 75, 68,
+  85, 103, 91, 83, 67, 92, 106, 65, 79, 85,
+  92, 78, 80, 64, 85, 75, 87, 80, 81, 79,
+  97, 84, 79, 88, 73, 82, 95, 84, 79, 86,
+  84, 83, 82, 114, 80, 70, 83, 68, 76, 89,
+  86, 87, 96, 78, 85, 80, 59, 80, 81, 75,
+  122, 80, 77, 85, 95, 82, 79, 79, 71, 82,
+  101, 88, 83, 72, 97, 83, 78, 76, 93, 92,
+  78, 86, 78, 108, 81, 80, 78, 88, 82, 95,
+  81, 72, 71, 75, 81, 82, 80, 80, 89, 86,
+  76, 90, 73, 91, 86, 86, 84, 100, 84, 82,
+  74, 88, 100, 107, 66, 86, 100, 103, 97, 77,
+  82, 100, 77, 105, 89, 77, 72, 88, 81, 106,
+  84, 85, 85, 86, 81, 100, 79, 71, 90, 106,
+  93, 83, 68, 95, 103, 67, 75, 79, 101, 81,
+  86, 59, 88, 75, 87, 79, 82, 83, 95, 87,
+  86, 85, 76, 83, 92, 92, 83, 84, 89, 80,
+  81, 115, 82, 70, 84, 68, 82, 87, 85, 84,
+  80, 77, 85, 81, 60, 78, 84, 76, 130, 84,
+  74, 84, 96, 77, 82, 83, 81, 88, 93, 92,
+  76, 77, 87, 83, 75, 77, 89, 80, 78, 83,
+  76, 111, 84, 87, 83, 85, 79, 88, 90, 71,
+  72, 80, 83, 80, 81, 76, 93, 83, 75, 83,
+  74, 80, 81, 80, 83, 91, 80, 82, 74, 92,
+  94, 96, 70, 84, 100, 101, 87, 81, 75, 108,
+  74, 86, 94, 77, 76, 89, 89, 105, 86, 74,
+  86, 89, 82, 91, 80, 70, 87, 92, 89, 95,
+  74, 93, 107, 71, 82, 75, 92, 76, 84, 72,
+  85, 70, 85, 80, 80, 80, 83, 84, 80, 91,
+  80, 81, 91, 98, 79, 86, 86, 80, 79, 108,
+  81, 73, 80, 71, 79, 79, 86, 80, 82, 76,
+  86, 81, 66, 78, 82, 75, 117, 80, 79, 83,
+  96, 79, 83, 88, 64, 88, 87, 77, 71, 80,
+  85, 89, 79, 73, 87, 81, 72, 77, 86, 92,
+  74, 75, 79, 86, 76, 82, 81, 73, 84, 87,
+  83, 78, 92, 84, 94, 71, 78, 82, 87, 66,
+  78, 89, 90, 94, 84, 87, 72, 96, 86, 109,
+  71, 89, 95, 95, 87, 85, 75, 96, 80, 89,
+  99, 76, 77, 84, 88, 105, 80, 74, 89, 91,
+  85, 100, 75, 73, 78, 100, 90, 87, 78, 93,
+  107, 70, 77, 78, 86, 79, 79, 72, 88, 79,
+  88, 83, 85, 73, 95, 85, 78, 90, 75, 77,
+  104, 81, 76, 87, 85, 83, 81, 105, 77, 76,
+  87, 72, 74, 86, 80, 85, 83, 77, 80, 85,
+  68, 74, 71, 77, 110, 80, 77, 90, 95, 81,
+  90, 84, 65, 85, 92, 82, 74, 75, 89, 89,
+  78, 78, 86, 89, 74, 75, 86, 102, 84, 75,
+  83, 87, 76, 89, 80, 74, 79, 79, 87, 82,
+  87, 86, 84, 81, 80, 87, 78, 80, 76, 98,
+  87, 99, 87, 83, 73, 93, 89, 109, 70, 93,
+  95, 98, 93, 82, 82, 91, 81, 88, 97, 77,
+  77, 85, 86, 109, 79, 75, 86, 93, 81, 100,
+  81, 77, 80, 95, 89, 88, 77, 99, 104, 73,
+  73, 78, 92, 84, 82, 65, 94, 80, 86, 84,
+  83, 74, 94, 88, 81, 87, 78, 78, 101, 81,
+  81, 86, 85, 78, 76, 107, 76, 74, 90, 71,
+  79, 84, 81, 80, 80, 77, 82, 84, 69, 75,
+  70, 77, 118, 79, 78, 84, 95, 79, 89, 88,
+  70, 86, 87, 85, 70, 79, 82, 85, 75, 79,
+  83, 74, 71, 79, 84, 104, 85, 75, 83, 89,
+  72, 86, 86, 73, 82, 86, 89, 81, 89, 77,
+  94, 79, 82, 81, 74, 70, 75, 89, 80, 91,
+  83, 83, 76, 90, 88, 106, 72, 86, 96, 94,
+  82, 86, 76, 98, 77, 82, 100, 78, 77, 86,
+  87, 105, 81, 73, 85, 94, 85, 96, 82, 73,
+  80, 94, 89, 89, 82, 94, 108, 74, 78, 79,
+  86, 80, 85, 79, 91, 76, 90, 82, 84, 73,
+  83, 86, 80, 91, 78, 75, 97, 87, 75, 87,
+  86, 81, 78, 102, 79, 76, 85, 74, 78, 77,
+  81, 84, 84, 77, 81, 86, 74, 77, 73, 77,
+  110, 80, 76, 87, 77, 76, 84, 67, 64, 80,
+  78, 96, 76, 88, 92, 75, 84, 95, 63, 80,
+  84, 94, 77, 91, 92, 86, 97, 87, 74, 81,
+  83, 92, 94, 76, 93, 74, 84, 83, 78, 95,
+  88, 79, 80, 68, 88, 72, 82, 77, 96, 75,
+  63, 86, 86, 86, 82, 94, 78, 79, 89, 88,
+  83, 82, 85, 89, 68, 78, 84, 87, 63, 83,
+  91, 86, 80, 99, 87, 73, 92, 89, 74, 84,
+  73, 77, 72, 77, 85, 84, 78, 83, 75, 90,
+  86, 89, 69, 91, 91, 90, 76, 92, 104, 86,
+  84, 74, 87, 104, 89, 79, 83, 80, 74, 71,
+  77, 80, 77, 82, 94, 95, 95, 78, 77, 77,
+  89, 74, 79, 91, 87, 82, 80, 95, 82, 90,
+  94, 83, 83, 81, 87, 67, 62, 89, 75, 96,
+  79, 87, 90, 71, 84, 88, 65, 72, 92, 97,
+  83, 84, 85, 72, 92, 87, 92, 75, 84, 97,
+  104, 79, 98, 81, 84, 80, 83, 83, 96, 83,
+  89, 68, 90, 78, 87, 76, 94, 78, 73, 86,
+  79, 85, 82, 97, 78, 83, 98, 86, 77, 78,
+  74, 87, 70, 71, 77, 79, 57, 80, 87, 78,
+  72, 102, 88, 72, 78, 88, 78, 75, 77, 86,
+  67, 77, 92, 83, 80, 84, 76, 92, 84, 93,
+  76, 87, 75, 106, 71, 88, 103, 79, 98, 75,
+  82, 103, 91, 77, 79, 77, 75, 65, 83, 70,
+  84, 83, 94, 97, 97, 82, 80, 78, 90, 73,
+  84, 89, 80, 81, 80, 87, 74, 91, 100, 82,
+  76, 80, 86, 64, 68, 97, 76, 96, 76, 90,
+  88, 78, 82, 77, 64, 84, 87, 83, 72, 87,
+  89, 86, 81, 87, 82, 82, 82, 90, 80, 76,
+  93, 89, 81, 93, 77, 83, 93, 77, 90, 70,
+  91, 73, 88, 76, 95, 83, 69, 80, 84, 84,
+  74, 89, 75, 83, 87, 78, 81, 84, 85, 88,
+  75, 85, 81, 84, 71, 88, 85, 90, 78, 85,
+  85, 74, 94, 87, 75, 86, 79, 87, 70, 82,
+  87, 83, 88, 89, 74, 85, 82, 86, 77, 94,
+  88, 103, 78, 96, 109, 90, 76, 77, 73, 105,
+  85, 72, 85, 78, 76, 73, 74, 82, 78, 83,
+  100, 93, 95, 89, 83, 85, 85, 77, 81, 95,
+  78, 84, 77, 93, 78, 89, 91, 82, 100, 85,
+  88, 76, 78, 78, 85, 89, 72, 86, 92, 73,
+  89, 104, 69, 72, 92, 100, 89, 92, 74, 82,
+  113, 84, 88, 84, 81, 91, 107, 87, 88, 90,
+  79, 83, 77, 98, 103, 84, 77, 73, 91, 73,
+  75, 77, 69, 83, 98, 85, 88, 81, 84, 89,
+  75, 84, 85, 83, 73, 82, 76, 89, 78, 75,
+  99, 77, 67, 67, 92, 84, 101, 101, 77, 75,
+  80, 84, 82, 75, 78, 87, 80, 80, 89, 85,
+  75, 85, 79, 98, 91, 89, 73, 73, 72, 83,
+  81, 90, 86, 66, 92, 75, 104, 85, 87, 87,
+  85, 77, 86, 59, 88, 86, 84, 79, 72, 80,
+  90, 88, 84, 81, 103, 81, 92, 80, 84, 68,
+  93, 87, 87, 81, 92, 75, 110, 91, 85, 81,
+  84, 81, 87, 90, 70, 79, 91, 62, 94, 94,
+  72, 65, 98, 99, 97, 87, 77, 70, 85, 86,
+  106, 79, 78, 88, 119, 89, 89, 117, 84, 84,
+  80, 88, 106, 93, 85, 80, 88, 69, 71, 82,
+  62, 85, 123, 85, 83, 79, 89, 95, 74, 94,
+  75, 77, 60, 78, 59, 92, 86, 72, 96, 78,
+  63, 63, 97, 90, 103, 82, 85, 68, 67, 75,
+  105, 64, 85, 90, 75, 78, 98, 85, 75, 84,
+  87, 101, 94, 87, 80, 67, 66, 87, 74, 94,
+  73, 65, 96, 77, 100, 82, 75, 95, 83, 77,
+  97, 46, 101, 78, 88, 76, 76, 76, 88, 91,
+  78, 73, 88, 80, 99, 69, 79, 61, 89, 82,
+  78, 81, 102, 71, 90, 90, 79, 72, 82, 110,
+  83, 91, 74, 87, 90, 79, 86, 73, 66, 75,
+  96, 93, 87, 89, 87, 82, 73, 86, 88, 82,
+  83, 91, 95, 76, 87, 104, 79, 90, 77, 82,
+  105, 82, 85, 76, 94, 75, 73, 79, 76, 90,
+  93, 85, 87, 80, 76, 87, 75, 87, 89, 84,
+  74, 81, 73, 83, 77, 73, 98, 77, 71, 74,
+  84, 85, 89, 83, 95, 72, 86, 87, 94, 81,
+  81, 94, 75, 82, 91, 83, 83, 84, 80, 91,
+  92, 86, 82, 75, 79, 104, 81, 89, 103, 71,
+  89, 80, 75, 88, 90, 88, 84, 76, 82, 69,
+  85, 86, 83, 84, 83, 81, 91, 95, 88, 85,
+  79, 81, 88, 80, 79, 70, 85, 87, 85, 81,
+  92, 74, 83, 84, 92, 82, 91, 84, 85, 97,
+  64, 85, 91, 70, 77, 85, 78, 75, 96, 83,
+  77, 86, 71, 83, 80, 79, 102, 85, 82, 83,
+  86, 77, 80, 94, 84, 96, 97, 97, 80, 82,
+  80, 81, 99, 71, 87, 82, 68, 82, 107, 76,
+  89, 78, 86, 81, 73, 92, 80, 78, 69, 86,
+  88, 82, 80, 84, 89, 78, 88, 78, 97, 91,
+  110, 76, 75, 79, 87, 86, 71, 83, 83, 101,
+  89, 88, 89, 84, 86, 90, 83, 92, 83, 88,
+  78, 74, 77, 81, 97, 90, 69, 82, 80, 84,
+  92, 91, 80, 89, 85, 80, 88, 83, 86, 96,
+  75, 77, 70, 83, 84, 92, 79, 83, 86, 87,
+  87, 90, 79, 72, 89, 82, 96, 78, 83, 75,
+  82, 86, 77, 87, 95, 74, 87, 95, 53, 72,
+  82, 62, 79, 88, 83, 69, 96, 82, 78, 84,
+  81, 75, 77, 78, 104, 80, 74, 74, 95, 90,
+  82, 106, 88, 96, 85, 85, 88, 89, 86, 79,
+  102, 70, 75, 93, 64, 77, 114, 87, 87, 70,
+  89, 74, 67, 98, 57, 72, 56, 82, 82, 83,
+  84, 81, 90, 84, 75, 80, 100, 95, 117, 61,
+  74, 64, 80, 79, 84, 70, 83, 93, 88, 84,
+  91, 83, 82, 83, 90, 102, 88, 85, 72, 65,
+  75, 84, 97, 85, 58, 81, 76, 85, 110, 96,
+  76, 76, 81, 79, 94, 85, 99, 95, 67, 74,
+  71, 80, 78, 84, 78, 76, 77, 89, 95, 86,
+  80, 61, 79, 83, 90, 77, 85, 73, 84, 90,
+  69, 84, 86, 88, 84, 92, 65, 83, 92, 78,
+  80, 77, 75, 71, 100, 78, 78, 90, 92, 76,
+  82, 82, 82, 83, 81, 80, 80, 96, 80, 97,
+  86, 85, 84, 88, 81, 82, 81, 80, 100, 74,
+  70, 85, 71, 84, 91, 108, 86, 80, 84, 80,
+  72, 92, 83, 83, 69, 85, 88, 76, 80, 73,
+  92, 78, 82, 82, 89, 92, 109, 76, 82, 73,
+  90, 85, 86, 84, 81, 87, 82, 87, 87, 87,
+  83, 81, 77, 94, 94, 89, 81, 74, 83, 85,
+  97, 91, 75, 88, 80, 85, 102, 88, 84, 80,
+  81, 77, 84, 88, 87, 92, 72, 80, 74, 77,
+  82, 86, 86, 86, 82, 82, 83, 89, 92, 71,
+  90, 79, 92, 80, 85, 78, 82, 78, 100, 87,
+  84, 72, 80, 78, 82, 90, 104, 83, 84, 97,
+  73, 82, 76, 86, 77, 84, 70, 88, 82, 83,
+  75, 75, 90, 74, 90, 75, 94, 89, 91, 88,
+  85, 85, 73, 83, 80, 79, 75, 80, 67, 87,
+  91, 79, 74, 76, 70, 90, 84, 103, 86, 72,
+  84, 71, 73, 69, 98, 79, 89, 81, 73, 83,
+  89, 116, 86, 83, 102, 86, 81, 78, 87, 80,
+  93, 86, 99, 99, 86, 82, 88, 83, 85, 91,
+  92, 87, 90, 85, 80, 81, 87, 85, 75, 80,
+  84, 107, 72, 64, 97, 87, 77, 84, 82, 95,
+  78, 85, 71, 89, 72, 90, 86, 80, 81, 79,
+  87, 119, 83, 84, 77, 78, 73, 107, 82, 77,
+  79, 89, 99, 86, 79, 81, 87, 87, 86, 78,
+  80, 75, 89, 98, 110, 77, 79, 91, 77, 82,
+  74, 96, 82, 78, 70, 77, 82, 74, 74, 69,
+  88, 79, 84, 75, 88, 97, 90, 75, 80, 77,
+  77, 76, 100, 71, 78, 84, 70, 83, 98, 73,
+  61, 77, 69, 88, 96, 88, 86, 72, 85, 85,
+  63, 75, 97, 72, 90, 89, 75, 74, 81, 138,
+  89, 72, 87, 72, 84, 77, 86, 75, 80, 86,
+  109, 80, 92, 84, 86, 84, 72, 82, 84, 79,
+  77, 78, 80, 82, 86, 93, 79, 80, 79, 118,
+  77, 68, 92, 85, 80, 104, 93, 95, 76, 84,
+  73, 87, 77, 88, 80, 78, 76, 82, 87, 123,
+  74, 86, 73, 81, 79, 111, 75, 77, 78, 82,
+  102, 86, 83, 84, 86, 88, 90, 84, 82, 83,
+  83, 85, 101, 78, 87, 75, 76, 82, 74, 86,
+  77, 87, 68, 78, 75, 83, 87, 77, 89, 76,
+  86, 90, 87, 92, 91, 91, 81, 91, 77, 88,
+  99, 80, 77, 78, 75, 91, 91, 83, 79, 98,
+  76, 86, 84, 90, 87, 73, 86, 83, 74, 75,
+  94, 81, 87, 75, 74, 83, 86, 107, 79, 83,
+  96, 84, 99, 83, 85, 83, 95, 86, 90, 76,
+  87, 76, 95, 82, 79, 89, 88, 85, 75, 81,
+  81, 83, 86, 89, 80, 82, 84, 100, 76, 69,
+  92, 85, 78, 100, 79, 99, 78, 88, 70, 89,
+  76, 91, 82, 79, 86, 92, 78, 101, 81, 83,
+  76, 76, 80, 100, 87, 84, 85, 88, 96, 80,
+  75, 83, 84, 93, 82, 67, 77, 72, 82, 89,
+  103, 81, 87, 93, 81, 81, 83, 82, 72, 83,
+  76, 81, 76, 78, 81, 80, 77, 75, 93, 77,
+  85, 85, 93, 89, 88, 90, 68, 78, 94, 87,
+  86, 76, 69, 86, 77, 76, 69, 78, 76, 89,
+  82, 91, 84, 76, 81, 80, 80, 73, 96, 70,
+  78, 95, 74, 84, 75, 131, 79, 74, 106, 73,
+  94, 65, 86, 85, 95, 89, 96, 92, 98, 89,
+  86, 88, 80, 84, 86, 81, 87, 86, 71, 76,
+  85, 80, 83, 86, 80, 123, 77, 73, 98, 74,
+  75, 83, 78, 92, 76, 78, 73, 86, 65, 87,
+  77, 76, 80, 82, 70, 112, 80, 84, 67, 85,
+  73, 114, 81, 80, 71, 82, 102, 78, 78, 81,
+  81, 105, 83, 75, 69, 71, 99, 109, 105, 73,
+  66, 91, 100, 81, 96, 88, 75, 75, 72, 69,
+  81, 67, 88, 69, 83, 82, 87, 87, 60, 105,
+  97, 70, 84, 81, 65, 84, 93, 73, 76, 72,
+  67, 77, 79, 77, 58, 73, 75, 85, 83, 65,
+  89, 81, 75, 70, 77, 80, 81, 60, 76, 124,
+  80, 76, 70, 139, 72, 52, 115, 71, 76, 61,
+  110, 77, 85, 96, 129, 82, 93, 106, 81, 87,
+  69, 83, 68, 70, 79, 74, 65, 82, 85, 79,
+  76, 99, 89, 132, 87, 86, 86, 63, 75, 86,
+  98, 91, 82, 85, 68, 77, 67, 80, 70, 73,
+  76, 83, 69, 101, 87, 85, 49, 88, 80, 116,
+  75, 83, 69, 74, 113, 65, 79, 81, 90, 87,
+  86, 77, 76, 76, 77, 85, 101, 83, 90, 91,
+  79, 82, 84, 83, 72, 81, 71, 88, 68, 75,
+  93, 79, 81, 77, 92, 93, 93, 96, 94, 101,
+  83, 89, 74, 82, 95, 86, 90, 76, 79, 87,
+  78, 73, 74, 96, 77, 88, 81, 94, 84, 72,
+  84, 72, 78, 78, 97, 75, 83, 88, 81, 88,
+  74, 121, 78, 80, 103, 78, 84, 69, 82, 85,
+  92, 86, 83, 79, 92, 82, 91, 88, 77, 87,
+  89, 85, 82, 86, 75, 80, 79, 85, 87, 82,
+  80, 113, 77, 76, 88, 73, 79, 81, 79, 96,
+  75, 82, 72, 87, 68, 88, 88, 78, 81, 87,
+  79, 95, 90, 88, 73, 82, 80, 109, 81, 82,
+  80, 82, 96, 75, 83, 85, 77, 88, 87, 86,
+  80, 75, 73, 88, 92, 82, 87, 89, 74, 76,
+  85, 87, 79, 90, 79, 77, 79, 78, 86, 75,
+  90, 85, 88, 75, 86, 87, 97, 89, 95, 90,
+  78, 74, 88, 89, 99, 75, 93, 86, 79, 77,
+  80, 78, 77, 87, 86, 93, 78, 79, 87, 81,
+  88, 77, 79, 82, 78, 78, 87, 74, 91, 91,
+  76, 92, 101, 89, 99, 85, 83, 89, 89, 94,
+  89, 88, 99, 82, 88, 93, 88, 92, 85, 84,
+  94, 81, 73, 84, 84, 78, 84, 89, 79, 116,
+  80, 88, 88, 81, 83, 92, 78, 96, 85, 78,
+  76, 85, 80, 84, 74, 82, 78, 79, 79, 101,
+  75, 92, 84, 89, 82, 105, 82, 74, 74, 90,
+  100, 86, 78, 77, 84, 81, 86, 86, 80, 74,
+  81, 92, 94, 74, 72, 96, 83, 71, 92, 86,
+  80, 82, 78, 63, 85, 77, 90, 74, 87, 85,
+  83, 86, 89, 89, 95, 77, 91, 74, 79, 67,
+  92, 84, 96, 86, 80, 77, 67, 70, 77, 73,
+  82, 84, 84, 88, 84, 79, 81, 86, 80, 83,
+  87, 73, 76, 75, 91, 57, 86, 95, 71, 73,
+  109, 84, 85, 89, 92, 82, 90, 93, 95, 81,
+  103, 90, 84, 92, 76, 89, 86, 81, 87, 84,
+  77, 78, 82, 77, 93, 94, 77, 120, 86, 92,
+  95, 67, 80, 83, 79, 96, 79, 80, 70, 80,
+  74, 79, 78, 75, 77, 83, 85, 97, 82, 93,
+  75, 93, 87, 108, 76, 74, 75, 88, 105, 78,
+  81, 78, 85, 82, 91, 86, 76, 77, 75, 88,
+  86, 87, 82, 90, 79, 74, 84, 88, 75, 88,
+  87, 82, 87, 77, 90, 71, 89, 82, 80, 88,
+  94, 88, 94, 97, 80, 80, 82, 74, 79, 89,
+  101, 77, 79, 88, 79, 79, 81, 94, 76, 88,
+  84, 96, 80, 77, 86, 70, 85, 76, 82, 84,
+  81, 75, 88, 74, 95, 86, 82, 92, 99, 88,
+  72, 83, 84, 85, 93, 89, 88, 80, 93, 84,
+  91, 89, 83, 89, 85, 89, 86, 82, 77, 83,
+  82, 79, 85, 89, 80, 113, 80, 88, 90, 79,
+  86, 86, 83, 98, 79, 80, 78, 82, 78, 81,
+  95, 81, 81, 91, 83, 90, 98, 94, 84, 87,
+  92, 96, 79, 78, 78, 88, 99, 83, 69, 87,
+  76, 97, 104, 94, 86, 80, 93, 82, 95, 76,
+  82, 81, 84, 91, 75, 67, 86, 86, 82, 83,
+  73, 93, 85, 82, 103, 84, 86, 88, 90, 71,
+  77, 97, 127, 84, 93, 101, 88, 74, 118, 84,
+  81, 96, 85, 84, 87, 91, 80, 74, 71, 71,
+  88, 87, 93, 94, 59, 78, 73, 73, 90, 75,
+  62, 86, 86, 85, 59, 74, 84, 89, 103, 81,
+  87, 97, 84, 65, 77, 89, 92, 73, 85, 89,
+  81, 77, 104, 94, 87, 91, 90, 72, 87, 84,
+  91, 81, 86, 107, 76, 87, 89, 76, 83, 79,
+  85, 92, 87, 86, 90, 87, 91, 77, 91, 106,
+  92, 88, 81, 84, 69, 88, 92, 78, 82, 74,
+  83, 73, 82, 90, 98, 79, 72, 84, 103, 94,
+  99, 92, 79, 74, 87, 92, 92, 75, 73, 71,
+  83, 75, 76, 68, 83, 92, 77, 80, 95, 92,
+  83, 76, 96, 86, 96, 109, 95, 71, 76, 79,
+  89, 83, 91, 105, 92, 68, 138, 81, 75, 88,
+  94, 90, 85, 101, 86, 72, 77, 82, 81, 89,
+  91, 72, 53, 72, 63, 73, 90, 74, 58, 83,
+  76, 83, 69, 86, 82, 84, 90, 92, 79, 103,
+  84, 65, 81, 82, 82, 76, 82, 90, 72, 85,
+  90, 99, 81, 97, 82, 72, 81, 75, 87, 77,
+  84, 105, 80, 88, 92, 73, 76, 77, 87, 93,
+  87, 88, 88, 85, 85, 72, 106, 103, 84, 83,
+  94, 94, 96, 84, 91, 73, 73, 72, 73, 73,
+  81, 87, 105, 79, 82, 73, 99, 84, 81, 83,
+  78, 96, 86, 91, 90, 83, 77, 76, 73, 74,
+  82, 71, 84, 89, 58, 71, 91, 81, 80, 82,
+  84, 80, 82, 89, 78, 81, 85, 81, 82, 92,
+  81, 83, 83, 83, 112, 77, 80, 82, 84, 96,
+  93, 80, 93, 82, 77, 73, 90, 96, 89, 95,
+  79, 72, 69, 82, 92, 78, 77, 69, 76, 82,
+  81, 81, 84, 76, 94, 87, 82, 97, 82, 80,
+  77, 73, 80, 95, 86, 91, 70, 82, 79, 90,
+  92, 81, 96, 84, 81, 73, 80, 75, 91, 88,
+  74, 84, 102, 75, 65, 78, 87, 86, 83, 92,
+  86, 81, 91, 88, 86, 81, 92, 89, 78, 85,
+  99, 83, 79, 80, 78, 78, 92, 90, 92, 91,
+  88, 89, 71, 71, 69, 94, 84, 66, 87, 84,
+  74, 100, 96, 82, 74, 76, 77, 66, 73, 76,
+  85, 87, 75, 78, 80, 97, 82, 83, 126, 84,
+  106, 90, 70, 68, 102, 79, 145, 89, 96, 98,
+  83, 67, 151, 74, 89, 75, 103, 98, 80, 87,
+  96, 100, 62, 59, 86, 94, 110, 84, 58, 66,
+  61, 71, 95, 93, 82, 95, 71, 80, 69, 101,
+  69, 90, 84, 77, 103, 104, 78, 70, 71, 80,
+  93, 67, 80, 81, 79, 87, 83, 87, 82, 94,
+  73, 87, 103, 86, 77, 87, 104, 88, 70, 77,
+  73, 82, 73, 76, 90, 85, 85, 83, 74, 87,
+  92, 62, 95, 111, 90, 79, 77, 91, 67, 74,
+  74, 64, 65, 63, 88, 74, 77, 78, 89, 98,
+  71, 77, 80, 90, 76, 70, 83, 81, 65, 101,
+  90, 79, 68, 78, 76, 63, 70, 82, 86, 88,
+  72, 68, 92, 92, 70, 83, 112, 85, 104, 135,
+  73, 70, 109, 61, 90, 86, 83, 94, 92, 56,
+  131, 73, 76, 71, 101, 94, 76, 104, 104, 97,
+  60, 58, 85, 96, 101, 66, 72, 62, 59, 76,
+  97, 93, 90, 86, 57, 81, 76, 95, 63, 88,
+  61, 82, 99, 99, 75, 80, 72, 67, 74, 69,
+  75, 84, 76, 98, 72, 90, 76, 92, 68, 84,
+  109, 66, 68, 84, 88, 83, 75, 77, 87, 80,
+  73, 61, 86, 84, 82, 81, 70, 89, 86, 66,
+  99, 100, 89, 69, 78, 91, 99, 72, 72, 71,
+  83, 70, 81, 72, 74, 81, 90, 108, 80, 89,
+  80, 78, 83, 83, 86, 95, 88, 92, 93, 86,
+  89, 77, 78, 73, 79, 89, 87, 79, 68, 86,
+  71, 80, 80, 90, 83, 79, 92, 73, 75, 80,
+  93, 73, 81, 88, 72, 74, 81, 93, 92, 71,
+  85, 85, 90, 88, 81, 76, 88, 93, 74, 84,
+  90, 96, 95, 93, 90, 70, 77, 88, 88, 80,
+  90, 71, 75, 94, 86, 84, 80, 78, 83, 84,
+  85, 94, 84, 85, 73, 76, 63, 97, 86, 90,
+  79, 81, 87, 84, 91, 78, 89, 92, 94, 75,
+  68, 82, 84, 83, 69, 80, 99, 80, 73, 71,
+  82, 78, 82, 86, 90, 87, 75, 91, 77, 85,
+  88, 80, 70, 82, 86, 79, 80, 74, 92, 83,
+  96, 90, 94, 84, 83, 92, 82, 72, 81, 87,
+  87, 82, 73, 88, 99, 91, 89, 85, 106, 71,
+  77, 76, 83, 87, 75, 84, 70, 90, 82, 88,
+  91, 91, 84, 76, 84, 81, 74, 89, 103, 75,
+  77, 89, 102, 75, 73, 88, 92, 71, 74, 86,
+  82, 96, 86, 87, 87, 110, 61, 84, 86, 101,
+  90, 82, 90, 78, 90, 80, 80, 78, 94, 92,
+  84, 91, 77, 86, 83, 80, 84, 68, 97, 82,
+  73, 82, 71, 74, 81, 86, 83, 82, 82, 79,
+  85, 86, 85, 71, 85, 119, 87, 79, 71, 89,
+  109, 78, 56, 80, 89, 80, 83, 77, 82, 75,
+  69, 90, 75, 77, 68, 97, 67, 83, 88, 80,
+  93, 82, 81, 78, 73, 67, 77, 86, 93, 78,
+  95, 85, 80, 93, 79, 85, 82, 84, 85, 74,
+  73, 91, 97, 89, 89, 82, 105, 78, 79, 70,
+  77, 93, 78, 80, 75, 87, 76, 88, 88, 93,
+  84, 79, 86, 80, 79, 86, 108, 66, 62, 83,
+  84, 74, 84, 81, 75, 65, 72, 87, 79, 91,
+  83, 71, 86, 110, 71, 90, 87, 101, 85, 75,
+  96, 82, 92, 83, 82, 72, 89, 86, 81, 94,
+  84, 78, 79, 81, 74, 73, 88, 85, 70, 82,
+  73, 79, 65, 86, 81, 84, 89, 86, 87, 90,
+  73, 70, 94, 118, 84, 77, 73, 86, 88, 82,
+  69, 79, 100, 76, 80, 70, 83, 76, 69, 89,
+  75, 79, 69, 98, 62, 80, 88, 80, 96, 82,
+  78, 79, 80, 75, 99, 90, 94, 82, 96, 91,
+  73, 95, 83, 101, 89, 80, 83, 99, 82, 93,
+  104, 91, 85, 81, 105, 85, 94, 77, 85, 91,
+  72, 86, 75, 92, 76, 82, 84, 78, 79, 74,
+  72, 67, 81, 81, 93, 81, 84, 103, 83, 82,
+  81, 87, 90, 75, 90, 94, 88, 82, 83, 71,
+  88, 96, 84, 103, 85, 89, 81, 79, 93, 84,
+  92, 83, 81, 76, 83, 85, 88, 97, 78, 82,
+  87, 87, 86, 88, 78, 86, 78, 75, 86, 94,
+  62, 99, 88, 87, 73, 71, 95, 91, 83, 76,
+  90, 98, 72, 88, 84, 84, 86, 94, 68, 86,
+  98, 68, 83, 76, 84, 77, 76, 86, 85, 77,
+  75, 98, 64, 92, 83, 85, 86, 85, 80, 81,
+  89, 75, 91, 91, 78, 83, 90, 96, 78, 84,
+  101, 76, 66, 92, 95, 94, 85, 80, 89, 67,
+  101, 83, 85, 84, 90, 96, 84, 88, 86, 73,
+  85, 92, 99, 80, 84, 83, 77, 77, 84, 93,
+  97, 86, 103, 84, 110, 77, 69, 82, 86, 73,
+  87, 93, 82, 100, 88, 74, 105, 94, 69, 87,
+  92, 92, 93, 91, 93, 91, 83, 97, 78, 89,
+  80, 84, 78, 70, 83, 90, 86, 80, 90, 79,
+  86, 74, 71, 94, 84, 63, 86, 100, 84, 66,
+  96, 90, 80, 85, 102, 75, 85, 89, 100, 89,
+  72, 84, 80, 85, 79, 93, 97, 99, 88, 71,
+  82, 89, 82, 83, 85, 85, 96, 92, 82, 89,
+  77, 86, 84, 88, 82, 85, 74, 82, 75, 82,
+  92, 89, 71, 87, 92, 73, 85, 105, 89, 89,
+  74, 86, 96, 95, 86, 75, 84, 76, 100, 87,
+  78, 78, 96, 102, 82, 85, 91, 85, 77, 79,
+  83, 81, 88, 89, 72, 81, 81, 86, 95, 83,
+  109, 77, 95, 75, 67, 73, 87, 66, 80, 95,
+  85, 101, 90, 74, 112, 90, 66, 92, 92, 94,
+  87, 95, 90, 92, 82, 100, 74, 94, 78, 83,
+  81, 72, 80, 89, 87, 87, 80, 70, 74, 76,
+  67, 95, 85, 66, 78, 83, 81, 71, 97, 94,
+  82, 84, 100, 76, 84, 86, 111, 90, 72, 79,
+  74, 84, 70, 92, 92, 108, 83, 71, 82, 87,
+  81, 83, 85, 80, 96, 95, 89, 90, 78, 89,
+  87, 82, 75, 93, 70, 80, 76, 82, 93, 83,
+  81, 87, 91, 74, 90, 111, 99, 85, 101, 85,
+  97, 107, 81, 75, 87, 75, 90, 85, 82, 75,
+  76, 105, 85, 78, 87, 86, 72, 94, 81, 87,
+  89, 82, 87, 73, 74, 101, 94, 85, 84, 77,
+  95, 79, 82, 82, 86, 68, 88, 84, 91, 89,
+  88, 78, 102, 88, 73, 80, 85, 80, 92, 84,
+  93, 95, 83, 92, 75, 98, 81, 87, 77, 78,
+  83, 84, 86, 78, 91, 78, 78, 88, 72, 91,
+  84, 66, 90, 83, 83, 64, 92, 92, 94, 96,
+  88, 88, 88, 82, 90, 86, 66, 80, 93, 87,
+  84, 83, 97, 84, 85, 73, 83, 76, 81, 85,
+  86, 87, 89, 90, 83, 85, 92, 89, 82, 86,
+  82, 87, 87, 87, 77, 83, 89, 84, 75, 84,
+  85, 79, 89, 93, 75, 76, 86, 100, 76, 74,
+  73, 69, 92, 81, 73, 77, 69, 90, 67, 120,
+  74, 72, 79, 77, 94, 71, 80, 98, 72, 62,
+  130, 80, 110, 78, 74, 88, 69, 70, 96, 74,
+  81, 85, 81, 69, 94, 81, 73, 69, 69, 94,
+  96, 86, 109, 80, 87, 84, 96, 82, 83, 99,
+  85, 75, 84, 93, 93, 87, 72, 86, 78, 73,
+  103, 98, 89, 80, 80, 86, 96, 97, 64, 79,
+  97, 62, 97, 60, 89, 93, 91, 77, 78, 99,
+  83, 78, 93, 80, 57, 100, 84, 74, 79, 77,
+  89, 70, 84, 96, 72, 104, 74, 84, 87, 77,
+  65, 75, 64, 66, 92, 59, 68, 84, 99, 99,
+  54, 85, 71, 77, 91, 79, 85, 70, 78, 85,
+  68, 83, 74, 72, 88, 96, 69, 65, 69, 75,
+  81, 89, 70, 82, 60, 105, 74, 100, 74, 65,
+  74, 78, 76, 64, 82, 100, 72, 65, 138, 82,
+  108, 86, 68, 89, 63, 70, 74, 72, 74, 87,
+  77, 67, 87, 75, 76, 64, 65, 85, 94, 78,
+  98, 83, 86, 84, 91, 73, 74, 94, 76, 67,
+  86, 89, 97, 72, 69, 77, 75, 76, 118, 87,
+  78, 81, 71, 92, 84, 101, 65, 74, 98, 70,
+  91, 68, 88, 99, 93, 86, 65, 106, 82, 75,
+  87, 80, 57, 92, 78, 77, 69, 76, 83, 80,
+  86, 90, 70, 85, 73, 84, 77, 78, 64, 71,
+  64, 63, 97, 56, 66, 85, 113, 107, 84, 87,
+  63, 73, 85, 79, 75, 68, 77, 90, 55, 87,
+  74, 66, 72, 84, 72, 84, 69, 75, 83, 90,
+  76, 70, 67, 95, 61, 99, 73, 76, 84, 84,
+  75, 65, 88, 95, 81, 63, 122, 78, 108, 106,
+  70, 90, 59, 66, 88, 81, 100, 89, 86, 63,
+  91, 83, 82, 66, 73, 87, 85, 77, 109, 75,
+  78, 87, 95, 72, 89, 83, 86, 69, 87, 86,
+  94, 87, 70, 76, 64, 77, 109, 86, 89, 91,
+  69, 90, 105, 95, 72, 87, 101, 88, 97, 62,
+  85, 85, 82, 92, 65, 97, 85, 83, 78, 84,
+  68, 91, 89, 77, 87, 73, 93, 70, 98, 88,
+  75, 70, 78, 88, 85, 81, 70, 76, 72, 69,
+  93, 64, 76, 86, 103, 100, 106, 96, 72, 75,
+  81, 77, 72, 77, 77, 84, 69, 82, 76, 102,
+  77, 67, 85, 80, 73, 74, 80, 83, 66, 103,
+  81, 102, 57, 63, 78, 72, 95, 88, 91, 74,
+  93, 76, 72, 95, 104, 79, 93, 87, 79, 84,
+  65, 79, 79, 94, 74, 80, 92, 75, 82, 76,
+  85, 79, 105, 92, 67, 87, 109, 68, 90, 80,
+  87, 76, 87, 72, 101, 64, 87, 83, 96, 79,
+  100, 84, 74, 80, 79, 111, 77, 97, 69, 79,
+  95, 95, 75, 105, 81, 72, 90, 60, 89, 68,
+  78, 96, 76, 78, 87, 79, 71, 93, 93, 81,
+  99, 85, 86, 77, 94, 77, 71, 87, 80, 86,
+  87, 94, 83, 84, 86, 83, 95, 85, 88, 55,
+  78, 91, 93, 82, 99, 85, 85, 88, 87, 79,
+  72, 79, 93, 85, 78, 71, 87, 86, 62, 62,
+  88, 90, 74, 76, 77, 82, 72, 109, 77, 87,
+  66, 66, 81, 74, 99, 88, 81, 84, 90, 72,
+  72, 93, 89, 80, 88, 76, 83, 88, 63, 84,
+  78, 100, 73, 79, 89, 75, 83, 76, 80, 80,
+  100, 94, 63, 85, 97, 70, 94, 80, 87, 82,
+  84, 87, 102, 63, 94, 80, 91, 77, 97, 80,
+  64, 92, 77, 116, 79, 75, 76, 82, 96, 87,
+  84, 100, 83, 89, 77, 63, 89, 66, 77, 90,
+  80, 73, 89, 83, 63, 92, 90, 78, 95, 85,
+  92, 78, 95, 87, 79, 85, 77, 69, 91, 96,
+  77, 82, 86, 83, 90, 83, 80, 59, 81, 93,
+  73, 75, 102, 88, 91, 74, 81, 85, 74, 81,
+  92, 84, 72, 73, 76, 84, 62, 63, 91, 93,
+  77, 79, 80, 83, 78, 92, 90, 79, 66, 64,
+  81, 85, 96, 90, 89, 73, 81, 72, 80, 98,
+  82, 85, 83, 78, 83, 87, 77, 82, 84, 90,
+  75, 80, 81, 84, 79, 77, 84, 89, 104, 97,
+  61, 80, 103, 76, 89, 87, 88, 82, 81, 93,
+  100, 71, 89, 81, 86, 72, 95, 85, 74, 87,
+  84, 103, 78, 86, 90, 81, 98, 94, 82, 105,
+  75, 89, 88, 67, 89, 70, 82, 77, 87, 74,
+  84, 85, 74, 102, 96, 87, 99, 88, 103, 77,
+  95, 85, 86, 88, 86, 83, 84, 95, 80, 86,
+  78, 87, 92, 92, 81, 63, 83, 84, 70, 73,
+  80, 86, 87, 73, 88, 78, 80, 85, 101, 80,
+  82, 74, 79, 79, 80, 94, 74, 88, 88, 86,
+  83, 80, 78, 86, 85, 103, 71, 91, 79, 89,
+  77, 69, 78, 101, 74, 73, 95, 82, 98, 81,
+  87, 81, 82, 87, 84, 79, 85, 70, 90, 82,
+  98, 79, 74, 82, 91, 92, 96, 94, 82, 77,
+  75, 88, 82, 85, 96, 68, 92, 79, 75, 65,
+  86, 77, 95, 76, 88, 97, 77, 90, 88, 78,
+  70, 94, 76, 75, 85, 89, 84, 81, 84, 73,
+  96, 53, 87, 94, 91, 81, 70, 84, 95, 84,
+  83, 93, 82, 101, 89, 73, 99, 72, 80, 87,
+  82, 97, 83, 93, 92, 89, 85, 83, 85, 92,
+  89, 89, 81, 91, 84, 78, 89, 71, 85, 87,
+  95, 91, 86, 84, 72, 80, 81, 82, 86, 83,
+  74, 84, 79, 92, 63, 74, 87, 83, 81, 84,
+  74, 87, 82, 88, 73, 91, 77, 85, 79, 74,
+  85, 99, 79, 74, 91, 88, 89, 81, 81, 90,
+  82, 82, 86, 75, 80, 73, 94, 85, 93, 71,
+  83, 85, 78, 86, 87, 90, 84, 66, 78, 100,
+  83, 76, 97, 71, 92, 82, 87, 70, 85, 79,
+  92, 88, 86, 95, 73, 90, 87, 84, 74, 87,
+  77, 79, 88, 82, 88, 85, 82, 71, 98, 50,
+  90, 94, 84, 75, 73, 82, 77, 85, 81, 95,
+  90, 91, 95, 71, 98, 72, 78, 73, 80, 94,
+  80, 75, 87, 87, 81, 80, 84, 86, 79, 91,
+  80, 92, 85, 78, 86, 71, 82, 87, 93, 96,
+  85, 92, 71, 84, 83, 77, 83, 78, 87, 94,
+  77, 97, 84, 76, 85, 83, 82, 79, 78, 88,
+  86, 87, 74, 87, 78, 89, 81, 78, 87, 99,
+  95, 71, 96, 87, 97, 82, 86, 89, 80, 83,
+  82, 68, 78, 82, 87, 78, 100, 80, 76, 80,
+  72, 92, 99, 92, 84, 70, 76, 91, 80, 78,
+  92, 75, 89, 85, 76, 64, 86, 74, 98, 74,
+  88, 103, 80, 86, 96, 83, 76, 98, 82, 79,
+  88, 84, 93, 77, 93, 79, 95, 59, 88, 91,
+  90, 74, 71, 87, 77, 86, 79, 93, 83, 101,
+  88, 74, 91, 72, 81, 88, 81, 96, 81, 83,
+  90, 90, 85, 83, 89, 90, 89, 86, 75, 92,
+  86, 97, 81, 80, 74, 89, 91, 95, 89, 87,
+  72, 80, 84, 80, 87, 82, 101, 77, 65, 91,
+  101, 74, 85, 72, 77, 74, 108, 67, 84, 102,
+  76, 92, 104, 72, 84, 61, 87, 104, 63, 77,
+  101, 76, 86, 86, 105, 99, 84, 86, 82, 74,
+  87, 48, 82, 80, 116, 75, 83, 87, 78, 83,
+  106, 94, 93, 68, 77, 79, 67, 69, 84, 71,
+  80, 83, 68, 108, 66, 72, 83, 92, 76, 128,
+  68, 114, 87, 69, 99, 85, 66, 65, 84, 87,
+  82, 71, 81, 55, 96, 86, 64, 92, 86, 67,
+  76, 79, 82, 76, 46, 82, 60, 83, 81, 83,
+  80, 84, 84, 134, 83, 83, 74, 94, 91, 90,
+  80, 97, 83, 79, 91, 82, 75, 107, 78, 58,
+  113, 84, 77, 92, 84, 84, 95, 87, 62, 69,
+  85, 79, 101, 82, 92, 81, 73, 86, 88, 60,
+  85, 72, 86, 75, 106, 74, 80, 88, 81, 88,
+  99, 74, 85, 62, 87, 106, 62, 79, 87, 78,
+  83, 87, 93, 95, 85, 84, 83, 62, 78, 48,
+  81, 81, 104, 71, 82, 99, 81, 85, 99, 93,
+  85, 53, 78, 87, 68, 72, 88, 77, 90, 77,
+  84, 117, 64, 63, 80, 104, 73, 144, 68, 130,
+  84, 66, 100, 80, 62, 69, 88, 87, 84, 72,
+  83, 60, 94, 83, 72, 96, 83, 61, 80, 76,
+  55, 71, 50, 85, 71, 79, 81, 80, 69, 87,
+  83, 119, 82, 84, 72, 91, 87, 86, 81, 89,
+  78, 78, 84, 80, 83, 106, 77, 54, 108, 78,
+  71, 88, 86, 90, 79, 92, 63, 71, 87, 72,
+  102, 74, 102, 94, 88, 92, 102, 61, 84, 75,
+  79, 72, 102, 71, 85, 95, 79, 94, 103, 71,
+  82, 70, 78, 106, 79, 73, 93, 80, 83, 84,
+  106, 96, 82, 93, 83, 65, 94, 68, 86, 82,
+  107, 81, 85, 80, 78, 85, 105, 94, 87, 54,
+  78, 81, 66, 69, 82, 75, 78, 78, 72, 100,
+  69, 72, 85, 89, 78, 125, 70, 106, 85, 75,
+  101, 81, 69, 67, 87, 82, 95, 66, 86, 73,
+  99, 84, 64, 92, 87, 72, 77, 83, 62, 72,
+  47, 86, 63, 79, 79, 86, 77, 83, 83, 129,
+  88, 87, 77, 104, 89, 91, 83, 89, 82, 80,
+  89, 81, 80, 106, 80, 83, 102, 80, 68, 93,
+  81, 84, 78, 93, 63, 69, 79, 77, 105, 84,
+  84, 76, 70, 93, 90, 77, 84, 90, 83, 75,
+  81, 80, 77, 88, 79, 98, 95, 84, 81, 72,
+  94, 94, 75, 78, 97, 80, 91, 83, 81, 111,
+  88, 85, 89, 70, 71, 63, 94, 91, 119, 94,
+  86, 77, 74, 90, 89, 97, 95, 82, 79, 87,
+  78, 86, 81, 74, 79, 91, 75, 77, 88, 79,
+  78, 78, 95, 87, 74, 85, 81, 78, 93, 85,
+  82, 68, 98, 85, 80, 80, 78, 63, 106, 67,
+  73, 89, 85, 78, 82, 81, 89, 78, 78, 85,
+  86, 95, 85, 83, 82, 72, 80, 89, 83, 91,
+  70, 78, 85, 85, 78, 87, 82, 86, 75, 85,
+  71, 95, 86, 74, 85, 80, 82, 85, 91, 96,
+  88, 88, 83, 73, 90, 99, 91, 81, 83, 83,
+  83, 92, 80, 75, 84, 89, 91, 78, 80, 83,
+  75, 92, 76, 97, 90, 85, 83, 73, 83, 89,
+  76, 81, 87, 79, 95, 82, 72, 88, 89, 88,
+  96, 66, 69, 66, 85, 87, 98, 87, 85, 76,
+  86, 87, 80, 91, 85, 68, 81, 96, 82, 88,
+  84, 77, 86, 78, 82, 84, 82, 76, 80, 86,
+  94, 82, 70, 83, 88, 82, 91, 89, 70, 67,
+  95, 87, 84, 82, 77, 76, 107, 62, 82, 90,
+  87, 76, 85, 85, 75, 81, 74, 80, 91, 93,
+  84, 76, 74, 71, 81, 79, 78, 94, 70, 90,
+  84, 82, 82, 84, 83, 84, 77, 83, 71, 93,
+  85, 75, 86, 76, 75, 81, 87, 95, 77, 86,
+  89, 76, 96, 97, 89, 75, 86, 89, 94, 94,
+  91, 75, 80, 90, 90, 77, 78, 81, 77, 98,
+  77, 98, 96, 79, 79, 81, 74, 94, 79, 81,
+  85, 78, 93, 82, 76, 80, 89, 91, 90, 65,
+  94, 77, 89, 90, 94, 92, 89, 79, 88, 87,
+  82, 95, 94, 60, 78, 87, 80, 94, 82, 74,
+  80, 73, 77, 73, 90, 79, 79, 80, 95, 89,
+  79, 79, 80, 75, 94, 89, 70, 71, 92, 81,
+  90, 76, 79, 89, 118, 70, 73, 86, 92, 75,
+  83, 90, 74, 78, 82, 88, 86, 86, 87, 83,
+  72, 66, 77, 88, 82, 93, 74, 89, 84, 87,
+  81, 86, 84, 86, 80, 88, 72, 92, 85, 89,
+  86, 76, 72, 86, 91, 94, 77, 87, 82, 73,
+  88, 97, 90, 81, 68, 77, 95, 89, 74, 73,
+  83, 75, 84, 91, 88, 68, 91, 107, 63, 81,
+  72, 83, 78, 83, 96, 93, 78, 91, 74, 90,
+  76, 91, 94, 85, 95, 87, 74, 69, 72, 85,
+  94, 86, 99, 77, 75, 68, 84, 84, 86, 81,
+  67, 88, 96, 86, 75, 79, 92, 77, 80, 81,
+  72, 85, 85, 79, 87, 86, 78, 87, 88, 78,
+  98, 73, 81, 91, 70, 72, 97, 95, 78, 87,
+  80, 79, 97, 71, 78, 77, 79, 85, 76, 100,
+  87, 85, 79, 91, 92, 72, 74, 85, 84, 89,
+  83, 70, 80, 96, 87, 71, 80, 70, 82, 90,
+  87, 81, 76, 68, 74, 84, 81, 90, 70, 82,
+  80, 82, 87, 105, 93, 75, 85, 84, 89, 89,
+  79, 79, 70, 72, 71, 80, 91, 65, 82, 74,
+  82, 92, 88, 74, 88, 101, 71, 84, 72, 80,
+  73, 68, 92, 92, 72, 89, 76, 90, 74, 93,
+  91, 79, 93, 81, 65, 78, 75, 80, 92, 84,
+  109, 79, 72, 67, 97, 91, 97, 81, 62, 83,
+  90, 84, 87, 91, 92, 80, 64, 74, 70, 83,
+  86, 89, 86, 76, 78, 90, 87, 77, 85, 69,
+  76, 89, 81, 62, 93, 116, 72, 85, 93, 93,
+  110, 62, 82, 79, 74, 78, 66, 91, 89, 91,
+  79, 92, 94, 91, 82, 89, 83, 93, 83, 75,
+  63, 97, 83, 92, 82, 67, 82, 90, 103, 84,
+  71, 71, 87, 88, 82, 94, 76, 84, 70, 82,
+  86, 123, 88, 73, 86, 83, 82, 93, 83, 76,
+  74, 88, 69, 86, 76, 71, 80, 75, 78, 85,
+  87, 74, 86, 84, 64, 80, 80, 86, 81, 70,
+  91, 91, 72, 92, 86, 93, 78, 90, 88, 76,
+  96, 89, 75, 89, 77, 79, 93, 90, 91, 83,
+  73, 77, 94, 79, 87, 91, 70, 82, 94, 83,
+  77, 90, 88, 76, 81, 72, 71, 81, 86, 83,
+  88, 83, 74, 82, 84, 81, 82, 74, 92, 81,
+  97, 64, 98, 85, 78, 95, 73, 90, 106, 73,
+  79, 79, 81, 76, 78, 80, 93, 80, 83, 88,
+  91, 91, 74, 90, 101, 87, 84, 72, 81, 99,
+  78, 88, 78, 71, 81, 90, 84, 83, 75, 70,
+  84, 83, 81, 93, 79, 83, 77, 81, 86, 87,
+  83, 82, 87, 84, 89, 89, 81, 82, 88, 80,
+  78, 71, 110, 88, 83, 93, 82, 86, 101, 75,
+  66, 92, 76, 70, 82, 79, 85, 87, 106, 88,
+  85, 81, 64, 79, 55, 86, 88, 76, 139, 78,
+  73, 85, 101, 111, 76, 74, 91, 68, 73, 102,
+  66, 100, 78, 71, 94, 106, 74, 67, 103, 95,
+  93, 74, 65, 81, 94, 87, 95, 93, 77, 84,
+  80, 65, 83, 73, 70, 77, 81, 64, 75, 92,
+  55, 80, 93, 73, 104, 117, 75, 68, 84, 74,
+  74, 74, 76, 88, 84, 89, 101, 81, 75, 74,
+  84, 75, 71, 80, 97, 80, 88, 67, 73, 70,
+  73, 74, 89, 79, 115, 74, 88, 92, 84, 92,
+  76, 84, 72, 68, 79, 82, 94, 82, 91, 100,
+  80, 90, 74, 87, 92, 95, 85, 71, 63, 65,
+  140, 98, 68, 105, 82, 90, 100, 84, 77, 103,
+  90, 69, 94, 81, 91, 67, 80, 100, 79, 67,
+  75, 69, 60, 92, 81, 92, 170, 82, 56, 99,
+  94, 98, 76, 73, 110, 65, 68, 121, 92, 108,
+  77, 60, 100, 96, 63, 62, 125, 90, 91, 75,
+  56, 91, 102, 84, 88, 95, 74, 71, 69, 82,
+  69, 79, 53, 72, 69, 66, 71, 82, 46, 82,
+  93, 69, 155, 109, 79, 59, 80, 78, 78, 88,
+  76, 92, 76, 90, 90, 79, 82, 73, 87, 78,
+  66, 73, 113, 97, 68, 54, 76, 72, 85, 77,
+  86, 74, 129, 73, 92, 109, 97, 113, 88, 83,
+  69, 64, 69, 76, 116, 83, 85, 144, 74, 106,
+  56, 84, 108, 97, 84, 85, 74, 72, 103, 106,
+  79, 87, 76, 80, 96, 78, 75, 82, 72, 74,
+  82, 84, 85, 74, 79, 94, 76, 89, 93, 80,
+  60, 85, 81, 95, 125, 92, 78, 99, 78, 98,
+  83, 70, 85, 73, 78, 98, 110, 92, 81, 79,
+  101, 100, 76, 68, 98, 89, 92, 79, 66, 89,
+  84, 83, 89, 87, 87, 93, 85, 59, 78, 75,
+  69, 73, 79, 70, 93, 89, 57, 75, 92, 80,
+  80, 99, 86, 72, 88, 77, 83, 103, 79, 84,
+  85, 85, 96, 80, 80, 77, 86, 80, 77, 77,
+  95, 79, 67, 78, 73, 75, 75, 74, 82, 79,
+  99, 84, 83, 90, 83, 86, 79, 88, 65, 74,
+  87, 80, 93, 79, 77, 88, 82, 88, 80, 83,
+  88, 95, 86, 78, 70, 82, 89, 89, 88, 85,
+  81, 88, 92, 79, 71, 81, 70, 88, 88, 78,
+  91, 80, 78, 71, 70, 91, 89, 80, 77, 81,
+  92, 74, 93, 82, 77, 96, 114, 96, 77, 89,
+  83, 88, 95, 90, 72, 94, 64, 83, 112, 93,
+  87, 82, 90, 95, 78, 77, 76, 60, 91, 81,
+  98, 81, 80, 100, 100, 77, 95, 72, 75, 82,
+  91, 80, 82, 90, 78, 74, 102, 86, 82, 86,
+  73, 66, 78, 88, 88, 76, 78, 82, 85, 96,
+  90, 82, 76, 97, 88, 79, 78, 79, 89, 83,
+  95, 86, 72, 94, 73, 79, 93, 72, 105, 72,
+  82, 71, 82, 89, 69, 90, 75, 80, 61, 81,
+  89, 75, 74, 79, 77, 89, 83, 88, 79, 78,
+  90, 70, 74, 82, 106, 75, 81, 95, 78, 92,
+  91, 84, 70, 99, 79, 76, 91, 79, 83, 71,
+  64, 84, 80, 88, 95, 76, 83, 86, 85, 104,
+  88, 85, 74, 99, 91, 91, 91, 88, 102, 93,
+  98, 78, 65, 100, 58, 76, 133, 75, 82, 74,
+  93, 91, 74, 79, 77, 76, 97, 83, 103, 77,
+  75, 96, 100, 84, 95, 77, 86, 85, 92, 92,
+  76, 85, 70, 74, 116, 79, 90, 88, 83, 53,
+  75, 100, 82, 90, 81, 95, 81, 93, 85, 66,
+  76, 84, 87, 79, 73, 71, 89, 90, 99, 82,
+  73, 72, 78, 81, 85, 72, 106, 74, 79, 86,
+  79, 100, 80, 85, 68, 81, 75, 68, 95, 71,
+  74, 80, 71, 98, 73, 86, 82, 83, 78, 77,
+  80, 82, 79, 75, 88, 82, 82, 87, 89, 81,
+  82, 86, 68, 92, 88, 86, 87, 73, 79, 80,
+  82, 96, 97, 77, 71, 80, 85, 104, 93, 85,
+  84, 91, 85, 82, 79, 81, 86, 85, 99, 85,
+  81, 89, 70, 85, 101, 80, 89, 81, 85, 81,
+  78, 76, 77, 100, 84, 82, 94, 82, 86, 102,
+  98, 72, 85, 79, 87, 79, 82, 85, 70, 87,
+  79, 77, 99, 92, 78, 89, 71, 66, 80, 89,
+  84, 91, 76, 93, 88, 89, 87, 81, 81, 76,
+  91, 83, 74, 77, 87, 88, 86, 88, 75, 69,
+  72, 79, 91, 76, 93, 84, 82, 76, 82, 90,
+  74, 79, 59, 89, 105, 84, 92, 78, 77, 78,
+  79, 92, 84, 87, 82, 83, 69, 76, 89, 84,
+  76, 79, 71, 83, 101, 82, 72, 73, 83, 83,
+  101, 86, 73, 81, 86, 85, 80, 68, 99, 67,
+  79, 70, 78, 83, 102, 85, 85, 90, 74, 80,
+  88, 85, 74, 76, 81, 72, 76, 87, 79, 82,
+  54, 75, 79, 75, 69, 96, 66, 85, 73, 100,
+  76, 88, 82, 78, 88, 112, 83, 101, 80, 85,
+  95, 81, 68, 92, 82, 85, 84, 79, 80, 75,
+  79, 91, 121, 77, 82, 89, 87, 90, 79, 80,
+  84, 80, 77, 84, 75, 90, 92, 91, 78, 90,
+  92, 113, 83, 94, 87, 69, 95, 77, 101, 83,
+  88, 84, 75, 88, 88, 104, 88, 84, 84, 85,
+  89, 75, 88, 89, 82, 96, 94, 163, 86, 82,
+  88, 79, 79, 80, 69, 78, 87, 81, 82, 88,
+  76, 77, 97, 81, 73, 71, 84, 75, 102, 91,
+  70, 84, 83, 86, 82, 75, 91, 76, 80, 74,
+  82, 85, 90, 83, 85, 94, 79, 78, 87, 78,
+  70, 77, 74, 78, 78, 87, 80, 88, 61, 87,
+  80, 72, 68, 102, 64, 84, 76, 101, 78, 83,
+  78, 89, 92, 94, 84, 102, 79, 94, 93, 84,
+  74, 93, 82, 84, 78, 75, 80, 80, 81, 90,
+  103, 72, 88, 89, 94, 92, 84, 77, 82, 71,
+  78, 74, 72, 100, 91, 93, 80, 88, 83, 105,
+  80, 103, 87, 75, 93, 73, 95, 83, 87, 82,
+  73, 84, 88, 106, 88, 92, 83, 85, 95, 73,
+  77, 91, 83, 95, 80, 132, 82, 79, 88, 79,
+  78, 82, 77, 83, 87, 78, 78, 91, 72, 80,
+  96, 82, 73, 73, 87, 76, 99, 86, 75, 75,
+  86, 83, 81, 75, 81, 71, 83, 69, 79, 80,
+  97, 78, 85, 92, 72, 81, 92, 97, 78, 75,
+  83, 76, 81, 88, 82, 83, 62, 80, 77, 75,
+  71, 96, 67, 86, 73, 92, 74, 83, 82, 75,
+  89, 103, 83, 96, 81, 83, 100, 80, 77, 91,
+  85, 86, 90, 78, 81, 74, 81, 85, 106, 76,
+  85, 90, 85, 91, 85, 88, 84, 76, 87, 83,
+  75, 98, 92, 96, 78, 92, 91, 104, 79, 93,
+  78, 77, 93, 84, 96, 82, 84, 84, 78, 88,
+  88, 99, 93, 85, 84, 83, 85, 77, 79, 89,
+  80, 94, 69, 144, 83, 82, 80, 80, 86, 85,
+  70, 82, 81, 85, 71, 83, 83, 98, 97, 78,
+  76, 74, 83, 74, 104, 87, 73, 84, 85, 81,
+  80, 62, 90, 73, 74, 76, 78, 83, 92, 77,
+  79, 87, 80, 86, 67, 81, 68, 79, 70, 77,
+  81, 94, 84, 84, 56, 80, 80, 76, 70, 93,
+  71, 75, 77, 107, 85, 85, 81, 84, 90, 102,
+  79, 97, 80, 88, 89, 92, 79, 82, 80, 83,
+  91, 81, 84, 75, 84, 96, 104, 69, 84, 107,
+  87, 78, 76, 70, 85, 79, 81, 78, 76, 77,
+  85, 79, 84, 95, 86, 118, 85, 105, 86, 78,
+  88, 81, 93, 83, 80, 87, 82, 82, 75, 94,
+  83, 86, 82, 81, 85, 76, 80, 83, 81, 100,
+  82, 147, 87, 83, 92, 81, 80, 81, 72, 77,
+  84, 81, 78, 82, 89, 89, 89, 76, 79, 75,
+  81, 74, 105, 86, 71, 87, 83, 80, 85, 70,
+  84, 85, 76, 82, 80, 81, 78, 73, 77, 91,
+  80, 78, 68, 73, 63, 78, 74, 84, 82, 103,
+  84, 90, 63, 92, 78, 72, 74, 96, 64, 78,
+  79, 105, 86, 82, 80, 100, 90, 82, 81, 98,
+  78, 106, 91, 96, 86, 82, 83, 85, 77, 82,
+  81, 79, 82, 93, 84, 69, 87, 112, 94, 83,
+  87, 67, 88, 76, 76, 72, 76, 83, 84, 77,
+  84, 96, 78, 114, 78, 119, 91, 84, 86, 64,
+  82, 82, 76, 88, 76, 79, 72, 97, 86, 93,
+  79, 81, 92, 69, 79, 83, 80, 100, 64, 119,
+  83, 80, 93, 78, 77, 85, 77, 87, 90, 82,
+  76, 85, 81, 89, 92, 80, 79, 73, 83, 76,
+  103, 89, 74, 80, 85, 79, 82, 70, 85, 75,
+  78, 72, 79, 80, 89, 74, 79, 89, 77, 78,
+  80, 90, 72, 77, 79, 77, 83, 90, 82, 82,
+  64, 83, 77, 72, 72, 91, 73, 83, 77, 97,
+  83, 75, 81, 78, 89, 96, 80, 89, 80, 84,
+  97, 86, 87, 85, 84, 85, 76, 77, 82, 75,
+  87, 92, 96, 80, 83, 101, 84, 78, 82, 80,
+  86, 81, 80, 81, 77, 89, 89, 85, 81, 95,
+  85, 108, 83, 100, 82, 79, 92, 78, 91, 81,
+  76, 86, 85, 83, 77, 92, 91, 87, 84, 82,
+  84, 76, 84, 82, 80, 97, 61, 134, 85, 82,
+  85, 81, 82, 84, 80, 84, 78, 88, 80, 89,
+  83, 102, 100, 84, 78, 79, 83, 76, 104, 84,
+  74, 74, 91, 81, 83, 79, 81, 72, 77, 67,
+  83, 80, 94, 78, 79, 90, 81, 91, 69, 82,
+  79, 96, 71, 70, 87, 90, 85, 83, 61, 77,
+  83, 77, 69, 98, 72, 85, 75, 96, 85, 88,
+  78, 78, 93, 113, 75, 93, 81, 86, 96, 87,
+  86, 83, 85, 90, 97, 79, 89, 76, 86, 96,
+  114, 75, 82, 78, 88, 77, 80, 79, 79, 82,
+  82, 85, 85, 68, 80, 83, 80, 102, 90, 109,
+  87, 84, 83, 75, 93, 96, 95, 80, 78, 84,
+  93, 88, 77, 85, 76, 84, 78, 83, 82, 85,
+  84, 88, 88, 93, 79, 141, 91, 87, 86, 90,
+  85, 86, 78, 81, 84, 85, 87, 87, 89, 97,
+  92, 79, 77, 79, 81, 77, 103, 86, 72, 80,
+  87, 80, 90, 83, 81, 79, 79, 72, 82, 76,
+  79, 72, 81, 91, 77, 83, 66, 77, 74, 90,
+  77, 77, 89, 93, 84, 86, 63, 89, 79, 76,
+  74, 96, 69, 87, 77, 96, 84, 84, 77, 87,
+  94, 94, 78, 94, 81, 92, 88, 87, 91, 80,
+  87, 87, 81, 75, 85, 78, 86, 93, 92, 77,
+  83, 86, 93, 83, 84, 77, 81, 84, 79, 80,
+  81, 74, 76, 77, 79, 100, 81, 105, 82, 93,
+  84, 78, 85, 80, 89, 79, 74, 83, 85, 84,
+  75, 85, 78, 87, 78, 81, 83, 80, 83, 85,
+  85, 92, 70, 120, 88, 85, 88, 86, 83, 85,
+  84, 86, 98, 87, 84, 84, 81, 92, 96, 83,
+  83, 77, 81, 82, 98, 90, 76, 71, 91, 82,
+  82, 82, 83, 76, 81, 65, 81, 74, 91, 74,
+  81, 92, 79, 81, 80, 90, 81, 92, 81, 74,
+  94, 93, 81, 83, 68, 83, 80, 76, 74, 98,
+  75, 93, 76, 90, 84, 78, 79, 74, 94, 103,
+  76, 88, 82, 83, 96, 86, 93, 83, 86, 90,
+  78, 79, 87, 74, 86, 95, 108, 85, 79, 82,
+  87, 77, 84, 84, 81, 89, 78, 82, 82, 79,
+  82, 74, 78, 101, 86, 103, 85, 81, 79, 76,
+  94, 84, 91, 77, 78, 84, 92, 87, 76, 84,
+  85, 84, 80, 82, 82, 85, 88, 87, 86, 91,
+  68, 130, 88, 84, 86, 88, 84, 88, 90, 70,
+  93, 96, 85, 82, 90, 78, 94, 76, 66, 87,
+  71, 88, 104, 71, 94, 76, 92, 77, 82, 85,
+  96, 85, 104, 76, 72, 82, 95, 94, 69, 78,
+  85, 94, 86, 77, 76, 73, 84, 96, 91, 81,
+  90, 86, 50, 78, 131, 91, 75, 91, 94, 78,
+  95, 79, 98, 80, 96, 83, 77, 97, 78, 74,
+  70, 82, 76, 81, 84, 72, 112, 64, 70, 92,
+  88, 73, 112, 74, 83, 66, 63, 85, 64, 87,
+  79, 71, 99, 82, 81, 96, 91, 76, 88, 72,
+  85, 78, 77, 81, 82, 87, 119, 66, 84, 86,
+  78, 85, 89, 89, 91, 87, 84, 86, 68, 82,
+  89, 89, 83, 74, 103, 84, 82, 67, 88, 83,
+  76, 87, 94, 94, 69, 80, 87, 84, 89, 90,
+  83, 86, 94, 74, 96, 76, 62, 84, 79, 85,
+  112, 66, 96, 69, 93, 69, 97, 89, 87, 87,
+  105, 75, 79, 83, 99, 84, 68, 78, 90, 91,
+  91, 80, 75, 81, 92, 95, 85, 79, 84, 86,
+  55, 83, 135, 77, 72, 95, 91, 79, 92, 76,
+  96, 86, 98, 79, 79, 97, 82, 79, 70, 79,
+  68, 81, 78, 76, 105, 62, 84, 86, 83, 73,
+  109, 69, 82, 79, 68, 83, 63, 85, 86, 85,
+  97, 83, 81, 91, 91, 82, 85, 72, 81, 78,
+  70, 80, 79, 87, 112, 69, 81, 81, 75, 84,
+  86, 95, 91, 90, 89, 87, 62, 85, 87, 84,
+  75, 81, 89, 85, 83, 63, 71, 82, 71, 87,
+  93, 94, 69, 84, 88, 92, 88, 87, 88, 98,
+  91, 78, 83, 80, 74, 83, 83, 84, 101, 76,
+  93, 76, 94, 81, 102, 84, 92, 86, 97, 72,
+  77, 83, 87, 81, 69, 84, 86, 95, 95, 85,
+  79, 74, 89, 91, 94, 79, 78, 79, 59, 77,
+  112, 65, 77, 93, 93, 76, 93, 81, 96, 86,
+  85, 90, 75, 90, 85, 80, 78, 73, 81, 84,
+  86, 77, 105, 68, 96, 99, 86, 80, 105, 77,
+  80, 83, 75, 89, 68, 78, 81, 89, 95, 87,
+  83, 94, 89, 87, 88, 78, 84, 80, 80, 86,
+  84, 85, 101, 78, 84, 84, 75, 84, 87, 96,
+  86, 92, 90, 85, 61, 80, 86, 79, 82, 88,
+  77, 87, 88, 72, 64, 79, 80, 87, 93, 95,
+  72, 82, 90, 67, 83, 99, 84, 95, 86, 84,
+  94, 87, 72, 88, 75, 86, 89, 70, 90, 78,
+  83, 74, 72, 81, 87, 83, 94, 73, 65, 90,
+  96, 82, 64, 77, 83, 93, 82, 81, 71, 81,
+  81, 88, 91, 83, 74, 80, 59, 82, 124, 95,
+  77, 91, 95, 79, 81, 88, 82, 82, 88, 84,
+  85, 93, 77, 64, 70, 90, 80, 88, 87, 66,
+  114, 65, 74, 82, 87, 64, 104, 71, 79, 70,
+  62, 85, 70, 92, 89, 76, 94, 84, 83, 88,
+  90, 79, 87, 82, 85, 79, 83, 73, 84, 88,
+  117, 78, 85, 82, 70, 81, 91, 78, 86, 86,
+  86, 84, 70, 81, 87, 88, 80, 76, 95, 84,
+  77, 67, 92, 86, 74, 84, 90, 86, 73, 85,
+  88, 79, 88, 88, 82, 93, 87, 86, 92, 86,
+  70, 85, 76, 81, 94, 61, 91, 70, 81, 72,
+  80, 90, 87, 82, 104, 72, 66, 89, 96, 75,
+  64, 79, 83, 86, 84, 82, 73, 84, 84, 85,
+  88, 85, 73, 79, 62, 82, 128, 83, 75, 96,
+  92, 80, 77, 85, 83, 86, 88, 83, 90, 93,
+  81, 71, 69, 88, 76, 90, 88, 71, 111, 65,
+  83, 76, 84, 64, 104, 65, 79, 80, 64, 82,
+  71, 90, 93, 86, 93, 88, 80, 85, 88, 77,
+  82, 73, 83, 80, 74, 71, 83, 87, 97, 80,
+  82, 79, 70, 80, 89, 85, 84, 86, 84, 82,
+  64, 85, 87, 85, 73, 83, 85, 83, 80, 66,
+  78, 87, 63, 88, 85, 87, 76, 88, 91, 89,
+  97, 86, 84, 96, 89, 85, 80, 91, 75, 87,
+  79, 82, 85, 69, 86, 80, 89, 82, 87, 87,
+  100, 83, 97, 73, 73, 88, 87, 79, 69, 84,
+  85, 86, 88, 85, 78, 81, 81, 79, 96, 81,
+  74, 75, 65, 80, 104, 73, 79, 91, 90, 80,
+  87, 87, 89, 90, 83, 91, 85, 87, 83, 77,
+  76, 82, 85, 92, 90, 71, 103, 76, 90, 89,
+  89, 72, 99, 73, 81, 81, 70, 87, 74, 83,
+  85, 89, 91, 85, 82, 88, 86, 87, 87, 83,
+  84, 78, 83, 80, 84, 90, 83, 86, 87, 73,
+  74, 82, 91, 88, 79, 89, 88, 80, 67, 84,
+  88, 84, 82, 89, 82, 87, 82, 74, 74, 84,
+  77, 84, 90, 88, 73, 84, 90, 74, 72, 100,
+  79, 111, 77, 85, 84, 94, 69, 89, 75, 88,
+  84, 80, 105, 99, 86, 80, 66, 73, 83, 80,
+  96, 78, 72, 94, 98, 82, 66, 77, 74, 90,
+  77, 76, 86, 85, 86, 90, 99, 59, 68, 81,
+  62, 87, 126, 93, 81, 90, 86, 74, 85, 90,
+  87, 80, 77, 83, 91, 90, 87, 68, 76, 92,
+  85, 79, 93, 68, 114, 79, 76, 75, 96, 66,
+  103, 74, 68, 69, 73, 82, 72, 100, 89, 85,
+  90, 86, 86, 91, 85, 88, 88, 111, 75, 80,
+  97, 75, 76, 99, 114, 81, 83, 82, 67, 77,
+  86, 69, 79, 89, 87, 84, 71, 80, 91, 82,
+  77, 74, 82, 83, 77, 70, 87, 91, 97, 70,
+  90, 90, 74, 81, 88, 80, 83, 92, 79, 90,
+  75, 91, 85, 97, 72, 88, 80, 86, 83, 74,
+  108, 95, 84, 80, 65, 83, 96, 78, 113, 81,
+  68, 96, 97, 71, 71, 76, 76, 81, 76, 80,
+  86, 86, 90, 90, 97, 62, 69, 79, 65, 80,
+  138, 81, 80, 95, 85, 77, 81, 85, 86, 75,
+  78, 83, 100, 92, 85, 70, 75, 95, 79, 83,
+  101, 75, 115, 77, 76, 77, 93, 66, 107, 70,
+  67, 83, 69, 81, 71, 98, 90, 85, 89, 93,
+  78, 90, 81, 81, 88, 96, 81, 86, 80, 72,
+  74, 98, 93, 81, 81, 78, 64, 77, 83, 74,
+  79, 89, 84, 85, 70, 83, 92, 79, 72, 81,
+  80, 82, 85, 69, 84, 95, 94, 78, 87, 89,
+  77, 89, 95, 85, 98, 90, 82, 84, 80, 92,
+  76, 95, 76, 85, 77, 81, 79, 77, 104, 97,
+  87, 86, 74, 80, 109, 84, 109, 79, 75, 90,
+  89, 74, 75, 84, 76, 75, 86, 81, 88, 87,
+  88, 83, 101, 65, 77, 77, 69, 83, 114, 71,
+  79, 88, 88, 77, 87, 87, 94, 81, 77, 87,
+  92, 84, 87, 78, 80, 88, 83, 85, 96, 67,
+  101, 87, 79, 79, 99, 73, 97, 75, 78, 88,
+  73, 82, 75, 91, 85, 85, 82, 88, 77, 86,
+  86, 87, 85, 96, 76, 79, 86, 81, 81, 98,
+  72, 84, 84, 74, 68, 80, 83, 71, 74, 90,
+  86, 75, 74, 83, 92, 82, 84, 85, 86, 86,
+  77, 77, 85, 89, 86, 73, 86, 91, 73, 84,
+  86, 71, 124, 94, 71, 98, 88, 79, 83, 92,
+  73, 70, 82, 91, 77, 80, 76, 99, 80, 86,
+  95, 81, 109, 87, 93, 75, 98, 93, 90, 99,
+  81, 82, 93, 70, 79, 90, 90, 86, 83, 77,
+  90, 72, 72, 65, 79, 87, 88, 76, 89, 87,
+  75, 85, 96, 81, 89, 80, 90, 68, 85, 84,
+  87, 93, 81, 70, 89, 79, 93, 90, 68, 89,
+  72, 86, 95, 85, 84, 85, 88, 92, 69, 69,
+  78, 83, 79, 96, 75, 89, 87, 91, 79, 79,
+  97, 74, 88, 72, 91, 82, 72, 73, 62, 84,
+  88, 77, 82, 83, 81, 93, 75, 92, 77, 90,
+  87, 78, 83, 80, 68, 92, 92, 90, 74, 90,
+  101, 84, 78, 77, 82, 92, 80, 83, 100, 70,
+  108, 83, 85, 79, 86, 74, 87, 79, 81, 80,
+  88, 77, 86, 74, 92, 92, 86, 80, 94, 75,
+  94, 86, 99, 75, 81, 87, 93, 106, 101, 81,
+  85, 70, 73, 77, 83, 78, 100, 74, 80, 93,
+  58, 76, 88, 73, 86, 74, 79, 83, 85, 76,
+  88, 88, 87, 83, 81, 86, 85, 78, 86, 80,
+  80, 89, 71, 92, 93, 79, 67, 86, 71, 90,
+  82, 83, 85, 78, 98, 90, 62, 97, 77, 93,
+  82, 97, 89, 84, 71, 86, 75, 76, 83, 67,
+  78, 79, 73, 90, 83, 107, 65, 78, 79, 83,
+  81, 84, 83, 105, 70, 85, 78, 85, 92, 83,
+  87, 74, 86, 95, 73, 86, 79, 82, 93, 93,
+  83, 77, 83, 84, 88, 88, 83, 83, 127, 87,
+  90, 74, 81, 74, 92, 75, 90, 76, 76, 65,
+  93, 86, 85, 81, 82, 82, 84, 71, 90, 89,
+  104, 76, 75, 81, 88, 111, 103, 75, 82, 66,
+  71, 89, 68, 84, 99, 75, 92, 76, 57, 77,
+  85, 76, 106, 72, 82, 83, 76, 69, 78, 88,
+  83, 77, 76, 110, 80, 83, 89, 87, 77, 107,
+  88, 86, 97, 77, 75, 71, 82, 88, 79, 92,
+  93, 80, 97, 82, 66, 84, 79, 93, 83, 93,
+  98, 99, 63, 88, 72, 76, 80, 72, 83, 84,
+  78, 89, 89, 114, 62, 76, 83, 75, 82, 83,
+  94, 91, 71, 78, 80, 78, 91, 82, 83, 76,
+  88, 86, 86, 83, 92, 75, 95, 91, 81, 79,
+  80, 89, 91, 82, 95, 67, 105, 83, 76, 87,
+  84, 73, 78, 83, 89, 75, 92, 83, 85, 62,
+  86, 92, 89, 70, 85, 81, 95, 94, 101, 77,
+  85, 88, 91, 114, 104, 76, 85, 68, 71, 74,
+  94, 77, 96, 74, 83, 97, 60, 71, 93, 75,
+  91, 71, 80, 82, 71, 75, 90, 91, 89, 88,
+  78, 94, 77, 81, 94, 88, 74, 97, 68, 98,
+  103, 84, 69, 73, 64, 86, 84, 88, 81, 72,
+  90, 77, 65, 90, 78, 91, 79, 88, 88, 80,
+  72, 89, 78, 74, 83, 70, 85, 84, 80, 84,
+  83, 108, 64, 75, 81, 78, 88, 81, 84, 94,
+  76, 89, 75, 90, 87, 84, 89, 64, 87, 95,
+  81, 88, 82, 81, 94, 88, 75, 75, 77, 86,
+  90, 89, 93, 74, 123, 90, 94, 66, 82, 70,
+  85, 81, 90, 76, 96, 83, 90, 80, 90, 78,
+  80, 77, 87, 77, 78, 94, 102, 79, 77, 84,
+  89, 115, 106, 83, 84, 69, 65, 76, 76, 88,
+  95, 76, 88, 89, 57, 84, 94, 79, 98, 72,
+  76, 79, 73, 76, 86, 96, 78, 78, 70, 99,
+  81, 80, 89, 82, 78, 97, 62, 95, 103, 68,
+  79, 74, 66, 84, 76, 88, 82, 73, 97, 87,
+  64, 95, 85, 95, 87, 89, 99, 94, 64, 85,
+  75, 70, 77, 70, 76, 85, 70, 91, 86, 105,
+  64, 75, 75, 78, 89, 82, 87, 86, 78, 83,
+  75, 79, 87, 79, 85, 64, 91, 102, 81, 87,
+  89, 76, 90, 89, 82, 75, 81, 84, 87, 86,
+  75, 83, 126, 87, 86, 67, 76, 73, 92, 85,
+  80, 75, 77, 89, 74, 96, 79, 72, 79, 85,
+  93, 75, 80, 95, 91, 72, 83, 77, 87, 114,
+  89, 78, 83, 65, 72, 87, 74, 93, 81, 69,
+  91, 53, 68, 77, 68, 89, 103, 70, 90, 80,
+  68, 87, 82, 88, 89, 76, 84, 95, 90, 80,
+  87, 100, 92, 81, 83, 69, 97, 77, 77, 77,
+  78, 69, 97, 90, 86, 82, 85, 84, 84, 67,
+  89, 87, 83, 86, 88, 104, 76, 86, 84, 71,
+  79, 82, 81, 75, 91, 78, 84, 72, 65, 81,
+  88, 82, 82, 81, 91, 88, 81, 80, 76, 76,
+  76, 81, 81, 79, 88, 88, 103, 80, 84, 90,
+  102, 81, 79, 75, 82, 97, 82, 82, 87, 67,
+  119, 92, 78, 86, 81, 68, 74, 74, 84, 77,
+  105, 75, 84, 72, 85, 83, 84, 77, 99, 75,
+  84, 94, 97, 75, 81, 84, 93, 115, 99, 91,
+  80, 76, 64, 81, 83, 89, 93, 89, 94, 97,
+  51, 74, 91, 69, 92, 77, 91, 76, 69, 64,
+  79, 92, 76, 74, 77, 95, 81, 83, 93, 78,
+  81, 84, 69, 87, 98, 86, 85, 80, 72, 99,
+  73, 88, 77, 75, 89, 87, 63, 109, 78, 85,
+  86, 87, 96, 91, 69, 79, 84, 75, 81, 70,
+  88, 96, 70, 86, 91, 99, 76, 85, 69, 78,
+  88, 79, 91, 84, 78, 80, 63, 76, 76, 73,
+  82, 64, 89, 86, 67, 95, 92, 72, 91, 84,
+  74, 77, 86, 89, 83, 82, 74, 77, 122, 87,
+  80, 94, 80, 70, 84, 80, 76, 76, 88, 96,
+  74, 92, 78, 81, 80, 85, 110, 82, 86, 89,
+  81, 69, 82, 78, 95, 115, 80, 88, 83, 70,
+  74, 91, 82, 88, 79, 75, 92, 62, 57, 74,
+  82, 84, 91, 74, 92, 75, 70, 84, 80, 83,
+  89, 68, 82, 83, 93, 79, 85, 83, 95, 51,
+  72, 67, 81, 80, 77, 82, 74, 82, 90, 90,
+  75, 87, 88, 97, 70, 87, 84, 82, 79, 90,
+  80, 93, 86, 83, 91, 71, 85, 78, 82, 74,
+  92, 78, 85, 66, 67, 80, 81, 69, 80, 80,
+  82, 85, 82, 81, 70, 76, 75, 77, 77, 78,
+  82, 89, 101, 81, 80, 86, 98, 83, 83, 75,
+  83, 91, 75, 77, 65, 79, 101, 80, 86, 78,
+  85, 81, 87, 93, 76, 87, 71, 102, 77, 89,
+  74, 86, 96, 93, 127, 82, 78, 85, 78, 81,
+  91, 76, 95, 104, 87, 83, 87, 77, 75, 76,
+  77, 84, 76, 67, 84, 57, 68, 91, 82, 96,
+  90, 74, 101, 82, 75, 102, 85, 83, 92, 70,
+  109, 82, 106, 84, 81, 82, 96, 66, 79, 69,
+  77, 97, 71, 69, 78, 74, 100, 100, 79, 105,
+  86, 82, 81, 76, 91, 84, 83, 87, 75, 90,
+  94, 90, 93, 77, 95, 83, 84, 76, 94, 75,
+  80, 64, 66, 88, 91, 86, 87, 80, 83, 83,
+  90, 92, 83, 89, 82, 79, 94, 81, 78, 80,
+  97, 81, 89, 99, 96, 87, 85, 96, 92, 92,
+  82, 80, 81, 88, 79, 82, 65, 78, 77, 85,
+  83, 98, 81, 90, 76, 77, 76, 81, 81, 97,
+  83, 97, 82, 76, 109, 98, 88, 81, 94, 84,
+  89, 86, 82, 82, 98, 93, 99, 87, 86, 88,
+  79, 78, 80, 90, 70, 77, 96, 74, 85, 77,
+  83, 79, 76, 96, 93, 78, 96, 76, 86, 67,
+  101, 92, 89, 81, 80, 65, 74, 86, 79, 77,
+  73, 91, 77, 88, 77, 85, 81, 96, 94, 91,
+  89, 80, 82, 72, 76, 110, 73, 82, 97, 81,
+  91, 84, 90, 75, 90, 74, 84, 77, 85, 89,
+  84, 95, 67, 85, 85, 91, 85, 89, 91, 93,
+  100, 108, 87, 69, 88, 85, 70, 93, 80, 83,
+  86, 88, 70, 93, 91, 90, 76, 82, 79, 98,
+  93, 76, 81, 74, 109, 65, 71, 76, 74, 92,
+  92, 83, 87, 87, 80, 69, 79, 78, 77, 99,
+  84, 83, 95, 82, 88, 73, 72, 83, 89, 86,
+  76, 86, 78, 92, 88, 85, 90, 77, 81, 82,
+  82, 86, 78, 82, 94, 67, 76, 74, 94, 65,
+  93, 75, 77, 90, 68, 82, 84, 87, 75, 84,
+  93, 89, 90, 73, 77, 84, 77, 79, 95, 87,
+  83, 96, 79, 75, 83, 85, 73, 86, 97, 95,
+  74, 89, 76, 115, 101, 76, 96, 87, 71, 84,
+  83, 74, 72, 91, 80, 103, 93, 89, 93, 99,
+  71, 89, 78, 91, 89, 84, 81, 95, 106, 79,
+  88, 77, 80, 83, 92, 84, 60, 99, 80, 76,
+  71, 69, 75, 77, 86, 77, 88, 62, 96, 80,
+  90, 86, 111, 78, 71, 81, 66, 89, 95, 79,
+  89, 78, 80, 73, 79, 67, 69, 102, 87, 88,
+  76, 68, 90, 78, 65, 80, 88, 87, 79, 97,
+  72, 94, 89, 96, 84, 70, 72, 84, 82, 77,
+  97, 78, 94, 68, 64, 90, 101, 64, 86, 65,
+  71, 101, 54, 76, 70, 107, 66, 83, 99, 96,
+  93, 90, 87, 93, 73, 85, 101, 76, 91, 110,
+  77, 74, 87, 74, 67, 98, 108, 104, 74, 101,
+  72, 93, 111, 81, 99, 91, 80, 79, 70, 79,
+  67, 95, 84, 115, 92, 96, 93, 84, 75, 90,
+  79, 93, 92, 73, 84, 87, 103, 65, 94, 84,
+  76, 92, 102, 86, 75, 104, 77, 82, 84, 74,
+  70, 72, 96, 77, 87, 53, 79, 84, 85, 87,
+  58, 81, 82, 84, 92, 96, 79, 87, 77, 75,
+  72, 94, 81, 103, 87, 88, 80, 78, 91, 94,
+  82, 74, 105, 84, 93, 90, 81, 76, 99, 85,
+  103, 82, 89, 90, 70, 78, 80, 92, 72, 76,
+  82, 84, 95, 78, 72, 92, 73, 97, 94, 75,
+  102, 74, 92, 68, 107, 89, 87, 75, 72, 60,
+  66, 78, 70, 71, 72, 89, 76, 81, 89, 91,
+  81, 93, 97, 81, 89, 74, 85, 70, 87, 96,
+  70, 80, 95, 73, 87, 85, 89, 89, 89, 73,
+  84, 59, 71, 79, 81, 94, 78, 83, 90, 88,
+  81, 84, 78, 88, 92, 111, 85, 81, 93, 85,
+  72, 85, 74, 68, 81, 89, 67, 101, 99, 94,
+  80, 76, 81, 105, 89, 75, 74, 78, 87, 69,
+  73, 81, 80, 91, 84, 88, 83, 91, 83, 71,
+  82, 85, 83, 90, 83, 86, 96, 94, 83, 65,
+  89, 84, 92, 77, 67, 87, 90, 97, 94, 89,
+  74, 83, 76, 79, 83, 86, 74, 76, 80, 68,
+  80, 77, 83, 75, 91, 81, 81, 78, 76, 79,
+  90, 76, 83, 88, 95, 91, 79, 70, 71, 80,
+  72, 76, 93, 87, 75, 81, 83, 81, 77, 83,
+  87, 84, 93, 86, 71, 82, 81, 108, 89, 79,
+  93, 85, 70, 85, 88, 75, 80, 82, 83, 77,
+  83, 85, 89, 101, 70, 94, 81, 91, 75, 88,
+  83, 93, 92, 92, 79, 94, 85, 86, 81, 81,
+  62, 85, 77, 77, 72, 79, 80, 77, 71, 69,
+  88, 75, 95, 85, 85, 87, 100, 81, 77, 83,
+  72, 88, 88, 82, 88, 83, 82, 73, 89, 70,
+  73, 94, 89, 86, 84, 84, 86, 75, 83, 85,
+  94, 88, 69, 97, 79, 88, 90, 97, 66, 78,
+  82, 78, 85, 77, 86, 80, 86, 70, 69, 92,
+  93, 65, 98, 61, 75, 89, 62, 84, 76, 102,
+  72, 80, 96, 101, 81, 83, 82, 89, 79, 82,
+  108, 85, 85, 90, 77, 76, 81, 72, 82, 93,
+  97, 100, 72, 96, 73, 86, 107, 91, 89, 97,
+  78, 82, 75, 71, 75, 88, 80, 94, 86, 98,
+  87, 84, 76, 94, 79, 92, 74, 83, 91, 91,
+  91, 78, 86, 98, 78, 88, 91, 81, 80, 95,
+  74, 80, 83, 76, 71, 69, 78, 72, 85, 64,
+  84, 85, 90, 93, 69, 84, 84, 82, 96, 88,
+  70, 83, 82, 73, 72, 104, 70, 101, 78, 85,
+  81, 82, 93, 91, 87, 85, 94, 75, 85, 85,
+  86, 78, 86, 85, 84, 80, 81, 92, 75, 87,
+  83, 78, 76, 89, 79, 89, 92, 77, 71, 95,
+  65, 108, 95, 82, 107, 83, 89, 84, 102, 86,
+  90, 77, 80, 70, 83, 73, 75, 80, 69, 99,
+  79, 74, 71, 86, 83, 81, 92, 79, 89, 71,
+  104, 72, 88, 89, 80, 88, 93, 67, 94, 92,
+  81, 90, 79, 71, 85, 68, 70, 82, 78, 86,
+  72, 85, 88, 78, 90, 73, 70, 78, 86, 94,
+  93, 68, 88, 82, 77, 90, 84, 67, 80, 88,
+  58, 95, 95, 89, 97, 85, 73, 87, 90, 87,
+  83, 87, 74, 73, 76, 83, 97, 90, 74, 92,
+  80, 77, 81, 81, 68, 95, 80, 82, 82, 89,
+  101, 91, 91, 77, 97, 83, 82, 78, 76, 83,
+  98, 81, 92, 90, 79, 88, 79, 80, 87, 76,
+  75, 80, 73, 81, 81, 73, 77, 101, 77, 100,
+  91, 78, 98, 81, 84, 80, 92, 89, 92, 82,
+  82, 83, 83, 81, 80, 82, 71, 94, 71, 77,
+  80, 91, 79, 82, 92, 86, 87, 67, 89, 74,
+  90, 104, 85, 84, 91, 81, 84, 88, 88, 85,
+  81, 73, 79, 66, 83, 82, 80, 92, 78, 81,
+  82, 82, 86, 76, 80, 83, 85, 92, 85, 78,
+  83, 84, 74, 89, 75, 71, 81, 84, 72, 89,
+  92, 80, 85, 82, 79, 88, 92, 83, 94, 92,
+  80, 82, 79, 80, 89, 89, 78, 92, 85, 84,
+  85, 77, 71, 85, 73, 82, 87, 88, 98, 88,
+  91, 84, 96, 84, 88, 92, 76, 89, 86, 87,
+  83, 92, 71, 89, 83, 82, 89, 81, 83, 77,
+  77, 80, 75, 92, 85, 89, 92, 90, 87, 83,
+  90, 80, 74, 90, 87, 88, 93, 95, 84, 84,
+  85, 91, 80, 87, 83, 81, 86, 89, 78, 83,
+  81, 84, 94, 83, 82, 77, 87, 83, 84, 90,
+  96, 91, 92, 88, 92, 85, 87, 81, 78, 78,
+  78, 78, 89, 92, 77, 86, 76, 85, 79, 85,
+  78, 84, 89, 86, 86, 86, 92, 85, 78, 88,
+  81, 81, 91, 80, 81, 85, 85, 82, 86, 72,
+  80, 83, 78, 73,
+};
+
+unsigned char expected_c_data[c_count] = {
+  166, 113, 100, 112, 92, 110, 111, 106, 135, 122,
+  107, 118, 103, 122, 139, 115, 133, 93, 102, 103,
+  108, 107, 92, 93, 105, 111, 148, 115, 108, 121,
+  123, 102, 136, 137, 101, 137, 113, 99, 115, 128,
+  151, 105, 119, 99, 98, 98, 102, 89, 78, 99,
+  125, 118, 124, 145, 126, 107, 118, 130, 141, 105,
+  121, 108, 121, 123, 150, 158, 121, 90, 101, 115,
+  110, 115, 104, 124, 99, 117, 197, 111, 122, 111,
+  118, 117, 81, 116, 107, 107, 159, 131, 90, 119,
+  122, 111, 102, 112, 115, 132, 107, 91, 114, 149,
+  138, 106, 146, 104, 114, 99, 141, 97, 98, 88,
+  137, 107, 93, 124, 100, 82, 116, 94, 100, 102,
+  132, 120, 123, 129, 108, 129, 95, 113, 121, 129,
+  105, 108, 107, 141, 109, 77, 117, 102, 101, 131,
+  92, 118, 111, 122, 97, 115, 147, 119, 112, 113,
+  125, 120, 110, 111, 77, 109, 106, 103, 101, 109,
+  92, 102, 155, 91, 88, 105, 122, 105, 112, 102,
+  119, 94, 111, 103, 82, 123, 85, 105, 79, 141,
+  124, 121, 116, 110, 134, 99, 117, 72, 86, 108,
+  118, 103, 169, 122, 140, 102, 80, 105, 97, 94,
+  144, 158, 97, 127, 112, 138, 131, 104, 120, 82,
+  84, 93, 109, 106, 70, 89, 94, 112, 130, 124,
+  119, 117, 109, 97, 110, 131, 89, 116, 97, 119,
+  129, 96, 156, 78, 121, 118, 89, 89, 101, 102,
+  28, 108, 145, 125, 115, 132, 116, 108, 144, 127,
+  120, 121, 130, 116, 116, 136, 147, 152, 113, 84,
+  89, 114, 126, 104, 122, 117, 98, 82, 149, 104,
+  139, 91, 109, 124, 91, 115, 129, 134, 203, 144,
+  86, 102, 119, 112, 97, 99, 120, 127, 103, 76,
+  116, 155, 156, 113, 170, 96, 123, 99, 155, 125,
+  84, 85, 139, 119, 90, 140, 82, 87, 113, 99,
+  91, 104, 148, 145, 115, 121, 97, 131, 72, 120,
+  125, 131, 144, 68, 112, 164, 111, 84, 124, 92,
+  82, 146, 104, 112, 132, 135, 90, 121, 151, 134,
+  105, 113, 122, 125, 104, 118, 106, 98, 88, 102,
+  111, 108, 138, 116, 147, 79, 122, 112, 112, 144,
+  91, 71, 113, 119, 89, 102, 95, 122, 71, 102,
+  77, 149, 123, 108, 125, 89, 145, 100, 129, 85,
+  76, 110, 105, 126, 156, 112, 139, 104, 63, 95,
+  85, 106, 124, 166, 79, 121, 129, 132, 122, 102,
+  105, 93, 83, 82, 119, 101, 86, 131, 78, 103,
+  118, 127, 132, 103, 110, 94, 99, 109, 100, 130,
+  77, 146, 158, 88, 132, 95, 117, 108, 72, 120,
+  115, 121, 34, 129, 158, 115, 118, 98, 111, 122,
+  134, 99, 101, 121, 114, 125, 112, 125, 124, 110,
+  103, 96, 98, 127, 113, 105, 122, 110, 103, 85,
+  140, 119, 128, 110, 125, 114, 116, 85, 145, 135,
+  197, 142, 78, 86, 101, 132, 104, 109, 148, 129,
+  110, 93, 112, 126, 139, 114, 165, 100, 132, 102,
+  140, 165, 61, 131, 104, 120, 86, 143, 81, 105,
+  101, 124, 73, 107, 144, 156, 121, 120, 72, 129,
+  80, 122, 113, 123, 146, 55, 103, 148, 117, 142,
+  110, 101, 62, 162, 100, 100, 152, 144, 104, 114,
+  131, 146, 105, 118, 87, 105, 92, 107, 114, 88,
+  72, 112, 108, 135, 134, 142, 114, 97, 134, 101,
+  122, 158, 76, 81, 121, 140, 77, 102, 125, 105,
+  70, 94, 100, 141, 105, 103, 151, 93, 136, 112,
+  108, 94, 71, 113, 116, 132, 152, 97, 107, 107,
+  75, 113, 77, 134, 110, 128, 71, 110, 110, 95,
+  104, 79, 96, 97, 86, 93, 116, 134, 90, 131,
+  66, 90, 112, 111, 134, 97, 131, 130, 116, 91,
+  98, 140, 66, 127, 151, 119, 125, 104, 119, 72,
+  77, 109, 107, 116, 33, 128, 145, 129, 104, 109,
+  114, 121, 124, 94, 91, 146, 100, 113, 108, 130,
+  105, 89, 92, 98, 87, 98, 96, 97, 118, 120,
+  105, 132, 147, 141, 106, 119, 122, 116, 116, 79,
+  104, 115, 188, 130, 69, 97, 116, 117, 114, 111,
+  152, 127, 121, 100, 118, 115, 120, 116, 145, 89,
+  130, 115, 110, 138, 75, 134, 109, 90, 94, 145,
+  89, 115, 97, 137, 65, 111, 125, 134, 125, 145,
+  67, 115, 95, 116, 92, 126, 98, 79, 107, 134,
+  122, 128, 101, 118, 60, 161, 79, 106, 134, 128,
+  108, 99, 102, 122, 84, 116, 73, 121, 98, 95,
+  70, 74, 56, 98, 79, 147, 126, 127, 101, 110,
+  144, 114, 135, 112, 80, 95, 130, 165, 90, 126,
+  98, 99, 65, 98, 134, 138, 91, 114, 153, 104,
+  127, 116, 97, 89, 78, 112, 109, 111, 173, 110,
+  152, 106, 115, 154, 75, 128, 109, 91, 95, 114,
+  131, 101, 114, 90, 94, 104, 92, 112, 117, 101,
+  94, 99, 80, 114, 119, 95, 134, 109, 153, 139,
+  126, 111, 113, 130, 90, 105, 127, 122, 137, 103,
+  128, 59, 102, 109, 96, 121, 42, 128, 135, 138,
+  88, 142, 122, 118, 121, 110, 112, 143, 106, 112,
+  112, 117, 136, 120, 111, 123, 83, 88, 116, 97,
+  132, 131, 111, 108, 157, 130, 86, 106, 118, 121,
+  116, 108, 106, 96, 177, 130, 74, 93, 107, 114,
+  113, 121, 111, 137, 124, 85, 121, 135, 137, 131,
+  140, 91, 124, 106, 109, 100, 98, 103, 114, 109,
+  120, 133, 110, 113, 97, 137, 84, 121, 119, 129,
+  117, 135, 84, 117, 103, 119, 118, 97, 105, 100,
+  94, 114, 119, 118, 104, 117, 76, 155, 86, 134,
+  119, 124, 107, 106, 111, 104, 102, 114, 102, 112,
+  112, 118, 86, 102, 80, 97, 93, 115, 101, 100,
+  99, 107, 117, 129, 137, 107, 96, 123, 116, 134,
+  97, 104, 99, 111, 74, 97, 114, 133, 97, 131,
+  143, 103, 127, 106, 106, 81, 100, 118, 106, 100,
+  182, 115, 96, 110, 101, 149, 74, 123, 131, 88,
+  100, 112, 128, 98, 131, 95, 101, 105, 92, 124,
+  104, 84, 91, 128, 83, 97, 118, 93, 135, 105,
+  144, 109, 145, 118, 106, 126, 95, 108, 112, 126,
+  125, 98, 126, 59, 124, 111, 102, 129, 45, 119,
+  131, 115, 77, 141, 129, 126, 104, 125, 107, 122,
+  117, 105, 119, 117, 143, 133, 125, 106, 89, 93,
+  134, 103, 133, 120, 106, 108, 169, 124, 79, 105,
+  108, 128, 77, 106, 107, 100, 153, 134, 74, 79,
+  108, 135, 106, 118, 96, 125, 113, 72, 108, 133,
+  155, 112, 160, 89, 131, 77, 118, 110, 89, 89,
+  114, 120, 107, 126, 99, 114, 90, 120, 84, 120,
+  123, 124, 113, 126, 96, 120, 101, 125, 99, 104,
+  96, 98, 98, 113, 106, 119, 103, 104, 100, 149,
+  98, 131, 126, 125, 112, 108, 127, 103, 113, 115,
+  117, 97, 104, 116, 70, 91, 84, 97, 88, 103,
+  84, 127, 110, 91, 99, 126, 140, 84, 104, 113,
+  103, 100, 91, 90, 93, 125, 70, 93, 95, 115,
+  105, 128, 139, 109, 137, 98, 99, 75, 97, 111,
+  109, 105, 166, 123, 106, 112, 93, 132, 82, 102,
+  132, 90, 97, 117, 124, 111, 128, 101, 104, 94,
+  96, 130, 93, 74, 89, 128, 86, 100, 124, 86,
+  132, 113, 129, 105, 140, 128, 108, 109, 99, 105,
+  104, 120, 123, 89, 119, 52, 134, 110, 96, 133,
+  52, 106, 129, 114, 80, 128, 124, 121, 101, 112,
+  102, 119, 126, 96, 112, 120, 143, 134, 125, 107,
+  94, 99, 138, 104, 129, 110, 105, 110, 173, 110,
+  104, 92, 105, 123, 79, 100, 108, 111, 150, 139,
+  77, 80, 131, 132, 103, 105, 101, 110, 107, 70,
+  107, 127, 155, 107, 171, 97, 125, 77, 128, 113,
+  90, 85, 108, 121, 124, 126, 87, 113, 89, 97,
+  91, 119, 114, 131, 122, 115, 103, 127, 89, 117,
+  92, 89, 89, 84, 98, 108, 100, 98, 114, 87,
+  108, 137, 113, 136, 128, 137, 114, 105, 124, 125,
+  117, 119, 115, 125, 89, 108, 84, 93, 98, 95,
+  83, 101, 99, 137, 106, 85, 109, 134, 138, 104,
+  112, 92, 95, 110, 88, 81, 108, 134, 57, 80,
+  86, 119, 116, 115, 145, 101, 140, 97, 93, 78,
+  97, 119, 101, 110, 149, 117, 103, 118, 103, 125,
+  85, 99, 116, 95, 84, 118, 125, 124, 111, 99,
+  109, 94, 90, 124, 90, 66, 82, 123, 86, 105,
+  126, 78, 114, 109, 126, 97, 119, 148, 104, 89,
+  101, 105, 103, 115, 118, 81, 109, 56, 125, 107,
+  84, 123, 62, 102, 122, 103, 83, 111, 105, 106,
+  100, 93, 112, 118, 135, 97, 110, 116, 143, 147,
+  125, 103, 91, 94, 138, 99, 123, 111, 110, 111,
+  165, 108, 117, 89, 99, 120, 67, 101, 105, 106,
+  134, 137, 87, 79, 119, 114, 102, 96, 103, 114,
+  102, 71, 107, 143, 154, 91, 167, 104, 103, 90,
+  126, 102, 89, 80, 114, 131, 118, 128, 77, 107,
+  99, 87, 98, 110, 104, 125, 130, 118, 106, 125,
+  73, 119, 96, 91, 86, 72, 88, 107, 94, 102,
+  121, 77, 109, 114, 114, 138, 128, 142, 113, 102,
+  108, 133, 112, 113, 121, 117, 77, 106, 83, 107,
+  108, 88, 85, 96, 102, 119, 97, 76, 100, 135,
+  132, 101, 111, 80, 89, 117, 83, 69, 98, 124,
+  48, 67, 85, 123, 122, 109, 149, 90, 136, 93,
+  102, 79, 96, 140, 96, 114, 137, 110, 105, 122,
+  109, 118, 85, 106, 101, 100, 82, 112, 120, 128,
+  105, 96, 110, 97, 89, 110, 86, 69, 74, 110,
+  90, 114, 126, 71, 99, 104, 121, 87, 101, 164,
+  99, 76, 104, 104, 101, 104, 118, 84, 102, 64,
+  112, 96, 68, 118, 68, 98, 111, 106, 84, 101,
+  93, 99, 103, 90, 124, 120, 140, 95, 104, 111,
+  146, 155, 117, 94, 87, 90, 128, 97, 116, 114,
+  117, 96, 161, 106, 117, 88, 92, 115, 58, 103,
+  102, 96, 120, 125, 88, 74, 113, 96, 97, 90,
+  101, 110, 96, 67, 105, 156, 149, 90, 152, 98,
+  78, 95, 122, 86, 95, 71, 121, 133, 111, 129,
+  68, 97, 109, 78, 108, 99, 97, 113, 138, 112,
+  110, 119, 67, 115, 92, 97, 86, 72, 89, 112,
+  86, 102, 123, 69, 107, 98, 114, 122, 118, 145,
+  113, 99, 100, 126, 104, 110, 118, 103, 68, 104,
+  81, 121, 109, 78, 93, 87, 111, 100, 95, 74,
+  100, 126, 128, 100, 113, 81, 94, 121, 84, 71,
+  82, 119, 47, 63, 80, 122, 129, 107, 147, 80,
+  137, 84, 106, 77, 102, 153, 95, 118, 128, 106,
+  111, 123, 113, 118, 81, 114, 96, 105, 88, 110,
+  121, 125, 108, 94, 108, 94, 87, 105, 85, 74,
+  76, 95, 93, 120, 123, 76, 101, 104, 115, 78,
+  87, 163, 96, 73, 106, 111, 93, 93, 128, 87,
+  108, 75, 107, 90, 63, 118, 69, 89, 115, 112,
+  83, 98, 86, 95, 109, 94, 131, 124, 146, 102,
+  96, 109, 148, 153, 113, 99, 82, 85, 115, 93,
+  118, 112, 117, 84, 155, 108, 110, 102, 87, 110,
+  58, 114, 106, 82, 113, 109, 87, 77, 108, 86,
+  95, 95, 107, 107, 93, 65, 99, 166, 147, 90,
+  150, 95, 63, 87, 121, 80, 97, 69, 123, 134,
+  109, 125, 63, 87, 118, 73, 118, 88, 98, 111,
+  134, 102, 114, 121, 66, 111, 82, 106, 92, 76,
+  92, 118, 86, 109, 130, 65, 106, 94, 113, 109,
+  118, 153, 108, 99, 100, 114, 111, 108, 127, 95,
+  66, 105, 82, 134, 115, 73, 106, 82, 119, 97,
+  101, 72, 99, 116, 123, 102, 115, 85, 107, 121,
+  95, 78, 79, 108, 50, 68, 78, 118, 142, 103,
+  141, 79, 131, 74, 112, 83, 104, 153, 96, 120,
+  133, 107, 111, 127, 113, 120, 87, 117, 100, 123,
+  97, 115, 119, 118, 121, 94, 100, 91, 93, 104,
+  81, 75, 79, 90, 92, 125, 120, 87, 114, 104,
+  115, 77, 85, 158, 99, 85, 109, 123, 89, 93,
+  136, 99, 123, 89, 104, 105, 69, 124, 72, 91,
+  126, 100, 90, 87, 87, 97, 121, 97, 131, 120,
+  145, 109, 98, 107, 154, 149, 116, 95, 80, 85,
+  107, 99, 130, 115, 114, 82, 151, 111, 110, 119,
+  89, 106, 54, 116, 116, 91, 110, 98, 85, 84,
+  107, 85, 96, 102, 113, 112, 100, 68, 99, 162,
+  158, 91, 152, 95, 75, 95, 124, 95, 89, 71,
+  123, 134, 98, 126, 56, 83, 124, 87, 128, 86,
+  103, 111, 129, 92, 115, 126, 75, 107, 80, 107,
+  108, 85, 94, 120, 91, 121, 134, 70, 105, 101,
+  112, 106, 121, 162, 101, 99, 105, 100, 118, 107,
+  128, 97, 73, 111, 73, 141, 120, 75, 110, 90,
+  130, 110, 113, 86, 107, 106, 123, 94, 121, 102,
+  114, 124, 108, 85, 86, 99, 61, 83, 91, 109,
+  142, 104, 135, 82, 124, 70, 115, 95, 107, 145,
+  105, 126, 135, 106, 124, 124, 114, 119, 87, 123,
+  99, 122, 110, 114, 121, 113, 119, 90, 99, 88,
+  96, 103, 75, 91, 91, 88, 91, 126, 116, 92,
+  121, 107, 122, 83, 98, 147, 99, 90, 108, 121,
+  90, 96, 141, 104, 133, 87, 105, 102, 65, 124,
+  71, 102, 122, 93, 99, 85, 95, 99, 119, 97,
+  126, 132, 132, 106, 94, 108, 151, 151, 117, 88,
+  82, 77, 90, 102, 121, 119, 115, 87, 154, 113,
+  112, 135, 94, 104, 67, 113, 114, 100, 114, 100,
+  80, 97, 108, 94, 104, 104, 107, 108, 106, 67,
+  105, 145, 158, 100, 136, 98, 90, 87, 124, 113,
+  99, 68, 130, 119, 97, 131, 55, 81, 128, 103,
+  135, 90, 107, 115, 127, 89, 114, 126, 87, 105,
+  80, 96, 108, 96, 91, 98, 104, 130, 134, 70,
+  102, 103, 106, 97, 114, 164, 97, 97, 97, 93,
+  126, 107, 110, 97, 85, 113, 76, 148, 116, 69,
+  103, 98, 136, 98, 105, 101, 110, 100, 123, 92,
+  124, 117, 112, 123, 124, 82, 93, 95, 69, 95,
+  112, 102, 134, 110, 135, 81, 118, 73, 126, 87,
+  111, 133, 113, 122, 138, 107, 123, 122, 117, 119,
+  97, 126, 93, 104, 115, 110, 118, 110, 121, 88,
+  102, 85, 93, 110, 74, 84, 94, 98, 92, 119,
+  120, 86, 124, 103, 126, 87, 111, 142, 100, 85,
+  112, 111, 91, 104, 143, 104, 133, 89, 105, 92,
+  70, 127, 71, 107, 115, 102, 98, 93, 99, 95,
+  113, 104, 127, 138, 127, 106, 90, 110, 156, 152,
+  119, 84, 90, 71, 91, 100, 122, 123, 118, 92,
+  151, 114, 109, 128, 99, 102, 67, 119, 101, 100,
+  115, 104, 87, 103, 106, 106, 98, 108, 105, 106,
+  105, 74, 108, 139, 154, 101, 145, 94, 81, 86,
+  123, 95, 98, 68, 133, 111, 101, 130, 57, 81,
+  122, 101, 137, 94, 109, 113, 129, 84, 106, 120,
+  93, 110, 88, 88, 107, 93, 85, 94, 106, 128,
+  126, 68, 99, 100, 111, 100, 108, 155, 99, 92,
+  95, 94, 121, 109, 129, 96, 91, 114, 78, 157,
+  121, 70, 99, 95, 130, 102, 103, 109, 102, 112,
+  122, 85, 118, 120, 109, 118, 120, 89, 91, 93,
+  71, 96, 120, 101, 131, 115, 136, 84, 116, 75,
+  128, 100, 115, 132, 106, 116, 137, 109, 118, 127,
+  120, 130, 105, 109, 97, 107, 123, 111, 115, 117,
+  133, 98, 97, 84, 91, 118, 76, 68, 86, 103,
+  94, 118, 125, 78, 124, 102, 130, 79, 115, 145,
+  97, 77, 117, 108, 95, 100, 142, 96, 129, 92,
+  108, 114, 71, 128, 72, 107, 113, 101, 94, 90,
+  98, 94, 109, 102, 126, 131, 134, 108, 86, 106,
+  167, 157, 124, 89, 92, 72, 102, 91, 135, 125,
+  116, 88, 148, 105, 99, 109, 98, 108, 56, 111,
+  99, 103, 120, 104, 99, 106, 107, 98, 80, 112,
+  106, 112, 107, 82, 102, 157, 149, 105, 167, 91,
+  75, 93, 124, 90, 95, 62, 126, 127, 103, 123,
+  62, 86, 113, 87, 139, 96, 109, 115, 127, 85,
+  102, 112, 94, 106, 101, 88, 105, 89, 84, 102,
+  93, 123, 115, 64, 102, 100, 116, 100, 116, 143,
+  101, 94, 106, 96, 111, 107, 138, 95, 90, 116,
+  73, 160, 129, 81, 99, 90, 115, 113, 109, 102,
+  96, 123, 126, 83, 113, 108, 106, 122, 106, 77,
+  80, 97, 68, 81, 105, 102, 129, 121, 139, 80,
+  113, 66, 118, 115, 116, 134, 104, 115, 142, 111,
+  110, 120, 118, 148, 88, 94, 104, 119, 129, 109,
+  124, 130, 130, 110, 89, 85, 93, 116, 86, 73,
+  87, 95, 96, 128, 128, 74, 120, 103, 132, 76,
+  109, 152, 87, 77, 116, 122, 97, 97, 139, 94,
+  123, 87, 114, 120, 64, 123, 65, 100, 117, 95,
+  84, 86, 99, 101, 113, 101, 124, 124, 134, 97,
+  85, 101, 180, 169, 122, 101, 86, 77, 107, 93,
+  127, 128, 113, 77, 152, 99, 92, 97, 87, 118,
+  58, 104, 108, 98, 130, 114, 99, 98, 103, 88,
+  72, 111, 102, 114, 109, 78, 106, 167, 143, 112,
+  170, 89, 79, 75, 125, 103, 99, 61, 125, 141,
+  102, 124, 69, 96, 105, 86, 129, 96, 108, 128,
+  127, 97, 97, 109, 83, 110, 114, 90, 99, 92,
+  81, 105, 88, 120, 103, 67, 104, 104, 111, 94,
+  117, 145, 100, 103, 122, 96, 104, 102, 118, 92,
+  86, 113, 68, 147, 118, 78, 112, 94, 100, 99,
+  103, 84, 93, 121, 128, 92, 117, 92, 100, 118,
+  92, 68, 83, 103, 64, 63, 96, 106, 118, 134,
+  142, 73, 116, 63, 102, 95, 115, 135, 100, 112,
+  158, 115, 94, 110, 107, 154, 75, 91, 118, 123,
+  115, 107, 132, 126, 124, 117, 90, 91, 87, 112,
+  107, 88, 87, 87, 89, 118, 132, 81, 125, 106,
+  132, 78, 89, 147, 93, 94, 100, 138, 91, 94,
+  132, 94, 121, 69, 117, 115, 66, 120, 58, 98,
+  132, 102, 69, 88, 99, 108, 110, 107, 122, 115,
+  129, 95, 99, 101, 172, 168, 119, 114, 78, 86,
+  120, 98, 120, 139, 111, 70, 157, 114, 90, 99,
+  86, 124, 73, 105, 128, 108, 149, 130, 87, 71,
+  99, 86, 82, 114, 109, 110, 104, 80, 114, 164,
+  147, 116, 185, 83, 87, 72, 127, 117, 87, 72,
+  123, 146, 92, 123, 78, 105, 104, 98, 112, 98,
+  108, 133, 116, 123, 89, 132, 67, 125, 111, 121,
+  99, 94, 79, 120, 92, 110, 103, 84, 104, 122,
+  118, 110, 127, 144, 99, 111, 127, 94, 101, 107,
+  113, 92, 85, 103, 64, 119, 99, 79, 123, 108,
+  116, 99, 113, 79, 109, 111, 129, 97, 120, 92,
+  104, 121, 82, 70, 91, 106, 58, 68, 94, 112,
+  113, 141, 140, 80, 130, 69, 92, 78, 98, 133,
+  86, 121, 164, 110, 117, 105, 86, 140, 72, 96,
+  121, 124, 100, 110, 136, 102, 120, 111, 102, 111,
+  94, 106, 117, 116, 85, 111, 78, 107, 131, 97,
+  124, 99, 134, 103, 87, 124, 115, 133, 81, 137,
+  107, 88, 129, 92, 126, 69, 112, 117, 92, 128,
+  56, 113, 141, 113, 73, 90, 111, 117, 120, 122,
+  111, 112, 103, 105, 121, 113, 139, 131, 110, 119,
+  84, 96, 119, 107, 129, 145, 110, 80, 153, 130,
+  108, 120, 103, 120, 105, 93, 138, 119, 189, 134,
+  75, 68, 113, 116, 106, 121, 120, 110, 112, 88,
+  123, 144, 149, 125, 178, 83, 117, 84, 120, 156,
+  82, 95, 111, 140, 94, 130, 86, 110, 99, 119,
+  96, 106, 118, 126, 111, 134, 79, 173, 78, 128,
+  96, 144, 120, 98, 94, 129, 113, 111, 107, 107,
+  86, 150, 127, 124, 128, 127, 103, 103, 120, 100,
+  102, 119, 107, 111, 92, 100, 82, 95, 82, 96,
+  107, 119, 149, 131, 115, 87, 138, 100, 133, 108,
+  106, 116, 129, 133, 92, 94, 94, 109, 59, 91,
+  95, 120, 98, 129, 144, 93, 133, 89, 86, 78,
+  89, 124, 75, 136, 160, 117, 148, 102, 64, 120,
+  73, 141, 124, 109, 98, 117, 129, 79, 114, 110,
+  117, 122, 106, 102, 107, 143, 94, 138, 76, 99,
+  128, 106, 126, 105, 122, 146, 140, 107, 114, 159,
+  78, 125, 131, 99, 128, 90, 130, 73, 96, 111,
+  116, 142, 49, 135, 130, 128, 102, 113, 131, 129,
+  116, 139, 93, 135, 98, 113, 122, 127, 109, 94,
+  108, 114, 102, 110, 89, 110, 134, 130, 106, 111,
+  155, 132, 98, 133, 133, 118, 113, 84, 119, 114,
+  208, 130, 70, 99, 143, 141, 121, 112, 115, 110,
+  115, 105, 113, 114, 142, 131, 159, 92, 144, 78,
+  119, 153, 88, 104, 115, 112, 109, 138, 90, 111,
+  92, 128, 86, 112, 128, 136, 116, 126, 79, 169,
+  106, 122, 89, 132, 119, 91, 118, 124, 130, 129,
+  98, 119, 78, 180, 121, 117, 110, 112, 106, 90,
+  119, 115, 102, 118, 99, 124, 98, 110, 90, 77,
+  82, 96, 91, 125, 125, 165, 121, 101, 134, 109,
+  132, 123, 101, 117, 141, 114, 103, 108, 110, 113,
+  71, 114, 125, 113, 90, 116, 157, 107, 114, 109,
+  90, 95, 83, 104, 81, 128, 163, 137, 107, 104,
+  60, 118, 92, 138, 122, 92, 106, 132, 114, 98,
+  119, 104, 114, 102, 108, 106, 101, 118, 94, 157,
+  87, 100, 127, 109, 139, 104, 114, 158, 157, 122,
+  118, 145, 91, 113, 131, 126, 140, 89, 124, 77,
+  94, 117, 122, 148, 36, 137, 138, 140, 113, 129,
+  124, 129, 118, 121, 84, 109, 117, 116, 111, 128,
+  135, 105, 124, 105, 111, 120, 112, 122, 134, 117,
+  101, 109, 152, 118, 77, 110, 135, 114, 107, 90,
+  99, 115, 189, 136, 81, 119, 154, 131, 135, 110,
+  121, 121, 112, 119, 103, 117, 153, 111, 179, 100,
+  149, 73, 142, 112, 74, 87, 104, 106, 91, 130,
+  86, 114, 82, 113, 96, 113, 135, 162, 119, 113,
+  85, 144, 105, 118, 101, 109, 120, 76, 116, 123,
+  120, 123, 91, 110, 83, 188, 116, 137, 117, 122,
+  112, 101, 147, 133, 111, 118, 109, 138, 97, 119,
+  70, 81, 114, 89, 89, 120, 73, 176, 134, 99,
+  115, 148, 121, 129, 106, 94, 126, 111, 91, 118,
+  132, 123, 73, 97, 113, 101, 94, 117, 154, 117,
+  115, 105, 89, 106, 92, 103, 86, 102, 176, 145,
+  119, 100, 77, 131, 83, 97, 125, 108, 112, 126,
+  123, 128, 135, 100, 107, 74, 88, 113, 101, 87,
+  92, 112, 93, 88, 132, 98, 135, 110, 123, 123,
+  117, 138, 104, 103, 104, 120, 101, 123, 156, 80,
+  118, 73, 101, 116, 95, 127, 32, 129, 142, 120,
+  92, 105, 104, 112, 124, 87, 99, 102, 123, 113,
+  112, 122, 155, 152, 121, 98, 94, 96, 131, 106,
+  128, 120, 96, 102, 150, 101, 83, 92, 109, 128,
+  93, 88, 109, 113, 162, 138, 91, 117, 139, 98,
+  106, 106, 119, 129, 102, 103, 110, 152, 159, 104,
+  206, 101, 144, 96, 152, 98, 69, 67, 111, 127,
+  93, 121, 79, 106, 103, 105, 102, 115, 127, 160,
+  105, 114, 95, 132, 84, 116, 120, 89, 110, 74,
+  95, 109, 102, 104, 98, 98, 94, 176, 117, 138,
+  132, 134, 107, 116, 150, 123, 122, 108, 110, 122,
+  89, 118, 69, 100, 122, 86, 89, 113, 85, 133,
+  136, 83, 108, 156, 125, 113, 108, 85, 97, 129,
+  95, 71, 108, 113, 60, 88, 96, 100, 104, 138,
+  133, 93, 142, 95, 105, 105, 97, 109, 81, 110,
+  186, 132, 126, 94, 85, 137, 73, 86, 117, 123,
+  96, 120, 139, 138, 134, 101, 100, 84, 87, 102,
+  110, 76, 80, 94, 85, 92, 144, 92, 114, 107,
+  130, 105, 108, 154, 100, 101, 105, 127, 106, 93,
+  153, 85, 107, 82, 91, 119, 92, 106, 35, 129,
+  144, 104, 88, 90, 98, 109, 126, 87, 129, 91,
+  106, 109, 142, 119, 151, 175, 126, 104, 92, 90,
+  122, 85, 123, 131, 100, 79, 159, 108, 124, 97,
+  95, 130, 95, 78, 140, 122, 172, 138, 94, 82,
+  114, 110, 102, 111, 106, 110, 96, 80, 129, 171,
+  155, 115, 192, 95, 126, 101, 139, 118, 68, 73,
+  118, 160, 96, 113, 82, 109, 117, 112, 101, 113,
+  127, 130, 104, 147, 86, 151, 78, 122, 126, 114,
+  128, 80, 82, 107, 101, 113, 107, 106, 92, 149,
+  137, 129, 135, 131, 102, 103, 134, 108, 106, 102,
+  92, 97, 86, 113, 73, 104, 105, 87, 101, 101,
+  105, 94, 124, 77, 113, 115, 140, 98, 103, 112,
+  100, 121, 95, 53, 77, 109, 56, 94, 83, 117,
+  97, 145, 129, 76, 143, 92, 106, 87, 102, 122,
+  82, 139, 156, 126, 85, 91, 56, 117, 72, 105,
+  102, 123, 79, 127, 115, 127, 116, 81, 103, 100,
+  61, 81, 113, 139, 68, 121, 63, 93, 154, 101,
+  93, 89, 116, 122, 116, 124, 89, 118, 89, 129,
+  126, 92, 128, 99, 105, 104, 78, 84, 88, 93,
+  29, 114, 145, 117, 73, 90, 107, 90, 109, 143,
+  122, 99, 97, 116, 162, 149, 113, 145, 120, 99,
+  92, 109, 109, 83, 122, 117, 99, 102, 160, 145,
+  128, 95, 94, 118, 115, 61, 120, 133, 216, 131,
+  80, 82, 136, 132, 131, 112, 123, 87, 92, 94,
+  116, 138, 129, 96, 142, 84, 119, 91, 118, 139,
+  68, 100, 110, 131, 82, 118, 86, 126, 116, 114,
+  85, 111, 132, 107, 115, 174, 61, 184, 86, 133,
+  92, 180, 106, 78, 92, 129, 114, 86, 101, 107,
+  83, 124, 142, 95, 134, 126, 107, 83, 118, 121,
+  90, 107, 78, 106, 79, 84, 70, 78, 78, 98,
+  96, 118, 136, 106, 123, 70, 126, 93, 138, 116,
+  81, 103, 119, 109, 77, 90, 73, 111, 35, 102,
+  107, 130, 98, 122, 120, 97, 130, 86, 119, 78,
+  80, 107, 69, 162, 122, 131, 171, 101, 58, 121,
+  84, 123, 104, 119, 90, 147, 118, 156, 123, 93,
+  111, 110, 70, 65, 128, 142, 92, 104, 64, 124,
+  157, 93, 105, 91, 94, 154, 121, 108, 72, 140,
+  94, 153, 166, 97, 134, 114, 115, 109, 58, 93,
+  100, 124, 35, 136, 140, 143, 98, 110, 118, 103,
+  121, 151, 100, 113, 100, 120, 107, 148, 96, 99,
+  113, 102, 93, 152, 88, 111, 120, 107, 104, 88,
+  159, 128, 119, 85, 125, 114, 149, 66, 121, 134,
+  254, 131, 79, 100, 134, 140, 122, 111, 154, 99,
+  95, 98, 100, 97, 112, 138, 125, 95, 129, 104,
+  115, 146, 98, 117, 98, 99, 115, 117, 124, 134,
+  110, 115, 84, 116, 129, 136, 122, 131, 46, 179,
+  136, 120, 116, 116, 169, 82, 112, 114, 124, 114,
+  109, 109, 72, 131, 154, 106, 136, 152, 124, 66,
+  127, 141, 116, 119, 73, 116, 80, 87, 147, 78,
+  82, 123, 100, 126, 149, 128, 121, 108, 121, 129,
+  151, 221, 69, 95, 125, 135, 63, 104, 125, 125,
+  51, 113, 118, 123, 108, 117, 140, 111, 126, 98,
+  117, 103, 71, 97, 62, 139, 130, 114, 125, 106,
+  66, 125, 92, 153, 121, 110, 74, 142, 109, 158,
+  113, 85, 116, 96, 95, 70, 116, 130, 55, 181,
+  75, 129, 146, 94, 127, 87, 103, 156, 142, 106,
+  65, 145, 90, 145, 190, 118, 138, 118, 116, 97,
+  66, 107, 83, 139, 20, 127, 118, 125, 94, 110,
+  118, 95, 117, 102, 109, 127, 108, 109, 95, 118,
+  114, 105, 107, 80, 101, 147, 76, 127, 116, 112,
+  105, 94, 176, 89, 92, 93, 127, 109, 138, 73,
+  99, 104, 255, 135, 85, 106, 104, 139, 134, 103,
+  167, 127, 104, 85, 107, 93, 123, 122, 121, 94,
+  133, 84, 122, 142, 113, 97, 108, 91, 111, 123,
+  126, 127, 117, 110, 97, 110, 122, 126, 125, 122,
+  58, 151, 101, 108, 120, 106, 146, 88, 90, 93,
+  116, 160, 105, 106, 85, 121, 118, 106, 143, 151,
+  113, 80, 129, 129, 99, 108, 76, 73, 98, 92,
+  116, 72, 80, 121, 89, 136, 97, 112, 121, 111,
+  95, 133, 147, 212, 68, 88, 123, 140, 80, 78,
+  112, 130, 51, 107, 132, 112, 93, 123, 124, 104,
+  107, 89, 122, 76, 76, 93, 92, 89, 170, 113,
+  106, 101, 76, 144, 118, 139, 135, 107, 80, 134,
+  94, 161, 126, 69, 139, 70, 77, 94, 94, 139,
+  82, 135, 80, 126, 141, 99, 143, 109, 147, 128,
+  145, 132, 79, 132, 89, 126, 146, 128, 150, 113,
+  116, 107, 69, 100, 73, 119, 22, 128, 102, 108,
+  108, 114, 106, 94, 110, 78, 152, 108, 103, 92,
+  116, 112, 163, 183, 111, 90, 91, 95, 111, 104,
+  114, 126, 105, 118, 196, 94, 84, 103, 102, 124,
+  95, 77, 86, 111, 226, 160, 72, 140, 123, 134,
+  129, 94, 133, 136, 117, 79, 98, 120, 155, 106,
+  155, 95, 132, 86, 121, 104, 89, 65, 112, 96,
+  84, 131, 112, 111, 119, 97, 137, 114, 126, 121,
+  134, 133, 66, 140, 84, 114, 133, 115, 130, 86,
+  78, 90, 106, 103, 89, 105, 91, 119, 100, 94,
+  124, 152, 105, 104, 141, 126, 93, 96, 103, 90,
+  112, 102, 73, 98, 127, 88, 86, 127, 69, 79,
+  117, 119, 91, 121, 132, 107, 96, 96, 120, 104,
+  110, 75, 89, 117, 37, 94, 129, 123, 87, 133,
+  100, 93, 112, 88, 111, 51, 92, 94, 127, 97,
+  173, 118, 116, 97, 84, 152, 150, 88, 133, 132,
+  92, 125, 97, 160, 124, 73, 134, 64, 77, 100,
+  89, 75, 92, 103, 72, 138, 144, 87, 150, 120,
+  124, 95, 103, 143, 76, 101, 94, 148, 107, 108,
+  145, 102, 123, 100, 81, 110, 80, 103, 31, 142,
+  95, 97, 121, 115, 82, 89, 103, 115, 162, 119,
+  115, 91, 116, 114, 156, 185, 113, 106, 94, 82,
+  120, 91, 119, 121, 112, 102, 187, 91, 110, 107,
+  105, 127, 86, 88, 87, 124, 198, 164, 66, 117,
+  107, 143, 103, 89, 101, 102, 105, 86, 97, 133,
+  138, 119, 160, 95, 120, 101, 124, 112, 113, 82,
+  111, 103, 118, 143, 109, 122, 121, 72, 166, 112,
+  133, 132, 175, 126, 69, 115, 95, 122, 152, 116,
+  128, 64, 76, 106, 95, 103, 107, 102, 93, 110,
+  116, 92, 123, 171, 122, 109, 139, 143, 79, 103,
+  119, 111, 103, 110, 86, 110, 154, 81, 106, 111,
+  107, 78, 119, 111, 90, 117, 123, 114, 100, 81,
+  94, 102, 107, 71, 102, 112, 34, 77, 120, 166,
+  101, 124, 102, 98, 122, 120, 98, 66, 98, 113,
+  118, 139, 139, 116, 101, 102, 59, 116, 135, 75,
+  117, 149, 83, 123, 112, 129, 115, 79, 134, 97,
+  76, 88, 97, 71, 83, 91, 53, 120, 166, 87,
+  104, 103, 102, 82, 74, 122, 76, 105, 98, 163,
+  130, 117, 136, 91, 117, 85, 85, 119, 105, 101,
+  43, 133, 94, 112, 128, 115, 73, 80, 127, 136,
+  131, 109, 103, 93, 110, 127, 113, 123, 108, 101,
+  81, 98, 113, 90, 117, 98, 106, 103, 167, 111,
+  134, 120, 110, 121, 101, 100, 123, 97, 212, 132,
+  73, 103, 100, 135, 102, 84, 122, 81, 97, 109,
+  107, 111, 110, 110, 131, 103, 108, 105, 112, 115,
+  116, 111, 129, 100, 119, 144, 107, 151, 115, 84,
+  117, 117, 134, 124, 193, 140, 64, 108, 114, 134,
+  121, 141, 126, 52, 106, 149, 92, 109, 115, 112,
+  70, 112, 104, 123, 138, 173, 137, 107, 113, 149,
+  81, 109, 107, 119, 72, 95, 107, 86, 114, 104,
+  120, 137, 132, 111, 116, 88, 114, 101, 114, 135,
+  68, 67, 109, 158, 108, 87, 84, 126, 42, 78,
+  125, 192, 111, 103, 120, 97, 107, 136, 79, 83,
+  93, 106, 119, 150, 115, 107, 102, 111, 81, 98,
+  106, 98, 103, 110, 90, 122, 123, 111, 109, 77,
+  126, 118, 90, 89, 115, 123, 98, 137, 75, 122,
+  200, 95, 99, 107, 105, 113, 79, 115, 93, 131,
+  104, 143, 147, 124, 149, 103, 118, 88, 95, 111,
+  115, 104, 63, 118, 112, 128, 114, 121, 96, 89,
+  137, 115, 131, 104, 101, 107, 102, 132, 114, 108,
+  122, 112, 89, 111, 96, 104, 109, 92, 112, 116,
+  187, 133, 120, 128, 132, 97, 125, 107, 117, 112,
+  209, 118, 97, 118, 108, 117, 142, 107, 129, 118,
+  124, 122, 114, 110, 110, 109, 126, 109, 112, 102,
+  106, 117, 106, 156, 137, 103, 111, 128, 107, 158,
+  119, 109, 97, 123, 109, 117, 172, 151, 80, 118,
+  121, 126, 105, 144, 121, 84, 112, 153, 104, 110,
+  119, 122, 83, 113, 87, 144, 126, 144, 145, 102,
+  95, 134, 92, 122, 108, 136, 85, 99, 113, 102,
+  93, 120, 123, 159, 135, 115, 114, 94, 129, 114,
+  118, 139, 76, 100, 132, 176, 111, 120, 90, 124,
+  67, 95, 125, 191, 110, 98, 138, 97, 107, 124,
+  90, 88, 92, 108, 107, 137, 179, 106, 81, 132,
+  89, 106, 155, 112, 133, 138, 123, 120, 142, 132,
+  145, 144, 109, 114, 124, 111, 78, 122, 140, 100,
+  112, 122, 173, 141, 129, 115, 92, 95, 143, 117,
+  84, 104, 101, 69, 112, 97, 128, 109, 119, 98,
+  94, 92, 106, 103, 119, 104, 111, 100, 116, 142,
+  114, 108, 140, 130, 120, 118, 153, 120, 138, 137,
+  145, 128, 128, 97, 133, 122, 114, 94, 131, 105,
+  108, 116, 132, 129, 142, 130, 104, 98, 68, 118,
+  114, 110, 114, 123, 92, 116, 133, 107, 119, 96,
+  105, 123, 120, 115, 137, 156, 163, 104, 126, 135,
+  92, 104, 159, 112, 134, 118, 133, 116, 92, 141,
+  97, 85, 104, 109, 92, 102, 156, 127, 127, 97,
+  111, 123, 86, 99, 113, 120, 107, 83, 123, 170,
+  103, 76, 120, 93, 72, 146, 86, 78, 95, 136,
+  102, 118, 143, 132, 106, 120, 121, 140, 117, 138,
+  72, 110, 128, 113, 103, 111, 89, 110, 149, 97,
+  118, 114, 117, 140, 92, 78, 130, 78, 107, 125,
+  86, 120, 143, 81, 105, 142, 132, 119, 160, 113,
+  107, 104, 147, 109, 75, 112, 121, 83, 188, 102,
+  160, 126, 89, 102, 160, 109, 139, 151, 114, 139,
+  143, 159, 121, 144, 99, 114, 113, 91, 93, 104,
+  169, 82, 105, 139, 125, 152, 130, 124, 93, 116,
+  110, 105, 77, 95, 85, 85, 128, 74, 126, 87,
+  116, 124, 81, 66, 121, 137, 98, 135, 111, 90,
+  108, 134, 101, 133, 173, 129, 105, 148, 139, 151,
+  90, 148, 141, 118, 118, 108, 122, 102, 105, 85,
+  144, 97, 117, 87, 65, 151, 113, 116, 80, 108,
+  83, 133, 118, 144, 117, 152, 103, 114, 128, 100,
+  108, 66, 109, 133, 129, 122, 138, 155, 193, 108,
+  140, 137, 110, 127, 157, 143, 109, 166, 144, 125,
+  100, 161, 81, 96, 103, 160, 94, 104, 152, 160,
+  117, 84, 102, 113, 77, 125, 117, 111, 152, 54,
+  135, 138, 111, 113, 124, 112, 56, 175, 106, 71,
+  112, 156, 114, 105, 126, 153, 118, 118, 122, 169,
+  113, 171, 120, 113, 124, 106, 114, 106, 145, 114,
+  131, 92, 152, 134, 92, 154, 74, 52, 128, 116,
+  90, 147, 107, 96, 141, 97, 118, 139, 131, 107,
+  177, 88, 102, 114, 168, 115, 78, 118, 123, 103,
+  175, 97, 122, 148, 77, 97, 140, 119, 115, 133,
+  90, 135, 150, 154, 118, 149, 103, 114, 121, 81,
+  115, 70, 146, 114, 76, 138, 76, 128, 125, 109,
+  121, 96, 95, 84, 109, 106, 66, 119, 148, 88,
+  92, 113, 109, 140, 62, 115, 127, 157, 124, 169,
+  118, 95, 118, 104, 93, 172, 138, 111, 94, 133,
+  120, 157, 89, 120, 130, 93, 122, 102, 137, 105,
+  94, 116, 117, 87, 121, 96, 69, 148, 56, 127,
+  100, 93, 117, 96, 147, 151, 79, 163, 102, 97,
+  86, 129, 92, 83, 122, 135, 135, 130, 136, 109,
+  172, 116, 133, 134, 137, 128, 128, 190, 90, 169,
+  110, 142, 90, 142, 90, 99, 95, 184, 87, 106,
+  129, 176, 109, 88, 63, 108, 84, 129, 116, 91,
+  160, 60, 129, 98, 118, 197, 113, 135, 65, 178,
+  117, 68, 128, 162, 138, 95, 115, 157, 108, 113,
+  77, 108, 103, 151, 100, 98, 109, 105, 93, 114,
+  132, 122, 106, 103, 126, 120, 129, 122, 72, 80,
+  118, 138, 82, 137, 130, 90, 128, 95, 114, 117,
+  100, 108, 146, 103, 105, 104, 141, 98, 83, 130,
+  114, 108, 168, 82, 110, 147, 86, 114, 109, 151,
+  100, 104, 86, 119, 123, 103, 103, 107, 106, 104,
+  129, 101, 111, 116, 133, 128, 51, 107, 65, 109,
+  135, 90, 148, 128, 120, 59, 116, 112, 65, 100,
+  143, 106, 81, 122, 116, 80, 81, 94, 100, 152,
+  105, 150, 116, 118, 93, 120, 96, 147, 122, 95,
+  87, 159, 118, 130, 96, 127, 103, 77, 101, 109,
+  113, 82, 71, 105, 96, 88, 112, 160, 77, 120,
+  63, 132, 94, 87, 125, 80, 104, 99, 77, 142,
+  78, 95, 122, 104, 92, 92, 137, 119, 153, 120,
+  111, 86, 131, 128, 107, 116, 142, 106, 97, 146,
+  97, 145, 118, 105, 102, 135, 90, 92, 98, 171,
+  78, 111, 111, 154, 114, 107, 58, 102, 78, 101,
+  82, 116, 104, 91, 117, 98, 126, 154, 124, 123,
+  88, 177, 91, 63, 123, 146, 128, 86, 100, 120,
+  91, 102, 57, 114, 102, 121, 61, 70, 82, 79,
+  49, 131, 109, 114, 104, 95, 134, 105, 153, 108,
+  84, 86, 119, 163, 100, 148, 98, 104, 104, 101,
+  151, 106, 89, 127, 102, 107, 102, 80, 118, 92,
+  87, 125, 103, 91, 198, 97, 135, 117, 135, 157,
+  109, 167, 101, 93, 93, 129, 129, 100, 100, 109,
+  99, 100, 129, 114, 109, 96, 131, 82, 61, 121,
+  79, 130, 154, 101, 157, 144, 121, 88, 134, 109,
+  93, 72, 116, 93, 104, 126, 139, 48, 118, 94,
+  94, 155, 101, 131, 122, 143, 64, 130, 102, 116,
+  125, 112, 111, 145, 111, 137, 113, 113, 140, 113,
+  107, 140, 100, 89, 87, 88, 111, 93, 129, 113,
+  97, 119, 91, 113, 94, 91, 109, 101, 84, 74,
+  80, 147, 74, 97, 116, 93, 96, 105, 95, 134,
+  143, 119, 134, 114, 147, 132, 114, 126, 133, 103,
+  111, 82, 90, 129, 118, 97, 110, 129, 105, 81,
+  93, 168, 101, 114, 116, 141, 112, 105, 78, 106,
+  89, 90, 114, 99, 116, 110, 94, 78, 142, 122,
+  132, 125, 98, 173, 95, 103, 120, 139, 104, 98,
+  116, 101, 116, 97, 102, 116, 120, 154, 65, 110,
+  110, 71, 72, 107, 77, 74, 106, 92, 99, 120,
+  137, 100, 95, 114, 118, 122, 100, 120, 106, 107,
+  97, 105, 126, 97, 92, 160, 93, 103, 96, 69,
+  124, 87, 112, 132, 98, 77, 206, 93, 88, 112,
+  129, 159, 114, 158, 131, 104, 88, 122, 128, 95,
+  116, 118, 95, 112, 125, 125, 91, 71, 114, 99,
+  72, 102, 75, 138, 148, 97, 138, 118, 136, 98,
+  119, 93, 93, 72, 97, 110, 94, 122, 138, 50,
+  151, 92, 96, 171, 108, 119, 110, 126, 44, 113,
+  109, 113, 112, 130, 102, 128, 116, 122, 120, 118,
+  155, 122, 125, 117, 101, 82, 111, 88, 117, 81,
+  130, 101, 99, 114, 93, 102, 84, 104, 52, 109,
+  91, 96, 75, 161, 83, 78, 97, 115, 91, 99,
+  74, 122, 111, 105, 133, 123, 177, 113, 137, 131,
+  139, 93, 130, 93, 97, 102, 119, 110, 103, 123,
+  88, 81, 81, 151, 87, 101, 123, 137, 114, 92,
+  97, 109, 75, 98, 91, 85, 104, 97, 107, 88,
+  118, 120, 130, 109, 119, 161, 104, 102, 124, 141,
+  111, 106, 124, 97, 130, 99, 122, 106, 117, 156,
+  46, 100, 105, 71, 65, 85, 69, 102, 111, 73,
+  102, 116, 130, 84, 102, 104, 108, 86, 84, 102,
+  95, 121, 111, 103, 107, 86, 101, 149, 100, 103,
+  109, 68, 120, 83, 111, 131, 89, 88, 179, 97,
+  98, 124, 114, 140, 122, 132, 138, 105, 87, 120,
+  137, 112, 109, 127, 94, 125, 128, 133, 82, 64,
+  107, 107, 86, 113, 88, 132, 137, 104, 119, 97,
+  133, 108, 119, 72, 87, 74, 87, 99, 106, 115,
+  126, 47, 159, 94, 95, 175, 126, 101, 95, 113,
+  50, 96, 104, 123, 110, 104, 99, 130, 122, 122,
+  110, 122, 155, 119, 132, 123, 105, 81, 116, 89,
+  118, 82, 132, 110, 96, 114, 114, 92, 84, 103,
+  46, 98, 106, 110, 81, 167, 98, 79, 122, 111,
+  97, 87, 73, 98, 106, 96, 123, 127, 186, 101,
+  146, 149, 125, 104, 140, 96, 103, 104, 110, 122,
+  121, 119, 86, 79, 76, 139, 95, 90, 103, 140,
+  116, 80, 110, 123, 69, 91, 79, 77, 99, 82,
+  108, 79, 99, 106, 148, 103, 124, 139, 126, 100,
+  121, 152, 119, 105, 113, 116, 129, 107, 128, 144,
+  103, 148, 66, 110, 111, 78, 71, 83, 88, 113,
+  103, 72, 117, 105, 119, 91, 112, 86, 108, 93,
+  79, 88, 110, 125, 120, 97, 95, 92, 113, 121,
+  124, 96, 107, 74, 114, 92, 109, 140, 95, 87,
+  156, 87, 89, 124, 129, 128, 133, 124, 131, 107,
+  90, 117, 129, 128, 107, 116, 89, 126, 111, 123,
+  72, 55, 99, 117, 88, 128, 96, 129, 119, 105,
+  114, 101, 110, 132, 113, 63, 84, 80, 90, 91,
+  113, 106, 112, 53, 140, 97, 84, 155, 142, 99,
+  80, 100, 65, 88, 85, 122, 101, 79, 124, 143,
+  131, 131, 119, 116, 156, 138, 124, 127, 102, 83,
+  106, 81, 120, 95, 140, 118, 94, 124, 139, 102,
+  82, 106, 37, 95, 106, 111, 79, 160, 113, 89,
+  118, 96, 113, 79, 76, 102, 103, 102, 109, 153,
+  184, 81, 141, 161, 99, 125, 135, 94, 116, 110,
+  112, 132, 109, 114, 78, 76, 94, 141, 116, 76,
+  94, 120, 122, 75, 112, 127, 68, 86, 87, 79,
+  89, 75, 102, 86, 88, 109, 150, 99, 109, 108,
+  127, 105, 117, 156, 111, 108, 89, 121, 115, 103,
+  137, 143, 96, 147, 67, 129, 119, 78, 79, 86,
+  101, 85, 98, 74, 113, 109, 100, 88, 118, 75,
+  100, 95, 78, 76, 105, 108, 128, 85, 103, 97,
+  121, 113, 137, 90, 102, 81, 121, 95, 104, 157,
+  101, 95, 140, 80, 108, 120, 132, 125, 138, 125,
+  118, 118, 105, 110, 122, 133, 109, 108, 94, 122,
+  108, 103, 59, 57, 104, 104, 89, 141, 109, 122,
+  93, 107, 109, 109, 95, 141, 102, 64, 93, 84,
+  103, 84, 118, 104, 112, 68, 120, 89, 75, 136,
+  155, 103, 63, 92, 81, 95, 76, 124, 102, 84,
+  147, 154, 123, 136, 101, 111, 152, 141, 108, 121,
+  102, 88, 90, 67, 120, 105, 143, 102, 88, 124,
+  145, 120, 81, 111, 38, 105, 108, 96, 78, 138,
+  111, 103, 112, 93, 112, 70, 76, 114, 99, 108,
+  107, 165, 167, 96, 126, 154, 76, 135, 124, 83,
+  135, 120, 119, 136, 111, 112, 77, 69, 116, 149,
+  139, 62, 94, 94, 137, 60, 116, 112, 87, 80,
+  95, 77, 87, 79, 115, 87, 90, 110, 146, 98,
+  89, 90, 116, 99, 106, 160, 101, 102, 72, 110,
+  106, 103, 135, 136, 92, 149, 83, 154, 123, 71,
+  86, 84, 114, 63, 104, 87, 118, 106, 87, 101,
+  116, 82, 103, 94, 86, 80, 89, 99, 134, 86,
+  101, 102, 131, 114, 140, 87, 91, 92, 123, 91,
+  106, 153, 117, 104, 131, 79, 106, 111, 123, 118,
+  131, 126, 111, 120, 111, 109, 115, 122, 109, 108,
+  110, 109, 101, 93, 53, 59, 110, 95, 88, 135,
+  107, 121, 84, 103, 101, 111, 82, 134, 91, 70,
+  96, 93, 106, 80, 116, 102, 124, 91, 117, 87,
+  72, 125, 151, 103, 60, 92, 74, 97, 70, 125,
+  106, 98, 153, 149, 112, 143, 88, 109, 140, 135,
+  110, 114, 102, 89, 86, 53, 123, 108, 135, 90,
+  92, 130, 139, 136, 77, 110, 39, 109, 109, 89,
+  68, 115, 100, 127, 103, 91, 103, 76, 78, 118,
+  107, 102, 100, 156, 158, 103, 125, 142, 68, 113,
+  120, 90, 130, 133, 119, 121, 99, 109, 72, 69,
+  132, 149, 150, 57, 107, 80, 139, 66, 117, 112,
+  92, 91, 86, 91, 95, 79, 123, 93, 101, 122,
+  137, 100, 75, 85, 115, 95, 104, 177, 94, 102,
+  57, 101, 108, 110, 135, 122, 85, 139, 88, 157,
+  125, 68, 90, 86, 115, 64, 112, 96, 109, 102,
+  80, 97, 108, 91, 113, 92, 102, 81, 82, 90,
+  117, 99, 101, 102, 148, 122, 133, 96, 84, 109,
+  127, 88, 107, 133, 138, 105, 129, 91, 118, 116,
+  115, 111, 121, 110, 106, 116, 120, 113, 107, 110,
+  124, 107, 130, 98, 103, 86, 52, 48, 115, 94,
+  77, 126, 101, 118, 88, 93, 95, 115, 74, 132,
+  80, 84, 95, 104, 99, 82, 115, 99, 139, 112,
+  123, 97, 80, 123, 146, 109, 64, 92, 74, 92,
+  73, 119, 110, 105, 146, 125, 109, 135, 85, 102,
+  132, 125, 120, 105, 94, 110, 98, 58, 137, 111,
+  125, 88, 93, 128, 139, 142, 76, 104, 28, 107,
+  116, 106, 55, 103, 88, 138, 104, 98, 111, 76,
+  84, 108, 121, 100, 97, 137, 166, 101, 127, 136,
+  83, 108, 132, 111, 135, 135, 116, 106, 88, 110,
+  61, 83, 133, 158, 152, 77, 116, 76, 143, 79,
+  113, 119, 96, 93, 84, 88, 121, 80, 119, 104,
+  113, 131, 125, 103, 73, 90, 125, 96, 106, 187,
+  90, 99, 54, 95, 119, 113, 125, 117, 84, 138,
+  79, 150, 123, 63, 82, 93, 121, 87, 117, 111,
+  113, 106, 94, 99, 96, 110, 121, 106, 117, 86,
+  87, 93, 109, 112, 103, 106, 145, 123, 122, 100,
+  93, 132, 121, 89, 110, 119, 148, 123, 123, 101,
+  126, 107, 107, 113, 95, 107, 94, 120, 130, 109,
+  112, 106, 115, 104, 148, 97, 106, 76, 58, 60,
+  113, 92, 65, 121, 93, 119, 85, 87, 87, 119,
+  86, 120, 72, 94, 91, 104, 101, 83, 116, 80,
+  142, 108, 132, 88, 74, 117, 133, 112, 66, 94,
+  70, 103, 80, 109, 106, 102, 133, 131, 105, 129,
+  87, 101, 117, 119, 119, 108, 89, 129, 91, 56,
+  128, 114, 124, 98, 96, 129, 151, 154, 87, 92,
+  42, 105, 113, 100, 47, 103, 84, 153, 108, 115,
+  129, 76, 82, 104, 122, 99, 102, 109, 153, 106,
+  104, 141, 103, 100, 131, 121, 136, 124, 123, 98,
+  84, 114, 60, 88, 132, 173, 147, 93, 122, 74,
+  154, 107, 100, 121, 97, 79, 87, 84, 111, 84,
+  106, 105, 138, 135, 120, 107, 80, 85, 119, 88,
+  102, 181, 84, 90, 44, 95, 124, 108, 102, 107,
+  89, 127, 76, 143, 111, 54, 75, 104, 126, 77,
+  109, 97, 108, 105, 104, 95, 84, 119, 124, 114,
+  128, 79, 88, 89, 110, 118, 122, 112, 134, 125,
+  113, 91, 98, 149, 131, 71, 113, 108, 141, 126,
+  128, 113, 136, 104, 99, 106, 82, 139, 80, 116,
+  139, 103, 112, 103, 119, 96, 148, 101, 99, 85,
+  55, 84, 107, 97, 58, 110, 99, 124, 92, 71,
+  82, 125, 110, 114, 69, 86, 89, 92, 115, 92,
+  112, 73, 138, 106, 134, 82, 69, 124, 112, 105,
+  67, 107, 68, 104, 80, 101, 108, 95, 127, 143,
+  102, 119, 76, 98, 108, 118, 117, 114, 100, 138,
+  95, 52, 133, 119, 131, 98, 90, 127, 148, 145,
+  91, 85, 43, 111, 87, 94, 47, 106, 94, 158,
+  115, 112, 156, 79, 82, 110, 115, 92, 110, 104,
+  145, 108, 108, 141, 95, 88, 126, 92, 139, 121,
+  127, 85, 96, 114, 59, 94, 124, 165, 150, 97,
+  129, 74, 158, 117, 90, 111, 97, 88, 90, 90,
+  114, 78, 105, 100, 147, 126, 120, 105, 86, 81,
+  116, 87, 104, 166, 82, 75, 37, 100, 114, 104,
+  123, 101, 93, 124, 84, 147, 105, 55, 74, 94,
+  120, 77, 92, 103, 110, 106, 108, 101, 72, 120,
+  133, 103, 121, 85, 78, 94, 114, 118, 135, 96,
+  126, 131, 108, 82, 95, 151, 135, 67, 120, 109,
+  118, 114, 140, 119, 128, 116, 101, 108, 106, 143,
+  82, 106, 149, 105, 111, 108, 137, 104, 138, 98,
+  87, 97, 48, 85, 111, 118, 61, 107, 110, 134,
+  113, 68, 87, 118, 124, 114, 69, 73, 91, 81,
+  110, 93, 106, 81, 139, 115, 131, 111, 70, 135,
+  103, 109, 76, 101, 67, 86, 83, 92, 107, 84,
+  125, 139, 101, 114, 65, 90, 112, 125, 116, 114,
+  109, 118, 89, 44, 141, 126, 132, 89, 85, 122,
+  128, 131, 90, 93, 33, 112, 80, 104, 59, 113,
+  107, 157, 119, 97, 155, 90, 88, 113, 125, 92,
+  101, 125, 150, 119, 131, 138, 81, 89, 124, 78,
+  135, 113, 129, 73, 101, 105, 67, 93, 120, 143,
+  162, 96, 141, 83, 157, 94, 88, 108, 100, 79,
+  103, 76, 124, 72, 88, 85, 142, 136, 107, 92,
+  84, 85, 111, 80, 108, 163, 86, 73, 50, 103,
+  96, 103, 144, 97, 93, 137, 83, 158, 114, 66,
+  72, 84, 96, 87, 92, 119, 102, 118, 133, 109,
+  70, 105, 138, 95, 107, 71, 68, 92, 109, 109,
+  142, 85, 124, 142, 103, 78, 91, 134, 126, 86,
+  124, 107, 97, 112, 157, 108, 117, 110, 109, 128,
+  124, 127, 94, 104, 145, 112, 100, 123, 130, 128,
+  119, 80, 88, 105, 59, 82, 119, 101, 75, 122,
+  113, 147, 133, 82, 106, 103, 121, 124, 78, 67,
+  98, 84, 97, 100, 111, 96, 132, 108, 129, 111,
+  66, 136, 107, 107, 80, 99, 61, 75, 75, 92,
+  114, 94, 129, 136, 93, 111, 68, 89, 152, 149,
+  115, 116, 103, 81, 64, 46, 120, 128, 135, 81,
+  96, 123, 120, 127, 78, 112, 31, 128, 87, 110,
+  78, 128, 103, 149, 108, 96, 111, 88, 84, 121,
+  134, 100, 102, 146, 154, 126, 149, 128, 75, 91,
+  116, 79, 111, 119, 130, 73, 93, 107, 72, 80,
+  114, 140, 175, 88, 141, 105, 150, 83, 84, 107,
+  105, 72, 124, 66, 118, 75, 80, 71, 124, 134,
+  84, 93, 84, 98, 107, 69, 108, 171, 90, 82,
+  82, 98, 89, 91, 131, 98, 96, 150, 62, 168,
+  135, 60, 79, 90, 84, 63, 109, 113, 94, 130,
+  127, 89, 84, 84, 133, 92, 98, 72, 68, 86,
+  100, 97, 138, 92, 124, 161, 102, 75, 93, 110,
+  110, 92, 125, 108, 73, 105, 185, 93, 99, 106,
+  113, 153, 129, 99, 116, 111, 124, 115, 95, 129,
+  122, 153, 103, 65, 100, 113, 78, 74, 117, 68,
+  77, 124, 110, 147, 160, 95, 129, 87, 86, 123,
+  95, 65, 93, 101, 74, 99, 110, 116, 128, 80,
+  125, 87, 59, 139, 108, 97, 96, 105, 47, 82,
+  69, 103, 114, 124, 141, 130, 108, 115, 89, 95,
+  196, 161, 127, 115, 99, 62, 73, 56, 106, 127,
+  135, 61, 92, 120, 103, 119, 64, 114, 42, 144,
+  101, 134, 88, 150, 90, 121, 80, 91, 62, 88,
+  76, 133, 120, 113, 126, 157, 169, 126, 179, 116,
+  74, 90, 122, 99, 88, 116, 131, 93, 80, 124,
+  74, 69, 116, 138, 164, 71, 136, 130, 135, 86,
+  79, 106, 87, 93, 127, 79, 117, 85, 101, 94,
+  91, 108, 80, 100, 91, 126, 118, 82, 123, 178,
+  90, 99, 110, 91, 97, 93, 126, 101, 104, 139,
+  36, 154, 146, 55, 82, 98, 107, 60, 122, 101,
+  108, 126, 100, 82, 105, 83, 118, 105, 92, 86,
+  88, 95, 92, 87, 127, 99, 127, 169, 110, 79,
+  100, 79, 114, 86, 114, 122, 70, 103, 197, 89,
+  112, 124, 101, 153, 122, 72, 120, 111, 104, 122,
+  115, 110, 109, 156, 114, 81, 118, 120, 103, 67,
+  117, 80, 68, 107, 95, 133, 169, 89, 145, 77,
+  59, 104, 129, 82, 84, 106, 59, 91, 103, 121,
+  134, 69, 116, 88, 65, 163, 109, 105, 119, 106,
+  40, 82, 86, 123, 126, 148, 129, 114, 123, 118,
+  98, 108, 177, 131, 141, 120, 106, 74, 108, 82,
+  119, 115, 135, 66, 82, 118, 85, 123, 69, 97,
+  79, 146, 140, 149, 92, 158, 80, 76, 69, 95,
+  69, 97, 72, 123, 124, 107, 157, 144, 181, 126,
+  178, 100, 93, 96, 122, 158, 78, 106, 122, 125,
+  78, 145, 73, 73, 106, 138, 134, 75, 124, 144,
+  114, 95, 71, 140, 68, 124, 98, 114, 141, 97,
+  124, 107, 90, 105, 97, 105, 105, 172, 126, 98,
+  130, 166, 102, 98, 123, 98, 116, 104, 108, 113,
+  99, 120, 53, 110, 133, 59, 74, 105, 146, 99,
+  119, 94, 137, 113, 108, 100, 101, 104, 115, 128,
+  96, 110, 96, 111, 89, 98, 107, 99, 116, 152,
+  116, 87, 112, 50, 126, 88, 107, 145, 75, 118,
+  192, 100, 149, 144, 62, 134, 117, 140, 112, 107,
+  104, 122, 131, 73, 108, 149, 130, 126, 139, 118,
+  112, 105, 122, 119, 58, 87, 73, 121, 153, 87,
+  127, 93, 121, 78, 132, 98, 85, 91, 87, 95,
+  87, 116, 139, 72, 105, 95, 81, 188, 105, 127,
+  120, 116, 59, 98, 111, 141, 129, 168, 89, 139,
+  127, 110, 94, 127, 123, 84, 133, 119, 129, 86,
+  97, 100, 137, 100, 122, 107, 69, 122, 77, 131,
+  98, 84, 99, 139, 144, 118, 88, 146, 72, 65,
+  97, 108, 103, 95, 77, 124, 133, 108, 151, 103,
+  183, 127, 142, 96, 128, 78, 117, 169, 93, 114,
+  128, 126, 88, 162, 74, 80, 95, 150, 101, 95,
+  115, 150, 114, 101, 68, 163, 78, 136, 67, 142,
+  133, 87, 136, 112, 126, 136, 110, 119, 117, 217,
+  112, 83, 117, 136, 122, 83, 127, 122, 113, 111,
+  95, 117, 89, 124, 56, 69, 106, 67, 57, 116,
+  140, 157, 128, 88, 128, 101, 129, 104, 91, 108,
+  135, 117, 99, 135, 94, 117, 103, 115, 127, 85,
+  105, 127, 126, 104, 113, 56, 125, 106, 95, 135,
+  78, 116, 199, 107, 120, 160, 50, 126, 135, 184,
+  97, 105, 98, 130, 123, 89, 105, 134, 123, 144,
+  147, 109, 101, 118, 134, 124, 68, 91, 78, 125,
+  131, 81, 98, 124, 167, 91, 125, 99, 78, 77,
+  107, 119, 93, 108, 121, 90, 99, 107, 94, 194,
+  102, 132, 103, 134, 80, 96, 111, 136, 142, 129,
+  70, 109, 116, 111, 93, 119, 118, 79, 146, 114,
+  141, 99, 104, 99, 140, 97, 113, 119, 65, 132,
+  96, 116, 110, 83, 91, 122, 117, 106, 85, 157,
+  86, 93, 127, 111, 128, 86, 91, 132, 135, 121,
+  123, 101, 191, 106, 141, 121, 139, 66, 117, 122,
+  105, 123, 119, 112, 95, 147, 71, 93, 79, 138,
+  98, 98, 115, 168, 122, 94, 62, 149, 89, 119,
+  71, 142, 139, 56, 117, 99, 116, 141, 120, 125,
+  108, 233, 100, 92, 104, 126, 132, 101, 120, 142,
+  115, 118, 106, 154, 88, 146, 53, 64, 122, 68,
+  55, 102, 84, 175, 118, 91, 105, 108, 126, 118,
+  88, 90, 142, 102, 77, 166, 115, 116, 120, 114,
+  121, 77, 96, 126, 145, 110, 113, 90, 102, 106,
+  97, 123, 80, 85, 216, 108, 102, 133, 78, 133,
+  138, 141, 113, 109, 101, 124, 104, 124, 113, 118,
+  108, 110, 127, 104, 84, 105, 125, 120, 81, 85,
+  94, 144, 127, 91, 96, 113, 121, 111, 97, 54,
+  79, 75, 89, 99, 110, 101, 106, 72, 111, 102,
+  70, 157, 93, 110, 83, 130, 58, 71, 82, 106,
+  133, 66, 93, 105, 119, 114, 107, 111, 149, 123,
+  128, 112, 120, 89, 109, 59, 136, 97, 112, 118,
+  76, 133, 120, 102, 87, 102, 73, 119, 92, 105,
+  92, 166, 99, 119, 119, 76, 129, 74, 105, 125,
+  135, 128, 110, 147, 194, 92, 166, 122, 116, 95,
+  124, 96, 112, 121, 116, 94, 100, 140, 73, 92,
+  96, 125, 102, 85, 123, 151, 119, 89, 74, 127,
+  73, 101, 90, 97, 114, 55, 97, 96, 98, 121,
+  122, 107, 93, 204, 102, 95, 109, 136, 114, 118,
+  111, 137, 115, 115, 115, 155, 91, 150, 52, 95,
+  141, 64, 62, 90, 80, 103, 105, 72, 102, 139,
+  107, 106, 90, 65, 106, 110, 76, 112, 120, 81,
+  107, 100, 119, 88, 114, 155, 142, 88, 112, 88,
+  113, 104, 100, 120, 68, 86, 231, 95, 136, 102,
+  105, 152, 134, 98, 118, 122, 107, 126, 122, 152,
+  129, 137, 95, 90, 121, 105, 83, 53, 132, 78,
+  77, 111, 110, 143, 128, 106, 120, 101, 82, 139,
+  104, 54, 97, 92, 78, 78, 118, 101, 102, 77,
+  103, 102, 75, 130, 107, 114, 93, 102, 60, 80,
+  82, 117, 129, 74, 136, 106, 105, 127, 114, 108,
+  169, 160, 128, 117, 115, 88, 109, 56, 137, 105,
+  129, 82, 86, 120, 113, 110, 71, 115, 58, 119,
+  139, 114, 92, 176, 106, 103, 89, 92, 94, 83,
+  83, 119, 115, 123, 164, 185, 191, 116, 175, 118,
+  87, 111, 131, 111, 116, 121, 119, 120, 106, 143,
+  88, 88, 115, 129, 100, 85, 124, 126, 104, 85,
+  77, 126, 75, 102, 127, 51, 142, 69, 111, 94,
+  95, 122, 100, 96, 87, 172, 131, 96, 114, 147,
+  100, 99, 107, 120, 119, 114, 108, 105, 101, 160,
+  61, 123, 139, 68, 77, 75, 93, 44, 117, 87,
+  118, 136, 111, 103, 97, 86, 77, 105, 90, 72,
+  106, 83, 104, 93, 102, 108, 113, 165, 144, 81,
+  102, 73, 121, 117, 116, 142, 74, 110, 191, 80,
+  82, 117, 73, 128, 119, 84, 112, 110, 86, 130,
+  113, 140, 105, 132, 86, 106, 94, 103, 83, 68,
+  111, 116, 59, 104, 124, 127, 108, 85, 136, 109,
+  90, 128, 134, 81, 85, 100, 89, 76, 82, 117,
+  102, 111, 87, 73, 83, 123, 122, 118, 105, 80,
+  45, 87, 95, 148, 116, 171, 143, 99, 115, 137,
+  136, 143, 132, 156, 158, 99, 124, 83, 132, 89,
+  131, 93, 118, 93, 89, 136, 75, 124, 63, 101,
+  84, 108, 150, 146, 95, 166, 100, 80, 95, 106,
+  102, 87, 74, 102, 100, 112, 192, 150, 167, 97,
+  148, 94, 94, 99, 114, 144, 96, 116, 112, 163,
+  78, 148, 83, 111, 113, 130, 87, 89, 116, 103,
+  97, 116, 56, 156, 52, 138, 98, 145, 108, 77,
+  121, 108, 86, 96, 91, 115, 96, 127, 134, 66,
+  123, 141, 113, 73, 98, 129, 94, 109, 84, 93,
+  82, 108, 44, 76, 105, 74, 79, 83, 119, 68,
+  116, 73, 131, 91, 110, 91, 89, 95, 81, 104,
+  85, 105, 83, 96, 100, 97, 99, 114, 111, 130,
+  124, 102, 105, 64, 131, 113, 98, 139, 82, 151,
+  140, 87, 115, 165, 45, 118, 125, 119, 102, 81,
+  88, 158, 90, 162, 100, 132, 90, 130, 97, 82,
+  97, 137, 121, 93, 48, 127, 126, 116, 93, 85,
+  107, 122, 104, 102, 109, 109, 92, 120, 120, 90,
+  72, 139, 108, 135, 52, 71, 100, 153, 146, 138,
+  99, 114, 69, 103, 98, 163, 146, 205, 102, 112,
+  112, 139, 103, 158, 95, 102, 135, 98, 123, 105,
+  107, 120, 125, 77, 114, 105, 74, 169, 53, 119,
+  86, 86, 151, 125, 152, 146, 108, 154, 101, 93,
+  135, 111, 125, 98, 107, 94, 120, 121, 139, 84,
+  134, 132, 107, 97, 135, 108, 103, 142, 102, 124,
+  108, 140, 79, 140, 113, 145, 110, 135, 99, 101,
+  98, 124, 108, 104, 30, 179, 122, 142, 95, 161,
+  135, 92, 150, 81, 126, 98, 114, 146, 106, 124,
+  142, 61, 100, 162, 161, 58, 108, 152, 109, 124,
+  66, 125, 69, 89, 125, 55, 105, 90, 95, 105,
+  146, 126, 109, 96, 121, 101, 124, 127, 69, 89,
+  105, 133, 73, 143, 108, 115, 106, 122, 122, 90,
+  103, 107, 120, 124, 102, 78, 122, 117, 87, 118,
+  68, 152, 132, 84, 194, 173, 53, 126, 146, 148,
+  120, 73, 100, 161, 115, 200, 97, 148, 84, 137,
+  131, 72, 80, 94, 146, 130, 56, 158, 112, 102,
+  126, 78, 75, 145, 121, 101, 96, 115, 116, 127,
+  165, 118, 85, 128, 111, 137, 53, 108, 90, 189,
+  137, 154, 72, 112, 88, 95, 94, 146, 138, 126,
+  105, 121, 147, 120, 63, 106, 92, 89, 155, 110,
+  144, 154, 89, 136, 132, 72, 117, 106, 95, 104,
+  67, 113, 118, 77, 165, 125, 169, 114, 105, 148,
+  99, 83, 84, 126, 116, 92, 138, 122, 136, 97,
+  119, 65, 129, 144, 92, 122, 150, 94, 115, 155,
+  127, 103, 113, 158, 108, 133, 126, 140, 119, 121,
+  127, 105, 96, 137, 119, 51, 44, 179, 135, 92,
+  135, 82, 169, 82, 116, 54, 135, 189, 124, 125,
+  119, 137, 141, 47, 113, 186, 152, 89, 136, 150,
+  130, 107, 61, 87, 71, 111, 170, 68, 126, 110,
+  103, 97, 80, 126, 119, 109, 96, 95, 121, 241,
+  57, 89, 116, 119, 79, 98, 136, 123, 136, 119,
+  103, 69, 99, 118, 112, 122, 73, 100, 121, 118,
+  99, 101, 87, 79, 149, 80, 73, 126, 50, 110,
+  165, 164, 126, 138, 75, 119, 100, 162, 112, 110,
+  125, 130, 79, 87, 60, 105, 124, 161, 51, 117,
+  99, 114, 123, 75, 77, 115, 128, 107, 76, 117,
+  84, 115, 139, 114, 84, 108, 102, 151, 58, 90,
+  82, 148, 120, 137, 39, 81, 74, 92, 76, 105,
+  126, 76, 125, 102, 137, 97, 96, 99, 98, 138,
+  134, 94, 126, 151, 126, 91, 127, 78, 122, 148,
+  109, 99, 85, 122, 97, 102, 90, 87, 108, 91,
+  88, 151, 68, 112, 102, 131, 114, 61, 128, 141,
+  163, 104, 125, 76, 153, 77, 93, 125, 128, 94,
+  127, 114, 114, 107, 112, 128, 61, 123, 90, 115,
+  114, 105, 119, 103, 111, 88, 141, 83, 32, 140,
+  88, 79, 118, 124, 130, 56, 101, 114, 122, 152,
+  116, 107, 120, 104, 113, 28, 113, 168, 116, 115,
+  121, 145, 83, 92, 74, 81, 85, 123, 50, 77,
+  135, 83, 71, 114, 46, 76, 109, 82, 84, 62,
+  97, 132, 60, 79, 134, 102, 108, 93, 89, 114,
+  139, 107, 121, 108, 84, 130, 88, 106, 73, 111,
+  121, 82, 97, 77, 124, 68, 162, 78, 121, 105,
+  64, 116, 152, 113, 119, 151, 93, 105, 105, 124,
+  107, 96, 116, 157, 79, 99, 59, 75, 118, 99,
+  46, 132, 131, 100, 108, 83, 74, 103, 83, 117,
+  82, 111, 72, 121, 119, 113, 85, 97, 117, 142,
+  75, 83, 108, 131, 129, 146, 33, 105, 91, 114,
+  65, 96, 133, 122, 118, 109, 120, 108, 101, 114,
+  90, 118, 98, 143, 118, 124, 123, 76, 119, 104,
+  136, 118, 85, 102, 87, 90, 105, 106, 97, 96,
+  69, 99, 100, 142, 56, 127, 114, 128, 100, 63,
+  75, 109, 145, 112, 132, 108, 122, 105, 100, 145,
+  100, 119, 110, 74, 147, 125, 103, 117, 104, 106,
+  85, 141, 117, 85, 124, 108, 111, 95, 159, 90,
+  44, 102, 98, 93, 115, 98, 130, 53, 148, 166,
+  106, 102, 128, 118, 112, 98, 119, 43, 99, 165,
+  127, 112, 81, 148, 62, 116, 106, 114, 70, 138,
+  95, 94, 117, 74, 86, 118, 102, 64, 100, 93,
+  125, 80, 82, 145, 61, 77, 111, 133, 118, 107,
+  67, 120, 138, 106, 128, 176, 89, 112, 105, 85,
+  95, 137, 90, 85, 103, 78, 113, 117, 147, 86,
+  111, 141, 68, 106, 111, 105, 114, 119, 104, 115,
+  143, 101, 104, 106, 107, 185, 93, 112, 104, 42,
+  113, 91, 42, 140, 165, 84, 79, 82, 125, 100,
+  73, 104, 130, 126, 79, 123, 139, 127, 97, 96,
+  123, 107, 80, 108, 151, 142, 143, 161, 68, 104,
+  111, 146, 77, 139, 142, 134, 113, 117, 118, 143,
+  86, 120, 89, 100, 125, 139, 95, 100, 113, 99,
+  118, 113, 135, 116, 86, 107, 66, 84, 116, 104,
+  118, 111, 105, 96, 123, 119, 87, 103, 102, 109,
+  92, 85, 90, 94, 151, 120, 153, 124, 118, 113,
+  116, 149, 98, 127, 90, 85, 134, 126, 120, 159,
+  104, 98, 102, 163, 110, 117, 84, 119, 85, 101,
+  110, 111, 55, 81, 88, 123, 105, 86, 122, 81,
+  163, 158, 94, 109, 145, 147, 110, 102, 115, 90,
+  98, 145, 138, 108, 64, 127, 80, 119, 122, 120,
+  54, 123, 95, 110, 79, 91, 113, 124, 126, 101,
+  109, 102, 139, 68, 80, 122, 62, 99, 90, 163,
+  119, 112, 50, 123, 133, 122, 110, 173, 94, 96,
+  117, 88, 85, 116, 89, 106, 97, 90, 120, 118,
+  127, 93, 100, 154, 93, 115, 104, 117, 121, 98,
+  107, 119, 164, 112, 105, 90, 118, 166, 107, 116,
+  127, 90, 123, 112, 74, 149, 182, 91, 94, 98,
+  160, 108, 73, 105, 155, 149, 87, 124, 146, 107,
+  129, 115, 134, 101, 83, 105, 142, 121, 130, 168,
+  114, 95, 116, 147, 105, 169, 137, 119, 131, 122,
+  114, 155, 99, 117, 118, 126, 152, 112, 107, 92,
+  89, 135, 98, 115, 132, 135, 171, 115, 96, 113,
+  140, 88, 131, 107, 143, 117, 138, 123, 108, 114,
+  112, 109, 111, 126, 117, 97, 188, 126, 121, 132,
+  139, 107, 140, 141, 124, 113, 103, 134, 112, 162,
+  131, 162, 106, 102, 115, 139, 118, 141, 74, 129,
+  71, 117, 102, 126, 81, 111, 88, 124, 115, 124,
+  126, 115, 134, 116, 111, 119, 169, 146, 117, 105,
+  110, 106, 100, 129, 140, 106, 76, 113, 93, 145,
+  120, 123, 91, 115, 96, 141, 76, 108, 119, 119,
+  135, 100, 123, 124, 127, 70, 96, 114, 87, 137,
+  93, 149, 120, 131, 80, 101, 118, 117, 113, 148,
+  99, 100, 135, 106, 90, 103, 100, 112, 97, 107,
+  147, 119, 153, 107, 84, 134, 90, 93, 145, 106,
+  102, 158, 113, 129, 145, 137, 140, 128, 89, 128,
+  117, 118, 70, 129, 130, 82, 103, 127, 167, 146,
+  152, 100, 100, 81, 135, 96, 67, 110, 86, 91,
+  111, 92, 124, 133, 128, 99, 79, 110, 119, 102,
+  101, 126, 118, 93, 111, 138, 110, 114, 138, 121,
+  102, 135, 127, 119, 114, 128, 117, 104, 103, 101,
+  122, 118, 121, 86, 136, 98, 111, 108, 120, 155,
+  153, 157, 107, 98, 89, 105, 118, 111, 115, 119,
+  93, 113, 138, 107, 107, 97, 106, 115, 112, 123,
+  108, 126, 155, 108, 128, 139, 107, 104, 140, 154,
+  115, 123, 135, 110, 90, 135, 97, 116, 99, 138,
+  93, 110, 152, 148, 143, 107, 99, 110, 107, 133,
+  106, 120, 109, 78, 109, 138, 109, 95, 117, 115,
+  66, 145, 102, 82, 97, 148, 131, 114, 125, 141,
+  103, 116, 87, 155, 123, 141, 93, 105, 132, 114,
+  111, 103, 95, 121, 147, 111, 127, 106, 109, 146,
+  88, 74, 129, 81, 101, 124, 112, 125, 132, 65,
+  143, 138, 124, 104, 174, 127, 100, 114, 144, 103,
+  70, 124, 140, 104, 168, 105, 141, 122, 87, 76,
+  142, 109, 99, 107, 98, 142, 122, 142, 128, 130,
+  89, 125, 101, 100, 105, 121, 107, 92, 83, 131,
+  92, 144, 154, 107, 102, 120, 115, 84, 67, 108,
+  68, 108, 137, 91, 119, 100, 118, 108, 70, 76,
+  115, 131, 76, 139, 115, 129, 111, 126, 99, 127,
+  146, 104, 79, 157, 103, 132, 72, 111, 113, 93,
+  94, 102, 106, 100, 92, 87, 145, 88, 126, 98,
+  68, 190, 117, 140, 89, 104, 90, 123, 101, 143,
+  116, 134, 97, 108, 130, 95, 111, 60, 116, 153,
+  122, 136, 102, 117, 182, 89, 140, 142, 143, 127,
+  129, 142, 87, 210, 146, 96, 90, 148, 80, 119,
+  94, 187, 100, 117, 147, 160, 127, 120, 91, 106,
+  106, 131, 96, 125, 139, 60, 103, 96, 115, 123,
+  102, 137, 52, 165, 100, 97, 115, 147, 130, 93,
+  109, 150, 102, 108, 99, 173, 122, 162, 105, 92,
+  130, 98, 101, 109, 136, 110, 142, 96, 134, 163,
+  100, 122, 66, 52, 128, 126, 87, 141, 115, 115,
+  114, 73, 151, 120, 121, 93, 176, 106, 95, 120,
+  156, 98, 73, 135, 114, 115, 166, 94, 122, 125,
+  96, 90, 135, 112, 90, 101, 91, 128, 110, 148,
+  122, 130, 103, 112, 112, 79, 105, 75, 106, 110,
+  59, 133, 35, 118, 148, 98, 110, 106, 95, 79,
+  93, 106, 59, 129, 129, 99, 95, 111, 99, 137,
+  68, 105, 95, 157, 109, 145, 116, 134, 106, 92,
+  89, 135, 115, 92, 77, 112, 97, 116, 99, 91,
+  104, 91, 99, 106, 126, 115, 90, 89, 121, 86,
+  127, 92, 82, 151, 58, 131, 100, 95, 120, 88,
+  123, 147, 82, 148, 98, 102, 83, 124, 105, 70,
+  110, 155, 117, 123, 107, 88, 161, 126, 128, 134,
+  154, 113, 111, 176, 90, 145, 109, 115, 81, 115,
+  82, 104, 91, 162, 103, 95, 131, 160, 120, 88,
+  56, 98, 98, 110, 114, 79, 167, 73, 102, 86,
+  124, 171, 92, 127, 66, 156, 98, 103, 118, 146,
+  123, 88, 114, 139, 96, 99, 63, 110, 110, 149,
+  94, 90, 132, 93, 78, 109, 113, 99, 103, 102,
+  104, 142, 131, 119, 70, 79, 118, 132, 72, 116,
+  131, 101, 106, 77, 115, 95, 98, 111, 130, 100,
+  100, 104, 121, 91, 78, 139, 97, 113, 166, 78,
+  109, 109, 91, 94, 113, 149, 83, 94, 79, 106,
+  81, 89, 94, 95, 108, 108, 126, 87, 91, 118,
+  114, 124, 41, 87, 35, 103, 141, 86, 118, 113,
+  123, 62, 89, 107, 61, 107, 125, 111, 75, 101,
+  98, 76, 91, 72, 67, 156, 101, 120, 101, 125,
+  85, 103, 89, 107, 107, 85, 76, 126, 99, 78,
+  110, 109, 74, 75, 80, 111, 107, 87, 62, 79,
+  87, 88, 110, 147, 87, 118, 80, 130, 91, 83,
+  127, 78, 83, 82, 84, 132, 67, 96, 116, 105,
+  90, 76, 117, 117, 120, 117, 78, 64, 119, 127,
+  103, 105, 142, 76, 81, 145, 88, 122, 121, 83,
+  88, 110, 67, 97, 96, 137, 95, 96, 114, 140,
+  123, 95, 55, 101, 85, 102, 78, 109, 94, 90,
+  93, 97, 129, 146, 91, 115, 96, 157, 79, 86,
+  112, 131, 111, 77, 96, 107, 86, 94, 39, 97,
+  92, 110, 71, 62, 98, 73, 43, 118, 86, 104,
+  94, 84, 114, 111, 130, 101, 85, 79, 111, 140,
+  88, 123, 98, 89, 83, 87, 156, 87, 87, 129,
+  94, 97, 91, 86, 78, 83, 88, 121, 91, 98,
+  189, 93, 115, 86, 134, 121, 118, 169, 85, 82,
+  82, 116, 84, 87, 95, 90, 98, 100, 124, 110,
+  92, 98, 105, 89, 51, 84, 58, 117, 158, 96,
+  125, 115, 122, 88, 113, 101, 82, 76, 96, 102,
+  97, 105, 123, 42, 119, 73, 68, 154, 100, 109,
+  104, 151, 66, 107, 94, 99, 115, 98, 91, 101,
+  100, 92, 119, 99, 111, 112, 86, 119, 98, 97,
+  98, 80, 94, 90, 124, 107, 106, 120, 102, 109,
+  83, 84, 96, 95, 53, 78, 78, 142, 64, 98,
+  123, 84, 92, 88, 81, 136, 121, 125, 105, 93,
+  146, 118, 125, 112, 133, 85, 103, 68, 81, 113,
+  116, 75, 87, 111, 76, 88, 84, 135, 110, 106,
+  109, 144, 117, 89, 74, 101, 94, 97, 104, 91,
+  110, 101, 83, 89, 133, 103, 107, 113, 105, 149,
+  92, 119, 114, 126, 95, 94, 105, 92, 111, 95,
+  94, 107, 109, 140, 57, 98, 117, 70, 55, 94,
+  62, 73, 90, 84, 92, 121, 112, 92, 98, 109,
+  110, 111, 88, 105, 110, 89, 80, 89, 125, 86,
+  85, 154, 91, 92, 91, 86, 86, 78, 110, 126,
+  79, 86, 184, 86, 84, 89, 138, 137, 115, 151,
+  118, 101, 83, 118, 96, 86, 111, 93, 92, 107,
+  120, 117, 87, 77, 98, 94, 59, 92, 60, 124,
+  154, 100, 119, 105, 121, 94, 96, 77, 89, 76,
+  84, 106, 94, 99, 131, 39, 157, 76, 73, 168,
+  120, 114, 97, 134, 54, 94, 93, 98, 107, 108,
+  79, 100, 104, 90, 119, 104, 143, 119, 99, 108,
+  95, 87, 108, 87, 109, 86, 131, 87, 100, 110,
+  101, 97, 78, 95, 45, 94, 57, 104, 69, 158,
+  78, 87, 102, 99, 91, 86, 72, 120, 89, 123,
+  105, 117, 178, 101, 141, 127, 145, 89, 131, 82,
+  92, 100, 120, 90, 91, 109, 75, 77, 70, 124,
+  99, 97, 115, 152, 112, 78, 107, 104, 85, 97,
+  91, 74, 106, 89, 99, 91, 107, 97, 113, 98,
+  122, 131, 104, 115, 123, 128, 108, 102, 111, 81,
+  127, 87, 121, 108, 118, 161, 50, 97, 113, 68,
+  53, 73, 60, 96, 96, 73, 92, 120, 111, 85,
+  107, 98, 105, 88, 73, 84, 107, 110, 87, 83,
+  110, 80, 87, 132, 101, 95, 107, 86, 102, 83,
+  119, 138, 82, 109, 152, 91, 87, 101, 130, 131,
+  112, 123, 124, 102, 89, 117, 112, 111, 107, 109,
+  94, 111, 117, 119, 86, 64, 91, 101, 73, 120,
+  74, 119, 147, 107, 109, 85, 109, 101, 99, 52,
+  90, 87, 65, 95, 111, 99, 122, 39, 159, 83,
+  74, 166, 128, 108, 91, 121, 57, 83, 80, 99,
+  101, 82, 89, 107, 107, 95, 109, 107, 148, 119,
+  112, 114, 91, 82, 104, 82, 121, 90, 139, 86,
+  104, 106, 117, 92, 74, 100, 34, 83, 84, 122,
+  72, 155, 95, 81, 108, 100, 96, 88, 68, 84,
+  70, 106, 106, 132, 178, 94, 140, 146, 130, 102,
+  135, 94, 102, 99, 115, 93, 105, 105, 86, 71,
+  66, 114, 112, 83, 104, 145, 111, 74, 125, 107,
+  84, 93, 73, 65, 105, 75, 90, 75, 87, 95,
+  126, 92, 118, 109, 128, 109, 121, 141, 120, 106,
+  102, 90, 126, 91, 124, 129, 111, 161, 48, 103,
+  121, 74, 71, 72, 85, 108, 97, 83, 98, 104,
+  101, 82, 111, 89, 101, 91, 71, 59, 111, 119,
+  91, 78, 91, 80, 98, 94, 111, 92, 100, 89,
+  105, 95, 117, 156, 95, 103, 121, 83, 85, 103,
+  124, 113, 124, 114, 119, 106, 94, 98, 115, 128,
+  122, 102, 97, 111, 99, 99, 75, 60, 87, 114,
+  70, 126, 77, 114, 131, 103, 97, 94, 90, 113,
+  84, 56, 77, 106, 69, 90, 115, 102, 116, 51,
+  129, 97, 75, 124, 133, 105, 89, 109, 75, 84,
+  66, 89, 95, 72, 127, 114, 110, 109, 141, 113,
+  133, 128, 109, 126, 89, 95, 92, 62, 139, 98,
+  143, 99, 96, 105, 167, 112, 74, 103, 43, 73,
+  97, 111, 69, 137, 98, 92, 102, 116, 98, 98,
+  71, 81, 66, 101, 90, 147, 156, 83, 123, 154,
+  112, 120, 134, 116, 129, 120, 113, 95, 105, 97,
+  82, 75, 88, 112, 129, 74, 111, 116, 126, 82,
+  117, 114, 93, 97, 75, 77, 103, 74, 86, 89,
+  73, 100, 125, 95, 98, 77, 139, 121, 111, 149,
+  115, 112, 88, 90, 105, 94, 121, 125, 107, 148,
+  62, 112, 121, 80, 88, 87, 110, 96, 94, 85,
+  94, 109, 91, 96, 109, 88, 108, 97, 78, 60,
+  97, 115, 102, 74, 90, 105, 110, 72, 122, 93,
+  88, 111, 102, 107, 103, 161, 109, 119, 103, 88,
+  94, 100, 109, 97, 129, 105, 106, 117, 107, 83,
+  106, 118, 126, 104, 110, 118, 96, 85, 66, 55,
+  88, 106, 66, 108, 98, 103, 89, 104, 86, 115,
+  88, 111, 67, 80, 86, 108, 93, 101, 115, 102,
+  125, 72, 113, 99, 87, 85, 138, 103, 66, 99,
+  83, 106, 76, 85, 90, 95, 135, 117, 104, 119,
+  124, 113, 95, 99, 83, 122, 95, 122, 88, 54,
+  143, 98, 134, 104, 75, 104, 166, 127, 81, 105,
+  58, 89, 93, 72, 75, 103, 87, 100, 104, 130,
+  100, 99, 67, 88, 76, 103, 94, 136, 118, 106,
+  92, 144, 93, 140, 126, 104, 151, 140, 113, 90,
+  110, 100, 85, 76, 108, 114, 119, 79, 111, 76,
+  138, 100, 113, 104, 123, 97, 78, 81, 93, 86,
+  121, 107, 85, 113, 108, 93, 92, 56, 116, 120,
+  107, 143, 107, 100, 69, 82, 92, 105, 115, 123,
+  92, 124, 88, 113, 101, 90, 96, 108, 107, 91,
+  110, 92, 115, 117, 92, 115, 93, 102, 109, 97,
+  91, 66, 82, 121, 123, 91, 92, 140, 119, 67,
+  130, 94, 81, 138, 93, 99, 93, 134, 130, 116,
+  97, 97, 97, 93, 101, 92, 104, 102, 97, 102,
+  119, 79, 114, 94, 124, 115, 127, 125, 95, 84,
+  70, 53, 90, 99, 62, 90, 94, 91, 66, 92,
+  87, 117, 92, 99, 68, 100, 95, 103, 107, 104,
+  103, 83, 135, 104, 115, 99, 107, 76, 140, 101,
+  51, 105, 75, 127, 82, 102, 88, 110, 121, 96,
+  102, 117, 110, 112, 73, 88, 92, 108, 99, 142,
+  104, 51, 131, 98, 119, 97, 76, 106, 117, 115,
+  79, 109, 45, 97, 95, 72, 63, 81, 76, 119,
+  102, 119, 101, 101, 63, 110, 99, 99, 95, 109,
+  109, 93, 90, 142, 85, 119, 120, 91, 150, 134,
+  110, 97, 91, 106, 86, 91, 113, 121, 102, 90,
+  117, 55, 126, 138, 106, 95, 124, 100, 72, 89,
+  86, 98, 140, 137, 98, 103, 91, 88, 99, 58,
+  99, 123, 103, 143, 100, 98, 49, 78, 96, 118,
+  116, 112, 77, 96, 89, 105, 84, 94, 92, 118,
+  86, 98, 110, 81, 115, 116, 96, 114, 82, 116,
+  105, 98, 104, 75, 80, 122, 132, 106, 85, 145,
+  123, 86, 134, 104, 86, 142, 94, 83, 89, 102,
+  127, 94, 97, 109, 109, 101, 100, 97, 68, 95,
+  91, 92, 127, 79, 126, 86, 117, 113, 128, 128,
+  108, 88, 86, 43, 81, 97, 55, 86, 86, 76,
+  67, 75, 92, 118, 85, 95, 77, 118, 96, 102,
+  91, 92, 90, 59, 139, 119, 136, 100, 127, 92,
+  132, 103, 51, 115, 67, 133, 93, 125, 94, 105,
+  107, 78, 107, 106, 100, 108, 64, 80, 103, 93,
+  92, 159, 114, 66, 125, 107, 104, 90, 81, 101,
+  93, 89, 82, 122, 44, 85, 94, 81, 50, 80,
+  72, 113, 111, 115, 97, 90, 63, 102, 109, 92,
+  94, 84, 120, 77, 108, 130, 96, 102, 115, 92,
+  147, 121, 109, 111, 88, 112, 84, 112, 98, 129,
+  88, 111, 111, 60, 121, 152, 95, 84, 116, 93,
+  77, 79, 102, 99, 135, 154, 107, 100, 87, 88,
+  111, 68, 100, 123, 99, 137, 98, 102, 35, 78,
+  109, 126, 104, 114, 65, 93, 86, 100, 72, 83,
+  81, 108, 87, 119, 95, 81, 116, 110, 109, 109,
+  75, 130, 96, 106, 97, 79, 96, 119, 132, 115,
+  73, 137, 109, 99, 132, 95, 104, 144, 87, 75,
+  95, 78, 118, 96, 98, 115, 105, 89, 90, 120,
+  37, 95, 81, 93, 135, 77, 145, 99, 113, 105,
+  120, 123, 102, 90, 99, 35, 74, 114, 42, 86,
+  83, 79, 69, 69, 109, 123, 91, 87, 93, 121,
+  95, 100, 85, 84, 84, 42, 127, 106, 146, 103,
+  144, 97, 116, 110, 76, 110, 45, 130, 103, 149,
+  90, 100, 97, 84, 121, 108, 104, 115, 60, 93,
+  105, 98, 90, 174, 111, 77, 116, 110, 102, 100,
+  86, 108, 101, 87, 89, 131, 48, 83, 110, 68,
+  35, 87, 77, 107, 112, 123, 96, 88, 65, 97,
+  100, 98, 95, 63, 110, 86, 126, 115, 104, 96,
+  111, 90, 114, 111, 112, 137, 82, 111, 90, 122,
+  82, 143, 76, 122, 108, 72, 121, 172, 79, 91,
+  90, 98, 97, 78, 96, 97, 117, 158, 114, 106,
+  79, 94, 120, 68, 98, 116, 105, 127, 99, 99,
+  35, 90, 122, 120, 95, 100, 62, 88, 63, 100,
+  64, 86, 74, 108, 90, 119, 99, 72, 117, 103,
+  121, 92, 72, 128, 85, 105, 85, 68, 105, 111,
+  126, 112, 76, 124, 98, 117, 122, 90, 117, 133,
+  95, 69, 98, 66, 104, 104, 107, 119, 119, 73,
+  83, 123, 20, 107, 67, 84, 132, 76, 158, 119,
+  111, 104, 120, 112, 84, 95, 98, 56, 66, 100,
+  34, 81, 92, 98, 74, 61, 118, 133, 112, 87,
+  102, 119, 98, 93, 101, 73, 82, 39, 115, 101,
+  141, 119, 145, 99, 103, 115, 90, 112, 45, 98,
+  102, 158, 91, 88, 102, 95, 109, 100, 91, 111,
+  52, 113, 109, 108, 103, 178, 113, 73, 110, 110,
+  104, 101, 96, 115, 114, 94, 91, 129, 51, 84,
+  125, 83, 36, 94, 83, 105, 123, 109, 130, 85,
+  81, 102, 97, 98, 100, 55, 99, 83, 137, 105,
+  101, 88, 98, 91, 85, 109, 112, 138, 86, 109,
+  88, 125, 80, 151, 88, 119, 104, 78, 121, 191,
+  61, 103, 73, 101, 113, 102, 95, 86, 95, 125,
+  116, 88, 75, 94, 119, 63, 91, 115, 119, 121,
+  100, 90, 25, 113, 121, 112, 96, 94, 63, 79,
+  69, 107, 66, 91, 82, 92, 91, 110, 99, 84,
+  117, 103, 131, 87, 71, 126, 84, 98, 83, 64,
+  106, 103, 122, 108, 88, 97, 92, 130, 114, 84,
+  112, 123, 101, 56, 100, 75, 88, 100, 116, 113,
+  119, 74, 70, 112, 28, 124, 52, 70, 124, 78,
+  152, 118, 95, 100, 116, 110, 59, 86, 78, 91,
+  70, 104, 27, 83, 107, 111, 84, 49, 97, 132,
+  122, 87, 87, 106, 89, 87, 110, 76, 72, 42,
+  116, 116, 129, 130, 122, 107, 92, 118, 84, 112,
+  56, 60, 98, 122, 89, 74, 101, 95, 90, 83,
+  65, 102, 43, 110, 108, 109, 114, 173, 96, 50,
+  104, 114, 100, 89, 94, 107, 107, 95, 91, 109,
+  73, 85, 105, 92, 57, 94, 83, 113, 119, 94,
+  173, 81, 107, 108, 98, 95, 101, 62, 96, 86,
+  124, 106, 89, 77, 88, 100, 99, 115, 117, 116,
+  93, 92, 80, 127, 93, 129, 105, 109, 108, 80,
+  127, 186, 54, 110, 72, 89, 110, 122, 100, 64,
+  71, 84, 127, 99, 76, 83, 106, 64, 73, 116,
+  122, 129, 100, 91, 15, 124, 101, 104, 102, 86,
+  63, 78, 91, 115, 69, 89, 94, 78, 85, 105,
+  82, 94, 100, 108, 131, 116, 58, 108, 109, 89,
+  87, 49, 89, 89, 108, 101, 100, 84, 90, 128,
+  106, 75, 95, 129, 93, 52, 97, 79, 61, 93,
+  133, 108, 98, 77, 69, 107, 67, 141, 48, 85,
+  120, 79, 127, 109, 105, 102, 131, 115, 50, 83,
+  59, 119, 66, 126, 33, 83, 113, 109, 100, 48,
+  79, 112, 121, 91, 68, 97, 82, 84, 98, 86,
+  75, 49, 118, 121, 117, 107, 94, 111, 88, 114,
+  52, 116, 74, 39, 79, 79, 97, 71, 94, 84,
+  86, 70, 54, 88, 61, 102, 87, 87, 107, 154,
+  73, 38, 90, 125, 101, 81, 97, 90, 96, 110,
+  81, 90, 74, 107, 72, 89, 82, 90, 66, 124,
+  109, 88, 189, 67, 108, 112, 109, 89, 90, 70,
+  111, 102, 108, 104, 76, 70, 79, 88, 122, 122,
+  120, 82, 85, 79, 76, 111, 102, 104, 127, 103,
+  125, 79, 135, 142, 49, 112, 93, 80, 110, 109,
+  113, 51, 71, 78, 120, 109, 80, 72, 93, 69,
+  57, 96, 109, 141, 109, 82, 27, 115, 71, 101,
+  101, 95, 66, 90, 75, 123, 88, 85, 89, 84,
+  78, 93, 83, 102, 87, 111, 123, 121, 45, 90,
+  131, 83, 99, 49, 74, 84, 104, 95, 105, 74,
+  93, 132, 99, 69, 81, 127, 76, 59, 95, 72,
+  36, 82, 161, 98, 96, 78, 83, 121, 119, 137,
+  69, 108, 113, 96, 85, 113, 129, 115, 136, 100,
+  58, 87, 44, 131, 77, 113, 43, 93, 107, 116,
+  145, 70, 88, 97, 105, 100, 62, 86, 78, 84,
+  72, 83, 92, 79, 127, 91, 106, 72, 66, 118,
+  97, 114, 40, 119, 71, 36, 62, 60, 105, 85,
+  104, 95, 93, 74, 66, 82, 115, 108, 69, 88,
+  94, 112, 69, 48, 90, 134, 117, 60, 94, 89,
+  104, 127, 74, 82, 61, 143, 54, 113, 90, 116,
+  51, 145, 108, 81, 160, 66, 89, 126, 113, 94,
+  80, 84, 145, 113, 133, 99, 74, 47, 88, 87,
+  122, 110, 121, 65, 76, 87, 73, 88, 111, 104,
+  163, 94, 137, 109, 149, 99, 60, 109, 103, 82,
+  104, 86, 122, 54, 82, 91, 103, 93, 70, 71,
+  90, 98, 62, 94, 106, 166, 112, 86, 57, 98,
+  64, 100, 96, 102, 81, 113, 61, 142, 124, 70,
+  67, 96, 83, 69, 97, 121, 92, 120, 113, 106,
+  61, 88, 125, 90, 109, 59, 83, 81, 97, 84,
+  123, 76, 106, 139, 96, 75, 83, 114, 72, 74,
+  99, 81, 54, 85, 190, 83, 111, 83, 102, 141,
+  138, 92, 91, 113, 92, 122, 71, 117, 101, 117,
+  125, 76, 78, 94, 50, 106, 112, 63, 56, 98,
+  93, 129, 191, 90, 121, 89, 68, 100, 81, 92,
+  74, 83, 46, 89, 95, 111, 127, 67, 96, 67,
+  54, 148, 97, 122, 67, 108, 56, 56, 66, 74,
+  114, 118, 119, 106, 93, 82, 78, 85, 146, 119,
+  95, 102, 99, 74, 91, 57, 103, 126, 132, 62,
+  98, 113, 94, 135, 73, 75, 67, 143, 73, 141,
+  82, 153, 46, 142, 88, 80, 90, 72, 55, 131,
+  120, 106, 95, 101, 166, 114, 161, 93, 88, 43,
+  99, 130, 94, 102, 115, 82, 71, 124, 72, 83,
+  108, 123, 186, 74, 128, 148, 144, 82, 62, 108,
+  101, 102, 92, 75, 130, 68, 93, 81, 96, 90,
+  66, 83, 88, 155, 90, 114, 117, 180, 101, 90,
+  93, 97, 93, 98, 90, 109, 92, 116, 61, 135,
+  155, 53, 60, 99, 119, 63, 90, 123, 101, 126,
+  92, 94, 82, 102, 112, 116, 110, 79, 107, 78,
+  76, 72, 146, 95, 107, 142, 103, 78, 83, 96,
+  105, 78, 109, 119, 73, 105, 204, 74, 137, 103,
+  88, 145, 123, 94, 102, 101, 78, 135, 94, 91,
+  84, 121, 110, 87, 113, 102, 77, 82, 115, 78,
+  56, 96, 60, 132, 192, 92, 125, 87, 90, 86,
+  87, 96, 77, 90, 64, 93, 86, 119, 129, 56,
+  98, 82, 51, 187, 96, 126, 88, 129, 48, 75,
+  83, 103, 107, 152, 99, 144, 106, 76, 106, 98,
+  126, 94, 101, 118, 103, 70, 95, 78, 134, 105,
+  131, 85, 96, 118, 91, 129, 86, 68, 76, 125,
+  85, 124, 78, 161, 46, 89, 61, 82, 76, 74,
+  47, 119, 124, 96, 103, 91, 175, 118, 143, 94,
+  128, 60, 96, 153, 92, 105, 119, 94, 76, 155,
+  72, 79, 104, 128, 158, 83, 106, 157, 121, 81,
+  66, 129, 79, 125, 75, 96, 141, 78, 103, 96,
+  118, 126, 73, 99, 100, 207, 112, 114, 109, 158,
+  107, 83, 115, 114, 111, 91, 93, 101, 85, 118,
+  61, 85, 133, 48, 61, 98, 144, 106, 89, 102,
+  107, 123, 92, 103, 92, 97, 113, 125, 98, 104,
+  111, 84, 82, 72, 149, 111, 98, 140, 103, 93,
+  91, 93, 122, 92, 109, 145, 65, 109, 207, 73,
+  127, 129, 75, 143, 129, 151, 90, 110, 83, 130,
+  118, 95, 90, 122, 113, 123, 123, 97, 91, 104,
+  115, 87, 54, 98, 53, 143, 154, 84, 102, 108,
+  134, 81, 85, 115, 71, 98, 92, 91, 88, 111,
+  121, 78, 95, 103, 66, 188, 100, 121, 87, 135,
+  58, 65, 104, 118, 116, 119, 74, 118, 84, 74,
+  119, 101, 104, 69, 106, 117, 112, 96, 95, 90,
+  137, 105, 113, 103, 81, 124, 135, 125, 97, 74,
+  73, 104, 96, 100, 76, 156, 62, 74, 102, 92,
+  117, 72, 73, 98, 113, 102, 104, 94, 178, 111,
+  125, 118, 145, 77, 98, 132, 103, 118, 122, 101,
+  86, 159, 74, 82, 84, 129, 120, 89, 104, 153,
+  116, 79, 56, 146, 79, 113, 71, 120, 155, 71,
+  99, 88, 125, 144, 94, 110, 93, 227, 113, 112,
+  98, 132, 101, 83, 112, 130, 108, 98, 100, 130,
+  82, 129, 70, 70, 125, 67, 67, 101, 106, 129,
+  95, 89, 106, 114, 110, 116, 83, 79, 125, 106,
+  75, 146, 114, 91, 105, 75, 134, 99, 84, 132,
+  125, 102, 93, 98, 124, 89, 96, 146, 66, 92,
+  204, 72, 107, 117, 84, 127, 143, 140, 93, 119,
+  91, 114, 91, 111, 96, 97, 102, 135, 101, 89,
+  60, 119, 103, 117, 59, 98, 92, 167, 136, 87,
+  88, 113, 119, 87, 76, 92, 68, 89, 97, 85,
+  97, 96, 104, 71, 103, 95, 60, 149, 92, 96,
+  65, 104, 53, 55, 98, 103, 103, 71, 86, 120,
+  96, 72, 107, 97, 108, 80, 97, 121, 111, 111,
+  105, 63, 130, 101, 108, 118, 68, 124, 162, 135,
+  86, 83, 72, 104, 93, 96, 85, 156, 67, 97,
+  120, 68, 143, 54, 85, 92, 113, 115, 91, 117,
+  166, 79, 122, 129, 131, 89, 96, 113, 101, 128,
+  122, 95, 88, 155, 77, 78, 82, 129, 109, 65,
+  118, 129, 123, 77, 63, 140, 93, 103, 77, 111,
+  119, 69, 102, 96, 112, 138, 110, 98, 78, 202,
+  101, 102, 97, 127, 87, 96, 95, 132, 104, 98,
+  94, 140, 87, 134, 70, 81, 132, 78, 76, 92,
+  77, 87, 98, 63, 117, 122, 94, 121, 76, 52,
+  114, 92, 66, 118, 123, 82, 114, 71, 144, 89,
+  96, 133, 142, 90, 78, 109, 120, 81, 82, 137,
+  73, 86, 210, 71, 114, 92, 97, 119, 149, 116,
+  98, 113, 100, 117, 86, 132, 115, 111, 85, 110,
+  101, 88, 46, 96, 96, 100, 60, 119, 95, 173,
+  150, 98, 102, 106, 76, 108, 72, 83, 72, 88,
+  87, 99, 116, 100, 101, 73, 103, 87, 66, 132,
+  101, 92, 64, 109, 62, 78, 93, 103, 112, 70,
+  106, 130, 93, 82, 83, 93, 138, 104, 77, 121,
+  109, 106, 103, 53, 142, 108, 122, 86, 75, 122,
+  115, 136, 75, 101, 58, 118, 98, 94, 80, 161,
+  79, 107, 99, 80, 118, 56, 75, 123, 97, 126,
+  119, 142, 170, 96, 135, 126, 116, 105, 102, 96,
+  112, 133, 121, 82, 83, 157, 85, 82, 88, 134,
+  109, 62, 124, 119, 121, 68, 78, 112, 105, 106,
+  100, 55, 132, 77, 123, 97, 111, 128, 77, 84,
+  72, 179, 99, 101, 85, 137, 83, 99, 101, 107,
+  96, 101, 96, 102, 102, 154, 77, 109, 126, 66,
+  77, 77, 77, 47, 108, 83, 120, 155, 92, 110,
+  80, 58, 93, 100, 81, 82, 124, 86, 111, 61,
+  135, 104, 98, 138, 149, 81, 86, 118, 122, 85,
+  95, 148, 77, 85, 200, 64, 105, 90, 92, 117,
+  126, 72, 105, 98, 92, 121, 96, 139, 110, 120,
+  74, 104, 87, 96, 66, 49, 92, 87, 54, 111,
+  96, 136, 143, 97, 138, 102, 67, 130, 105, 84,
+  83, 107, 69, 92, 113, 105, 96, 85, 97, 77,
+  62, 139, 118, 101, 78, 93, 55, 87, 81, 120,
+  106, 105, 134, 106, 90, 90, 111, 100, 147, 155,
+  112, 108, 108, 90, 120, 62, 141, 104, 127, 70,
+  102, 117, 84, 126, 66, 95, 47, 107, 122, 126,
+  77, 165, 87, 82, 73, 82, 95, 62, 58, 126,
+  77, 101, 149, 142, 172, 92, 148, 117, 112, 122,
+  96, 119, 98, 106, 119, 118, 58, 153, 75, 85,
+  99, 135, 118, 59, 111, 106, 113, 90, 73, 125,
+  75, 113, 115, 69, 132, 78, 119, 82, 79, 104,
+  63, 100, 81, 148, 106, 94, 96, 133, 94, 80,
+  93, 106, 94, 88, 87, 86, 95, 131, 47, 102,
+  120, 49, 69, 67, 86, 57, 104, 95, 117, 134,
+  98, 90, 97, 88, 75, 102, 84, 76, 99, 96,
+  113, 54, 106, 105, 101, 134, 127, 80, 103, 100,
+  124, 84, 105, 161, 87, 113, 159, 67, 75, 115,
+  57, 113, 125, 88, 98, 81, 73, 134, 56, 148,
+  99, 92, 87, 109, 78, 84, 81, 115, 78, 122,
+  35, 96, 88, 119, 115, 81, 131, 89, 90, 115,
+  96, 97, 92, 121, 83, 93, 87, 118, 87, 97,
+  75, 42, 57, 141, 127, 100, 71, 99, 53, 77,
+  77, 108, 97, 169, 124, 104, 72, 77, 128, 122,
+  105, 146, 110, 100, 101, 70, 110, 78, 138, 76,
+  111, 90, 103, 129, 77, 119, 60, 81, 94, 119,
+  99, 137, 98, 143, 84, 76, 114, 95, 139, 61,
+  84, 97, 84, 105, 109, 95, 136, 101, 104, 94,
+  132, 105, 86, 128, 83, 92, 118, 106, 63, 145,
+  74, 110, 121, 118, 136, 71, 85, 80, 128, 124,
+  58, 138, 73, 127, 91, 170, 98, 89, 114, 67,
+  89, 62, 86, 137, 98, 127, 102, 77, 90, 136,
+  124, 61, 99, 132, 94, 100, 66, 110, 71, 72,
+  59, 76, 123, 52, 72, 98, 122, 90, 99, 84,
+  108, 96, 93, 82, 90, 80, 86, 109, 79, 113,
+  67, 98, 86, 60, 108, 94, 97, 121, 96, 105,
+  104, 86, 109, 73, 92, 143, 95, 151, 125, 98,
+  151, 137, 49, 121, 165, 110, 101, 97, 79, 143,
+  58, 197, 96, 126, 98, 121, 100, 68, 66, 106,
+  115, 62, 37, 128, 81, 108, 125, 87, 80, 92,
+  83, 121, 53, 105, 124, 148, 102, 133, 94, 119,
+  95, 141, 49, 88, 88, 149, 136, 119, 48, 112,
+  87, 83, 77, 108, 114, 142, 111, 103, 65, 76,
+  66, 99, 61, 106, 102, 113, 116, 112, 106, 96,
+  133, 73, 100, 83, 105, 126, 68, 126, 105, 86,
+  146, 144, 141, 123, 108, 129, 74, 87, 93, 110,
+  122, 69, 104, 100, 87, 107, 86, 57, 93, 132,
+  93, 94, 147, 102, 88, 136, 84, 72, 106, 109,
+  94, 137, 109, 141, 123, 97, 169, 86, 78, 112,
+  151, 59, 50, 145, 167, 119, 134, 99, 142, 72,
+  121, 50, 129, 122, 83, 139, 89, 135, 124, 68,
+  91, 174, 151, 80, 129, 160, 118, 124, 48, 107,
+  44, 83, 173, 101, 163, 90, 116, 76, 98, 94,
+  105, 120, 85, 91, 90, 167, 70, 87, 91, 96,
+  73, 78, 114, 107, 95, 67, 103, 97, 101, 127,
+  104, 123, 86, 112, 75, 100, 95, 101, 116, 108,
+  102, 93, 79, 117, 47, 94, 149, 101, 91, 129,
+  59, 88, 71, 150, 102, 109, 89, 128, 48, 74,
+  53, 68, 107, 125, 36, 80, 96, 77, 90, 65,
+  82, 85, 95, 99, 48, 113, 103, 142, 120, 151,
+  64, 108, 77, 146, 43, 86, 86, 111, 131, 112,
+  17, 85, 83, 108, 66, 91, 112, 86, 80, 79,
+  119, 60, 79, 103, 46, 109, 92, 76, 121, 130,
+  133, 89, 96, 70, 100, 132, 87, 100, 74, 115,
+  96, 98, 104, 96, 95, 98, 92, 98, 54, 96,
+  69, 103, 90, 59, 112, 136, 148, 99, 91, 49,
+  83, 61, 79, 90, 109, 91, 82, 114, 109, 86,
+  101, 108, 49, 111, 85, 155, 116, 67, 110, 96,
+  86, 83, 148, 76, 28, 113, 129, 94, 111, 96,
+  103, 51, 131, 146, 95, 137, 90, 96, 97, 97,
+  95, 55, 110, 152, 136, 111, 88, 153, 84, 96,
+  35, 67, 46, 69, 61, 78, 124, 104, 87, 99,
+  62, 83, 87, 80, 95, 69, 80, 145, 58, 78,
+  95, 138, 99, 90, 95, 100, 139, 82, 103, 140,
+  93, 119, 95, 118, 82, 118, 71, 89, 83, 62,
+  106, 85, 117, 100, 97, 107, 90, 104, 107, 113,
+  96, 119, 75, 80, 108, 107, 90, 71, 95, 140,
+  72, 86, 93, 83, 95, 90, 36, 115, 113, 61,
+  80, 67, 104, 87, 76, 102, 86, 147, 70, 122,
+  116, 114, 83, 98, 99, 136, 71, 65, 117, 117,
+  142, 124, 45, 112, 99, 133, 67, 111, 141, 94,
+  85, 86, 104, 101, 84, 100, 66, 97, 85, 115,
+  98, 112, 101, 87, 81, 119, 125, 107, 75, 99,
+  67, 69, 119, 93, 141, 100, 52, 102, 107, 90,
+  61, 111, 111, 96, 85, 87, 89, 134, 175, 99,
+  105, 102, 92, 104, 88, 130, 95, 114, 78, 41,
+  130, 107, 107, 138, 71, 94, 82, 149, 112, 71,
+  99, 110, 76, 92, 122, 91, 50, 74, 89, 82,
+  103, 100, 113, 85, 142, 152, 88, 81, 135, 112,
+  117, 83, 76, 75, 96, 109, 119, 106, 57, 110,
+  61, 109, 102, 112, 55, 106, 84, 120, 76, 99,
+  97, 131, 106, 76, 75, 84, 112, 75, 88, 123,
+  68, 100, 94, 183, 122, 117, 52, 106, 128, 103,
+  97, 153, 74, 105, 105, 86, 91, 104, 79, 73,
+  91, 58, 124, 107, 131, 106, 128, 127, 135, 134,
+  117, 117, 121, 107, 106, 104, 150, 110, 112, 100,
+  94, 133, 101, 101, 135, 59, 105, 84, 40, 159,
+  128, 86, 103, 83, 146, 87, 76, 97, 141, 141,
+  82, 122, 106, 74, 100, 112, 125, 125, 95, 115,
+  118, 156, 143, 149, 106, 96, 102, 138, 86, 138,
+  122, 92, 103, 107, 118, 135, 99, 83, 110, 122,
+  113, 109, 97, 110, 90, 106, 101, 157, 140, 72,
+  103, 104, 76, 85, 133, 97, 129, 120, 92, 116,
+  122, 103, 92, 99, 96, 92, 93, 118, 104, 111,
+  152, 122, 138, 143, 129, 140, 114, 123, 118, 128,
+  105, 83, 130, 113, 137, 152, 66, 92, 121, 124,
+  108, 99, 102, 115, 80, 108, 88, 100, 75, 63,
+  76, 94, 123, 69, 143, 127, 119, 97, 111, 111,
+  153, 136, 122, 93, 94, 107, 96, 100, 103, 111,
+  83, 75, 97, 115, 151, 139, 88, 140, 71, 162,
+  89, 97, 124, 103, 122, 88, 103, 117, 110, 57,
+  108, 106, 89, 137, 80, 143, 116, 85, 77, 84,
+  110, 129, 101, 117, 81, 116, 94, 89, 68, 79,
+  102, 111, 100, 96, 155, 105, 125, 111, 94, 132,
+  140, 140, 124, 112, 129, 120, 120, 117, 142, 112,
+  114, 98, 106, 120, 112, 100, 142, 108, 152, 94,
+  67, 158, 166, 114, 112, 106, 149, 96, 81, 95,
+  129, 152, 97, 130, 119, 92, 127, 125, 137, 112,
+  105, 113, 106, 132, 131, 150, 126, 85, 112, 135,
+  130, 119, 132, 116, 108, 126, 107, 124, 103, 115,
+  133, 128, 128, 109, 115, 116, 72, 120, 101, 147,
+  133, 120, 176, 120, 121, 148, 133, 92, 122, 97,
+  123, 109, 141, 126, 108, 110, 94, 141, 105, 142,
+  116, 93, 140, 131, 123, 140, 148, 127, 107, 129,
+  125, 103, 126, 166, 130, 141, 148, 109, 89, 99,
+  121, 106, 114, 122, 107, 119, 88, 119, 108, 121,
+  92, 115, 102, 116, 127, 116, 120, 134, 112, 88,
+  140, 129, 141, 127, 120, 111, 109, 109, 109, 111,
+  109, 106, 99, 79, 110, 138, 120, 110, 124, 141,
+  80, 153, 95, 105, 122, 105, 134, 90, 122, 129,
+  102, 72, 119, 101, 98, 149, 96, 114, 113, 118,
+  104, 71, 103, 120, 138, 138, 78, 117, 110, 103,
+  77, 101, 111, 111, 103, 111, 165, 115, 141, 110,
+  84, 149, 93, 96, 118, 107, 90, 151, 104, 150,
+  129, 122, 136, 128, 95, 150, 112, 127, 92, 126,
+  132, 75, 82, 121, 176, 127, 132, 101, 122, 68,
+  133, 93, 79, 125, 90, 106, 130, 109, 121, 145,
+  131, 104, 77, 114, 113, 108, 117, 137, 111, 101,
+  110, 144, 114, 106, 137, 126, 98, 143, 101, 119,
+  101, 127, 108, 95, 94, 117, 120, 106, 122, 107,
+  120, 98, 121, 119, 134, 159, 119, 155, 119, 88,
+  101, 109, 106, 108, 129, 137, 96, 121, 121, 120,
+  103, 104, 99, 124, 102, 135, 101, 101, 141, 94,
+  123, 158, 124, 103, 120, 170, 117, 148, 140, 97,
+  100, 112, 99, 126, 113, 157, 102, 119, 129, 162,
+  141, 115, 94, 101, 123, 141, 110, 126, 103, 89,
+  101, 124, 122, 93, 109, 137, 90, 158, 112, 88,
+  109, 153, 163, 108, 114, 146, 104, 113, 61, 143,
+  126, 146, 103, 89, 122, 106, 111, 104, 107, 127,
+  149, 109, 114, 101, 115, 134, 93, 85, 127, 86,
+  108, 112, 109, 134, 107, 70, 154, 157, 99, 101,
+  139, 138, 110, 115, 139, 97, 77, 137, 129, 108,
+  165, 104, 133, 135, 89, 89, 113, 135, 89, 89,
+  94, 156, 128, 127, 129, 132, 96, 149, 101, 121,
+  125, 123, 110, 80, 61, 124, 85, 111, 147, 101,
+  130, 126, 124, 79, 92, 119, 75, 117, 165, 99,
+  114, 109, 121, 98, 71, 79, 105, 146, 69, 136,
+  121, 191, 102, 132, 95, 123, 134, 115, 76, 145,
+  97, 124, 86, 113, 112, 94, 99, 117, 102, 95,
+  97, 105, 135, 85, 133, 102, 74, 175, 79, 123,
+  98, 94, 98, 116, 99, 129, 127, 144, 96, 109,
+  107, 103, 101, 70, 115, 156, 117, 135, 98, 90,
+  169, 92, 147, 160, 168, 113, 110, 118, 91, 220,
+  150, 99, 100, 116, 90, 128, 107, 183, 101, 125,
+  128, 165, 109, 125, 84, 105, 101, 129, 96, 117,
+  146, 75, 101, 107, 117, 99, 108, 141, 80, 177,
+  100, 110, 124, 147, 153, 91, 119, 152, 103, 109,
+  99, 160, 123, 157, 97, 73, 117, 89, 84, 112,
+  135, 121, 131, 90, 124, 157, 130, 125, 77, 63,
+  124, 145, 93, 141, 109, 130, 92, 78, 134, 122,
+  100, 95, 133, 120, 112, 106, 151, 94, 82, 145,
+  87, 114, 164, 95, 117, 120, 96, 102, 124, 121,
+  94, 96, 95, 126, 118, 141, 119, 134, 106, 122,
+  110, 90, 106, 88, 113, 110, 52, 122, 38, 107,
+  156, 96, 117, 114, 99, 75, 98, 112, 60, 137,
+  131, 91, 93, 110, 107, 126, 74, 117, 87, 173,
+  96, 132, 124, 156, 85, 80, 84, 126, 108, 93,
+  77, 98, 89, 104, 111, 92, 100, 90, 99, 114,
+  120, 115, 101, 82, 122, 88, 132, 77, 80, 142,
+  59, 111, 103, 93, 135, 79, 124, 131, 93, 152,
+  98, 101, 90, 116, 108, 80, 112, 135, 111, 113,
+  107, 79, 156, 138, 144, 134, 162, 107, 108, 167,
+  84, 120, 114, 122, 82, 93, 86, 108, 98, 144,
+  103, 100, 120, 154, 117, 79, 54, 95, 94, 102,
+  114, 91, 175, 83, 92, 93, 117, 155, 97, 121,
+  75, 163, 100, 110, 119, 148, 126, 87, 117, 141,
+  94, 102, 59, 114, 100, 146, 101, 87, 129, 90,
+  72, 114, 106, 105, 89, 106, 99, 141, 143, 126,
+  84, 75, 107, 137, 66, 101, 125, 102, 94, 84,
+  106, 95, 94, 118, 119, 99, 105, 85, 107, 93,
+  80, 136, 80, 104, 166, 69, 96, 106, 81, 93,
+  115, 144, 81, 91, 82, 89, 79, 79, 87, 92,
+  112, 116, 119, 90, 93, 120, 115, 125, 33, 77,
+  33, 92, 142, 82, 128, 98, 122, 59, 92, 112,
+  62, 111, 114, 112, 71, 96, 97, 65, 91, 66,
+  61, 156, 101, 104, 93, 120, 72, 95, 87, 103,
+  95, 89, 75, 110, 102, 56, 118, 117, 72, 75,
+  77, 105, 102, 84, 63, 83, 81, 84, 102, 149,
+  89, 116, 70, 118, 93, 88, 127, 81, 85, 70,
+  94, 135, 64, 93, 106, 103, 87, 79, 106, 109,
+  117, 106, 81, 55, 119, 114, 108, 100, 137, 78,
+  72, 143, 88, 117, 123, 85, 66, 100, 62, 99,
+  103, 128, 93, 88, 106, 127, 119, 89, 45, 96,
+  85, 103, 72, 104, 90, 96, 103, 103, 121, 143,
+  84, 113, 104, 154, 77, 92, 107, 128, 108, 76,
+  90, 109, 82, 95, 33, 92, 78, 95, 63, 65,
+  92, 75, 38, 123, 71, 102, 89, 81, 111, 112,
+  125, 96, 93, 74, 92, 133, 81, 113, 92, 80,
+  93, 91, 149, 88, 83, 132, 95, 88, 89, 66,
+  56, 77, 89, 112, 71, 82, 183, 87, 119, 89,
+  131, 110, 121, 161, 80, 83, 87, 96, 90, 82,
+  107, 79, 99, 111, 123, 114, 97, 100, 109, 85,
+  42, 78, 62, 99, 161, 91, 136, 105, 124, 92,
+  117, 93, 85, 76, 85, 99, 103, 104, 123, 36,
+  116, 70, 61, 154, 105, 99, 95, 152, 67, 98,
+  86, 99, 110, 94, 89, 92, 106, 72, 122, 107,
+  114, 109, 86, 110, 102, 93, 103, 80, 96, 93,
+  117, 104, 105, 115, 99, 100, 89, 94, 91, 98,
+  64, 87, 86, 147, 72, 89, 121, 69, 94, 85,
+  73, 135, 121, 118, 103, 88, 154, 114, 135, 115,
+  124, 91, 98, 58, 89, 110, 118, 87, 67, 106,
+  66, 87, 92, 132, 119, 93, 93, 136, 118, 77,
+  69, 90, 93, 94, 106, 88, 118, 103, 92, 85,
+  115, 94, 118, 112, 116, 140, 86, 126, 110, 118,
+  94, 98, 97, 94, 104, 102, 101, 114, 102, 127,
+  52, 119, 115, 80, 47, 89, 60, 76, 85, 94,
+  100, 118, 120, 93, 109, 112, 100, 108, 77, 107,
+  108, 82, 97, 88, 116, 84, 79, 155, 97, 80,
+  88, 71, 75, 74, 111, 125, 72, 78, 167, 87,
+  77, 93, 142, 132, 120, 145, 113, 105, 87, 107,
+  95, 86, 113, 77, 97, 112, 118, 109, 95, 87,
+  101, 95, 52, 104, 65, 124, 161, 99, 123, 87,
+  118, 94, 86, 68, 90, 75, 78, 94, 101, 108,
+  136, 43, 151, 76, 62, 168, 121, 112, 85, 136,
+  58, 87, 80, 92, 109, 89, 85, 101, 102, 69,
+  130, 104, 162, 120, 97, 107, 100, 83, 101, 71,
+  115, 98, 132, 78, 104, 108, 105, 101, 85, 105,
+  49, 93, 67, 118, 82, 165, 94, 82, 101, 86,
+  102, 86, 77, 114, 87, 126, 102, 119, 186, 101,
+  143, 128, 133, 83, 121, 88, 97, 102, 122, 99,
+  71, 110, 72, 73, 75, 126, 121, 83, 105, 142,
+  125, 76, 103, 100, 93, 89, 97, 94, 116, 87,
+  97, 73, 104, 94, 126, 101, 123, 112, 97, 118,
+  118, 116, 107, 105, 102, 78, 113, 82, 126, 123,
+  123, 152, 50, 122, 120, 77, 46, 66, 66, 90,
+  87, 92, 92, 115, 108, 83, 113, 104, 107, 87,
+  61, 88, 118, 95, 96, 72, 116, 78, 77, 129,
+  104, 84, 105, 74, 99, 77, 123, 146, 102, 110,
+  133, 91, 95, 101, 133, 129, 119, 117, 122, 111,
+  92, 111, 107, 121, 105, 99, 102, 109, 111, 100,
+  90, 79, 102, 90, 68, 135, 71, 118, 147, 109,
+  117, 78, 98, 90, 82, 55, 90, 88, 62, 103,
+  108, 109, 128, 50, 143, 86, 70, 156, 127, 115,
+  83, 124, 63, 92, 70, 95, 106, 68, 104, 109,
+  100, 84, 109, 102, 154, 132, 102, 113, 93, 86,
+  88, 57, 136, 106, 141, 79, 110, 107, 123, 106,
+  85, 116, 43, 91, 90, 135, 85, 161, 104, 89,
+  92, 109, 90, 90, 77, 82, 64, 112, 108, 139,
+  171, 95, 132, 131, 129, 100, 120, 109, 117, 109,
+  114, 91, 92, 110, 96, 73, 73, 119, 134, 76,
+  101, 129, 130, 72, 107, 94, 111, 97, 88, 71,
+  117, 71, 84, 66, 92, 95, 127, 94, 106, 91,
+  125, 113, 112, 129, 116, 109, 101, 84, 121, 85,
+  121, 131, 119, 153, 46, 115, 129, 71, 67, 65,
+  102, 89, 92, 108, 92, 108, 88, 87, 103, 97,
+  97, 91, 64, 69, 117, 103, 92, 77, 99, 92,
+  90, 92, 105, 86, 96, 81, 103, 82, 114, 152,
+  109, 111, 100, 83, 95, 103, 113, 108, 133, 98,
+  117, 123, 90, 91, 110, 133, 124, 98, 91, 110,
+  106, 89, 81, 61, 89, 109, 66, 129, 67, 103,
+  120, 103, 106, 85, 79, 92, 59, 61, 77, 111,
+  74, 106, 98, 116, 125, 58, 109, 105, 92, 110,
+  121, 126, 79, 111, 81, 115, 59, 102, 107, 88,
+  133, 126, 101, 109, 128, 111, 107, 116, 103, 116,
+  97, 101, 90, 46, 162, 101, 142, 97, 90, 98,
+  151, 116, 92, 124, 67, 86, 94, 111, 104, 138,
+  97, 96, 81, 143, 79, 107, 70, 84, 74, 90,
+  109, 148, 130, 91, 109, 132, 119, 115, 118, 126,
+  154, 121, 118, 92, 107, 106, 99, 93, 98, 108,
+  121, 78, 104, 99, 147, 71, 98, 92, 121, 114,
+  88, 73, 115, 77, 110, 96, 89, 117, 120, 102,
+  85, 59, 152, 129, 98, 146, 119, 124, 84, 88,
+  100, 94, 104, 111, 102, 140, 83, 94, 111, 78,
+  86, 84, 131, 88, 91, 107, 98, 113, 80, 111,
+  90, 100, 87, 103, 75, 70, 91, 104, 103, 86,
+  103, 130, 101, 70, 116, 91, 83, 104, 93, 102,
+  94, 143, 113, 128, 93, 92, 108, 105, 104, 85,
+  103, 105, 107, 113, 111, 82, 128, 111, 135, 98,
+  81, 114, 116, 98, 94, 59, 108, 103, 66, 99,
+  95, 92, 93, 100, 118, 135, 92, 92, 58, 94,
+  99, 113, 117, 118, 104, 115, 135, 67, 103, 105,
+  128, 71, 112, 113, 89, 103, 82, 145, 67, 121,
+  97, 114, 134, 122, 112, 129, 113, 110, 76, 93,
+  106, 134, 99, 114, 95, 68, 165, 98, 126, 121,
+  61, 116, 123, 102, 103, 129, 78, 84, 87, 73,
+  106, 99, 89, 95, 110, 130, 87, 127, 63, 101,
+  98, 89, 112, 145, 96, 98, 85, 133, 102, 129,
+  119, 92, 143, 137, 118, 89, 107, 116, 102, 113,
+  109, 102, 98, 105, 106, 75, 121, 116, 105, 95,
+  137, 124, 84, 89, 88, 108, 152, 109, 80, 119,
+  105, 104, 86, 57, 128, 126, 96, 124, 123, 117,
+  79, 86, 110, 105, 108, 107, 82, 120, 109, 92,
+  73, 100, 91, 127, 92, 109, 110, 95, 125, 120,
+  99, 116, 88, 112, 87, 109, 87, 80, 66, 132,
+  120, 103, 100, 138, 105, 60, 129, 103, 89, 98,
+  88, 97, 84, 112, 131, 140, 105, 114, 84, 109,
+  123, 103, 93, 107, 106, 94, 128, 83, 147, 94,
+  140, 113, 79, 117, 119, 120, 104, 54, 116, 102,
+  62, 104, 88, 90, 95, 94, 141, 140, 119, 91,
+  84, 105, 118, 103, 113, 108, 108, 113, 142, 84,
+  118, 114, 153, 78, 108, 114, 112, 111, 77, 156,
+  89, 164, 89, 121, 123, 114, 134, 138, 107, 108,
+  79, 91, 112, 122, 98, 128, 108, 87, 151, 110,
+  112, 116, 62, 129, 79, 77, 118, 144, 60, 103,
+  94, 88, 89, 92, 86, 85, 136, 103, 103, 135,
+  69, 129, 126, 96, 117, 132, 105, 86, 102, 132,
+  107, 118, 128, 75, 124, 95, 114, 125, 84, 124,
+  110, 122, 100, 106, 88, 128, 110, 83, 104, 133,
+  109, 80, 115, 106, 102, 94, 74, 131, 135, 126,
+  88, 88, 109, 103, 105, 63, 93, 127, 94, 105,
+  111, 120, 97, 82, 121, 120, 125, 123, 77, 113,
+  71, 110, 71, 107, 98, 131, 68, 117, 126, 89,
+  125, 120, 114, 103, 101, 132, 86, 107, 72, 84,
+  82, 125, 135, 113, 91, 122, 100, 87, 124, 105,
+  93, 78, 101, 99, 86, 99, 108, 120, 114, 119,
+  108, 116, 141, 137, 83, 120, 112, 92, 143, 95,
+  148, 105, 137, 122, 88, 117, 131, 129, 117, 72,
+  127, 95, 63, 124, 79, 105, 111, 80, 143, 101,
+  123, 89, 108, 109, 125, 103, 84, 86, 108, 105,
+  142, 81, 143, 117, 149, 107, 109, 117, 121, 110,
+  71, 134, 111, 179, 101, 115, 104, 124, 128, 128,
+  98, 110, 107, 94, 116, 115, 92, 127, 97, 103,
+  134, 127, 103, 101, 74, 117, 74, 72, 133, 155,
+  63, 108, 98, 95, 79, 106, 90, 85, 138, 101,
+  104, 127, 76, 140, 114, 88, 120, 115, 132, 80,
+  128, 133, 124, 92, 138, 82, 121, 86, 116, 145,
+  97, 135, 122, 116, 82, 113, 94, 126, 112, 119,
+  100, 117, 104, 77, 107, 89, 116, 98, 88, 139,
+  106, 113, 94, 88, 105, 105, 119, 83, 76, 128,
+  100, 101, 105, 121, 108, 79, 144, 134, 130, 146,
+  84, 131, 73, 135, 85, 104, 99, 120, 80, 122,
+  106, 94, 119, 107, 120, 101, 110, 135, 89, 100,
+  58, 86, 116, 106, 127, 126, 87, 104, 91, 109,
+  116, 92, 98, 63, 98, 104, 99, 92, 99, 109,
+  125, 121, 93, 109, 139, 166, 89, 124, 113, 82,
+  141, 102, 153, 136, 129, 113, 92, 111, 118, 138,
+  114, 72, 127, 106, 58, 136, 75, 131, 124, 76,
+  155, 91, 123, 89, 132, 103, 122, 111, 68, 86,
+  110, 113, 129, 71, 154, 125, 144, 125, 102, 117,
+  124, 99, 52, 104, 115, 187, 96, 118, 96, 135,
+  126, 124, 105, 117, 133, 114, 121, 104, 93, 120,
+  72, 115, 120, 123, 106, 104, 93, 112, 79, 76,
+  129, 156, 57, 103, 111, 94, 82, 131, 94, 87,
+  119, 111, 95, 123, 71, 133, 104, 95, 123, 98,
+  142, 86, 149, 116, 128, 84, 139, 93, 101, 99,
+  114, 146, 98, 128, 127, 108, 69, 115, 103, 98,
+  104, 145, 99, 109, 88, 78, 87, 96, 130, 90,
+  82, 130, 86, 88, 94, 104, 92, 100, 127, 91,
+  83, 125, 108, 107, 105, 115, 119, 90, 148, 132,
+  144, 141, 96, 138, 43, 145, 103, 95, 95, 129,
+  81, 125, 95, 111, 112, 100, 122, 83, 119, 130,
+  83, 96, 58, 81, 148, 90, 109, 127, 93, 96,
+  87, 139, 100, 93, 101, 53, 90, 102, 107, 90,
+  88, 106, 128, 126, 103, 98, 135, 165, 102, 96,
+  109, 74, 122, 104, 153, 164, 137, 122, 110, 101,
+  99, 141, 118, 58, 113, 99, 49, 145, 61, 139,
+  110, 81, 166, 103, 127, 90, 143, 92, 120, 108,
+  67, 75, 109, 104, 108, 76, 142, 151, 143, 111,
+  107, 117, 116, 102, 62, 69, 109, 201, 93, 117,
+  104, 149, 110, 126, 97, 108, 130, 144, 129, 99,
+  104, 122, 66, 113, 111, 115, 113, 108, 108, 101,
+  110, 74, 129, 152, 42, 101, 138, 118, 83, 150,
+  95, 91, 112, 109, 86, 108, 80, 126, 116, 104,
+  121, 88, 135, 84, 154, 115, 121, 98, 125, 114,
+  106, 111, 109, 138, 96, 122, 124, 107, 74, 124,
+  107, 74, 101, 150, 106, 116, 60, 85, 74, 104,
+  153, 79, 92, 111, 77, 70, 78, 86, 82, 97,
+  122, 80, 101, 129, 114, 104, 102, 117, 109, 125,
+  146, 125, 137, 147, 102, 142, 40, 148, 117, 89,
+  92, 121, 93, 108, 106, 123, 99, 107, 126, 71,
+  123, 116, 67, 108, 62, 79, 158, 70, 96, 132,
+  99, 95, 92, 155, 89, 99, 101, 65, 90, 92,
+  110, 88, 76, 108, 122, 124, 101, 88, 119, 148,
+  99, 74, 88, 68, 100, 92, 141, 166, 131, 127,
+  119, 91, 77, 117, 118, 50, 79, 95, 38, 151,
+  63, 131, 85, 70, 143, 121, 111, 85, 133, 92,
+  105, 103, 86, 58, 95, 81, 102, 108, 124, 155,
+  124, 96, 102, 128, 106, 96, 81, 60, 93, 213,
+  106, 113, 128, 155, 85, 123, 85, 94, 93, 145,
+  140, 100, 124, 134, 67, 91, 94, 118, 107, 108,
+  106, 102, 134, 69, 136, 132, 73, 103, 146, 113,
+  94, 152, 95, 93, 104, 107, 99, 94, 108, 134,
+  114, 95, 136, 87, 113, 91, 138, 117, 102, 95,
+  98, 130, 114, 109, 114, 134, 105, 109, 119, 105,
+  88, 121, 100, 80, 99, 124, 115, 136, 45, 105,
+  57, 109, 169, 108, 96, 79, 65, 62, 75, 84,
+  80, 106, 106, 58, 83, 129, 126, 109, 104, 138,
+  82, 156, 122, 118, 111, 124, 94, 125, 64, 152,
+  99, 93, 107, 99, 114, 84, 111, 116, 98, 101,
+  120, 89, 97, 97, 57, 113, 65, 54, 126, 54,
+  97, 144, 87, 105, 92, 150, 87, 102, 102, 88,
+  90, 84, 99, 85, 64, 110, 121, 105, 114, 81,
+  93, 121, 64, 83, 53, 67, 105, 75, 139, 139,
+  105, 128, 119, 103, 48, 86, 95, 77, 75, 103,
+  31, 115, 89, 110, 69, 47, 108, 98, 89, 77,
+  109, 108, 88, 100, 104, 59, 81, 57, 98, 130,
+  99, 129, 110, 106, 93, 124, 85, 89, 75, 52,
+  87, 166, 110, 108, 112, 124, 88, 103, 71, 95,
+  49, 120, 144, 101, 132, 157, 79, 58, 77, 114,
+  90, 92, 90, 100, 116, 83, 127, 103, 106, 108,
+  132, 88, 105, 121, 82, 98, 94, 100, 130, 81,
+  131, 135, 99, 82, 139, 70, 94, 105, 110, 111,
+  77, 77, 67, 119, 110, 88, 116, 125, 102, 97,
+  106, 115, 92, 101, 81, 102, 97, 85, 111, 142,
+  27, 124, 62, 105, 153, 143, 106, 57, 69, 78,
+  92, 95, 77, 88, 86, 60, 48, 106, 126, 109,
+  109, 141, 49, 158, 98, 114, 85, 104, 69, 94,
+  93, 138, 69, 100, 125, 92, 113, 87, 87, 102,
+  106, 98, 104, 118, 64, 93, 85, 107, 65, 46,
+  83, 58, 115, 136, 81, 101, 83, 135, 94, 75,
+  89, 104, 92, 63, 86, 61, 41, 99, 131, 91,
+  101, 70, 67, 96, 57, 117, 36, 84, 118, 68,
+  132, 106, 96, 128, 115, 125, 36, 72, 66, 116,
+  74, 146, 19, 76, 107, 88, 92, 39, 78, 70,
+  115, 83, 83, 114, 77, 89, 102, 68, 86, 51,
+  105, 113, 84, 98, 94, 115, 98, 125, 47, 92,
+  85, 22, 88, 107, 108, 80, 82, 89, 90, 69,
+  54, 87, 46, 83, 104, 88, 123, 163, 88, 43,
+  73, 114, 91, 66, 76, 82, 101, 112, 111, 85,
+  115, 130, 107, 91, 101, 101, 57, 115, 103, 98,
+  153, 69, 120, 127, 109, 75, 109, 53, 104, 121,
+  105, 97, 56, 49, 56, 119, 107, 105, 114, 101,
+  85, 82, 76, 114, 100, 92, 89, 108, 107, 81,
+  124, 120, 25, 122, 90, 94, 125, 130, 126, 45,
+  66, 79, 109, 123, 67, 81, 81, 81, 36, 96,
+  105, 120, 118, 125, 33, 129, 67, 111, 60, 102,
+  57, 88, 95, 121, 64, 104, 103, 82, 93, 93,
+  80, 109, 102, 111, 95, 131, 49, 96, 115, 89,
+  82, 56, 84, 75, 136, 121, 75, 85, 74, 115,
+  100, 60, 77, 122, 73, 53, 89, 52, 34, 70,
+  154, 73, 95, 61, 68, 93, 88, 112, 43, 106,
+  87, 94, 76, 90, 105, 101, 139, 117, 37, 75,
+  52, 136, 77, 140, 22, 65, 88, 89, 147, 57,
+  89, 71, 105, 91, 79, 111, 71, 62, 83, 81,
+  90, 76, 113, 90, 70, 72, 79, 126, 100, 118,
+  32, 104, 73, 28, 83, 66, 100, 80, 87, 89,
+  83, 56, 61, 80, 70, 84, 69, 92, 112, 128,
+  103, 59, 88, 117, 112, 87, 95, 91, 79, 140,
+  98, 80, 87, 144, 56, 122, 86, 130, 35, 143,
+  114, 88, 141, 58, 82, 144, 130, 87, 79, 49,
+  131, 94, 125, 97, 65, 28, 66, 131, 94, 123,
+  111, 72, 65, 96, 57, 97, 112, 108, 137, 94,
+  112, 110, 143, 108, 25, 103, 110, 91, 89, 105,
+  118, 52, 72, 79, 116, 103, 61, 96, 94, 119,
+  53, 118, 110, 153, 112, 98, 39, 121, 62, 104,
+  57, 116, 69, 96, 75, 105, 107, 83, 55, 98,
+  98, 74, 81, 117, 85, 124, 86, 93, 60, 103,
+  121, 87, 102, 59, 96, 77, 117, 92, 113, 85,
+  85, 111, 88, 75, 94, 123, 78, 64, 103, 75,
+  59, 68, 186, 64, 133, 78, 79, 114, 102, 108,
+  81, 105, 72, 124, 64, 90, 77, 88, 134, 92,
+  72, 86, 66, 121, 104, 58, 42, 84, 53, 115,
+  188, 88, 104, 83, 84, 87, 82, 112, 72, 70,
+  77, 76, 107, 93, 121, 68, 75, 67, 75, 163,
+  95, 121, 64, 152, 61, 70, 79, 79, 106, 132,
+  105, 117, 85, 55, 95, 103, 101, 98, 86, 117,
+  99, 93, 99, 68, 109, 115, 125, 90, 104, 119,
+  70, 134, 87, 73, 73, 124, 50, 121, 73, 172,
+  36, 143, 87, 79, 93, 54, 51, 130, 127, 97,
+  79, 64, 156, 101, 139, 105, 116, 45, 77, 107,
+  83, 90, 113, 79, 60, 128, 63, 77, 113, 121,
+  182, 83, 111, 146, 133, 95, 48, 104, 98, 107,
+  78, 89, 141, 67, 99, 90, 126, 87, 72, 108,
+  105, 177, 98, 119, 119, 168, 103, 74, 83, 131,
+  95, 90, 80, 113, 74, 116, 84, 86, 132, 54,
+  50, 87, 119, 82, 85, 102, 89, 130, 77, 85,
+  82, 96, 129, 110, 96, 100, 98, 85, 92, 75,
+  129, 100, 91, 120, 89, 84, 104, 107, 116, 85,
+  118, 118, 55, 98, 183, 62, 128, 104, 83, 123,
+  118, 130, 95, 123, 70, 135, 111, 110, 76, 98,
+  110, 103, 88, 100, 93, 82, 93, 72, 55, 95,
+  46, 140, 184, 85, 98, 110, 97, 74, 91, 117,
+  65, 104, 81, 69, 109, 97, 123, 78, 79, 99,
+  79, 184, 88, 116, 97, 149, 46, 72, 81, 108,
+  114, 117, 82, 122, 94, 67, 127, 118, 103, 80,
+  106, 114, 107, 100, 105, 82, 136, 97, 125, 82,
+  84, 126, 138, 127, 87, 76, 86, 97, 84, 103,
+  67, 163, 57, 94, 85, 93, 86, 67, 60, 94,
+  109, 96, 94, 82, 179, 123, 149, 122, 149, 93,
+  96, 108, 78, 99, 113, 111, 69, 145, 72, 80,
+  95, 130, 148, 81, 112, 160, 122, 80, 63, 140,
+  71, 126, 78, 94, 177, 68, 115, 104, 131, 133,
+  91, 114, 97, 203, 146, 113, 119, 161, 102, 85,
+  110, 145, 112, 92, 103, 117, 81, 128, 88, 75,
+  136, 69, 65, 89, 119, 119, 97, 83, 111, 125,
+  84, 113, 82, 68, 130, 104, 73, 136, 107, 93,
+  101, 60, 110, 98, 89, 114, 117, 98, 95, 106,
+  152, 95, 107, 141, 54, 102, 157, 55, 126, 114,
+  72, 98, 123, 124, 93, 141, 76, 120, 114, 109,
+  97, 99, 92, 126, 88, 109, 88, 98, 74, 101,
+  59, 95, 92, 161, 156, 80, 94, 135, 110, 68,
+  84, 125, 67, 104, 105, 85, 95, 89, 113, 75,
+  81, 109, 94, 152, 90, 111, 96, 91, 62, 62,
+  83, 112, 93, 76, 78, 146, 104, 77, 101, 106,
+  87, 59, 97, 113, 112, 105, 111, 82, 135, 88,
+  126, 104, 45, 140, 174, 165, 91, 86, 79, 98,
+  111, 108, 80, 141, 57, 83, 108, 92, 121, 56,
+  85, 97, 100, 122, 89, 91, 162, 73, 133, 128,
+  144, 114, 96, 137, 66, 142, 121, 128, 75, 157,
+  74, 80, 81, 158, 113, 72, 120, 137, 137, 98,
+  67, 156, 89, 121, 70, 117, 134, 69, 130, 105,
+  112, 155, 96, 126, 67, 191, 127, 88, 133, 151,
+  103, 92, 96, 151, 113, 94, 85, 121, 82, 134,
+  79, 78, 134, 90, 71, 107, 92, 126, 109, 68,
+  128, 117, 95, 117, 71, 39, 131, 88, 76, 107,
+  103, 113, 119, 56, 151, 86, 101, 92, 163, 99,
+  103, 109, 155, 87, 80, 125, 82, 93, 162, 52,
+  101, 103, 71, 82, 133, 139, 85, 97, 78, 114,
+  92, 114, 109, 86, 90, 112, 96, 99, 57, 127,
+  76, 127, 50, 118, 101, 152, 162, 85, 97, 120,
+  111, 77, 67, 113, 61, 84, 122, 107, 102, 93,
+  108, 78, 86, 84, 83, 135, 92, 106, 70, 122,
+  80, 76, 84, 101, 106, 80, 93, 163, 95, 68,
+  67, 99, 102, 56, 67, 110, 107, 97, 99, 67,
+  136, 100, 129, 97, 57, 132, 105, 162, 88, 94,
+  77, 126, 94, 91, 91, 141, 59, 105, 93, 86,
+  147, 43, 89, 145, 84, 120, 87, 88, 152, 84,
+  117, 124, 140, 103, 86, 101, 91, 155, 125, 102,
+  88, 153, 71, 79, 89, 154, 133, 66, 126, 125,
+  151, 82, 79, 119, 104, 100, 69, 111, 127, 78,
+  128, 81, 112, 136, 81, 112, 59, 173, 77, 82,
+  103, 152, 96, 95, 96, 125, 85, 93, 85, 118,
+  95, 148, 85, 84, 137, 79, 59, 98, 84, 96,
+  103, 78, 128, 143, 102, 131, 69, 37, 131, 103,
+  92, 102, 99, 112, 109, 48, 159, 76, 103, 92,
+  159, 83, 110, 108, 144, 73, 76, 125, 96, 63,
+  185, 69, 118, 95, 91, 110, 138, 101, 105, 80,
+  93, 132, 85, 151, 117, 102, 113, 77, 82, 92,
+  77, 78, 89, 85, 47, 128, 97, 131, 172, 100,
+  131, 101, 82, 113, 80, 95, 93, 100, 82, 104,
+  128, 103, 101, 86, 83, 86, 56, 142, 93, 96,
+  66, 122, 66, 82, 65, 83, 101, 69, 148, 130,
+  76, 69, 100, 85, 160, 139, 87, 118, 109, 89,
+  107, 54, 140, 107, 136, 71, 106, 112, 74, 130,
+  78, 102, 44, 120, 101, 127, 99, 163, 69, 105,
+  68, 93, 118, 47, 69, 148, 63, 92, 116, 108,
+  173, 99, 135, 123, 135, 109, 84, 107, 99, 117,
+  120, 92, 79, 142, 77, 75, 112, 137, 174, 56,
+  115, 111, 145, 74, 79, 100, 108, 93, 111, 55,
+  155, 78, 106, 54, 102, 106, 62, 106, 71, 163,
+  101, 99, 91, 155, 92, 89, 119, 123, 93, 75,
+  94, 107, 108, 157, 59, 118, 174, 43, 55, 84,
+  77, 56, 105, 94, 92, 164, 110, 95, 96, 67,
+  95, 97, 101, 70, 101, 102, 89, 33, 112, 88,
+  105, 127, 115, 81, 107, 85, 133, 62, 99, 143,
+  102, 81, 159, 82, 94, 86, 62, 118, 139, 78,
+  109, 109, 72, 121, 72, 157, 104, 89, 135, 83,
+  68, 86, 76, 56, 84, 92, 36, 106, 81, 95,
+  143, 84, 135, 101, 81, 113, 88, 84, 107, 112,
+  80, 105, 96, 97, 85, 96, 73, 56, 34, 119,
+  79, 79, 63, 87, 53, 81, 70, 85, 78, 135,
+  167, 118, 69, 51, 134, 109, 124, 166, 117, 115,
+  111, 79, 102, 62, 132, 78, 120, 86, 115, 85,
+  97, 106, 68, 94, 59, 107, 91, 135, 108, 144,
+  56, 75, 75, 104, 98, 39, 75, 97, 75, 70,
+  121, 97, 137, 103, 108, 107, 120, 92, 80, 127,
+  95, 82, 121, 107, 101, 131, 71, 97, 140, 106,
+  171, 61, 98, 80, 157, 91, 72, 113, 78, 122,
+  112, 114, 121, 75, 95, 89, 77, 76, 69, 100,
+  101, 126, 122, 80, 98, 153, 96, 79, 120, 144,
+  78, 76, 64, 88, 79, 103, 50, 103, 159, 37,
+  50, 85, 105, 42, 107, 79, 99, 106, 90, 100,
+  102, 66, 68, 96, 97, 82, 59, 89, 71, 36,
+  87, 125, 116, 132, 76, 100, 108, 71, 103, 62,
+  100, 131, 108, 135, 110, 110, 90, 113, 25, 96,
+  150, 92, 99, 134, 51, 118, 54, 152, 84, 93,
+  135, 129, 73, 81, 79, 73, 70, 83, 33, 99,
+  93, 69, 99, 73, 80, 109, 57, 118, 57, 98,
+  105, 142, 95, 127, 99, 100, 87, 132, 45, 77,
+  80, 110, 92, 78, 40, 94, 81, 102, 66, 88,
+  116, 166, 120, 104, 65, 68, 85, 109, 59, 107,
+  92, 94, 110, 98, 111, 91, 119, 72, 107, 89,
+  86, 100, 76, 109, 92, 92, 117, 138, 87, 111,
+  122, 119, 54, 75, 96, 99, 110, 62, 97, 84,
+  102, 78, 108, 68, 86, 96, 91, 99, 126, 90,
+  68, 123, 104, 74, 104, 95, 89, 123, 88, 160,
+  128, 89, 137, 83, 83, 91, 176, 77, 46, 114,
+  140, 158, 112, 137, 124, 64, 136, 128, 73, 86,
+  78, 122, 102, 114, 112, 70, 86, 152, 143, 86,
+  106, 165, 80, 112, 42, 96, 41, 80, 120, 92,
+  135, 77, 87, 94, 121, 73, 102, 83, 108, 85,
+  85, 116, 74, 75, 70, 129, 89, 94, 72, 107,
+  91, 65, 101, 154, 103, 118, 97, 117, 97, 112,
+  58, 81, 98, 82, 135, 143, 80, 107, 99, 139,
+  49, 78, 108, 84, 87, 95, 62, 79, 83, 115,
+  102, 88, 119, 146, 50, 85, 76, 55, 86, 97,
+  38, 77, 110, 46, 64, 60, 91, 83, 83, 89,
+  77, 122, 106, 125, 121, 168, 92, 94, 82, 130,
+  51, 91, 90, 107, 110, 85, 38, 99, 92, 153,
+  78, 108, 128, 99, 82, 82, 120, 83, 79, 110,
+  52, 101, 92, 77, 110, 95, 140, 110, 84, 86,
+  102, 117, 64, 96, 48, 88, 106, 85, 118, 145,
+  76, 92, 102, 85, 72, 83, 89, 83, 91, 83,
+  117, 131, 177, 74, 89, 79, 73, 80, 86, 104,
+  112, 103, 57, 84, 138, 83, 104, 125, 56, 94,
+  88, 181, 115, 70, 82, 103, 77, 84, 131, 88,
+  35, 92, 140, 133, 100, 94, 99, 84, 148, 174,
+  67, 84, 122, 97, 120, 97, 81, 77, 90, 114,
+  143, 99, 81, 132, 80, 98, 52, 91, 45, 63,
+  69, 92, 86, 101, 79, 125, 100, 89, 89, 68,
+  136, 78, 108, 121, 69, 96, 70, 176, 115, 113,
+  56, 105, 141, 100, 90, 157, 88, 105, 96, 110,
+  109, 111, 57, 84, 86, 49, 109, 117, 91, 117,
+  115, 125, 132, 128, 107, 119, 117, 83, 97, 84,
+  115, 111, 106, 72, 110, 125, 87, 91, 120, 71,
+  99, 89, 45, 146, 96, 55, 89, 72, 116, 72,
+  95, 86, 126, 149, 94, 113, 105, 78, 108, 97,
+  112, 126, 91, 88, 100, 140, 126, 119, 89, 95,
+  94, 163, 93, 144, 148, 89, 98, 105, 119, 129,
+  93, 93, 96, 109, 101, 103, 102, 104, 87, 104,
+  82, 138, 130, 82, 82, 97, 58, 81, 143, 80,
+  143, 126, 67, 112, 103, 89, 89, 98, 108, 88,
+  88, 118, 122, 157, 198, 89, 105, 135, 102, 139,
+  100, 125, 112, 114, 83, 56, 152, 110, 122, 159,
+  74, 86, 117, 137, 114, 78, 97, 109, 84, 105,
+  92, 83, 70, 61, 88, 73, 130, 87, 141, 128,
+  112, 114, 101, 89, 173, 113, 136, 81, 83, 99,
+  87, 83, 111, 101, 87, 70, 77, 107, 133, 139,
+  83, 118, 61, 155, 84, 97, 113, 125, 113, 71,
+  83, 103, 130, 54, 123, 112, 90, 134, 83, 169,
+  125, 101, 57, 86, 128, 117, 86, 112, 71, 119,
+  93, 91, 88, 78, 96, 99, 106, 65, 157, 117,
+  112, 128, 160, 111, 164, 157, 120, 109, 147, 115,
+  136, 113, 132, 120, 130, 108, 124, 97, 90, 94,
+  132, 62, 127, 65, 38, 176, 109, 110, 127, 89,
+  121, 86, 88, 82, 126, 154, 108, 126, 104, 54,
+  108, 100, 134, 124, 112, 132, 97, 164, 117, 142,
+  128, 74, 103, 136, 135, 123, 115, 94, 93, 111,
+  105, 126, 107, 68, 123, 127, 125, 106, 111, 134,
+  95, 110, 99, 181, 140, 61, 108, 123, 107, 119,
+  144, 97, 118, 110, 101, 109, 119, 110, 97, 116,
+  110, 130, 94, 121, 133, 100, 121, 122, 123, 150,
+  124, 164, 108, 118, 125, 94, 128, 137, 148, 136,
+  151, 110, 74, 92, 145, 109, 100, 79, 125, 102,
+  123, 114, 89, 98, 83, 76, 126, 95, 146, 80,
+  164, 147, 84, 54, 155, 136, 138, 127, 108, 99,
+  118, 110, 107, 92, 84, 107, 127, 58, 110, 112,
+  150, 141, 113, 153, 69, 161, 111, 97, 132, 91,
+  104, 83, 110, 140, 91, 54, 117, 106, 94, 135,
+  93, 102, 117, 68, 92, 85, 98, 127, 102, 94,
+  79, 131, 75, 89, 62, 109, 107, 112, 113, 89,
+  213, 120, 106, 122, 71, 107, 130, 125, 98, 96,
+  131, 132, 117, 115, 104, 102, 117, 96, 123, 88,
+  88, 83, 137, 99, 115, 112, 63, 134, 175, 130,
+  109, 89, 95, 92, 78, 80, 98, 163, 105, 121,
+  132, 138, 120, 100, 129, 92, 124, 106, 88, 130,
+  92, 112, 137, 109, 90, 144, 161, 90, 131, 139,
+  94, 115, 107, 87, 102, 117, 107, 106, 127, 115,
+  111, 162, 85, 119, 97, 149, 116, 146, 179, 131,
+  153, 147, 126, 74, 124, 94, 121, 90, 155, 119,
+  98, 120, 85, 166, 108, 126, 126, 78, 100, 111,
+  119, 126, 122, 120, 91, 110, 122, 87, 124, 158,
+  122, 142, 148, 75, 78, 99, 120, 104, 106, 88,
+  114, 98, 117, 108, 123, 151, 91, 120, 118, 123,
+  125, 119, 93, 132, 99, 120, 174, 126, 115, 113,
+  108, 101, 104, 112, 121, 111, 95, 97, 114, 86,
+  95, 121, 101, 108, 115, 119, 67, 118, 95, 105,
+  121, 121, 121, 89, 126, 105, 88, 86, 113, 105,
+  84, 110, 112, 102, 105, 118, 102, 88, 87, 108,
+  129, 175, 80, 122, 90, 93, 120, 133, 103, 89,
+  96, 93, 138, 123, 145, 108, 88, 155, 99, 100,
+  94, 117, 93, 112, 93, 153, 108, 104, 121, 132,
+  111, 152, 118, 127, 120, 127, 126, 90, 74, 105,
+  164, 100, 105, 100, 123, 68, 136, 98, 103, 136,
+  91, 95, 144, 114, 114, 121, 115, 104, 89, 98,
+  97, 116, 145, 122, 92, 115, 101, 145, 107, 101,
+  135, 135, 106, 126, 106, 107, 115, 124, 113, 106,
+  103, 126, 118, 99, 128, 119, 117, 103, 121, 132,
+  149, 149, 92, 132, 113, 79, 96, 104, 83, 102,
+  128, 135, 97, 122, 116, 117, 109, 108, 97, 119,
+  101, 132, 112, 100, 131, 81, 117, 145, 135, 98,
+  106, 146, 122, 138, 131, 98, 98, 93, 99, 113,
+  124, 146, 111, 126, 99, 137, 112, 127, 90, 103,
+  105, 124, 108, 137, 91, 105, 92, 135, 132, 80,
+  114, 133, 125, 150, 110, 97, 112, 133, 162, 101,
+  99, 127, 103, 104, 58, 128, 118, 131, 84, 73,
+  107, 95, 99, 104, 103, 121, 145, 87, 100, 106,
+  119, 111, 94, 105, 123, 94, 113, 108, 83, 134,
+  95, 91, 126, 158, 86, 105, 115, 135, 130, 101,
+  125, 88, 81, 129, 104, 105, 176, 105, 128, 139,
+  98, 105, 111, 164, 99, 95, 88, 156, 110, 124,
+  101, 120, 112, 146, 106, 119, 135, 130, 113, 68,
+  55, 110, 57, 90, 134, 102, 123, 112, 120, 77,
+  115, 122, 66, 114, 159, 80, 112, 99, 109, 108,
+  84, 70, 92, 167, 85, 129, 107, 197, 77, 121,
+  82, 124, 136, 127, 86, 116, 99, 117, 107, 111,
+  120, 109, 107, 109, 99, 90, 103, 104, 126, 92,
+  133, 91, 95, 155, 75, 95, 92, 95, 103, 107,
+  84, 118, 117, 153, 94, 108, 111, 103, 97, 82,
+  109, 130, 122, 127, 102, 92, 163, 113, 151, 134,
+  170, 96, 100, 102, 86, 172, 137, 103, 93, 94,
+  93, 112, 113, 152, 104, 114, 109, 157, 87, 110,
+  77, 110, 80, 110, 95, 113, 157, 82, 105, 115,
+  133, 73, 136, 121, 118, 173, 98, 105, 121, 138,
+  149, 94, 116, 135, 110, 105, 109, 157, 116, 141,
+  82, 67, 117, 74, 71, 94, 132, 117, 122, 86,
+  115, 129, 122, 121, 81, 81, 116, 139, 87, 147,
+  104, 120, 76, 104, 100, 101, 87, 108, 106, 119,
+  124, 88, 141, 88, 87, 136, 83, 113, 164, 97,
+  133, 118, 100, 114, 131, 125, 105, 103, 86, 131,
+  108, 139, 111, 127, 110, 114, 118, 88, 109, 83,
+  114, 101, 55, 112, 36, 110, 156, 97, 108, 103,
+  98, 66, 99, 110, 60, 136, 126, 84, 91, 104,
+  110, 124, 82, 129, 78, 193, 89, 132, 116, 135,
+  69, 65, 79, 128, 111, 88, 81, 95, 85, 98,
+  117, 91, 107, 86, 103, 108, 116, 108, 100, 89,
+  114, 90, 132, 70, 82, 126, 80, 95, 98, 92,
+  134, 70, 116, 124, 102, 157, 98, 93, 91, 109,
+  100, 83, 112, 109, 111, 109, 114, 79, 159, 137,
+  161, 122, 160, 101, 107, 170, 75, 110, 115, 113,
+  84, 93, 91, 105, 104, 133, 102, 93, 114, 154,
+  109, 71, 58, 101, 81, 103, 111, 85, 173, 80,
+  98, 85, 121, 155, 110, 111, 82, 174, 111, 98,
+  124, 153, 126, 93, 123, 139, 106, 105, 61, 110,
+  100, 137, 96, 88, 133, 84, 64, 102, 102, 107,
+  81, 105, 102, 118, 130, 132, 86, 71, 91, 125,
+  68, 87, 132, 94, 85, 94, 105, 84, 86, 130,
+  112, 100, 102, 68, 98, 93, 87, 127, 77, 107,
+  163, 68, 78, 103, 86, 97, 119, 139, 84, 82,
+  78, 89, 71, 76, 81, 81, 111, 105, 119, 86,
+  93, 121, 114, 137, 34, 68, 30, 100, 147, 82,
+  126, 83, 120, 52, 87, 107, 66, 107, 110, 113,
+  68, 94, 101, 64, 94, 65, 60, 157, 84, 96,
+  90, 114, 62, 85, 85, 99, 89, 83, 80, 108,
+  104, 52, 118, 116, 80, 72, 84, 96, 96, 76,
+  67, 88, 62, 76, 97, 150, 88, 107, 57, 111,
+  85, 78, 126, 77, 76, 71, 96, 131, 59, 89,
+  104, 97, 92, 79, 108, 100, 122, 94, 86, 58,
+  116, 100, 107, 101, 138, 69, 72, 140, 85, 118,
+  121, 76, 61, 107, 63, 96, 105, 117, 85, 89,
+  109, 122, 112, 87, 46, 93, 80, 104, 64, 103,
+  81, 98, 103, 104, 120, 142, 84, 104, 94, 160,
+  73, 86, 103, 129, 103, 77, 101, 109, 88, 94,
+  30, 91, 78, 85, 50, 67, 98, 72, 39, 121,
+  62, 95, 83, 71, 109, 108, 119, 95, 92, 66,
+  80, 133, 87, 107, 96, 73, 87, 88, 150, 80,
+  80, 136, 82, 86, 83, 58, 57, 70, 93, 108,
+  67, 84, 178, 89, 125, 86, 145, 121, 128, 151,
+  86, 86, 88, 102, 85, 90, 117, 72, 104, 100,
+  131, 111, 96, 105, 111, 79, 40, 93, 66, 107,
+  165, 97, 134, 91, 119, 95, 109, 85, 95, 75,
+  80, 92, 109, 113, 130, 47, 115, 69, 54, 148,
+  96, 89, 93, 143, 69, 83, 84, 97, 110, 90,
+  108, 99, 95, 72, 125, 105, 132, 111, 82, 116,
+  99, 82, 100, 79, 81, 102, 118, 99, 107, 107,
+  104, 97, 92, 84, 89, 91, 62, 88, 97, 145,
+  74, 93, 122, 65, 105, 86, 72, 123, 117, 107,
+  103, 101, 143, 123, 133, 126, 115, 89, 99, 54,
+  104, 113, 115, 75, 75, 111, 74, 84, 101, 115,
+  132, 95, 100, 126, 117, 75, 77, 88, 99, 97,
+  112, 90, 125, 110, 88, 71, 114, 89, 132, 108,
+  106, 145, 90, 120, 108, 116, 88, 96, 108, 94,
+  104, 105, 109, 121, 109, 130, 52, 136, 129, 79,
+  55, 86, 68, 58, 79, 101, 92, 105, 120, 94,
+  117, 107, 95, 106, 85, 101, 114, 76, 90, 85,
+  119, 80, 79, 156, 84, 73, 76, 68, 75, 72,
+  115, 126, 80, 83, 162, 88, 84, 97, 142, 133,
+  137, 132, 118, 105, 91, 108, 93, 99, 112, 77,
+  107, 112, 112, 95, 91, 84, 104, 89, 43, 123,
+  68, 131, 154, 103, 116, 92, 112, 96, 79, 72,
+  93, 79, 80, 93, 102, 120, 139, 63, 137, 82,
+  56, 146, 115, 107, 86, 123, 61, 83, 79, 82,
+  109, 90, 120, 105, 88, 68, 150, 100, 171, 131,
+  100, 122, 104, 78, 89, 59, 107, 120, 135, 76,
+  111, 104, 142, 108, 87, 94, 57, 80, 74, 121,
+  89, 167, 94, 84, 98, 93, 106, 91, 82, 107,
+  75, 121, 101, 125, 172, 115, 131, 134, 121, 83,
+  113, 104, 110, 109, 115, 93, 73, 113, 82, 69,
+  89, 105, 143, 87, 123, 117, 131, 88, 100, 107,
+  107, 89, 105, 117, 134, 90, 84, 65, 105, 89,
+  133, 101, 114, 112, 103, 113, 117, 115, 103, 104,
+  106, 82, 99, 80, 129, 122, 128, 147, 57, 125,
+  124, 77, 55, 61, 79, 72, 89, 98, 81, 93,
+  109, 97, 112, 99, 115, 87, 64, 85, 117, 98,
+  84, 75, 115, 87, 77, 122, 87, 83, 86, 93,
+  89, 72, 121, 148, 115, 114, 125, 83, 85, 104,
+  118, 113, 151, 100, 121, 118, 89, 96, 87, 124,
+  101, 95, 113, 118, 94, 74, 82, 88, 93, 92,
+  54, 126, 75, 127, 122, 105, 92, 84, 75, 81,
+  60, 78, 73, 88, 84, 110, 91, 116, 126, 71,
+  120, 92, 65, 129, 120, 118, 76, 126, 58, 95,
+  75, 77, 121, 83, 121, 112, 83, 79, 129, 106,
+  121, 117, 92, 111, 104, 100, 78, 42, 129, 129,
+  137, 85, 113, 108, 163, 121, 92, 100, 67, 84,
+  85, 132, 92, 159, 90, 104, 88, 133, 95, 90,
+  82, 79, 67, 107, 104, 129, 144, 95, 107, 124,
+  126, 109, 112, 135, 140, 121, 106, 80, 86, 117,
+  102, 75, 87, 97, 134, 79, 119, 93, 152, 73,
+  89, 92, 128, 94, 92, 88, 127, 77, 94, 86,
+  107, 94, 124, 92, 93, 79, 117, 112, 105, 128,
+  110, 103, 102, 87, 98, 95, 102, 129, 110, 134,
+  66, 97, 108, 81, 72, 66, 126, 68, 78, 100,
+  93, 109, 82, 117, 77, 87, 118, 103, 62, 88,
+  100, 100, 81, 89, 111, 126, 83, 87, 91, 82,
+  83, 126, 88, 76, 98, 142, 114, 118, 101, 79,
+  132, 103, 107, 94, 127, 102, 113, 127, 98, 90,
+  92, 122, 123, 95, 97, 124, 104, 68, 85, 83,
+  115, 90, 58, 126, 76, 109, 97, 98, 102, 87,
+  81, 81, 57, 93, 78, 104, 126, 136, 85, 107,
+  123, 60, 96, 103, 87, 105, 125, 130, 71, 122,
+  74, 134, 77, 89, 130, 102, 119, 133, 88, 103,
+  98, 108, 88, 96, 82, 148, 98, 108, 87, 56,
+  155, 119, 137, 118, 90, 100, 123, 118, 101, 104,
+  102, 111, 85, 86, 97, 128, 92, 118, 76, 133,
+  75, 106, 66, 96, 88, 94, 111, 146, 104, 111,
+  89, 140, 117, 118, 110, 111, 165, 133, 118, 84,
+  103, 115, 102, 102, 101, 97, 120, 90, 106, 86,
+  141, 80, 91, 87, 135, 112, 94, 68, 115, 92,
+  141, 107, 118, 123, 122, 102, 92, 69, 129, 127,
+  100, 132, 117, 100, 80, 82, 105, 101, 89, 110,
+  89, 131, 130, 76, 86, 96, 92, 95, 126, 81,
+  82, 87, 110, 120, 92, 143, 67, 93, 99, 119,
+  80, 100, 64, 106, 95, 100, 116, 158, 92, 69,
+  109, 84, 87, 133, 85, 81, 89, 136, 116, 129,
+  113, 96, 81, 108, 119, 97, 94, 135, 117, 108,
+  98, 96, 126, 108, 132, 95, 83, 112, 129, 93,
+  105, 71, 104, 92, 65, 115, 88, 93, 103, 105,
+  147, 103, 103, 93, 75, 103, 95, 107, 133, 117,
+  90, 109, 131, 68, 106, 99, 120, 90, 110, 130,
+  104, 112, 75, 164, 74, 128, 109, 113, 120, 111,
+  116, 122, 99, 101, 96, 112, 103, 138, 90, 90,
+  93, 94, 155, 115, 127, 126, 84, 116, 67, 95,
+  103, 113, 82, 103, 83, 70, 81, 113, 91, 92,
+  88, 96, 78, 127, 55, 116, 117, 91, 127, 151,
+  103, 86, 99, 137, 113, 99, 121, 71, 127, 131,
+  120, 104, 75, 124, 105, 104, 98, 100, 104, 116,
+  105, 79, 100, 107, 112, 82, 106, 110, 100, 79,
+  87, 125, 135, 102, 107, 132, 120, 104, 102, 58,
+  106, 125, 93, 108, 118, 103, 84, 72, 113, 111,
+  115, 98, 91, 121, 97, 85, 73, 103, 99, 119,
+  63, 96, 98, 81, 100, 114, 130, 91, 93, 120,
+  83, 104, 86, 101, 61, 126, 92, 99, 102, 135,
+  84, 69, 100, 102, 91, 87, 90, 77, 87, 132,
+  116, 129, 125, 115, 90, 120, 141, 129, 97, 127,
+  134, 102, 97, 111, 142, 106, 144, 116, 84, 96,
+  143, 118, 108, 74, 109, 85, 57, 142, 82, 99,
+  125, 101, 167, 111, 114, 106, 93, 94, 109, 111,
+  108, 94, 90, 123, 140, 72, 135, 107, 120, 104,
+  107, 138, 125, 122, 77, 135, 87, 142, 95, 111,
+  103, 108, 130, 129, 102, 92, 123, 121, 121, 124,
+  86, 89, 85, 117, 161, 130, 123, 95, 92, 108,
+  78, 81, 115, 135, 45, 103, 95, 109, 70, 125,
+  90, 74, 121, 88, 100, 131, 78, 119, 123, 103,
+  127, 156, 134, 88, 124, 133, 128, 93, 149, 68,
+  119, 112, 119, 113, 79, 132, 112, 99, 85, 94,
+  103, 123, 115, 115, 100, 101, 119, 82, 91, 102,
+  115, 98, 93, 137, 92, 95, 95, 84, 122, 92,
+  111, 66, 91, 127, 95, 97, 107, 125, 113, 63,
+  133, 115, 142, 130, 108, 143, 65, 105, 94, 93,
+  100, 111, 75, 103, 110, 95, 99, 112, 140, 98,
+  113, 130, 93, 98, 65, 88, 100, 124, 78, 102,
+  105, 112, 82, 91, 88, 102, 85, 73, 93, 87,
+  97, 134, 112, 136, 123, 112, 106, 127, 149, 155,
+  113, 119, 138, 103, 107, 121, 139, 116, 130, 132,
+  99, 91, 150, 124, 107, 82, 115, 91, 59, 143,
+  80, 121, 137, 89, 150, 82, 116, 100, 104, 88,
+  112, 115, 90, 87, 99, 126, 143, 63, 162, 122,
+  101, 123, 109, 133, 119, 114, 70, 100, 98, 125,
+  110, 111, 88, 117, 112, 111, 89, 102, 145, 119,
+  126, 123, 80, 81, 66, 110, 142, 139, 113, 89,
+  100, 111, 110, 97, 114, 137, 58, 108, 114, 112,
+  78, 141, 89, 83, 116, 109, 101, 126, 82, 127,
+  100, 106, 132, 143, 159, 93, 137, 128, 127, 86,
+  158, 97, 120, 121, 121, 103, 100, 144, 116, 89,
+  72, 99, 116, 110, 122, 144, 116, 105, 108, 92,
+  105, 106, 123, 118, 100, 134, 69, 75, 109, 96,
+  121, 92, 116, 83, 74, 133, 112, 110, 108, 125,
+  123, 63, 147, 118, 147, 147, 124, 158, 56, 116,
+  113, 90, 100, 112, 92, 112, 107, 108, 87, 102,
+  146, 87, 110, 120, 107, 98, 64, 79, 122, 115,
+  70, 114, 109, 100, 77, 107, 90, 107, 85, 84,
+  94, 96, 106, 128, 108, 132, 124, 112, 96, 121,
+  134, 159, 128, 108, 131, 88, 108, 116, 124, 127,
+  115, 131, 121, 96, 131, 118, 90, 72, 111, 89,
+  52, 129, 72, 136, 131, 78, 132, 69, 111, 86,
+  116, 84, 103, 115, 77, 95, 94, 118, 139, 59,
+  174, 123, 90, 137, 106, 127, 106, 121, 57, 78,
+  100, 122, 115, 130, 80, 118, 93, 98, 94, 105,
+  133, 119, 126, 108, 71, 88, 43, 97, 117, 126,
+  108, 96, 114, 120, 122, 95, 103, 122, 51, 97,
+  115, 108, 77, 160, 88, 91, 96, 128, 90, 111,
+  66, 109, 100, 102, 136, 116, 162, 99, 135, 120,
+  119, 85, 158, 111, 132, 139, 117, 78, 90, 138,
+  115, 82, 69, 97, 115, 86, 128, 153, 130, 110,
+  88, 88, 105, 102, 118, 110, 102, 109, 68, 79,
+  113, 108, 116, 88, 115, 86, 77, 132, 120, 123,
+  107, 117, 117, 79, 143, 114, 154, 133, 123, 150,
+  34, 106, 108, 80, 98, 131, 92, 122, 98, 124,
+  81, 99, 130, 89, 99, 100, 122, 105, 76, 77,
+  123, 108, 73, 126, 111, 105, 80, 124, 79, 113,
+  87, 112, 81, 98, 112, 120, 87, 131, 110, 116,
+  94, 117, 132, 142, 118, 79, 119, 87, 109, 121,
+  113, 134, 117, 142, 122, 115, 121, 120, 84, 62,
+  107, 89, 40, 131, 75, 124, 105, 77, 116, 61,
+  110, 76, 107, 82, 99, 111, 76, 103, 99, 100,
+  119, 64, 169, 136, 96, 134, 96, 118, 93, 150,
+  61, 85, 100, 123, 104, 130, 65, 128, 99, 98,
+  106, 104, 114, 105, 129, 132, 76, 110, 48, 99,
+  116, 109, 110, 108, 113, 110, 116, 80, 97, 120,
+  48, 104, 118, 123, 83, 162, 94, 93, 90, 134,
+  84, 90, 62, 95, 107, 98, 137, 99, 135, 99,
+  108, 147, 111, 92, 147, 104, 171, 144, 110, 73,
+  92, 120, 120, 92, 74, 86, 96, 68, 126, 144,
+  127, 110, 72, 78, 98, 99, 118, 79, 98, 98,
+  91, 106, 114, 87, 106, 84, 115, 68, 101, 138,
+  114, 112, 102, 114, 107, 113, 132, 108, 139, 143,
+  112, 148, 44, 93, 93, 81, 105, 144, 108, 116,
+  90, 121, 89, 98, 119, 105, 96, 67, 113, 125,
+  76, 78, 128, 106, 78, 133, 102, 135, 78, 128,
+  79, 102, 82, 136, 80, 94, 112, 113, 71, 133,
+  107, 118, 115, 107, 131, 139, 86, 72, 105, 87,
+  112, 115, 128, 152, 125, 156, 102, 130, 110, 111,
+  90, 50, 122, 89, 32, 160, 91, 117, 83, 74,
+  117, 90, 113, 82, 99, 75, 101, 108, 96, 85,
+  96, 80, 104, 80, 144, 139, 96, 115, 93, 113,
+  106, 138, 74, 101, 106, 152, 104, 119, 92, 157,
+  108, 114, 107, 107, 95, 98, 135, 174, 94, 138,
+  57, 92, 124, 112, 112, 115, 104, 110, 121, 67,
+  106, 115, 64, 114, 143, 98, 89, 155, 101, 88,
+  93, 128, 85, 80, 73, 121, 94, 96, 152, 111,
+  93, 104, 97, 164, 90, 91, 125, 103, 189, 134,
+  114, 101, 123, 107, 125, 111, 90, 91, 89, 74,
+  127, 131, 120, 122, 59, 84, 85, 112, 131, 61,
+  90, 84, 85, 100, 97, 72, 77, 96, 104, 52,
+  103, 133, 101, 106, 102, 116, 98, 148, 119, 109,
+  115, 144, 97, 147, 75, 99, 77, 88, 126, 132,
+  109, 88, 89, 102, 99, 90, 122, 132, 88, 44,
+  87, 121, 62, 71, 114, 97, 87, 143, 97, 151,
+  85, 127, 94, 87, 76, 130, 86, 96, 102, 110,
+  71, 125, 112, 126, 98, 99, 113, 138, 55, 81,
+  74, 63, 100, 94, 147, 164, 109, 155, 97, 113,
+  69, 93, 107, 48, 100, 85, 27, 147, 104, 112,
+  65, 71, 137, 108, 79, 93, 112, 84, 97, 111,
+  112, 63, 87, 68, 95, 113, 102, 137, 113, 102,
+  86, 116, 133, 102, 62, 88, 95, 194, 106, 114,
+  127, 148, 109, 129, 92, 106, 71, 120, 144, 146,
+  115, 147, 76, 87, 109, 107, 108, 96, 89, 131,
+  112, 65, 116, 109, 89, 113, 160, 83, 96, 139,
+  99, 66, 89, 106, 101, 89, 96, 150, 88, 97,
+  161, 97, 78, 95, 110, 137, 77, 86, 99, 96,
+  126, 107, 110, 132, 105, 103, 119, 119, 96, 113,
+  70, 94, 110, 115, 111, 153, 32, 100, 65, 129,
+  151, 94, 89, 72, 71, 89, 84, 84, 49, 103,
+  81, 43, 75, 112, 111, 104, 103, 115, 87, 163,
+  98, 108, 92, 108, 71, 114, 73, 122, 71, 86,
+  137, 108, 99, 73, 89, 87, 98, 97, 113, 103,
+  82, 63, 73, 115, 42, 54, 92, 81, 93, 140,
+  86, 131, 84, 134, 99, 72, 82, 107, 101, 80,
+  88, 100, 53, 122, 122, 119, 102, 92, 80, 112,
+  35, 89, 41, 44, 106, 72, 177, 147, 104, 149,
+  107, 105, 45, 73, 103, 74, 73, 119, 18, 105,
+  110, 80, 63, 47, 116, 73, 79, 86, 110, 99,
+  88, 106, 124, 80, 76, 52, 91, 110, 77, 126,
+  107, 102, 73, 119, 116, 80, 69, 47, 92, 187,
+  102, 100, 120, 113, 102, 109, 72, 102, 46, 114,
+  142, 102, 136, 153, 89, 71, 76, 98, 92, 77,
+  74, 116, 80, 76, 124, 94, 129, 108, 161, 100,
+  102, 110, 73, 70, 83, 98, 124, 89, 122, 141,
+  109, 79, 139, 71, 77, 115, 106, 109, 65, 74,
+  70, 129, 86, 120, 105, 140, 96, 91, 90, 116,
+  99, 112, 63, 105, 92, 98, 110, 149, 20, 116,
+  68, 132, 146, 132, 114, 62, 67, 67, 92, 124,
+  51, 87, 73, 61, 56, 99, 118, 104, 110, 106,
+  59, 155, 80, 105, 53, 73, 50, 93, 84, 133,
+  51, 90, 115, 83, 104, 84, 73, 88, 104, 109,
+  114, 108, 75, 89, 98, 99, 57, 51, 88, 92,
+  109, 126, 66, 106, 68, 133, 107, 53, 92, 97,
+  79, 50, 83, 72, 28, 105, 130, 102, 96, 70,
+  57, 80, 29, 105, 28, 72, 105, 76, 156, 95,
+  103, 128, 127, 114, 44, 77, 81, 109, 71, 177,
+  5, 56, 95, 44, 89, 34, 80, 63, 123, 86,
+  97, 109, 77, 67, 118, 92, 75, 43, 92, 99,
+  66, 83, 87, 109, 72, 102, 62, 75, 81, 22,
+  90, 113, 83, 83, 94, 93, 105, 60, 73, 96,
+  37, 84, 103, 90, 147, 154, 94, 66, 71, 101,
+  85, 107, 78, 76, 66, 101, 101, 87, 124, 112,
+  101, 98, 93, 103, 40, 100, 110, 92, 135, 65,
+  122, 121, 122, 71, 107, 41, 92, 90, 95, 99,
+  51, 41, 56, 153, 92, 126, 108, 102, 81, 84,
+  55, 100, 110, 98, 83, 108, 98, 87, 120, 125,
+  11, 114, 87, 106, 103, 140, 119, 54, 57, 71,
+  99, 124, 65, 73, 93, 94, 43, 110, 118, 116,
+  107, 92, 27, 148, 61, 101, 37, 91, 39, 91,
+  74, 102, 63, 95, 63, 77, 97, 95, 55, 80,
+  82, 121, 127, 112, 68, 90, 131, 81, 83, 62,
+  91, 96, 116, 113, 84, 90, 67, 116, 86, 62,
+  100, 106, 62, 42, 95, 53, 32, 66, 149, 92,
+  79, 71, 65, 93, 69, 128, 61, 109, 80, 105,
+  77, 84, 74, 83, 148, 108, 53, 75, 85, 154,
+  86, 107, 22, 52, 63, 67, 139, 73, 84, 62,
+  108, 83, 78, 115, 67, 43, 88, 72, 102, 61,
+  110, 89, 59, 51, 85, 138, 80, 95, 48, 132,
+  73, 46, 87, 69, 104, 111, 92, 89, 84, 43,
+  92, 118, 74, 88, 61, 89, 116, 123, 90, 69,
+  81, 112, 105, 100, 98, 97, 60, 111, 82, 89,
+  87, 120, 44, 102, 85, 138, 32, 143, 110, 86,
+  110, 44, 98, 111, 125, 95, 76, 44, 130, 70,
+  121, 101, 81, 29, 64, 82, 89, 88, 108, 69,
+  40, 98, 57, 83, 120, 108, 148, 92, 115, 114,
+  139, 95, 29, 93, 87, 97, 79, 125, 128, 59,
+  72, 97, 117, 66, 70, 92, 104, 131, 52, 106,
+  116, 147, 104, 74, 52, 149, 65, 98, 73, 110,
+  54, 92, 62, 81, 104, 76, 47, 80, 111, 87,
+  68, 87, 63, 129, 103, 78, 70, 82, 129, 91,
+  90, 100, 87, 76, 91, 93, 116, 94, 76, 115,
+  72, 70, 99, 85, 98, 62, 115, 69, 43, 69,
+  154, 82, 136, 86, 90, 126, 109, 113, 97, 133,
+  85, 147, 102, 132, 76, 81, 112, 96, 75, 103,
+  103, 105, 101, 66, 48, 94, 58, 107, 206, 90,
+  97, 82, 79, 69, 90, 104, 68, 97, 76, 66,
+  123, 96, 131, 92, 62, 91, 87, 188, 76, 120,
+  92, 155, 50, 62, 69, 91, 133, 107, 91, 111,
+  85, 71, 104, 132, 125, 93, 90, 116, 111, 94,
+  98, 73, 127, 107, 135, 64, 84, 116, 95, 100,
+  81, 85, 105, 117, 57, 118, 96, 164, 59, 130,
+  66, 104, 77, 57, 67, 105, 110, 102, 71, 72,
+  170, 137, 178, 126, 132, 93, 94, 86, 84, 100,
+  109, 109, 64, 109, 77, 92, 111, 114, 199, 83,
+  115, 172, 128, 72, 64, 120, 78, 123, 96, 79,
+  201, 72, 114, 81, 122, 102, 93, 109, 101, 186,
+  144, 106, 125, 191, 122, 86, 100, 157, 105, 94,
+  119, 112, 78, 125, 116, 91, 162, 80, 66, 80,
+  132, 118, 88, 112, 96, 129, 86, 124, 85, 63,
+  124, 88, 94, 117, 108, 105, 86, 65, 100, 95,
+  87, 108, 100, 81, 96, 76, 160, 104, 119, 122,
+  70, 103, 136, 79, 123, 115, 77, 115, 122, 105,
+  98, 141, 89, 149, 135, 127, 116, 100, 97, 107,
+  95, 136, 120, 66, 97, 90, 52, 106, 95, 119,
+  196, 94, 116, 132, 90, 62, 88, 118, 77, 130,
+  101, 83, 96, 111, 129, 87, 67, 126, 91, 171,
+  89, 128, 102, 90, 75, 53, 60, 108, 95, 83,
+  86, 152, 96, 78, 104, 108, 124, 71, 95, 125,
+  109, 71, 96, 108, 143, 100, 148, 92, 39, 133,
+  143, 152, 91, 74, 88, 101, 92, 120, 102, 140,
+  58, 94, 66, 109, 100, 62, 78, 91, 90, 136,
+  71, 73, 165, 92, 164, 137, 150, 134, 96, 169,
+  83, 166, 120, 109, 73, 121, 92, 94, 105, 154,
+  181, 80, 114, 157, 126, 101, 73, 161, 92, 132,
+  84, 87, 152, 86, 135, 71, 103, 153, 86, 130,
+  77, 190, 158, 81, 142, 192, 145, 86, 104, 163,
+  113, 93, 98, 99, 90, 135, 78, 80, 167, 93,
+  56, 114, 105, 154, 120, 122, 115, 124, 125, 119,
+  81, 48, 115, 85, 120, 84, 97, 147, 88, 51,
+  144, 86, 98, 89, 136, 107, 104, 64, 177, 103,
+  92, 134, 107, 115, 145, 75, 115, 115, 59, 89,
+  131, 151, 83, 81, 85, 133, 121, 104, 122, 88,
+  108, 116, 95, 123, 80, 119, 92, 99, 39, 111,
+  103, 109, 169, 94, 102, 155, 130, 67, 75, 121,
+  75, 99, 143, 115, 93, 99, 116, 87, 69, 98,
+  80, 138, 99, 120, 60, 136, 103, 56, 81, 92,
+  100, 97, 106, 169, 72, 55, 83, 101, 105, 45,
+  84, 116, 108, 78, 98, 96, 133, 104, 139, 107,
+  44, 132, 101, 173, 93, 70, 96, 126, 98, 97,
+  111, 130, 45, 98, 96, 111, 147, 42, 96, 125,
+  79, 128, 72, 52, 142, 88, 112, 124, 155, 97,
+  78, 147, 89, 142, 131, 97, 111, 117, 83, 83,
+  123, 148, 186, 94, 97, 125, 142, 96, 86, 153,
+  111, 99, 64, 142, 118, 92, 112, 54, 99, 111,
+  82, 121, 85, 176, 85, 63, 118, 175, 136, 84,
+  86, 142, 80, 88, 76, 125, 87, 130, 94, 71,
+  142, 86, 42, 108, 92, 137, 121, 120, 119, 120,
+  139, 132, 71, 50, 127, 106, 139, 104, 77, 163,
+  94, 57, 163, 71, 102, 79, 133, 101, 103, 78,
+  149, 88, 77, 118, 109, 85, 157, 72, 98, 97,
+  72, 102, 156, 136, 93, 73, 79, 120, 75, 139,
+  113, 97, 137, 91, 63, 90, 63, 105, 90, 108,
+  34, 108, 102, 122, 165, 93, 78, 97, 106, 97,
+  64, 101, 76, 85, 112, 107, 117, 85, 107, 112,
+  56, 94, 57, 122, 82, 95, 34, 149, 79, 64,
+  63, 69, 99, 76, 154, 121, 70, 40, 99, 95,
+  134, 109, 95, 109, 114, 109, 129, 49, 127, 118,
+  126, 93, 96, 110, 97, 136, 71, 82, 65, 121,
+  83, 113, 100, 150, 36, 137, 101, 117, 138, 37,
+  78, 131, 81, 81, 87, 62, 158, 98, 109, 115,
+  146, 74, 68, 118, 105, 91, 108, 77, 90, 105,
+  82, 89, 137, 102, 194, 79, 105, 91, 147, 70,
+  65, 99, 118, 76, 84, 84, 152, 62, 87, 90,
+  106, 92, 75, 84, 82, 150, 95, 89, 97, 187,
+  102, 96, 101, 150, 66, 90, 77, 135, 85, 126,
+  79, 100, 161, 63, 49, 92, 74, 65, 91, 94,
+  69, 143, 94, 115, 77, 51, 106, 98, 126, 84,
+  91, 115, 88, 60, 102, 99, 104, 108, 100, 91,
+  99, 103, 111, 74, 90, 106, 89, 74, 140, 69,
+  112, 62, 61, 111, 149, 82, 109, 128, 63, 104,
+  51, 147, 103, 90, 119, 100, 50, 73, 46, 62,
+  83, 88, 34, 102, 103, 94, 138, 91, 72, 88,
+  57, 110, 57, 92, 87, 104, 104, 113, 87, 74,
+  100, 115, 57, 70, 54, 109, 79, 83, 30, 107,
+  57, 77, 59, 78, 94, 120, 176, 122, 87, 61,
+  116, 113, 110, 121, 96, 119, 118, 109, 117, 55,
+  113, 101, 116, 103, 106, 82, 96, 102, 75, 93,
+  79, 93, 64, 114, 115, 130, 30, 133, 87, 99,
+  93, 38, 81, 100, 107, 63, 101, 80, 120, 93,
+  97, 116, 114, 83, 67, 111, 120, 88, 108, 93,
+  102, 91, 74, 115, 155, 79, 164, 67, 103, 76,
+  153, 59, 59, 92, 92, 89, 105, 77, 126, 48,
+  121, 150, 80, 94, 63, 63, 89, 117, 109, 84,
+  96, 185, 93, 88, 88, 164, 72, 94, 56, 93,
+  58, 94, 79, 99, 129, 58, 65, 90, 104, 26,
+  73, 81, 99, 113, 57, 142, 76, 46, 71, 118,
+  110, 87, 68, 78, 90, 73, 97, 155, 112, 122,
+  91, 90, 103, 118, 76, 84, 97, 91, 96, 121,
+  109, 82, 98, 95, 48, 111, 106, 87, 103, 122,
+  73, 102, 89, 122, 79, 77, 92, 146, 68, 76,
+  81, 50, 95, 81, 38, 109, 124, 51, 82, 82,
+  89, 120, 48, 106, 77, 125, 77, 117, 122, 128,
+  83, 81, 97, 112, 50, 70, 100, 122, 96, 101,
+  51, 94, 95, 136, 71, 107, 135, 147, 128, 108,
+  107, 102, 93, 105, 72, 92, 95, 122, 103, 82,
+  98, 97, 88, 108, 111, 117, 73, 87, 56, 82,
+  103, 92, 117, 107, 41, 85, 117, 99, 48, 113,
+  101, 87, 74, 81, 92, 99, 148, 73, 118, 97,
+  83, 87, 95, 122, 97, 99, 49, 97, 149, 95,
+  99, 126, 99, 85, 88, 159, 132, 79, 108, 97,
+  82, 83, 129, 78, 45, 83, 99, 133, 101, 98,
+  116, 72, 148, 163, 66, 93, 94, 94, 109, 108,
+  91, 89, 76, 142, 128, 93, 69, 141, 76, 107,
+  66, 102, 34, 71, 103, 96, 78, 92, 102, 124,
+  119, 63, 59, 84, 132, 90, 83, 136, 68, 73,
+  62, 168, 111, 131, 37, 91, 107, 94, 106, 173,
+  85, 101, 102, 92, 90, 121, 52, 92, 95, 76,
+  122, 142, 92, 106, 94, 135, 105, 120, 89, 104,
+  104, 75, 85, 87, 128, 109, 100, 76, 89, 142,
+  82, 85, 106, 53, 85, 93, 47, 117, 124, 44,
+  76, 73, 118, 93, 78, 86, 114, 137, 82, 109,
+  111, 100, 92, 86, 108, 111, 77, 99, 106, 150,
+  103, 123, 98, 95, 82, 170, 81, 135, 123, 103,
+  108, 104, 141, 141, 102, 95, 84, 104, 117, 94,
+  102, 75, 118, 112, 83, 123, 117, 94, 77, 100,
+  44, 72, 124, 85, 131, 130, 69, 100, 98, 89,
+  86, 91, 107, 76, 83, 119, 113, 104, 194, 82,
+  110, 127, 93, 105, 108, 111, 121, 110, 63, 74,
+  154, 86, 107, 169, 72, 83, 121, 160, 121, 85,
+  87, 104, 78, 96, 96, 93, 63, 59, 75, 125,
+  113, 78, 112, 117, 112, 132, 93, 92, 167, 109,
+  127, 84, 80, 107, 65, 100, 122, 104, 79, 84,
+  80, 100, 104, 121, 64, 81, 52, 130, 72, 96,
+  123, 126, 117, 78, 60, 89, 136, 72, 133, 112,
+  78, 120, 63, 159, 113, 106, 45, 79, 120, 116,
+  104, 126, 71, 107, 88, 93, 88, 80, 81, 100,
+  97, 73, 127, 129, 97, 126, 175, 114, 163, 160,
+  108, 120, 140, 85, 124, 101, 126, 119, 117, 95,
+  109, 112, 86, 87, 123, 72, 135, 70, 46, 160,
+  89, 93, 116, 88, 120, 68, 114, 76, 129, 148,
+  105, 115, 102, 58, 98, 100, 133, 122, 110, 124,
+  96, 172, 110, 139, 130, 88, 85, 135, 124, 123,
+  122, 91, 101, 114, 116, 146, 97, 83, 111, 112,
+  117, 105, 114, 112, 90, 98, 95, 158, 140, 65,
+  102, 117, 78, 102, 153, 101, 131, 120, 91, 108,
+  83, 96, 93, 102, 111, 123, 83, 133, 129, 118,
+  167, 112, 94, 142, 106, 168, 110, 116, 131, 81,
+  102, 111, 151, 120, 126, 127, 92, 88, 144, 130,
+  115, 79, 119, 104, 120, 117, 92, 85, 79, 68,
+  109, 88, 140, 81, 152, 140, 73, 58, 151, 132,
+  154, 119, 124, 88, 92, 114, 91, 94, 95, 102,
+  120, 56, 106, 110, 149, 128, 101, 127, 66, 165,
+  95, 94, 129, 105, 102, 82, 77, 132, 107, 63,
+  137, 114, 84, 136, 91, 105, 113, 83, 83, 65,
+  103, 127, 113, 85, 77, 132, 77, 87, 64, 99,
+  101, 117, 116, 73, 200, 127, 100, 139, 105, 100,
+  124, 149, 96, 104, 147, 123, 114, 114, 103, 109,
+  114, 122, 118, 78, 65, 84, 121, 48, 111, 80,
+  38, 143, 122, 129, 121, 82, 82, 75, 107, 79,
+  107, 147, 105, 99, 102, 95, 82, 87, 129, 117,
+  119, 136, 97, 169, 79, 116, 136, 90, 91, 138,
+  163, 100, 108, 123, 77, 95, 106, 101, 113, 105,
+  87, 97, 125, 90, 123, 166, 108, 109, 99, 161,
+  126, 89, 119, 145, 121, 102, 123, 101, 128, 92,
+  87, 81, 116, 109, 85, 116, 94, 178, 85, 113,
+  124, 69, 94, 106, 120, 110, 112, 140, 104, 93,
+  120, 59, 119, 149, 127, 115, 143, 79, 83, 98,
+  140, 125, 88, 49, 109, 93, 154, 115, 96, 130,
+  69, 75, 134, 112, 108, 80, 129, 127, 78, 91,
+  183, 162, 93, 107, 98, 94, 117, 115, 118, 112,
+  82, 103, 136, 90, 87, 111, 112, 108, 98, 112,
+  52, 106, 90, 101, 126, 97, 84, 107, 86, 117,
+  71, 70, 103, 100, 70, 90, 98, 73, 102, 71,
+  99, 88, 82, 133, 101, 146, 84, 126, 74, 81,
+  92, 136, 92, 101, 109, 63, 178, 113, 99, 118,
+  94, 100, 93, 122, 68, 103, 127, 121, 112, 116,
+  116, 119, 94, 81, 106, 85, 69, 84, 140, 86,
+  109, 107, 74, 126, 206, 117, 105, 82, 92, 103,
+  70, 92, 125, 146, 103, 93, 147, 144, 115, 89,
+  117, 68, 115, 103, 105, 134, 70, 110, 144, 127,
+  94, 149, 148, 113, 140, 129, 110, 102, 127, 87,
+  99, 149, 92, 103, 145, 106, 104, 180, 86, 115,
+  90, 122, 106, 174, 182, 120, 145, 109, 120, 63,
+  142, 85, 113, 80, 164, 122, 88, 121, 78, 154,
+  108, 113, 137, 58, 102, 92, 116, 108, 101, 101,
+  121, 94, 123, 97, 108, 128, 104, 143, 136, 102,
+  91, 97, 121, 119, 88, 65, 92, 97, 111, 137,
+  112, 175, 77, 118, 98, 136, 121, 101, 84, 104,
+  113, 132, 130, 110, 131, 89, 109, 112, 97, 129,
+  149, 137, 109, 94, 115, 131, 94, 119, 86, 114,
+  87, 79, 83, 96, 80, 118, 132, 138, 124, 121,
+  115, 93, 105, 85, 96, 146, 70, 70, 116, 106,
+  93, 126, 116, 114, 88, 122, 99, 203, 102, 112,
+  120, 88, 144, 128, 90, 100, 87, 71, 104, 118,
+  153, 106, 97, 143, 109, 121, 98, 125, 114, 90,
+  112, 135, 107, 99, 124, 140, 117, 143, 128, 120,
+  135, 127, 127, 104, 80, 96, 140, 90, 101, 107,
+  137, 76, 135, 108, 126, 154, 104, 79, 132, 103,
+  118, 103, 109, 95, 106, 82, 91, 117, 152, 105,
+  87, 121, 92, 140, 107, 117, 130, 146, 113, 112,
+  117, 98, 124, 121, 129, 132, 109, 120, 122, 107,
+  119, 119, 118, 115, 121, 131, 141, 133, 87, 117,
+  115, 80, 82, 106, 88, 112, 116, 129, 97, 116,
+  121, 106, 108, 107, 103, 120, 102, 120, 129, 110,
+  135, 91, 114, 135, 135, 105, 105, 119, 120, 115,
+  134, 115, 84, 94, 104, 91, 119, 138, 111, 122,
+  93, 115, 98, 118, 92, 115, 89, 109, 126, 130,
+  96, 126, 95, 137, 130, 76, 124, 124, 136, 147,
+  103, 107, 108, 108, 134, 106, 108, 101, 108, 95,
+  76, 109, 113, 124, 61, 81, 101, 93, 90, 102,
+  90, 104, 144, 80, 101, 101, 119, 94, 109, 123,
+  123, 96, 116, 112, 69, 123, 115, 106, 104, 126,
+  87, 124, 106, 119, 129, 84, 111, 83, 84, 111,
+  94, 102, 180, 107, 118, 130, 96, 116, 125, 160,
+  124, 113, 98, 138, 91, 120, 100, 110, 119, 132,
+  113, 106, 125, 140, 123, 73, 59, 92, 34, 95,
+  128, 99, 108, 99, 123, 71, 114, 130, 66, 104,
+  132, 70, 111, 92, 105, 122, 104, 59, 75, 174,
+  102, 111, 92, 167, 58, 105, 88, 124, 140, 144,
+  85, 104, 94, 109, 118, 114, 119, 117, 105, 96,
+  105, 98, 94, 98, 117, 104, 129, 88, 103, 139,
+  95, 87, 97, 97, 100, 97, 78, 126, 104, 154,
+  92, 105, 129, 107, 98, 85, 102, 122, 119, 114,
+  108, 100, 156, 131, 142, 125, 159, 84, 102, 108,
+  87, 135, 136, 92, 71, 96, 90, 92, 111, 123,
+  105, 101, 108, 151, 95, 86, 75, 117, 70, 109,
+  102, 132, 155, 85, 111, 120, 130, 65, 147, 107,
+  125, 175, 100, 93, 115, 125, 130, 99, 120, 120,
+  116, 95, 114, 148, 114, 135, 83, 65, 114, 71,
+  62, 84, 138, 110, 117, 87, 120, 99, 99, 118,
+  91, 86, 112, 113, 86, 148, 94, 108, 88, 113,
+  93, 83, 87, 124, 94, 110, 114, 86, 119, 89,
+  89, 112, 91, 116, 158, 98, 160, 119, 96, 109,
+  145, 123, 116, 114, 87, 133, 99, 138, 115, 122,
+  108, 117, 126, 86, 106, 71, 121, 94, 62, 105,
+  32, 118, 152, 99, 92, 108, 99, 63, 97, 117,
+  67, 127, 125, 83, 94, 104, 112, 124, 87, 138,
+  72, 206, 99, 132, 102, 117, 65, 64, 85, 130,
+  119, 87, 78, 102, 85, 90, 111, 99, 101, 79,
+  109, 113, 116, 115, 91, 99, 104, 95, 130, 76,
+  85, 117, 94, 97, 108, 83, 125, 67, 111, 124,
+  107, 162, 96, 89, 93, 107, 93, 76, 108, 106,
+  106, 105, 118, 76, 158, 131, 165, 127, 157, 102,
+  106, 176, 73, 110, 118, 98, 82, 99, 92, 107,
+  104, 132, 104, 89, 111, 162, 112, 63, 65, 103,
+  83, 111, 117, 74, 176, 76, 110, 79, 130, 167,
+  109, 109, 82, 193, 126, 89, 129, 154, 125, 93,
+  132, 148, 122, 104, 59, 111, 99, 143, 106, 85,
+  131, 83, 64, 94, 105, 110, 87, 109, 117, 97,
+  115, 146, 89, 67, 94, 110, 74, 77, 141, 90,
+  91, 95, 112, 78, 83, 134, 110, 103, 89, 78,
+  90, 97, 96, 112, 83, 110, 159, 68, 73, 107,
+  80, 87, 121, 138, 93, 79, 64, 91, 64, 70,
+  75, 73, 109, 116, 116, 87, 83, 111, 114, 142,
+  40, 66, 25, 108, 147, 81, 105, 87, 117, 53,
+  88, 119, 63, 103, 113, 112, 66, 94, 99, 73,
+  91, 76, 61, 164, 84, 104, 88, 114, 56, 80,
+  88, 96, 88, 79, 81, 106, 103, 54, 110, 115,
+  68, 68, 92, 95, 93, 87, 72, 87, 55, 78,
+  97, 152, 92, 105, 64, 112, 86, 72, 120, 72,
+  74, 76, 84, 134, 55, 85, 103, 102, 89, 74,
+  109, 98, 119, 88, 88, 56, 121, 84, 107, 109,
+  152, 66, 72, 143, 76, 112, 123, 80, 62, 106,
+  62, 100, 100, 113, 82, 92, 105, 126, 107, 86,
+  48, 92, 78, 101, 60, 101, 88, 94, 95, 100,
+  124, 150, 84, 103, 96, 169, 81, 85, 107, 129,
+  102, 79, 106, 118, 98, 95, 27, 92, 79, 86,
+  53, 52, 96, 71, 37, 116, 59, 100, 86, 66,
+  108, 99, 120, 108, 89, 65, 89, 133, 87, 107,
+  98, 70, 88, 89, 150, 79, 77, 130, 76, 93,
+  76, 75, 57, 74, 103, 99, 71, 91, 175, 84,
+  131, 87, 137, 115, 132, 143, 101, 88, 83, 108,
+  74, 91, 108, 75, 114, 111, 135, 111, 88, 106,
+  109, 82, 48, 106, 70, 115, 167, 100, 108, 82,
+  109, 109, 110, 106, 88, 77, 83, 101, 121, 121,
+  129, 73, 104, 74, 54, 148, 97, 92, 93, 144,
+  66, 78, 86, 95, 110, 81, 121, 93, 92, 77,
+  125, 106, 127, 118, 84, 134, 98, 103, 109, 72,
+  83, 116, 124, 106, 102, 108, 118, 100, 92, 78,
+  89, 89, 64, 95, 91, 148, 73, 95, 121, 76,
+  112, 82, 72, 109, 108, 97, 110, 103, 145, 129,
+  126, 136, 129, 100, 103, 47, 99, 110, 115, 80,
+  84, 112, 77, 88, 96, 100, 131, 92, 103, 118,
+  117, 78, 78, 92, 101, 97, 114, 95, 144, 108,
+  83, 79, 120, 90, 139, 113, 107, 154, 113, 113,
+  105, 110, 83, 96, 119, 101, 98, 112, 106, 117,
+  106, 136, 64, 125, 125, 77, 62, 91, 77, 54,
+  88, 98, 90, 99, 108, 100, 120, 102, 105, 110,
+  89, 94, 111, 85, 94, 91, 116, 86, 79, 145,
+  80, 73, 67, 90, 70, 79, 117, 118, 82, 89,
+  152, 74, 89, 97, 119, 122, 143, 119, 122, 119,
+  91, 104, 83, 107, 109, 95, 112, 124, 108, 92,
+  86, 90, 95, 88, 49, 119, 74, 131, 145, 100,
+  101, 91, 97, 108, 78, 98, 79, 85, 82, 104,
+  103, 130, 132, 90, 108, 83, 66, 123, 114, 106,
+  89, 117, 63, 93, 86, 83, 105, 100, 132, 87,
+  90, 81, 171, 118, 142, 142, 98, 134, 106, 101,
+  99, 56, 110, 129, 133, 78, 96, 103, 153, 110,
+  84, 85, 67, 75, 75, 124, 91, 154, 83, 94,
+  97, 118, 99, 93, 89, 94, 66, 108, 106, 118,
+  150, 124, 115, 143, 128, 103, 109, 115, 106, 101,
+  110, 95, 67, 111, 79, 78, 98, 85, 123, 86,
+  142, 91, 132, 104, 82, 109, 102, 99, 106, 127,
+  149, 94, 98, 98, 104, 84, 130, 103, 113, 107,
+  133, 107, 109, 115, 98, 106, 114, 94, 83, 96,
+  108, 109, 110, 131, 64, 106, 109, 80, 65, 73,
+  92, 68, 98, 94, 85, 87, 90, 112, 112, 94,
+  113, 93, 73, 82, 95, 110, 99, 86, 107, 110,
+  84, 118, 82, 82, 80, 113, 81, 89, 110, 134,
+  107, 112, 111, 55, 114, 101, 79, 89, 140, 93,
+  110, 132, 87, 87, 93, 112, 108, 89, 96, 132,
+  86, 67, 91, 86, 78, 95, 59, 93, 87, 122,
+  109, 87, 87, 104, 67, 84, 54, 107, 68, 88,
+  126, 112, 85, 118, 119, 84, 87, 92, 90, 110,
+  117, 116, 81, 126, 64, 103, 87, 77, 127, 116,
+  116, 99, 87, 91, 136, 134, 70, 87, 91, 120,
+  107, 129, 81, 53, 135, 114, 126, 94, 84, 100,
+  180, 117, 91, 82, 100, 74, 87, 121, 106, 128,
+  79, 108, 106, 143, 91, 96, 97, 85, 75, 103,
+  93, 109, 103, 101, 93, 117, 116, 143, 102, 132,
+  125, 138, 99, 92, 86, 116, 89, 89, 104, 78,
+  96, 83, 128, 71, 145, 87, 68, 94, 114, 99,
+  86, 107, 129, 86, 128, 114, 101, 98, 119, 91,
+  86, 84, 130, 103, 111, 133, 110, 93, 91, 104,
+  92, 109, 69, 125, 77, 100, 115, 68, 77, 106,
+  78, 89, 137, 87, 89, 85, 124, 98, 83, 173,
+  65, 77, 126, 111, 67, 102, 69, 125, 110, 98,
+  117, 143, 92, 87, 110, 74, 86, 134, 71, 111,
+  74, 119, 108, 127, 101, 62, 107, 91, 100, 82,
+  122, 128, 101, 112, 86, 83, 97, 112, 130, 83,
+  91, 114, 99, 80, 114, 109, 82, 90, 68, 105,
+  77, 115, 99, 85, 116, 117, 109, 74, 70, 122,
+  90, 81, 172, 126, 84, 108, 121, 67, 82, 97,
+  108, 95, 125, 124, 90, 134, 83, 130, 89, 116,
+  132, 88, 105, 116, 91, 104, 95, 106, 81, 94,
+  82, 134, 91, 108, 73, 72, 140, 110, 132, 121,
+  71, 123, 120, 116, 103, 87, 120, 98, 75, 80,
+  100, 99, 83, 128, 102, 106, 98, 113, 93, 124,
+  117, 109, 96, 130, 97, 111, 94, 111, 104, 140,
+  100, 94, 115, 150, 109, 106, 76, 123, 96, 92,
+  99, 102, 94, 100, 111, 72, 121, 111, 83, 93,
+  122, 92, 98, 87, 93, 113, 143, 102, 121, 125,
+  123, 106, 87, 77, 95, 114, 123, 119, 116, 80,
+  83, 77, 97, 103, 83, 123, 78, 108, 124, 82,
+  81, 130, 85, 129, 82, 85, 98, 70, 123, 122,
+  120, 125, 68, 95, 120, 116, 88, 119, 45, 112,
+  105, 102, 117, 140, 95, 81, 133, 81, 97, 106,
+  82, 95, 68, 113, 116, 110, 130, 84, 93, 86,
+  149, 123, 136, 141, 113, 97, 85, 96, 112, 113,
+  127, 94, 98, 88, 125, 101, 110, 90, 101, 88,
+  75, 142, 74, 100, 120, 101, 144, 106, 117, 93,
+  100, 101, 93, 97, 114, 90, 94, 109, 130, 83,
+  112, 97, 96, 117, 128, 138, 102, 123, 70, 133,
+  73, 129, 109, 97, 114, 91, 116, 115, 108, 85,
+  124, 140, 103, 108, 84, 97, 86, 88, 131, 116,
+  140, 97, 104, 118, 81, 89, 99, 103, 68, 90,
+  71, 91, 82, 128, 92, 106, 97, 92, 98, 115,
+  67, 133, 136, 106, 119, 154, 140, 91, 118, 115,
+  108, 104, 127, 74, 123, 106, 117, 107, 55, 131,
+  108, 75, 87, 100, 105, 107, 121, 93, 114, 92,
+  111, 77, 95, 83, 118, 65, 101, 130, 104, 92,
+  111, 112, 128, 93, 96, 66, 86, 112, 106, 109,
+  101, 104, 90, 60, 114, 97, 132, 124, 112, 140,
+  71, 103, 106, 103, 90, 116, 37, 81, 96, 88,
+  102, 117, 131, 96, 109, 121, 108, 88, 79, 102,
+  84, 98, 95, 103, 100, 110, 87, 94, 117, 97,
+  87, 82, 98, 95, 86, 135, 110, 97, 140, 101,
+  84, 106, 156, 136, 146, 124, 133, 110, 91, 118,
+  111, 110, 128, 106, 102, 89, 131, 111, 100, 84,
+  116, 88, 58, 163, 84, 113, 138, 96, 126, 86,
+  98, 104, 96, 91, 93, 110, 80, 75, 92, 120,
+  141, 71, 151, 108, 78, 143, 124, 140, 95, 106,
+  74, 107, 79, 110, 98, 103, 90, 98, 115, 103,
+  101, 78, 132, 133, 116, 111, 77, 98, 82, 103,
+  136, 140, 128, 88, 114, 107, 104, 94, 115, 121,
+  42, 82, 83, 109, 74, 147, 87, 83, 114, 111,
+  95, 104, 79, 104, 113, 113, 117, 161, 169, 91,
+  125, 135, 120, 101, 146, 98, 133, 112, 116, 93,
+  86, 137, 103, 77, 75, 91, 119, 88, 125, 126,
+  120, 82, 113, 85, 103, 96, 114, 89, 108, 117,
+  74, 77, 106, 98, 125, 95, 109, 80, 88, 129,
+  109, 106, 97, 119, 111, 63, 122, 105, 143, 142,
+  126, 167, 57, 102, 119, 83, 91, 104, 81, 95,
+  99, 113, 99, 113, 126, 99, 118, 119, 106, 93,
+  66, 75, 115, 96, 82, 94, 118, 108, 79, 103,
+  95, 99, 76, 100, 89, 99, 104, 144, 124, 120,
+  134, 103, 89, 119, 136, 129, 140, 95, 122, 114,
+  112, 119, 111, 111, 125, 111, 113, 105, 127, 103,
+  90, 70, 109, 85, 53, 138, 89, 113, 126, 84,
+  116, 79, 90, 97, 96, 92, 93, 112, 78, 88,
+  85, 116, 146, 62, 158, 112, 84, 144, 118, 144,
+  88, 106, 73, 101, 99, 96, 110, 115, 80, 102,
+  102, 100, 92, 101, 90, 115, 109, 109, 72, 110,
+  64, 92, 119, 139, 109, 100, 115, 110, 113, 100,
+  120, 118, 67, 91, 106, 101, 80, 143, 75, 88,
+  93, 142, 87, 100, 84, 94, 83, 106, 132, 128,
+  158, 89, 112, 143, 115, 97, 147, 117, 149, 131,
+  120, 84, 106, 137, 101, 87, 74, 89, 118, 87,
+  126, 132, 132, 104, 86, 80, 120, 111, 116, 85,
+  101, 108, 76, 82, 121, 111, 118, 94, 105, 83,
+  79, 141, 112, 121, 99, 115, 100, 84, 128, 113,
+  124, 137, 116, 147, 54, 98, 106, 83, 97, 108,
+  91, 100, 100, 124, 93, 104, 117, 109, 92, 105,
+  106, 104, 77, 59, 111, 103, 92, 102, 127, 131,
+  80, 115, 87, 106, 77, 132, 77, 102, 100, 125,
+  108, 115, 129, 94, 94, 117, 116, 119, 103, 82,
+  99, 100, 115, 109, 107, 110, 116, 100, 114, 118,
+  114, 95, 86, 67, 116, 84, 46, 110, 98, 101,
+  105, 68, 109, 74, 102, 87, 94, 88, 98, 101,
+  82, 105, 77, 101, 141, 53, 151, 98, 89, 145,
+  111, 135, 85, 144, 68, 100, 103, 89, 112, 138,
+  67, 94, 103, 101, 101, 112, 63, 94, 98, 118,
+  65, 123, 62, 89, 102, 118, 98, 104, 108, 113,
+  107, 81, 106, 116, 81, 88, 95, 84, 81, 125,
+  75, 97, 85, 140, 90, 93, 77, 84, 88, 87,
+  130, 103, 126, 76, 100, 152, 102, 91, 135, 96,
+  160, 135, 118, 77, 97, 127, 97, 100, 74, 88,
+  100, 96, 121, 126, 128, 122, 60, 70, 116, 104,
+  103, 85, 85, 91, 92, 100, 122, 112, 113, 91,
+  105, 82, 88, 141, 124, 128, 102, 102, 82, 106,
+  133, 113, 111, 116, 91, 113, 50, 80, 87, 81,
+  103, 123, 94, 112, 86, 109, 102, 106, 109, 111,
+  71, 88, 108, 119, 83, 76, 88, 101, 106, 103,
+  115, 145, 85, 124, 88, 91, 89, 137, 64, 98,
+  98, 110, 78, 127, 116, 92, 94, 122, 129, 127,
+  79, 92, 87, 104, 114, 113, 115, 125, 102, 105,
+  101, 124, 123, 107, 96, 68, 123, 91, 47, 123,
+  97, 88, 102, 68, 110, 63, 121, 84, 98, 84,
+  102, 94, 85, 107, 77, 100, 128, 55, 142, 106,
+  101, 151, 104, 132, 103, 160, 68, 108, 100, 110,
+  102, 126, 68, 105, 109, 103, 102, 113, 68, 91,
+  106, 155, 66, 125, 64, 96, 98, 103, 101, 104,
+  104, 120, 104, 56, 98, 123, 101, 94, 89, 96,
+  86, 124, 86, 94, 101, 118, 93, 92, 79, 82,
+  100, 82, 134, 99, 103, 90, 96, 140, 95, 88,
+  122, 75, 153, 120, 114, 103, 103, 118, 111, 104,
+  70, 72, 92, 95, 102, 129, 117, 124, 53, 53,
+  92, 95, 104, 70, 82, 97, 89, 98, 116, 103,
+  124, 95, 111, 71, 92, 150, 125, 118, 103, 98,
+  88, 127, 133, 110, 109, 137, 81, 102, 57, 73,
+  90, 90, 123, 131, 97, 114, 91, 94, 103, 104,
+  103, 119, 78, 61, 102, 126, 67, 85, 101, 107,
+  103, 108, 91, 147, 89, 116, 104, 89, 90, 113,
+  66, 96, 100, 117, 70, 127, 113, 92, 84, 124,
+  149, 147, 80, 113, 93, 107, 102, 117, 109, 148,
+  106, 129, 79, 119, 122, 116, 101, 73, 110, 86,
+  40, 158, 97, 112, 100, 73, 129, 57, 125, 92,
+  102, 74, 101, 102, 84, 99, 86, 108, 117, 69,
+  133, 124, 109, 141, 107, 127, 123, 137, 63, 105,
+  105, 152, 95, 102, 92, 139, 101, 115, 102, 109,
+  93, 100, 112, 175, 74, 114, 63, 97, 111, 106,
+  108, 109, 104, 138, 113, 65, 97, 133, 103, 118,
+  107, 94, 98, 146, 102, 78, 105, 107, 84, 91,
+  76, 115, 91, 101, 149, 117, 96, 100, 110, 127,
+  94, 85, 117, 84, 147, 125, 115, 124, 111, 116,
+  126, 104, 78, 84, 85, 92, 101, 142, 109, 118,
+  52, 54, 71, 106, 110, 64, 77, 99, 60, 80,
+  115, 97, 97, 113, 100, 52, 87, 140, 119, 111,
+  108, 101, 99, 135, 119, 114, 117, 143, 88, 122,
+  68, 88, 89, 90, 148, 127, 89, 90, 99, 88,
+  97, 101, 100, 100, 98, 36, 86, 110, 53, 73,
+  113, 93, 81, 117, 91, 143, 90, 117, 118, 89,
+  85, 86, 73, 107, 103, 138, 66, 106, 118, 95,
+  84, 109, 155, 168, 92, 110, 92, 94, 87, 116,
+  116, 173, 105, 145, 66, 108, 95, 117, 100, 69,
+  112, 82, 38, 172, 102, 134, 95, 82, 161, 81,
+  95, 108, 117, 68, 108, 116, 90, 71, 94, 111,
+  104, 93, 108, 132, 110, 122, 116, 115, 124, 116,
+  55, 85, 102, 191, 89, 103, 116, 143, 104, 124,
+  108, 101, 125, 135, 126, 144, 98, 112, 63, 104,
+  120, 103, 126, 103, 104, 142, 113, 79, 95, 134,
+  71, 123, 134, 111, 101, 173, 117, 72, 89, 103,
+  87, 90, 62, 145, 90, 113, 164, 120, 111, 99,
+  135, 120, 92, 94, 116, 89, 127, 132, 110, 132,
+  84, 111, 126, 105, 92, 111, 75, 80, 104, 148,
+  99, 115, 43, 70, 55, 114, 140, 62, 87, 90,
+  62, 76, 100, 76, 63, 118, 86, 41, 92, 111,
+  108, 104, 99, 105, 99, 145, 103, 108, 122, 125,
+  94, 145, 50, 129, 101, 77, 144, 107, 89, 61,
+  84, 92, 94, 95, 93, 74, 120, 38, 68, 105,
+  50, 54, 125, 62, 73, 126, 89, 126, 87, 137,
+  124, 80, 78, 72, 74, 108, 109, 147, 47, 108,
+  124, 103, 103, 88, 131, 157, 98, 73, 77, 59,
+  88, 97, 154, 182, 102, 158, 82, 101, 82, 93,
+  90, 58, 116, 91, 34, 154, 102, 129, 85, 86,
+  148, 98, 70, 112, 124, 73, 115, 117, 103, 60,
+  84, 92, 99, 109, 92, 138, 102, 105, 102, 113,
+  122, 79, 61, 53, 97, 221, 86, 116, 147, 137,
+  95, 125, 92, 95, 109, 144, 133, 106, 135, 119,
+  76, 94, 98, 93, 116, 90, 99, 123, 87, 78,
+  116, 116, 101, 109, 182, 125, 105, 162, 107, 58,
+  77, 99, 98, 93, 73, 128, 104, 100, 162, 99,
+  106, 131, 140, 123, 86, 91, 101, 132, 99, 99,
+  110, 157, 86, 103, 104, 106, 106, 129, 67, 73,
+  96, 136, 104, 111, 30, 111, 51, 124, 160, 89,
+  114, 82, 68, 53, 90, 108, 52, 102, 78, 51,
+  101, 93, 110, 105, 90, 97, 93, 162, 87, 114,
+  81, 83, 82, 140, 71, 162, 99, 74, 126, 86,
+  102, 52, 66, 97, 97, 92, 105, 81, 121, 58,
+  62, 110, 53, 45, 122, 46, 85, 125, 87, 101,
+  88, 145, 126, 57, 81, 64, 67, 91, 104, 124,
+  44, 119, 117, 100, 94, 83, 80, 107, 74, 73,
+  47, 44, 99, 85, 173, 136, 92, 149, 101, 104,
+  63, 73, 86, 63, 109, 160, 15, 92, 100, 90,
+  79, 59, 95, 96, 96, 102, 129, 99, 100, 79,
+  113, 68, 62, 57, 92, 108, 72, 97, 85, 108,
+  83, 84, 100, 58, 66, 44, 88, 174, 81, 123,
+  132, 111, 106, 84, 93, 109, 56, 107, 131, 98,
+  174, 143, 80, 79, 80, 89, 85, 103, 86, 97,
+  80, 79, 119, 90, 141, 86, 145, 102, 108, 129,
+  68, 57, 92, 93, 112, 83, 122, 113, 104, 85,
+  139, 54, 91, 115, 103, 120, 72, 58, 75, 162,
+  91, 93, 106, 154, 86, 92, 70, 101, 107, 106,
+  67, 84, 79, 101, 106, 114, 11, 131, 51, 110,
+  126, 138, 119, 67, 60, 61, 94, 151, 60, 75,
+  88, 81, 90, 104, 116, 108, 91, 78, 64, 175,
+  72, 113, 39, 65, 45, 97, 81, 128, 71, 83,
+  96, 68, 106, 74, 54, 72, 95, 93, 117, 125,
+  97, 65, 88, 93, 59, 71, 107, 67, 109, 118,
+  84, 99, 85, 129, 114, 49, 92, 61, 48, 66,
+  93, 90, 27, 97, 117, 88, 67, 89, 53, 88,
+  65, 130, 40, 78, 90, 100, 111, 87, 68, 99,
+  136, 111, 60, 69, 89, 128, 92, 177, 8, 47,
+  84, 60, 109, 60, 61, 72, 127, 83, 102, 115,
+  73, 53, 111, 60, 82, 40, 104, 105, 56, 34,
+  66, 125, 94, 82, 53, 97, 74, 33, 78, 90,
+  104, 107, 84, 79, 114, 47, 111, 129, 50, 78,
+  92, 89, 155, 156, 78, 83, 69, 83, 85, 105,
+  86, 63, 77, 89, 91, 81, 124, 111, 50, 83,
+  103, 118, 37, 100, 109, 88, 138, 47, 146, 111,
+  110, 81, 100, 38, 101, 72, 104, 114, 71, 33,
+  62, 98, 110, 94, 109, 98, 58, 90, 53, 89,
+  113, 77, 92, 88, 99, 97, 121, 97, 16, 100,
+  70, 88, 84, 152, 122, 57, 59, 100, 98, 95,
+  78, 75, 106, 104, 47, 96, 112, 131, 109, 71,
+  55, 167, 61, 103, 53, 103, 39, 68, 60, 68,
+  82, 88, 60, 70, 114, 96, 54, 75, 88, 102,
+  99, 133, 67, 60, 126, 82, 77, 115, 98, 76,
+  100, 112, 92, 87, 72, 108, 79, 60, 86, 66,
+  64, 58, 99, 68, 32, 60, 126, 86, 103, 94,
+  72, 122, 128, 131, 76, 106, 79, 147, 75, 134,
+  67, 74, 162, 97, 60, 94, 92, 140, 97, 89,
+  26, 86, 76, 90, 192, 93, 75, 62, 92, 75,
+  98, 112, 67, 100, 87, 53, 116, 76, 141, 110,
+  44, 81, 62, 163, 105, 131, 56, 122, 75, 27,
+  78, 81, 145, 88, 90, 79, 68, 60, 101, 121,
+  110, 89, 84, 107, 116, 123, 106, 79, 103, 104,
+  123, 71, 90, 91, 83, 99, 85, 85, 126, 133,
+  37, 114, 112, 159, 52, 160, 83, 111, 126, 58,
+  117, 107, 120, 95, 75, 58, 154, 120, 188, 119,
+  106, 72, 83, 87, 85, 92, 110, 85, 66, 99,
+  81, 93, 121, 81, 197, 85, 94, 162, 129, 69,
+  45, 96, 95, 94, 96, 105, 184, 66, 81, 70,
+  134, 96, 106, 106, 114, 150, 109, 94, 123, 215,
+  145, 80, 89, 167, 84, 113, 111, 120, 67, 99,
+  128, 86, 168, 89, 73, 90, 130, 97, 73, 134,
+  84, 105, 82, 115, 77, 70, 118, 72, 121, 109,
+  110, 82, 71, 90, 89, 88, 80, 102, 88, 73,
+  73, 67, 114, 85, 113, 99, 86, 86, 128, 107,
+  110, 117, 60, 123, 149, 92, 90, 111, 73, 161,
+  95, 132, 97, 97, 173, 99, 76, 125, 106, 61,
+  93, 101, 31, 106, 82, 83, 197, 99, 99, 90,
+  73, 75, 103, 110, 73, 158, 93, 92, 92, 95,
+  140, 97, 48, 147, 59, 152, 110, 151, 61, 91,
+  82, 50, 72, 81, 112, 100, 94, 112, 103, 52,
+  98, 98, 126, 86, 111, 127, 99, 103, 117, 115,
+  133, 108, 151, 93, 58, 97, 109, 139, 88, 69,
+  98, 98, 67, 124, 101, 154, 47, 136, 49, 128,
+  106, 70, 78, 73, 105, 114, 81, 59, 153, 103,
+  177, 117, 142, 107, 87, 171, 95, 117, 111, 75,
+  77, 110, 110, 102, 119, 104, 216, 82, 80, 159,
+  127, 98, 58, 132, 123, 115, 86, 79, 157, 91,
+  116, 83, 126, 149, 85, 107, 124, 170, 172, 89,
+  135, 227, 163, 88, 103, 156, 95, 113, 87, 98,
+  87, 111, 107, 72, 176, 88, 72, 119, 108, 131,
+  105, 151, 101, 99, 102, 115, 78, 76, 108, 90,
+  151, 76, 109, 127, 60, 71, 96, 118, 87, 83,
+  91, 106, 92, 89, 132, 81, 100, 121, 109, 111,
+  117, 140, 120, 119, 43, 96, 117, 126, 75, 86,
+  56, 128, 136, 93, 112, 115, 196, 136, 69, 114,
+  99, 66, 77, 85, 21, 87, 75, 53, 128, 87,
+  84, 144, 105, 76, 84, 129, 75, 116, 122, 110,
+  92, 66, 114, 91, 52, 127, 85, 101, 101, 129,
+  33, 147, 103, 78, 96, 77, 101, 134, 91, 118,
+  86, 44, 95, 108, 82, 59, 111, 108, 112, 122,
+  98, 105, 113, 104, 137, 112, 54, 88, 140, 143,
+  89, 70, 88, 95, 110, 85, 91, 121, 36, 112,
+  87, 146, 109, 64, 82, 81, 98, 113, 100, 28,
+  121, 81, 105, 112, 147, 88, 69, 152, 102, 90,
+  120, 76, 90, 101, 104, 87, 131, 123, 169, 108,
+  77, 109, 134, 123, 64, 156, 103, 113, 61, 107,
+  116, 95, 108, 106, 106, 87, 69, 83, 141, 147,
+  122, 76, 114, 172, 148, 97, 67, 138, 70, 109,
+  56, 107, 67, 94, 89, 67, 108, 96, 56, 113,
+  97, 133, 111, 118, 104, 92, 123, 124, 62, 90,
+  114, 116, 158, 82, 83, 146, 92, 87, 100, 134,
+  92, 75, 94, 102, 107, 115, 120, 60, 84, 90,
+  104, 92, 107, 112, 111, 104, 56, 76, 108, 131,
+  66, 90, 49, 97, 119, 110, 114, 120, 150, 145,
+  46, 77, 73, 89, 48, 125, 23, 85, 107, 69,
+  88, 61, 43, 94, 108, 106, 64, 116, 73, 94,
+  138, 96, 118, 43, 94, 129, 46, 115, 111, 80,
+  78, 99, 15, 172, 92, 89, 84, 84, 109, 114,
+  112, 82, 92, 45, 85, 125, 78, 64, 105, 101,
+  128, 176, 119, 52, 110, 101, 113, 90, 69, 70,
+  146, 102, 84, 85, 89, 119, 106, 82, 86, 112,
+  36, 137, 124, 138, 135, 52, 91, 133, 99, 81,
+  92, 36, 122, 81, 87, 121, 129, 70, 70, 113,
+  108, 87, 97, 102, 77, 74, 78, 104, 125, 102,
+  123, 117, 91, 80, 142, 120, 47, 112, 72, 86,
+  74, 110, 142, 36, 111, 146, 79, 70, 92, 59,
+  118, 122, 81, 89, 110, 170, 122, 113, 49, 158,
+  66, 117, 44, 135, 56, 90, 94, 84, 84, 102,
+  82, 101, 83, 99, 78, 62, 85, 105, 89, 164,
+  55, 66, 117, 102, 116, 78, 94, 138, 148, 104,
+  49, 163, 97, 86, 118, 100, 119, 147, 92, 66,
+  87, 73, 85, 70, 107, 69, 113, 64, 47, 81,
+  94, 106, 80, 126, 50, 74, 77, 119, 98, 92,
+  114, 134, 40, 51, 54, 95, 74, 135, 27, 63,
+  96, 87, 88, 75, 56, 85, 70, 105, 53, 122,
+  85, 108, 151, 108, 90, 50, 95, 131, 51, 76,
+  123, 86, 106, 97, 20, 126, 88, 90, 65, 88,
+  110, 106, 126, 94, 90, 76, 103, 115, 64, 75,
+  67, 113, 119, 145, 101, 53, 84, 102, 101, 104,
+  81, 87, 87, 97, 99, 90, 112, 103, 54, 91,
+  96, 94, 38, 171, 134, 99, 112, 59, 117, 144,
+  141, 93, 65, 52, 91, 73, 84, 113, 95, 88,
+  54, 94, 93, 128, 98, 98, 65, 63, 67, 116,
+  140, 82, 97, 100, 101, 69, 124, 95, 37, 88,
+  76, 72, 85, 106, 113, 31, 138, 169, 79, 92,
+  83, 73, 86, 100, 62, 88, 111, 159, 119, 80,
+  38, 166, 77, 118, 44, 124, 37, 66, 97, 88,
+  70, 105, 84, 122, 89, 61, 65, 65, 109, 115,
+  70, 144, 44, 57, 99, 136, 105, 106, 78, 89,
+  154, 123, 74, 172, 97, 101, 120, 92, 109, 147,
+  57, 91, 91, 60, 94, 93, 119, 63, 88, 91,
+  93, 116, 100, 123, 100, 95, 67, 91, 71, 117,
+  90, 64, 85, 117, 78, 72, 87, 91, 98, 92,
+  34, 122, 107, 83, 93, 94, 114, 112, 66, 104,
+  109, 139, 78, 103, 126, 93, 99, 90, 105, 114,
+  68, 69, 130, 132, 142, 127, 79, 111, 107, 147,
+  73, 126, 136, 104, 120, 92, 107, 126, 110, 97,
+  91, 101, 86, 126, 99, 93, 97, 92, 81, 134,
+  126, 117, 78, 115, 46, 87, 134, 86, 151, 100,
+  21, 104, 103, 90, 64, 150, 138, 81, 96, 104,
+  114, 144, 185, 114, 99, 114, 92, 105, 114, 112,
+  77, 130, 59, 63, 114, 91, 100, 126, 68, 75,
+  97, 128, 134, 80, 109, 115, 81, 86, 90, 102,
+  55, 72, 72, 75, 105, 84, 113, 94, 128, 138,
+  104, 97, 118, 114, 105, 87, 90, 107, 90, 119,
+  117, 87, 63, 102, 72, 111, 107, 125, 60, 86,
+  79, 122, 72, 103, 110, 135, 98, 71, 78, 108,
+  145, 102, 94, 114, 63, 104, 88, 167, 122, 142,
+  47, 77, 123, 136, 87, 152, 76, 112, 110, 100,
+  105, 100, 68, 112, 101, 84, 112, 114, 114, 98,
+  173, 107, 161, 161, 117, 118, 128, 79, 116, 114,
+  108, 122, 112, 82, 93, 100, 105, 91, 117, 56,
+  143, 68, 42, 163, 109, 95, 122, 99, 140, 105,
+  81, 97, 147, 136, 106, 117, 103, 42, 94, 102,
+  130, 118, 102, 110, 102, 183, 139, 155, 128, 87,
+  84, 141, 95, 127, 111, 106, 113, 111, 119, 150,
+  113, 76, 117, 129, 122, 106, 107, 101, 98, 113,
+  99, 155, 148, 63, 94, 122, 78, 93, 159, 93,
+  141, 104, 60, 124, 101, 111, 95, 113, 111, 99,
+  89, 127, 110, 130, 166, 131, 108, 150, 119, 146,
+  133, 117, 109, 111, 97, 92, 135, 98, 119, 123,
+  71, 87, 144, 126, 131, 87, 128, 103, 108, 111,
+  89, 92, 79, 57, 83, 88, 143, 68, 142, 141,
+  90, 61, 137, 123, 146, 122, 103, 83, 105, 116,
+  101, 106, 87, 105, 105, 59, 114, 102, 156, 129,
+  100, 139, 59, 158, 102, 92, 129, 102, 97, 81,
+  94, 137, 119, 83, 110, 123, 82, 135, 89, 111,
+  118, 73, 82, 69, 105, 145, 105, 91, 75, 134,
+  88, 99, 63, 85, 106, 139, 116, 95, 170, 124,
+  109, 124, 101, 102, 137, 151, 103, 117, 139, 110,
+  107, 115, 89, 100, 110, 106, 120, 84, 78, 87,
+  120, 58, 122, 95, 32, 132, 88, 124, 119, 89,
+  96, 81, 115, 70, 115, 133, 115, 105, 108, 78,
+  67, 94, 138, 108, 125, 138, 89, 181, 97, 124,
+  128, 99, 88, 121, 133, 91, 102, 125, 79, 103,
+  99, 107, 114, 95, 85, 94, 109, 88, 125, 141,
+  87, 104, 94, 152, 134, 83, 105, 144, 116, 106,
+  144, 94, 132, 87, 63, 94, 98, 107, 80, 103,
+  99, 156, 95, 122, 110, 95, 116, 116, 104, 116,
+  107, 146, 103, 100, 118, 62, 108, 136, 117, 111,
+  128, 66, 76, 96, 135, 116, 105, 62, 117, 91,
+  143, 106, 108, 112, 68, 78, 126, 107, 115, 91,
+  110, 131, 80, 77, 188, 166, 92, 111, 102, 84,
+  98, 113, 118, 109, 81, 92, 132, 83, 94, 107,
+  117, 108, 88, 114, 49, 122, 92, 90, 112, 100,
+  81, 102, 87, 119, 80, 80, 116, 91, 64, 106,
+  93, 76, 102, 68, 98, 68, 85, 140, 111, 118,
+  79, 138, 68, 84, 78, 117, 95, 109, 107, 64,
+  174, 121, 97, 128, 126, 107, 80, 134, 75, 122,
+  123, 128, 106, 117, 98, 117, 99, 114, 103, 86,
+  56, 85, 116, 39, 102, 85, 41, 128, 131, 115,
+  105, 73, 77, 96, 123, 88, 128, 113, 111, 74,
+  116, 122, 74, 77, 121, 91, 109, 123, 98, 173,
+  84, 118, 133, 125, 99, 139, 152, 103, 120, 121,
+  83, 95, 108, 89, 113, 143, 70, 87, 117, 90,
+  121, 165, 108, 107, 98, 122, 112, 116, 116, 122,
+  134, 75, 107, 88, 140, 83, 77, 70, 133, 124,
+  81, 108, 94, 160, 92, 92, 110, 73, 99, 81,
+  128, 95, 110, 124, 107, 85, 111, 65, 107, 124,
+  115, 92, 140, 87, 96, 99, 123, 127, 81, 56,
+  87, 82, 140, 133, 113, 146, 50, 75, 117, 123,
+  97, 60, 106, 93, 96, 118, 146, 131, 99, 93,
+  92, 106, 100, 128, 126, 134, 89, 98, 138, 140,
+  94, 104, 77, 112, 64, 87, 52, 87, 79, 110,
+  114, 103, 92, 122, 91, 95, 110, 67, 91, 135,
+  54, 48, 109, 73, 78, 94, 108, 103, 95, 151,
+  80, 173, 94, 114, 93, 76, 111, 134, 81, 95,
+  101, 53, 124, 100, 111, 114, 94, 121, 78, 129,
+  81, 118, 113, 116, 101, 130, 125, 150, 80, 65,
+  115, 92, 65, 95, 136, 86, 116, 101, 81, 148,
+  202, 120, 96, 96, 107, 111, 66, 122, 153, 116,
+  103, 93, 137, 125, 126, 104, 116, 52, 94, 104,
+  109, 137, 97, 131, 144, 108, 105, 132, 127, 140,
+  147, 97, 137, 118, 101, 122, 102, 146, 105, 123,
+  137, 114, 101, 140, 83, 104, 98, 107, 106, 169,
+  192, 128, 143, 106, 116, 68, 148, 83, 101, 89,
+  162, 152, 91, 106, 97, 121, 116, 107, 135, 78,
+  125, 95, 117, 116, 115, 100, 144, 104, 110, 107,
+  101, 122, 96, 135, 135, 118, 101, 100, 126, 109,
+  92, 93, 93, 96, 86, 158, 114, 166, 65, 113,
+  91, 141, 127, 105, 90, 78, 98, 107, 104, 117,
+  168, 114, 98, 123, 99, 161, 148, 165, 128, 100,
+  122, 169, 96, 125, 85, 126, 80, 87, 89, 112,
+  87, 119, 150, 137, 118, 113, 117, 113, 110, 73,
+  82, 130, 77, 64, 117, 108, 82, 126, 126, 105,
+  95, 138, 95, 195, 112, 116, 141, 84, 127, 123,
+  95, 107, 95, 87, 116, 112, 163, 107, 110, 119,
+  115, 139, 110, 113, 133, 95, 130, 123, 108, 104,
+  140, 141, 114, 122, 127, 114, 141, 123, 133, 101,
+  86, 98, 124, 109, 128, 109, 138, 79, 127, 122,
+  121, 158, 116, 75, 106, 112, 130, 107, 117, 97,
+  118, 77, 80, 115, 125, 93, 108, 121, 92, 140,
+  119, 109, 130, 151, 110, 96, 127, 92, 129, 124,
+  145, 147, 107, 116, 121, 119, 113, 115, 121, 130,
+  121, 117, 142, 128, 84, 117, 118, 92, 75, 122,
+  102, 123, 114, 122, 93, 114, 114, 112, 106, 108,
+  103, 121, 92, 110, 133, 124, 144, 112, 122, 121,
+  129, 101, 124, 111, 116, 106, 138, 110, 76, 102,
+  106, 83, 109, 118, 114, 111, 113, 117, 91, 106,
+  98, 121, 91, 99, 138, 118, 119, 137, 108, 139,
+  124, 74, 127, 112, 124, 151, 93, 116, 109, 99,
+  106, 114, 145, 85, 121, 94, 93, 100, 118, 121,
+  53, 98, 113, 96, 94, 101, 84, 96, 150, 91,
+  95, 100, 123, 100, 118, 129, 120, 98, 118, 105,
+  75, 117, 117, 110, 95, 109, 90, 144, 103, 105,
+  122, 83, 104, 85, 85, 101, 102, 108, 181, 102,
+  118, 108, 86, 123, 122, 131, 138, 128, 103, 117,
+  83, 117, 114, 111, 111, 116, 112, 96, 120, 137,
+  125, 86, 66, 79, 31, 109, 137, 90, 92, 83,
+  131, 75, 92, 129, 72, 97, 110, 83, 112, 86,
+  106, 134, 120, 50, 61, 167, 95, 93, 99, 132,
+  59, 98, 101, 112, 147, 157, 75, 96, 98, 94,
+  120, 128, 112, 110, 102, 100, 110, 103, 92, 102,
+  111, 115, 117, 98, 100, 132, 98, 95, 98, 95,
+  99, 101, 81, 133, 105, 143, 84, 102, 127, 121,
+  94, 82, 99, 118, 104, 98, 106, 109, 144, 131,
+  138, 117, 145, 76, 113, 127, 90, 118, 139, 88,
+  65, 103, 80, 84, 106, 100, 107, 91, 121, 153,
+  97, 78, 75, 122, 62, 118, 105, 138, 151, 83,
+  110, 124, 121, 67, 135, 102, 118, 180, 104, 80,
+  117, 123, 111, 98, 133, 116, 123, 87, 108, 140,
+  108, 116, 86, 62, 117, 78, 65, 94, 147, 115,
+  114, 81, 121, 92, 97, 120, 94, 83, 110, 100,
+  88, 148, 88, 99, 96, 108, 93, 82, 91, 135,
+  88, 97, 106, 88, 104, 95, 85, 95, 92, 124,
+  153, 98, 169, 121, 86, 102, 143, 122, 116, 117,
+  86, 129, 93, 139, 118, 126, 105, 118, 131, 86,
+  116, 70, 123, 92, 66, 101, 32, 118, 150, 96,
+  84, 108, 104, 70, 95, 125, 71, 126, 128, 82,
+  98, 102, 108, 130, 86, 140, 74, 201, 109, 128,
+  101, 109, 74, 73, 96, 125, 130, 93, 70, 102,
+  84, 89, 102, 109, 92, 75, 110, 121, 117, 124,
+  83, 112, 95, 99, 125, 84, 86, 120, 89, 106,
+  113, 80, 126, 69, 101, 123, 106, 158, 90, 95,
+  101, 115, 96, 73, 112, 108, 100, 100, 117, 76,
+  151, 123, 161, 128, 153, 106, 110, 175, 75, 109,
+  118, 94, 82, 105, 92, 109, 101, 126, 115, 92,
+  107, 171, 110, 67, 67, 103, 86, 121, 124, 80,
+  181, 75, 115, 71, 136, 174, 103, 118, 86, 204,
+  133, 80, 135, 155, 126, 88, 136, 160, 128, 102,
+  59, 113, 93, 136, 118, 81, 131, 88, 75, 101,
+  114, 115, 94, 107, 114, 95, 117, 146, 91, 69,
+  104, 106, 79, 79, 139, 92, 92, 92, 110, 76,
+  82, 130, 107, 110, 79, 91, 86, 105, 100, 103,
+  91, 113, 159, 73, 78, 111, 72, 85, 111, 143,
+  92, 86, 60, 99, 62, 68, 78, 74, 106, 113,
+  111, 89, 99, 101, 112, 135, 40, 64, 25, 101,
+  138, 78, 103, 92, 113, 60, 95, 125, 63, 108,
+  115, 119, 70, 89, 90, 83, 90, 86, 63, 166,
+  91, 109, 94, 119, 64, 91, 91, 91, 94, 77,
+  72, 101, 101, 62, 106, 122, 59, 68, 91, 98,
+  94, 93, 72, 94, 58, 82, 97, 151, 91, 109,
+  61, 110, 90, 82, 117, 71, 72, 77, 81, 134,
+  52, 83, 99, 112, 80, 69, 112, 100, 111, 92,
+  92, 57, 125, 71, 109, 106, 156, 74, 81, 134,
+  70, 108, 125, 85, 67, 101, 60, 99, 97, 117,
+  87, 93, 99, 136, 101, 88, 48, 87, 80, 107,
+  65, 93, 96, 90, 98, 97, 128, 151, 82, 108,
+  107, 180, 95, 82, 118, 128, 107, 80, 109, 127,
+  107, 91, 28, 84, 74, 85, 59, 44, 96, 75,
+  41, 116, 56, 107, 94, 61, 107, 95, 127, 105,
+  92, 68, 95, 135, 85, 109, 88, 75, 82, 96,
+  136, 87, 74, 124, 73, 98, 81, 83, 64, 80,
+  106, 93, 71, 89, 179, 94, 133, 91, 121, 120,
+  118, 137, 103, 99, 84, 117, 84, 93, 113, 74,
+  105, 109, 129, 114, 110, 99, 109, 83, 55, 110,
+  80, 103, 163, 95, 113, 89, 99, 130, 121, 115,
+  82, 80, 81, 117, 129, 118, 120, 96, 99, 81,
+  54, 150, 90, 103, 106, 143, 70, 85, 80, 96,
+  110, 74, 117, 81, 101, 89, 131, 113, 120, 130,
+  92, 141, 101, 111, 114, 76, 98, 127, 127, 110,
+  97, 113, 103, 87, 92, 96, 93, 87, 75, 106,
+  93, 145, 71, 87, 108, 80, 106, 81, 70, 99,
+  107, 92, 124, 113, 154, 123, 130, 126, 130, 114,
+  113, 44, 87, 106, 115, 100, 82, 106, 77, 89,
+  93, 104, 125, 89, 98, 123, 99, 84, 76, 93,
+  98, 100, 123, 85, 159, 102, 97, 88, 115, 83,
+  136, 119, 114, 164, 131, 108, 110, 106, 85, 105,
+  132, 106, 100, 106, 100, 103, 96, 137, 59, 116,
+  119, 79, 71, 93, 81, 61, 100, 99, 94, 98,
+  110, 96, 128, 106, 100, 113, 91, 80, 94, 98,
+  96, 98, 97, 91, 74, 146, 82, 70, 80, 89,
+  74, 91, 112, 112, 87, 93, 151, 84, 89, 97,
+  99, 122, 132, 103, 113, 138, 86, 109, 89, 105,
+  121, 97, 84, 115, 103, 98, 99, 97, 103, 90,
+  52, 108, 83, 114, 143, 92, 114, 85, 98, 117,
+  81, 104, 71, 87, 81, 107, 98, 128, 111, 112,
+  94, 79, 72, 112, 102, 119, 103, 100, 68, 98,
+  90, 95, 106, 121, 115, 70, 98, 95, 171, 142,
+  124, 149, 93, 134, 115, 103, 112, 72, 117, 124,
+  131, 92, 74, 109, 121, 92, 80, 102, 87, 87,
+  79, 134, 95, 133, 75, 87, 97, 127, 99, 96,
+  88, 87, 71, 105, 122, 123, 149, 126, 115, 132,
+  120, 104, 117, 128, 101, 97, 112, 107, 67, 106,
+  69, 99, 102, 94, 99, 84, 142, 90, 115, 106,
+  64, 102, 93, 111, 108, 129, 149, 92, 115, 123,
+  95, 64, 130, 110, 107, 105, 142, 98, 108, 114,
+  95, 114, 123, 98, 78, 98, 86, 109, 94, 119,
+  63, 95, 103, 79, 74, 85, 114, 75, 104, 89,
+  97, 92, 94, 111, 119, 90, 102, 97, 79, 85,
+  76, 103, 109, 89, 107, 112, 81, 124, 86, 80,
+  89, 101, 87, 108, 97, 124, 100, 122, 108, 76,
+  142, 106, 55, 88, 115, 111, 111, 143, 77, 108,
+  111, 114, 113, 83, 74, 109, 100, 71, 105, 90,
+  105, 81, 62, 74, 89, 107, 121, 96, 106, 108,
+  77, 87, 53, 122, 80, 101, 152, 101, 89, 124,
+  115, 94, 76, 99, 115, 108, 107, 125, 104, 116,
+  86, 104, 98, 105, 141, 143, 104, 100, 89, 106,
+  122, 148, 52, 78, 83, 116, 112, 125, 78, 98,
+  132, 97, 120, 116, 68, 97, 119, 103, 95, 82,
+  131, 77, 86, 114, 113, 110, 80, 94, 112, 140,
+  73, 112, 111, 92, 83, 100, 98, 93, 89, 105,
+  94, 119, 117, 130, 99, 125, 105, 153, 112, 88,
+  99, 120, 91, 110, 115, 91, 83, 97, 125, 89,
+  118, 72, 71, 89, 115, 127, 98, 113, 133, 95,
+  135, 111, 99, 107, 116, 107, 72, 100, 136, 100,
+  116, 146, 120, 84, 97, 119, 102, 120, 60, 123,
+  59, 84, 159, 76, 71, 123, 87, 109, 136, 112,
+  94, 98, 132, 94, 120, 181, 74, 87, 109, 106,
+  81, 114, 76, 121, 108, 93, 137, 129, 95, 93,
+  113, 74, 80, 105, 81, 131, 69, 112, 105, 140,
+  99, 74, 93, 92, 95, 98, 115, 156, 106, 100,
+  85, 104, 111, 114, 163, 87, 80, 92, 97, 95,
+  109, 127, 110, 99, 69, 119, 77, 114, 126, 91,
+  135, 141, 129, 76, 79, 124, 104, 88, 194, 103,
+  83, 127, 133, 85, 82, 108, 110, 95, 112, 115,
+  107, 139, 91, 99, 95, 140, 124, 83, 99, 105,
+  107, 112, 103, 104, 104, 105, 101, 122, 96, 111,
+  83, 112, 140, 91, 133, 119, 64, 126, 88, 111,
+  101, 81, 116, 73, 79, 91, 101, 88, 83, 117,
+  114, 97, 100, 126, 134, 121, 139, 112, 102, 105,
+  105, 106, 88, 119, 122, 136, 106, 98, 109, 160,
+  115, 86, 63, 123, 113, 109, 106, 113, 90, 120,
+  119, 86, 102, 119, 83, 98, 117, 100, 102, 103,
+  95, 134, 122, 93, 98, 125, 118, 106, 70, 92,
+  110, 114, 133, 130, 120, 88, 113, 83, 93, 111,
+  86, 115, 86, 107, 102, 94, 92, 140, 84, 149,
+  55, 100, 112, 92, 124, 116, 159, 121, 90, 103,
+  114, 114, 100, 132, 62, 123, 100, 92, 126, 115,
+  101, 95, 122, 102, 81, 77, 101, 104, 66, 104,
+  108, 115, 130, 90, 99, 82, 153, 152, 141, 130,
+  118, 100, 103, 109, 109, 117, 131, 100, 97, 91,
+  107, 109, 95, 120, 124, 77, 75, 159, 89, 103,
+  143, 103, 129, 118, 115, 87, 86, 103, 102, 99,
+  113, 72, 97, 122, 146, 91, 122, 98, 79, 131,
+  126, 123, 88, 125, 70, 101, 85, 122, 113, 95,
+  115, 99, 108, 104, 110, 78, 131, 132, 113, 118,
+  82, 108, 110, 95, 134, 122, 137, 85, 99, 131,
+  85, 93, 101, 105, 71, 70, 71, 101, 95, 130,
+  91, 118, 127, 108, 107, 111, 93, 125, 139, 103,
+  115, 140, 132, 108, 98, 126, 122, 114, 127, 84,
+  162, 119, 116, 81, 76, 122, 130, 85, 89, 95,
+  125, 105, 126, 104, 112, 99, 107, 68, 120, 87,
+  127, 81, 102, 145, 91, 78, 104, 93, 121, 100,
+  82, 86, 103, 108, 110, 116, 99, 108, 102, 66,
+  105, 97, 126, 148, 125, 140, 67, 109, 123, 97,
+  102, 116, 45, 75, 107, 122, 102, 128, 135, 106,
+  115, 120, 102, 94, 90, 103, 96, 116, 110, 98,
+  108, 108, 91, 115, 117, 100, 78, 90, 104, 105,
+  82, 128, 105, 104, 130, 94, 80, 112, 154, 138,
+  143, 93, 118, 112, 90, 108, 101, 111, 118, 106,
+  107, 109, 111, 104, 96, 72, 110, 93, 54, 157,
+  92, 104, 130, 87, 101, 84, 97, 86, 80, 96,
+  87, 113, 82, 79, 72, 113, 145, 82, 151, 110,
+  75, 156, 129, 134, 80, 105, 74, 115, 98, 99,
+  97, 124, 83, 105, 105, 89, 108, 92, 100, 110,
+  120, 128, 83, 122, 100, 97, 124, 140, 122, 99,
+  108, 121, 103, 87, 121, 116, 69, 68, 70, 93,
+  91, 137, 86, 100, 103, 144, 94, 98, 79, 98,
+  104, 99, 112, 136, 140, 103, 86, 147, 114, 103,
+  131, 118, 175, 120, 119, 83, 106, 124, 113, 94,
+  76, 75, 120, 82, 122, 116, 121, 106, 89, 67,
+  117, 102, 110, 78, 98, 116, 89, 84, 113, 110,
+  115, 105, 103, 80, 106, 132, 109, 115, 97, 111,
+  98, 87, 106, 101, 119, 145, 117, 143, 62, 90,
+  110, 87, 110, 110, 89, 102, 96, 116, 98, 128,
+  107, 113, 104, 97, 92, 102, 75, 76, 107, 99,
+  109, 92, 109, 135, 84, 112, 111, 110, 83, 125,
+  88, 100, 91, 133, 113, 115, 112, 96, 96, 124,
+  128, 108, 107, 88, 93, 106, 99, 108, 100, 114,
+  106, 104, 99, 113, 113, 96, 107, 63, 115, 89,
+  49, 125, 103, 96, 107, 72, 105, 88, 99, 89,
+  92, 97, 94, 101, 88, 93, 65, 97, 132, 66,
+  142, 98, 96, 164, 123, 125, 90, 118, 76, 120,
+  105, 97, 107, 125, 76, 111, 110, 101, 109, 115,
+  49, 90, 113, 130, 80, 145, 83, 90, 106, 120,
+  115, 110, 107, 123, 111, 73, 119, 114, 101, 83,
+  71, 81, 95, 127, 88, 98, 96, 149, 90, 97,
+  90, 91, 85, 89, 126, 105, 119, 88, 84, 152,
+  106, 92, 131, 97, 165, 116, 123, 89, 115, 127,
+  103, 113, 73, 72, 103, 90, 106, 120, 121, 129,
+  65, 56, 106, 105, 99, 65, 74, 100, 100, 105,
+  117, 111, 112, 110, 107, 72, 87, 135, 116, 123,
+  100, 102, 79, 120, 121, 109, 104, 140, 86, 114,
+  73, 85, 86, 91, 121, 128, 96, 119, 84, 93,
+  101, 121, 104, 124, 82, 71, 83, 111, 72, 70,
+  98, 95, 112, 103, 112, 154, 89, 114, 117, 109,
+  91, 127, 76, 91, 101, 109, 95, 107, 110, 92,
+  87, 118, 130, 124, 98, 110, 78, 104, 104, 103,
+  104, 137, 104, 92, 92, 110, 114, 101, 115, 71,
+  115, 98, 52, 117, 98, 91, 106, 64, 118, 80,
+  122, 88, 102, 84, 109, 87, 88, 97, 70, 97,
+  120, 54, 126, 98, 98, 166, 120, 121, 101, 140,
+  74, 115, 99, 130, 103, 117, 85, 108, 120, 109,
+  110, 123, 64, 99, 101, 123, 75, 137, 81, 89,
+  98, 96, 117, 106, 103, 131, 109, 56, 108, 115,
+  113, 90, 67, 77, 92, 121, 96, 97, 104, 118,
+  94, 94, 91, 93, 100, 84, 125, 104, 113, 97,
+  105, 131, 97, 90, 125, 72, 151, 110, 119, 117,
+  102, 134, 106, 111, 67, 80, 92, 100, 87, 124,
+  114, 129, 50, 46, 86, 103, 109, 64, 68, 97,
+  101, 103, 112, 105, 127, 111, 110, 67, 88, 134,
+  123, 124, 104, 91, 81, 132, 124, 111, 104, 135,
+  75, 89, 56, 99, 91, 94, 125, 124, 92, 111,
+  84, 86, 106, 113, 113, 109, 83, 59, 72, 113,
+  66, 94, 98, 85, 113, 107, 95, 138, 92, 126,
+  127, 98, 97, 97, 77, 92, 107, 122, 79, 113,
+  109, 95, 92, 121, 147, 158, 111, 123, 85, 121,
+  100, 109, 110, 167, 105, 95, 93, 104, 127, 116,
+  105, 81, 122, 93, 58, 145, 89, 102, 117, 75,
+  129, 71, 130, 95, 97, 66, 115, 97, 82, 88,
+  82, 114, 122, 45, 119, 118, 87, 164, 124, 128,
+  117, 114, 76, 105, 93, 144, 95, 101, 98, 139,
+  116, 121, 102, 111, 90, 118, 95, 134, 79, 107,
+  75, 93, 102, 96, 121, 99, 106, 137, 125, 63,
+  103, 118, 109, 96, 78, 97, 91, 144, 108, 95,
+  123, 97, 95, 100, 92, 101, 109, 99, 124, 125,
+  116, 113, 122, 119, 100, 78, 127, 87, 149, 110,
+  122, 130, 111, 139, 125, 101, 66, 79, 103, 98,
+  82, 143, 125, 106, 53, 51, 74, 94, 123, 62,
+  75, 98, 74, 73, 102, 111, 142, 115, 97, 62,
+  99, 137, 126, 128, 110, 96, 98, 140, 129, 112,
+  106, 143, 91, 101, 58, 115, 114, 100, 137, 114,
+  91, 87, 98, 98, 100, 106, 110, 112, 96, 46,
+  73, 105, 54, 88, 122, 82, 98, 110, 102, 122,
+  96, 129, 131, 104, 87, 79, 85, 105, 120, 150,
+  89, 117, 113, 79, 83, 120, 155, 168, 107, 116,
+  94, 114, 84, 112, 100, 166, 103, 113, 82, 105,
+  116, 126, 91, 79, 112, 88, 52, 163, 90, 129,
+  119, 83, 128, 63, 114, 101, 97, 55, 111, 102,
+  83, 89, 91, 123, 123, 39, 135, 118, 71, 153,
+  130, 120, 112, 104, 62, 87, 100, 136, 93, 101,
+  100, 163, 103, 116, 102, 100, 118, 119, 102, 151,
+  77, 94, 67, 92, 112, 97, 119, 99, 104, 137,
+  142, 86, 90, 117, 91, 110, 95, 94, 99, 168,
+  117, 76, 107, 94, 86, 88, 88, 120, 99, 116,
+  130, 140, 121, 99, 119, 112, 96, 81, 128, 96,
+  154, 136, 125, 119, 120, 140, 127, 88, 74, 88,
+  104, 87, 87, 146, 115, 94, 66, 71, 63, 99,
+  112, 68, 74, 100, 53, 71, 98, 108, 121, 112,
+  84, 53, 85, 127, 124, 122, 111, 101, 99, 131,
+  127, 102, 113, 128, 106, 125, 67, 105, 111, 90,
+  148, 112, 88, 73, 102, 93, 94, 112, 95, 107,
+  112, 32, 83, 102, 53, 79, 132, 91, 78, 109,
+  107, 132, 92, 123, 131, 110, 82, 83, 97, 111,
+  125, 180, 77, 108, 112, 64, 74, 107, 160, 163,
+  111, 107, 106, 103, 83, 107, 92, 162, 98, 144,
+  71, 110, 100, 129, 83, 79, 97, 79, 50, 154,
+  99, 155, 121, 89, 127, 61, 101, 109, 108, 63,
+  114, 112, 80, 84, 109, 126, 114, 65, 149, 117,
+  76, 141, 147, 105, 98, 114, 55, 74, 100, 139,
+  96, 101, 89, 151, 93, 105, 108, 94, 149, 125,
+  124, 141, 82, 104, 74, 91, 117, 91, 124, 91,
+  101, 144, 141, 103, 79, 120, 51, 126, 116, 112,
+  97, 185, 130, 74, 91, 100, 83, 75, 67, 128,
+  95, 126, 141, 147, 140, 104, 129, 110, 92, 118,
+  127, 85, 144, 150, 117, 113, 100, 132, 119, 77,
+  76, 108, 90, 71, 92, 147, 95, 90, 75, 80,
+  61, 101, 122, 56, 96, 101, 69, 79, 103, 80,
+  93, 105, 81, 51, 92, 104, 115, 104, 99, 101,
+  99, 122, 117, 88, 124, 126, 118, 150, 56, 117,
+  116, 78, 143, 107, 87, 63, 105, 97, 95, 115,
+  83, 83, 127, 27, 85, 102, 62, 74, 140, 86,
+  87, 112, 94, 126, 81, 129, 140, 103, 76, 84,
+  101, 111, 130, 195, 62, 101, 106, 64, 90, 88,
+  147, 150, 119, 74, 101, 96, 85, 96, 88, 161,
+  109, 167, 78, 112, 100, 119, 77, 78, 89, 80,
+  44, 152, 99, 166, 124, 92, 116, 75, 102, 117,
+  113, 65, 120, 124, 84, 92, 96, 116, 110, 88,
+  136, 119, 80, 113, 144, 94, 95, 101, 64, 71,
+  97, 166, 81, 107, 112, 158, 86, 106, 105, 97,
+  146, 132, 135, 134, 105, 114, 76, 92, 111, 93,
+  123, 90, 96, 134, 116, 105, 98, 110, 62, 134,
+  156, 131, 103, 183, 128, 76, 79, 101, 86, 72,
+  40, 133, 88, 125, 158, 137, 137, 135, 137, 120,
+  88, 108, 118, 115, 134, 139, 117, 123, 104, 122,
+  104, 75, 94, 131, 90, 53, 96, 144, 98, 100,
+  68, 95, 60, 96, 141, 56, 106, 92, 90, 85,
+  100, 72, 72, 109, 83, 50, 113, 94, 114, 96,
+  87, 103, 102, 141, 104, 96, 99, 115, 117, 164,
+  57, 145, 131, 70, 127, 107, 106, 50, 111, 100,
+  95, 99, 70, 78, 132, 26, 74, 101, 64, 56,
+  144, 68, 95, 114, 99, 110, 95, 131, 148, 93,
+  79, 79, 90, 108, 129, 185, 63, 100, 108, 70,
+  91, 84, 105, 124, 121, 55, 79, 52, 72, 87,
+  110, 151, 112, 169, 97, 106, 90, 96, 82, 74,
+  101, 119, 29, 129, 90, 130, 109, 83, 107, 97,
+  87, 123, 125, 98, 102, 114, 93, 76, 72, 97,
+  105, 109, 93, 86, 89, 106, 142, 89, 97, 87,
+  76, 78, 93, 202, 85, 143, 139, 135, 99, 105,
+  112, 117, 100, 126, 138, 120, 149, 125, 76, 104,
+  97, 93, 104, 93, 90, 125, 86, 100, 124, 84,
+  115, 130, 169, 127, 112, 167, 93, 69, 74, 98,
+  102, 77, 72, 141, 84, 107, 160, 92, 129, 129,
+  131, 121, 85, 81, 97, 145, 105, 114, 109, 159,
+  85, 113, 89, 76, 99, 125, 82, 59, 71, 118,
+  97, 94, 37, 132, 51, 105, 140, 107, 122, 84,
+  92, 92, 80, 97, 57, 104, 86, 63, 121, 113,
+  99, 107, 91, 87, 93, 171, 94, 121, 63, 95,
+  78, 121, 93, 142, 114, 84, 116, 91, 112, 60,
+  87, 107, 97, 92, 80, 104, 118, 57, 65, 97,
+  62, 86, 139, 51, 105, 126, 86, 111, 109, 123,
+  149, 73, 84, 70, 74, 98, 100, 153, 44, 103,
+  105, 79, 95, 102, 56, 102, 96, 112, 50, 27,
+  82, 94, 131, 104, 66, 143, 136, 111, 70, 88,
+  91, 95, 106, 165, 11, 79, 81, 69, 103, 68,
+  62, 94, 111, 100, 117, 113, 87, 88, 118, 62,
+  77, 54, 116, 121, 59, 54, 76, 107, 139, 106,
+  47, 82, 92, 55, 83, 156, 108, 127, 101, 87,
+  118, 66, 120, 130, 65, 84, 144, 101, 170, 150,
+  98, 113, 72, 76, 81, 102, 76, 70, 77, 88,
+  105, 74, 154, 132, 108, 88, 115, 133, 50, 80,
+  101, 99, 133, 69, 138, 111, 95, 84, 126, 57,
+  107, 106, 114, 111, 80, 74, 63, 134, 113, 91,
+  109, 144, 86, 103, 72, 82, 102, 69, 83, 70,
+  55, 104, 92, 77, 26, 130, 74, 101, 96, 143,
+  127, 62, 80, 104, 72, 122, 75, 75, 111, 94,
+  100, 92, 99, 132, 124, 78, 75, 169, 85, 124,
+  57, 108, 44, 69, 106, 85, 94, 98, 82, 66,
+  128, 111, 81, 105, 106, 96, 94, 164, 82, 73,
+  85, 88, 80, 121, 122, 84, 120, 126, 52, 101,
+  95, 99, 126, 64, 73, 70, 73, 84, 83, 104,
+  35, 77, 109, 114, 81, 114, 43, 105, 131, 145,
+  48, 62, 66, 112, 85, 102, 69, 104, 210, 108,
+  36, 104, 94, 104, 73, 140, 8, 66, 85, 51,
+  117, 72, 33, 70, 102, 88, 98, 93, 75, 96,
+  104, 68, 105, 44, 145, 114, 36, 90, 49, 110,
+  140, 143, 0, 82, 92, 40, 79, 109, 132, 93,
+  89, 72, 96, 60, 103, 116, 75, 82, 119, 81,
+  128, 175, 172, 108, 74, 84, 93, 94, 89, 43,
+  79, 82, 88, 79, 123, 127, 53, 84, 98, 130,
+  44, 143, 113, 113, 136, 71, 139, 104, 126, 67,
+  102, 55, 127, 72, 151, 114, 89, 83, 65, 97,
+  102, 79, 117, 84, 76, 95, 82, 75, 117, 58,
+  121, 88, 49, 123, 116, 65, 21, 94, 115, 104,
+  95, 123, 146, 46, 80, 115, 90, 121, 85, 75,
+  139, 113, 118, 87, 128, 198, 171, 102, 78, 166,
+  72, 135, 86, 110, 48, 69, 103, 69, 124, 102,
+  55, 96, 122, 112, 95, 127, 92, 93, 74, 125,
+  77, 81, 89, 80, 126, 98, 105, 107, 116, 117,
+  38, 109, 97, 95, 97, 82, 96, 88, 113, 72,
+  79, 75, 87, 55, 108, 138, 110, 120, 47, 106,
+  131, 87, 54, 88, 59, 125, 77, 105, 90, 99,
+  222, 112, 40, 94, 95, 53, 56, 104, 18, 78,
+  88, 35, 104, 72, 47, 57, 48, 99, 98, 100,
+  64, 127, 93, 96, 99, 44, 134, 101, 34, 154,
+  70, 103, 115, 148, 2, 107, 77, 86, 93, 101,
+  115, 124, 93, 73, 122, 61, 69, 95, 80, 88,
+  116, 94, 88, 180, 181, 126, 93, 95, 104, 82,
+  74, 32, 66, 81, 80, 95, 97, 109, 68, 99,
+  96, 136, 39, 153, 87, 122, 99, 69, 93, 91,
+  141, 59, 99, 57, 119, 74, 136, 127, 111, 89,
+  68, 113, 127, 61, 109, 80, 76, 89, 106, 87,
+  113, 63, 130, 107, 50, 127, 120, 83, 27, 85,
+  131, 96, 95, 72, 140, 75, 129, 155, 90, 102,
+  82, 55, 173, 132, 138, 105, 136, 202, 169, 113,
+  80, 143, 69, 131, 75, 100, 56, 67, 104, 51,
+  100, 96, 67, 129, 102, 106, 94, 115, 101, 78,
+  70, 135, 82, 78, 80, 136, 141, 77, 97, 133,
+  118, 102, 29, 160, 88, 84, 82, 82, 150, 108,
+  120, 51, 74, 66, 107, 84, 90, 151, 114, 123,
+  62, 101, 59, 97, 56, 108, 71, 115, 124, 116,
+  84, 106, 150, 145, 58, 77, 112, 55, 62, 98,
+  17, 99, 110, 28, 63, 69, 75, 69, 69, 110,
+  100, 121, 74, 101, 109, 94, 104, 43, 92, 97,
+  59, 140, 112, 80, 91, 106, 56, 149, 84, 138,
+  117, 120, 108, 149, 92, 109, 164, 86, 98, 130,
+  63, 71, 107, 102, 110, 191, 107, 109, 106, 79,
+  104, 97, 54, 51, 112, 74, 96, 109, 109, 115,
+  112, 67, 96, 102, 55, 107, 74, 138, 88, 70,
+  86, 102, 127, 74, 116, 53, 94, 61, 85, 127,
+  127, 103, 71, 91, 144, 85, 112, 109, 82, 97,
+  119, 109, 113, 101, 86, 113, 63, 110, 105, 133,
+  50, 91, 82, 115, 91, 70, 102, 93, 146, 172,
+  94, 48, 103, 45, 174, 124, 95, 91, 108, 135,
+  123, 121, 64, 127, 68, 111, 58, 115, 51, 72,
+  90, 50, 52, 105, 115, 124, 101, 105, 80, 78,
+  111, 63, 91, 161, 80, 84, 91, 134, 110, 86,
+  86, 117, 131, 112, 60, 181, 82, 79, 94, 68,
+  122, 117, 123, 55, 60, 55, 105, 98, 80, 131,
+  135, 117, 82, 107, 60, 92, 49, 120, 78, 114,
+  181, 162, 100, 134, 70, 149, 64, 60, 106, 66,
+  107, 72, 29, 137, 139, 41, 60, 91, 98, 92,
+  93, 127, 101, 115, 117, 110, 139, 89, 111, 53,
+  93, 132, 60, 140, 167, 68, 98, 116, 93, 135,
+  108, 105, 121, 178, 112, 121, 124, 107, 130, 119,
+  89, 140, 80, 76, 91, 120, 132, 190, 66, 79,
+  114, 73, 95, 74, 59, 95, 109, 67, 119, 116,
+  114, 132, 170, 79, 94, 94, 65, 81, 89, 132,
+  104, 77, 121, 152, 99, 104, 112, 57, 95, 79,
+  110, 121, 115, 115, 74, 118, 101, 156, 95, 151,
+  89, 92, 121, 127, 107, 135, 71, 133, 74, 127,
+  102, 133, 58, 80, 73, 144, 129, 89, 134, 51,
+  112, 117, 81, 85, 112, 72, 123, 122, 55, 86,
+  112, 141, 131, 112, 58, 160, 103, 111, 43, 136,
+  49, 101, 115, 103, 69, 122, 158, 95, 92, 93,
+  79, 97, 108, 66, 119, 192, 81, 89, 93, 93,
+  81, 75, 136, 110, 155, 115, 60, 163, 99, 87,
+  157, 84, 102, 107, 95, 113, 70, 76, 104, 89,
+  90, 94, 83, 102, 54, 87, 67, 95, 61, 116,
+  62, 84, 134, 134, 96, 97, 69, 114, 68, 47,
+  75, 93, 102, 143, 22, 76, 80, 63, 73, 94,
+  99, 90, 87, 90, 68, 107, 111, 121, 160, 129,
+  91, 67, 92, 108, 60, 100, 152, 73, 110, 109,
+  93, 93, 112, 87, 88, 144, 102, 95, 120, 104,
+  112, 109, 95, 112, 60, 72, 81, 84, 128, 135,
+  74, 71, 75, 85, 94, 123, 66, 120, 44, 89,
+  120, 106, 123, 106, 124, 102, 92, 78, 63, 108,
+  120, 89, 98, 86, 158, 172, 145, 123, 74, 53,
+  73, 61, 98, 90, 84, 95, 58, 125, 77, 159,
+  99, 123, 60, 90, 83, 131, 119, 99, 53, 127,
+  88, 87, 107, 112, 44, 71, 90, 118, 97, 143,
+  99, 43, 104, 135, 83, 135, 101, 92, 76, 97,
+  44, 90, 126, 124, 142, 72, 37, 157, 98, 114,
+  47, 116, 49, 70, 75, 85, 67, 123, 102, 111,
+  98, 107, 72, 97, 105, 100, 127, 128, 56, 87,
+  113, 156, 81, 122, 109, 79, 126, 111, 91, 145,
+  100, 98, 141, 100, 108, 113, 71, 121, 84, 80,
+  100, 78, 118, 91, 111, 103, 111, 115, 100, 128,
+  97, 72, 85, 91, 86, 119, 127, 67, 93, 93,
+  98, 74, 85, 114, 105, 110, 34, 128, 79, 79,
+  113, 98, 126, 108, 86, 94, 103, 130, 101, 100,
+  114, 87, 115, 97, 109, 97, 85, 67, 115, 121,
+  134, 122, 106, 110, 107, 126, 96, 133, 136, 80,
+  119, 80, 115, 110, 106, 83, 92, 115, 97, 93,
+  105, 111, 104, 91, 82, 131, 132, 108, 81, 119,
+  43, 93, 134, 90, 139, 100, 67, 120, 97, 85,
+  70, 131, 161, 80, 102, 103, 141, 166, 205, 117,
+  94, 112, 110, 125, 112, 103, 80, 120, 81, 64,
+  103, 108, 111, 111, 57, 96, 94, 122, 136, 85,
+  107, 124, 94, 90, 104, 92, 59, 71, 84, 77,
+  111, 105, 142, 102, 90, 103, 111, 99, 129, 120,
+  88, 83, 85, 118, 97, 95, 100, 88, 77, 87,
+  79, 104, 124, 122, 86, 111, 57, 135, 94, 93,
+  82, 112, 96, 79, 93, 120, 131, 103, 126, 105,
+  72, 138, 126, 169, 121, 132, 72, 86, 105, 115,
+  93, 106, 81, 126, 95, 98, 99, 99, 79, 94,
+  109, 96, 131, 105, 125, 111, 134, 98, 144, 148,
+  125, 110, 129, 91, 120, 120, 77, 108, 124, 107,
+  117, 83, 104, 89, 107, 76, 108, 67, 35, 147,
+  94, 120, 135, 109, 118, 102, 104, 91, 107, 141,
+  125, 102, 91, 66, 93, 103, 143, 110, 117, 115,
+  85, 165, 125, 130, 121, 106, 97, 131, 119, 105,
+  109, 116, 102, 91, 103, 99, 126, 80, 103, 128,
+  99, 102, 111, 137, 98, 111, 97, 161, 145, 61,
+  96, 148, 96, 106, 146, 99, 128, 91, 53, 115,
+  107, 117, 79, 126, 129, 135, 104, 111, 103, 133,
+  141, 129, 101, 130, 131, 159, 122, 113, 101, 97,
+  115, 98, 128, 105, 125, 71, 68, 97, 125, 118,
+  126, 79, 140, 97, 139, 97, 111, 94, 78, 77,
+  123, 90, 136, 88, 141, 137, 88, 71, 178, 131,
+  104, 124, 93, 78, 99, 121, 110, 102, 74, 100,
+  124, 74, 98, 99, 141, 112, 108, 141, 60, 149,
+  107, 83, 105, 97, 71, 85, 103, 135, 83, 100,
+  113, 90, 75, 129, 114, 83, 124, 51, 89, 80,
+  94, 126, 108, 107, 75, 155, 79, 88, 75, 114,
+  83, 102, 116, 94, 166, 122, 114, 113, 103, 105,
+  91, 127, 84, 117, 119, 120, 108, 105, 78, 95,
+  96, 111, 103, 90, 71, 77, 100, 42, 103, 96,
+  29, 106, 98, 101, 103, 78, 75, 93, 130, 68,
+  100, 115, 111, 83, 109, 113, 53, 76, 129, 90,
+  122, 113, 83, 166, 89, 119, 118, 125, 93, 139,
+  134, 89, 101, 133, 81, 86, 113, 74, 123, 128,
+  52, 82, 101, 82, 124, 151, 91, 107, 85, 127,
+  113, 119, 100, 121, 128, 87, 113, 76, 135, 82,
+  62, 75, 105, 102, 59, 114, 91, 151, 91, 97,
+  93, 86, 106, 82, 103, 97, 93, 129, 86, 93,
+  104, 52, 95, 120, 116, 93, 126, 69, 73, 95,
+  110, 118, 94, 48, 94, 83, 147, 106, 122, 125,
+  48, 80, 126, 125, 96, 79, 89, 103, 104, 115,
+  152, 127, 85, 86, 93, 90, 87, 120, 111, 122,
+  84, 85, 123, 123, 92, 99, 74, 104, 57, 80,
+  41, 94, 81, 97, 91, 102, 77, 116, 86, 94,
+  106, 70, 101, 120, 48, 67, 100, 73, 86, 88,
+  92, 88, 94, 134, 91, 142, 88, 130, 84, 75,
+  95, 132, 65, 90, 90, 51, 132, 112, 119, 116,
+  124, 120, 59, 123, 66, 122, 95, 127, 102, 119,
+  115, 136, 98, 100, 102, 98, 61, 81, 109, 42,
+  107, 75, 50, 126, 144, 97, 83, 80, 85, 107,
+  123, 111, 128, 83, 110, 67, 123, 127, 88, 77,
+  110, 70, 90, 110, 98, 153, 97, 116, 132, 109,
+  99, 135, 136, 118, 128, 84, 126, 108, 91, 112,
+  96, 143, 66, 103, 113, 122, 114, 125, 106, 90,
+  102, 107, 100, 126, 118, 117, 132, 69, 84, 78,
+  150, 87, 69, 62, 141, 131, 71, 100, 104, 121,
+  94, 80, 100, 89, 119, 68, 124, 100, 100, 116,
+  104, 98, 104, 73, 85, 99, 110, 100, 142, 107,
+  118, 92, 113, 116, 88, 79, 79, 97, 103, 135,
+  116, 146, 42, 76, 107, 139, 104, 69, 91, 64,
+  73, 96, 106, 120, 128, 100, 83, 123, 96, 147,
+  120, 152, 102, 93, 126, 168, 87, 100, 57, 123,
+  44, 82, 74, 101, 72, 117, 122, 101, 92, 90,
+  96, 87, 114, 59, 99, 130, 57, 29, 110, 78,
+  69, 107, 92, 105, 91, 151, 71, 183, 103, 119,
+  110, 60, 115, 130, 74, 84, 90, 64, 121, 94,
+  138, 110, 87, 123, 83, 127, 85, 114, 98, 114,
+  97, 133, 121, 157, 90, 68, 118, 100, 73, 98,
+  126, 93, 109, 107, 85, 140, 182, 112, 90, 102,
+  117, 121, 62, 146, 141, 98, 93, 104, 132, 115,
+  136, 109, 105, 41, 78, 97, 100, 120, 111, 124,
+  138, 91, 93, 117, 110, 145, 134, 81, 160, 123,
+  96, 133, 114, 129, 121, 152, 129, 131, 103, 116,
+  96, 89, 107, 103, 108, 149, 196, 137, 141, 112,
+  90, 79, 127, 79, 99, 99, 152, 163, 88, 99,
+  99, 86, 120, 91, 120, 102, 137, 96, 115, 131,
+  133, 92, 141, 117, 106, 117, 96, 110, 93, 129,
+  137, 128, 100, 90, 112, 101, 114, 119, 85, 109,
+  79, 148, 113, 168, 65, 117, 87, 144, 126, 109,
+  96, 69, 90, 109, 87, 117, 169, 130, 94, 119,
+  115, 176, 137, 168, 131, 102, 111, 174, 92, 119,
+  80, 110, 84, 107, 69, 113, 89, 111, 144, 117,
+  110, 69, 123, 108, 111, 86, 90, 94, 88, 66,
+  117, 109, 78, 116, 110, 105, 82, 140, 87, 170,
+  118, 131, 141, 81, 137, 120, 103, 83, 101, 110,
+  108, 114, 163, 107, 108, 113, 108, 135, 120, 111,
+  141, 102, 118, 117, 106, 108, 142, 137, 115, 111,
+  132, 111, 128, 119, 133, 95, 90, 94, 119, 124,
+  139, 107, 134, 84, 116, 126, 106, 148, 108, 71,
+  94, 115, 132, 111, 127, 96, 118, 79, 79, 118,
+  112, 97, 116, 111, 89, 143, 126, 108, 136, 155,
+  108, 83, 125, 93, 128, 135, 144, 147, 107, 101,
+  121, 116, 115, 104, 125, 135, 121, 106, 150, 137,
+  83, 121, 113, 94, 78, 122, 102, 128, 113, 123,
+  93, 120, 115, 134, 110, 111, 100, 123, 87, 112,
+  133, 128, 155, 114, 135, 120, 126, 90, 136, 116,
+  111, 97, 138, 98, 72, 107, 103, 95, 106, 107,
+  109, 113, 127, 123, 92, 106, 101, 121, 91, 106,
+  130, 113, 128, 129, 110, 139, 115, 74, 126, 109,
+  106, 155, 81, 120, 109, 106, 104, 116, 148, 85,
+  127, 102, 102, 102, 126, 116, 56, 105, 113, 99,
+  95, 97, 82, 103, 142, 103, 87, 104, 121, 108,
+  116, 127, 117, 97, 119, 97, 80, 106, 111, 110,
+  98, 110, 90, 146, 112, 106, 126, 101, 103, 85,
+  89, 97, 110, 108, 176, 100, 129, 99, 76, 116,
+  120, 111, 142, 124, 95, 107, 85, 119, 115, 117,
+  111, 109, 116, 94, 115, 127, 122, 99, 75, 67,
+  29, 113, 142, 86, 92, 80, 132, 81, 82, 111,
+  74, 96, 105, 93, 114, 78, 109, 133, 121, 54,
+  64, 166, 88, 97, 102, 121, 64, 97, 103, 114,
+  146, 159, 70, 91, 104, 90, 118, 142, 106, 107,
+  106, 97, 111, 99, 98, 95, 114, 113, 113, 111,
+  97, 134, 92, 97, 94, 95, 101, 101, 91, 138,
+  105, 135, 84, 111, 131, 137, 97, 81, 98, 110,
+  100, 97, 102, 113, 147, 120, 145, 117, 139, 85,
+  121, 142, 90, 109, 140, 91, 67, 109, 72, 95,
+  106, 98, 104, 100, 128, 156, 99, 82, 77, 127,
+  55, 127, 99, 128, 144, 66, 112, 122, 109, 76,
+  126, 100, 103, 185, 108, 76, 126, 128, 112, 93,
+  127, 123, 129, 90, 106, 138, 105, 105, 84, 64,
+  116, 87, 69, 103, 149, 131, 110, 81, 119, 99,
+  95, 126, 93, 76, 107, 102, 87, 140, 81, 89,
+  100, 106, 98, 86, 98, 133, 102, 97, 108, 97,
+  100, 95, 87, 92, 90, 129, 146, 97, 165, 123,
+  78, 97, 140, 126, 107, 111, 85, 122, 91, 144,
+  120, 131, 108, 116, 137, 87, 127, 75, 118, 100,
+  71, 93, 31, 111, 145, 94, 88, 104, 110, 78,
+  100, 112, 73, 126, 129, 80, 103, 94, 104, 130,
+  80, 140, 78, 191, 118, 129, 102, 110, 88, 76,
+  92, 128, 129, 94, 67, 97, 87, 93, 101, 112,
+  89, 81, 112, 122, 116, 121, 84, 111, 95, 94,
+  124, 85, 86, 123, 87, 107, 112, 82, 125, 68,
+  100, 124, 101, 147, 91, 101, 109, 116, 102, 76,
+  120, 106, 103, 103, 114, 81, 146, 115, 159, 126,
+  138, 111, 112, 171, 77, 109, 113, 99, 80, 104,
+  88, 112, 102, 122, 117, 97, 105, 175, 114, 74,
+  67, 107, 78, 122, 124, 86, 173, 63, 118, 75,
+  127, 174, 103, 121, 82, 202, 130, 76, 143, 155,
+  132, 88, 128, 169, 126, 101, 60, 113, 88, 126,
+  112, 88, 131, 98, 79, 112, 118, 125, 94, 105,
+  105, 103, 118, 138, 92, 64, 104, 113, 79, 82,
+  132, 90, 98, 91, 107, 75, 91, 128, 117, 117,
+  81, 91, 81, 109, 100, 102, 96, 115, 159, 70,
+  81, 115, 69, 88, 106, 155, 87, 90, 61, 97,
+  57, 75, 80, 77, 103, 104, 117, 88, 110, 104,
+  105, 135, 41, 60, 29, 92, 125, 75, 110, 92,
+  114, 66, 98, 107, 60, 105, 118, 117, 68, 80,
+  83, 83, 89, 83, 57, 163, 96, 104, 91, 117,
+  73, 95, 87, 93, 101, 73, 73, 99, 106, 65,
+  108, 124, 64, 73, 90, 99, 94, 84, 76, 94,
+  64, 80, 100, 146, 90, 110, 61, 104, 92, 84,
+  116, 67, 62, 73, 86, 129, 54, 88, 105, 109,
+  83, 68, 120, 108, 114, 93, 92, 70, 119, 75,
+  106, 100, 134, 69, 82, 124, 80, 104, 119, 85,
+  76, 101, 55, 99, 102, 105, 92, 94, 100, 136,
+  106, 89, 49, 86, 69, 105, 66, 93, 95, 78,
+  102, 104, 116, 142, 81, 104, 101, 177, 86, 79,
+  120, 123, 111, 82, 102, 130, 101, 88, 38, 89,
+  69, 82, 59, 52, 95, 79, 40, 121, 58, 103,
+  82, 58, 103, 103, 123, 100, 93, 58, 88, 144,
+  83, 113, 77, 74, 79, 93, 130, 92, 78, 127,
+  83, 96, 92, 77, 63, 79, 107, 91, 71, 83,
+  183, 91, 132, 92, 125, 132, 109, 134, 101, 114,
+  82, 115, 85, 108, 109, 71, 96, 94, 125, 106,
+  121, 96, 115, 75, 55, 107, 82, 98, 155, 96,
+  132, 96, 90, 134, 121, 101, 77, 77, 80, 104,
+  125, 110, 114, 106, 95, 84, 46, 151, 89, 107,
+  107, 127, 71, 84, 73, 104, 112, 68, 126, 74,
+  106, 96, 134, 112, 125, 145, 96, 133, 108, 99,
+  114, 72, 105, 128, 131, 98, 102, 119, 91, 80,
+  89, 105, 96, 80, 66, 119, 97, 152, 75, 93,
+  108, 76, 98, 80, 75, 96, 117, 93, 123, 125,
+  152, 131, 132, 113, 107, 105, 110, 53, 93, 96,
+  112, 99, 76, 105, 80, 98, 99, 105, 122, 95,
+  95, 128, 98, 89, 65, 89, 85, 105, 135, 76,
+  163, 91, 96, 81, 102, 81, 135, 121, 105, 158,
+  130, 106, 113, 107, 82, 109, 124, 106, 94, 99,
+  103, 105, 92, 134, 56, 132, 118, 76, 77, 86,
+  81, 47, 79, 103, 85, 102, 105, 91, 129, 104,
+  83, 114, 92, 72, 91, 86, 90, 95, 101, 96,
+  72, 160, 91, 63, 88, 82, 72, 89, 112, 110,
+  94, 95, 155, 81, 90, 89, 92, 132, 119, 83,
+  108, 134, 75, 108, 90, 113, 116, 96, 71, 100,
+  108, 88, 111, 96, 110, 88, 50, 110, 85, 104,
+  142, 89, 121, 87, 101, 110, 84, 96, 67, 90,
+  84, 96, 90, 116, 103, 123, 90, 76, 54, 121,
+  99, 128, 108, 91, 73, 94, 91, 103, 108, 131,
+  111, 76, 100, 90, 176, 148, 119, 150, 85, 141,
+  121, 90, 115, 82, 121, 122, 134, 100, 75, 116,
+  112, 86, 81, 108, 107, 85, 77, 129, 99, 136,
+  82, 81, 95, 124, 99, 91, 85, 76, 79, 105,
+  127, 124, 142, 139, 115, 119, 99, 96, 111, 142,
+  107, 105, 118, 99, 70, 102, 69, 115, 109, 97,
+  101, 95, 124, 98, 109, 102, 44, 94, 77, 118,
+  115, 130, 140, 86, 102, 118, 98, 75, 118, 121,
+  105, 99, 141, 93, 114, 114, 93, 109, 111, 99,
+  75, 87, 77, 100, 90, 111, 67, 95, 100, 72,
+  71, 77, 129, 65, 89, 90, 100, 95, 99, 112,
+  117, 81, 86, 95, 83, 90, 80, 80, 97, 80,
+  127, 116, 74, 131, 93, 72, 96, 94, 84, 106,
+  92, 121, 99, 132, 111, 84, 155, 114, 45, 90,
+  105, 117, 119, 129, 60, 124, 98, 127, 94, 88,
+  72, 97, 113, 63, 112, 94, 109, 79, 58, 83,
+  76, 100, 134, 99, 97, 115, 89, 82, 70, 137,
+  71, 121, 161, 92, 95, 111, 112, 112, 71, 107,
+  105, 133, 114, 132, 119, 122, 97, 100, 97, 116,
+  140, 151, 96, 101, 99, 98, 124, 143, 56, 80,
+  93, 125, 109, 131, 77, 115, 133, 97, 122, 133,
+  79, 97, 105, 100, 96, 90, 142, 74, 86, 96,
+  108, 125, 93, 83, 103, 136, 76, 112, 115, 96,
+  79, 102, 103, 76, 99, 117, 113, 114, 121, 108,
+  98, 127, 97, 136, 120, 96, 96, 114, 89, 122,
+  110, 109, 102, 115, 109, 107, 113, 65, 59, 85,
+  99, 123, 106, 113, 138, 90, 122, 107, 121, 126,
+  95, 125, 83, 101, 130, 97, 129, 151, 121, 77,
+  94, 128, 106, 113, 71, 115, 58, 77, 179, 73,
+  82, 113, 84, 111, 133, 128, 80, 99, 124, 104,
+  131, 165, 75, 87, 112, 103, 79, 121, 94, 86,
+  90, 80, 145, 128, 91, 88, 112, 76, 81, 91,
+  77, 119, 77, 108, 105, 135, 95, 78, 93, 106,
+  85, 102, 120, 168, 125, 105, 68, 120, 90, 126,
+  131, 90, 88, 87, 99, 90, 93, 134, 104, 126,
+  69, 121, 71, 108, 139, 93, 120, 128, 129, 77,
+  97, 149, 90, 117, 183, 94, 85, 118, 129, 106,
+  82, 117, 104, 120, 118, 120, 112, 134, 86, 89,
+  91, 145, 113, 82, 99, 87, 124, 95, 105, 96,
+  118, 119, 124, 107, 98, 138, 97, 116, 132, 85,
+  133, 125, 81, 111, 85, 115, 91, 89, 107, 56,
+  85, 111, 88, 115, 88, 109, 117, 108, 102, 118,
+  145, 106, 149, 104, 103, 72, 124, 110, 103, 111,
+  163, 123, 113, 119, 93, 124, 118, 107, 60, 118,
+  110, 123, 99, 132, 107, 127, 105, 98, 113, 105,
+  72, 96, 90, 94, 103, 93, 112, 129, 117, 101,
+  114, 136, 109, 117, 87, 89, 118, 114, 134, 136,
+  115, 93, 121, 98, 91, 110, 73, 102, 95, 98,
+  90, 83, 102, 110, 82, 155, 51, 121, 85, 80,
+  116, 118, 142, 117, 99, 109, 125, 120, 95, 135,
+  92, 103, 100, 90, 116, 111, 99, 91, 114, 112,
+  78, 82, 98, 81, 75, 97, 88, 124, 111, 90,
+  103, 91, 148, 149, 129, 129, 124, 124, 90, 117,
+  75, 119, 109, 104, 109, 90, 98, 110, 87, 145,
+  111, 96, 70, 148, 92, 100, 136, 99, 113, 96,
+  123, 81, 84, 127, 103, 111, 119, 78, 88, 115,
+  150, 92, 121, 99, 82, 139, 135, 119, 83, 133,
+  75, 101, 93, 108, 107, 113, 112, 115, 111, 101,
+  115, 79, 119, 124, 102, 107, 84, 128, 114, 92,
+  133, 115, 136, 105, 100, 126, 86, 100, 98, 112,
+  86, 61, 59, 119, 94, 133, 87, 130, 141, 123,
+  106, 108, 114, 108, 136, 100, 102, 113, 117, 119,
+  86, 117, 162, 114, 121, 90, 156, 125, 123, 75,
+  88, 126, 139, 98, 92, 102, 128, 110, 116, 99,
+  127, 97, 97, 65, 112, 90, 115, 89, 86, 152,
+  104, 94, 118, 86, 114, 118, 86, 80, 107, 107,
+  109, 110, 100, 104, 115, 85, 99, 105, 100, 151,
+  126, 128, 72, 86, 112, 80, 105, 135, 71, 97,
+  90, 105, 94, 146, 106, 103, 111, 107, 101, 120,
+  103, 111, 97, 110, 116, 101, 110, 119, 96, 110,
+  113, 112, 88, 100, 92, 86, 92, 111, 89, 120,
+  110, 85, 93, 116, 167, 144, 111, 95, 101, 121,
+  88, 109, 84, 117, 100, 111, 98, 115, 101, 110,
+  107, 79, 105, 99, 63, 147, 97, 86, 114, 81,
+  104, 75, 116, 78, 88, 95, 101, 106, 91, 94,
+  73, 104, 133, 80, 141, 108, 85, 166, 130, 116,
+  89, 136, 66, 128, 94, 97, 101, 140, 86, 121,
+  112, 100, 116, 103, 96, 100, 115, 134, 86, 136,
+  107, 89, 117, 121, 127, 105, 99, 124, 90, 72,
+  115, 108, 106, 75, 55, 91, 100, 127, 92, 108,
+  102, 130, 89, 102, 80, 103, 101, 91, 114, 135,
+  113, 110, 73, 135, 119, 109, 116, 90, 177, 105,
+  123, 92, 113, 122, 137, 108, 77, 70, 110, 97,
+  108, 111, 120, 94, 88, 51, 106, 102, 104, 58,
+  75, 120, 109, 111, 111, 103, 114, 113, 95, 74,
+  102, 125, 111, 112, 104, 105, 95, 105, 111, 100,
+  104, 158, 103, 125, 81, 71, 98, 92, 125, 120,
+  96, 115, 82, 87, 105, 143, 91, 123, 101, 67,
+  81, 119, 76, 96, 94, 104, 127, 98, 92, 148,
+  98, 108, 125, 117, 101, 106, 94, 104, 95, 131,
+  84, 108, 99, 90, 83, 128, 158, 140, 101, 124,
+  89, 117, 91, 108, 96, 147, 97, 106, 88, 111,
+  107, 117, 125, 71, 107, 101, 61, 143, 95, 88,
+  108, 80, 122, 73, 118, 88, 106, 84, 106, 105,
+  81, 75, 81, 102, 118, 59, 139, 99, 97, 178,
+  129, 111, 107, 114, 71, 122, 87, 131, 106, 116,
+  91, 135, 113, 110, 119, 112, 89, 102, 115, 133,
+  82, 123, 84, 94, 101, 99, 126, 105, 110, 142,
+  106, 76, 113, 107, 112, 82, 60, 87, 105, 132,
+  112, 87, 107, 117, 95, 96, 87, 98, 88, 91,
+  127, 126, 115, 99, 95, 123, 107, 97, 121, 80,
+  161, 105, 125, 117, 107, 130, 139, 105, 67, 83,
+  106, 96, 89, 128, 110, 104, 79, 47, 78, 102,
+  106, 53, 61, 107, 94, 93, 100, 117, 125, 125,
+  99, 65, 87, 123, 115, 123, 111, 100, 86, 126,
+  125, 104, 108, 152, 86, 104, 72, 96, 98, 98,
+  144, 127, 92, 113, 84, 77, 105, 120, 100, 103,
+  99, 51, 68, 103, 64, 78, 104, 90, 121, 106,
+  91, 135, 101, 115, 141, 122, 90, 70, 93, 107,
+  109, 144, 88, 101, 106, 82, 95, 122, 162, 164,
+  118, 134, 91, 119, 96, 102, 100, 179, 104, 105,
+  83, 106, 112, 122, 101, 86, 122, 96, 67, 151,
+  86, 110, 120, 88, 133, 79, 130, 90, 111, 74,
+  114, 108, 84, 67, 91, 117, 115, 53, 132, 115,
+  86, 166, 140, 117, 102, 102, 83, 102, 90, 148,
+  99, 102, 92, 154, 103, 116, 123, 110, 119, 118,
+  106, 132, 89, 97, 77, 85, 98, 86, 126, 97,
+  111, 143, 134, 109, 105, 110, 104, 84, 75, 90,
+  99, 143, 122, 94, 125, 107, 106, 89, 91, 97,
+  96, 111, 123, 130, 114, 125, 116, 105, 101, 95,
+  123, 98, 154, 119, 122, 125, 117, 137, 145, 97,
+  71, 90, 121, 88, 86, 140, 117, 89, 71, 57,
+  78, 103, 125, 68, 74, 108, 82, 67, 96, 117,
+  144, 122, 89, 64, 102, 121, 119, 126, 112, 91,
+  96, 125, 118, 108, 113, 155, 97, 106, 70, 127,
+  120, 99, 144, 116, 101, 94, 91, 99, 116, 108,
+  93, 92, 114, 48, 69, 101, 63, 98, 135, 81,
+  115, 110, 102, 116, 102, 130, 148, 116, 71, 74,
+  95, 111, 117, 167, 99, 108, 109, 71, 90, 114,
+  156, 181, 120, 108, 94, 123, 92, 103, 76, 193,
+  96, 108, 79, 99, 110, 116, 70, 96, 130, 100,
+  68, 159, 98, 132, 123, 100, 120, 83, 128, 104,
+  93, 64, 119, 109, 97, 74, 88, 135, 115, 51,
+  132, 130, 74, 146, 153, 115, 96, 83, 85, 88,
+  96, 119, 95, 93, 97, 172, 84, 113, 117, 105,
+  127, 119, 93, 162, 94, 82, 87, 75, 104, 93,
+  124, 102, 109, 145, 152, 139, 90, 106, 91, 97,
+  80, 94, 100, 163, 131, 109, 128, 108, 105, 81,
+  82, 104, 100, 130, 114, 133, 107, 124, 118, 100,
+  97, 83, 119, 112, 157, 129, 126, 110, 125, 142,
+  136, 94, 80, 92, 138, 76, 96, 136, 129, 78,
+  68, 77, 84, 98, 127, 70, 73, 98, 65, 58,
+  115, 121, 136, 117, 72, 57, 114, 124, 119, 136,
+  108, 94, 93, 128, 115, 112, 101, 149, 113, 120,
+  84, 126, 135, 93, 151, 108, 101, 67, 93, 108,
+  107, 115, 76, 97, 116, 35, 74, 102, 60, 103,
+  156, 74, 98, 101, 129, 127, 100, 132, 134, 112,
+  62, 93, 97, 104, 127, 186, 97, 102, 109, 62,
+  91, 105, 149, 174, 97, 107, 92, 118, 84, 103,
+  66, 187, 79, 108, 79, 95, 90, 113, 65, 97,
+  116, 81, 66, 159, 102, 133, 132, 105, 115, 77,
+  97, 112, 84, 60, 119, 107, 106, 81, 90, 142,
+  118, 33, 140, 114, 67, 130, 151, 108, 93, 109,
+  72, 89, 98, 99, 106, 104, 103, 172, 76, 103,
+  107, 104, 150, 123, 93, 179, 87, 85, 85, 80,
+  106, 91, 119, 101, 113, 136, 137, 147, 80, 97,
+  84, 108, 87, 99, 98, 171, 134, 110, 103, 99,
+  95, 73, 77, 121, 100, 121, 114, 131, 111, 100,
+  119, 96, 91, 95, 113, 93, 151, 142, 128, 104,
+  126, 146, 121, 86, 85, 99, 150, 71, 102, 133,
+  125, 82, 82, 92, 76, 107, 121, 64, 76, 101,
+  74, 69, 120, 114, 113, 106, 64, 48, 106, 126,
+  117, 135, 106, 93, 85, 122, 123, 103, 94, 120,
+  118, 120, 104, 109, 134, 80, 152, 108, 95, 53,
+  100, 105, 106, 123, 66, 103, 120, 36, 86, 107,
+  67, 100, 159, 95, 86, 87, 121, 131, 100, 123,
+  128, 113, 77, 95, 119, 97, 137, 208, 83, 109,
+  102, 68, 78, 106, 155, 159, 105, 112, 99, 117,
+  92, 94, 82, 179, 102, 121, 84, 103, 83, 128,
+  71, 94, 100, 78, 63, 146, 107, 125, 146, 105,
+  124, 72, 92, 116, 87, 64, 119, 112, 93, 79,
+  96, 146, 126, 46, 151, 117, 69, 117, 149, 110,
+  92, 120, 73, 82, 96, 96, 109, 112, 92, 161,
+  78, 103, 96, 100, 170, 129, 100, 162, 84, 92,
+  91, 84, 111, 95, 120, 87, 99, 126, 131, 149,
+  80, 94, 58, 117, 107, 130, 84, 162, 130, 104,
+  92, 94, 97, 77, 77, 110, 100, 123, 111, 139,
+  126, 106, 129, 98, 85, 125, 116, 100, 146, 148,
+  119, 108, 118, 148, 115, 76, 79, 104, 149, 70,
+  109, 137, 124, 80, 98, 96, 75, 117, 120, 64,
+  98, 109, 94, 71, 107, 95, 100, 94, 55, 49,
+  112, 114, 114, 121, 104, 92, 99, 112, 127, 95,
+  106, 120, 133, 130, 91, 111, 145, 80, 139, 104,
+  98, 73, 125, 125, 106, 139, 71, 95, 126, 42,
+  102, 112, 81, 82, 161, 111, 89, 71, 115, 116,
+  96, 121, 140, 122, 77, 84, 131, 104, 134, 218,
+  87, 122, 91, 79, 90, 105, 150, 137, 108, 93,
+  98, 112, 102, 91, 92, 159, 136, 165, 96, 112,
+  86, 140, 72, 90, 91, 70, 59, 146, 100, 113,
+  153, 97, 116, 71, 119, 122, 97, 70, 125, 121,
+  90, 107, 97, 137, 138, 65, 153, 108, 67, 99,
+  145, 102, 88, 110, 88, 88, 95, 100, 89, 115,
+  95, 181, 95, 101, 97, 102, 168, 126, 120, 160,
+  96, 95, 83, 91, 115, 106, 119, 99, 83, 114,
+  114, 140, 86, 101, 64, 131, 124, 138, 84, 154,
+  120, 93, 94, 96, 85, 77, 66, 110, 89, 126,
+  133, 137, 136, 117, 123, 103, 84, 121, 116, 121,
+  151, 161, 120, 110, 133, 151, 101, 73, 85, 117,
+  140, 72, 109, 143, 126, 87, 96, 86, 84, 108,
+  119, 58, 93, 105, 90, 97, 91, 75, 76, 87,
+  70, 55, 113, 107, 119, 107, 103, 93, 107, 121,
+  123, 95, 104, 127, 136, 157, 81, 124, 158, 86,
+  120, 116, 113, 77, 138, 116, 102, 135, 83, 87,
+  128, 39, 100, 109, 90, 81, 161, 114, 95, 78,
+  131, 118, 107, 114, 144, 125, 79, 82, 125, 107,
+  128, 205, 85, 95, 97, 87, 81, 115, 124, 132,
+  130, 73, 95, 74, 91, 83, 100, 148, 133, 181,
+  125, 124, 85, 131, 81, 83, 79, 79, 48, 149,
+  88, 89, 132, 90, 123, 73, 114, 129, 113, 89,
+  98, 127, 71, 94, 96, 126, 132, 85, 108, 84,
+  81, 96, 156, 99, 82, 116, 82, 106, 102, 164,
+  91, 147, 118, 154, 111, 108, 114, 117, 146, 130,
+  139, 123, 121, 120, 82, 116, 111, 105, 116, 87,
+  91, 119, 89, 111, 95, 93, 86, 151, 160, 143,
+  84, 164, 102, 87, 85, 107, 89, 82, 55, 130,
+  89, 103, 169, 116, 159, 108, 119, 116, 88, 119,
+  110, 123, 154, 132, 113, 133, 100, 139, 110, 66,
+  93, 128, 108, 61, 95, 122, 121, 95, 63, 100,
+  88, 114, 127, 81, 111, 107, 104, 121, 70, 71,
+  60, 95, 92, 58, 121, 134, 90, 109, 112, 100,
+  102, 138, 108, 126, 100, 131, 120, 126, 72, 117,
+  130, 93, 106, 115, 124, 70, 135, 134, 100, 123,
+  100, 85, 121, 61, 79, 114, 79, 105, 149, 95,
+  113, 106, 98, 133, 121, 118, 144, 109, 78, 92,
+  110, 109, 99, 181, 68, 89, 91, 119, 98, 152,
+  85, 109, 128, 91, 83, 38, 87, 80, 121, 129,
+  109, 170, 162, 135, 88, 116, 93, 69, 77, 113,
+  34, 122, 69, 44, 100, 76, 79, 90, 102, 109,
+  98, 92, 91, 96, 82, 82, 111, 88, 138, 126,
+  76, 75, 94, 93, 144, 113, 40, 101, 86, 114,
+  101, 195, 120, 151, 116, 123, 132, 100, 104, 127,
+  89, 106, 170, 99, 156, 131, 110, 127, 85, 93,
+  88, 93, 71, 88, 72, 80, 103, 93, 122, 156,
+  149, 109, 91, 134, 78, 85, 100, 102, 100, 83,
+  95, 121, 101, 68, 161, 97, 134, 112, 93, 120,
+  86, 97, 84, 130, 159, 79, 115, 150, 95, 137,
+  108, 74, 90, 96, 86, 66, 70, 110, 112, 75,
+  40, 129, 116, 132, 116, 123, 120, 89, 116, 126,
+  56, 90, 68, 79, 118, 85, 123, 114, 76, 118,
+  128, 107, 99, 144, 101, 140, 82, 128, 75, 86,
+  108, 106, 96, 106, 86, 93, 164, 99, 128, 133,
+  105, 105, 110, 131, 102, 85, 65, 110, 83, 123,
+  110, 107, 145, 128, 63, 122, 121, 102, 136, 90,
+  83, 85, 97, 91, 75, 124, 79, 97, 79, 141,
+  114, 163, 67, 102, 98, 113, 59, 57, 92, 80,
+  126, 114, 101, 136, 161, 137, 58, 93, 82, 56,
+  84, 141, 24, 94, 96, 21, 64, 55, 30, 80,
+  110, 87, 63, 78, 85, 75, 102, 76, 120, 48,
+  132, 113, 47, 101, 82, 86, 123, 114, 3, 82,
+  71, 124, 91, 153, 133, 120, 107, 119, 187, 104,
+  79, 119, 68, 91, 161, 90, 141, 169, 175, 103,
+  72, 79, 74, 107, 72, 51, 57, 57, 87, 97,
+  99, 131, 81, 63, 71, 90, 68, 101, 112, 97,
+  99, 81, 121, 136, 143, 34, 129, 88, 99, 56,
+  85, 127, 86, 70, 65, 95, 196, 62, 119, 131,
+  96, 119, 102, 103, 102, 59, 64, 125, 65, 104,
+  105, 64, 18, 93, 132, 117, 104, 112, 124, 59,
+  111, 159, 61, 100, 84, 53, 149, 95, 106, 88,
+  83, 143, 155, 131, 94, 150, 95, 140, 75, 102,
+  52, 59, 97, 76, 64, 115, 84, 104, 147, 90,
+  75, 80, 97, 94, 99, 166, 88, 69, 73, 98,
+  96, 99, 78, 123, 183, 137, 63, 127, 123, 90,
+  101, 70, 141, 93, 116, 58, 64, 53, 106, 69,
+  82, 136, 105, 142, 87, 100, 84, 104, 68, 99,
+  94, 105, 123, 140, 91, 102, 120, 136, 61, 66,
+  92, 59, 89, 114, 28, 130, 119, 39, 59, 70,
+  50, 59, 75, 115, 68, 91, 67, 94, 107, 66,
+  125, 49, 117, 97, 45, 141, 107, 104, 112, 120,
+  38, 82, 68, 133, 92, 158, 125, 116, 123, 134,
+  194, 130, 60, 98, 81, 96, 116, 105, 86, 182,
+  158, 85, 96, 79, 88, 74, 78, 61, 62, 63,
+  96, 114, 99, 120, 75, 64, 72, 103, 74, 118,
+  99, 106, 104, 66, 99, 134, 170, 43, 113, 99,
+  100, 61, 93, 119, 101, 96, 64, 87, 190, 67,
+  111, 163, 93, 113, 114, 124, 99, 69, 75, 147,
+  52, 109, 108, 73, 33, 60, 101, 75, 116, 69,
+  144, 67, 111, 141, 85, 95, 132, 66, 163, 111,
+  90, 101, 78, 146, 138, 128, 102, 147, 82, 132,
+  78, 103, 59, 81, 97, 71, 65, 100, 130, 118,
+  108, 73, 57, 65, 84, 77, 98, 174, 95, 52,
+  85, 120, 83, 80, 80, 116, 170, 153, 70, 156,
+  105, 78, 87, 50, 167, 96, 137, 52, 62, 32,
+  121, 93, 72, 103, 116, 128, 104, 122, 84, 107,
+  78, 137, 100, 126, 122, 196, 92, 109, 82, 117,
+  82, 66, 110, 78, 127, 85, 31, 194, 110, 87,
+  82, 88, 122, 45, 75, 138, 124, 104, 86, 112,
+  126, 89, 113, 93, 97, 113, 59, 133, 126, 99,
+  128, 120, 112, 84, 78, 118, 106, 186, 97, 114,
+  143, 172, 157, 158, 86, 121, 117, 121, 99, 126,
+  101, 142, 100, 106, 129, 80, 102, 95, 82, 112,
+  113, 92, 130, 130, 112, 143, 129, 99, 82, 123,
+  104, 86, 80, 112, 102, 79, 96, 144, 130, 88,
+  130, 96, 106, 81, 95, 111, 122, 141, 87, 104,
+  131, 130, 110, 168, 85, 124, 144, 113, 103, 119,
+  89, 109, 54, 131, 100, 118, 52, 67, 59, 105,
+  139, 71, 117, 92, 99, 85, 110, 94, 147, 113,
+  135, 106, 95, 90, 89, 130, 102, 112, 109, 146,
+  92, 113, 89, 136, 79, 118, 100, 95, 101, 102,
+  174, 107, 107, 70, 97, 95, 97, 44, 94, 147,
+  105, 52, 106, 100, 61, 94, 103, 88, 120, 150,
+  96, 148, 110, 83, 94, 68, 126, 92, 135, 92,
+  55, 78, 141, 120, 73, 93, 107, 137, 94, 119,
+  129, 88, 77, 136, 88, 136, 118, 211, 129, 145,
+  72, 115, 97, 84, 112, 90, 121, 73, 37, 215,
+  114, 95, 103, 115, 146, 78, 87, 142, 128, 96,
+  124, 149, 137, 118, 110, 129, 116, 139, 54, 131,
+  106, 78, 139, 107, 125, 89, 114, 90, 113, 211,
+  100, 123, 151, 170, 103, 163, 79, 121, 139, 123,
+  77, 106, 130, 124, 63, 117, 133, 79, 113, 99,
+  76, 154, 96, 113, 139, 120, 121, 152, 174, 140,
+  94, 126, 110, 73, 91, 109, 114, 89, 111, 171,
+  97, 122, 135, 79, 114, 94, 110, 106, 125, 142,
+  104, 157, 108, 207, 94, 109, 91, 123, 158, 117,
+  104, 155, 99, 95, 68, 145, 126, 123, 61, 74,
+  99, 170, 153, 92, 113, 79, 106, 75, 97, 128,
+  112, 155, 92, 96, 86, 68, 100, 144, 129, 103,
+  113, 162, 100, 126, 65, 137, 93, 141, 88, 125,
+  135, 98, 151, 95, 124, 70, 125, 140, 96, 61,
+  120, 105, 105, 68, 100, 118, 67, 83, 158, 97,
+  83, 122, 94, 139, 123, 97, 132, 112, 111, 110,
+  103, 114, 68, 134, 143, 112, 85, 81, 89, 154,
+  65, 96, 109, 75, 76, 91, 74, 92, 110, 146,
+  96, 110, 98, 100, 81, 85, 70, 80, 107, 108,
+  31, 116, 63, 61, 89, 99, 120, 88, 71, 96,
+  94, 102, 111, 134, 146, 162, 82, 115, 100, 107,
+  67, 95, 90, 77, 122, 79, 99, 95, 104, 122,
+  99, 154, 106, 113, 131, 122, 102, 105, 92, 110,
+  81, 96, 100, 68, 136, 91, 84, 112, 75, 96,
+  93, 156, 80, 123, 24, 111, 110, 106, 134, 126,
+  141, 120, 96, 103, 87, 78, 105, 71, 86, 104,
+  148, 166, 155, 110, 87, 60, 92, 94, 84, 91,
+  93, 81, 70, 146, 124, 138, 108, 98, 78, 113,
+  110, 126, 120, 107, 64, 88, 83, 100, 124, 90,
+  37, 80, 105, 138, 97, 137, 96, 79, 109, 140,
+  77, 120, 109, 104, 97, 78, 63, 88, 110, 121,
+  134, 85, 63, 145, 78, 124, 68, 100, 80, 81,
+  68, 88, 104, 104, 80, 107, 127, 108, 85, 117,
+  103, 93, 142, 116, 70, 95, 96, 193, 77, 121,
+  125, 90, 79, 99, 105, 132, 116, 106, 107, 108,
+  111, 103, 74, 104, 87, 131, 118, 90, 109, 107,
+  125, 126, 104, 118, 112, 120, 109, 67, 95, 97,
+  116, 115, 118, 86, 105, 105, 95, 86, 86, 101,
+  114, 103, 39, 132, 91, 73, 121, 95, 116, 102,
+  95, 94, 103, 138, 109, 93, 117, 89, 112, 102,
+  123, 86, 95, 84, 87, 128, 105, 97, 111, 117,
+  92, 147, 121, 115, 145, 95, 118, 86, 113, 96,
+  108, 93, 87, 110, 112, 87, 127, 124, 108, 102,
+  84, 131, 123, 104, 94, 109, 49, 92, 129, 92,
+  144, 102, 84, 110, 108, 91, 81, 106, 133, 104,
+  97, 104, 147, 154, 211, 103, 102, 99, 115, 139,
+  107, 112, 98, 90, 91, 69, 128, 105, 119, 111,
+  94, 108, 101, 130, 133, 87, 116, 98, 108, 86,
+  116, 70, 57, 81, 97, 90, 112, 117, 163, 115,
+  90, 96, 127, 115, 136, 102, 109, 85, 95, 127,
+  94, 95, 87, 94, 93, 96, 73, 114, 119, 98,
+  93, 110, 63, 156, 101, 90, 72, 101, 99, 90,
+  73, 113, 112, 94, 153, 120, 75, 145, 117, 161,
+  114, 115, 90, 91, 97, 98, 97, 101, 90, 138,
+  84, 83, 88, 91, 80, 85, 110, 108, 152, 105,
+  115, 121, 98, 97, 99, 126, 116, 109, 126, 97,
+  119, 111, 99, 95, 129, 112, 110, 95, 82, 84,
+  98, 75, 107, 95, 28, 119, 107, 102, 124, 94,
+  96, 101, 130, 85, 95, 133, 118, 82, 94, 86,
+  74, 88, 143, 92, 117, 116, 85, 154, 91, 119,
+  121, 116, 100, 132, 121, 81, 115, 135, 89, 79,
+  117, 87, 128, 116, 76, 106, 95, 86, 119, 155,
+  107, 105, 93, 141, 124, 86, 88, 118, 100, 85,
+  127, 94, 131, 85, 59, 92, 115, 101, 65, 132,
+  121, 144, 101, 97, 102, 105, 136, 106, 94, 102,
+  120, 151, 108, 105, 105, 72, 110, 106, 133, 100,
+  124, 90, 72, 102, 103, 123, 110, 64, 118, 91,
+  152, 99, 118, 93, 58, 79, 125, 107, 111, 90,
+  124, 113, 99, 113, 154, 119, 97, 98, 96, 82,
+  81, 132, 105, 111, 78, 92, 132, 109, 89, 103,
+  105, 99, 85, 109, 46, 131, 94, 90, 89, 102,
+  64, 111, 92, 107, 92, 105, 131, 113, 59, 102,
+  105, 79, 109, 71, 92, 87, 107, 108, 105, 126,
+  82, 145, 88, 80, 80, 106, 65, 94, 105, 69,
+  151, 115, 119, 105, 105, 110, 60, 113, 74, 111,
+  101, 119, 100, 104, 95, 107, 92, 97, 94, 103,
+  73, 76, 94, 49, 100, 91, 40, 108, 112, 89,
+  85, 75, 77, 98, 147, 86, 109, 97, 109, 70,
+  112, 124, 62, 71, 116, 76, 101, 94, 97, 150,
+  88, 117, 122, 114, 99, 137, 126, 108, 113, 101,
+  108, 92, 95, 97, 105, 139, 48, 80, 98, 100,
+  114, 134, 96, 104, 81, 104, 102, 131, 97, 109,
+  122, 65, 95, 77, 153, 96, 51, 65, 123, 106,
+  55, 114, 103, 131, 86, 84, 94, 91, 121, 68,
+  92, 92, 84, 119, 94, 99, 105, 51, 81, 106,
+  116, 91, 116, 96, 103, 87, 101, 118, 88, 57,
+  82, 95, 124, 112, 117, 120, 42, 73, 112, 127,
+  89, 67, 80, 77, 81, 106, 111, 110, 117, 90,
+  86, 106, 86, 138, 112, 135, 91, 81, 121, 155,
+  83, 100, 59, 121, 41, 75, 66, 101, 72, 107,
+  99, 112, 81, 106, 87, 78, 116, 69, 99, 129,
+  56, 40, 97, 82, 74, 112, 77, 96, 101, 131,
+  83, 166, 99, 121, 109, 62, 98, 118, 46, 89,
+  82, 51, 117, 95, 149, 101, 109, 115, 70, 123,
+  79, 116, 85, 122, 80, 117, 105, 142, 95, 90,
+  106, 103, 78, 86, 104, 44, 92, 78, 57, 125,
+  132, 99, 86, 86, 99, 111, 109, 139, 129, 69,
+  98, 75, 126, 119, 103, 79, 100, 58, 75, 106,
+  98, 131, 105, 105, 129, 90, 75, 118, 112, 139,
+  122, 57, 168, 118, 77, 140, 94, 126, 89, 133,
+  105, 134, 104, 104, 106, 77, 102, 98, 108, 142,
+  123, 125, 129, 64, 69, 83, 128, 93, 70, 72,
+  134, 153, 74, 92, 105, 69, 93, 70, 92, 120,
+  136, 79, 110, 125, 116, 98, 130, 110, 107, 91,
+  83, 73, 80, 109, 130, 129, 114, 83, 102, 97,
+  102, 103, 76, 106, 85, 126, 98, 136, 50, 85,
+  83, 120, 109, 67, 88, 54, 55, 89, 78, 120,
+  143, 117, 85, 117, 104, 158, 121, 156, 103, 97,
+  104, 171, 81, 96, 73, 114, 45, 110, 72, 116,
+  82, 117, 113, 92, 81, 48, 103, 69, 98, 63,
+  92, 94, 76, 30, 91, 84, 64, 96, 69, 96,
+  75, 149, 70, 162, 115, 131, 121, 59, 128, 94,
+  75, 90, 96, 89, 102, 86, 162, 103, 93, 106,
+  100, 133, 96, 115, 99, 102, 92, 126, 115, 146,
+  90, 77, 113, 105, 94, 101, 106, 92, 98, 106,
+  92, 129, 155, 105, 102, 108, 129, 127, 47, 157,
+  132, 95, 89, 111, 127, 85, 137, 108, 100, 38,
+  80, 90, 103, 109, 108, 112, 119, 93, 80, 101,
+  95, 150, 129, 86, 167, 114, 100, 127, 124, 113,
+  139, 170, 129, 126, 105, 109, 97, 85, 97, 100,
+  115, 122, 192, 124, 130, 104, 70, 102, 103, 78,
+  106, 112, 140, 174, 94, 91, 102, 66, 119, 81,
+  112, 105, 145, 98, 113, 141, 150, 99, 150, 120,
+  101, 120, 104, 109, 93, 111, 129, 140, 101, 79,
+  96, 91, 127, 128, 83, 117, 81, 133, 93, 130,
+  74, 131, 74, 119, 126, 109, 115, 75, 111, 117,
+  76, 108, 162, 116, 105, 115, 127, 160, 128, 159,
+  117, 108, 100, 157, 96, 105, 85, 93, 88, 132,
+  65, 118, 95, 98, 115, 94, 109, 38, 116, 95,
+  123, 96, 94, 90, 102, 74, 100, 118, 86, 102,
+  103, 107, 83, 137, 79, 131, 110, 148, 143, 75,
+  135, 92, 99, 81, 118, 124, 105, 122, 155, 104,
+  109, 112, 103, 132, 122, 113, 136, 107, 113, 124,
+  104, 110, 130, 128, 111, 115, 132, 106, 122, 121,
+  141, 87, 89, 96, 119, 124, 135, 109, 138, 87,
+  114, 118, 105, 149, 102, 69, 90, 112, 138, 107,
+  135, 92, 119, 81, 83, 129, 119, 104, 107, 114,
+  79, 141, 130, 105, 139, 159, 106, 83, 115, 97,
+  131, 140, 136, 139, 98, 99, 121, 118, 109, 106,
+  123, 129, 125, 101, 160, 134, 81, 119, 108, 95,
+  79, 120, 104, 123, 110, 127, 97, 118, 112, 147,
+  109, 110, 102, 121, 83, 118, 138, 120, 159, 103,
+  139, 129, 133, 89, 137, 115, 118, 104, 139, 90,
+  66, 109, 103, 101, 109, 125, 108, 111, 121, 122,
+  97, 104, 101, 115, 86, 109, 119, 111, 123, 120,
+  111, 130, 122, 73, 125, 113, 106, 159, 73, 120,
+  111, 110, 111, 115, 130, 92, 131, 110, 109, 110,
+  129, 116, 55, 100, 112, 94, 98, 93, 82, 112,
+  137, 103, 88, 111, 119, 114, 113, 125, 114, 94,
+  119, 98, 83, 97, 112, 103, 101, 111, 87, 142,
+  113, 109, 126, 106, 106, 81, 97, 103, 107, 101,
+  165, 99, 135, 101, 76, 112, 122, 112, 135, 125,
+  91, 118, 90, 126, 109, 114, 106, 116, 123, 95,
+  114, 126, 133, 99, 80, 69, 29, 110, 143, 89,
+  98, 81, 133, 75, 83, 103, 80, 98, 104, 102,
+  123, 78, 119, 128, 123, 68, 69, 174, 89, 109,
+  100, 132, 63, 99, 107, 115, 147, 157, 66, 94,
+  102, 91, 122, 144, 106, 100, 106, 106, 109, 96,
+  101, 93, 120, 106, 119, 111, 99, 131, 83, 93,
+  90, 99, 99, 105, 100, 139, 104, 133, 90, 110,
+  122, 143, 99, 82, 98, 109, 95, 102, 106, 107,
+  150, 118, 151, 131, 146, 90, 123, 139, 95, 119,
+  141, 92, 69, 110, 75, 105, 111, 116, 106, 100,
+  116, 157, 99, 76, 81, 125, 56, 133, 96, 118,
+  141, 58, 121, 115, 117, 83, 128, 107, 103, 190,
+  109, 76, 130, 135, 125, 92, 114, 129, 133, 101,
+  111, 142, 109, 106, 86, 70, 122, 92, 74, 105,
+  149, 142, 106, 86, 120, 105, 96, 129, 91, 76,
+  101, 104, 90, 134, 85, 83, 104, 96, 98, 90,
+  100, 130, 109, 102, 109, 99, 102, 93, 99, 102,
+  88, 133, 138, 98, 157, 128, 80, 95, 137, 128,
+  97, 110, 88, 120, 97, 150, 123, 134, 106, 122,
+  139, 91, 123, 80, 125, 104, 74, 92, 35, 106,
+  144, 99, 95, 103, 116, 75, 95, 100, 79, 129,
+  125, 83, 108, 95, 108, 127, 83, 141, 80, 185,
+  118, 131, 105, 113, 94, 75, 88, 131, 126, 92,
+  67, 98, 91, 93, 107, 107, 91, 83, 112, 127,
+  112, 115, 85, 104, 101, 89, 126, 85, 81, 124,
+  87, 104, 109, 84, 122, 66, 103, 126, 97, 140,
+  96, 99, 109, 114, 106, 79, 121, 106, 107, 104,
+  115, 82, 143, 113, 159, 132, 134, 112, 109, 170,
+  85, 114, 114, 102, 76, 101, 86, 118, 105, 129,
+  115, 99, 102, 172, 113, 74, 69, 107, 80, 122,
+  119, 85, 162, 56, 118, 82, 121, 172, 107, 120,
+  77, 194, 126, 75, 141, 156, 139, 89, 119, 170,
+  124, 104, 59, 112, 89, 125, 103, 97, 135, 105,
+  78, 121, 114, 130, 89, 106, 107, 103, 121, 137,
+  90, 61, 99, 117, 79, 85, 131, 84, 103, 87,
+  108, 78, 96, 128, 126, 119, 84, 86, 80, 104,
+  106, 112, 97, 119, 155, 65, 83, 116, 75, 89,
+  110, 150, 83, 83, 69, 93, 64, 81, 89, 83,
+  105, 110, 119, 86, 100, 109, 113, 138, 41, 62,
+  32, 93, 123, 79, 115, 91, 121, 58, 93, 103,
+  64, 105, 121, 113, 73, 79, 82, 84, 92, 80,
+  59, 159, 100, 99, 89, 114, 76, 91, 86, 102,
+  100, 73, 80, 102, 101, 62, 108, 117, 69, 76,
+  89, 108, 91, 81, 75, 88, 63, 81, 104, 147,
+  86, 113, 70, 104, 94, 80, 113, 70, 66, 71,
+  88, 127, 59, 85, 110, 101, 89, 67, 122, 113,
+  124, 94, 88, 75, 112, 85, 106, 109, 122, 69,
+  74, 121, 87, 107, 119, 85, 75, 99, 57, 102,
+  108, 110, 92, 96, 101, 127, 111, 82, 52, 91,
+  67, 94, 67, 99, 97, 77, 95, 105, 109, 139,
+  84, 102, 91, 167, 76, 75, 112, 118, 108, 78,
+  94, 127, 95, 86, 46, 95, 69, 89, 62, 62,
+  96, 81, 39, 127, 60, 99, 78, 61, 109, 107,
+  122, 103, 89, 52, 88, 149, 83, 121, 76, 72,
+  87, 89, 134, 90, 80, 129, 92, 93, 96, 72,
+  59, 73, 110, 96, 64, 81, 182, 79, 121, 87,
+  136, 132, 123, 124, 98, 108, 82, 110, 71, 112,
+  105, 74, 95, 90, 120, 94, 112, 96, 114, 82,
+  50, 105, 77, 106, 148, 101, 139, 96, 93, 118,
+  113, 101, 81, 81, 86, 91, 123, 106, 107, 111,
+  95, 83, 54, 153, 101, 100, 99, 125, 62, 80,
+  70, 109, 113, 71, 138, 77, 94, 95, 139, 106,
+  126, 153, 99, 132, 112, 97, 105, 66, 84, 127,
+  133, 94, 107, 126, 93, 83, 91, 98, 98, 80,
+  60, 128, 102, 160, 83, 96, 115, 68, 104, 73,
+  75, 107, 124, 97, 121, 126, 146, 135, 129, 123,
+  98, 101, 95, 60, 94, 102, 110, 92, 61, 102,
+  84, 98, 106, 114, 121, 88, 96, 119, 106, 84,
+  61, 87, 85, 100, 142, 75, 166, 92, 91, 79,
+  104, 87, 134, 125, 92, 143, 126, 105, 106, 104,
+  74, 102, 108, 107, 90, 92, 108, 116, 96, 142,
+  54, 140, 118, 71, 74, 82, 82, 30, 71, 103,
+  82, 108, 97, 84, 124, 101, 80, 116, 87, 68,
+  89, 79, 91, 92, 107, 95, 68, 171, 87, 61,
+  87, 79, 73, 73, 120, 112, 86, 98, 162, 62,
+  97, 79, 95, 138, 124, 98, 110, 116, 76, 101,
+  73, 120, 105, 98, 76, 91, 116, 80, 109, 107,
+  107, 96, 45, 115, 79, 107, 134, 90, 124, 90,
+  98, 95, 77, 100, 69, 95, 99, 90, 90, 106,
+  97, 123, 93, 70, 52, 130, 121, 122, 92, 105,
+  64, 95, 88, 103, 114, 128, 124, 97, 92, 83,
+  191, 149, 122, 152, 96, 148, 127, 83, 111, 88,
+  99, 124, 135, 99, 80, 116, 108, 95, 84, 94,
+  124, 78, 75, 128, 111, 149, 90, 85, 94, 118,
+  103, 81, 82, 73, 79, 100, 133, 119, 129, 146,
+  107, 126, 96, 101, 94, 139, 106, 103, 120, 99,
+  74, 101, 74, 107, 116, 101, 111, 86, 116, 104,
+  114, 87, 37, 101, 77, 126, 120, 135, 140, 89,
+  105, 116, 107, 85, 102, 126, 106, 93, 149, 90,
+  109, 112, 91, 99, 100, 105, 73, 81, 78, 97,
+  91, 116, 78, 103, 101, 69, 63, 71, 130, 44,
+  78, 94, 110, 97, 88, 111, 117, 76, 74, 88,
+  84, 95, 85, 75, 94, 77, 139, 123, 73, 138,
+  90, 65, 90, 84, 83, 86, 94, 112, 94, 137,
+  113, 73, 133, 115, 46, 106, 137, 141, 126, 99,
+  73, 118, 89, 151, 88, 101, 83, 97, 123, 77,
+  121, 112, 104, 90, 58, 95, 68, 95, 131, 99,
+  103, 127, 93, 80, 83, 134, 60, 134, 160, 85,
+  98, 103, 105, 119, 73, 107, 102, 138, 151, 134,
+  103, 134, 99, 100, 93, 116, 140, 154, 96, 113,
+  92, 92, 131, 147, 81, 91, 106, 120, 108, 120,
+  87, 125, 117, 95, 120, 132, 90, 97, 109, 108,
+  100, 86, 148, 66, 97, 86, 121, 149, 104, 87,
+  114, 137, 90, 106, 120, 87, 77, 109, 109, 67,
+  107, 131, 126, 105, 117, 122, 97, 119, 93, 114,
+  116, 109, 98, 116, 96, 111, 103, 113, 111, 116,
+  92, 131, 126, 57, 50, 104, 89, 124, 121, 126,
+  140, 85, 132, 105, 118, 134, 85, 128, 100, 81,
+  135, 93, 138, 158, 136, 83, 98, 135, 96, 112,
+  87, 107, 69, 83, 157, 93, 103, 110, 81, 106,
+  117, 125, 86, 127, 131, 111, 120, 149, 80, 78,
+  102, 96, 80, 138, 122, 79, 94, 78, 146, 130,
+  95, 89, 121, 87, 82, 76, 71, 119, 85, 93,
+  95, 120, 91, 78, 111, 115, 84, 111, 161, 143,
+  138, 103, 81, 114, 97, 153, 110, 108, 98, 93,
+  116, 105, 115, 125, 102, 132, 75, 117, 74, 92,
+  136, 97, 116, 125, 118, 78, 114, 144, 86, 138,
+  162, 99, 87, 106, 125, 109, 85, 125, 103, 132,
+  149, 138, 93, 128, 109, 94, 83, 135, 116, 96,
+  82, 98, 120, 89, 100, 101, 135, 119, 130, 92,
+  96, 144, 103, 122, 119, 78, 129, 119, 84, 97,
+  92, 109, 92, 96, 103, 60, 110, 130, 105, 139,
+  101, 105, 122, 120, 102, 102, 143, 100, 153, 115,
+  107, 60, 146, 117, 122, 102, 161, 138, 125, 132,
+  91, 114, 112, 136, 76, 124, 113, 118, 83, 139,
+  109, 119, 88, 129, 135, 84, 68, 100, 83, 87,
+  124, 81, 127, 114, 147, 109, 103, 142, 115, 117,
+  107, 78, 125, 114, 150, 146, 133, 103, 130, 109,
+  91, 107, 72, 100, 106, 98, 74, 105, 117, 107,
+  81, 151, 67, 132, 85, 109, 123, 127, 113, 129,
+  106, 98, 117, 140, 97, 138, 131, 109, 128, 92,
+  104, 117, 98, 91, 144, 120, 87, 79, 93, 93,
+  84, 89, 82, 112, 90, 87, 103, 104, 147, 134,
+  134, 130, 128, 144, 87, 105, 78, 127, 109, 101,
+  106, 98, 110, 116, 103, 147, 103, 127, 70, 132,
+  87, 91, 129, 83, 105, 75, 136, 72, 89, 119,
+  107, 113, 118, 96, 79, 100, 135, 81, 124, 86,
+  78, 141, 142, 107, 76, 135, 88, 119, 75, 88,
+  100, 122, 96, 141, 123, 93, 120, 93, 131, 105,
+  106, 107, 89, 130, 116, 99, 123, 100, 128, 117,
+  91, 106, 77, 90, 99, 102, 94, 81, 60, 135,
+  108, 125, 98, 120, 137, 107, 105, 94, 119, 123,
+  138, 112, 99, 109, 122, 119, 79, 118, 167, 110,
+  124, 95, 151, 123, 128, 104, 104, 131, 131, 100,
+  87, 105, 119, 101, 103, 108, 137, 83, 97, 61,
+  86, 83, 107, 76, 81, 141, 130, 123, 106, 85,
+  127, 114, 99, 65, 107, 107, 113, 102, 106, 105,
+  126, 95, 97, 100, 90, 151, 125, 117, 63, 86,
+  105, 84, 90, 152, 93, 111, 90, 91, 109, 143,
+  91, 111, 106, 83, 100, 154, 96, 128, 98, 118,
+  135, 96, 106, 126, 96, 105, 123, 116, 109, 78,
+  93, 83, 102, 103, 99, 116, 102, 93, 100, 116,
+  189, 162, 113, 131, 101, 144, 86, 106, 86, 154,
+  97, 105, 92, 111, 107, 116, 116, 99, 110, 97,
+  74, 162, 91, 90, 123, 84, 114, 68, 122, 84,
+  91, 87, 115, 111, 88, 79, 82, 113, 115, 77,
+  139, 96, 76, 175, 130, 100, 100, 132, 60, 129,
+  69, 101, 111, 115, 103, 145, 113, 100, 107, 102,
+  134, 106, 104, 135, 86, 110, 93, 86, 117, 117,
+  129, 95, 103, 126, 90, 89, 116, 98, 118, 88,
+  59, 101, 112, 138, 108, 100, 118, 97, 95, 96,
+  86, 127, 98, 108, 112, 147, 117, 117, 85, 122,
+  123, 100, 110, 77, 161, 103, 128, 114, 114, 124,
+  160, 99, 78, 83, 131, 92, 101, 124, 127, 76,
+  97, 45, 92, 95, 114, 64, 74, 122, 97, 93,
+  103, 101, 135, 110, 84, 70, 91, 116, 108, 114,
+  106, 104, 107, 99, 120, 95, 99, 173, 112, 124,
+  80, 95, 119, 94, 135, 119, 94, 101, 88, 96,
+  114, 120, 95, 109, 107, 59, 90, 117, 64, 107,
+  113, 105, 123, 96, 95, 126, 99, 115, 128, 112,
+  102, 61, 105, 109, 104, 146, 106, 117, 92, 92,
+  95, 116, 182, 174, 113, 134, 101, 139, 83, 102,
+  102, 185, 90, 111, 96, 110, 106, 124, 107, 77,
+  119, 89, 72, 170, 82, 105, 126, 92, 127, 69,
+  107, 98, 101, 72, 117, 136, 76, 71, 89, 125,
+  112, 68, 144, 104, 74, 175, 128, 108, 107, 100,
+  68, 102, 68, 118, 109, 96, 104, 156, 103, 111,
+  109, 98, 150, 122, 116, 132, 88, 82, 71, 80,
+  111, 100, 139, 86, 114, 145, 133, 124, 114, 99,
+  104, 83, 85, 97, 103, 152, 129, 89, 100, 112,
+  91, 95, 84, 105, 84, 119, 124, 150, 120, 109,
+  109, 105, 109, 93, 113, 99, 150, 120, 130, 113,
+  105, 132, 169, 94, 72, 98, 146, 76, 108, 136,
+  126, 77, 93, 64, 89, 104, 122, 63, 69, 111,
+  74, 67, 92, 140, 136, 119, 70, 62, 107, 111,
+  115, 133, 117, 103, 101, 104, 127, 98, 111, 145,
+  111, 126, 73, 115, 136, 94, 155, 109, 89, 94,
+  94, 102, 97, 101, 92, 85, 114, 55, 92, 98,
+  63, 86, 130, 92, 108, 98, 101, 111, 101, 117,
+  138, 120, 71, 67, 105, 112, 119, 180, 118, 124,
+  89, 82, 87, 106, 152, 164, 112, 119, 103, 128,
+  84, 82, 96, 178, 94, 116, 114, 126, 96, 122,
+  78, 85, 106, 101, 69, 149, 81, 125, 120, 91,
+  112, 90, 114, 94, 103, 78, 107, 138, 85, 77,
+  92, 131, 115, 56, 141, 122, 78, 137, 132, 109,
+  90, 95, 84, 91, 75, 113, 102, 102, 89, 151,
+  81, 108, 124, 101, 144, 111, 118, 131, 95, 82,
+  82, 67, 107, 92, 133, 92, 98, 149, 179, 164,
+  105, 96, 93, 81, 96, 81, 90, 141, 125, 97,
+  118, 129, 104, 94, 78, 78, 92, 129, 122, 135,
+  105, 124, 108, 93, 96, 103, 113, 113, 144, 128,
+  119, 101, 118, 128, 153, 91, 76, 102, 144, 62,
+  124, 122, 141, 89, 93, 91, 93, 120, 117, 85,
+  79, 111, 84, 80, 92, 134, 130, 116, 62, 50,
+  133, 109, 113, 128, 119, 100, 94, 98, 102, 113,
+  114, 141, 108, 119, 83, 115, 131, 90, 141, 116,
+  103, 96, 108, 103, 113, 106, 73, 73, 123, 58,
+  101, 110, 79, 92, 131, 109, 116, 108, 100, 123,
+  106, 112, 145, 117, 57, 97, 100, 99, 112, 185,
+  106, 122, 90, 73, 92, 98, 121, 136, 108, 109,
+  98, 110, 91, 65, 65, 155, 110, 110, 122, 130,
+  72, 113, 62, 106, 91, 114, 62, 119, 97, 126,
+  102, 85, 99, 113, 131, 108, 100, 90, 109, 125,
+  111, 90, 95, 127, 114, 66, 137, 123, 91, 97,
+  138, 105, 71, 95, 96, 97, 94, 101, 96, 106,
+  94, 146, 80, 101, 128, 115, 131, 102, 115, 144,
+  94, 99, 105, 82, 106, 85, 121, 122, 85, 139,
+  165, 182, 97, 84, 81, 98, 88, 84, 81, 133,
+  119, 129, 150, 114, 129, 86, 62, 95, 101, 130,
+  109, 115, 98, 112, 101, 79, 97, 101, 103, 104,
+  129, 143, 112, 95, 108, 131, 121, 93, 81, 113,
+  130, 72, 131, 99, 139, 103, 83, 105, 98, 115,
+  114, 99, 75, 99, 95, 112, 94, 104, 104, 105,
+  64, 44, 122, 114, 112, 121, 120, 94, 76, 98,
+  95, 125, 99, 161, 105, 109, 99, 100, 120, 91,
+  120, 127, 99, 90, 125, 91, 131, 121, 64, 72,
+  118, 57, 115, 109, 89, 100, 133, 120, 125, 117,
+  110, 129, 106, 103, 142, 121, 76, 123, 100, 84,
+  107, 181, 81, 100, 90, 85, 99, 85, 120, 136,
+  113, 121, 89, 117, 100, 67, 65, 164, 105, 97,
+  136, 125, 52, 104, 57, 126, 83, 108, 67, 123,
+  91, 114, 111, 93, 100, 94, 108, 125, 90, 89,
+  106, 114, 119, 78, 102, 131, 112, 75, 123, 105,
+  96, 79, 135, 110, 60, 104, 97, 105, 96, 99,
+  101, 100, 107, 138, 83, 103, 104, 109, 147, 115,
+  102, 138, 102, 113, 115, 88, 97, 86, 114, 109,
+  96, 117, 125, 184, 94, 82, 83, 120, 94, 104,
+  67, 139, 116, 157, 147, 99, 131, 81, 62, 123,
+  115, 122, 97, 96, 110, 99, 101, 73, 97, 108,
+  102, 89, 125, 135, 106, 111, 103, 130, 108, 82,
+  85, 116, 134, 79, 138, 101, 154, 92, 83, 99,
+  101, 107, 133, 75, 81, 95, 103, 121, 105, 95,
+  92, 90, 64, 40, 99, 115, 111, 133, 119, 94,
+  75, 99, 95, 128, 83, 155, 113, 106, 119, 112,
+  140, 94, 114, 127, 96, 68, 120, 105, 127, 127,
+  66, 91, 114, 71, 119, 104, 89, 99, 167, 114,
+  126, 99, 116, 105, 110, 103, 145, 126, 93, 138,
+  120, 73, 117, 176, 92, 102, 92, 104, 90, 90,
+  135, 146, 135, 99, 88, 123, 116, 79, 84, 170,
+  114, 100, 132, 127, 67, 117, 50, 127, 82, 105,
+  74, 127, 99, 100, 128, 103, 107, 74, 91, 129,
+  80, 87, 100, 117, 100, 81, 93, 143, 117, 56,
+  127, 111, 89, 80, 121, 121, 65, 104, 92, 105,
+  95, 84, 105, 121, 101, 133, 82, 108, 74, 103,
+  151, 122, 85, 128, 99, 106, 115, 84, 98, 91,
+  111, 88, 83, 116, 120, 176, 86, 90, 68, 121,
+  112, 133, 56, 140, 105, 160, 133, 111, 118, 88,
+  62, 110, 124, 124, 82, 92, 120, 105, 108, 88,
+  92, 108, 107, 103, 129, 119, 98, 103, 112, 137,
+  113, 89, 89, 114, 135, 84, 146, 113, 181, 90,
+  86, 98, 112, 116, 134, 72, 89, 104, 108, 113,
+  98, 95, 98, 76, 61, 42, 105, 119, 112, 139,
+  122, 106, 91, 100, 105, 127, 81, 139, 132, 114,
+  98, 108, 145, 91, 116, 118, 100, 77, 121, 132,
+  103, 139, 77, 99, 106, 70, 122, 117, 97, 70,
+  170, 117, 119, 77, 147, 100, 104, 110, 149, 128,
+  90, 139, 113, 74, 117, 176, 97, 127, 88, 119,
+  93, 114, 137, 129, 132, 103, 88, 104, 117, 89,
+  80, 158, 131, 133, 123, 122, 86, 120, 50, 103,
+  72, 106, 69, 118, 92, 82, 144, 92, 98, 83,
+  105, 124, 86, 88, 105, 107, 104, 92, 88, 142,
+  132, 43, 135, 107, 72, 85, 120, 115, 71, 133,
+  87, 106, 90, 74, 105, 139, 92, 158, 107, 109,
+  89, 114, 135, 112, 98, 131, 99, 106, 97, 79,
+  101, 97, 114, 101, 80, 115, 104, 157, 91, 91,
+  78, 111, 91, 136, 47, 125, 99, 131, 125, 97,
+  91, 90, 67, 121, 111, 117, 106, 93, 119, 96,
+  94, 114, 82, 105, 109, 113, 137, 141, 105, 91,
+  119, 137, 108, 89, 98, 106, 132, 91, 145, 132,
+  190, 87, 83, 96, 118, 113, 120, 85, 85, 103,
+  95, 123, 88, 85, 67, 75, 72, 45, 93, 151,
+  115, 125, 122, 110, 97, 108, 108, 116, 87, 147,
+  132, 130, 74, 96, 130, 95, 111, 128, 119, 92,
+  113, 125, 100, 153, 88, 96, 102, 58, 129, 119,
+  98, 102, 145, 124, 119, 73, 168, 120, 112, 105,
+  132, 129, 82, 136, 99, 90, 107, 175, 80, 114,
+  84, 125, 98, 137, 144, 147, 119, 105, 101, 93,
+  140, 96, 98, 165, 121, 150, 122, 122, 100, 99,
+  61, 84, 100, 62, 61, 152, 96, 82, 139, 94,
+  112, 70, 103, 125, 95, 96, 101, 105, 81, 86,
+  104, 146, 139, 62, 110, 99, 82, 103, 122, 110,
+  85, 163, 85, 140, 99, 113, 119, 150, 96, 135,
+  139, 122, 114, 125, 137, 111, 121, 132, 107, 134,
+  87, 91, 111, 90, 111, 84, 93, 106, 68, 116,
+  91, 106, 92, 122, 113, 123, 49, 128, 108, 113,
+  113, 96, 78, 94, 69, 116, 104, 89, 155, 102,
+  133, 98, 78, 155, 98, 111, 129, 97, 200, 127,
+  107, 98, 97, 127, 135, 100, 105, 110, 102, 93,
+  138, 140, 158, 79, 67, 68, 124, 112, 126, 68,
+  109, 118, 101, 132, 100, 81, 65, 82, 92, 52,
+  92, 182, 97, 119, 119, 126, 126, 116, 119, 126,
+  103, 164, 128, 123, 70, 96, 102, 101, 130, 130,
+  132, 81, 109, 133, 116, 145, 86, 126, 102, 57,
+  105, 125, 90, 128, 138, 120, 137, 82, 141, 150,
+  114, 110, 112, 109, 78, 124, 96, 107, 94, 167,
+  86, 99, 76, 127, 117, 161, 123, 141, 102, 89,
+  114, 90, 146, 100, 113, 166, 132, 154, 105, 135,
+  110, 81, 78, 78, 126, 70, 49, 168, 111, 81,
+  116, 83, 101, 75, 119, 112, 83, 102, 100, 100,
+  81, 97, 114, 130, 146, 97, 93, 106, 97, 118,
+  113, 107, 94, 129, 79, 167, 112, 166, 130, 141,
+  116, 153, 169, 149, 120, 125, 124, 101, 130, 142,
+  125, 136, 96, 96, 120, 91, 100, 85, 87, 100,
+  62, 98, 113, 109, 113, 147, 119, 84, 71, 113,
+  118, 104, 95, 98, 80, 85, 84, 118, 109, 78,
+  159, 116, 127, 108, 79, 162, 109, 83, 124, 102,
+  213, 104, 115, 131, 89, 140, 149, 122, 101, 115,
+  101, 95, 113, 122, 124, 64, 59, 75, 128, 121,
+  136, 88, 128, 114, 93, 121, 111, 100, 90, 106,
+  112, 72, 98, 150, 80, 109, 113, 122, 138, 119,
+  120, 130, 107, 151, 104, 113, 105, 102, 87, 109,
+  153, 122, 161, 79, 106, 125, 110, 106, 97, 149,
+  102, 60, 86, 116, 78, 118, 113, 100, 141, 110,
+  134, 155, 117, 103, 94, 80, 72, 115, 107, 104,
+  82, 134, 119, 101, 73, 119, 113, 154, 111, 124,
+  103, 98, 117, 106, 129, 99, 104, 170, 120, 131,
+  71, 113, 87, 63, 78, 70, 148, 104, 30, 164,
+  121, 96, 89, 86, 95, 79, 127, 101, 69, 103,
+  96, 95, 102, 92, 113, 109, 135, 99, 74, 125,
+  123, 119, 113, 119, 96, 81, 75, 165, 109, 178,
+  125, 116, 136, 173, 186, 159, 93, 112, 107, 105,
+  121, 118, 126, 123, 117, 81, 121, 95, 89, 101,
+  86, 117, 80, 105, 122, 123, 104, 146, 106, 71,
+  85, 112, 119, 95, 91, 111, 86, 75, 100, 135,
+  129, 91, 134, 118, 101, 86, 102, 129, 122, 82,
+  99, 103, 195, 90, 120, 164, 79, 157, 138, 147,
+  108, 103, 107, 129, 97, 103, 118, 66, 44, 73,
+  115, 106, 140, 88, 140, 87, 68, 90, 131, 124,
+  110, 127, 117, 75, 81, 105, 75, 118, 114, 116,
+  130, 141, 106, 130, 114, 129, 83, 97, 118, 92,
+  99, 103, 166, 107, 135, 72, 79, 104, 102, 89,
+  106, 162, 92, 51, 92, 85, 71, 103, 99, 72,
+  135, 138, 146, 152, 115, 87, 79, 53, 104, 105,
+  123, 99, 73, 82, 134, 93, 82, 97, 130, 124,
+  119, 121, 133, 105, 125, 135, 104, 121, 90, 192,
+  114, 109, 74, 95, 98, 60, 93, 74, 175, 86,
+  26, 192, 122, 117, 99, 116, 111, 60, 88, 123,
+  77, 102, 91, 114, 115, 100, 112, 115, 128, 96,
+  76, 149, 114, 125, 133, 136, 98, 68, 85, 123,
+  109, 167, 111, 96, 148, 181, 133, 166, 55, 90,
+  116, 129, 89, 121, 101, 107, 106, 72, 139, 97,
+  105, 95, 95, 132, 99, 124, 133, 122, 93, 150,
+  120, 106, 88, 143, 123, 106, 70, 129, 98, 63,
+  93, 135, 136, 118, 117, 121, 119, 93, 120, 120,
+  132, 124, 88, 118, 156, 126, 117, 150, 77, 171,
+  142, 143, 116, 117, 125, 115, 82, 107, 133, 82,
+  58, 67, 92, 95, 144, 76, 152, 77, 62, 34,
+  144, 159, 144, 149, 99, 90, 105, 100, 94, 135,
+  110, 103, 131, 157, 104, 134, 115, 111, 89, 118,
+  120, 96, 128, 100, 172, 80, 96, 58, 95, 112,
+  82, 68, 100, 148, 95, 43, 116, 84, 69, 91,
+  103, 63, 100, 148, 152, 148, 114, 83, 84, 57,
+  113, 114, 142, 109, 75, 77, 150, 115, 76, 82,
+  90, 131, 116, 109, 160, 108, 125, 153, 82, 144,
+  71, 203, 127, 130, 82, 96, 132, 88, 90, 95,
+  125, 86, 38, 216, 96, 125, 118, 124, 127, 49,
+  61, 148, 98, 107, 89, 137, 132, 125, 105, 148,
+  122, 130, 85, 135, 90, 113, 141, 113, 92, 89,
+  108, 93, 107, 151, 105, 110, 146, 178, 103, 156,
+  68, 100, 138, 145, 93, 114, 105, 99, 114, 111,
+  149, 95, 116, 113, 87, 150, 108, 148, 124, 118,
+  81, 161, 137, 152, 92, 158, 134, 106, 64, 115,
+  102, 61, 87, 138, 102, 128, 129, 109, 128, 76,
+  99, 121, 135, 144, 108, 137, 123, 163, 109, 102,
+  66, 159, 144, 120, 115, 135, 125, 76, 87, 115,
+  133, 118, 77, 89, 83, 118, 141, 88, 111, 87,
+  99, 72, 123, 148, 125, 160, 84, 73, 122, 82,
+  114, 142, 108, 109, 134, 151, 90, 126, 92, 105,
+  108, 149, 86, 92, 155, 88, 154, 78, 115, 65,
+  128, 123, 76, 58, 94, 95, 103, 44, 131, 112,
+  77, 93, 116, 98, 78, 133, 138, 131, 114, 90,
+  93, 108, 107, 120, 130, 99, 76, 125, 157, 140,
+  71, 76, 101, 139, 89, 101, 149, 79, 101, 138,
+  93, 134, 92, 171, 140, 164, 91, 132, 126, 103,
+  76, 104, 96, 78, 57, 183, 100, 83, 113, 106,
+  117, 87, 77, 130, 88, 113, 97, 149, 143, 145,
+  98, 163, 128, 148, 73, 98, 50, 98, 142, 86,
+  71, 101, 123, 127, 112, 132, 119, 126, 119, 137,
+  94, 126, 89, 113, 127, 131, 91, 104, 112, 94,
+  98, 124, 124, 93, 102, 126, 68, 139, 78, 152,
+  100, 94, 113, 146, 132, 150, 98, 130, 112, 104,
+  96, 115, 98, 68, 94, 158, 101, 106, 124, 84,
+  117, 107, 74, 120, 131, 121, 108, 162, 148, 181,
+  96, 71, 81, 121, 140, 127, 112, 137, 98, 89,
+  98, 114, 126, 114, 65, 100, 126, 141, 123, 106,
+  103, 104, 139, 126, 80, 90, 100, 131, 92, 75,
+  76, 62, 95, 134, 131, 113, 130, 133, 83, 133,
+  54, 118, 105, 124, 88, 98, 134, 78, 116, 105,
+  146, 51, 115, 120, 98, 83, 111, 100, 96, 61,
+  107, 159, 98, 104, 135, 138, 108, 110, 111, 139,
+  112, 100, 108, 115, 116, 133, 92, 82, 73, 147,
+  153, 118, 78, 84, 111, 150, 80, 104, 114, 76,
+  99, 81, 99, 96, 113, 117, 103, 122, 90, 139,
+  93, 98, 63, 86, 96, 93, 53, 107, 91, 62,
+  95, 89, 102, 103, 89, 95, 91, 128, 98, 121,
+  150, 141, 95, 137, 112, 112, 84, 72, 68, 117,
+  134, 70, 75, 103, 88, 171, 112, 108, 116, 119,
+  113, 117, 119, 99, 117, 116, 80, 95, 113, 84,
+  131, 99, 114, 121, 79, 112, 95, 139, 81, 114,
+  52, 128, 98, 82, 151, 121, 99, 102, 102, 101,
+  97, 101, 114, 97, 83, 102, 117, 151, 151, 94,
+  93, 78, 94, 124, 63, 107, 109, 80, 78, 115,
+  151, 102, 110, 109, 87, 109, 112, 132, 123, 105,
+  73, 99, 102, 83, 127, 86, 47, 88, 125, 111,
+  101, 116, 103, 124, 112, 159, 87, 85, 120, 93,
+  120, 75, 63, 88, 83, 109, 121, 99, 87, 110,
+  72, 129, 86, 114, 88, 77, 84, 109, 92, 96,
+  89, 126, 141, 95, 74, 108, 122, 94, 128, 117,
+  72, 99, 90, 177, 93, 128, 103, 118, 125, 106,
+  121, 124, 99, 112, 90, 99, 104, 103, 76, 86,
+  85, 137, 136, 90, 93, 116, 133, 131, 93, 127,
+  122, 124, 126, 68, 111, 102, 118, 99, 114, 101,
+  106, 124, 84, 91, 90, 81, 120, 87, 39, 113,
+  108, 80, 118, 93, 97, 94, 116, 93, 122, 149,
+  107, 82, 129, 82, 98, 107, 141, 88, 97, 106,
+  82, 159, 115, 106, 106, 121, 90, 152, 136, 99,
+  134, 111, 96, 84, 114, 99, 120, 113, 71, 99,
+  115, 83, 134, 145, 103, 107, 81, 131, 119, 87,
+  100, 112, 81, 94, 126, 83, 153, 96, 70, 99,
+  105, 95, 87, 118, 119, 133, 94, 107, 136, 125,
+  188, 105, 101, 93, 119, 152, 104, 116, 107, 73,
+  97, 73, 138, 96, 115, 114, 100, 106, 115, 137,
+  120, 91, 105, 91, 124, 87, 122, 78, 52, 78,
+  118, 92, 115, 100, 161, 125, 103, 101, 149, 123,
+  137, 92, 117, 85, 83, 135, 101, 105, 83, 95,
+  115, 106, 80, 125, 118, 105, 78, 88, 77, 155,
+  85, 97, 91, 108, 85, 107, 62, 123, 113, 101,
+  143, 131, 67, 123, 106, 112, 109, 99, 96, 80,
+  120, 110, 110, 101, 85, 137, 90, 76, 74, 98,
+  77, 104, 101, 97, 167, 91, 104, 119, 91, 104,
+  67, 121, 105, 110, 126, 107, 103, 109, 103, 93,
+  104, 100, 91, 105, 73, 81, 96, 59, 119, 111,
+  29, 107, 119, 92, 107, 84, 68, 92, 143, 85,
+  108, 120, 108, 73, 101, 107, 63, 82, 141, 76,
+  104, 122, 90, 164, 90, 126, 124, 115, 91, 136,
+  127, 86, 117, 116, 92, 89, 111, 94, 119, 132,
+  57, 79, 96, 90, 118, 151, 104, 99, 97, 121,
+  109, 111, 92, 109, 115, 74, 113, 82, 149, 91,
+  57, 73, 116, 106, 65, 129, 101, 145, 95, 98,
+  103, 91, 135, 95, 87, 90, 106, 138, 105, 110,
+  114, 55, 93, 115, 138, 96, 113, 99, 97, 94,
+  106, 134, 95, 61, 88, 91, 132, 107, 120, 106,
+  41, 63, 115, 119, 89, 75, 100, 88, 90, 111,
+  140, 131, 118, 93, 100, 94, 85, 155, 114, 132,
+  85, 87, 123, 142, 88, 111, 81, 109, 58, 81,
+  48, 109, 77, 101, 99, 103, 71, 122, 75, 102,
+  108, 92, 123, 136, 51, 66, 96, 76, 88, 96,
+  101, 77, 108, 123, 104, 145, 83, 122, 103, 70,
+  80, 118, 52, 110, 91, 53, 136, 100, 134, 105,
+  101, 108, 57, 117, 77, 115, 100, 117, 82, 116,
+  104, 114, 93, 93, 91, 111, 85, 84, 97, 60,
+  101, 81, 49, 117, 113, 95, 87, 77, 84, 103,
+  139, 110, 125, 85, 99, 71, 115, 136, 83, 76,
+  113, 60, 86, 98, 98, 141, 95, 110, 130, 99,
+  81, 121, 120, 121, 113, 70, 139, 112, 79, 124,
+  94, 130, 67, 95, 95, 123, 100, 110, 98, 87,
+  97, 97, 105, 156, 99, 120, 120, 65, 84, 75,
+  143, 107, 63, 60, 120, 129, 59, 109, 105, 95,
+  85, 80, 91, 106, 132, 81, 88, 107, 104, 98,
+  118, 114, 124, 67, 72, 87, 94, 100, 113, 118,
+  121, 74, 98, 112, 94, 84, 78, 110, 101, 116,
+  98, 119, 49, 78, 89, 122, 86, 64, 74, 60,
+  55, 87, 94, 124, 140, 113, 90, 118, 91, 164,
+  120, 146, 100, 86, 108, 164, 85, 103, 71, 121,
+  37, 93, 71, 107, 73, 116, 111, 103, 71, 81,
+  97, 70, 104, 70, 103, 111, 69, 35, 92, 87,
+  70, 110, 74, 86, 85, 146, 93, 165, 106, 118,
+  119, 61, 112, 99, 53, 104, 84, 65, 96, 77,
+  179, 98, 103, 109, 85, 126, 90, 122, 99, 123,
+  79, 121, 99, 131, 106, 93, 89, 114, 96, 105,
+  88, 71, 91, 96, 62, 107, 113, 104, 106, 90,
+  109, 104, 92, 157, 123, 65, 89, 88, 119, 104,
+  120, 92, 95, 54, 81, 99, 90, 123, 108, 83,
+  113, 89, 59, 86, 93, 142, 114, 58, 166, 111,
+  95, 127, 110, 103, 117, 150, 95, 127, 105, 95,
+  106, 68, 115, 94, 119, 136, 116, 137, 130, 74,
+  55, 101, 78, 103, 87, 87, 108, 162, 72, 89,
+  106, 33, 99, 61, 81, 134, 147, 91, 99, 142,
+  143, 85, 147, 123, 117, 97, 90, 62, 79, 122,
+  128, 132, 105, 72, 81, 84, 113, 117, 70, 108,
+  92, 117, 78, 111, 66, 95, 69, 106, 105, 62,
+  95, 53, 74, 101, 59, 105, 154, 112, 93, 124,
+  99, 158, 122, 149, 94, 109, 88, 153, 92, 88,
+  91, 108, 54, 134, 52, 114, 88, 112, 98, 78,
+  74, 36, 112, 74, 104, 82, 92, 84, 93, 46,
+  86, 94, 68, 94, 74, 91, 83, 147, 78, 117,
+  116, 154, 126, 67, 124, 84, 83, 96, 107, 112,
+  96, 86, 175, 96, 98, 98, 106, 130, 100, 111,
+  110, 104, 97, 122, 115, 130, 94, 83, 101, 114,
+  110, 106, 88, 99, 113, 100, 90, 114, 134, 111,
+  119, 109, 120, 131, 42, 152, 111, 98, 88, 116,
+  105, 74, 141, 111, 102, 40, 107, 84, 91, 122,
+  104, 105, 102, 91, 73, 90, 90, 132, 129, 97,
+  146, 112, 101, 105, 130, 100, 142, 161, 124, 120,
+  106, 106, 92, 80, 101, 103, 120, 94, 179, 130,
+  123, 112, 70, 108, 85, 78, 110, 119, 122, 174,
+  93, 86, 108, 74, 114, 84, 105, 95, 143, 99,
+  105, 145, 158, 109, 149, 121, 104, 118, 106, 120,
+  92, 106, 129, 127, 99, 78, 79, 87, 126, 127,
+  87, 103, 86, 126, 91, 94, 93, 135, 76, 112,
+  115, 115, 126, 85, 125, 112, 81, 105, 145, 97,
+  113, 129, 127, 130, 117, 149, 113, 110, 91, 135,
+  112, 96, 86, 94, 93, 145, 78, 118, 99, 88,
+  90, 90, 112, 45, 112, 107, 136, 99, 97, 101,
+  107, 89, 88, 124, 98, 99, 111, 104, 97, 127,
+  92, 108, 102, 161, 146, 76, 114, 89, 97, 94,
+  126, 132, 114, 132, 150, 101, 103, 112, 99, 131,
+  117, 117, 125, 106, 111, 127, 103, 108, 114, 123,
+  115, 113, 133, 104, 135, 132, 139, 98, 85, 97,
+  116, 116, 132, 112, 134, 95, 120, 111, 115, 143,
+  97, 67, 95, 110, 138, 100, 133, 88, 119, 79,
+  82, 142, 125, 104, 108, 124, 79, 132, 121, 105,
+  137, 156, 96, 84, 108, 94, 144, 144, 133, 130,
+  97, 104, 124, 116, 93, 103, 120, 117, 125, 98,
+  160, 131, 86, 114, 108, 98, 88, 104, 93, 119,
+  112, 125, 95, 116, 114, 146, 110, 105, 102, 113,
+  83, 119, 142, 112, 157, 106, 135, 123, 134, 90,
+  137, 113, 123, 119, 132, 89, 71, 113, 104, 96,
+  106, 123, 110, 106, 119, 129, 105, 109, 94, 112,
+  85, 111, 112, 118, 124, 111, 108, 127, 127, 76,
+  126, 116, 109, 161, 72, 118, 113, 115, 114, 109,
+  123, 98, 125, 111, 109, 118, 123, 111, 53, 87,
+  112, 92, 98, 90, 88, 121, 128, 95, 91, 116,
+  119, 116, 109, 115, 118, 93, 113, 103, 87, 97,
+  113, 101, 98, 114, 92, 140, 116, 110, 121, 101,
+  108, 82, 100, 112, 94, 95, 162, 97, 142, 107,
+  78, 117, 124, 117, 123, 127, 93, 126, 89, 131,
+  105, 109, 112, 112, 129, 100, 120, 129, 136, 93,
+  79, 71, 31, 106, 147, 96, 102, 89, 132, 71,
+  89, 104, 85, 99, 102, 109, 128, 80, 124, 119,
+  122, 78, 72, 183, 91, 117, 106, 132, 66, 98,
+  101, 118, 147, 152, 65, 95, 96, 89, 133, 149,
+  111, 97, 103, 116, 108, 93, 100, 93, 120, 97,
+  122, 110, 100, 131, 82, 90, 87, 108, 100, 106,
+  97, 139, 105, 133, 91, 107, 119, 138, 97, 83,
+  103, 95, 96, 106, 107, 100, 148, 121, 159, 125,
+  151, 91, 124, 138, 89, 119, 134, 91, 75, 109,
+  80, 101, 112, 120, 111, 100, 110, 161, 101, 80,
+  78, 121, 63, 139, 98, 108, 143, 59, 121, 116,
+  123, 85, 134, 112, 106, 195, 113, 79, 132, 145,
+  134, 92, 114, 134, 136, 106, 113, 151, 107, 102,
+  81, 71, 134, 98, 75, 109, 148, 146, 109, 90,
+  125, 108, 98, 128, 90, 72, 99, 105, 93, 129,
+  96, 83, 102, 96, 93, 93, 106, 132, 113, 110,
+  107, 87, 104, 96, 104, 115, 83, 131, 137, 99,
+  151, 128, 82, 96, 138, 123, 89, 110, 85, 122,
+  97, 155, 119, 132, 106, 117, 138, 92, 118, 81,
+  123, 104, 74, 93, 33, 103, 148, 105, 98, 96,
+  115, 69, 92, 100, 83, 135, 118, 87, 108, 100,
+  111, 126, 86, 145, 80, 183, 110, 134, 109, 108,
+  90, 73, 86, 133, 121, 93, 71, 97, 90, 90,
+  114, 106, 94, 84, 110, 128, 108, 111, 87, 99,
+  98, 88, 128, 87, 81, 121, 84, 103, 103, 91,
+  124, 61, 108, 129, 96, 140, 95, 98, 108, 111,
+  102, 82, 120, 99, 109, 106, 116, 77, 139, 114,
+  166, 126, 140, 105, 109, 176, 82, 111, 113, 108,
+  75, 98, 90, 117, 109, 134, 118, 103, 102, 168,
+  110, 78, 69, 104, 84, 122, 117, 84, 156, 61,
+  115, 85, 122, 169, 110, 120, 79, 188, 126, 77,
+  140, 162, 145, 91, 116, 171, 125, 105, 58, 111,
+  91, 119, 96, 100, 143, 109, 77, 124, 106, 129,
+  89, 104, 109, 101, 127, 136, 87, 62, 92, 121,
+  81, 81, 137, 81, 95, 83, 105, 81, 100, 132,
+  126, 122, 86, 75, 79, 97, 111, 123, 92, 120,
+  152, 67, 81, 114, 78, 88, 112, 142, 83, 76,
+  70, 90, 74, 84, 86, 83, 104, 110, 113, 85,
+  95, 116, 114, 135, 38, 66, 34, 91, 126, 85,
+  115, 86, 121, 52, 88, 111, 66, 110, 116, 115,
+  73, 84, 84, 89, 96, 84, 62, 156, 93, 103,
+  91, 118, 74, 89, 86, 101, 97, 73, 84, 100,
+  99, 58, 112, 113, 72, 74, 89, 106, 92, 82,
+  71, 87, 58, 87, 105, 150, 86, 114, 69, 107,
+  94, 81, 119, 69, 78, 70, 92, 131, 57, 86,
+  112, 98, 89, 71, 123, 104, 127, 98, 84, 70,
+  110, 88, 113, 106, 126, 66, 69, 123, 86, 111,
+  121, 90, 67, 91, 61, 105, 113, 115, 94, 95,
+  105, 121, 107, 81, 58, 93, 69, 91, 64, 106,
+  95, 82, 94, 105, 111, 137, 85, 103, 90, 159,
+  75, 75, 111, 119, 107, 77, 91, 126, 94, 85,
+  50, 96, 71, 90, 60, 65, 98, 81, 37, 125,
+  57, 103, 81, 69, 113, 106, 129, 107, 84, 57,
+  91, 154, 86, 118, 85, 69, 84, 89, 140, 86,
+  80, 130, 94, 92, 87, 65, 57, 73, 111, 100,
+  60, 82,
+};
+
+
+extern "C" JNIEXPORT void JNICALL
+Java_android_renderscript_cts_BNNMTest_getData(JNIEnv * env,
+                                                                      jclass,
+                                                                      jbyteArray a,
+                                                                      jbyteArray b,
+                                                                      jbyteArray c
+                                                                      )
+{
+    jbyte * a_byte = (jbyte *) env->GetPrimitiveArrayCritical(a, 0);
+    jbyte * b_byte = (jbyte *) env->GetPrimitiveArrayCritical(b, 0);
+    jbyte * c_byte = (jbyte *) env->GetPrimitiveArrayCritical(c, 0);
+
+    memcpy(a_byte, a_data, a_count);
+    memcpy(b_byte, b_data, b_count);
+    memcpy(c_byte, expected_c_data, c_count);
+
+
+    env->ReleasePrimitiveArrayCritical(c, c_byte, 0);
+    env->ReleasePrimitiveArrayCritical(b, b_byte, 0);
+    env->ReleasePrimitiveArrayCritical(a, a_byte, 0);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyPaddedTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyPaddedTest.java
new file mode 100644
index 0000000..c74dbc0
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyPaddedTest.java
@@ -0,0 +1,1117 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Type;
+import java.util.Random;
+
+public class AllocationCopyPaddedTest extends RSBaseCompute {
+    public void test_AllocationPadded_Byte3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);;
+        int arr_len = width * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Byte3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+        
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_2D_AllocationCopyTo_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Byte3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Short3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Short3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+        
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Short3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Int3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Int3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+        
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Int3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Float3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+    public void test_AllocationPadded_Float3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+    public void test_AllocationPadded_Float3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Double3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        double[] inArray = new double[arr_len];
+        double[] outArray = new double[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (double)random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Double Failed, output array does not match input",
+                   result);
+    }
+    public void test_AllocationPadded_Double3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+
+        double[] inArray = new double[arr_len];
+        double[] outArray = new double[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (double)random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Double Failed, output array does not match input",
+                   result);
+    }
+    public void test_AllocationPadded_Double3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        double[] inArray = new double[arr_len];
+        double[] outArray = new double[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (double)random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Double Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Long3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Long3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+        
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Long3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+
+    public void test_AllocationPadded_copy1DRangeTo_Byte3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeTo_Short3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeTo_Int3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeTo_Float3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0f) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeTo_Long3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Byte3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Short3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Int3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Float3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Long3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Byte3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Short3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Int3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_1D_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Float3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0f) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Long3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyToTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyToTest.java
new file mode 100644
index 0000000..f6bef0a
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyToTest.java
@@ -0,0 +1,797 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Type;
+import java.util.Random;
+
+public class AllocationCopyToTest extends RSBaseCompute {
+    private Allocation alloc;
+
+    public void test_Allocationcopy1DRangeTo_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeTo_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeTo_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeTo_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0f) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeTo_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Long failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Long failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Long failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationCopy3DRangeFrom_Alloc() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation allocRef = Allocation.createTyped(mRS, typeBuilder.create());
+
+        allocRef.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, allocRef, xoff, yoff, zoff);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation Copy3DRangeFrom (alloc) Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopy3DRangeFrom_Alloc failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0f) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Long Failed, output array does not match input",
+                   result);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/BNNMTest.java b/tests/tests/renderscript/src/android/renderscript/cts/BNNMTest.java
new file mode 100644
index 0000000..b36175c
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/BNNMTest.java
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+import java.util.Random;
+import java.lang.Math;
+
+public class BNNMTest extends RSBaseCompute {
+
+    static {
+        System.loadLibrary("bnnmdata_jni");
+    }
+
+    native void getData(byte[] a, byte[] b, byte[] c);
+
+    // In Java, the eight-bit 'byte' type is signed, but the API for the 8-bit
+    // matrix multiplication deals with unsigned bytes. This is a convenience
+    // function that converts arrays of unsigned ints to their equivalent
+    // representations as signed bytes. For example, the bit pattern 0xff is 255
+    // as an unsigned value, but -127 as a Java signed byte. So if you pass in an
+    // array of int[] {255} into this function, you'll get back byte[] {-127}.
+    private byte[] unsignedToSignedByte(int[] input) {
+        byte[] output = new byte[input.length];
+        for (int i = 0; i < input.length; ++i) {
+            output[i] = (byte)(input[i]);
+        }
+        return output;
+    }
+
+    private void addByteNoise(byte[] data, int count, float frequency, int maxDelta) {
+        Random rand = new Random();
+        for (int n = 0; n < count; ++n) {
+            if (rand.nextFloat() < frequency) {
+                final int originalValue = data[n];
+                final float direction = rand.nextFloat();
+                int delta = (int)(Math.ceil(rand.nextFloat() * maxDelta));
+                if (direction < 0.5f) {
+                    delta = -delta;
+                }
+                int newValue = (originalValue + delta);
+                if (newValue < -127) {
+                    newValue = -127;
+                }
+                if (newValue > 127) {
+                    newValue = 127;
+                }
+                data[n] = (byte)(newValue);
+            }
+        }
+    }
+
+    private boolean testWithTolerance(byte[] c_byte, byte[] c_byte_output) {
+
+        // The testing procedure here is a bit complex, but the aim is to mimic the
+        // requirements we've empirically found running deep neural networks in real
+        // applications. We want to open the door to vendors using approximations that
+        // produce slightly different results for optimization's sake, but keep the
+        // precision loss within small enough bounds that we don't lose accuracy in
+        // the final result.
+        // After experimentation, we've found that we can tolerate around 5% of the
+        // output bytes being different by 1. Any larger differences are not tolerable
+        // and we can't get good results if the frequency of small differences is
+        // higher than 5%. This test tries to measure those properties on an example
+        // set of parameters that were captured from a real application.
+        // For example, if you uncommented this function that adds random noise to the
+        // results at a 3% specified frequency, the test should fail:
+        // AddByteNoise(c_byte_output, c_count, 0.03f, 1);
+
+        final boolean areSizesDifferent = (c_byte.length != c_byte_output.length);
+        final int c_count = Math.min(c_byte.length, c_byte_output.length);
+
+        int howManyDifferent = 0;
+        boolean areAnyTooDifferent = false;
+        for (int i = 0; i < c_count; i++) {
+            byte expectedValue = c_byte[i];
+            byte actualValue = c_byte_output[i];
+            int delta = (expectedValue - actualValue);
+            // First make sure that the difference is no more than one.
+            if ((delta < -1) || (delta > 1)) {
+                areAnyTooDifferent = true;
+            }
+            // If there is a difference, increment the counter to track it.
+            if (delta != 0) {
+                // Don't spam the logs if too many are different.
+                if (howManyDifferent < 50) {
+                    android.util.Log.e("BNNM", "Mismatch at " + i +
+                                       ": expected " + (expectedValue & 0xff) +
+                                       ", got " + (actualValue & 0xff));
+                }
+                ++howManyDifferent;
+            }
+        }
+        // We want no more than 2% of the values to show any differences, so work out
+        // what that means in absolute numbers.
+        final int percentThreshold = 2;
+        final int differenceThreshold = Math.max((percentThreshold * c_count) / 100, 1);
+        final boolean areTooManyDifferent = (howManyDifferent >= differenceThreshold);
+
+        if (areAnyTooDifferent) {
+            android.util.Log.e("BNNM", "Some outputs were too different.");
+        }
+
+        if (areTooManyDifferent) {
+            android.util.Log.e("BNNM", "There were too many small differences." +
+                               " We can tolerate " + percentThreshold + "% (" +
+                               differenceThreshold + "), but there were " + howManyDifferent);
+        }
+
+        return !(areAnyTooDifferent || areTooManyDifferent);
+    }
+
+
+    private byte[] runBNNM(int m, int n, int k, byte[] a_byte, int a_offset, byte[] b_byte,
+                           int b_offset, int c_offset, int c_mult_int) {
+        Allocation A, B, C;
+        Type.Builder builder = new Type.Builder(mRS, Element.U8(mRS));
+        Type a_type = builder.setX(k).setY(m).create();
+        Type b_type = builder.setX(k).setY(n).create();
+        Type c_type = builder.setX(n).setY(m).create();
+
+        A = Allocation.createTyped(mRS, a_type);
+        B = Allocation.createTyped(mRS, b_type);
+        C = Allocation.createTyped(mRS, c_type);
+
+        A.copyFrom(a_byte);
+        B.copyFrom(b_byte);
+        // C doesn't matter, is output only
+
+        ScriptIntrinsicBLAS blas = ScriptIntrinsicBLAS.create(mRS);
+        blas.BNNM(A, a_offset, B, b_offset, C, c_offset, c_mult_int);
+
+        int c_count = (m * n);
+        byte[] c_byte_output = new byte[c_count];
+        C.copyTo(c_byte_output);
+        return c_byte_output;
+    }
+
+
+
+    // This test multiplies a couple of small 8-bit matrices, and compares the
+    // results with hand-calculated expectations.
+    public void testSmallMatrices() {
+        // The A matrix is:
+        // |   1 |   4 |
+        // |   2 |   5 |
+        // |   3 |   6 |
+        byte[] a_data = unsignedToSignedByte(new int[] {
+                1, 2, 3,
+                4, 5, 6,
+            });
+        final int a_rows = 3;
+        final int a_cols = 2;
+        final int a_offset = 0;
+        // The B matrix is:
+        // |  -1 |  -2 |  -3 |  -4 |
+        // |  -5 |  -6 |  -7 |  -8 |
+        // |  -9 | -10 | -11 | -12 |
+        byte[] b_data = unsignedToSignedByte(new int[] {
+                11, 7, 3,
+                10, 6, 2,
+                9, 5, 1,
+                8, 4, 0,
+            });
+        final int b_cols = 4;
+        final int b_offset = 12;
+        // EightBitGemm implements C = B.transposed() * A,
+        // so we expect to get these results:
+        // 1*-1 + 2*-5 + 3*-9 + 128 = 90
+        // 1*-2 + 2*-6 + 3*-10 + 128 = 84
+        // 1*-3 + 2*-7 + 3*-11 + 128 = 78
+        // 1*-4 + 2*-8 + 3*-12 + 128 = 72
+        // 4*-1 + 5*-5 + 6*-9 + 128 = 45
+        // 4*-2 + 5*-6 + 6*-10 + 128 = 30
+        // 4*-3 + 5*-7 + 6*-11 + 128 = 15
+        // 4*-4 + 5*-8 + 6*-12 + 128 = 0
+        // | 90 |  45 |
+        // | 84 |  30 |
+        // | 78 | 15 |
+        // | 72 | 0 |
+        final int c_offset = 128;
+        final int c_shift = 21;
+        final int c_mult_int = (1 << c_shift);
+        byte[] expected_data = unsignedToSignedByte(new int[] {
+                90, 84, 78, 72,
+                45, 30, 15, 0,
+            });
+
+        final int m = a_cols;
+        final int n = b_cols;
+        final int k = a_rows;
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_data, a_offset, b_data, b_offset,
+                                       c_offset, c_mult_int);
+        assertTrue(testWithTolerance(expected_data, c_byte_output));
+    }
+
+
+    // This test multiplies two medium-sized 8-bit matrices, and compares the
+    // results with the expected values. The data itself is fairly arbitrary.
+    public void testMediumMatrices1() {
+        byte[] a_data = unsignedToSignedByte(new int[] {
+                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+                12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+                23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+                0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+                23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+            });
+        final int a_rows = 11;
+        final int a_cols = 5;
+        final int a_offset = 0;
+        byte[] b_data = unsignedToSignedByte(new int[] {
+                0, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 11,
+                10, 12, 14, 16, 18, 20, 11, 13, 15, 17, 19, 21,
+                20, 22, 24, 26, 28, 30, 21, 23, 25, 27, 29, 31,
+                30, 32, 34, 36, 38, 40, 31, 33, 35, 37, 39, 41,
+                40, 42, 44, 46, 48, 50, 41, 43, 45, 47, 49, 51,
+                50, 52, 54, 56, 58, 60, 51, 53, 55, 57, 59, 61,
+                60, 62, 64, 66, 68, 70, 61, 63, 65, 67, 69, 71,
+            });
+        final int b_cols = 7;
+        final int b_offset = 10;
+        final int c_offset = 16384;
+        final int c_shift = 21;
+        final int c_mult_int = (1 << (c_shift - 7));
+        byte[] expected_data = unsignedToSignedByte(new int[] {
+                126, 131, 135, 140, 146, 151, 155,
+                121, 135, 148, 162, 176, 190, 202,
+                116, 139, 161, 184, 206, 229, 249,
+                128, 128, 129, 129, 129, 130, 130,
+                118, 136, 155, 173, 191, 210, 226,
+            });
+
+        final int m = a_cols;
+        final int n = b_cols;
+        final int k = a_rows;
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_data, a_offset, b_data, b_offset,
+                                       c_offset, c_mult_int);
+        assertTrue(testWithTolerance(expected_data, c_byte_output));
+    }
+
+    // This test multiplies another two medium 8-bit matrices, and compares the
+    // results with the expected values. The data here is arbitrary.
+    public void testMediumMatrices2() {
+        byte[] a_data = unsignedToSignedByte(new int[] {
+                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+                23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
+                1, 23, 2, 22, 3, 21, 4, 20, 5, 19, 6, 18, 7, 17, 8, 16, 9, 15, 10, 14, 11, 13, 12,
+                23, 1, 22, 2, 21, 3, 20, 4, 19, 5, 18, 6, 17, 7, 16, 8, 15, 9, 14, 10, 13, 11, 12,
+                1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+                3, 1, 4, 1, 5, 8, 2, 3, 1, 14, 11, 15, 18, 12, 13, 11, 14, 11, 15, 18, 12, 13, 11,
+                8, 0, 5, 8, 1, 3, 7, 5, 7, 13, 10, 23, 13, 11, 17, 23, 12, 19, 17, 13, 14, 10, 19,
+            });
+        final int a_rows = 23;
+        final int a_cols = 7;
+        final int a_offset = 13;
+        byte[] b_data = unsignedToSignedByte(new int[] {
+                0, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 11, 0, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9,
+                0, 20, 40, 60, 80, 10, 11, 13, 15, 17, 19, 21, 10, 12, 14, 6, 8, 10, 1, 3, 5, 7, 9,
+                1, 21, 41, 61, 81, 11, 12, 14, 16, 18, 20, 22, 11, 13, 15, 7, 9, 11, 2, 4, 6, 8, 9,
+                0, 19, 39, 59, 79, 9, 10, 12, 14, 16, 18, 20, 9, 11, 13, 5, 7, 9, 0, 2, 4, 6, 8,
+                2, 22, 42, 62, 82, 12, 13, 15, 17, 19, 21, 23, 12, 14, 16, 8, 9, 12, 3, 5, 7, 9, 9,
+                0, 18, 38, 58, 78, 8, 9, 11, 13, 15, 17, 19, 8, 10, 12, 4, 6, 8, 0, 1, 3, 5, 7,
+                3, 23, 43, 63, 83, 13, 14, 16, 18, 20, 22, 24, 13, 15, 17, 9, 9, 13, 4, 6, 8, 9, 9,
+                0, 17, 37, 57, 77, 7, 8, 10, 12, 14, 16, 18, 7, 9, 11, 3, 5, 7, 0, 0, 2, 4, 6,
+                10, 20, 30, 40, 50, 1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 1, 2, 3,
+            });
+        final int b_cols = 9;
+        final int b_offset = 23;
+        final int c_offset = 2121;
+        final int c_shift = 21;
+        final int c_mult_int = 132359;
+        byte[] expected_data = unsignedToSignedByte(new int[] {
+                167, 53, 51, 54, 49, 55, 46,
+                56, 116, 153, 232, 232, 234, 231,
+                236, 232, 237, 174, 168, 131, 130,
+                132, 129, 133, 128, 133, 134, 151,
+                154, 152, 156, 151, 158, 150, 160,
+                156, 255, 113, 106, 120, 98, 127,
+                91, 134, 178, 231, 102, 97, 107,
+                92, 111, 87, 116, 164, 187, 76,
+                73, 78, 70, 81, 67, 83, 139,
+            });
+
+        final int m = a_cols;
+        final int n = b_cols;
+        final int k = a_rows;
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_data, a_offset, b_data, b_offset,
+                                       c_offset, c_mult_int);
+        assertTrue(testWithTolerance(expected_data, c_byte_output));
+    }
+
+
+    // This test takes a large set of real data captured from a convolutional
+    // neural network solving a computer vision problem, and runs it through the
+    // eight-bit matrix multiply. We test the results to make sure they're close
+    // enough to be usable.
+    public void testRealData() {
+
+        int m = 256;
+        int n = 192;
+        int k = 1152;
+        int a_offset = 0;
+        int b_offset = 84;
+        int c_mult_int = 3401;
+        int c_offset = 74980;
+
+        int a_count = (m * k);
+        int b_count = (n * k);
+        int c_count = (m * n);
+
+        byte[] a_byte = new byte[a_count];
+        byte[] b_byte = new byte[b_count];
+        byte[] c_byte = new byte[c_count];
+
+        getData(a_byte, b_byte, c_byte);
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_byte, a_offset, b_byte, b_offset,
+                                       c_offset, c_mult_int);
+
+        assertTrue(testWithTolerance(c_byte, c_byte_output));
+
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java b/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
index 50a3560..5c71155 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
@@ -58,43 +58,37 @@
      * Test whether we are detect out-of-bounds allocation accesses
      * from an invokable.
      */
-    // TODO Temporarily disable the test.
-    public void dontTestDebugContextI() {
+    public void testDebugContextI() {
         setupDebugContext();
         Soob.invoke_write_i(7, 1);  // Write to invalid location.
-        for (int i = 0; i < 100; i++) {
-            Soob.invoke_write_i(9, 0);
-            mRS.finish();
-        }
 
         // Flush messages through the pipeline.
-        Soob.invoke_send_msg();
+        mRS.sendMessage(RS_MSG_TEST_FLUSH, null);
         waitForMessage();
 
         Soob.destroy();
         assertTrue(mRanErrorHandler);
-        checkForErrors();
+
+        // The context is dead at this point so make sure it's not reused
+        RenderScript.releaseAllContexts();
     }
 
     /**
      * Test whether we are detect out-of-bounds allocation accesses
      * from a kernel.
      */
-    // TODO Temporarily disable the test.
-    public void dontTestDebugContextK() {
+    public void testDebugContextK() {
         setupDebugContext();
         Soob.forEach_write_k(AUnused);  // Write to invalid location.
-        for (int i = 0; i < 100; i++) {
-            Soob.invoke_write_i(9, 0);
-            mRS.finish();
-        }
 
         // Flush messages through the pipeline.
-        Soob.invoke_send_msg();
+        mRS.sendMessage(RS_MSG_TEST_FLUSH, null);
         waitForMessage();
 
         Soob.destroy();
         assertTrue(mRanErrorHandler);
-        checkForErrors();
+
+        // The context is dead at this point so make sure it's not reused
+        RenderScript.releaseAllContexts();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
index 131b3fd..9fa9c15 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
@@ -183,6 +183,13 @@
         // A_8 is in U8
         Element[] BOOLEAN = { Element.BOOLEAN(mRS) };
         Element[] ELEMENT = { Element.ELEMENT(mRS) };
+        Element[] F16 = { Element.F16(mRS) };
+        Element[] F16_2 = { Element.F16_2(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_16, 2) };
+        Element[] F16_3 = { Element.F16_3(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_16, 3) };
+        Element[] F16_4 = { Element.F16_4(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_16, 4) };
         Element[] F32 = { Element.F32(mRS) };
         Element[] F32_2 = { Element.F32_2(mRS),
             Element.createVector(mRS, Element.DataType.FLOAT_32, 2) };
@@ -236,8 +243,10 @@
             Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
                                 Element.DataKind.PIXEL_RGBA) };
 
-        Element[][] ElementArrs = { ALLOCATION, BOOLEAN, ELEMENT, F32, F32_2,
-                                    F32_3, F32_4, F64, I16, I32, I64, I8,
+        Element[][] ElementArrs = { ALLOCATION, BOOLEAN, ELEMENT,
+                                    F16, F16_2, F16_3, F16_4,
+                                    F32, F32_2, F32_3, F32_4,
+                                    F64, I16, I32, I64, I8,
                                     MATRIX_2X2, MATRIX_3X3, MATRIX_4X4, MESH,
                                     PROGRAM_FRAGMENT, PROGRAM_RASTER,
                                     PROGRAM_STORE, PROGRAM_VERTEX, RGBA_4444,
@@ -272,6 +281,10 @@
             eb.add(Element.RGB_565(mRS), "RGB_565", arraySize);
             eb.add(Element.RGB_888(mRS), "RGB_888", arraySize);
             eb.add(Element.RGBA_8888(mRS), "RGBA_8888", arraySize);
+            eb.add(Element.F16(mRS), "F16", arraySize);
+            eb.add(Element.F16_2(mRS), "F16_2", arraySize);
+            eb.add(Element.F16_3(mRS), "F16_3", arraySize);
+            eb.add(Element.F16_4(mRS), "F16_4", arraySize);
             eb.add(Element.F32(mRS), "F32", arraySize);
             eb.add(Element.F32_2(mRS), "F32_2", arraySize);
             eb.add(Element.F32_3(mRS), "F32_3", arraySize);
@@ -338,6 +351,10 @@
         assertFalse(Element.RGB_565(mRS).isComplex());
         assertFalse(Element.RGB_888(mRS).isComplex());
         assertFalse(Element.RGBA_8888(mRS).isComplex());
+        assertFalse(Element.F16(mRS).isComplex());
+        assertFalse(Element.F16_2(mRS).isComplex());
+        assertFalse(Element.F16_3(mRS).isComplex());
+        assertFalse(Element.F16_4(mRS).isComplex());
         assertFalse(Element.F32(mRS).isComplex());
         assertFalse(Element.F32_2(mRS).isComplex());
         assertFalse(Element.F32_3(mRS).isComplex());
@@ -416,6 +433,7 @@
         // Uncomment when NONE is no longer hidden.
         //assertEquals(DataType.NONE, DataType.valueOf("NONE"));
 
+        assertEquals(DataType.FLOAT_16, DataType.valueOf("FLOAT_16"));
         assertEquals(DataType.FLOAT_32, DataType.valueOf("FLOAT_32"));
         assertEquals(DataType.FLOAT_64, DataType.valueOf("FLOAT_64"));
         assertEquals(DataType.SIGNED_8, DataType.valueOf("SIGNED_8"));
@@ -452,6 +470,7 @@
 
         for (DataType dt : DataType.values()) {
             switch (dt) {
+            case FLOAT_16:
             case FLOAT_32:
             case FLOAT_64:
             case SIGNED_8:
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Intrinsic3DLut.java b/tests/tests/renderscript/src/android/renderscript/cts/Intrinsic3DLut.java
index 87a03ad..4ec84ad 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Intrinsic3DLut.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Intrinsic3DLut.java
@@ -136,5 +136,12 @@
         checkError();
     }
 
+    public void test_ID() {
+        ScriptIntrinsic3DLUT s = ScriptIntrinsic3DLUT.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+    }
 
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBLAS.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBLAS.java
new file mode 100644
index 0000000..eeef6e7
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBLAS.java
@@ -0,0 +1,2918 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+import java.util.ArrayList;
+
+public class IntrinsicBLAS extends IntrinsicBase {
+    private ScriptIntrinsicBLAS mBLAS;
+    private boolean mInitialized = false;
+
+    private ArrayList<Allocation> mMatrixS;
+    private final float alphaS = 1.0f;
+    private final float betaS = 1.0f;
+
+    private ArrayList<Allocation> mMatrixD;
+    private final double alphaD = 1.0;
+    private final double betaD = 1.0;
+
+    private ArrayList<Allocation> mMatrixC;
+    private final Float2 alphaC = new Float2(1.0f, 1.0f);
+    private final Float2 betaC = new Float2(1.0f, 1.0f);
+
+    private ArrayList<Allocation> mMatrixZ;
+    private final Double2 alphaZ = new Double2(1.0, 1.0);
+    private final Double2 betaZ = new Double2(1.0, 1.0);
+
+    private int[] mTranspose = {ScriptIntrinsicBLAS.NO_TRANSPOSE,
+                                ScriptIntrinsicBLAS.TRANSPOSE,
+                                ScriptIntrinsicBLAS.CONJ_TRANSPOSE,
+                                0};
+
+    private int[] mUplo = {ScriptIntrinsicBLAS.UPPER,
+                           ScriptIntrinsicBLAS.LOWER,
+                           0};
+
+    private int[] mDiag = {ScriptIntrinsicBLAS.NON_UNIT,
+                           ScriptIntrinsicBLAS.UNIT,
+                           0};
+
+    private int[] mSide = {ScriptIntrinsicBLAS.LEFT,
+                           ScriptIntrinsicBLAS.RIGHT,
+                           0};
+
+    private int[] mInc = {0, 1, 2};
+    private int[] mK = {-1, 0, 1};
+    private int[] mDim = {1, 2, 3, 256};
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        //now populate the test Matrixes and Vectors.
+        if (!mInitialized) {
+            mBLAS = ScriptIntrinsicBLAS.create(mRS);
+            mMatrixS = new ArrayList<Allocation>();
+            mMatrixD = new ArrayList<Allocation>();
+            mMatrixC = new ArrayList<Allocation>();
+            mMatrixZ = new ArrayList<Allocation>();
+            for (int x : mDim) {
+                for (int y : mDim) {
+                    mMatrixS.add(Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), x, y)));
+                    mMatrixD.add(Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), x, y)));
+                    mMatrixC.add(Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), x, y)));
+                    mMatrixZ.add(Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), x, y)));
+                }
+            }
+            //also need Allocation with mismatch Element.
+            Allocation misAlloc = Allocation.createTyped(mRS, Type.createXY(mRS, Element.U8(mRS), 1, 1));
+            mMatrixS.add(misAlloc);
+            mMatrixD.add(misAlloc);
+            mMatrixC.add(misAlloc);
+            mMatrixZ.add(misAlloc);
+            mInitialized = true;
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    private boolean validateSide(int Side) {
+        if (Side != ScriptIntrinsicBLAS.LEFT && Side != ScriptIntrinsicBLAS.RIGHT) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateTranspose(int Trans) {
+        if (Trans != ScriptIntrinsicBLAS.NO_TRANSPOSE &&
+            Trans != ScriptIntrinsicBLAS.TRANSPOSE &&
+            Trans != ScriptIntrinsicBLAS.CONJ_TRANSPOSE) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateConjTranspose(int Trans) {
+        if (Trans != ScriptIntrinsicBLAS.NO_TRANSPOSE &&
+            Trans != ScriptIntrinsicBLAS.CONJ_TRANSPOSE) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateDiag(int Diag) {
+        if (Diag != ScriptIntrinsicBLAS.NON_UNIT &&
+            Diag != ScriptIntrinsicBLAS.UNIT) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateUplo(int Uplo) {
+        if (Uplo != ScriptIntrinsicBLAS.UPPER &&
+            Uplo != ScriptIntrinsicBLAS.LOWER) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateVecInput(Allocation X) {
+        if (X.getType().getY() > 2) {
+            //for testing vector, need a mismatch Y for complete test coverage.
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateGEMV(Element e, int TransA, Allocation A, Allocation X, int incX, Allocation Y, int incY) {
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        int M = A.getType().getY();
+        int N = A.getType().getX();
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = -1, expectedYDim = -1;
+        if (TransA == ScriptIntrinsicBLAS.NO_TRANSPOSE) {
+            expectedXDim = 1 + (N - 1) * incX;
+            expectedYDim = 1 + (M - 1) * incY;
+        } else {
+            expectedXDim = 1 + (M - 1) * incX;
+            expectedYDim = 1 + (N - 1) * incY;
+        }
+        if (X.getType().getX() != expectedXDim ||
+            Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xGEMV_API_test(int trans, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGEMV(elemA, trans, matA, vecX, incX, vecY, incY)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SGEMV(trans, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DGEMV(trans, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGEMV(trans, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGEMV(trans, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SGEMV(trans, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SGEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DGEMV(trans, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DGEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CGEMV(trans, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CGEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGEMV(trans, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZGEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xGEMV_API(ArrayList<Allocation> mMatrix) {
+        for (int trans : mTranspose) {
+            for (int incX : mInc) {
+                xGEMV_API_test(trans, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SGEMV_API() {
+        L2_xGEMV_API(mMatrixS);
+    }
+
+    public void test_L2_DGEMV_API() {
+        L2_xGEMV_API(mMatrixD);
+    }
+
+    public void test_L2_CGEMV_API() {
+        L2_xGEMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZGEMV_API() {
+        L2_xGEMV_API(mMatrixZ);
+    }
+
+
+    private void xGBMV_API_test(int trans, int KL, int KU, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGEMV(elemA, trans, matA, vecX, incX, vecY, incY) && KU >= 0 && KL >= 0) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SGBMV(trans, KL, KU, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DGBMV(trans, KL, KU, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGBMV(trans, KL, KU, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGBMV(trans, KL, KU, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SGBMV(trans, KL, KU, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SGBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DGBMV(trans, KL, KU, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DGBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CGBMV(trans, KL, KU, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CGBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGBMV(trans, KL, KU, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZGBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xGBMV_API(ArrayList<Allocation> mMatrix) {
+        for (int trans : mTranspose) {
+            for (int incX : mInc) {
+                for (int K : mK) {
+                    xGBMV_API_test(trans, K, K, incX, incX, mMatrix);
+                }
+            }
+        }
+    }
+
+    public void test_L2_SGBMV_API() {
+        L2_xGBMV_API(mMatrixS);
+    }
+
+    public void test_L2_DGBMV_API() {
+        L2_xGBMV_API(mMatrixD);
+    }
+
+    public void test_L2_CGBMV_API() {
+        L2_xGBMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZGBMV_API() {
+        L2_xGBMV_API(mMatrixZ);
+    }
+
+
+    private void xHEMV_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHEMV(Uplo, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHEMV(Uplo, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHEMV(Uplo, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CHEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHEMV(Uplo, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZHEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHEMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHEMV_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHEMV_API() {
+        L2_xHEMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZHEMV_API() {
+        L2_xHEMV_API(mMatrixZ);
+    }
+
+
+    private void xHBMV_API_test(int Uplo, int K, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2(elemA, Uplo, vecX, incX, vecY, incY, matA) && K >= 0) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHBMV(Uplo, K, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHBMV(Uplo, K, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHBMV(Uplo, K, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CHBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHBMV(Uplo, K, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZHBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHBMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int K : mK) {
+                for (int incX : mInc) {
+                        xHBMV_API_test(Uplo, K, incX, incX, mMatrix);
+                }
+            }
+        }
+    }
+
+    public void test_L2_CHBMV_API() {
+        L2_xHBMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZHBMV_API() {
+        L2_xHBMV_API(mMatrixZ);
+    }
+
+
+    private void xHPMV_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSPR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHPMV(Uplo, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHPMV(Uplo, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHPMV(Uplo, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CHPMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHPMV(Uplo, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZHPMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHPMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHPMV_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHPMV_API() {
+        L2_xHPMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZHPMV_API() {
+        L2_xHPMV_API(mMatrixZ);
+    }
+
+
+
+    private boolean validateSYMV(Element e, int Uplo, Allocation A, Allocation X, int incX, Allocation Y, int incY) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        int N = A.getType().getY();
+        if (A.getType().getX() != N) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e) ) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xSYMV_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYMV(elemA, Uplo, matA, vecX, incX, vecY, incY)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSYMV(Uplo, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSYMV(Uplo, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSYMV(Uplo, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SSYMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSYMV(Uplo, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DSYMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSYMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSYMV_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSYMV_API() {
+        L2_xSYMV_API(mMatrixS);
+    }
+
+    public void test_L2_DSYMV_API() {
+        L2_xSYMV_API(mMatrixD);
+    }
+
+
+
+    private void xSBMV_API_test(int Uplo, int K, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYMV(elemA, Uplo, matA, vecX, incX, vecY, incY) && K >= 0) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSBMV(Uplo, K, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSBMV(Uplo, K, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSBMV(Uplo, K, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SSBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSBMV(Uplo, K, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DSBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSBMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int K : mK) {
+                for (int incX : mInc) {
+                    xSBMV_API_test(Uplo, K, incX, incX, mMatrix);
+                }
+            }
+        }
+    }
+
+    public void test_L2_SSBMV_API() {
+        L2_xSBMV_API(mMatrixS);
+    }
+
+    public void test_L2_DSBMV_API() {
+        L2_xSBMV_API(mMatrixD);
+    }
+
+
+
+    private boolean validateSPMV(Element e, int Uplo, Allocation Ap, Allocation X, int incX, Allocation Y, int incY) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!Ap.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        if (Ap.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
+        if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
+            return false;
+        }
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xSPMV_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSPMV(elemA, Uplo, matA, vecX, incX, vecY, incY)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSPMV(Uplo, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSPMV(Uplo, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSPMV(Uplo, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SSPMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSPMV(Uplo, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DSPMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSPMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSPMV_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSPMV_API() {
+        L2_xSPMV_API(mMatrixS);
+    }
+
+    public void test_L2_DSPMV_API() {
+        L2_xSPMV_API(mMatrixD);
+    }
+
+
+
+    private boolean validateTRMV(Element e, int Uplo, int TransA, int Diag, Allocation A, Allocation X, int incX) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        if (!validateDiag(Diag)) {
+            return false;
+        }
+        int N = A.getType().getY();
+        if (A.getType().getX() != N) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1) {
+            return false;
+        }
+
+        if (incX <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xTRMV_API_test(int Uplo, int TransA, int Diag, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTRMV(elemA, Uplo, TransA, Diag, matA, vecX, incX)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STRMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTRMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTRMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTRMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTRMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int incX : mInc) {
+                        xTRMV_API_test(Uplo, TransA, Diag, incX, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STRMV_API() {
+        L2_xTRMV_API(mMatrixS);
+    }
+
+    public void test_L2_DTRMV_API() {
+        L2_xTRMV_API(mMatrixD);
+    }
+
+    public void test_L2_CTRMV_API() {
+        L2_xTRMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTRMV_API() {
+        L2_xTRMV_API(mMatrixZ);
+    }
+
+
+
+    private void xTBMV_API_test(int Uplo, int TransA, int Diag, int K, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTRMV(elemA, Uplo, TransA, Diag, matA, vecX, incX) && K >= 0) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STBMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTBMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTBMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTBMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTBMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int K : mK) {
+                        for (int incX : mInc) {
+                            xTBMV_API_test(Uplo, TransA, Diag, K, incX, mMatrix);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STBMV_API() {
+        L2_xTBMV_API(mMatrixS);
+    }
+
+    public void test_L2_DTBMV_API() {
+        L2_xTBMV_API(mMatrixD);
+    }
+
+    public void test_L2_CTBMV_API() {
+        L2_xTBMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTBMV_API() {
+        L2_xTBMV_API(mMatrixZ);
+    }
+
+
+    private boolean validateTPMV(Element e, int Uplo, int TransA, int Diag, Allocation Ap, Allocation X, int incX) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        if (!validateDiag(Diag)) {
+            return false;
+        }
+        if (!Ap.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1) {
+            return false;
+        }
+
+        if (Ap.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
+        if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
+            return false;
+        }
+        if (incX <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xTPMV_API_test(int Uplo, int TransA, int Diag, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTPMV(elemA, Uplo, TransA, Diag, matA, vecX, incX)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STPMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTPMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTPMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTPMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTPMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int incX : mInc) {
+                        xTPMV_API_test(Uplo, TransA, Diag, incX, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STPMV_API() {
+        L2_xTPMV_API(mMatrixS);
+    }
+
+    public void test_L2_DTPMV_API() {
+        L2_xTPMV_API(mMatrixD);
+    }
+
+    public void test_L2_CTPMV_API() {
+        L2_xTPMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTPMV_API() {
+        L2_xTPMV_API(mMatrixZ);
+    }
+
+
+    private void xTRSV_API_test(int Uplo, int TransA, int Diag, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTRMV(elemA, Uplo, TransA, Diag, matA, vecX, incX)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STRSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTRSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTRSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTRSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTRSV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int incX : mInc) {
+                        xTRSV_API_test(Uplo, TransA, Diag, incX, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STRSV_API() {
+        L2_xTRSV_API(mMatrixS);
+    }
+
+    public void test_L2_DTRSV_API() {
+        L2_xTRSV_API(mMatrixD);
+    }
+
+    public void test_L2_CTRSV_API() {
+        L2_xTRSV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTRSV_API() {
+        L2_xTRSV_API(mMatrixZ);
+    }
+
+
+    private void xTBSV_API_test(int Uplo, int TransA, int Diag, int K, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTRMV(elemA, Uplo, TransA, Diag, matA, vecX, incX) && K >= 0) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STBSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTBSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTBSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTBSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTBSV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int K : mK) {
+                        for (int incX : mInc) {
+                            xTBSV_API_test(Uplo, TransA, Diag, K, incX, mMatrix);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STBSV_API() {
+        L2_xTBSV_API(mMatrixS);
+    }
+
+    public void test_L2_DTBSV_API() {
+        L2_xTBSV_API(mMatrixD);
+    }
+
+    public void test_L2_CTBSV_API() {
+        L2_xTBSV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTBSV_API() {
+        L2_xTBSV_API(mMatrixZ);
+    }
+
+
+    private void xTPSV_API_test(int Uplo, int TransA, int Diag, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTPMV(elemA, Uplo, TransA, Diag, matA, vecX, incX)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STPSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTPSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTPSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTPSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTPSV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int incX : mInc) {
+                        xTPSV_API_test(Uplo, TransA, Diag, incX, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STPSV_API() {
+        L2_xTPSV_API(mMatrixS);
+    }
+
+    public void test_L2_DTPSV_API() {
+        L2_xTPSV_API(mMatrixD);
+    }
+
+    public void test_L2_CTPSV_API() {
+        L2_xTPSV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTPSV_API() {
+        L2_xTPSV_API(mMatrixZ);
+    }
+
+
+    private boolean validateGER(Element e, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e) ) {
+            return false;
+        }
+
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        int M = A.getType().getY();
+        int N = A.getType().getX();
+
+        if (N < 1 || M < 1) {
+            return false;
+        }
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (M - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+
+    private void xGER_API_test(int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGER(elemA, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SGER(alphaS, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DGER(alphaD, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SGER(alphaS, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for SGER");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DGER(alphaD, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for DGER");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L2_xGER_API(ArrayList<Allocation> mMatrix) {
+        for (int incX : mInc) {
+            for (int incY : mInc) {
+                xGERU_API_test(incX, incY, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SGER_API() {
+        L2_xGER_API(mMatrixS);
+    }
+
+    public void test_L2_DGER_API() {
+        L2_xGER_API(mMatrixD);
+    }
+
+
+
+    private boolean validateGERU(Element e, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        int M = A.getType().getY();
+        int N = A.getType().getX();
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (M - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xGERU_API_test(int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGERU(elemA, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGERU(alphaC, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGERU(alphaZ, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CGERU(alphaC, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for CGERU");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGERU(alphaZ, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for ZGERU");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L2_xGERU_API(ArrayList<Allocation> mMatrix) {
+        for (int incX : mInc) {
+            for (int incY : mInc) {
+                xGERU_API_test(incX, incY, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CGERU_API() {
+        L2_xGERU_API(mMatrixC);
+    }
+
+    public void test_L2_ZGERU_API() {
+        L2_xGERU_API(mMatrixZ);
+    }
+
+
+    private void xGERC_API_test(int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGERU(elemA, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGERC(alphaC, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGERC(alphaZ, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CGERC(alphaC, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for CGERC");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGERC(alphaZ, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for ZGERC");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L2_xGERC_API(ArrayList<Allocation> mMatrix) {
+        for (int incX : mInc) {
+            for (int incY : mInc) {
+                xGERC_API_test(incX, incY, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CGERC_API() {
+        L2_xGERC_API(mMatrixC);
+    }
+
+    public void test_L2_ZGERC_API() {
+        L2_xGERC_API(mMatrixZ);
+    }
+
+
+
+    private void xHER_API_test(int Uplo, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateSYR(elemA, Uplo, vecX, incX, matA)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CHER(Uplo, alphaS, vecX, incX, matA);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZHER(Uplo, alphaD, vecX, incX, matA);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.CHER(Uplo, alphaS, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for CHER");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZHER(Uplo, alphaD, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for ZHER");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHER_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHER_API_test(Uplo, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHER_API() {
+        L2_xHER_API(mMatrixC);
+    }
+
+    public void test_L2_ZHER_API() {
+        L2_xHER_API(mMatrixZ);
+    }
+
+
+    private void xHPR_API_test(int Uplo, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateSPR(elemA, Uplo, vecX, incX, matA)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CHPR(Uplo, alphaS, vecX, incX, matA);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZHPR(Uplo, alphaD, vecX, incX, matA);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.CHPR(Uplo, alphaS, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for CHPR");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZHPR(Uplo, alphaD, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for ZHPR");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHPR_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHPR_API_test(Uplo, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHPR_API() {
+        L2_xHPR_API(mMatrixC);
+    }
+
+    public void test_L2_ZHPR_API() {
+        L2_xHPR_API(mMatrixZ);
+    }
+
+
+    private void xHER2_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHER2(Uplo, alphaC, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHER2(Uplo, alphaZ, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHER2(Uplo, alphaC, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for CHER2");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHER2(Uplo, alphaZ, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for ZHER2");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHER2_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHER2_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHER2_API() {
+        L2_xHER2_API(mMatrixC);
+    }
+
+    public void test_L2_ZHER2_API() {
+        L2_xHER2_API(mMatrixZ);
+    }
+
+
+
+    private void xHPR2_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSPR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHPR2(Uplo, alphaC, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHPR2(Uplo, alphaZ, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHPR2(Uplo, alphaC, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for CHPR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHPR2(Uplo, alphaZ, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for ZHPR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHPR2_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHPR2_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHPR2_API() {
+        L2_xHPR2_API(mMatrixC);
+    }
+
+    public void test_L2_ZHPR2_API() {
+        L2_xHPR2_API(mMatrixZ);
+    }
+
+
+
+    private boolean validateSYR(Element e, int Uplo, Allocation X, int incX, Allocation A) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+
+        int N = A.getType().getX();
+
+        if (X.getType().getY() > 1) {
+            return false;
+        }
+        if (N != A.getType().getY()) {
+            return false;
+        }
+        if (incX <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xSYR_API_test(int Uplo, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateSYR(elemA, Uplo, vecX, incX, matA)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.SSYR(Uplo, alphaS, vecX, incX, matA);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DSYR(Uplo, alphaD, vecX, incX, matA);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.SSYR(Uplo, alphaS, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for SSYR");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DSYR(Uplo, alphaD, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for DSYR");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSYR_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSYR_API_test(Uplo, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSYR_API() {
+        L2_xSYR_API(mMatrixS);
+    }
+
+    public void test_L2_DSYR_API() {
+        L2_xSYR_API(mMatrixD);
+    }
+
+
+
+
+
+    private boolean validateSPR(Element e, int Uplo, Allocation X, int incX, Allocation Ap) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!Ap.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1) {
+            return false;
+        }
+
+        if (Ap.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
+        if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
+            return false;
+        }
+        if (incX <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xSPR_API_test(int Uplo, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateSPR(elemA, Uplo, vecX, incX, matA)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.SSPR(Uplo, alphaS, vecX, incX, matA);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DSPR(Uplo, alphaD, vecX, incX, matA);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.SSPR(Uplo, alphaS, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for SSPR");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DSPR(Uplo, alphaD, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for DSPR");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSPR_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSPR_API_test(Uplo, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSPR_API() {
+        L2_xSPR_API(mMatrixS);
+    }
+
+    public void test_L2_DSPR_API() {
+        L2_xSPR_API(mMatrixD);
+    }
+
+
+
+
+    private boolean validateSYR2(Element e, int Uplo, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = A.getType().getX();
+
+        if (N != A.getType().getY()) {
+            return false;
+        }
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (X.getType().getX() != expectedXDim || Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xSYR2_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSYR2(Uplo, alphaS, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSYR2(Uplo, alphaD, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSYR2(Uplo, alphaS, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for SSYR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSYR2(Uplo, alphaD, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for DSYR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSYR2_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSYR2_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSYR2_API() {
+        L2_xSYR2_API(mMatrixS);
+    }
+
+    public void test_L2_DSYR2_API() {
+        L2_xSYR2_API(mMatrixD);
+    }
+
+
+
+
+    private boolean validateSPR2(Element e, int Uplo, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!Ap.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        if (Ap.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
+        if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
+            return false;
+        }
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (X.getType().getX() != expectedXDim || Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xSPR2_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSPR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSPR2(Uplo, alphaS, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSPR2(Uplo, alphaD, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSPR2(Uplo, alphaS, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for SSPR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSPR2(Uplo, alphaD, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for DSPR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSPR2_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSPR2_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSPR2_API() {
+        L2_xSPR2_API(mMatrixS);
+    }
+
+    public void test_L2_DSPR2_API() {
+        L2_xSPR2_API(mMatrixD);
+    }
+
+
+
+
+
+    private boolean validateL3(Element e, int TransA, int TransB, int Side, Allocation A, Allocation B, Allocation C) {
+        int aM = -1, aN = -1, bM = -1, bN = -1, cM = -1, cN = -1;
+        if ((A != null && !A.getType().getElement().isCompatible(e)) ||
+            (B != null && !B.getType().getElement().isCompatible(e)) ||
+            (C != null && !C.getType().getElement().isCompatible(e))) {
+            return false;
+        }
+        if (C == null) {
+            //since matrix C is used to store the result, it cannot be null.
+            return false;
+        }
+        cM = C.getType().getY();
+        cN = C.getType().getX();
+
+        if (Side == ScriptIntrinsicBLAS.RIGHT) {
+            if ((A == null && B != null) || (A != null && B == null)) {
+                return false;
+            }
+            if (B != null) {
+                bM = A.getType().getY();
+                bN = A.getType().getX();
+            }
+            if (A != null) {
+                aM = B.getType().getY();
+                aN = B.getType().getX();
+            }
+        } else {
+            if (A != null) {
+                if (TransA == ScriptIntrinsicBLAS.TRANSPOSE ||
+                    TransA == ScriptIntrinsicBLAS.CONJ_TRANSPOSE ) {
+                    aN = A.getType().getY();
+                    aM = A.getType().getX();
+                } else {
+                    aM = A.getType().getY();
+                    aN = A.getType().getX();
+                }
+            }
+            if (B != null) {
+                if (TransB == ScriptIntrinsicBLAS.TRANSPOSE ||
+                    TransB == ScriptIntrinsicBLAS.CONJ_TRANSPOSE ) {
+                    bN = B.getType().getY();
+                    bM = B.getType().getX();
+                } else {
+                    bM = B.getType().getY();
+                    bN = B.getType().getX();
+                }
+            }
+        }
+        if (A != null && B != null && C != null) {
+            if (aN != bM || aM != cM || bN != cN) {
+                return false;
+            }
+        } else if (A != null && C != null) {
+            // A and C only, for SYRK
+            if (cM != cN) {
+                return false;
+            }
+            if (aM != cM) {
+                return false;
+            }
+        } else if (A != null && B != null) {
+            // A and B only
+            if (aN != bM) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private boolean validateL3_xGEMM(Element e, int TransA, int TransB, Allocation A, Allocation B, Allocation C) {
+        boolean result = true;
+        result &= validateTranspose(TransA);
+        result &= validateTranspose(TransB);
+        result &= validateL3(e, TransA, TransB, 0, A, B, C);
+
+        return result;
+    }
+
+    private void xGEMM_API_test(int transA, int transB, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateL3_xGEMM(elemA, transA, transB, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SGEMM(transA, transB, alphaS, matA, matB, betaS, matC);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DGEMM(transA, transB, alphaD, matA, matB, betaD, matC);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGEMM(transA, transB, alphaC, matA, matB, betaC, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGEMM(transA, transB, alphaZ, matA, matB, betaZ, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SGEMM(transA, transB, alphaS, matA, matB, betaS, matC);
+                            fail("should throw RSRuntimeException for SGEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DGEMM(transA, transB, alphaD, matA, matB, betaD, matC);
+                            fail("should throw RSRuntimeException for DGEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CGEMM(transA, transB, alphaC, matA, matB, betaC, matC);
+                            fail("should throw RSRuntimeException for CGEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGEMM(transA, transB, alphaZ, matA, matB, betaZ, matC);
+                            fail("should throw RSRuntimeException for ZGEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L3_xGEMM_API(ArrayList<Allocation> mMatrix) {
+        for (int transA : mTranspose) {
+            for (int transB : mTranspose) {
+                xGEMM_API_test(transA, transB, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_SGEMM_API() {
+        L3_xGEMM_API(mMatrixS);
+    }
+
+    public void test_L3_DGEMM_API() {
+        L3_xGEMM_API(mMatrixD);
+    }
+
+    public void test_L3_CGEMM_API() {
+        L3_xGEMM_API(mMatrixC);
+    }
+
+    public void test_L3_ZGEMM_API() {
+        L3_xGEMM_API(mMatrixZ);
+    }
+
+    private boolean validateL3_xSYMM(Element e, int Side, int Uplo, Allocation A, Allocation B, Allocation C) {
+        boolean result = true;
+        result &= validateSide(Side);
+        result &= validateUplo(Uplo);
+        result &= validateL3(e, 0, 0, Side, A, B, C);
+        result &= (A.getType().getX() == A.getType().getY());
+        return result;
+    }
+
+    private void xSYMM_API_test(int Side, int Uplo, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateL3_xSYMM(elemA, Side, Uplo, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSYMM(Side, Uplo, alphaS, matA, matB, betaS, matC);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSYMM(Side, Uplo, alphaD, matA, matB, betaD, matC);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CSYMM(Side, Uplo, alphaC, matA, matB, betaC, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZSYMM(Side, Uplo, alphaZ, matA, matB, betaZ, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSYMM(Side, Uplo, alphaS, matA, matB, betaS, matC);
+                            fail("should throw RSRuntimeException for SSYMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSYMM(Side, Uplo, alphaD, matA, matB, betaD, matC);
+                            fail("should throw RSRuntimeException for DSYMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CSYMM(Side, Uplo, alphaC, matA, matB, betaC, matC);
+                            fail("should throw RSRuntimeException for CSYMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZSYMM(Side, Uplo, alphaZ, matA, matB, betaZ, matC);
+                            fail("should throw RSRuntimeException for ZSYMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L3_xSYMM_API(ArrayList<Allocation> mMatrix) {
+        for (int Side : mSide) {
+            for (int Uplo : mUplo) {
+                xSYMM_API_test(Side, Uplo, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_SSYMM_API() {
+        L3_xSYMM_API(mMatrixS);
+    }
+
+    public void test_L3_DSYMM_API() {
+        L3_xSYMM_API(mMatrixD);
+    }
+
+    public void test_L3_CSYMM_API() {
+        L3_xSYMM_API(mMatrixC);
+    }
+
+    public void test_L3_ZSYMM_API() {
+        L3_xSYMM_API(mMatrixZ);
+    }
+
+
+    private boolean validateHEMM(Element e, int Side, int Uplo, Allocation A, Allocation B, Allocation C) {
+        if (!validateSide(Side)) {
+            return false;
+        }
+
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e) ||
+            !C.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+
+        // A must be square; can potentially be relaxed similar to TRSM
+        int adim = A.getType().getX();
+        if (adim != A.getType().getY()) {
+            return false;
+        }
+        if ((Side == ScriptIntrinsicBLAS.LEFT && adim != B.getType().getY()) ||
+            (Side == ScriptIntrinsicBLAS.RIGHT && adim != B.getType().getX())) {
+            return false;
+        }
+        if (B.getType().getX() != C.getType().getX() ||
+            B.getType().getY() != C.getType().getY()) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xHEMM_API_test(int Side, int Uplo, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateHEMM(elemA, Side, Uplo, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHEMM(Side, Uplo, alphaC, matA, matB, betaC, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHEMM(Side, Uplo, alphaZ, matA, matB, betaZ, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHEMM(Side, Uplo, alphaC, matA, matB, betaC, matC);
+                            fail("should throw RSRuntimeException for CHEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHEMM(Side, Uplo, alphaZ, matA, matB, betaZ, matC);
+                            fail("should throw RSRuntimeException for ZHEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xHEMM_API(ArrayList<Allocation> mMatrix) {
+        for (int Side : mSide) {
+            for (int Uplo : mUplo) {
+                xHEMM_API_test(Side, Uplo, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_CHEMM_API() {
+        L3_xHEMM_API(mMatrixC);
+    }
+
+    public void test_L3_ZHEMM_API() {
+        L3_xHEMM_API(mMatrixZ);
+    }
+
+
+    private boolean validateL3_xSYRK(Element e, int Uplo, int Trans, Allocation A, Allocation C) {
+        boolean result = true;
+        result &= validateTranspose(Trans);
+        result &= validateUplo(Uplo);
+        result &= validateL3(e, Trans, 0, 0, A, null, C);
+
+        return result;
+    }
+
+    private void xSYRK_API_test(int Uplo, int Trans, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matC : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateL3_xSYRK(elemA, Uplo, Trans, matA, matC)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.SSYRK(Uplo, Trans, alphaS, matA, betaS, matC);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DSYRK(Uplo, Trans, alphaD, matA, betaD, matC);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CSYRK(Uplo, Trans, alphaC, matA, betaC, matC);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZSYRK(Uplo, Trans, alphaZ, matA, betaZ, matC);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.SSYRK(Uplo, Trans, alphaS, matA, betaS, matC);
+                        fail("should throw RSRuntimeException for SSYRK");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DSYRK(Uplo, Trans, alphaD, matA, betaD, matC);
+                        fail("should throw RSRuntimeException for DSYRK");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CSYRK(Uplo, Trans, alphaC, matA, betaC, matC);
+                        fail("should throw RSRuntimeException for CSYRK");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZSYRK(Uplo, Trans, alphaZ, matA, betaZ, matC);
+                        fail("should throw RSRuntimeException for ZSYRK");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xSYRK_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int Trans : mTranspose) {
+                xSYRK_API_test(Uplo, Trans, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_SSYRK_API() {
+        L3_xSYRK_API(mMatrixS);
+    }
+
+    public void test_L3_DSYRK_API() {
+        L3_xSYRK_API(mMatrixD);
+    }
+
+    public void test_L3_CSYRK_API() {
+        L3_xSYRK_API(mMatrixC);
+    }
+
+    public void test_L3_ZSYRK_API() {
+        L3_xSYRK_API(mMatrixZ);
+    }
+
+
+    private boolean validateHERK(Element e, int Uplo, int Trans, Allocation A, Allocation C) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !C.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (!validateConjTranspose(Trans)) {
+            return false;
+        }
+        int cdim = C.getType().getX();
+        if (cdim != C.getType().getY()) {
+            return false;
+        }
+        if (Trans == ScriptIntrinsicBLAS.NO_TRANSPOSE) {
+            if (cdim != A.getType().getY()) {
+                return false;
+            }
+        } else {
+            if (cdim != A.getType().getX()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void xHERK_API_test(int Uplo, int Trans, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matC : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateHERK(elemA, Uplo, Trans, matA, matC)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CHERK(Uplo, Trans, alphaS, matA, betaS, matC);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZHERK(Uplo, Trans, alphaD, matA, betaD, matC);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.CHERK(Uplo, Trans, alphaS, matA, betaS, matC);
+                        fail("should throw RSRuntimeException for CHERK");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZHERK(Uplo, Trans, alphaD, matA, betaD, matC);
+                        fail("should throw RSRuntimeException for ZHERK");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xHERK_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int Trans : mTranspose) {
+                xHERK_API_test(Uplo, Trans, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_CHERK_API() {
+        L3_xHERK_API(mMatrixC);
+    }
+
+    public void test_L3_ZHERK_API() {
+        L3_xHERK_API(mMatrixZ);
+    }
+
+
+    private boolean validateSYR2K(Element e, int Uplo, int Trans, Allocation A, Allocation B, Allocation C) {
+        if (!validateTranspose(Trans)) {
+            return false;
+        }
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e) ||
+            !C.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        int Cdim = -1;
+        // A is n x k if no transpose, k x n if transpose
+        // C is n x n
+        if (Trans == ScriptIntrinsicBLAS.TRANSPOSE) {
+            // check columns versus C
+            Cdim = A.getType().getX();
+        } else {
+            // check rows versus C
+            Cdim = A.getType().getY();
+        }
+        if (C.getType().getX() != Cdim || C.getType().getY() != Cdim) {
+            return false;
+        }
+        // A dims == B dims
+        if (A.getType().getX() != B.getType().getX() || A.getType().getY() != B.getType().getY()) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xSYR2K_API_test(int Uplo, int Trans, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2K(elemA, Uplo, Trans, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSYR2K(Uplo, Trans, alphaS, matA, matB, betaS, matC);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSYR2K(Uplo, Trans, alphaD, matA, matB, betaD, matC);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CSYR2K(Uplo, Trans, alphaC, matA, matB, betaC, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZSYR2K(Uplo, Trans, alphaZ, matA, matB, betaZ, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSYR2K(Uplo, Trans, alphaS, matA, matB, betaS, matC);
+                            fail("should throw RSRuntimeException for SSYR2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSYR2K(Uplo, Trans, alphaD, matA, matB, betaD, matC);
+                            fail("should throw RSRuntimeException for DSYR2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CSYR2K(Uplo, Trans, alphaC, matA, matB, betaC, matC);
+                            fail("should throw RSRuntimeException for CSYR2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZSYR2K(Uplo, Trans, alphaZ, matA, matB, betaZ, matC);
+                            fail("should throw RSRuntimeException for ZSYR2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xSYR2K_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int Trans : mTranspose) {
+                xSYR2K_API_test(Uplo, Trans, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_SSYR2K_API() {
+        L3_xSYR2K_API(mMatrixS);
+    }
+
+    public void test_L3_DSYR2K_API() {
+        L3_xSYR2K_API(mMatrixD);
+    }
+
+    public void test_L3_CSYR2K_API() {
+        L3_xSYR2K_API(mMatrixC);
+    }
+
+    public void test_L3_ZSYR2K_API() {
+        L3_xSYR2K_API(mMatrixZ);
+    }
+
+
+    private boolean validateHER2K(Element e, int Uplo, int Trans, Allocation A, Allocation B, Allocation C) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e) ||
+            !C.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (!validateConjTranspose(Trans)) {
+            return false;
+        }
+        int cdim = C.getType().getX();
+        if (cdim != C.getType().getY()) {
+            return false;
+        }
+        if (Trans == ScriptIntrinsicBLAS.NO_TRANSPOSE) {
+            if (A.getType().getY() != cdim) {
+                return false;
+            }
+        } else {
+            if (A.getType().getX() != cdim) {
+                return false;
+            }
+        }
+        if (A.getType().getX() != B.getType().getX() || A.getType().getY() != B.getType().getY()) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xHER2K_API_test(int Uplo, int Trans, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateHER2K(elemA, Uplo, Trans, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHER2K(Uplo, Trans, alphaC, matA, matB, betaS, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHER2K(Uplo, Trans, alphaZ, matA, matB, betaD, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHER2K(Uplo, Trans, alphaC, matA, matB, betaS, matC);
+                            fail("should throw RSRuntimeException for CHER2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHER2K(Uplo, Trans, alphaZ, matA, matB, betaD, matC);
+                            fail("should throw RSRuntimeException for ZHER2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xHER2K_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int Trans : mTranspose) {
+                xHER2K_API_test(Uplo, Trans, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_CHER2K_API() {
+        L3_xHER2K_API(mMatrixC);
+    }
+
+    public void test_L3_ZHER2K_API() {
+        L3_xHER2K_API(mMatrixZ);
+    }
+
+
+    private boolean validateTRMM(Element e, int Side, int Uplo, int TransA, int Diag, Allocation A, Allocation B) {
+        if (!validateSide(Side)) {
+            return false;
+        }
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        if (!validateDiag(Diag)) {
+            return false;
+        }
+        int aM = -1, aN = -1, bM = -1, bN = -1;
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+
+        aM = A.getType().getY();
+        aN = A.getType().getX();
+        if (aM != aN) {
+            return false;
+        }
+
+        bM = B.getType().getY();
+        bN = B.getType().getX();
+        if (Side == ScriptIntrinsicBLAS.LEFT) {
+            if (aN != bM) {
+                return false;
+            }
+        } else {
+            if (bN != aM) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void xTRMM_API_test(int Side, int Uplo, int TransA, int Diag, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateTRMM(elemA, Side, Uplo, TransA, Diag, matA, matB)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STRMM(Side, Uplo, TransA, Diag, alphaS, matA, matB);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTRMM(Side, Uplo, TransA, Diag, alphaD, matA, matB);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTRMM(Side, Uplo, TransA, Diag, alphaC, matA, matB);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTRMM(Side, Uplo, TransA, Diag, alphaZ, matA, matB);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STRMM(Side, Uplo, TransA, Diag, alphaS, matA, matB);
+                        fail("should throw RSRuntimeException for STRMM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTRMM(Side, Uplo, TransA, Diag, alphaD, matA, matB);
+                        fail("should throw RSRuntimeException for DTRMM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTRMM(Side, Uplo, TransA, Diag, alphaC, matA, matB);
+                        fail("should throw RSRuntimeException for CTRMM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTRMM(Side, Uplo, TransA, Diag, alphaZ, matA, matB);
+                        fail("should throw RSRuntimeException for ZTRMM");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xTRMM_API(ArrayList<Allocation> mMatrix) {
+        for (int Side : mSide) {
+            for (int Uplo : mUplo) {
+                for (int TransA : mTranspose) {
+                    for (int Diag : mDiag) {
+                        xTRMM_API_test(Side, Uplo, TransA, Diag, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L3_STRMM_API() {
+        L3_xTRMM_API(mMatrixS);
+    }
+
+    public void test_L3_DTRMM_API() {
+        L3_xTRMM_API(mMatrixD);
+    }
+
+    public void test_L3_CTRMM_API() {
+        L3_xTRMM_API(mMatrixC);
+    }
+
+    public void test_L3_ZTRMM_API() {
+        L3_xTRMM_API(mMatrixZ);
+    }
+
+
+    private boolean validateTRSM(Element e, int Side, int Uplo, int TransA, int Diag, Allocation A, Allocation B) {
+        int adim = -1, bM = -1, bN = -1;
+        if (!validateSide(Side)) {
+            return false;
+        }
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!validateDiag(Diag)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        adim = A.getType().getX();
+        if (adim != A.getType().getY()) {
+            // this may be unnecessary, the restriction could potentially be relaxed
+            // A needs to contain at least that symmetric matrix but could theoretically be larger
+            // for now we assume adapters are sufficient, will reevaluate in the future
+            return false;
+        }
+        bM = B.getType().getY();
+        bN = B.getType().getX();
+        if (Side == ScriptIntrinsicBLAS.LEFT) {
+            // A is M*M
+            if (adim != bM) {
+                return false;
+            }
+        } else {
+            // A is N*N
+            if (adim != bN) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void xTRSM_API_test(int Side, int Uplo, int TransA, int Diag, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateTRSM(elemA, Side, Uplo, TransA, Diag, matA, matB)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STRSM(Side, Uplo, TransA, Diag, alphaS, matA, matB);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTRSM(Side, Uplo, TransA, Diag, alphaD, matA, matB);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTRSM(Side, Uplo, TransA, Diag, alphaC, matA, matB);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTRSM(Side, Uplo, TransA, Diag, alphaZ, matA, matB);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STRSM(Side, Uplo, TransA, Diag, alphaS, matA, matB);
+                        fail("should throw RSRuntimeException for STRSM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTRSM(Side, Uplo, TransA, Diag, alphaD, matA, matB);
+                        fail("should throw RSRuntimeException for DTRSM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTRSM(Side, Uplo, TransA, Diag, alphaC, matA, matB);
+                        fail("should throw RSRuntimeException for CTRSM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTRSM(Side, Uplo, TransA, Diag, alphaZ, matA, matB);
+                        fail("should throw RSRuntimeException for ZTRSM");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xTRSM_API(ArrayList<Allocation> mMatrix) {
+        for (int Side : mSide) {
+            for (int Uplo : mUplo) {
+                for (int TransA : mTranspose) {
+                    for (int Diag : mDiag) {
+                        xTRSM_API_test(Side, Uplo, TransA, Diag, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L3_STRSM_API() {
+        L3_xTRSM_API(mMatrixS);
+    }
+
+    public void test_L3_DTRSM_API() {
+        L3_xTRSM_API(mMatrixD);
+    }
+
+    public void test_L3_CTRSM_API() {
+        L3_xTRSM_API(mMatrixC);
+    }
+
+    public void test_L3_ZTRSM_API() {
+        L3_xTRSM_API(mMatrixZ);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBlur.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBlur.java
index 076dcd4..4e99391 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBlur.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBlur.java
@@ -141,5 +141,17 @@
         checkError();
     }
 
+    public void test_ID() {
+        ScriptIntrinsicBlur s = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+
+        Script.FieldID fid = s.getFieldID_Input();
+        if (fid == null) {
+            throw new IllegalStateException("fid must be valid");
+        }
+    }
 
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
index 8faeb22..8a2bc27 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
@@ -247,4 +247,17 @@
         checkError();
     }
 
+    public void test_ID() {
+        ScriptIntrinsicConvolve3x3 s = ScriptIntrinsicConvolve3x3.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+
+        Script.FieldID fid = s.getFieldID_Input();
+        if (fid == null) {
+            throw new IllegalStateException("fid must be valid");
+        }
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
index 0753c62..410aebd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
@@ -184,4 +184,17 @@
         checkError();
     }
 
+    public void test_ID() {
+        ScriptIntrinsicConvolve5x5 s = ScriptIntrinsicConvolve5x5.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+
+        Script.FieldID fid = s.getFieldID_Input();
+        if (fid == null) {
+            throw new IllegalStateException("fid must be valid");
+        }
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java
index 1567639..3309bb0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java
@@ -83,5 +83,12 @@
     }
 
 
+    public void test_ID() {
+        ScriptIntrinsicLUT s = ScriptIntrinsicLUT.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+    }
 
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
index 24e56d7..c8b3640 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
@@ -24,7 +24,7 @@
     static final int inX = 307;
     static final int inY = 157;
 
-    private void testReszie(int w, int h, Element.DataType dt, int vecSize, float scaleX, float scaleY) {
+    private void testResize(int w, int h, Element.DataType dt, int vecSize, float scaleX, float scaleY) {
 
         Element e = makeElement(dt, vecSize);
 
@@ -98,343 +98,343 @@
 
 
     public void test_U8_4_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
         checkError();
     }
     public void test_U8_3_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
         checkError();
     }
     public void test_U8_2_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
         checkError();
     }
     public void test_U8_1_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
         checkError();
     }
 
     public void test_U8_4_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
         checkError();
     }
     public void test_U8_3_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
         checkError();
     }
     public void test_U8_2_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
         checkError();
     }
     public void test_U8_1_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
         checkError();
     }
 
     public void test_U8_4_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_3_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_2_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_1_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
         checkError();
     }
 
     public void test_U8_4_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_3_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_2_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_1_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
         checkError();
     }
 
     public void test_U8_4_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_3_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_2_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_1_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
         checkError();
     }
 
     public void test_U8_4_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
         checkError();
     }
     public void test_U8_3_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
         checkError();
     }
     public void test_U8_2_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
         checkError();
     }
     public void test_U8_1_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
         checkError();
     }
 
     public void test_U8_4_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
         checkError();
     }
     public void test_U8_3_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
         checkError();
     }
     public void test_U8_2_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
         checkError();
     }
     public void test_U8_1_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
         checkError();
     }
 
     public void test_U8_4_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_3_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_2_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_1_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
         checkError();
     }
 
     public void test_U8_4_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_3_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_2_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_1_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
         checkError();
     }
 
     public void test_U8_4_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_3_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_2_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_1_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
         checkError();
     }
 
 
     public void test_F32_4_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
         checkError();
     }
     public void test_F32_3_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
         checkError();
     }
     public void test_F32_2_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
         checkError();
     }
     public void test_F32_1_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
         checkError();
     }
 
     public void test_F32_4_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
         checkError();
     }
     public void test_F32_3_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
         checkError();
     }
     public void test_F32_2_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
         checkError();
     }
     public void test_F32_1_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
         checkError();
     }
 
     public void test_F32_4_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_3_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_2_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_1_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
         checkError();
     }
 
     public void test_F32_4_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_3_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_2_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_1_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
         checkError();
     }
 
     public void test_F32_4_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_3_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_2_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_1_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
         checkError();
     }
 
     public void test_F32_4_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
         checkError();
     }
     public void test_F32_3_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
         checkError();
     }
     public void test_F32_2_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
         checkError();
     }
     public void test_F32_1_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
         checkError();
     }
 
     public void test_F32_4_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
         checkError();
     }
     public void test_F32_3_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
         checkError();
     }
     public void test_F32_2_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
         checkError();
     }
     public void test_F32_1_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
         checkError();
     }
 
     public void test_F32_4_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_3_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_2_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_1_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
         checkError();
     }
 
     public void test_F32_4_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_3_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_2_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_1_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
         checkError();
     }
 
     public void test_F32_4_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_3_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_2_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_1_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
         checkError();
     }
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/LaunchClip.java b/tests/tests/renderscript/src/android/renderscript/cts/LaunchClip.java
new file mode 100644
index 0000000..b87b705
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/LaunchClip.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.*;
+
+
+
+public class LaunchClip extends RSBaseCompute {
+    Allocation mAPassFail;
+    Allocation mAin;
+    Allocation mAout;
+    ScriptC_launchclip mScript;
+
+    int[] mIn;
+    int[] mOut;
+    int[] mPassFail;
+
+    int mDimX = 0;
+    int mDimY = 0;
+    int mDimZ = 0;
+    boolean mHasFaces = false;
+    boolean mHasLods = false;
+    int mDimA0 = 0;
+    int mDimA1 = 0;
+    int mDimA2 = 0;
+    int mDimA3 = 0;
+    int mCellCount = 0;
+
+    void setup(boolean makeIn, boolean makeOut, int x, int y, int z, boolean face, boolean lods,
+               int a0, int a1, int a2, int a3) {
+
+        mDimX = x;
+        mDimY = y;
+        mDimZ = z;
+        mHasFaces = face;
+        mHasLods = lods;
+        mDimA0 = a0;
+        mDimA1 = a1;
+        mDimA2 = a2;
+        mDimA3 = a3;
+
+        mScript = new ScriptC_launchclip(mRS);
+        mScript.set_dimX(mDimX);
+        mScript.set_dimY(mDimY);
+        mScript.set_dimZ(mDimZ);
+        mScript.set_hasFaces(mHasFaces);
+        mScript.set_hasLod(mHasLods);
+        mScript.set_dimA0(mDimA0);
+        mScript.set_dimA1(mDimA1);
+        mScript.set_dimA2(mDimA2);
+        mScript.set_dimA3(mDimA3);
+
+        Type.Builder tb = new Type.Builder(mRS, Element.I32(mRS));
+        tb.setX(mDimX);
+        if (mDimY > 0) tb.setY(mDimY);
+        if (mDimZ > 0) tb.setZ(mDimZ);
+        if (mHasFaces) tb.setFaces(true);
+        if (mHasLods) tb.setMipmaps(true);
+        //if (mDimA0 != 0) tb.setArray(0, mDimA0);
+        //if (mDimA1 != 0) tb.setArray(1, mDimA1);
+        //if (mDimA2 != 0) tb.setArray(2, mDimA2);
+        //if (mDimA3 != 0) tb.setArray(3, mDimA3);
+        Type t = tb.create();
+
+        if (makeIn) {
+            mIn = new int[t.getCount()];
+            mAin = Allocation.createTyped(mRS, t);
+            mScript.forEach_zero(mAin);
+        }
+        if (makeOut) {
+            mOut = new int[t.getCount()];
+            mAout = Allocation.createTyped(mRS, t);
+            mScript.forEach_zero(mAout);
+        }
+
+        mPassFail = new int[1];
+        mAPassFail = Allocation.createSized(mRS, Element.U32(mRS), 1);
+        mAPassFail.copyFrom(mPassFail);
+        mScript.set_passfail(mAPassFail);
+    }
+
+    private void verifyCell(int x, int y, int z, int[] a, Script.LaunchOptions sc) {
+        int expected = 0x80000000;
+        boolean inRange = true;
+
+        if (mDimX != 0) {
+            if (x >= sc.getXStart() && x < sc.getXEnd()) {
+                expected |= x;
+            } else {
+                inRange = false;
+            }
+        }
+
+        if (mDimY != 0) {
+            if (y >= sc.getYStart() && y < sc.getYEnd()) {
+                expected |= y << 8;
+            } else {
+                inRange = false;
+            }
+        }
+
+        if (mDimZ != 0) {
+            if (z >= sc.getZStart() && z < sc.getZEnd()) {
+                expected |= z << 16;
+            } else {
+                inRange = false;
+            }
+        }
+
+        if (!inRange) {
+            expected = 0;
+        }
+
+        int val = a[x + y * mDimX + z * mDimX * mDimY];
+        if (val != expected) {
+            String s = new String("verify error @ " + x + ", " + y + ", " + z +
+                                  ", expected " + expected + ", got " + val);
+            ///android.util.Log.e("rs", s);
+            throw new IllegalStateException(s);
+        }
+    }
+
+    void verifyRange(Script.LaunchOptions sc, int[] a) {
+        int itY = (mDimY > 0) ? mDimY : 1;
+        int itZ = (mDimZ > 0) ? mDimZ : 1;
+
+        for (int x = 0; x < mDimX; x++) {
+            for (int y = 0; y < itY; y++) {
+                for (int z = 0; z < itZ; z++) {
+                    verifyCell(x, y, z, a, sc);
+                }
+            }
+        }
+    }
+
+    AllocationAdapter makeAdapter(Allocation base, int ax, int ay, int az, int ox, int oy, int oz) {
+        Type.Builder tb = new Type.Builder(mRS, base.getType().getElement());
+        tb.setX(ax);
+        if (ay > 0) {
+            tb.setY(ay);
+        }
+        if (az > 0) {
+            tb.setZ(az);
+        }
+        Type t = tb.create();
+
+        AllocationAdapter a = AllocationAdapter.createTyped(mRS, base, t);
+        a.setX(ox);
+        if (base.getType().getY() > 0) {
+            a.setY(oy);
+        }
+        if (base.getType().getZ() > 0) {
+            a.setZ(oz);
+        }
+
+        mScript.set_biasX(ox);
+        mScript.set_biasY(oy);
+        mScript.set_biasZ(oz);
+        return a;
+    }
+
+    public void testWrite1D() {
+        setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+
+        mScript.forEach_write1d(mAout, sc);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite1DAdapter1D() {
+        setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+
+        AllocationAdapter a = makeAdapter(mAout, 68, 0, 0,  9, 0, 0);
+        mScript.forEach_write1d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+
+    public void testWrite2D() {
+        setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+        sc.setY(17, 177);
+
+        mScript.forEach_write2d(mAout, sc);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite2DAdapter1D() {
+        setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+        sc.setY(17, 18);
+
+        AllocationAdapter a = makeAdapter(mAout, 68, 0, 0,  9, 17, 0);
+        mScript.forEach_write1d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite2DAdapter2D() {
+        setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+        sc.setY(17, 177);
+
+        AllocationAdapter a = makeAdapter(mAout, 68, 160, 0,  9, 17, 0);
+        mScript.forEach_write2d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite3D() {
+        setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 37);
+        sc.setY(17, 27);
+        sc.setZ(7, 21);
+        mScript.forEach_write3d(mAout, sc);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite3DAdapter1D() {
+        setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 37);
+        sc.setY(17, 18);
+        sc.setZ(7, 8);
+
+        AllocationAdapter a = makeAdapter(mAout, 28, 0, 0,  9, 17, 7);
+        mScript.forEach_write1d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite3DAdapter2D() {
+        setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 37);
+        sc.setY(17, 27);
+        sc.setZ(7, 8);
+
+        AllocationAdapter a = makeAdapter(mAout, 28, 10, 0,  9, 17, 7);
+        mScript.forEach_write2d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite3DAdapter3D() {
+        setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 37);
+        sc.setY(17, 27);
+        sc.setZ(7, 21);
+
+        AllocationAdapter a = makeAdapter(mAout, 28, 10, 14,  9, 17, 7);
+        mScript.forEach_write3d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
index ebf15dc..0175c38 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
@@ -36,8 +36,9 @@
     private int result;
     private boolean msgHandled;
 
-    private static final int RS_MSG_TEST_PASSED = 100;
-    private static final int RS_MSG_TEST_FAILED = 101;
+    protected static final int RS_MSG_TEST_PASSED = 100;
+    protected static final int RS_MSG_TEST_FAILED = 101;
+    protected static final int RS_MSG_TEST_FLUSH = 102;
 
     RSMessageHandler mRsMessage = new RSMessageHandler() {
         public void run() {
@@ -47,6 +48,8 @@
                     case RS_MSG_TEST_FAILED:
                         result = mID;
                         break;
+                    case RS_MSG_TEST_FLUSH:
+                        break;
                     default:
                         fail("Got unexpected RS message");
                         return;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java b/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
index 413b2d4..0ba8248 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
@@ -39,10 +39,6 @@
 
     @Override
     protected void tearDown() throws Exception {
-        if (mRS != null) {
-            mRS.destroy();
-            mRS = null;
-        }
         super.tearDown();
     }
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
index d44c305..f9d62ac 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
@@ -34,6 +34,8 @@
 
 public class ScriptGroupTest extends RSBaseCompute {
 
+    private static final String TAG = "ScriptGroupTest";
+    private static final int ARRAY_SIZE = 256;
     static int bDimX = 48;
     static int bDimY = 8;
 
@@ -309,4 +311,191 @@
 
         checkForErrors();
     }
+
+    /**
+     * Tests that kernel-to-kernel dependency via input/output is handled correctly
+     */
+    public void testBuilder2PointWiseKernelToKernelDependency() {
+        ScriptC_increment s_inc = new ScriptC_increment(mRS);
+        ScriptC_double s_double = new ScriptC_double(mRS);
+        mRS.setMessageHandler(mRsMessage);
+
+        int[] array = new int[ARRAY_SIZE * 4];
+
+        for (int i = 0; i < ARRAY_SIZE * 4; i++) {
+            array[i] = i;
+        }
+
+        Allocation input = Allocation.createSized(mRS, Element.I32_4(mRS), ARRAY_SIZE);
+        input.copyFrom(array);
+
+        ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(mRS);
+
+        ScriptGroup.Input unbound = builder.addInput();
+
+        Type connectType = Type.createX(mRS, Element.I32_4(mRS), ARRAY_SIZE);
+
+        ScriptGroup.Closure c0 =
+                builder.addKernel(s_inc.getKernelID_increment(),
+                                  connectType,
+                                  unbound);
+
+        ScriptGroup.Closure c1 =
+                builder.addKernel(s_double.getKernelID_doubleKernel(),
+                                  connectType,
+                                  c0.getReturn());
+
+        ScriptGroup group = builder.create("IncAndDbl", c1.getReturn());
+
+        int[] a = new int[ARRAY_SIZE * 4];
+        ((Allocation)group.execute(input)[0]).copyTo(a);
+
+        mRS.finish();
+
+        boolean failed = false;
+        for (int i = 0; i < ARRAY_SIZE * 4; i++) {
+            if (a[i] != (i+1) * 2) {
+                Log.e(TAG, "a["+i+"]="+a[i]+", should be "+ ((i+1) * 2));
+                failed = true;
+            }
+        }
+
+        assertTrue(!failed);
+    }
+
+    /**
+     * Tests that kernel-to-kernel dependency via global allocations is handled correctly
+     */
+    public void testBuilder2GatherScatterAcrossKernelsViaGlobals() {
+        ScriptC_reduction s = new ScriptC_reduction(mRS);
+
+        int[] array = new int[ARRAY_SIZE * 4];
+
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            array[i*4] = i * 7;
+            array[i*4 + 1] = i * 7;
+            array[i*4 + 2] = i * 7;
+            array[i*4 + 3] = i * 7;
+        }
+
+        Allocation input = Allocation.createSized(mRS, Element.I32_4(mRS), ARRAY_SIZE);
+        input.copyFrom(array);
+
+        ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(mRS);
+
+        ScriptGroup.Input unbound = builder.addInput();
+
+        ScriptGroup.Closure c = null;
+        ScriptGroup.Future f = null;
+        int stride;
+        for (stride = ARRAY_SIZE / 2; stride >= 1; stride >>= 1) {
+            ScriptGroup.Binding b1 = new ScriptGroup.Binding(s.getFieldID_reduction_stride(),
+                                                             stride);
+            ScriptGroup.Binding b2;
+            if (f == null) {
+                b2 = new ScriptGroup.Binding(s.getFieldID_a_in(), unbound);
+            } else {
+                b2 = new ScriptGroup.Binding(s.getFieldID_a_in(), f);
+            }
+            c = builder.addKernel(s.getKernelID_add(),
+                                  Type.createX(mRS, Element.I32_4(mRS), stride),
+                                  b1, b2);
+            f = c.getReturn();
+        }
+
+        if (c == null) {
+            return;
+        }
+
+        ScriptGroup group = builder.create("Summation", c.getReturn());
+
+        int[] a = new int[4];
+        ((Allocation)group.execute(input)[0]).copyTo(a);
+
+        mRS.finish();
+
+        boolean failed = false;
+        for (int i = 0; i < 4; i++) {
+            if (failed == false && a[i] != ARRAY_SIZE * (ARRAY_SIZE - 1) * 7 / 2) {
+                Log.e(TAG,
+                      "a["+i+"]="+a[i]+", should be "+ (ARRAY_SIZE * (ARRAY_SIZE - 1) * 7 / 2));
+                failed = true;
+            }
+        }
+
+        assertTrue(!failed);
+    }
+
+    /**
+     * Tests that invoke-to-kernel dependency is handled correctly
+     */
+    public void testBuilder2InvokeToKernelDependency() {
+        ScriptC_matrix s = new ScriptC_matrix(mRS);
+
+        float[] array = new float[ARRAY_SIZE * 4];
+
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            array[i * 4] = i * 4 * 7;
+            array[i * 4 + 1] = (i * 4 + 1) * 7;
+            array[i * 4 + 2] = (i * 4 + 2) * 7;
+            array[i * 4 + 3] = (i * 4 + 3) * 7;
+        }
+
+        Allocation input = Allocation.createSized(mRS, Element.F32_4(mRS), ARRAY_SIZE);
+        input.copyFrom(array);
+
+        ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(mRS);
+
+        ScriptGroup.Input unbound = builder.addInput();
+
+        Matrix4f mat = new Matrix4f();
+
+        mat.set(0, 0, 0.0f);
+        mat.set(0, 1, 0.0f);
+        mat.set(0, 2, 0.0f);
+        mat.set(0, 3, 1.0f);
+
+        mat.set(1, 0, 1.0f);
+        mat.set(1, 1, 0.0f);
+        mat.set(1, 2, 0.0f);
+        mat.set(1, 3, 0.0f);
+
+        mat.set(2, 0, 0.0f);
+        mat.set(2, 1, 1.0f);
+        mat.set(2, 2, 0.0f);
+        mat.set(2, 3, 0.0f);
+
+        mat.set(3, 0, 0.0f);
+        mat.set(3, 1, 0.0f);
+        mat.set(3, 2, 1.0f);
+        mat.set(3, 3, 0.0f);
+
+        ScriptGroup.Closure c1 =
+                builder.addInvoke(s.getInvokeID_setMatrix(), mat);
+
+        ScriptGroup.Closure c2 =
+                builder.addKernel(s.getKernelID_multiply(),
+                                  Type.createX(mRS, Element.F32_4(mRS), ARRAY_SIZE),
+                                  unbound);
+
+        ScriptGroup group = builder.create("Multiply", c2.getReturn());
+
+        float[] a = new float[ARRAY_SIZE * 4];
+        ((Allocation)group.execute(input)[0]).copyTo(a);
+
+        mRS.finish();
+
+        boolean failed = false;
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            for (int j = 0; j < 4; j++) {
+                float expected = (i*4+((j+1)%4))*7;
+                if (failed == false && a[i * 4 + j] != expected) {
+                    Log.e(TAG, "a["+i+"]="+a[i]+", should be "+ expected);
+                    failed = true;
+                }
+            }
+        }
+
+        assertTrue(!failed);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.java
new file mode 100644
index 0000000..4a2af00
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.*;
+
+public class TestCtxDim extends RSBaseCompute {
+
+    public void test() {
+        ScriptC_TestCtxDim script = new ScriptC_TestCtxDim(mRS);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        int X = 2;
+        script.set_gDimX(X);
+        typeBuilder.setX(X);
+        int Y = 5;
+        script.set_gDimY(Y);
+        typeBuilder.setY(Y);
+        int Z = 11;
+        script.set_gDimZ(Z);
+        typeBuilder.setZ(Z);
+
+        Allocation A = Allocation.createTyped(mRS, typeBuilder.create());
+
+        script.forEach_check_kernel(A);
+        script.invoke_check_result();
+        mRS.finish();
+        waitForMessage();
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rs
new file mode 100644
index 0000000..a3bbf3e
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rs
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+#include "shared.rsh"
+
+int gDimX, gDimY, gDimZ;
+static bool failed = false;
+
+void __attribute__((kernel)) check_kernel(int32_t in /* dummy */, rs_kernel_context ctxt) {
+    uint32_t dimX = rsGetDimX(ctxt);
+    _RS_ASSERT(gDimX == dimX);
+    uint32_t dimY = rsGetDimY(ctxt);
+    _RS_ASSERT(gDimY == dimY);
+    uint32_t dimZ = rsGetDimZ(ctxt);
+    _RS_ASSERT(gDimZ == dimZ);
+}
+
+void check_result() {
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ThunkerCreateTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ThunkerCreateTest.java
new file mode 100644
index 0000000..735519c
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ThunkerCreateTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import android.content.Context;
+import android.renderscript.RSRuntimeException;
+
+public class ThunkerCreateTest extends RSBase {
+
+    public void testCreateReflection() {
+        int sdkVersion = mCtx.getApplicationInfo().targetSdkVersion;
+
+        try {
+            Class<?> javaRS = Class.forName("android.renderscript.RenderScript");
+            Class[] signature = {Context.class, Integer.TYPE};
+            Object[] args = {mCtx, new Integer(sdkVersion)};
+            Method create = javaRS.getDeclaredMethod("create", signature);
+
+            assertTrue (create.invoke(null, args) != null);
+        }
+        catch (Exception e) {
+            throw new RSRuntimeException("Failure to create platform RenderScript context");
+        }
+
+    }
+}
+
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
index 13d4977..abb532d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
@@ -143,6 +143,14 @@
         assertTrue(t.getY() == 4);
     }
 
+    public void testGetYuv() {
+        Type.Builder b = new Type.Builder(mRS, Element.F32(mRS));
+        b.setX(64).setY(64);
+        b.setYuvFormat(android.graphics.ImageFormat.YV12);
+        Type t = b.create();
+        assertTrue(t.getYuv() == android.graphics.ImageFormat.YV12);
+    }
+
     public void testGetZ() {
         Type.Builder b = new Type.Builder(mRS, Element.F32(mRS));
         b.setX(3).setY(4);
diff --git a/apps/CtsVerifier/lib/colorchecker/vec3.cpp b/tests/tests/renderscript/src/android/renderscript/cts/double.rs
similarity index 73%
copy from apps/CtsVerifier/lib/colorchecker/vec3.cpp
copy to tests/tests/renderscript/src/android/renderscript/cts/double.rs
index ac16620..86ced05 100644
--- a/apps/CtsVerifier/lib/colorchecker/vec3.cpp
+++ b/tests/tests/renderscript/src/android/renderscript/cts/double.rs
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,10 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#define LOG_NDEBUG 0
 
-#define LOG_TAG "Vec3"
-#include <utils/Log.h>
-#include <utils/Timers.h>
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
 
-#include "vec3.h"
+int4 __attribute__((kernel)) doubleKernel(int4 in)
+{
+  return in * 2;
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/lib/colorchecker/vec3.cpp b/tests/tests/renderscript/src/android/renderscript/cts/increment.rs
similarity index 73%
copy from apps/CtsVerifier/lib/colorchecker/vec3.cpp
copy to tests/tests/renderscript/src/android/renderscript/cts/increment.rs
index ac16620..babc567 100644
--- a/apps/CtsVerifier/lib/colorchecker/vec3.cpp
+++ b/tests/tests/renderscript/src/android/renderscript/cts/increment.rs
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,10 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#define LOG_NDEBUG 0
 
-#define LOG_TAG "Vec3"
-#include <utils/Log.h>
-#include <utils/Timers.h>
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
 
-#include "vec3.h"
+int4 __attribute__((kernel)) increment(int4 in)
+{
+  return in + 1;
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_blur.rs b/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_blur.rs
index 88f9ca5..aea9745 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_blur.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_blur.rs
@@ -74,7 +74,7 @@
     float4 blurredPixel = 0;
     int gi = 0;
     for (int r = -radius; r <= radius; r ++) {
-        int validH = rsClamp((int)y + r, (int)0, (int)(height - 1));
+        int validH = clamp((int)y + r, (int)0, (int)(height - 1));
         float4 i = rsGetElementAt_float4(ScratchPixel2, x, validH);
         blurredPixel += i * gaussian[gi++];
     }
@@ -86,11 +86,9 @@
     int gi = 0;
     for (int r = -radius; r <= radius; r ++) {
         // Stepping left and right away from the pixel
-        int validX = rsClamp((int)x + r, (int)0, (int)(width - 1));
+        int validX = clamp((int)x + r, (int)0, (int)(width - 1));
         float4 i = rsGetElementAt_float4(ScratchPixel1, validX, y);
         blurredPixel += i * gaussian[gi++];
     }
     return blurredPixel;
 }
-
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/launchclip.rs b/tests/tests/renderscript/src/android/renderscript/cts/launchclip.rs
new file mode 100644
index 0000000..ca34f4a
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/launchclip.rs
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "shared.rsh"
+
+rs_allocation passfail;
+
+int dimX;
+int dimY;
+int dimZ;
+bool hasFaces;
+bool hasLod;
+int dimA0;
+int dimA1;
+int dimA2;
+int dimA3;
+
+int biasX = 0;
+int biasY = 0;
+int biasZ = 0;
+
+
+int RS_KERNEL zero() {
+    return 0;
+}
+
+int RS_KERNEL write1d(uint32_t x) {
+    return 0x80000000 | (x + biasX) | (biasY << 8) | (biasZ << 16);
+}
+
+int RS_KERNEL write2d(uint32_t x, uint32_t y) {
+    return 0x80000000 | (x + biasX) | ((y + biasY) << 8) | (biasZ << 16);
+}
+
+int RS_KERNEL write3d(uint32_t x, uint32_t y, uint32_t z) {
+    return 0x80000000 | (x + biasX) | ((y + biasY) << 8) | ((z + biasZ) << 16);
+}
+
+
diff --git a/tests/print/src/android/print/cts/IPrivilegedOperations.aidl b/tests/tests/renderscript/src/android/renderscript/cts/matrix.rs
similarity index 66%
copy from tests/print/src/android/print/cts/IPrivilegedOperations.aidl
copy to tests/tests/renderscript/src/android/renderscript/cts/matrix.rs
index 93c8c3e..8ea7c76 100644
--- a/tests/print/src/android/print/cts/IPrivilegedOperations.aidl
+++ b/tests/tests/renderscript/src/android/renderscript/cts/matrix.rs
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,16 @@
  * limitations under the License.
  */
 
-package android.print.cts;
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
 
-interface IPrivilegedOperations {
-    boolean clearApplicationUserData(String packageName);
+rs_matrix4x4 Mat;
+
+void setMatrix(rs_matrix4x4 m) {
+  Mat = m;
+}
+
+float4 __attribute__((kernel)) multiply(float4 in)
+{
+  return rsMatrixMultiply(&Mat, in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/oob.rs b/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
index 11b7cef..d27a8ca 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
@@ -10,6 +10,3 @@
     rsSetElementAt_int(aInt, 1, 1);
 }
 
-void send_msg() {
-    rsSendToClientBlocking(RS_MSG_TEST_PASSED);
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/vec3.cpp b/tests/tests/renderscript/src/android/renderscript/cts/reduction.rs
similarity index 64%
copy from apps/CtsVerifier/lib/colorchecker/vec3.cpp
copy to tests/tests/renderscript/src/android/renderscript/cts/reduction.rs
index ac16620..860e42d 100644
--- a/apps/CtsVerifier/lib/colorchecker/vec3.cpp
+++ b/tests/tests/renderscript/src/android/renderscript/cts/reduction.rs
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,10 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#define LOG_NDEBUG 0
 
-#define LOG_TAG "Vec3"
-#include <utils/Log.h>
-#include <utils/Timers.h>
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
 
-#include "vec3.h"
+rs_allocation a_in;
+int reduction_stride;
+
+int4 __attribute__((kernel)) add(uint x)
+{
+  return rsGetElementAt_int4(a_in, x) + rsGetElementAt_int4(a_in, x + reduction_stride);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/rsAllocationCopyTest.java b/tests/tests/renderscript/src/android/renderscript/cts/rsAllocationCopyTest.java
new file mode 100644
index 0000000..f74fa38
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/rsAllocationCopyTest.java
@@ -0,0 +1,539 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Type;
+import java.util.Random;
+import android.util.Log;
+
+public class rsAllocationCopyTest extends RSBaseCompute {
+
+    public void test_rsAllocationCopy1D_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy1D_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy1D_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy1D_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy1D_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Long failed, output array does not match input",
+                   result);
+    }
+
+
+    public void test_rsAllocationCopy2D_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy2D_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy2D_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy2D_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy2D_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Long failed, output array does not match input",
+                   result);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/rsallocationcopy.rs b/tests/tests/renderscript/src/android/renderscript/cts/rsallocationcopy.rs
new file mode 100644
index 0000000..4d76493
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/rsallocationcopy.rs
@@ -0,0 +1,19 @@
+#include "shared.rsh"
+
+rs_allocation aIn1D;
+rs_allocation aOut1D;
+rs_allocation aIn2D;
+rs_allocation aOut2D;
+
+int xOff = 0;
+int yOff = 0;
+int xCount = 0;
+int yCount = 0;
+
+void test1D() {
+    rsAllocationCopy1DRange(aOut1D, xOff, 0, xCount, aIn1D, xOff, 0);
+}
+
+void test2D() {
+    rsAllocationCopy2DRange(aOut2D, xOff, yOff, 0, 0, xCount, yCount, aIn2D, xOff, yOff, 0, 0);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/shared.rsh b/tests/tests/renderscript/src/android/renderscript/cts/shared.rsh
index b91611d..2ad81fc 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/shared.rsh
+++ b/tests/tests/renderscript/src/android/renderscript/cts/shared.rsh
@@ -3,11 +3,11 @@
 
 static int64_t g_time;
 
-static void start(void) {
+static inline void start(void) {
     g_time = rsUptimeMillis();
 }
 
-static float end(void) {
+static inline float end(void) {
     int64_t t = rsUptimeMillis() - g_time;
     return ((float)t) / 1000.f;
 }
@@ -24,4 +24,3 @@
 /* These constants must match those in UnitTest.java */
 static const int RS_MSG_TEST_PASSED = 100;
 static const int RS_MSG_TEST_FAILED = 101;
-
diff --git a/tests/tests/rscpp/librscpptest/Android.mk b/tests/tests/rscpp/librscpptest/Android.mk
index bc2f81e..65a5e2a 100644
--- a/tests/tests/rscpp/librscpptest/Android.mk
+++ b/tests/tests/rscpp/librscpptest/Android.mk
@@ -21,8 +21,24 @@
 LOCAL_CLANG := true
 LOCAL_MODULE := librscpptest_jni
 LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := rs_jni.cpp rs_jni_allocation.cpp
-LOCAL_SRC_FILES += setelementat.rs
+
+LOCAL_SRC_FILES := \
+    rs_jni.cpp \
+    rs_jni_allocation.cpp \
+    rs_jni_element.cpp \
+    rs_jni_foreach.cpp \
+    rs_jni_script.cpp \
+    rs_jni_type.cpp \
+    rs_jni_object.cpp
+
+LOCAL_SRC_FILES += \
+    setelementat.rs \
+    primitives.rs \
+    instance.rs \
+    clear_object.rs \
+    foreach.rs \
+    fe_all.rs \
+    noroot.rs
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 LOCAL_C_INCLUDES += frameworks/rs/cpp
diff --git a/tests/tests/rscpp/librscpptest/clear_object.rs b/tests/tests/rscpp/librscpptest/clear_object.rs
new file mode 100644
index 0000000..70ba42b
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/clear_object.rs
@@ -0,0 +1,42 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.cts.rscpp)
+
+rs_allocation allocation;
+
+void clear_allocation(int *out)
+{
+    rsClearObject( &allocation );
+    *out = ( NULL == allocation.p ? 1 : 0 );
+}
+
+rs_element element;
+
+void clear_element(int *out)
+{
+    rsClearObject( &element );
+    *out = ( NULL == element.p ? 1 : 0 );
+}
+
+rs_sampler sampler;
+
+void clear_sampler(int *out)
+{
+    rsClearObject( &sampler );
+    *out = ( NULL == sampler.p ? 1 : 0 );
+}
+
+rs_script script;
+
+void clear_script(int *out)
+{
+    rsClearObject( &script );
+    *out = ( NULL == script.p ? 1 : 0 );
+}
+
+rs_type type;
+
+void clear_type(int *out)
+{
+    rsClearObject( &type );
+    *out = ( NULL == type.p ? 1 : 0 );
+}
diff --git a/tests/tests/rscpp/librscpptest/fe_all.rs b/tests/tests/rscpp/librscpptest/fe_all.rs
new file mode 100644
index 0000000..dc20ba7
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/fe_all.rs
@@ -0,0 +1,163 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.cts.rscpp)
+
+void test_i8(const char *ain, uchar *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
+
+void test_i8_2(const char2 *ain, uchar2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
+
+void test_i8_3(const char3 *ain, uchar3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
+
+void test_i8_4(const char4 *ain, uchar4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
+
+void test_i16(const short *ain, ushort *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
+
+void test_i16_2(const short2 *ain, ushort2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
+
+void test_i16_3(const short3 *ain, ushort3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
+
+void test_i16_4(const short4 *ain, ushort4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
+
+void test_i32(const int *ain, uint *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
+
+void test_i32_2(const int2 *ain, uint2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
+
+void test_i32_3(const int3 *ain, uint3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
+
+void test_i32_4(const int4 *ain, uint4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
+
+void test_i64(const long *ain, ulong *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
+
+void test_i64_2(const long2 *ain, ulong2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
+
+void test_i64_3(const long3 *ain, ulong3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
+
+void test_i64_4(const long4 *ain, ulong4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
+
+void test_f32(const float *ain, float *aout) {
+    aout[0] = ain[0] + 1.0f;
+    return;
+}
+
+void test_f32_2(const float2 *ain, float2 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    return;
+}
+
+void test_f32_3(const float3 *ain, float3 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    aout[0].z = ain[0].z + 1.0f;
+    return;
+}
+
+void test_f32_4(const float4 *ain, float4 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    aout[0].z = ain[0].z + 1.0f;
+    aout[0].w = ain[0].w + 1.0f;
+    return;
+}
+
+void test_f64(const double *ain, double *aout) {
+    aout[0] = ain[0] + 1.0;
+    return;
+}
+
+void test_f64_2(const double2 *ain, double2 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    return;
+}
+
+void test_f64_3(const double3 *ain, double3 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    aout[0].z = ain[0].z + 1.0;
+    return;
+}
+
+void test_f64_4(const double4 *ain, double4 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    aout[0].z = ain[0].z + 1.0;
+    aout[0].w = ain[0].w + 1.0;
+    return;
+}
+
+void test_bool(const bool *ain, bool *aout) {
+    aout[0] = !ain[0];
+    return;
+}
diff --git a/tests/tests/rscpp/librscpptest/foreach.rs b/tests/tests/rscpp/librscpptest/foreach.rs
new file mode 100644
index 0000000..08e6bed
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/foreach.rs
@@ -0,0 +1,76 @@
+#include "shared.rsh"
+
+rs_allocation aRaw;
+int dimX;
+int dimY;
+static bool failed = false;
+
+void root(int *out, uint32_t x, uint32_t y) {
+    *out = x + y * dimX;
+}
+
+void foo(const int *in, int *out, uint32_t x, uint32_t y) {
+    _RS_ASSERT(*in == (x + y * dimX));
+    *out = 99 + x + y * dimX;
+    _RS_ASSERT(*out == (99 + x + y * dimX));
+}
+
+static bool test_root_output() {
+    bool failed = false;
+    int i, j;
+
+    for (j = 0; j < dimY; j++) {
+        for (i = 0; i < dimX; i++) {
+            int v = rsGetElementAt_int(aRaw, i, j);
+            _RS_ASSERT(v == (i + j * dimX));
+        }
+    }
+
+    if (failed) {
+        rsDebug("test_root_output FAILED", 0);
+    }
+    else {
+        rsDebug("test_root_output PASSED", 0);
+    }
+
+    return failed;
+}
+
+static bool test_foo_output() {
+    bool failed = false;
+    int i, j;
+
+    for (j = 0; j < dimY; j++) {
+        for (i = 0; i < dimX; i++) {
+            int v = rsGetElementAt_int(aRaw, i, j);
+            _RS_ASSERT(v == (99 + i + j * dimX));
+        }
+    }
+
+    if (failed) {
+        rsDebug("test_foo_output FAILED", 0);
+    }
+    else {
+        rsDebug("test_foo_output PASSED", 0);
+    }
+
+    return failed;
+}
+
+void verify_root() {
+    failed |= test_root_output();
+}
+
+void verify_foo() {
+    failed |= test_foo_output();
+}
+
+void foreach_test() {
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
+
diff --git a/tests/tests/rscpp/librscpptest/instance.rs b/tests/tests/rscpp/librscpptest/instance.rs
new file mode 100644
index 0000000..097098a
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/instance.rs
@@ -0,0 +1,10 @@
+#include "shared.rsh"
+
+int i;
+rs_allocation ai;
+
+void instance_test() {
+    // Set our allocation based on the global input value.
+    rsSetElementAt(ai, &i, 0);
+}
+
diff --git a/tests/tests/rscpp/librscpptest/noroot.rs b/tests/tests/rscpp/librscpptest/noroot.rs
new file mode 100644
index 0000000..f69effc
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/noroot.rs
@@ -0,0 +1,46 @@
+#include "shared.rsh"
+
+int *a;
+rs_allocation aRaw;
+int dimX;
+int dimY;
+static bool failed = false;
+
+void foo(const int *in, int *out, uint32_t x, uint32_t y) {
+    *out = 99 + x + y * dimX;
+}
+
+static bool test_foo_output() {
+    bool failed = false;
+    int i, j;
+
+    for (j = 0; j < dimY; j++) {
+        for (i = 0; i < dimX; i++) {
+            int v = rsGetElementAt_int(aRaw, i, j);
+            _RS_ASSERT(v == (99 + i + j * dimX));
+        }
+    }
+
+    if (failed) {
+        rsDebug("test_foo_output FAILED", 0);
+    }
+    else {
+        rsDebug("test_foo_output PASSED", 0);
+    }
+
+    return failed;
+}
+
+void verify_foo() {
+    failed |= test_foo_output();
+}
+
+void noroot_test() {
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
+
diff --git a/tests/tests/rscpp/librscpptest/primitives.rs b/tests/tests/rscpp/librscpptest/primitives.rs
new file mode 100644
index 0000000..8682331
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/primitives.rs
@@ -0,0 +1,53 @@
+#include "shared.rsh"
+
+// Testing primitive types
+float floatTest = 1.99f;
+double doubleTest = 2.05;
+char charTest = -8;
+short shortTest = -16;
+int intTest = -32;
+long longTest = 17179869184l; // 1 << 34
+long long longlongTest = 68719476736l; // 1 << 36
+bool boolTest = false;
+
+rs_allocation allocationTest;
+int *intPtrTest;
+
+uchar ucharTest = 8;
+ushort ushortTest = 16;
+uint uintTest = 32;
+ulong ulongTest = 4611686018427387904L;
+int64_t int64_tTest = -17179869184l; // - 1 << 34
+uint64_t uint64_tTest = 117179869184l;
+
+void test_primitive_types() {
+    bool failed = false;
+    start();
+
+    _RS_ASSERT(floatTest == 2.99f);
+    _RS_ASSERT(doubleTest == 3.05);
+    _RS_ASSERT(charTest == -16);
+    _RS_ASSERT(shortTest == -32);
+    _RS_ASSERT(intTest == -64);
+    _RS_ASSERT(longTest == 17179869185l);
+    _RS_ASSERT(longlongTest == 68719476735l);
+
+    _RS_ASSERT(ucharTest == 8);
+    _RS_ASSERT(ushortTest == 16);
+    _RS_ASSERT(uintTest == 32);
+    _RS_ASSERT(ulongTest == 4611686018427387903L);
+    _RS_ASSERT(int64_tTest == -17179869184l);
+    _RS_ASSERT(uint64_tTest == 117179869185l);
+
+    float time = end();
+
+    if (failed) {
+        rsDebug("test_primitive_types FAILED", time);
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsDebug("test_primitive_types PASSED", time);
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+
+}
diff --git a/tests/tests/rscpp/librscpptest/rs_jni.cpp b/tests/tests/rscpp/librscpptest/rs_jni.cpp
index f5946f5..b362c99 100644
--- a/tests/tests/rscpp/librscpptest/rs_jni.cpp
+++ b/tests/tests/rscpp/librscpptest/rs_jni.cpp
@@ -51,6 +51,18 @@
     }
 }
 
+sp<const Element> makeElement(sp<RS> rs, RsDataType dt, int vecSize) {
+    if (vecSize > 1) {
+        return Element::createVector(rs, dt, vecSize);
+    } else {
+        if (dt == RS_TYPE_UNSIGNED_8) {
+            return Element::U8(rs);
+        } else {
+            return Element::F32(rs);
+        }
+    }
+}
+
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSInitTest_initTest(JNIEnv * env,
                                                                                  jclass obj,
                                                                                  jstring pathObj)
@@ -371,4 +383,114 @@
 
 }
 
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSResizeTest_resizeTest(JNIEnv * env,
+                                                                                     jclass obj,
+                                                                                     jstring pathObj,
+                                                                                     jint X,
+                                                                                     jint Y,
+                                                                                     jfloat scaleX,
+                                                                                     jfloat scaleY,
+                                                                                     jboolean useByte,
+                                                                                     jint vecSize,
+                                                                                     jbyteArray inputByteArray,
+                                                                                     jbyteArray outputByteArray,
+                                                                                     jfloatArray inputFloatArray,
+                                                                                     jfloatArray outputFloatArray
+                                                                                     )
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+
+    sp<RS> rs = new RS();
+    rs->init(path);
+
+    RsDataType dt = RS_TYPE_UNSIGNED_8;
+    if (!useByte) {
+        dt = RS_TYPE_FLOAT_32;
+    }
+    sp<const Element> e = makeElement(rs, dt, vecSize);
+    sp<Allocation> inputAlloc = Allocation::createSized2D(rs, e, X, Y);
+
+    int outX = (int) (X * scaleX);
+    int outY = (int) (Y * scaleY);
+    sp<Allocation> outputAlloc = Allocation::createSized2D(rs, e, outX, outY);
+    sp<ScriptIntrinsicResize> resize = ScriptIntrinsicResize::create(rs);
+
+    if (useByte) {
+        jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+        inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+        env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    } else {
+        jfloat * input = (jfloat *) env->GetPrimitiveArrayCritical(inputFloatArray, 0);
+        inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+        env->ReleasePrimitiveArrayCritical(inputFloatArray, input, 0);
+    }
+
+    resize->setInput(inputAlloc);
+    resize->forEach_bicubic(outputAlloc);
+
+    if (useByte) {
+        jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+        outputAlloc->copy2DRangeTo(0, 0, outX, outY, output);
+        env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    } else {
+        jfloat * output = (jfloat *) env->GetPrimitiveArrayCritical(outputFloatArray, 0);
+        outputAlloc->copy2DRangeTo(0, 0, outX, outY, output);
+        env->ReleasePrimitiveArrayCritical(outputFloatArray, output, 0);
+    }
+
+    env->ReleaseStringUTFChars(pathObj, path);
+    return (rs->getError() == RS_SUCCESS);
+
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSYuvTest_yuvTest(JNIEnv * env,
+                                                                               jclass obj,
+                                                                               jstring pathObj,
+                                                                               jint X,
+                                                                               jint Y,
+                                                                               jbyteArray inputByteArray,
+                                                                               jbyteArray outputByteArray,
+                                                                               jint yuvFormat
+                                                                               )
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+    jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+
+    RSYuvFormat mYuvFormat = (RSYuvFormat)yuvFormat;
+    sp<ScriptIntrinsicYuvToRGB> syuv = ScriptIntrinsicYuvToRGB::create(mRS, Element::U8_4(mRS));;
+    sp<Allocation> inputAlloc = nullptr;
+
+    if (mYuvFormat != RS_YUV_NONE) {
+        //syuv = ScriptIntrinsicYuvToRGB::create(mRS, Element::YUV(mRS));
+        Type::Builder tb(mRS, Element::YUV(mRS));
+        tb.setX(X);
+        tb.setY(Y);
+        tb.setYuvFormat(mYuvFormat);
+        inputAlloc = Allocation::createTyped(mRS, tb.create());
+        inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+    } else {
+        //syuv = ScriptIntrinsicYuvToRGB::create(mRS, Element::U8(mRS));
+        size_t arrLen = X * Y + ((X + 1) / 2) * ((Y + 1) / 2) * 2;
+        inputAlloc = Allocation::createSized(mRS, Element::U8(mRS), arrLen);
+        inputAlloc->copy1DRangeFrom(0, arrLen, input);
+    }
+
+    sp<const Type> tout = Type::create(mRS, Element::RGBA_8888(mRS), X, Y, 0);
+    sp<Allocation> outputAlloc = Allocation::createTyped(mRS, tout);
+
+    syuv->setInput(inputAlloc);
+    syuv->forEach(outputAlloc);
+
+    outputAlloc->copy2DRangeTo(0, 0, X, Y, output);
+
+    env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    env->ReleaseStringUTFChars(pathObj, path);
+    return (mRS->getError() == RS_SUCCESS);
+
+}
 
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp b/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
index 4157026..4b8b8a8 100644
--- a/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
+++ b/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
@@ -31,8 +31,8 @@
 
 using namespace android::RSC;
 
-static void createTypedHelper (sp<RS> mRS, sp<const Element> e) {
-    Type::Builder typeBuilder(mRS, e);
+static void createTypedHelper (sp<RS> rs, sp<const Element> e) {
+    Type::Builder typeBuilder(rs, e);
     for (int mips = 0; mips <= 1; mips ++) {
         bool useMips = (mips == 1);
 
@@ -45,7 +45,7 @@
                     typeBuilder.setFaces(useFaces);
                     typeBuilder.setX(x);
                     typeBuilder.setY(y);
-                    Allocation::createTyped(mRS, typeBuilder.create());
+                    Allocation::createTyped(rs, typeBuilder.create());
                 }
             }
         }
@@ -58,236 +58,147 @@
                                                                                         jstring pathObj)
 {
     const char * path = env->GetStringUTFChars(pathObj, NULL);
-    sp<RS> mRS = new RS();
-    mRS->init(path);
+    sp<RS> rs = new RS();
+    rs->init(path);
     env->ReleaseStringUTFChars(pathObj, path);
 
-    createTypedHelper(mRS, Element::A_8(mRS));
-    createTypedHelper(mRS, Element::RGBA_4444(mRS));
-    createTypedHelper(mRS, Element::RGBA_5551(mRS));
-    createTypedHelper(mRS, Element::RGB_565(mRS));
-    createTypedHelper(mRS, Element::RGB_888(mRS));
-    createTypedHelper(mRS, Element::RGBA_8888(mRS));
-    createTypedHelper(mRS, Element::F32(mRS));
-    createTypedHelper(mRS, Element::F32_2(mRS));
-    createTypedHelper(mRS, Element::F32_3(mRS));
-    createTypedHelper(mRS, Element::F32_4(mRS));
-    createTypedHelper(mRS, Element::F64(mRS));
-    createTypedHelper(mRS, Element::F64_2(mRS));
-    createTypedHelper(mRS, Element::F64_3(mRS));
-    createTypedHelper(mRS, Element::F64_4(mRS));
-    createTypedHelper(mRS, Element::I8(mRS));
-    createTypedHelper(mRS, Element::I8_2(mRS));
-    createTypedHelper(mRS, Element::I8_3(mRS));
-    createTypedHelper(mRS, Element::I8_4(mRS));
-    createTypedHelper(mRS, Element::I16(mRS));
-    createTypedHelper(mRS, Element::I16_2(mRS));
-    createTypedHelper(mRS, Element::I16_3(mRS));
-    createTypedHelper(mRS, Element::I16_4(mRS));
-    createTypedHelper(mRS, Element::I32(mRS));
-    createTypedHelper(mRS, Element::I32_2(mRS));
-    createTypedHelper(mRS, Element::I32_3(mRS));
-    createTypedHelper(mRS, Element::I32_4(mRS));
-    createTypedHelper(mRS, Element::I64(mRS));
-    createTypedHelper(mRS, Element::I64_2(mRS));
-    createTypedHelper(mRS, Element::I64_3(mRS));
-    createTypedHelper(mRS, Element::I64_4(mRS));
-    createTypedHelper(mRS, Element::U8(mRS));
-    createTypedHelper(mRS, Element::U8_2(mRS));
-    createTypedHelper(mRS, Element::U8_3(mRS));
-    createTypedHelper(mRS, Element::U8_4(mRS));
-    createTypedHelper(mRS, Element::U16(mRS));
-    createTypedHelper(mRS, Element::U16_2(mRS));
-    createTypedHelper(mRS, Element::U16_3(mRS));
-    createTypedHelper(mRS, Element::U16_4(mRS));
-    createTypedHelper(mRS, Element::U32(mRS));
-    createTypedHelper(mRS, Element::U32_2(mRS));
-    createTypedHelper(mRS, Element::U32_3(mRS));
-    createTypedHelper(mRS, Element::U32_4(mRS));
-    createTypedHelper(mRS, Element::U64(mRS));
-    createTypedHelper(mRS, Element::U64_2(mRS));
-    createTypedHelper(mRS, Element::U64_3(mRS));
-    createTypedHelper(mRS, Element::U64_4(mRS));
-    createTypedHelper(mRS, Element::MATRIX_2X2(mRS));
-    createTypedHelper(mRS, Element::MATRIX_3X3(mRS));
-    createTypedHelper(mRS, Element::MATRIX_4X4(mRS));
-    createTypedHelper(mRS, Element::SAMPLER(mRS));
-    createTypedHelper(mRS, Element::SCRIPT(mRS));
-    createTypedHelper(mRS, Element::TYPE(mRS));
-    createTypedHelper(mRS, Element::BOOLEAN(mRS));
-    createTypedHelper(mRS, Element::ELEMENT(mRS));
-    createTypedHelper(mRS, Element::ALLOCATION(mRS));
+    createTypedHelper(rs, Element::A_8(rs));
+    createTypedHelper(rs, Element::RGBA_4444(rs));
+    createTypedHelper(rs, Element::RGBA_5551(rs));
+    createTypedHelper(rs, Element::RGB_565(rs));
+    createTypedHelper(rs, Element::RGB_888(rs));
+    createTypedHelper(rs, Element::RGBA_8888(rs));
+    createTypedHelper(rs, Element::F32(rs));
+    createTypedHelper(rs, Element::F32_2(rs));
+    createTypedHelper(rs, Element::F32_3(rs));
+    createTypedHelper(rs, Element::F32_4(rs));
+    createTypedHelper(rs, Element::F64(rs));
+    createTypedHelper(rs, Element::F64_2(rs));
+    createTypedHelper(rs, Element::F64_3(rs));
+    createTypedHelper(rs, Element::F64_4(rs));
+    createTypedHelper(rs, Element::I8(rs));
+    createTypedHelper(rs, Element::I8_2(rs));
+    createTypedHelper(rs, Element::I8_3(rs));
+    createTypedHelper(rs, Element::I8_4(rs));
+    createTypedHelper(rs, Element::I16(rs));
+    createTypedHelper(rs, Element::I16_2(rs));
+    createTypedHelper(rs, Element::I16_3(rs));
+    createTypedHelper(rs, Element::I16_4(rs));
+    createTypedHelper(rs, Element::I32(rs));
+    createTypedHelper(rs, Element::I32_2(rs));
+    createTypedHelper(rs, Element::I32_3(rs));
+    createTypedHelper(rs, Element::I32_4(rs));
+    createTypedHelper(rs, Element::I64(rs));
+    createTypedHelper(rs, Element::I64_2(rs));
+    createTypedHelper(rs, Element::I64_3(rs));
+    createTypedHelper(rs, Element::I64_4(rs));
+    createTypedHelper(rs, Element::U8(rs));
+    createTypedHelper(rs, Element::U8_2(rs));
+    createTypedHelper(rs, Element::U8_3(rs));
+    createTypedHelper(rs, Element::U8_4(rs));
+    createTypedHelper(rs, Element::U16(rs));
+    createTypedHelper(rs, Element::U16_2(rs));
+    createTypedHelper(rs, Element::U16_3(rs));
+    createTypedHelper(rs, Element::U16_4(rs));
+    createTypedHelper(rs, Element::U32(rs));
+    createTypedHelper(rs, Element::U32_2(rs));
+    createTypedHelper(rs, Element::U32_3(rs));
+    createTypedHelper(rs, Element::U32_4(rs));
+    createTypedHelper(rs, Element::U64(rs));
+    createTypedHelper(rs, Element::U64_2(rs));
+    createTypedHelper(rs, Element::U64_3(rs));
+    createTypedHelper(rs, Element::U64_4(rs));
+    createTypedHelper(rs, Element::MATRIX_2X2(rs));
+    createTypedHelper(rs, Element::MATRIX_3X3(rs));
+    createTypedHelper(rs, Element::MATRIX_4X4(rs));
+    createTypedHelper(rs, Element::SAMPLER(rs));
+    createTypedHelper(rs, Element::SCRIPT(rs));
+    createTypedHelper(rs, Element::TYPE(rs));
+    createTypedHelper(rs, Element::BOOLEAN(rs));
+    createTypedHelper(rs, Element::ELEMENT(rs));
+    createTypedHelper(rs, Element::ALLOCATION(rs));
 
-    mRS->finish();
+    rs->finish();
     return true;
 }
 
-static bool helperFloatCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
+static sp<const Element> makeElement(sp<RS> rs, RsDataType dt, int vecSize) {
+    if (vecSize > 1) {
+        return Element::createVector(rs, dt, vecSize);
+    } else {
+        return Element::createUser(rs, dt);
+    }
+}
+
+/**
+ * Test copyTo and copyFrom for all or part of a 1D Allocation.
+ *
+ * @param rs RS Context.
+ * @param cellCount Total number of elements in this Allocation.
+ * @param offset Offset of this Allocation for copy.
+ * @param count Number of elements need to copy.
+ * @param copyRange Copy the entire allocation or part of it (using different API).
+ * @param dt DataType intended to test.
+ * @param autoPadding Enable autoPadding or not. 
+*/
+template <class T>
+static bool helperCopy1D(sp<RS> rs, int cellCount, int offset, int count, bool copyRange,
+                         RsDataType dt, bool autoPadding = false) {
     bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::F32(mRS), nElems);
+    int arrLen = cellCount;
+    int copyCount = count;
+    int iOffset = offset;
+    sp<Allocation> alloc = nullptr;
+
+    if (autoPadding) {
+        arrLen = cellCount * 3;
+        copyCount = count * 3;
+        iOffset = offset * 3;
+        alloc = Allocation::createSized(rs, makeElement(rs, dt, 3), cellCount);
+        alloc->setAutoPadding(autoPadding);
+    } else {
+        alloc = Allocation::createSized(rs, makeElement(rs, dt, 1), cellCount);
+    }
+
+    T* src = new T[arrLen];
+    T* dst = new T[arrLen];
+
+    for (int i = 0; i < copyCount; i++) {
+        src[i] = (T)rand();
+        dst[iOffset + i] = (T)(-1);
+    }
+
+    if (!copyRange) {
+        alloc->copy1DFrom(src);
+    } else {
+        alloc->copy1DRangeFrom(offset, count, src);
+    }
+    alloc->copy1DTo(dst);
+
+    for (int i = 0; i < copyCount; i++) {
+        if (dst[iOffset + i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
+//Corresponding 1D allocation to allocation copy.
+static bool helperFloatAllocationCopy1D(sp<RS> rs, int cellCount, int offset, int count) {
+
+    bool passed = true;
+    sp<Allocation> srcA = Allocation::createSized(rs, Element::F32(rs), cellCount);
+    sp<Allocation> dstA = Allocation::createSized(rs, Element::F32(rs), cellCount);
 
     float *src, *dst;
-    src = new float[nElems];
-    dst = new float[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (float)i;
-        dst[offset + i] = -1.0f;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperCharCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
-    bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::I8(mRS), nElems);
-
-    char *src, *dst;
-    src = new char[nElems];
-    dst = new char[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (char)i;
-        dst[offset + i] = -1;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperShortCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
-    bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::I16(mRS), nElems);
-
-    short *src, *dst;
-    src = new short[nElems];
-    dst = new short[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (short)i;
-        dst[offset + i] = -1;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperIntCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
-    bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::I32(mRS), nElems);
-
-    int *src, *dst;
-    src = new int[nElems];
-    dst = new int[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (int)i;
-        dst[offset + i] = -1;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperDoubleCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
-    bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::F64(mRS), nElems);
-
-    double *src, *dst;
-    src = new double[nElems];
-    dst = new double[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (double)i;
-        dst[offset + i] = -1;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperFloatAllocationCopy(sp<RS> mRS, int nElems, int offset, int count) {
-
-    bool passed = true;
-    sp<Allocation> srcA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
-    sp<Allocation> dstA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
-
-    float *src, *dst;
-    src = new float[nElems];
-    dst = new float[nElems];
-    for (int i = 0; i < nElems; i++) {
-        src[i] = (float)i;
+    src = new float[cellCount];
+    dst = new float[cellCount];
+    for (int i = 0; i < cellCount; i++) {
+        src[i] = (float)rand();
         dst[i] = -1.0f;
     }
 
@@ -309,6 +220,205 @@
     return passed;
 }
 
+/**
+ * Test copyTo and copyFrom for all or part of a 2D Allocation.
+ *
+ * @param rs RS Context.
+ * @param xElems Number of elements in X dimension in this Allocation.
+ * @param yElems Number of elements in Y dimension in this Allocation.
+ * @param xOffset Offset in X dimension of this Allocation for copy.
+ * @param yOffset Offset in Y dimension of this Allocation for copy.
+ * @param xCount Number of elements in X dimension need to copy.
+ * @param yCount Number of elements in Y dimension need to copy.
+ * @param dt DataType intended to test.
+ * @param autoPadding Enable autoPadding or not. 
+*/
+template <class T>
+static bool helperCopy2D(sp<RS> rs, int xElems, int yElems,
+                         int xOffset, int yOffset, int xCount, int yCount,
+                         RsDataType dt, bool autoPadding = false) {
+    bool passed = true;
+    int arrLen = xElems * yElems;
+    int copyCount = xCount * yCount;
+    sp<Allocation> alloc = nullptr;
+
+    if (autoPadding) {
+        arrLen = arrLen * 3;
+        copyCount = copyCount * 3;
+        alloc = Allocation::createSized2D(rs, makeElement(rs, dt, 3), xElems, yElems);
+        alloc->setAutoPadding(autoPadding);
+    } else {
+        alloc = Allocation::createSized2D(rs, makeElement(rs, dt, 1), xElems, yElems);
+    }
+
+    T* src = new T[arrLen];
+    T* dst = new T[arrLen];
+
+    for (int i = 0; i < copyCount; i++) {
+        src[i] = (T)rand();
+        dst[i] = (T)(-1);
+    }
+
+    alloc->copy2DRangeFrom(xOffset, yOffset, xCount, yCount, src);
+    alloc->copy2DRangeTo(xOffset, yOffset, xCount, yCount, dst);
+
+    for (int i = 0; i < copyCount; i++) {
+        if (dst[i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
+//Corresponding 2D allocation to allocation copy.
+static bool helperFloatAllocationCopy2D(sp<RS> rs, int xElems, int yElems,
+                                        int xOffset, int yOffset, int xCount, int yCount) {
+
+    bool passed = true;
+    sp<Allocation> srcA = Allocation::createSized2D(rs, Element::F32(rs), xElems, yElems);
+    sp<Allocation> dstA = Allocation::createSized2D(rs, Element::F32(rs), xElems, yElems);
+
+    float *src, *dst;
+    src = new float[xElems * yElems];
+    dst = new float[xElems * yElems];
+    for (int i = 0; i < xCount * yCount; i++) {
+        src[i] = (float)rand();
+        dst[i] = -1.0f;
+    }
+
+    // First populate the source allocation
+    srcA->copy2DRangeFrom(xOffset, yOffset, xCount, yCount, src);
+    // Now test allocation to allocation copy
+    dstA->copy2DRangeFrom(xOffset, yOffset, xCount, yCount, srcA, xOffset, yOffset);
+    dstA->copy2DRangeTo(xOffset, yOffset, xCount, yCount, dst);
+
+    for (int i = 0; i < xCount * yCount; i++) {
+        if (dst[i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
+/**
+ * Test copyTo and copyFrom for all or part of a 2D Allocation.
+ *
+ * @param rs RS Context.
+ * @param xElems Number of elements in X dimension in this Allocation.
+ * @param yElems Number of elements in Y dimension in this Allocation.
+ * @param zElems Number of elements in Z dimension in this Allocation.
+ * @param xOffset Offset in X dimension of this Allocation for copy.
+ * @param yOffset Offset in Y dimension of this Allocation for copy.
+ * @param zOffset Offset in Z dimension of this Allocation for copy.
+ * @param xCount Number of elements in X dimension need to copy.
+ * @param yCount Number of elements in Y dimension need to copy.
+ * @param zCount Number of elements in Z dimension need to copy.
+ * @param dt DataType intended to test.
+ * @param autoPadding Enable autoPadding or not. 
+*/
+template <class T>
+static bool helperCopy3D(sp<RS> rs, int xElems, int yElems, int zElems,
+                         int xOffset, int yOffset, int zOffset,
+                         int xCount, int yCount, int zCount,
+                         RsDataType dt, bool autoPadding = false) {
+    bool passed = true;
+    int arrLen = xElems * yElems * zElems;
+    int copyCount = xCount * yCount * zCount;
+    sp<Allocation> alloc = nullptr;
+
+    if (autoPadding) {
+        arrLen = arrLen * 3;
+        copyCount = copyCount * 3;
+
+        Type::Builder typeBuilder(rs, makeElement(rs, dt, 3));
+        typeBuilder.setX(xElems);
+        typeBuilder.setY(yElems);
+        typeBuilder.setZ(zElems);
+
+        alloc = Allocation::createTyped(rs, typeBuilder.create());
+        alloc->setAutoPadding(autoPadding);
+    } else {
+        Type::Builder typeBuilder(rs, makeElement(rs, dt, 1));
+        typeBuilder.setX(xElems);
+        typeBuilder.setY(yElems);
+        typeBuilder.setZ(zElems);
+
+        alloc = Allocation::createTyped(rs, typeBuilder.create());
+    }
+
+    T* src = new T[arrLen];
+    T* dst = new T[arrLen];
+
+    for (int i = 0; i < copyCount; i++) {
+        src[i] = (T)rand();
+        dst[i] = (T)(-1);
+    }
+
+    alloc->copy3DRangeFrom(xOffset, yOffset, zOffset, xCount, yCount, zCount, src);
+    alloc->copy3DRangeTo(xOffset, yOffset, zOffset, xCount, yCount, zCount, dst);
+
+    for (int i = 0; i < copyCount; i++) {
+        if (dst[i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
+//Corresponding 3D allocation to allocation copy.
+static bool helperFloatAllocationCopy3D(sp<RS> rs, int xElems, int yElems, int zElems,
+                                        int xOffset, int yOffset, int zOffset,
+                                        int xCount, int yCount, int zCount) {
+
+    bool passed = true;
+    Type::Builder typeBuilder(rs, Element::F32(rs));
+
+    typeBuilder.setX(xElems);
+    typeBuilder.setY(yElems);
+    typeBuilder.setZ(zElems);
+
+    sp<Allocation> srcA = Allocation::createTyped(rs, typeBuilder.create());
+    sp<Allocation> dstA = Allocation::createTyped(rs, typeBuilder.create());
+
+    float *src, *dst;
+    src = new float[xElems * yElems * zElems];
+    dst = new float[xElems * yElems * zElems];
+    for (int i = 0; i < xCount * yCount * zCount; i++) {
+        src[i] = (float)rand();
+        dst[i] = -1.0f;
+    }
+
+    // First populate the source allocation
+    srcA->copy3DRangeFrom(xOffset, yOffset, zOffset, xCount, yCount, zCount, src);
+    // Now test allocation to allocation copy
+    dstA->copy3DRangeFrom(xOffset, yOffset, zOffset, xCount, yCount, zCount,
+                          srcA, xOffset, yOffset, zOffset);
+    dstA->copy3DRangeTo(xOffset, yOffset, zOffset, xCount, yCount, zCount, dst);
+
+    for (int i = 0; i < xCount * yCount * zCount; i++) {
+        if (dst[i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
 static int elemsToTest = 20;
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test1DCopy(JNIEnv * env,
@@ -316,37 +426,180 @@
                                                                                          jstring pathObj)
 {
     const char * path = env->GetStringUTFChars(pathObj, NULL);
-    sp<RS> mRS = new RS();
-    mRS->init(path);
+    sp<RS> rs = new RS();
+    rs->init(path);
     env->ReleaseStringUTFChars(pathObj, path);
     bool passed = true;
 
     for (int s = 8; s <= elemsToTest; s += 2) {
-        for (int mode = 0; mode < 1; mode ++) {
-            passed &= helperFloatCopy(mRS, s, 0, s, mode);
-            passed &= helperCharCopy(mRS, s, 0, s, mode);
-            passed &= helperShortCopy(mRS, s, 0, s, mode);
-            passed &= helperIntCopy(mRS, s, 0, s, mode);
-            //helperBaseObjCopy(mRS, s, 0, s, mode);
-        }
+        passed &= helperCopy1D<float>(rs, s, 0, s, false, RS_TYPE_FLOAT_32);
+        passed &= helperCopy1D<char>(rs, s, 0, s, false, RS_TYPE_SIGNED_8);
+        passed &= helperCopy1D<short>(rs, s, 0, s, false, RS_TYPE_SIGNED_16);
+        passed &= helperCopy1D<int>(rs, s, 0, s, false, RS_TYPE_SIGNED_32);
+        passed &= helperCopy1D<double>(rs, s, 0, s, false, RS_TYPE_FLOAT_64);
 
         // now test copy range
-        for (int mode = 1; mode < 2; mode ++) {
-            for (int off = 0; off < s; off ++) {
-                for (int count = 1; count <= s - off; count ++) {
-                    passed &= helperFloatCopy(mRS, s, off, count, mode);
-                    passed &= helperCharCopy(mRS, s, off, count, mode);
-                    passed &= helperShortCopy(mRS, s, off, count, mode);
-                    passed &= helperIntCopy(mRS, s, off, count, mode);
-                    //helperBaseObjCopy(mRS, s, off, count, mode);
-                }
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy1D<float>(rs, s, off, count, true, RS_TYPE_FLOAT_32);
+                passed &= helperCopy1D<char>(rs, s, off, count, true, RS_TYPE_SIGNED_8);
+                passed &= helperCopy1D<short>(rs, s, off, count, true, RS_TYPE_SIGNED_16);
+                passed &= helperCopy1D<int>(rs, s, off, count, true, RS_TYPE_SIGNED_32);
+                passed &= helperCopy1D<double>(rs, s, off, count, true, RS_TYPE_FLOAT_64);
             }
         }
 
         for (int off = 0; off < s; off ++) {
             for (int count = 1; count <= s - off; count ++) {
-                passed &= helperFloatAllocationCopy(mRS, s, off, count);
-                //helperByteAllocationCopy(mRS, s, off, count);
+                passed &= helperFloatAllocationCopy1D(rs, s, off, count);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test2DCopy(JNIEnv * env,
+                                                                                         jclass obj,
+                                                                                         jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy2D<float>(rs, s, s, off, off, count, count, RS_TYPE_FLOAT_32);
+                passed &= helperCopy2D<char>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_8);
+                passed &= helperCopy2D<short>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_16);
+                passed &= helperCopy2D<int>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_32);
+                passed &= helperCopy2D<double>(rs, s, s, off, off, count, count, RS_TYPE_FLOAT_64);
+            }
+        }
+
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperFloatAllocationCopy2D(rs, s, s, off, off, count, count);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test3DCopy(JNIEnv * env,
+                                                                                         jclass obj,
+                                                                                         jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy3D<float>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_FLOAT_32);
+                passed &= helperCopy3D<char>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_SIGNED_8);
+                passed &= helperCopy3D<short>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_SIGNED_16);
+                passed &= helperCopy3D<int>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_SIGNED_32);
+                passed &= helperCopy3D<double>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_FLOAT_64);
+            }
+        }
+
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperFloatAllocationCopy3D(rs, s, s, s, off, off, off, count, count, count);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test1DCopyPadded(JNIEnv * env,
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        passed &= helperCopy1D<float>(rs, s, 0, s, false, RS_TYPE_FLOAT_32, true);
+        passed &= helperCopy1D<char>(rs, s, 0, s, false, RS_TYPE_SIGNED_8, true);
+        passed &= helperCopy1D<short>(rs, s, 0, s, false, RS_TYPE_SIGNED_16, true);
+        passed &= helperCopy1D<int>(rs, s, 0, s, false, RS_TYPE_SIGNED_32, true);
+        passed &= helperCopy1D<double>(rs, s, 0, s, false, RS_TYPE_FLOAT_64, true);
+
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy1D<float>(rs, s, off, count, true, RS_TYPE_FLOAT_32, true);
+                passed &= helperCopy1D<char>(rs, s, off, count, true, RS_TYPE_SIGNED_8, true);
+                passed &= helperCopy1D<short>(rs, s, off, count, true, RS_TYPE_SIGNED_16, true);
+                passed &= helperCopy1D<int>(rs, s, off, count, true, RS_TYPE_SIGNED_32, true);
+                passed &= helperCopy1D<double>(rs, s, off, count, true, RS_TYPE_FLOAT_64, true);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test2DCopyPadded(JNIEnv * env,
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy2D<float>(rs, s, s, off, off, count, count, RS_TYPE_FLOAT_32, true);
+                passed &= helperCopy2D<char>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_8, true);
+                passed &= helperCopy2D<short>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_16, true);
+                passed &= helperCopy2D<int>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_32, true);
+                passed &= helperCopy2D<double>(rs, s, s, off, off, count, count, RS_TYPE_FLOAT_64, true);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test3DCopyPadded(JNIEnv * env,
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy3D<float>(rs, s, s, s, off, off, off, count, count, count,
+                                              RS_TYPE_FLOAT_32, true);
+                passed &= helperCopy3D<char>(rs, s, s, s, off, off, off, count, count, count,
+                                             RS_TYPE_SIGNED_8, true);
+                passed &= helperCopy3D<short>(rs, s, s, s, off, off, off, count, count, count,
+                                              RS_TYPE_SIGNED_16, true);
+                passed &= helperCopy3D<int>(rs, s, s, s, off, off, off, count, count, count,
+                                            RS_TYPE_SIGNED_32, true);
+                passed &= helperCopy3D<double>(rs, s, s, s, off, off, off, count, count, count,
+                                               RS_TYPE_FLOAT_64, true);
             }
         }
     }
@@ -358,19 +611,19 @@
                                                                                                jstring pathObj)
 {
     const char * path = env->GetStringUTFChars(pathObj, NULL);
-    sp<RS> mRS = new RS();
-    mRS->init(path);
+    sp<RS> rs = new RS();
+    rs->init(path);
     env->ReleaseStringUTFChars(pathObj, path);
 
     bool passed = true;
 
-    Type::Builder b(mRS, Element::I32(mRS));
+    Type::Builder b(rs, Element::I32(rs));
     b.setX(48);
-    sp<Allocation> largeArray = Allocation::createTyped(mRS, b.create());
+    sp<Allocation> largeArray = Allocation::createTyped(rs, b.create());
     b.setX(1);
-    sp<Allocation> singleElement = Allocation::createTyped(mRS, b.create());
+    sp<Allocation> singleElement = Allocation::createTyped(rs, b.create());
 
-    sp<ScriptC_setelementat> script = new ScriptC_setelementat(mRS);
+    sp<ScriptC_setelementat> script = new ScriptC_setelementat(rs);
 
     script->set_memset_toValue(1);
     script->forEach_memset(singleElement);
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_element.cpp b/tests/tests/rscpp/librscpptest/rs_jni_element.cpp
new file mode 100644
index 0000000..033932b
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_element.cpp
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+using namespace android::RSC;
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testCreatePixel(JNIEnv * env,
+                                                                                           jclass obj,
+                                                                                           jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_8,
+                                    RS_KIND_PIXEL_A) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_5_6_5,
+                                    RS_KIND_PIXEL_RGB) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_8,
+                                    RS_KIND_PIXEL_RGB) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_5_5_5_1,
+                                    RS_KIND_PIXEL_RGBA) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_4_4_4_4,
+                                    RS_KIND_PIXEL_RGBA) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_8,
+                                    RS_KIND_PIXEL_RGBA) != nullptr);
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testCreateVector(JNIEnv * env,
+                                                                                            jclass obj,
+                                                                                            jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    for (int len = 2; len <= 4; len ++) {
+        passed &= (Element::createVector(mRS, RS_TYPE_FLOAT_32, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_FLOAT_64, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_SIGNED_8, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_SIGNED_16, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_SIGNED_32, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_SIGNED_64, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_UNSIGNED_8, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_UNSIGNED_16, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_UNSIGNED_32, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_UNSIGNED_64, len) != nullptr);
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testPrebuiltElements(JNIEnv * env,
+                                                                                                jclass obj,
+                                                                                                jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    passed &= (Element::A_8(mRS) != nullptr);
+    passed &= (Element::RGBA_4444(mRS) != nullptr);
+    passed &= (Element::RGBA_5551(mRS) != nullptr);
+    passed &= (Element::RGB_565(mRS) != nullptr);
+    passed &= (Element::RGB_888(mRS) != nullptr);
+    passed &= (Element::RGBA_8888(mRS) != nullptr);
+    passed &= (Element::F32(mRS) != nullptr);
+    passed &= (Element::F32_2(mRS) != nullptr);
+    passed &= (Element::F32_3(mRS) != nullptr);
+    passed &= (Element::F32_4(mRS) != nullptr);
+    passed &= (Element::F64(mRS) != nullptr);
+    passed &= (Element::F64_2(mRS) != nullptr);
+    passed &= (Element::F64_3(mRS) != nullptr);
+    passed &= (Element::F64_4(mRS) != nullptr);
+    passed &= (Element::I8(mRS) != nullptr);
+    passed &= (Element::I8_2(mRS) != nullptr);
+    passed &= (Element::I8_3(mRS) != nullptr);
+    passed &= (Element::I8_4(mRS) != nullptr);
+    passed &= (Element::I16(mRS) != nullptr);
+    passed &= (Element::I16_2(mRS) != nullptr);
+    passed &= (Element::I16_3(mRS) != nullptr);
+    passed &= (Element::I16_4(mRS) != nullptr);
+    passed &= (Element::I32(mRS) != nullptr);
+    passed &= (Element::I32_2(mRS) != nullptr);
+    passed &= (Element::I32_3(mRS) != nullptr);
+    passed &= (Element::I32_4(mRS) != nullptr);
+    passed &= (Element::I64(mRS) != nullptr);
+    passed &= (Element::I64_2(mRS) != nullptr);
+    passed &= (Element::I64_3(mRS) != nullptr);
+    passed &= (Element::I64_4(mRS) != nullptr);
+    passed &= (Element::U8(mRS) != nullptr);
+    passed &= (Element::U8_2(mRS) != nullptr);
+    passed &= (Element::U8_3(mRS) != nullptr);
+    passed &= (Element::U8_4(mRS) != nullptr);
+    passed &= (Element::U16(mRS) != nullptr);
+    passed &= (Element::U16_2(mRS) != nullptr);
+    passed &= (Element::U16_3(mRS) != nullptr);
+    passed &= (Element::U16_4(mRS) != nullptr);
+    passed &= (Element::U32(mRS) != nullptr);
+    passed &= (Element::U32_2(mRS) != nullptr);
+    passed &= (Element::U32_3(mRS) != nullptr);
+    passed &= (Element::U32_4(mRS) != nullptr);
+    passed &= (Element::U64(mRS) != nullptr);
+    passed &= (Element::U64_2(mRS) != nullptr);
+    passed &= (Element::U64_3(mRS) != nullptr);
+    passed &= (Element::U64_4(mRS) != nullptr);
+    passed &= (Element::MATRIX_2X2(mRS) != nullptr);
+    passed &= (Element::MATRIX_3X3(mRS) != nullptr);
+    passed &= (Element::MATRIX_4X4(mRS) != nullptr);
+    passed &= (Element::ALLOCATION(mRS) != nullptr);
+    passed &= (Element::SAMPLER(mRS) != nullptr);
+    passed &= (Element::SCRIPT(mRS) != nullptr);
+    passed &= (Element::TYPE(mRS) != nullptr);
+    passed &= (Element::BOOLEAN(mRS) != nullptr);
+    passed &= (Element::ELEMENT(mRS) != nullptr);
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testIsCompatible(JNIEnv * env,
+                                                                                            jclass obj,
+                                                                                            jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    sp<const Element> ALLOCATION = Element::ALLOCATION(mRS);
+    // A_8 is in U8
+    sp<const Element> BOOLEAN = Element::BOOLEAN(mRS);
+    sp<const Element> ELEMENT = Element::ELEMENT(mRS);
+    sp<const Element> F32 = Element::F32(mRS);
+    sp<const Element> F32_2 = Element::F32_2(mRS);
+    sp<const Element> F32_3 = Element::F32_3(mRS);
+    sp<const Element> F32_4 = Element::F32_4(mRS);
+    sp<const Element> F64 = Element::F64(mRS);
+    sp<const Element> I16 = Element::I16(mRS);
+    sp<const Element> I32 = Element::I32(mRS);
+    sp<const Element> I64 = Element::I64(mRS);
+    sp<const Element> I8 = Element::I8(mRS);
+    // MATRIX4X4 is in MATRIX_4X4
+    sp<const Element> MATRIX_2X2 = Element::MATRIX_2X2(mRS);
+    sp<const Element> MATRIX_3X3 = Element::MATRIX_3X3(mRS);
+    sp<const Element> MATRIX_4X4 = Element::MATRIX_4X4(mRS);
+
+    sp<const Element> RGBA_4444 = Element::RGBA_4444(mRS);
+    sp<const Element> RGBA_5551 = Element::RGBA_5551(mRS);
+    // RGBA_8888 is in U8_4
+    sp<const Element> RGB_565 = Element::RGB_565(mRS);
+    // RGB_888 is in U8_3
+    sp<const Element> SAMPLER = Element::SAMPLER(mRS);
+    sp<const Element> SCRIPT = Element::SCRIPT(mRS);
+    sp<const Element> TYPE = Element::TYPE(mRS);
+    sp<const Element> U16 = Element::U16(mRS);
+    sp<const Element> U32 = Element::U32(mRS);
+    sp<const Element> U64 = Element::U64(mRS);
+    sp<const Element> U8 = Element::A_8(mRS);
+    sp<const Element> U8_3 = Element::RGB_888(mRS);
+    sp<const Element> U8_4 = Element::U8_4(mRS);
+
+    int numTypes = 27;
+    sp<const Element> ElementArrs[] = { ALLOCATION, BOOLEAN, ELEMENT, F32, F32_2,
+                                      F32_3, F32_4, F64, I16, I32, I64, I8,
+                                      MATRIX_2X2, MATRIX_3X3, MATRIX_4X4, RGBA_4444,
+                                      RGBA_5551, RGB_565, SAMPLER, SCRIPT, TYPE,
+                                      U16, U32, U64, U8, U8_3, U8_4 };
+
+    for (int i = 0; i < numTypes; i++) {
+        for (int j = 0; j < numTypes; j++) {
+            if (i == j) {
+                // Elements within a group are compatible
+                passed &= (ElementArrs[i]->isCompatible(ElementArrs[j]));
+            } else {
+                // Elements from different groups are incompatible
+                passed &= !(ElementArrs[i]->isCompatible(ElementArrs[j]));
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testElementBuilder(JNIEnv * env,
+                                                                                              jclass obj,
+                                                                                              jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    for (int arraySize = 1; arraySize <= 3; arraySize++) {
+        // Now test array size
+        Element::Builder *eb = new Element::Builder(mRS);
+        eb->add(Element::A_8(mRS), "A_8", arraySize);
+        eb->add(Element::RGBA_4444(mRS), "RGBA_4444", arraySize);
+        eb->add(Element::RGBA_5551(mRS), "RGBA_5551", arraySize);
+        eb->add(Element::RGB_565(mRS), "RGB_565", arraySize);
+        eb->add(Element::RGB_888(mRS), "RGB_888", arraySize);
+        eb->add(Element::RGBA_8888(mRS), "RGBA_8888", arraySize);
+        eb->add(Element::F32(mRS), "F32", arraySize);
+        eb->add(Element::F32_2(mRS), "F32_2", arraySize);
+        eb->add(Element::F32_3(mRS), "F32_3", arraySize);
+        eb->add(Element::F32_4(mRS), "F32_4", arraySize);
+        eb->add(Element::F64(mRS), "F64", arraySize);
+        eb->add(Element::F64_2(mRS), "F64_2", arraySize);
+        eb->add(Element::F64_3(mRS), "F64_3", arraySize);
+        eb->add(Element::F64_4(mRS), "F64_4", arraySize);
+        eb->add(Element::I8(mRS), "I8", arraySize);
+        eb->add(Element::I8_2(mRS), "I8_2", arraySize);
+        eb->add(Element::I8_3(mRS), "I8_3", arraySize);
+        eb->add(Element::I8_4(mRS), "I8_4", arraySize);
+        eb->add(Element::I16(mRS), "I16", arraySize);
+        eb->add(Element::I16_2(mRS), "I16_2", arraySize);
+        eb->add(Element::I16_3(mRS), "I16_3", arraySize);
+        eb->add(Element::I16_4(mRS), "I16_4", arraySize);
+        eb->add(Element::I32(mRS), "I32", arraySize);
+        eb->add(Element::I32_2(mRS), "I32_2", arraySize);
+        eb->add(Element::I32_3(mRS), "I32_3", arraySize);
+        eb->add(Element::I32_4(mRS), "I32_4", arraySize);
+        eb->add(Element::I64(mRS), "I64", arraySize);
+        eb->add(Element::I64_2(mRS), "I64_2", arraySize);
+        eb->add(Element::I64_3(mRS), "I64_3", arraySize);
+        eb->add(Element::I64_4(mRS), "I64_4", arraySize);
+        eb->add(Element::U8(mRS), "U8", arraySize);
+        eb->add(Element::U8_2(mRS), "U8_2", arraySize);
+        eb->add(Element::U8_3(mRS), "U8_3", arraySize);
+        eb->add(Element::U8_4(mRS), "U8_4", arraySize);
+        eb->add(Element::U16(mRS), "U16", arraySize);
+        eb->add(Element::U16_2(mRS), "U16_2", arraySize);
+        eb->add(Element::U16_3(mRS), "U16_3", arraySize);
+        eb->add(Element::U16_4(mRS), "U16_4", arraySize);
+        eb->add(Element::U32(mRS), "U32", arraySize);
+        eb->add(Element::U32_2(mRS), "U32_2", arraySize);
+        eb->add(Element::U32_3(mRS), "U32_3", arraySize);
+        eb->add(Element::U32_4(mRS), "U32_4", arraySize);
+        eb->add(Element::U64(mRS), "U64", arraySize);
+        eb->add(Element::U64_2(mRS), "U64_2", arraySize);
+        eb->add(Element::U64_3(mRS), "U64_3", arraySize);
+        eb->add(Element::U64_4(mRS), "U64_4", arraySize);
+        eb->add(Element::MATRIX_2X2(mRS), "MATRIX_2X2", arraySize);
+        eb->add(Element::MATRIX_3X3(mRS), "MATRIX_3X3", arraySize);
+        eb->add(Element::MATRIX_4X4(mRS), "MATRIX_4X4", arraySize);
+        eb->add(Element::ALLOCATION(mRS), "ALLOCATION", arraySize);
+        eb->add(Element::SAMPLER(mRS), "SAMPLER", arraySize);
+        eb->add(Element::SCRIPT(mRS), "SCRIPT", arraySize);
+        eb->add(Element::TYPE(mRS), "TYPE", arraySize);
+        eb->add(Element::BOOLEAN(mRS), "BOOLEAN", arraySize);
+        eb->add(Element::ELEMENT(mRS), "ELEMENT", arraySize);
+        passed &= (eb->create() != nullptr);
+    }
+    return passed;
+}
+
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_foreach.cpp b/tests/tests/rscpp/librscpptest/rs_jni_foreach.cpp
new file mode 100644
index 0000000..c0c0a13
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_foreach.cpp
@@ -0,0 +1,344 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+#include "ScriptC_foreach.h"
+#include "ScriptC_fe_all.h"
+#include "ScriptC_noroot.h"
+
+using namespace android::RSC;
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testForEach(JNIEnv * env,
+                                                                                       jclass obj,
+                                                                                       jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    int x = 7;
+
+    sp<ScriptC_fe_all> fe_all = new ScriptC_fe_all(mRS);
+    sp<const Type> t = Type::create(mRS, Element::I8(mRS), x, 0, 0);
+
+    // I8
+    sp<Allocation> in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U8(mRS), x, 0, 0);
+    sp<Allocation> out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8(in, out);
+    mRS->finish();
+
+    // I8_2
+    t = Type::create(mRS, Element::I8_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U8_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_2(in, out);
+    mRS->finish();
+
+    // I8_3
+    t = Type::create(mRS, Element::I8_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U8_3(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_3(in, out);
+    mRS->finish();
+
+    // I8_4
+    t = Type::create(mRS, Element::I8_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U8_4(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_4(in, out);
+    mRS->finish();
+
+    // I16
+    t = Type::create(mRS, Element::I16(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U16(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i16(in, out);
+    mRS->finish();
+
+    // I16_2
+    t = Type::create(mRS, Element::I16_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U16_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i16_2(in, out);
+    mRS->finish();
+
+    // I16_3
+    t = Type::create(mRS, Element::I16_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U16_3(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i16_3(in, out);
+    mRS->finish();
+
+    // I16_4
+    t = Type::create(mRS, Element::I16_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U16_4(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i16_4(in, out);
+    mRS->finish();
+
+    // I32
+    t = Type::create(mRS, Element::I32(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U32(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i32(in, out);
+    mRS->finish();
+
+    // I32_2
+    t = Type::create(mRS, Element::I32_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U32_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i32_2(in, out);
+    mRS->finish();
+
+    // I32_3
+    t = Type::create(mRS, Element::I32_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U32_3(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i32_3(in, out);
+    mRS->finish();
+
+    // I32_4
+    t = Type::create(mRS, Element::I32_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U32_4(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i32_4(in, out);
+    mRS->finish();
+
+    // I64
+    t = Type::create(mRS, Element::I64(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U64(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i64(in, out);
+    mRS->finish();
+
+    // I64_2
+    t = Type::create(mRS, Element::I64_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U64_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i64_2(in, out);
+    mRS->finish();
+
+    // I64_3
+    t = Type::create(mRS, Element::I64_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U64_3(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i64_3(in, out);
+    mRS->finish();
+
+    // I64_4
+    t = Type::create(mRS, Element::I64_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U64_4(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i64_4(in, out);
+    mRS->finish();
+
+    // F32
+    t = Type::create(mRS, Element::F32(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f32(in, out);
+    mRS->finish();
+
+    // F32_2
+    t = Type::create(mRS, Element::F32_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::F32_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f32_2(in, out);
+    mRS->finish();
+
+    // F32_3
+    t = Type::create(mRS, Element::F32_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f32_3(in, out);
+    mRS->finish();
+
+    // F32_4
+    t = Type::create(mRS, Element::F32_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f32_4(in, out);
+    mRS->finish();
+
+    // F64
+    t = Type::create(mRS, Element::F64(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f64(in, out);
+    mRS->finish();
+
+    // F64_2
+    t = Type::create(mRS, Element::F64_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f64_2(in, out);
+    mRS->finish();
+
+    // F64_3
+    t = Type::create(mRS, Element::F64_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f64_3(in, out);
+    mRS->finish();
+
+    // F64_4
+    t = Type::create(mRS, Element::F64_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f64_4(in, out);
+    mRS->finish();
+
+    // BOOLEAN
+    t = Type::create(mRS, Element::BOOLEAN(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_bool(in, out);
+    mRS->finish();
+
+    // A_8
+    t = Type::create(mRS, Element::I8(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::A_8(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8(in, out);
+    mRS->finish();
+
+    // RGBA_8888
+    t = Type::create(mRS, Element::I8_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::RGBA_8888(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_4(in, out);
+    mRS->finish();
+
+    // RGB_888
+    t = Type::create(mRS, Element::I8_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::RGB_888(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_3(in, out);
+    mRS->finish();
+
+    return passed;
+}
+
+#define RS_MSG_TEST_PASSED 100
+#define RS_MSG_TEST_FAILED 101
+
+static int result = 0;
+static void rsMsgHandler(uint32_t msgNum, const void *msgData, size_t msgLen) {
+    if (result == 0) {
+        result = msgNum;
+    }
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testMultipleForEach(JNIEnv * env,
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+    sp<ScriptC_foreach> s = new ScriptC_foreach(mRS);
+
+    int X = 5;
+    int Y = 7;
+    s->set_dimX(X);
+    s->set_dimY(Y);
+    sp<const Type> t = Type::create(mRS, Element::I32(mRS), X, Y, 0);
+    sp<Allocation> A = Allocation::createTyped(mRS, t);
+    s->set_aRaw(A);
+    s->forEach_root(A);
+    s->invoke_verify_root();
+    s->forEach_foo(A, A);
+    s->invoke_verify_foo();
+    s->invoke_foreach_test();
+    mRS->finish();
+    if (result == RS_MSG_TEST_FAILED) {
+        passed = false;
+    }
+    result = 0;
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testNoRoot(JNIEnv * env,
+                                                                                      jclass obj,
+                                                                                      jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+    sp<ScriptC_noroot> s = new ScriptC_noroot(mRS);
+
+    int X = 5;
+    int Y = 7;
+    s->set_dimX(X);
+    s->set_dimY(Y);
+    sp<const Type> t = Type::create(mRS, Element::I32(mRS), X, Y, 0);
+    sp<Allocation> A = Allocation::createTyped(mRS, t);
+    s->set_aRaw(A);
+    s->forEach_foo(A, A);
+    s->invoke_verify_foo();
+    s->invoke_noroot_test();
+    mRS->finish();
+    if (result == RS_MSG_TEST_FAILED) {
+        passed = false;
+    }
+    result = 0;
+    return passed;
+}
+
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_object.cpp b/tests/tests/rscpp/librscpptest/rs_jni_object.cpp
new file mode 100644
index 0000000..a530ef9
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_object.cpp
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+#include <ScriptC_clear_object.h>
+
+using namespace android::RSC;
+
+#define ObjectNum 1
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectElement(JNIEnv * env,
+                                                                                                 jclass obj,
+                                                                                                 jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<const Element> element = Element::BOOLEAN(mRS);
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    ms_clear->set_element(element);
+    ms_clear->forEach_clear_element(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectType(JNIEnv * env,
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<const Type> type= Type::create(mRS, Element::I8(mRS), 1, 0, 0);
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    ms_clear->set_type(type);
+    ms_clear->forEach_clear_type(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectAllocation(JNIEnv * env,
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    sp<Allocation> mIn = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    sp<Allocation> allocation = Allocation::createTyped(mRS, mIn->getType());
+    ms_clear->set_allocation(allocation);
+    ms_clear->forEach_clear_allocation(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectSampler(JNIEnv * env,
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<Sampler> sampler = Sampler::create(mRS, RS_SAMPLER_NEAREST, RS_SAMPLER_NEAREST,
+                                          RS_SAMPLER_WRAP, RS_SAMPLER_WRAP, 1.0f);
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    ms_clear->set_sampler(sampler);
+    ms_clear->forEach_clear_sampler(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectScript(JNIEnv * env,
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<Script> script = new ScriptC_clear_object(mRS);
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    ms_clear->set_script(script);
+    ms_clear->forEach_clear_script(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+    return passed;
+}
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_script.cpp b/tests/tests/rscpp/librscpptest/rs_jni_script.cpp
new file mode 100644
index 0000000..fd31112
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_script.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+#include <ScriptC_primitives.h>
+#include <ScriptC_instance.h>
+
+using namespace android::RSC;
+
+#define RS_MSG_TEST_PASSED 100
+#define RS_MSG_TEST_FAILED 101
+
+static int result = 0;
+static void rsMsgHandler(uint32_t msgNum, const void *msgData, size_t msgLen) {
+    if (result == 0) {
+        result = msgNum;
+    }
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSScriptTest_testSet(JNIEnv * env,
+                                                                                  jclass obj,
+                                                                                  jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+
+    sp<const Type> t = Type::create(mRS, Element::I32(mRS), 8, 0, 0);
+    sp<Allocation> alloc = Allocation::createTyped(mRS, t);
+
+    sp<ScriptC_primitives> script = new ScriptC_primitives(mRS);
+    script->set_floatTest(2.99f);  // floatTest
+    script->set_doubleTest(3.05);  // doubleTest
+    script->set_charTest(-16);  // charTest
+    script->set_shortTest(-32);  // shortTest
+    script->set_intTest(-64);  // intTest
+    script->set_longTest(17179869185l);  // longTest
+    script->set_longlongTest(68719476735L); //longlongTest
+    script->set_ulongTest(4611686018427387903L);  // boolTest
+    script->set_uint64_tTest(117179869185l); //uint64_tTest
+    script->set_allocationTest(alloc);  // allocationTest
+    
+    script->invoke_test_primitive_types();
+    mRS->finish();
+    if (result == RS_MSG_TEST_FAILED) {
+        passed = false;
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSScriptTest_testInstance(JNIEnv * env,
+                                                                                       jclass obj,
+                                                                                       jstring pathObj)
+{
+    /**
+     * Test script instancing.
+     */
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+
+    sp<const Type> t = Type::create(mRS, Element::I32(mRS), 1, 0, 0);
+    sp<Allocation> ai1 = Allocation::createTyped(mRS, t);
+    sp<Allocation> ai2 = Allocation::createTyped(mRS, t);
+    sp<ScriptC_instance> instance_1 = new ScriptC_instance(mRS);
+    sp<ScriptC_instance> instance_2 = new ScriptC_instance(mRS);
+
+    instance_1->set_i(1);
+    instance_2->set_i(2);
+    instance_1->set_ai(ai1);
+    instance_2->set_ai(ai2);
+
+    // We now check to ensure that the global is not being shared across
+    // our separate script instances. Our invoke here merely sets the
+    // instanced allocation with the instanced global variable's value.
+    // If globals are being shared (i.e. not instancing scripts), then
+    // both instanced allocations will have the same resulting value
+    // (depending on the order in which the invokes complete).
+    instance_1->invoke_instance_test();
+    instance_2->invoke_instance_test();
+
+    int i1[1];
+    int i2[1];
+
+    ai1->copy1DTo(i1);
+    ai2->copy1DTo(i2);
+
+    // 3-step check ensures that a fortunate race condition wouldn't let us
+    // pass accidentally.
+    passed &= (2 == i2[0]);
+    passed &= (1 == i1[0]);
+    passed &= (2 == i2[0]);
+    mRS->finish();
+    if (result == RS_MSG_TEST_FAILED) {
+        passed = false;
+    }
+
+    return passed;
+}
+
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_type.cpp b/tests/tests/rscpp/librscpptest/rs_jni_type.cpp
new file mode 100644
index 0000000..5458a25
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_type.cpp
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+#include <ScriptC_primitives.h>
+#include <ScriptC_instance.h>
+
+using namespace android::RSC;
+
+static bool testTypeBuilderHelper(sp<RS> mRS, sp<const Element> e) {
+    const int min = 1;
+    const int max = 8;
+
+    Type::Builder b(mRS, e);
+    bool result = true;
+    for (int mips = 0; mips <= 1; mips ++) {
+        bool useMips = (mips == 1);
+        for (int faces = 0; faces <= 1; faces++) {
+            bool useFaces = (faces == 1);
+
+            b.setMipmaps(useMips);
+            b.setFaces(useFaces);
+            for (int x = min; x < max; x ++) {
+                for (int y = min; y < max; y ++) {
+                    b.setX(x);
+                    b.setY(y);
+                    result &= (b.create() != nullptr);
+                }
+            }
+        }
+    }
+    return result;
+}
+
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSTypeTest_testCreate(JNIEnv * env,
+                                                                                   jclass obj,
+                                                                                   jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    passed &= testTypeBuilderHelper(mRS, Element::A_8(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::RGB_565(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::RGB_888(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::RGBA_8888(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F32(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F32_2(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F32_3(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F32_4(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::BOOLEAN(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F64(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::I8(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::I16(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::I32(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::I64(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U8(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U8_4(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U16(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U32(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U64(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::MATRIX_2X2(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::MATRIX_3X3(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::MATRIX_4X4(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::ALLOCATION(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::SAMPLER(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::SCRIPT(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::TYPE(mRS));
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSTypeTest_testGetCount(JNIEnv * env,
+                                                                                     jclass obj,
+                                                                                     jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    Type::Builder b(mRS, Element::F32(mRS));
+    for (int faces = 0; faces <= 1; faces++) {
+        bool useFaces = (faces == 1);
+        uint32_t faceMultiplier = useFaces ? 6 : 1;
+        for (int x = 1; x < 8; x ++) {
+            for (int y = 1; y < 8; y ++) {
+                b.setFaces(useFaces);
+                b.setX(x);
+                b.setY(y);
+                sp<const Type> t = b.create();
+                passed &= (t->getCount() == x * y * faceMultiplier);
+            }
+        }
+    }
+
+    // Test mipmaps
+    b.setFaces(false);
+    b.setMipmaps(true);
+    b.setX(8);
+    b.setY(1);
+    sp<const Type> t = b.create();
+
+    size_t expectedCount = 8 + 4 + 2 + 1;
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(8);
+    b.setY(8);
+    t = b.create();
+    expectedCount = 8*8 + 4*4 + 2*2 + 1;
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(8);
+    b.setY(4);
+    t = b.create();
+    expectedCount = 8*4 + 4*2 + 2*1 + 1;
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(4);
+    b.setY(8);
+    t = b.create();
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(7);
+    b.setY(1);
+    t = b.create();
+    expectedCount = 7 + 3 + 1;
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(7);
+    b.setY(3);
+    t = b.create();
+    expectedCount = 7*3 + 3*1 + 1;
+    passed &= (t->getCount() == expectedCount);
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSTypeTest_testGet(JNIEnv * env,
+                                                                                jclass obj,
+                                                                                jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<const Type> t = Type::create(mRS, Element::F32(mRS), 3, 4, 0);
+    passed &= (t->getElement() == Element::F32(mRS));
+    passed &= (t->getX() == 3);
+    passed &= (t->getY() == 4);
+    passed &= (t->getZ() == 0);
+
+    Type::Builder b(mRS, Element::F32(mRS));
+    b.setX(4);
+    b.setY(4);
+    b.setFaces(true);
+    passed &= (b.create()->hasFaces());
+    b.setFaces(false);
+    passed &= !(b.create()->hasFaces());
+    b.setMipmaps(true);
+    passed &= (b.create()->hasMipmaps());
+    b.setMipmaps(false);
+    passed &= !(b.create()->hasMipmaps());
+
+    return passed;
+}
+
+
+
diff --git a/tests/tests/rscpp/librscpptest/shared.rsh b/tests/tests/rscpp/librscpptest/shared.rsh
new file mode 100644
index 0000000..3bc52f2
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/shared.rsh
@@ -0,0 +1,26 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.cts.rscpp)
+
+static int64_t g_time;
+
+static void start(void) {
+    g_time = rsUptimeMillis();
+}
+
+static float end(void) {
+    int64_t t = rsUptimeMillis() - g_time;
+    return ((float)t) / 1000.f;
+}
+
+#define _RS_ASSERT(b) \
+do { \
+    if (!(b)) { \
+        failed = true; \
+        rsDebug(#b " FAILED", 0); \
+    } \
+\
+} while (0)
+
+/* These constants must match those in UnitTest.java */
+static const int RS_MSG_TEST_PASSED = 100;
+static const int RS_MSG_TEST_FAILED = 101;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
index 76dbfee..012e731 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
@@ -33,14 +33,39 @@
     }
 
     native boolean test1DCopy(String path);
-    public void testRSAllocationCopy() {
+    public void testRSAllocationCopy1D() {
         assertTrue(test1DCopy(this.getContext().getCacheDir().toString()));
     }
 
+    native boolean test2DCopy(String path);
+    public void testRSAllocationCopy2D() {
+        assertTrue(test2DCopy(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean test3DCopy(String path);
+    public void testRSAllocationCopy3D() {
+        assertTrue(test3DCopy(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean test1DCopyPadded(String path);
+    public void testRSAllocationCopy1DPadded() {
+        assertTrue(test1DCopyPadded(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean test2DCopyPadded(String path);
+    public void testRSAllocationCopy2DPadded() {
+        assertTrue(test2DCopyPadded(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean test3DCopyPadded(String path);
+    public void testRSAllocationCopy3DPadded() {
+        assertTrue(test3DCopyPadded(this.getContext().getCacheDir().toString()));
+    }
+
     native boolean testSetElementAt(String path);
     public void testRSAllocationSetElementAt() {
         assertTrue(testSetElementAt(this.getContext().getCacheDir().toString()));
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
index 9b09cc7..0b308cb 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
@@ -25,6 +25,7 @@
 import android.renderscript.RenderScript;
 import android.renderscript.Allocation;
 import android.renderscript.Element;
+import android.renderscript.Type;
 import android.util.Log;
 
 public class RSCppTest extends AndroidTestCase {
@@ -73,6 +74,29 @@
         }
     };
 
+    protected Element makeElement(Element.DataType dt, int vecSize) {
+        Element e;
+        if (vecSize > 1) {
+            e = Element.createVector(mRS, dt, vecSize);
+        } else {
+            if (dt == Element.DataType.UNSIGNED_8) {
+                e = Element.U8(mRS);
+            } else {
+                e = Element.F32(mRS);
+            }
+        }
+        return e;
+    }
+
+    protected Allocation makeAllocation(int w, int h, Element e) {
+        Type.Builder tb = new Type.Builder(mRS, e);
+        tb.setX(w);
+        tb.setY(h);
+        Type t = tb.create();
+        Allocation a = Allocation.createTyped(mRS, t);
+        return a;
+    }
+
     protected void checkForErrors() {
         mRS.finish();
         mVerify.invoke_checkError();
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSElementTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSElementTest.java
new file mode 100644
index 0000000..edae845
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSElementTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSElementTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testCreatePixel(String path);
+    public void testRSElementTestCreatePixel() {
+        assertTrue(testCreatePixel(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testCreateVector(String path);
+    public void testRSElementTestCreateVector() {
+        assertTrue(testCreateVector(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testPrebuiltElements(String path);
+    public void testRSElementTestPrebuiltElements() {
+        assertTrue(testPrebuiltElements(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testIsCompatible(String path);
+    public void testRSElementTestIsCompatible() {
+        assertTrue(testIsCompatible(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testElementBuilder(String path);
+    public void testRSElementElementBuilder() {
+        assertTrue(testElementBuilder(this.getContext().getCacheDir().toString()));
+    }
+
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSForEachTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSForEachTest.java
new file mode 100644
index 0000000..3f497bb
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSForEachTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSForEachTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testForEach(String path);
+    public void testRSForEachTestForEach() {
+        assertTrue(testForEach(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testMultipleForEach(String path);
+    public void testRSForEachTestMultipleForEach() {
+        assertTrue(testMultipleForEach(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testNoRoot(String path);
+    public void testRSForEachTestNoRoot() {
+        assertTrue(testNoRoot(this.getContext().getCacheDir().toString()));
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSObjectTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSObjectTest.java
new file mode 100644
index 0000000..308ca36
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSObjectTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSObjectTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testClearObjectElement(String path);
+    public void testRSObjectTestClearObjectElement() {
+        assertTrue(testClearObjectElement(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testClearObjectType(String path);
+    public void testRSObjectTestClearObjectType() {
+        assertTrue(testClearObjectType(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testClearObjectAllocation(String path);
+    public void testRSObjectTestClearObjectAllocation() {
+        assertTrue(testClearObjectAllocation(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testClearObjectSampler(String path);
+    public void testRSObjectTestClearObjectSampler() {
+        assertTrue(testClearObjectSampler(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testClearObjectScript(String path);
+    public void testRSObjectTestClearObjectScript() {
+        assertTrue(testClearObjectScript(this.getContext().getCacheDir().toString()));
+    }
+
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSResizeTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSResizeTest.java
new file mode 100644
index 0000000..51ae26e
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSResizeTest.java
@@ -0,0 +1,353 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.lang.Integer;
+
+public class RSResizeTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    private final int inX = 307;
+    private final int inY = 157;
+
+    native boolean resizeTest(String path, int w, int h, float scaleX, float scaleY,
+                              boolean useByte, int vecSize, byte[] inB, byte[] outB,
+                              float[] inF, float[] outF);
+    private void testResize(int w, int h, Element.DataType dt, int vecSize, float scaleX, float scaleY) {
+
+        boolean useByte = false;
+        if (dt == Element.DataType.UNSIGNED_8) {
+            useByte = true;
+        }
+
+        Element e = makeElement(dt, vecSize);
+        Allocation rsInput = makeAllocation(w, h, e);
+
+        int arrSize = w * h * (vecSize == 3 ? 4 : vecSize);
+        int[] baseAlloc = new int[arrSize];
+        byte[] byteAlloc = null;
+        float[] floatAlloc = null;
+
+        RSUtils.genRandom(0x72727272, 255, 1, -128, baseAlloc);
+        if (useByte) {
+            byteAlloc = new byte[arrSize];
+            for (int i = 0; i < arrSize; i++) {
+                byteAlloc[i] = (byte)baseAlloc[i];
+            }
+            rsInput.copyFromUnchecked(byteAlloc);
+        } else {
+            //Float case
+            floatAlloc = new float[arrSize];
+            for (int i = 0; i < arrSize; i++) {
+                floatAlloc[i] = (float)baseAlloc[i];
+            }
+            rsInput.copyFromUnchecked(floatAlloc);
+        }
+
+        int outW = (int) (w*scaleX);
+        int outH = (int) (h*scaleY);
+
+        Allocation rsOutput = makeAllocation(outW, outH, e);
+        Allocation rsCppOutput = makeAllocation(outW, outH, e);
+
+        ScriptIntrinsicResize resize = ScriptIntrinsicResize.create(mRS);
+        resize.setInput(rsInput);
+        resize.forEach_bicubic(rsOutput);
+
+        int outArrSize = outW * outH * (vecSize == 3 ? 4 : vecSize);
+        byte[] nativeByteAlloc = new byte[outArrSize];
+        float[] nativeFloatAlloc = new float[outArrSize];
+        resizeTest(this.getContext().getCacheDir().toString().toString(), w, h, scaleX, scaleY,
+                   useByte, vecSize, byteAlloc, nativeByteAlloc, floatAlloc, nativeFloatAlloc);
+
+        if (useByte) {
+            rsCppOutput.copyFromUnchecked(nativeByteAlloc);
+        } else {
+            rsCppOutput.copyFromUnchecked(nativeFloatAlloc);
+        }
+        mVerify.invoke_verify(rsOutput, rsCppOutput, rsInput);
+        checkForErrors();
+    }
+
+    public void test_U8_4_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
+    }
+    public void test_U8_3_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
+    }
+    public void test_U8_2_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
+    }
+    public void test_U8_1_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
+    }
+
+    public void test_U8_4_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
+    }
+    public void test_U8_3_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
+    }
+    public void test_U8_2_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
+    }
+    public void test_U8_1_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
+    }
+
+    public void test_U8_4_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
+    }
+    public void test_U8_3_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
+    }
+    public void test_U8_2_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
+    }
+    public void test_U8_1_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
+    }
+
+    public void test_U8_4_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
+    }
+    public void test_U8_3_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
+    }
+    public void test_U8_2_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
+    }
+    public void test_U8_1_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
+    }
+
+    public void test_U8_4_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
+    }
+    public void test_U8_3_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
+    }
+    public void test_U8_2_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
+    }
+    public void test_U8_1_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
+    }
+
+    public void test_U8_4_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
+    }
+    public void test_U8_3_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
+    }
+    public void test_U8_2_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
+    }
+    public void test_U8_1_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
+    }
+
+    public void test_U8_4_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
+    }
+    public void test_U8_3_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
+    }
+    public void test_U8_2_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
+    }
+    public void test_U8_1_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
+    }
+
+    public void test_U8_4_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
+    }
+    public void test_U8_3_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
+    }
+    public void test_U8_2_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
+    }
+    public void test_U8_1_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
+    }
+
+    public void test_U8_4_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
+    }
+    public void test_U8_3_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
+    }
+    public void test_U8_2_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
+    }
+    public void test_U8_1_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
+    }
+
+    public void test_U8_4_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
+    }
+    public void test_U8_3_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
+    }
+    public void test_U8_2_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
+    }
+    public void test_U8_1_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
+    }
+
+
+    public void test_F32_4_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
+    }
+    public void test_F32_3_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
+    }
+    public void test_F32_2_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
+    }
+    public void test_F32_1_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
+    }
+
+    public void test_F32_4_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
+    }
+    public void test_F32_3_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
+    }
+    public void test_F32_2_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
+    }
+    public void test_F32_1_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
+    }
+
+    public void test_F32_4_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
+    }
+    public void test_F32_3_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
+    }
+    public void test_F32_2_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
+    }
+    public void test_F32_1_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
+    }
+
+    public void test_F32_4_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
+    }
+    public void test_F32_3_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
+    }
+    public void test_F32_2_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
+    }
+    public void test_F32_1_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
+    }
+
+    public void test_F32_4_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
+    }
+    public void test_F32_3_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
+    }
+    public void test_F32_2_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
+    }
+    public void test_F32_1_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
+    }
+
+    public void test_F32_4_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
+    }
+    public void test_F32_3_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
+    }
+    public void test_F32_2_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
+    }
+    public void test_F32_1_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
+    }
+
+    public void test_F32_4_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
+    }
+    public void test_F32_3_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
+    }
+    public void test_F32_2_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
+    }
+    public void test_F32_1_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
+    }
+
+    public void test_F32_4_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
+    }
+    public void test_F32_3_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
+    }
+    public void test_F32_2_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
+    }
+    public void test_F32_1_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
+    }
+
+    public void test_F32_4_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
+    }
+    public void test_F32_3_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
+    }
+    public void test_F32_2_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
+    }
+    public void test_F32_1_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
+    }
+
+    public void test_F32_4_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
+    }
+    public void test_F32_3_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
+    }
+    public void test_F32_2_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
+    }
+    public void test_F32_1_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSScriptTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSScriptTest.java
new file mode 100644
index 0000000..72f4a17
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSScriptTest.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSScriptTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testSet(String path);
+    public void testRSScriptTestSet() {
+        assertTrue(testSet(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testInstance(String path);
+    public void testRSScriptTestInstance() {
+        assertTrue(testInstance(this.getContext().getCacheDir().toString()));
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSTypeTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSTypeTest.java
new file mode 100644
index 0000000..4453da1
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSTypeTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSTypeTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testCreate(String path);
+    public void testRSTypeTestCreate() {
+        assertTrue(testCreate(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testGet(String path);
+    public void testRSTypeTestGet() {
+        assertTrue(testGet(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testGetCount(String path);
+    public void testRSTypeTestGetCount() {
+        assertTrue(testGetCount(this.getContext().getCacheDir().toString()));
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSYuvTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSYuvTest.java
new file mode 100644
index 0000000..8f79a4c
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSYuvTest.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.util.Random;
+
+public class RSYuvTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    int width;
+    int height;
+    byte [] by;
+    byte [] bu;
+    byte [] bv;
+    Allocation ay;
+    Allocation au;
+    Allocation av;
+
+    int getCWidth() {
+        return (width + 1) / 2;
+    }
+    int getCHeight() {
+        return (height + 1) / 2;
+    }
+
+    protected void makeYuvBuffer(int w, int h) {
+        Random r = new Random();
+        width = w;
+        height = h;
+
+        by = new byte[w*h];
+        bu = new byte[getCWidth() * getCHeight()];
+        bv = new byte[getCWidth() * getCHeight()];
+
+        for (int i=0; i < by.length; i++) {
+            by[i] = (byte)r.nextInt(256);
+        }
+        for (int i=0; i < bu.length; i++) {
+            bu[i] = (byte)r.nextInt(256);
+        }
+        for (int i=0; i < bv.length; i++) {
+            bv[i] = (byte)r.nextInt(256);
+        }
+
+        ay = Allocation.createTyped(mRS, Type.createXY(mRS, Element.U8(mRS), w, h));
+        final Type tuv = Type.createXY(mRS, Element.U8(mRS), w >> 1, h >> 1);
+        au = Allocation.createTyped(mRS, tuv);
+        av = Allocation.createTyped(mRS, tuv);
+
+        ay.copyFrom(by);
+        au.copyFrom(bu);
+        av.copyFrom(bv);
+    }
+
+    public Allocation makeOutput() {
+        return Allocation.createTyped(mRS, Type.createXY(mRS, Element.RGBA_8888(mRS), width, height));
+    }
+
+    native boolean yuvTest(String path, int X, int Y, byte[] input, byte[] output, int yuvFormat);
+    // Test for the API 17 conversion path
+    // This used a uchar buffer assuming nv21
+    public void testV17() {
+        makeYuvBuffer(120, 96);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+            tmp[i++] = bu[j];
+        }
+
+        Allocation ta = Allocation.createSized(mRS, Element.U8(mRS), tmp.length);
+        ta.copyFrom(tmp);
+
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.U8(mRS));
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+
+        byte[] nativeByteAlloc = new byte[width * height * 4];
+        yuvTest(this.getContext().getCacheDir().toString(), width, height, tmp, nativeByteAlloc, 0);
+        aref.copyFromUnchecked(nativeByteAlloc);
+
+        mVerify.invoke_verify(aref, aout, ay);
+        checkForErrors();
+    }
+
+    // Test for the API 18 conversion path with yv12
+    public void test_YV12() {
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.YUV(mRS));
+
+        makeYuvBuffer(512, 512);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+        Type.Builder tb = new Type.Builder(mRS, Element.YUV(mRS));
+        tb.setX(width);
+        tb.setY(height);
+        tb.setYuvFormat(android.graphics.ImageFormat.YV12);
+        Allocation ta = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bu[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+        }
+        ta.copyFrom(tmp);
+
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+
+        byte[] nativeByteAlloc = new byte[width * height * 4];
+        yuvTest(this.getContext().getCacheDir().toString(), width, height, tmp, nativeByteAlloc, 1);
+        aref.copyFromUnchecked(nativeByteAlloc);
+
+        mVerify.invoke_verify(aref, aout, ay);
+        checkForErrors();
+    }
+
+    // Test for the API 18 conversion path with nv21
+    public void test_NV21() {
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.YUV(mRS));
+
+        makeYuvBuffer(512, 512);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+        Type.Builder tb = new Type.Builder(mRS, Element.YUV(mRS));
+        tb.setX(width);
+        tb.setY(height);
+        tb.setYuvFormat(android.graphics.ImageFormat.NV21);
+        Allocation ta = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+            tmp[i++] = bu[j];
+        }
+        ta.copyFrom(tmp);
+
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+
+        byte[] nativeByteAlloc = new byte[width * height * 4];
+        yuvTest(this.getContext().getCacheDir().toString(), width, height, tmp, nativeByteAlloc, 2);
+        aref.copyFromUnchecked(nativeByteAlloc);
+
+        mVerify.invoke_verify(aref, aout, ay);
+        checkForErrors();
+    }
+}
diff --git a/tests/tests/security/Android.mk b/tests/tests/security/Android.mk
index c41ee58..ec36d6d 100644
--- a/tests/tests/security/Android.mk
+++ b/tests/tests/security/Android.mk
@@ -23,7 +23,7 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestserver ctstestrunner ctsdeviceutil guava
 
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := android.test.runner org.apache.http.legacy
 
 LOCAL_JNI_SHARED_LIBRARIES := libctssecurity_jni libcts_jni
 
diff --git a/tests/tests/security/AndroidManifest.xml b/tests/tests/security/AndroidManifest.xml
index 8ed74ba..25bc6ac 100644
--- a/tests/tests/security/AndroidManifest.xml
+++ b/tests/tests/security/AndroidManifest.xml
@@ -25,6 +25,7 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
 
         <service android:name="android.security.cts.SeccompDeathTestService"
                  android:process=":death_test_service"
diff --git a/tests/tests/security/jni/Android.mk b/tests/tests/security/jni/Android.mk
index 46d0868..7106385 100644
--- a/tests/tests/security/jni/Android.mk
+++ b/tests/tests/security/jni/Android.mk
@@ -31,7 +31,6 @@
 		android_security_cts_SeccompDeathTestService.cpp \
 		android_security_cts_SELinuxTest.cpp \
 		android_security_cts_MMapExecutableTest.cpp \
-		android_security_cts_NetlinkSocket.cpp \
 		android_security_cts_AudioPolicyBinderTest.cpp
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
diff --git a/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp b/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
index ca8e841..424dbaf 100644
--- a/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
+++ b/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
@@ -16,7 +16,6 @@
 
 #include <jni.h>
 #include <stdio.h>
-#include "android_security_cts_NetlinkSocket.h"
 
 extern int register_android_security_cts_KernelSettingsTest(JNIEnv*);
 extern int register_android_security_cts_CharDeviceTest(JNIEnv*);
@@ -67,10 +66,6 @@
         return JNI_ERR;
     }
 
-    if (register_android_security_cts_NetlinkSocket(env)) {
-        return JNI_ERR;
-    }
-
     if (register_android_security_cts_AudioPolicyBinderTest(env)) {
         return JNI_ERR;
     }
diff --git a/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp b/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
deleted file mode 100644
index de315ea..0000000
--- a/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <jni.h>
-#include <stdio.h>
-#include <cutils/log.h>
-#include <asm/types.h>
-#include <sys/socket.h>
-#include <linux/netlink.h>
-#include <errno.h>
-#include <string.h>
-#include "JNIHelp.h"
-
-#include "android_security_cts_NetlinkSocket.h"
-
-static void android_security_cts_NetlinkSocket_create(JNIEnv* env, jclass,
-    jobject fileDescriptor)
-{
-    int sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
-    if (sock == -1) {
-        ALOGE("Can't create socket %s", strerror(errno));
-        jclass SocketException = env->FindClass("java/net/SocketException");
-        env->ThrowNew(SocketException, "Can't create socket");
-        return;
-    }
-    jniSetFileDescriptorOfFD(env, fileDescriptor, sock);
-}
-
-static int android_security_cts_NetlinkSocket_sendmsg(JNIEnv *e, jclass,
-    jobject fileDescriptor, jint pid, jbyteArray packet)
-{
-    void *bytes = (void *)e->GetByteArrayElements(packet, NULL);
-    uint32_t length = (uint32_t)e->GetArrayLength(packet);
-    struct sockaddr_nl snl;
-    struct iovec iov = {bytes, length};
-    struct msghdr msg = {&snl, sizeof(snl), &iov, 1, NULL, 0, 0};
-
-    memset(&snl, 0, sizeof(snl));
-    snl.nl_family = AF_NETLINK;
-    snl.nl_pid = pid;
-
-    int sock = jniGetFDFromFileDescriptor(e, fileDescriptor);
-    int retval = sendmsg(sock, &msg, 0);
-    e->ReleaseByteArrayElements(packet, (jbyte*)bytes, 0);
-    return retval;
-}
-
-
-static JNINativeMethod gMethods[] = {
-    {  "sendmsg", "(Ljava/io/FileDescriptor;I[B)I", (void *) android_security_cts_NetlinkSocket_sendmsg },
-    {  "create_native", "(Ljava/io/FileDescriptor;)V", (void *) android_security_cts_NetlinkSocket_create },
-};
-
-int register_android_security_cts_NetlinkSocket(JNIEnv* env)
-{
-    jclass clazz = env->FindClass("android/security/cts/NetlinkSocket");
-
-    return env->RegisterNatives(clazz, gMethods,
-            sizeof(gMethods) / sizeof(JNINativeMethod));
-}
diff --git a/tests/tests/security/jni/android_security_cts_NetlinkSocket.h b/tests/tests/security/jni/android_security_cts_NetlinkSocket.h
deleted file mode 100644
index 6e61c75..0000000
--- a/tests/tests/security/jni/android_security_cts_NetlinkSocket.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ANDROID_SECURITY_CTS_H__
-#define __ANDROID_SECURITY_CTS_H__
-
-int register_android_security_cts_NetlinkSocket(JNIEnv*);
-
-#endif /* __ANDROID_SECURITY_CTS_H__ */
diff --git a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
index e401e41..9925e9d 100644
--- a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
+++ b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
@@ -115,6 +115,25 @@
 
     private static native boolean supportsXattr();
 
+    /**
+     * ICMP redirects should be disabled.
+     */
+    public void testNoIcmpRedirects() throws IOException {
+        try {
+            assertEquals("ICMP redirects are enabled for IPv4.",
+                    "0", getFile("/proc/sys/net/ipv4/conf/all/accept_redirects"));
+        } catch (FileNotFoundException e) {
+            // Odd. The file doesn't exist... Assume we're ok.
+        }
+
+        try {
+            assertEquals("ICMP redirects are enabled for IPv6.",
+                    "0", getFile("/proc/sys/net/ipv6/conf/all/accept_redirects"));
+        } catch (FileNotFoundException e) {
+            // Odd. The file doesn't exist... Assume we're ok.
+        }
+    }
+
     static String getFile(String filename) throws IOException {
         BufferedReader in = null;
         try {
diff --git a/tests/tests/security/src/android/security/cts/KeystoreExploitTest.java b/tests/tests/security/src/android/security/cts/KeystoreExploitTest.java
deleted file mode 100644
index 23266c2..0000000
--- a/tests/tests/security/src/android/security/cts/KeystoreExploitTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.cts;
-
-import android.test.AndroidTestCase;
-
-import java.io.File;
-import java.lang.reflect.Method;
-
-public class KeystoreExploitTest extends AndroidTestCase {
-    public void testKeystoreCrash() throws Exception {
-        int pid = Proc.findPidFor("/system/bin/keystore");
-
-        Class<?> keystoreClass = Class.forName("android.security.KeyStore");
-        Method getInstance = keystoreClass.getMethod("getInstance");
-        Method get = keystoreClass.getMethod("get", String.class);
-
-        Object keystore = getInstance.invoke(null);
-        String keyName = "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA";
-        get.invoke(keystore, keyName);
-
-        Thread.sleep(2000); // give keystore some time to crash
-
-        assertTrue("PID=" + pid + " crashed due to a malformed key name.",
-                new File("/proc/" + pid + "/cmdline").exists());
-    }
-}
diff --git a/tests/tests/security/src/android/security/cts/NetlinkSocket.java b/tests/tests/security/src/android/security/cts/NetlinkSocket.java
deleted file mode 100644
index 5ea80ca..0000000
--- a/tests/tests/security/src/android/security/cts/NetlinkSocket.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.cts;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.net.SocketException;
-
-public class NetlinkSocket {
-
-    static {
-        System.loadLibrary("ctssecurity_jni");
-    }
-
-    private static native void create_native(FileDescriptor fd) throws SocketException;
-    private static native int sendmsg(FileDescriptor fd, int pid, byte[] bytes);
-
-    private FileDescriptor fd = new FileDescriptor();
-
-    /** no public constructors */
-    private NetlinkSocket() { }
-
-    public static NetlinkSocket create() throws SocketException {
-        NetlinkSocket retval = new NetlinkSocket();
-        create_native(retval.fd);
-        return retval;
-    }
-
-    public boolean valid() {
-        return fd.valid();
-    }
-
-    public int sendmsg(int pid, byte[] bytes) throws IOException {
-        int retval = sendmsg(fd, pid, bytes);
-        if (retval == -1) {
-            throw new IOException("Unable to send message to PID=" + pid);
-        }
-        return retval;
-    }
-}
diff --git a/tests/tests/security/src/android/security/cts/Proc.java b/tests/tests/security/src/android/security/cts/Proc.java
deleted file mode 100644
index 6fe0706..0000000
--- a/tests/tests/security/src/android/security/cts/Proc.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.cts;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-/**
- * Utilities for accessing /proc filesystem information.
- */
-public class Proc {
-    public static int findPidFor(String executable) throws IOException {
-        File f = new File("/proc");
-        for (File d : f.listFiles()) {
-            String cmdLineString = d.getAbsolutePath() + "/cmdline";
-            File cmdLine = new File(cmdLineString);
-            if (cmdLine.exists()) {
-                BufferedReader in = null;
-                try {
-                    in = new BufferedReader(new FileReader(cmdLine));
-                    String line = in.readLine();
-                    if ((line != null) && line.startsWith(executable)) {
-                        return Integer.decode(d.getName());
-                    }
-                } finally {
-                    if (in != null) {
-                        in.close();
-                    }
-                }
-            }
-        }
-        throw new RuntimeException("should never get here");
-    }
-}
diff --git a/tests/tests/security/src/android/security/cts/VoldExploitTest.java b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
index 103158f..248579c 100644
--- a/tests/tests/security/src/android/security/cts/VoldExploitTest.java
+++ b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
@@ -17,23 +17,9 @@
 package android.security.cts;
 
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.os.storage.StorageManager;
 import android.test.AndroidTestCase;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.SocketException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Scanner;
-import java.util.Set;
-
 public class VoldExploitTest extends AndroidTestCase {
 
     /**
@@ -45,245 +31,4 @@
         String path = sm.getMountedObbPath("/dev/null\0asec list");
         assertNull(path);
     }
-
-    /**
-     * Validate that this device isn't vulnerable to the "ZergRush"
-     * vold vulnerability (CVE-2011-3874).
-     *
-     * https://github.com/revolutionary/zergRush/blob/master/zergRush.c
-     *
-     * Note: If the ZergRush vulnerability is present, the call to
-     * {@link StorageManager#getMountedObbPath(String)} below hangs until CTS
-     * kills the testsuite (10 minutes). A timeout, while not desirable,
-     * is the typical failure for this test.
-     */
-    public void testZergRushCrash() throws Exception {
-        int pid = Proc.findPidFor("/system/bin/vold");
-
-        StorageManager sm = (StorageManager) getContext().getSystemService(Context.STORAGE_SERVICE);
-        sm.getMountedObbPath("AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA"
-                + "AAAA AAAA AAAA AAAA"
-                + "AAAA AAAA AAAA AAAA"
-                + "AAAA AAAA AAAA AAAA"
-                + "AAAA AAAA AAAA AAAA");
-
-        Thread.sleep(2000);  // give vold some time to crash
-
-        // Check to see if vold is still alive.
-        assertTrue(
-                "PID=" + pid + " crashed due to a malformed mount message."
-                        + " Detected unpatched ZergRush vulnerability (CVE-2011-3874).",
-                new File("/proc/" + pid + "/cmdline").exists());
-    }
-
-    /**
-     * Try to crash the vold program using CVE-2011-1823.
-     *
-     * This test attempts to send an invalid netlink messages to
-     * any process which is listening for the messages.  If we detect
-     * that any process crashed as a result of our message, then
-     * we know that we found a bug.
-     *
-     * If this test fails, it's due to CVE-2011-1823
-     *
-     * http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2011-1823
-     */
-    public void testTryToCrashVold() throws IOException {
-        Set<Integer> pids = getPids();
-        assertTrue(pids.size() > 1);  // at least vold and netd should exist
-
-        Set<String> devices = new HashSet<String>();
-        devices.addAll(getSysFsPath("/etc/vold.fstab"));
-        devices.addAll(getSysFsPath("/system/etc/vold.fstab"));
-        if (devices.isEmpty()) {
-          // This vulnerability is not exploitable if there's
-          // no entry in vold.fstab
-          return;
-        }
-
-        NetlinkSocket ns;
-        try {
-            ns = NetlinkSocket.create();
-        } catch (SocketException e) {
-            // Can't create netlink socket. Not vulnerable.
-            return;
-        }
-        for (int i : pids) {
-            for (String j : devices) {
-                doAttack(ns, i, j);
-            }
-        }
-
-        // Check to see if all the processes are still alive.  If
-        // any of them have died, we found an exploitable bug.
-        for (int i : pids) {
-            assertTrue(
-                    "PID=" + i + " crashed due to a malformed netlink message."
-                    + " Detected unpatched vulnerability CVE-2011-1823.",
-                    new File("/proc/" + i + "/cmdline").exists());
-        }
-    }
-
-    /**
-     * Try to actually crash the program, by first sending a fake
-     * request to add a new disk, followed by a fake request to add
-     * a partition.
-     */
-    private static void doAttack(NetlinkSocket ns, int pid, String path)
-            throws IOException {
-        try {
-            ns.sendmsg(pid, getDiskAddedMessage(path));
-            confirmNetlinkMsgReceived();
-
-            for (int i = -1000; i > -5000; i-=1000) {
-                ns.sendmsg(pid, getPartitionAddedMessage(path, i));
-                confirmNetlinkMsgReceived();
-            }
-        } catch (IOException e) {
-            // Ignore the exception.  The process either:
-            //
-            // 1) Crashed
-            // 2) Closed the netlink socket and refused further messages
-            //
-            // If #1 occurs, our PID check in testTryToCrashVold() will
-            // detect the process crashed and trigger an error.
-            //
-            // #2 is not a security bug.  It's perfectly acceptable to
-            // refuse messages from someone trying to send you
-            // malicious content.
-        }
-    }
-
-    /**
-     * Parse the fstab.vold file, and extract out the "sysfs_path" field.
-     */
-    private static Set<String> getSysFsPath(String file) throws IOException {
-        Set<String> retval = new HashSet<String>();
-        File netlink = new File(file);
-        if (!netlink.canRead()) {
-            return retval;
-        }
-        Scanner scanner = null;
-        try {
-            scanner = new Scanner(netlink);
-            while(scanner.hasNextLine()) {
-                String line = scanner.nextLine().trim();
-                if (!line.startsWith("dev_mount")) {
-                    continue;
-                }
-
-                String[] fields = line.split("\\s+");
-                assertTrue(fields.length >= 5);
-                // Column 5 and beyond is "sysfs_path"
-                retval.addAll(Arrays.asList(fields).subList(4, fields.length));
-            }
-        } finally {
-            if (scanner != null) {
-                scanner.close();
-            }
-        }
-        return retval;
-    }
-
-    /**
-     * Poll /proc/net/netlink until all the "Rmem" fields contain
-     * "0" or approximately 10 seconds have passed.
-     *
-     * This indicates that either the netlink message was received,
-     * or the process took too long to process the incoming netlink
-     * message.
-     *
-     * See http://code.google.com/p/android/issues/detail?id=25099
-     * for information on why the timeout is needed.
-     */
-    private static void confirmNetlinkMsgReceived() {
-        try {
-            for (int ct = 0; ct < 200; ct++) {
-                boolean foundAllZeros = true;
-                for (List<String> i : parseNetlink()) {
-                    // Column 5 is the "Rmem" field, which is the
-                    // amount of kernel memory for received netlink messages.
-                    if (!i.get(4).equals("0")) {
-                        foundAllZeros = false;
-                    }
-                }
-                if (foundAllZeros) {
-                    return;
-                }
-                Thread.sleep(50);
-            }
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Extract all the PIDs listening for netlink messages.
-     */
-    private static Set<Integer> getPids() {
-        List<List<String>> netlink = parseNetlink();
-        Set<Integer> retval = new HashSet<Integer>();
-        for (List<String> i : netlink) {
-            // The PID is in column 3
-            int pid = Long.decode(i.get(2)).intValue();
-            if (new File("/proc/" + pid + "/cmdline").exists()) {
-                retval.add(pid);
-            }
-        }
-        return retval;
-    }
-
-    /**
-     * Parse /proc/net/netlink and return a List of lines
-     * (excluding the first line)
-     */
-    private static List<List<String>> parseNetlink() {
-        List<List<String>> retval = new ArrayList<List<String>>();
-        File netlink = new File("/proc/net/netlink");
-        Scanner scanner = null;
-        try {
-            scanner = new Scanner(netlink);
-            while(scanner.hasNextLine()) {
-                String line = scanner.nextLine().trim();
-                if (line.startsWith("sk")) {
-                    continue;
-                }
-
-                List<String> lineList = Arrays.asList(line.split("\\s+"));
-                retval.add(lineList);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        } finally {
-            if (scanner != null) {
-                scanner.close();
-            }
-        }
-        return retval;
-    }
-
-    private static byte[] getDiskAddedMessage(String path) {
-        try {
-            return ("@/foo\0ACTION=add\0SUBSYSTEM=block\0"
-                    + "DEVPATH=" + path + "\0MAJOR=179\0MINOR=12345"
-                    + "\0DEVTYPE=disk\0").getBytes("ASCII");
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static byte[] getPartitionAddedMessage(
-            String path, int partitionNum) {
-        try {
-            return ("@/foo\0ACTION=add\0SUBSYSTEM=block\0"
-                    + "DEVPATH=" + path + "\0MAJOR=179\0MINOR=12345"
-                    + "\0DEVTYPE=blah\0PARTN=" + partitionNum + "\0")
-                    .getBytes("ASCII");
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-    }
 }
diff --git a/tests/tests/speech/Android.mk b/tests/tests/speech/Android.mk
index 6bec012..3ab78b8 100755
--- a/tests/tests/speech/Android.mk
+++ b/tests/tests/speech/Android.mk
@@ -27,6 +27,7 @@
 
 LOCAL_PACKAGE_NAME := CtsSpeechTestCases
 
-LOCAL_SDK_VERSION := current
+# Needed for testing M API
+#LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java b/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
index 5e6bb41..88bdc74 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
@@ -20,12 +20,32 @@
 import android.speech.tts.SynthesisRequest;
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.TextToSpeechService;
+import android.speech.tts.TtsEngines;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Locale;
 
 /**
  * Stub implementation of {@link TextToSpeechService}. Used for testing the
  * TTS engine API.
  */
 public class StubTextToSpeechService extends TextToSpeechService {
+    private static final String LOG_TAG = "StubTextToSpeechService";
+
+    // Object that onSynthesizeText will #wait on, if set to non-null
+    public static volatile Object sSynthesizeTextWait;
+
+    private ArrayList<Locale> supportedLanguages = new ArrayList<Locale>();
+    private ArrayList<Locale> supportedCountries = new ArrayList<Locale>();
+    private ArrayList<Locale> GBFallbacks = new ArrayList<Locale>();
+
+    public StubTextToSpeechService() {
+        supportedLanguages.add(new Locale("eng"));
+        supportedCountries.add(new Locale("eng", "USA"));
+        supportedCountries.add(new Locale("eng", "GBR"));
+        GBFallbacks.add(new Locale("eng", "NZL"));
+    }
 
     @Override
     protected String[] onGetLanguage() {
@@ -34,12 +54,19 @@
 
     @Override
     protected int onIsLanguageAvailable(String lang, String country, String variant) {
-        return TextToSpeech.LANG_AVAILABLE;
+        if (supportedCountries.contains(new Locale(lang, country))) {
+            return TextToSpeech.LANG_COUNTRY_AVAILABLE;
+        }
+        if (supportedLanguages.contains(new Locale(lang))) {
+            return TextToSpeech.LANG_AVAILABLE;
+        }
+ 
+        return TextToSpeech.LANG_NOT_SUPPORTED;
     }
 
     @Override
     protected int onLoadLanguage(String lang, String country, String variant) {
-        return TextToSpeech.LANG_AVAILABLE;
+        return onIsLanguageAvailable(lang, country, variant);
     }
 
     @Override
@@ -51,6 +78,18 @@
         if (callback.start(16000, AudioFormat.ENCODING_PCM_16BIT, 1) != TextToSpeech.SUCCESS) {
             return;
         }
+
+        final Object synthesizeTextWait = sSynthesizeTextWait;
+        if (synthesizeTextWait != null) {
+            synchronized (synthesizeTextWait) {
+                try {
+                    synthesizeTextWait.wait(10000);  // 10s timeout
+                } catch (InterruptedException e) {
+                    Log.e(LOG_TAG, "onSynthesizeText wait interrupted", e);
+                }
+            }
+        }
+
         byte[] data = { 0x01, 0x2 };
         if (callback.audioAvailable(data, 0, data.length) != TextToSpeech.SUCCESS) {
             return;
@@ -60,4 +99,20 @@
         }
     }
 
+    @Override
+    public String onGetDefaultVoiceNameFor(String lang, String country, String variant) {
+        Locale locale = new Locale(lang, country);
+        if (supportedCountries.contains(locale)) {
+          return TtsEngines.normalizeTTSLocale(locale).toLanguageTag();
+        }
+        if (lang.equals("eng")) {
+            if (GBFallbacks.contains(new Locale(lang, country))) {
+                return "en-GB";
+            } else {
+                return "en-US";
+            }
+        }
+        return super.onGetDefaultVoiceNameFor(lang, country, variant);
+    }
+
 }
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java
index c19f6c0..7425ecf 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java
@@ -37,6 +37,7 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        StubTextToSpeechService.sSynthesizeTextWait = null;
         mTts = TextToSpeechWrapper.createTextToSpeechMockWrapper(getContext());
         assertNotNull(mTts);
     }
@@ -74,6 +75,31 @@
         assertTrue("speak() completion timeout", waitForUtterance());
     }
 
+    public void testSpeakStop() throws Exception {
+        final Object synthesizeTextWait = new Object();
+        StubTextToSpeechService.sSynthesizeTextWait = synthesizeTextWait;
+
+        getTts().stop();
+        final int iterations = 20;
+        for (int i = 0; i < iterations; i++) {
+            int result = getTts().speak(UTTERANCE, TextToSpeech.QUEUE_ADD, null,
+                    UTTERANCE_ID + Integer.toString(i));
+            assertEquals("speak() failed", TextToSpeech.SUCCESS, result);
+        }
+        getTts().stop();
+
+        // Wake up the Stubs #onSynthesizeSpeech (one that will be stopped in-progress)
+        synchronized (synthesizeTextWait) {
+          synthesizeTextWait.notify();
+        }
+
+        for (int i = 0; i < iterations; i++) {
+            assertTrue("speak() stop callback timeout", mTts.waitForStop(
+                    UTTERANCE_ID + Integer.toString(i)));
+        }
+    }
+
+
     public void testMediaPlayerFails() throws Exception {
         File sampleFile = new File(Environment.getExternalStorageDirectory(), "notsound.wav");
         try {
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
index 69acdd0..013a5ea 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
@@ -94,6 +94,25 @@
         return false;
     }
 
+    private void assertContainsEngine(String engine, List<TextToSpeech.EngineInfo> engines) {
+        for (TextToSpeech.EngineInfo engineInfo : engines) {
+            if (engineInfo.name.equals(engine)) {
+                return;
+            }
+        }
+        fail("Engine " + engine + " not found");
+    }
+
+    private HashMap<String, String> createParams() {
+        HashMap<String, String> params = new HashMap<String,String>();
+        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_ID);
+        return params;
+    }
+
+    private boolean waitForUtterance() throws InterruptedException {
+        return mTts.waitForComplete(UTTERANCE_ID);
+    }
+
     public void testSynthesizeToFile() throws Exception {
         if (mTts == null) {
             return;
@@ -124,6 +143,21 @@
         assertTrue("speak() completion timeout", waitForUtterance());
     }
 
+    public void testSpeakStop() throws Exception {
+        getTts().stop();
+        final int iterations = 20;
+        for (int i = 0; i < iterations; i++) {
+            int result = getTts().speak(SAMPLE_TEXT, TextToSpeech.QUEUE_ADD, null,
+                    UTTERANCE_ID + Integer.toString(i));
+            assertEquals("speak() failed", TextToSpeech.SUCCESS, result);
+        }
+        getTts().stop();
+        for (int i = 0; i < iterations; i++) {
+            assertTrue("speak() stop callback timeout", mTts.waitForStop(
+                    UTTERANCE_ID + Integer.toString(i)));
+        }
+    }
+
     public void testGetEnginesIncludesDefault() throws Exception {
         if (mTts == null) {
             return;
@@ -141,24 +175,4 @@
         assertNotNull("getEngines() returned null", engines);
         assertContainsEngine(TextToSpeechWrapper.MOCK_TTS_ENGINE, engines);
     }
-
-    private void assertContainsEngine(String engine, List<TextToSpeech.EngineInfo> engines) {
-        for (TextToSpeech.EngineInfo engineInfo : engines) {
-            if (engineInfo.name.equals(engine)) {
-                return;
-            }
-        }
-        fail("Engine " + engine + " not found");
-    }
-
-    private HashMap<String, String> createParams() {
-        HashMap<String, String> params = new HashMap<String,String>();
-        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_ID);
-        return params;
-    }
-
-    private boolean waitForUtterance() throws InterruptedException {
-        return mTts.waitForComplete(UTTERANCE_ID);
-    }
-
 }
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
index f0d55bf..9d460e2 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
@@ -19,9 +19,10 @@
 import android.media.MediaPlayer;
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.TextToSpeech.OnInitListener;
-import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
+import android.speech.tts.UtteranceProgressListener;
 import android.util.Log;
 
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Condition;
@@ -65,7 +66,7 @@
         if (!mInitListener.waitForInit()) {
             return false;
         }
-        mTts.setOnUtteranceCompletedListener(mUtteranceListener);
+        mTts.setOnUtteranceProgressListener(mUtteranceListener);
         return true;
     }
 
@@ -73,6 +74,10 @@
         return mUtteranceListener.waitForComplete(utteranceId);
     }
 
+    public boolean waitForStop(String utteranceId) throws InterruptedException {
+        return mUtteranceListener.waitForStop(utteranceId);
+    }
+
     public TextToSpeech getTts() {
         return mTts;
     }
@@ -139,12 +144,16 @@
     /**
      * Listener for waiting for utterance completion.
      */
-    private static class UtteranceWaitListener implements OnUtteranceCompletedListener {
+    private static class UtteranceWaitListener extends UtteranceProgressListener {
         private final Lock mLock = new ReentrantLock();
         private final Condition mDone  = mLock.newCondition();
+        private final HashSet<String> mStartedUtterances = new HashSet<String>();
+        private final HashSet<String> mStoppedUtterances = new HashSet<String>();
+        private final HashMap<String, Integer> mErredUtterances = new HashMap<String, Integer>();
         private final HashSet<String> mCompletedUtterances = new HashSet<String>();
 
-        public void onUtteranceCompleted(String utteranceId) {
+        @Override
+        public void onDone(String utteranceId) {
             mLock.lock();
             try {
                 mCompletedUtterances.add(utteranceId);
@@ -154,6 +163,49 @@
             }
         }
 
+        @Override
+        public void onError(String utteranceId) {
+            mLock.lock();
+            try {
+                mErredUtterances.put(utteranceId, -1);
+                mDone.signal();
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        @Override
+        public void onError(String utteranceId, int errorCode) {
+            mLock.lock();
+            try {
+                mErredUtterances.put(utteranceId, errorCode);
+                mDone.signal();
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        @Override
+        public void onStart(String utteranceId) {
+            mLock.lock();
+            try {
+                mStartedUtterances.add(utteranceId);
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        @Override
+        public void onStop(String utteranceId, boolean isStarted) {
+            mLock.lock();
+            try {
+                mStoppedUtterances.add(utteranceId);
+                mDone.signal();
+            } finally {
+                mLock.unlock();
+            }
+        }
+
         public boolean waitForComplete(String utteranceId)
                 throws InterruptedException {
             long timeOutNanos = TimeUnit.MILLISECONDS.toNanos(TTS_INIT_MAX_WAIT_TIME);
@@ -170,6 +222,23 @@
                 mLock.unlock();
             }
         }
+
+        public boolean waitForStop(String utteranceId)
+                throws InterruptedException {
+            long timeOutNanos = TimeUnit.MILLISECONDS.toNanos(TTS_INIT_MAX_WAIT_TIME);
+            mLock.lock();
+            try {
+                while (!mStoppedUtterances.remove(utteranceId)) {
+                    if (timeOutNanos <= 0) {
+                        return false;
+                    }
+                    timeOutNanos = mDone.awaitNanos(timeOutNanos);
+                }
+                return true;
+            } finally {
+                mLock.unlock();
+            }
+        }
     }
 
     /**
diff --git a/tests/tests/telephony/AndroidManifest.xml b/tests/tests/telephony/AndroidManifest.xml
index 31abf12..a87a54b 100644
--- a/tests/tests/telephony/AndroidManifest.xml
+++ b/tests/tests/telephony/AndroidManifest.xml
@@ -31,6 +31,9 @@
     <uses-permission android:name="android.permission.BLUETOOTH" />
 
     <application>
+        <provider android:name="android.telephony.cts.MmsPduProvider"
+                  android:authorities="telephonyctstest"
+                  android:grantUriPermissions="true" />
         <uses-library android:name="android.test.runner" />
     </application>
 
diff --git a/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java b/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
new file mode 100644
index 0000000..5b88525
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.telephony.cts;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.telephony.CellInfo;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * Test TelephonyManager.getAllCellInfo()
+ * <p>
+ * TODO(chesnutt): test onCellInfoChanged() once the implementation
+ * of async callbacks is complete (see http://b/13788638)
+ */
+public class CellInfoTest extends AndroidTestCase{
+    private final Object mLock = new Object();
+    private TelephonyManager mTelephonyManager;
+    private static ConnectivityManager mCm;
+    private static final String TAG = "android.telephony.cts.CellInfoTest";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mTelephonyManager =
+                (TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE);
+        mCm = (ConnectivityManager)getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+    }
+
+    public void testCellInfo() throws Throwable {
+        if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
+            Log.d(TAG, "Skipping test that requires ConnectivityManager.TYPE_MOBILE");
+            return;
+        }
+
+        // getAllCellInfo should never return null, and there should
+        // be at least one entry.
+        List<CellInfo> allCellInfo = mTelephonyManager.getAllCellInfo();
+        assertNotNull("TelephonyManager.getAllCellInfo() returned NULL!", allCellInfo);
+        assertTrue("TelephonyManager.getAllCellInfo() returned zero-length list!",
+            allCellInfo.size() > 0);
+    }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java b/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
index c1f5757..9205f0e 100644
--- a/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
@@ -60,6 +60,14 @@
             return;
         }
 
+        // getCellLocation should never return null,
+        // but that is allowed if the cell network type
+        // is LTE (since there is no LteCellLocation class)
+        if (mTelephonyManager.getNetworkType() != TelephonyManager.NETWORK_TYPE_LTE) {
+            assertNotNull("TelephonyManager.getCellLocation() returned null!",
+                mTelephonyManager.getCellLocation());
+        }
+
         CellLocation cl = CellLocation.getEmpty();
         if (cl instanceof GsmCellLocation) {
             GsmCellLocation gcl = (GsmCellLocation) cl;
diff --git a/tests/tests/telephony/src/android/telephony/cts/MmsPduProvider.java b/tests/tests/telephony/src/android/telephony/cts/MmsPduProvider.java
new file mode 100644
index 0000000..08164ee
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/MmsPduProvider.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.cts;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.text.TextUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+/**
+ * A simple provider to send MMS PDU to platform MMS service
+ */
+public class MmsPduProvider extends ContentProvider {
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        // Not supported
+        return null;
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        // Not supported
+        return null;
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        // Not supported
+        return null;
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        // Not supported
+        return 0;
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        // Not supported
+        return 0;
+    }
+
+    @Override
+    public ParcelFileDescriptor openFile(Uri uri, String fileMode) throws FileNotFoundException {
+        File file = new File(getContext().getCacheDir(), uri.getPath());
+        int mode = (TextUtils.equals(fileMode, "r") ? ParcelFileDescriptor.MODE_READ_ONLY :
+                ParcelFileDescriptor.MODE_WRITE_ONLY
+                        |ParcelFileDescriptor.MODE_TRUNCATE
+                        |ParcelFileDescriptor.MODE_CREATE);
+        return ParcelFileDescriptor.open(file, mode);
+    }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/MmsTest.java b/tests/tests/telephony/src/android/telephony/cts/MmsTest.java
new file mode 100644
index 0000000..176c50c
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/MmsTest.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.cts;
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.telephony.SmsManager;
+import android.telephony.TelephonyManager;
+import android.test.AndroidTestCase;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.google.android.mms.ContentType;
+import com.google.android.mms.InvalidHeaderValueException;
+import com.google.android.mms.pdu.CharacterSets;
+import com.google.android.mms.pdu.EncodedStringValue;
+import com.google.android.mms.pdu.GenericPdu;
+import com.google.android.mms.pdu.PduBody;
+import com.google.android.mms.pdu.PduComposer;
+import com.google.android.mms.pdu.PduHeaders;
+import com.google.android.mms.pdu.PduParser;
+import com.google.android.mms.pdu.PduPart;
+import com.google.android.mms.pdu.SendConf;
+import com.google.android.mms.pdu.SendReq;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Random;
+
+/**
+ * Test sending MMS using {@link android.telephony.SmsManager}.
+ */
+public class MmsTest extends AndroidTestCase {
+    private static final String TAG = "MmsTest";
+
+    private static final String ACTION_MMS_SENT = "CTS_MMS_SENT_ACTION";
+    private static final long DEFAULT_EXPIRY_TIME = 7 * 24 * 60 * 60;
+    private static final int DEFAULT_PRIORITY = PduHeaders.PRIORITY_NORMAL;
+
+    private static final String SUBJECT = "CTS MMS Test";
+    private static final String MESSAGE_BODY = "CTS MMS test message body";
+    private static final String TEXT_PART_FILENAME = "text_0.txt";
+    private static final String sSmilText =
+            "<smil>" +
+                    "<head>" +
+                        "<layout>" +
+                            "<root-layout/>" +
+                            "<region height=\"100%%\" id=\"Text\" left=\"0%%\" top=\"0%%\" width=\"100%%\"/>" +
+                        "</layout>" +
+                    "</head>" +
+                    "<body>" +
+                        "<par dur=\"8000ms\">" +
+                            "<text src=\"%s\" region=\"Text\"/>" +
+                        "</par>" +
+                    "</body>" +
+            "</smil>";
+
+    private static final long SENT_TIMEOUT = 1000 * 60 * 5; // 5 minutes
+
+    private static final String PROVIDER_AUTHORITY = "telephonyctstest";
+
+    private Random mRandom;
+    private SentReceiver mSentReceiver;
+    private TelephonyManager mTelephonyManager;
+
+    private static class SentReceiver extends BroadcastReceiver {
+        private final Object mLock;
+        private boolean mSuccess;
+        private boolean mDone;
+
+        public SentReceiver() {
+            mLock = new Object();
+            mSuccess = false;
+            mDone = false;
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.i(TAG, "Action " + intent.getAction());
+            if (!ACTION_MMS_SENT.equals(intent.getAction())) {
+                return;
+            }
+            final int resultCode = getResultCode();
+            if (resultCode == Activity.RESULT_OK) {
+                final byte[] response = intent.getByteArrayExtra(SmsManager.EXTRA_MMS_DATA);
+                if (response != null) {
+                    final GenericPdu pdu = new PduParser(
+                            response, shouldParseContentDisposition()).parse();
+                    if (pdu != null && pdu instanceof SendConf) {
+                        final SendConf sendConf = (SendConf) pdu;
+                        if (sendConf.getResponseStatus() == PduHeaders.RESPONSE_STATUS_OK) {
+                            mSuccess = true;
+                        } else {
+                            Log.e(TAG, "SendConf response status=" + sendConf.getResponseStatus());
+                        }
+                    } else {
+                        Log.e(TAG, "Not a SendConf: " +
+                                (pdu != null ? pdu.getClass().getCanonicalName() : "NULL"));
+                    }
+                } else {
+                    Log.e(TAG, "Empty response");
+                }
+            } else {
+                Log.e(TAG, "Failure result=" + resultCode);
+                if (resultCode == SmsManager.MMS_ERROR_HTTP_FAILURE) {
+                    final int httpError = intent.getIntExtra(SmsManager.EXTRA_MMS_HTTP_STATUS, 0);
+                    Log.e(TAG, "HTTP failure=" + httpError);
+                }
+            }
+            synchronized (mLock) {
+                mDone = true;
+                mLock.notify();
+            }
+        }
+
+        public boolean waitForSuccess(long timeout) {
+            synchronized(mLock) {
+                final long startTime = SystemClock.elapsedRealtime();
+                long waitTime = timeout;
+                while (waitTime > 0) {
+                    try {
+                        mLock.wait(waitTime);
+                    } catch (InterruptedException e) {
+                        // Ignore
+                    }
+                    if (mDone) {
+                        break;
+                    }
+                    waitTime = timeout - (SystemClock.elapsedRealtime() - startTime);
+                }
+                Log.i(TAG, "Wait for sent: done=" + mDone + ", success=" + mSuccess);
+                return mDone && mSuccess;
+            }
+
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mRandom = new Random();
+        mTelephonyManager =
+                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+    }
+
+    public void testSendMmsMessage() {
+        if (!mTelephonyManager.isSmsCapable()) {
+            Log.i(TAG, "testSendMmsMessage skipped: not SMS capable");
+            return;
+        }
+
+        Log.i(TAG, "testSendMmsMessage");
+        final Context context = getContext();
+        // Register sent receiver
+        mSentReceiver = new SentReceiver();
+        context.registerReceiver(mSentReceiver, new IntentFilter(ACTION_MMS_SENT));
+        // Create local provider file for sending PDU
+        final String fileName = "send." + String.valueOf(Math.abs(mRandom.nextLong())) + ".dat";
+        final File sendFile = new File(context.getCacheDir(), fileName);
+        final String selfNumber = getSimNumber(context);
+        assertTrue(!TextUtils.isEmpty(selfNumber));
+        final byte[] pdu = buildPdu(context, selfNumber, SUBJECT, MESSAGE_BODY);
+        assertNotNull(pdu);
+        assertTrue(writePdu(sendFile, pdu));
+        final Uri contentUri = (new Uri.Builder())
+                .authority(PROVIDER_AUTHORITY)
+                .path(fileName)
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .build();
+        // Send
+        final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+                context, 0, new Intent(ACTION_MMS_SENT), 0);
+        SmsManager.getDefault().sendMultimediaMessage(context,
+                contentUri, null/*locationUrl*/, null/*configOverrides*/, pendingIntent);
+        assertTrue(mSentReceiver.waitForSuccess(SENT_TIMEOUT));
+        sendFile.delete();
+    }
+
+    private static boolean writePdu(File file, byte[] pdu) {
+        FileOutputStream writer = null;
+        try {
+            writer = new FileOutputStream(file);
+            writer.write(pdu);
+            return true;
+        } catch (final IOException e) {
+            return false;
+        } finally {
+            if (writer != null) {
+                try {
+                    writer.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
+
+    private byte[] buildPdu(Context context, String selfNumber, String subject, String text) {
+        final SendReq req = new SendReq();
+        // From, per spec
+        req.setFrom(new EncodedStringValue(selfNumber));
+        // To
+        final String[] recipients = new String[1];
+        recipients[0] = selfNumber;
+        final EncodedStringValue[] encodedNumbers = EncodedStringValue.encodeStrings(recipients);
+        if (encodedNumbers != null) {
+            req.setTo(encodedNumbers);
+        }
+        // Subject
+        if (!TextUtils.isEmpty(subject)) {
+            req.setSubject(new EncodedStringValue(subject));
+        }
+        // Date
+        req.setDate(System.currentTimeMillis() / 1000);
+        // Body
+        final PduBody body = new PduBody();
+        // Add text part. Always add a smil part for compatibility, without it there
+        // may be issues on some carriers/client apps
+        final int size = addTextPart(body, text, true/* add text smil */);
+        req.setBody(body);
+        // Message size
+        req.setMessageSize(size);
+        // Message class
+        req.setMessageClass(PduHeaders.MESSAGE_CLASS_PERSONAL_STR.getBytes());
+        // Expiry
+        req.setExpiry(DEFAULT_EXPIRY_TIME);
+        // The following set methods throw InvalidHeaderValueException
+        try {
+            // Priority
+            req.setPriority(DEFAULT_PRIORITY);
+            // Delivery report
+            req.setDeliveryReport(PduHeaders.VALUE_NO);
+            // Read report
+            req.setReadReport(PduHeaders.VALUE_NO);
+        } catch (InvalidHeaderValueException e) {
+            return null;
+        }
+
+        return new PduComposer(context, req).make();
+    }
+
+    private static int addTextPart(PduBody pb, String message, boolean addTextSmil) {
+        final PduPart part = new PduPart();
+        // Set Charset if it's a text media.
+        part.setCharset(CharacterSets.UTF_8);
+        // Set Content-Type.
+        part.setContentType(ContentType.TEXT_PLAIN.getBytes());
+        // Set Content-Location.
+        part.setContentLocation(TEXT_PART_FILENAME.getBytes());
+        int index = TEXT_PART_FILENAME.lastIndexOf(".");
+        String contentId = (index == -1) ? TEXT_PART_FILENAME
+                : TEXT_PART_FILENAME.substring(0, index);
+        part.setContentId(contentId.getBytes());
+        part.setData(message.getBytes());
+        pb.addPart(part);
+        if (addTextSmil) {
+            final String smil = String.format(sSmilText, TEXT_PART_FILENAME);
+            addSmilPart(pb, smil);
+        }
+        return part.getData().length;
+    }
+
+    private static void addSmilPart(PduBody pb, String smil) {
+        final PduPart smilPart = new PduPart();
+        smilPart.setContentId("smil".getBytes());
+        smilPart.setContentLocation("smil.xml".getBytes());
+        smilPart.setContentType(ContentType.APP_SMIL.getBytes());
+        smilPart.setData(smil.getBytes());
+        pb.addPart(0, smilPart);
+    }
+
+    private static String getSimNumber(Context context) {
+        final TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(
+                Context.TELEPHONY_SERVICE);
+        return telephonyManager.getLine1Number();
+    }
+
+    private static boolean shouldParseContentDisposition() {
+        return SmsManager
+                .getDefault()
+                .getCarrierConfigValues()
+                .getBoolean(SmsManager.MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION, true);
+    }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java b/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
index d96743c..f49a820 100644
--- a/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
@@ -28,7 +28,10 @@
 import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
 import android.text.Editable;
+import android.text.Spannable;
+import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
+import android.text.style.TtsSpan;
 
 import java.util.Locale;
 
@@ -326,4 +329,38 @@
         assertEquals("5567861616", PhoneNumberUtils.convertAndStrip("٥‎ ٥‎٦‎ ٧‎ ٨‎ ٦‎ ١‎ ٦‎ ١‎ ٦‎"));
 
     }
+
+    public void testGetPhoneTtsSpan() {
+        // Setup: phone number without a country code. Lets keep coverage minimal to avoid
+        // exercising the underlying PhoneNumberUtil or constraining localization changes.
+        String phoneNumber = "6512223333";
+        // Execute
+        TtsSpan ttsSpan = PhoneNumberUtils.createTtsSpan(phoneNumber);
+        // Verify: the created TtsSpan contains the phone number.
+        assertEquals("6512223333", ttsSpan.getArgs().get(TtsSpan.ARG_NUMBER_PARTS));
+    }
+
+    public void testAddPhoneTtsSpan() {
+        // Setup: phone number without a country code. Lets keep coverage minimal to avoid
+        // exercising the underlying PhoneNumberUtil or constraining localization changes.
+        Spannable spannable = new SpannableString("Hello 6502223333");
+        // Execute
+        PhoneNumberUtils.addTtsSpan(spannable, 5, spannable.length());
+        // Verify: the Spannable is annotated with a TtsSpan in the correct location.
+        TtsSpan[] ttsSpans = spannable.getSpans(5, spannable.length() - 1, TtsSpan.class);
+        assertEquals(1, ttsSpans.length);
+        assertEquals("6502223333", ttsSpans[0].getArgs().get(TtsSpan.ARG_NUMBER_PARTS));
+    }
+
+    public void testGetPhoneTtsSpannable() {
+        // Setup: phone number without a country code. Lets keep coverage minimal to avoid
+        // exercising the underlying PhoneNumberUtil or constraining localization changes.
+        CharSequence phoneNumber = "6512223333";
+        // Execute
+        Spannable spannable = (Spannable) PhoneNumberUtils.createTtsSpannable(phoneNumber);
+        // Verify: returned char sequence contains a TtsSpan with the phone number in it
+        TtsSpan[] ttsSpans = spannable.getSpans(0, spannable.length() - 1, TtsSpan.class);
+        assertEquals(1, ttsSpans.length);
+        assertEquals("6512223333", ttsSpans[0].getArgs().get(TtsSpan.ARG_NUMBER_PARTS));
+    }
 }
diff --git a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
index cb9d96c..3279abe 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
@@ -221,7 +221,7 @@
     public void testGetPreferredNetworkType() {
         try {
             if (isSimCardPresent()) {
-                TelephonyManager.getDefault().getPreferredNetworkType();
+                TelephonyManager.getDefault().getPreferredNetworkType(0);
                 fail("Expected SecurityException. App doesn't have carrier privileges.");
             }
         } catch (SecurityException expected) {
@@ -266,4 +266,24 @@
         } catch (SecurityException expected) {
         }
     }
+
+    /**
+     * Tests the TelephonyManager.notifyCarrierNetworkChange() API to make sure a
+     * SecurityException is thrown since the test APK is not signed by a certificate on the SIM.
+     */
+    public void testNotifyCarrierNetworkChange() {
+        try {
+            if (isSimCardPresent()) {
+                TelephonyManager.getDefault().notifyCarrierNetworkChange(true /* active */);
+                fail("Expected SecurityException for notifyCarrierNetworkChange(true)");
+            }
+        } catch (SecurityException expected) {}
+
+        try {
+            if (isSimCardPresent()) {
+                TelephonyManager.getDefault().notifyCarrierNetworkChange(false /* active */);
+                fail("Expected SecurityException for notifyCarrierNetworkChange(false)");
+            }
+        } catch (SecurityException expected) {}
+    }
 }
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
index 39f5177..d3d15a5 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
@@ -49,6 +49,10 @@
         "three separate messages.This is a very long text. This text should be broken " +
         "into three separate messages.This is a very long text. This text should be " +
         "broken into three separate messages.";;
+    private static final String LONG_TEXT_WITH_32BIT_CHARS =
+        "Long dkkshsh jdjsusj kbsksbdf jfkhcu hhdiwoqiwyrygrvn?*?*!\";:'/,."
+        + "__?9#9292736&4;\"$+$+((]\\[\\℅©℅™^®°¥°¥=¢£}}£∆~¶~÷|√×."
+        + " 😯😆😉😇😂😀👕🎓😀👙🐕🐀🐶🐰🐩⛪⛲ ";
 
     private static final String SMS_SEND_ACTION = "CTS_SMS_SEND_ACTION";
     private static final String SMS_DELIVERY_ACTION = "CTS_SMS_DELIVERY_ACTION";
@@ -209,17 +213,28 @@
     public void testDivideMessage() {
         ArrayList<String> dividedMessages = divideMessage(LONG_TEXT);
         assertNotNull(dividedMessages);
-        int numParts;
         if (TelephonyUtils.isSkt(mTelephonyManager)) {
-            assertTrue(isComplete(dividedMessages, 5) || isComplete(dividedMessages, 3));
+            assertTrue(isComplete(dividedMessages, 5, LONG_TEXT)
+                    || isComplete(dividedMessages, 3, LONG_TEXT));
         } else if (TelephonyUtils.isKt(mTelephonyManager)) {
-            assertTrue(isComplete(dividedMessages, 4) || isComplete(dividedMessages, 3));
+            assertTrue(isComplete(dividedMessages, 4, LONG_TEXT)
+                    || isComplete(dividedMessages, 3, LONG_TEXT));
         } else {
-            assertTrue(isComplete(dividedMessages, 3));
+            assertTrue(isComplete(dividedMessages, 3, LONG_TEXT));
         }
     }
 
-    private boolean isComplete(List<String> dividedMessages, int numParts) {
+    public void testDivideUnicodeMessage() {
+        ArrayList<String> dividedMessages = divideMessage(LONG_TEXT_WITH_32BIT_CHARS);
+        assertNotNull(dividedMessages);
+        assertTrue(isComplete(dividedMessages, 3, LONG_TEXT_WITH_32BIT_CHARS));
+        for (String messagePiece : dividedMessages) {
+            assertFalse(Character.isHighSurrogate(
+                    messagePiece.charAt(messagePiece.length() - 1)));
+        }
+    }
+
+    private boolean isComplete(List<String> dividedMessages, int numParts, String longText) {
         if (dividedMessages.size() != numParts) {
             return false;
         }
@@ -228,7 +243,7 @@
         for (int i = 0; i < numParts; i++) {
             actualMessage += dividedMessages.get(i);
         }
-        return LONG_TEXT.equals(actualMessage);
+        return longText.equals(actualMessage);
     }
 
     public void testSendMessages() throws InterruptedException {
@@ -369,9 +384,10 @@
                 Bundle bundle = intent.getExtras();
                 if (bundle != null) {
                     Object[] obj = (Object[]) bundle.get("pdus");
+                    String format = bundle.getString("format");
                     SmsMessage[] message = new SmsMessage[obj.length];
                     for (int i = 0; i < obj.length; i++) {
-                        message[i] = SmsMessage.createFromPdu((byte[]) obj[i]);
+                        message[i] = SmsMessage.createFromPdu((byte[]) obj[i], format);
                     }
 
                     for (SmsMessage currentMessage : message) {
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
index ff7b097..d90e394 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
@@ -62,6 +62,10 @@
     private static final long TIMESTAMP_MILLIS = 1149631383000l;
     private static final int SEPTETS_SKT = 80;
     private static final int SEPTETS_KT = 90;
+    private static final String LONG_TEXT_WITH_32BIT_CHARS =
+        "Long dkkshsh jdjsusj kbsksbdf jfkhcu hhdiwoqiwyrygrvn?*?*!\";:'/,."
+        + "__?9#9292736&4;\"$+$+((]\\[\\℅©℅™^®°¥°¥=¢£}}£∆~¶~÷|√×."
+        + " 😯😆😉😇😂😀👕🎓😀👙🐕🐀🐶🐰🐩⛪⛲ ";
 
     @Override
     protected void setUp() throws Exception {
@@ -71,7 +75,6 @@
         mPackageManager = getContext().getPackageManager();
     }
 
-    @SuppressWarnings("deprecation")
     public void testCreateFromPdu() throws Exception {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                 || mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CDMA)) {
@@ -80,7 +83,8 @@
         }
 
         String pdu = "07916164260220F0040B914151245584F600006060605130308A04D4F29C0E";
-        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu),
+                SmsMessage.FORMAT_3GPP);
         assertEquals(SCA1, sms.getServiceCenterAddress());
         assertEquals(OA1, sms.getOriginatingAddress());
         assertEquals(MESSAGE_BODY1, sms.getMessageBody());
@@ -88,7 +92,7 @@
         int[] result = SmsMessage.calculateLength(sms.getMessageBody(), true);
         assertEquals(SMS_NUMBER1, result[0]);
         assertEquals(sms.getMessageBody().length(), result[1]);
-        assertRemaining(sms.getMessageBody().length(), result[2]);
+        assertRemaining(sms.getMessageBody().length(), result[2], SmsMessage.MAX_USER_DATA_SEPTETS);
         assertEquals(SmsMessage.ENCODING_7BIT, result[3]);
         assertEquals(pdu, toHexString(sms.getPdu()));
 
@@ -106,13 +110,13 @@
         assertEquals(TIMESTAMP_MILLIS, sms.getTimestampMillis());
 
         // Test create from null Pdu
-        sms = SmsMessage.createFromPdu(null);
+        sms = SmsMessage.createFromPdu(null, SmsMessage.FORMAT_3GPP);
         assertNotNull(sms);
 
-        //Test create from long Pdu
+        // Test create from long Pdu
         pdu = "07912160130310F2040B915121927786F300036060924180008A0DA"
             + "8695DAC2E8FE9296A794E07";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertEquals(SCA2, sms.getServiceCenterAddress());
         assertEquals(OA2, sms.getOriginatingAddress());
         assertEquals(MESSAGE_BODY2, sms.getMessageBody());
@@ -120,30 +124,30 @@
         result = SmsMessage.calculateLength(msgBody, false);
         assertEquals(SMS_NUMBER2, result[0]);
         assertEquals(sms.getMessageBody().length(), result[1]);
-        assertRemaining(sms.getMessageBody().length(), result[2]);
+        assertRemaining(sms.getMessageBody().length(), result[2], SmsMessage.MAX_USER_DATA_SEPTETS);
         assertEquals(SmsMessage.ENCODING_7BIT, result[3]);
 
         // Test createFromPdu Ucs to Sms
         pdu = "07912160130300F4040B914151245584"
             + "F600087010807121352B10212200A900AE00680065006C006C006F";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertEquals(MESSAGE_BODY3, sms.getMessageBody());
         result = SmsMessage.calculateLength(sms.getMessageBody(), true);
         assertEquals(SMS_NUMBER3, result[0]);
         assertEquals(sms.getMessageBody().length(), result[1]);
-        assertRemaining(sms.getMessageBody().length(), result[2]);
+        assertRemaining(sms.getMessageBody().length(), result[2], SmsMessage.MAX_USER_DATA_SEPTETS);
         assertEquals(SmsMessage.ENCODING_7BIT, result[3]);
     }
 
-    private void assertRemaining(int messageLength, int remaining) {
+    private void assertRemaining(int messageLength, int remaining, int maxChars) {
         if (TelephonyUtils.isSkt(mTelephonyManager)) {
             assertTrue(checkRemaining(SEPTETS_SKT, messageLength, remaining)
-                    || checkRemaining(SmsMessage.MAX_USER_DATA_SEPTETS, messageLength, remaining));
+                    || checkRemaining(maxChars, messageLength, remaining));
         } else if (TelephonyUtils.isKt(mTelephonyManager)) {
             assertTrue(checkRemaining(SEPTETS_KT, messageLength, remaining)
-                    || checkRemaining(SmsMessage.MAX_USER_DATA_SEPTETS, messageLength, remaining));
+                    || checkRemaining(maxChars, messageLength, remaining));
         } else {
-            assertTrue(checkRemaining(SmsMessage.MAX_USER_DATA_SEPTETS, messageLength, remaining));
+            assertTrue(checkRemaining(maxChars, messageLength, remaining));
         }
     }
 
@@ -160,7 +164,8 @@
 
         // "set MWI flag"
         String pdu = "07912160130310F20404D0110041006060627171118A0120";
-        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu),
+                SmsMessage.FORMAT_3GPP);
         assertTrue(sms.isReplace());
         assertEquals(OA3, sms.getOriginatingAddress());
         assertEquals(MESSAGE_BODY4, sms.getMessageBody());
@@ -168,12 +173,12 @@
 
         // "clear mwi flag"
         pdu = "07912160130310F20404D0100041006021924193352B0120";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertTrue(sms.isMWIClearMessage());
 
         // "clear MWI flag"
         pdu = "07912160130310F20404D0100041006060627161058A0120";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertTrue(sms.isReplace());
         assertEquals(OA4, sms.getOriginatingAddress());
         assertEquals(MESSAGE_BODY5, sms.getMessageBody());
@@ -181,13 +186,13 @@
 
         // "set MWI flag"
         pdu = "07912180958750F84401800500C87020026195702B06040102000200";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertTrue(sms.isMWISetMessage());
         assertTrue(sms.isMwiDontStore());
 
         // "clear mwi flag"
         pdu = "07912180958750F84401800500C07020027160112B06040102000000";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
 
         assertTrue(sms.isMWIClearMessage());
         assertTrue(sms.isMwiDontStore());
@@ -206,7 +211,8 @@
             + "66C414141414D7741414236514141414141008D908918802B3135313232393737"
             + "3638332F545950453D504C4D4E008A808E022B918805810306977F83687474703"
             + "A2F2F36";
-        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu),
+                SmsMessage.FORMAT_3GPP);
         byte[] userData = sms.getUserData();
         assertNotNull(userData);
     }
@@ -265,7 +271,8 @@
         String pdu = "07914151551512f204038105f300007011103164638a28e6f71b50c687db" +
                          "7076d9357eb7412f7a794e07cdeb6275794c07bde8e5391d247e93f3";
 
-        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu),
+                SmsMessage.FORMAT_3GPP);
         assertEquals(SCA4, sms.getServiceCenterAddress());
         assertTrue(sms.isEmail());
         assertEquals(EMAIL_ADD, sms.getEmailFrom());
@@ -277,7 +284,7 @@
 
         pdu = "07914151551512f204038105f400007011103105458a29e6f71b50c687db" +
                         "7076d9357eb741af0d0a442fcfe9c23739bfe16d289bdee6b5f1813629";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertEquals(SCA3, sms.getServiceCenterAddress());
         assertTrue(sms.isEmail());
         assertEquals(OA, sms.getDisplayOriginatingAddress());
@@ -286,6 +293,22 @@
         assertEquals(MB, sms.getEmailBody());
     }
 
+    public void testCalculateLength() throws Exception {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        int[] result = SmsMessage.calculateLength(LONG_TEXT_WITH_32BIT_CHARS, false);
+        assertEquals(3, result[0]);
+        assertEquals(LONG_TEXT_WITH_32BIT_CHARS.length(), result[1]);
+        assertRemaining(LONG_TEXT_WITH_32BIT_CHARS.length(), result[2],
+                // 3 parts, each with (SmsMessage.MAX_USER_DATA_BYTES_WITH_HEADER / 2) 16-bit
+                // characters. We need to subtract one because a 32-bit character crosses the
+                // boundary of 2 parts.
+                3 * SmsMessage.MAX_USER_DATA_BYTES_WITH_HEADER / 2 - 1);
+        assertEquals(SmsMessage.ENCODING_16BIT, result[3]);
+    }
+
     private final static char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
             'A', 'B', 'C', 'D', 'E', 'F' };
 
diff --git a/tests/tests/text/src/android/text/cts/BidiFormatterTest.java b/tests/tests/text/src/android/text/cts/BidiFormatterTest.java
index 645ab5b..5ace8b2 100644
--- a/tests/tests/text/src/android/text/cts/BidiFormatterTest.java
+++ b/tests/tests/text/src/android/text/cts/BidiFormatterTest.java
@@ -107,6 +107,9 @@
     }
 
     public void testUnicodeWrap() {
+        // Make sure an input of null doesn't crash anything.
+        assertNull(LTR_FMT.unicodeWrap(null));
+
         // Uniform directionality in opposite context.
         assertEquals("uniform dir opposite to LTR context",
                 RLE + "." + HE + "." + PDF + LRM,
diff --git a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
index b4fb8ab..3a64658 100644
--- a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
+++ b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
@@ -18,11 +18,20 @@
 
 import android.test.AndroidTestCase;
 import android.text.Editable;
+import android.text.GetChars;
+import android.text.GraphicsOperations;
+import android.text.Layout.Alignment;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
+import android.text.SpannedString;
 import android.text.StaticLayout;
 import android.text.TextDirectionHeuristics;
 import android.text.TextPaint;
 import android.text.TextUtils;
-import android.text.Layout.Alignment;
+
+import java.text.Normalizer;
+import java.util.ArrayList;
+import java.util.List;
 
 public class StaticLayoutTest extends AndroidTestCase {
     private static final float SPACE_MULTI = 1.0f;
@@ -427,4 +436,409 @@
         assertTrue(layout.getLineContainsTab(0));
 
     }
+
+    // String wrapper for testing not well known implementation of CharSequence.
+    private class FakeCharSequence implements CharSequence {
+        private String mStr;
+
+        public FakeCharSequence(String str) {
+            mStr = str;
+        }
+
+        @Override
+        public char charAt(int index) {
+            return mStr.charAt(index);
+        }
+
+        @Override
+        public int length() {
+            return mStr.length();
+        }
+
+        @Override
+        public CharSequence subSequence(int start, int end) {
+            return mStr.subSequence(start, end);
+        }
+
+        @Override
+        public String toString() {
+            return mStr;
+        }
+    };
+
+    private List<CharSequence> buildTestCharSequences(String testString, Normalizer.Form[] forms) {
+        List<CharSequence> result = new ArrayList<CharSequence>();
+
+        List<String> normalizedStrings = new ArrayList<String>();
+        for (Normalizer.Form form: forms) {
+            normalizedStrings.add(Normalizer.normalize(testString, form));
+        }
+
+        for (String str: normalizedStrings) {
+            result.add(str);
+            result.add(new SpannedString(str));
+            result.add(new SpannableString(str));
+            result.add(new SpannableStringBuilder(str));  // as a GraphicsOperations implementation.
+            result.add(new FakeCharSequence(str));  // as a not well known implementation.
+        }
+        return result;
+    }
+
+    private String buildTestMessage(CharSequence seq) {
+        String normalized;
+        if (Normalizer.isNormalized(seq, Normalizer.Form.NFC)) {
+            normalized = "NFC";
+        } else if (Normalizer.isNormalized(seq, Normalizer.Form.NFD)) {
+            normalized = "NFD";
+        } else if (Normalizer.isNormalized(seq, Normalizer.Form.NFKC)) {
+            normalized = "NFKC";
+        } else if (Normalizer.isNormalized(seq, Normalizer.Form.NFKD)) {
+            normalized = "NFKD";
+        } else {
+            throw new IllegalStateException("Normalized form is not NFC/NFD/NFKC/NFKD");
+        }
+
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < seq.length(); ++i) {
+            builder.append(String.format("0x%04X ", Integer.valueOf(seq.charAt(i))));
+        }
+
+        return "testString: \"" + seq.toString() + "\"[" + builder.toString() + "]" +
+                ", class: " + seq.getClass().getName() +
+                ", Normalization: " + normalized;
+    }
+
+    public void testGetOffset_ASCII() {
+        String testStrings[] = { "abcde", "ab\ncd", "ab\tcd", "ab\n\nc", "ab\n\tc" };
+
+        for (String testString: testStrings) {
+            for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+                StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                        DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+                String testLabel = buildTestMessage(seq);
+
+                assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+                assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+                assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+                assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+                assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+                assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+
+                assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+                assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+                assertEquals(testLabel, 3, layout.getOffsetToRightOf(2));
+                assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+                assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+                assertEquals(testLabel, 5, layout.getOffsetToRightOf(5));
+            }
+        }
+
+        String testString = "ab\r\nde";
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(6));
+
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(6));
+        }
+    }
+
+    public void testGetOffset_UNICODE() {
+        String testStrings[] = new String[] {
+              // Cyrillic alphabets.
+              "\u0410\u0411\u0412\u0413\u0414",
+              // Japanese Hiragana Characters.
+              "\u3042\u3044\u3046\u3048\u304A",
+        };
+
+        for (String testString: testStrings) {
+            for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+                StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                        DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+                String testLabel = buildTestMessage(seq);
+
+                assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+                assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+                assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+                assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+                assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+                assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+
+                assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+                assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+                assertEquals(testLabel, 3, layout.getOffsetToRightOf(2));
+                assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+                assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+                assertEquals(testLabel, 5, layout.getOffsetToRightOf(5));
+            }
+        }
+    }
+
+    public void testGetOffset_UNICODE_Normalization() {
+        // "A" with acute, circumflex, tilde, diaeresis, ring above.
+        String testString = "\u00C1\u00C2\u00C3\u00C4\u00C5";
+        Normalizer.Form[] oneUnicodeForms = { Normalizer.Form.NFC, Normalizer.Form.NFKC };
+        for (CharSequence seq: buildTestCharSequences(testString, oneUnicodeForms)) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(5));
+        }
+
+        Normalizer.Form[] twoUnicodeForms = { Normalizer.Form.NFD, Normalizer.Form.NFKD };
+        for (CharSequence seq: buildTestCharSequences(testString, twoUnicodeForms)) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(7));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(8));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(9));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(10));
+
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 8, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 8, layout.getOffsetToRightOf(7));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(8));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(9));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(10));
+        }
+    }
+
+    public void testGetOffset_UNICODE_SurrogatePairs() {
+        // Emoticons for surrogate pairs tests.
+        String testString =
+                "\uD83D\uDE00\uD83D\uDE01\uD83D\uDE02\uD83D\uDE03\uD83D\uDE04";
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(7));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(8));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(9));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(10));
+
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 8, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 8, layout.getOffsetToRightOf(7));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(8));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(9));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(10));
+        }
+    }
+
+    public void testGetOffset_UNICODE_Thai() {
+        // Thai Characters. The expected cursorable boundary is
+        // | \u0E02 | \u0E2D | \u0E1A | \u0E04\u0E38 | \u0E13 |
+        String testString = "\u0E02\u0E2D\u0E1A\u0E04\u0E38\u0E13";
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(6));
+
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(6));
+        }
+    }
+
+    public void testGetOffset_UNICODE_Hebrew() {
+        String testString = "\u05DE\u05E1\u05E2\u05D3\u05D4"; // Hebrew Characters
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN,
+                    TextDirectionHeuristics.RTL, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(5));
+
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(5));
+        }
+    }
+
+    public void testGetOffset_UNICODE_Arabic() {
+        // Arabic Characters. The expected cursorable boundary is
+        // | \u0623 \u064F | \u0633 \u0652 | \u0631 \u064E | \u0629 \u064C |";
+        String testString = "\u0623\u064F\u0633\u0652\u0631\u064E\u0629\u064C";
+
+        Normalizer.Form[] oneUnicodeForms = { Normalizer.Form.NFC, Normalizer.Form.NFKC };
+        for (CharSequence seq: buildTestCharSequences(testString, oneUnicodeForms)) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(7));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(8));
+
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(7));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(8));
+        }
+    }
+
+    public void testGetOffset_UNICODE_Bidi() {
+        // String having RTL characters and LTR characters
+
+        // LTR Context
+        // The first and last two characters are LTR characters.
+        String testString = "\u0061\u0062\u05DE\u05E1\u05E2\u0063\u0064";
+        // Logical order: [L1] [L2] [R1] [R2] [R3] [L3] [L4]
+        //               0    1    2    3    4    5    6    7
+        // Display order: [L1] [L2] [R3] [R2] [R1] [L3] [L4]
+        //               0    1    2    4    3    5    6    7
+        // [L?] means ?th LTR character and [R?] means ?th RTL character.
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(7));
+
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 7, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 7, layout.getOffsetToRightOf(7));
+        }
+
+        // RTL Context
+        // The first and last two characters are RTL characters.
+        String testString2 = "\u05DE\u05E1\u0063\u0064\u0065\u05DE\u05E1";
+        // Logical order: [R1] [R2] [L1] [L2] [L3] [R3] [R4]
+        //               0    1    2    3    4    5    6    7
+        // Display order: [R4] [R3] [L1] [L2] [L3] [R2] [R1]
+        //               7    6    5    3    4    2    1    0
+        // [L?] means ?th LTR character and [R?] means ?th RTL character.
+        for (CharSequence seq: buildTestCharSequences(testString2, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 7, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 7, layout.getOffsetToLeftOf(7));
+
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(7));
+        }
+    }
 }
diff --git a/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
index 34ed2dc..ba8bad5 100644
--- a/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
@@ -35,25 +35,92 @@
     private static final CharSequence TEST_STRING = "123456";
 
     public void testBackspace() {
-        final Editable content = Editable.Factory.getInstance().newEditable(TEST_STRING);
+        testBackspace(0);
+    }
+
+    private void testBackspace(int modifiers) {
         final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
+        final KeyEvent event = getKey(KeyEvent.KEYCODE_DEL, modifiers);
+        Editable content = Editable.Factory.getInstance().newEditable(TEST_STRING);
 
         // Nothing to delete when the cursor is at the beginning.
-        final KeyEvent delKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
         prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
-        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
         assertEquals("123456", content.toString());
 
         // Delete the first three letters using a selection.
         prepTextViewSync(content, mockBaseKeyListener, false, 0, 3);
-        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
         assertEquals("456", content.toString());
 
-        // Delete the entire line with ALT + DEL
-        final KeyEvent altDelKeyEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
-                KeyEvent.KEYCODE_DEL, 0, KeyEvent.META_ALT_ON);
+        // Delete the character prior to the cursor when there's no selection
+        prepTextViewSync(content, mockBaseKeyListener, false, 2, 2);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("46", content.toString());
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("6", content.toString());
+
+        // The deletion works on a Logical direction basis in RTL text..
+        String testText = "\u05E9\u05DC\u05D5\u05DD\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+
         prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
-        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, altDelKeyEvent);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals(testText, content.toString());
+
+        int end = testText.length();
+        prepTextViewSync(content, mockBaseKeyListener, false, end, end);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("\u05E9\u05DC\u05D5\u05DD", content.toString());
+
+        int middle = testText.length() / 2;
+        prepTextViewSync(content, mockBaseKeyListener, false, middle, middle);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("\u05E9\u05D5\u05DD", content.toString());
+
+        // And in BiDi text
+        testText = "\u05D6\u05D4\u0020Android\u0020\u05E2\u05D5\u05D1\u05D3";
+        content = Editable.Factory.getInstance().newEditable(testText);
+
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals(content.toString(), content.toString());
+
+        end = testText.length();
+        prepTextViewSync(content, mockBaseKeyListener, false, end, end);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("\u05D6\u05D4\u0020Android\u0020\u05E2\u05D5\u05D1", content.toString());
+
+        prepTextViewSync(content, mockBaseKeyListener, false, 6, 6);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("\u05D6\u05D4\u0020Anroid\u0020\u05E2\u05D5\u05D1", content.toString());
+    }
+
+    public void testBackspace_withShift() {
+        testBackspace(KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
+    }
+
+    public void testBackspace_withAlt() {
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
+        Editable content = Editable.Factory.getInstance().newEditable(TEST_STRING);
+
+        // Delete the entire line with ALT + DEL, even if we're at the head...
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        executeAltBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+
+        // ...or the tail...
+        content = Editable.Factory.getInstance().newEditable(TEST_STRING);
+        final int end = TEST_STRING.length();
+        prepTextViewSync(content, mockBaseKeyListener, false, end, end);
+        executeAltBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+
+        // ...or somewhere in the middle.
+        content = Editable.Factory.getInstance().newEditable(TEST_STRING);
+        final int middle = end / 2;
+        prepTextViewSync(content, mockBaseKeyListener, false, middle, middle);
+        executeAltBackspace(content, mockBaseKeyListener);
         assertEquals("", content.toString());
     }
 
@@ -86,6 +153,341 @@
         assertEquals(TEST_STRING, mTextView.getText().toString());
     }
 
+    private void assertCursorPosition(Editable content, int offset) {
+        assertEquals(offset, Selection.getSelectionStart(content));
+        assertEquals(offset, Selection.getSelectionEnd(content));
+    }
+
+    public void testBackspace_withCtrl() {
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
+
+        // If the contents only having symbolic characters, delete all characters.
+        String testText = "!#$%&'()`{*}_?+";
+        Editable content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII text
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+
+        // If the cursor is head of the text, should do nothing.
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. This is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. This is ", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. This ", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. ", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, ", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII, cursor is middle of the text.
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        int charsFromTail = 12;  // Cursor location is 12 chars from the tail.(before "is").
+        prepTextViewSync(content, mockBaseKeyListener, false,
+                         testText.length() - charsFromTail, testText.length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World.  is Android.", content.toString());
+        assertCursorPosition(content, content.toString().length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello,  is Android.", content.toString());
+        assertCursorPosition(content, content.toString().length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals(" is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals(" is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII, cursor is inside word.
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        charsFromTail = 14;  // Cursor location is 12 chars from the tail. (inside "This")
+        prepTextViewSync(content, mockBaseKeyListener, false,
+                         testText.length() - charsFromTail, testText.length() - charsFromTail);
+
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. is is Android.", content.toString());
+        assertCursorPosition(content, content.toString().length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, is is Android.", content.toString());
+        assertCursorPosition(content, content.toString().length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("is is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("is is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Hebrew Text
+        // The deletion works on a Logical direction basis.
+        testText = "\u05E9\u05DC\u05D5\u05DD\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020" +
+                   "\u05D6\u05D4\u0020\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05E9\u05DC\u05D5\u05DD\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020" +
+                     "\u05D6\u05D4\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05E9\u05DC\u05D5\u05DD\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020",
+                     content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05E9\u05DC\u05D5\u05DD\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // BiDi Text
+        // The deletion works on a Logical direction basis.
+        testText = "\u05D6\u05D4\u0020\u05DC\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1" +
+                   "\u05D3\u0020\u05D4\u05D9\u05D8\u05D1\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05D6\u05D4\u0020\u05DC\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1" +
+                     "\u05D3\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05D6\u05D4\u0020\u05DC\u002D\u0020\u0041Android\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05D6\u05D4\u0020\u05DC\u002D\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05D6\u05D4\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+    }
+
+    public void testForwardDelete_withCtrl() {
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
+
+        // If the contents only having symbolic characters, delete all characters.
+        String testText = "!#$%&'()`{*}_?+";
+        Editable content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII text
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+
+        // If the cursor is tail of the text, should do nothing.
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. This is Android.", content.toString());
+        assertCursorPosition(content, testText.length());
+
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(", World. This is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(". This is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(" is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(" Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(".", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII, cursor is middle of the text.
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        int charsFromHead = 14;  // Cursor location is 14 chars from the head.(before "This").
+        prepTextViewSync(content, mockBaseKeyListener, false, charsFromHead, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World.  is Android.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World.  Android.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. .", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. ", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. ", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        // Latin ASCII, cursor is inside word.
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        charsFromHead = 16;  // Cursor location is 16 chars from the head. (inside "This")
+        prepTextViewSync(content, mockBaseKeyListener, false, charsFromHead, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th is Android.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th Android.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        // Hebrew Text
+        // The deletion works on a Logical direction basis.
+        testText = "\u05E9\u05DC\u05D5\u05DD\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020" +
+                   "\u05D6\u05D4\u0020\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020\u05D6\u05D4\u0020\u05D0" +
+                     "\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u002E\u0020\u05D6\u05D4\u0020\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9" +
+                "\u05D3\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3\u002E",
+                     content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // BiDi Text
+        // The deletion works on a Logical direction basis.
+        testText = "\u05D6\u05D4\u0020\u05DC\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1" +
+                   "\u05D3\u0020\u05D4\u05D9\u05D8\u05D1\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05DC\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1\u05D3\u0020" +
+                     "\u05D4\u05D9\u05D8\u05D1\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1\u05D3\u0020\u05D4\u05D9" +
+                     "\u05D8\u05D1\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05E2\u05D5\u05D1\u05D3\u0020\u05D4\u05D9\u05D8\u05D1\u002E",
+                     content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05D4\u05D9\u05D8\u05D1\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+    }
+
     /*
      * Check point:
      * 1. Press 0 key, the content of TextView does not changed.
@@ -115,6 +517,35 @@
 //        assertEquals("13abcd456", mTextView.getText().toString());
     }
 
+    private void executeAltBackspace(Editable content, MockBaseKeyListener listener) {
+        final KeyEvent delKeyEvent = getKey(KeyEvent.KEYCODE_DEL,
+                KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON);
+        listener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+    }
+
+    private void executeCtrlBackspace(Editable content, MockBaseKeyListener listener) {
+        final KeyEvent delKeyEvent = getKey(KeyEvent.KEYCODE_DEL,
+                KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON);
+        listener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+    }
+
+    private void executeCtrlForwardDelete(Editable content, MockBaseKeyListener listener) {
+        final KeyEvent delKeyEvent = getKey(KeyEvent.KEYCODE_FORWARD_DEL,
+                KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON);
+        listener.forwardDelete(mTextView, content, KeyEvent.KEYCODE_FORWARD_DEL, delKeyEvent);
+    }
+
+    private KeyEvent getKey(int keycode, int metaState) {
+        long currentTime = System.currentTimeMillis();
+        return new KeyEvent(
+                currentTime,
+                currentTime,
+                KeyEvent.ACTION_DOWN,
+                keycode,
+                0 /* repeat */,
+                metaState);
+    }
+
     /**
      * Prepares mTextView state for tests by synchronously setting the content and key listener, on
      * the UI thread.
diff --git a/tests/tests/tv/AndroidManifest.xml b/tests/tests/tv/AndroidManifest.xml
index d2b3ddf..79406e0 100644
--- a/tests/tests/tv/AndroidManifest.xml
+++ b/tests/tests/tv/AndroidManifest.xml
@@ -20,6 +20,7 @@
         package="com.android.cts.tv">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.INJECT_EVENTS" />
 
     <uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" />
     <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
@@ -66,6 +67,15 @@
                        android:resource="@xml/stub_tv_input_service" />
         </service>
 
+        <service android:name="android.media.tv.cts.TvInputManagerTest$StubTvInputService2"
+                 android:permission="android.permission.BIND_TV_INPUT">
+            <intent-filter>
+                <action android:name="android.media.tv.TvInputService" />
+            </intent-filter>
+            <meta-data android:name="android.media.tv.input"
+                       android:resource="@xml/stub_tv_input_service" />
+        </service>
+
         <service android:name="android.media.tv.cts.TvInputServiceTest$CountingTvInputService"
                  android:permission="android.permission.BIND_TV_INPUT">
             <intent-filter>
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
index 6a50b56..b4bc6eb 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
@@ -409,9 +409,8 @@
             String sortOrder) throws Exception {
         try {
             getContext().getContentResolver().query(uri, projection, null, null, sortOrder);
-            fail("Setting sortOrder should fail without ACCESS_ALL_EPG_DATA permission for " + uri);
         } catch (SecurityException e) {
-            // Expected exception
+            fail("Setting sort order shoud be allowed for " + uri);
         }
     }
 
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
index 48f1f44..ff66dc6 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
@@ -16,19 +16,26 @@
 
 package android.media.tv.cts;
 
+import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.PackageManager;
+import android.cts.util.PollingCheck;
 import android.media.tv.TvContentRating;
 import android.media.tv.TvInputInfo;
 import android.media.tv.TvInputManager;
 import android.os.Handler;
 import android.test.ActivityInstrumentationTestCase2;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Test for {@link android.media.tv.TvInputManager}.
  */
 public class TvInputManagerTest extends ActivityInstrumentationTestCase2<TvViewStubActivity> {
+    /** The maximum time to wait for an operation. */
+    private static final long TIME_OUT_MS = 15000L;
+
     private static final String[] VALID_TV_INPUT_SERVICES = {
         StubTunerTvInputService.class.getName()
     };
@@ -40,7 +47,7 @@
 
     private String mStubId;
     private TvInputManager mManager;
-    private TvInputManager.TvInputCallback mCallabck = new TvInputManager.TvInputCallback() {};
+    private LoggingCallback mCallabck = new LoggingCallback();
 
     private static TvInputInfo getInfoForClassName(List<TvInputInfo> list, String name) {
         for (TvInputInfo info : list) {
@@ -62,7 +69,7 @@
         }
         mManager = (TvInputManager) getActivity().getSystemService(Context.TV_INPUT_SERVICE);
         mStubId = getInfoForClassName(
-                mManager.getTvInputList(), StubTunerTvInputService.class.getName()).getId();
+                mManager.getTvInputList(), StubTvInputService2.class.getName()).getId();
     }
 
     public void testGetInputState() throws Exception {
@@ -77,7 +84,7 @@
             return;
         }
         assertEquals(mManager.getTvInputInfo(mStubId), getInfoForClassName(
-                mManager.getTvInputList(), StubTunerTvInputService.class.getName()));
+                mManager.getTvInputList(), StubTvInputService2.class.getName()));
     }
 
     public void testGetTvInputList() throws Exception {
@@ -134,4 +141,90 @@
         });
         getInstrumentation().waitForIdleSync();
     }
+
+    public void testInputAddedAndRemoved() {
+        if (!Utils.hasTvInputFramework(getActivity())) {
+            return;
+        }
+        getActivity().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mManager.registerCallback(mCallabck, new Handler());
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        // Test if onInputRemoved() is called.
+        mCallabck.resetLogs();
+        PackageManager pm = getActivity().getPackageManager();
+        ComponentName component = new ComponentName(getActivity(), StubTvInputService2.class);
+        assertTrue(PackageManager.COMPONENT_ENABLED_STATE_DISABLED != pm.getComponentEnabledSetting(
+                component));
+        pm.setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                PackageManager.DONT_KILL_APP);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mCallabck.isInputRemoved(mStubId);
+            }
+        }.run();
+
+        // Test if onInputAdded() is called.
+        mCallabck.resetLogs();
+        assertEquals(PackageManager.COMPONENT_ENABLED_STATE_DISABLED, pm.getComponentEnabledSetting(
+                component));
+        pm.setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                PackageManager.DONT_KILL_APP);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mCallabck.isInputAdded(mStubId);
+            }
+        }.run();
+
+        getActivity().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mManager.unregisterCallback(mCallabck);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+    }
+
+    private static class LoggingCallback extends TvInputManager.TvInputCallback {
+        private final List<String> mAddedInputs = new ArrayList<>();
+        private final List<String> mRemovedInputs = new ArrayList<>();
+
+        @Override
+        public synchronized void onInputAdded(String inputId) {
+            mAddedInputs.add(inputId);
+        }
+
+        @Override
+        public synchronized void onInputRemoved(String inputId) {
+            mRemovedInputs.add(inputId);
+        }
+
+        public synchronized void resetLogs() {
+            mAddedInputs.clear();
+            mRemovedInputs.clear();
+        }
+
+        public synchronized boolean isInputAdded(String inputId) {
+            return mRemovedInputs.isEmpty() && mAddedInputs.size() == 1 && mAddedInputs.contains(
+                    inputId);
+        }
+
+        public synchronized boolean isInputRemoved(String inputId) {
+            return mAddedInputs.isEmpty() && mRemovedInputs.size() == 1 && mRemovedInputs.contains(
+                    inputId);
+        }
+    }
+
+    public static class StubTvInputService2 extends StubTvInputService {
+        @Override
+        public Session onCreateSession(String inputId) {
+            return null;
+        }
+    }
 }
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
index 7068035..b4c863a 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
@@ -20,6 +20,7 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.cts.util.PollingCheck;
+import android.media.PlaybackParams;
 import android.media.tv.TvContentRating;
 import android.media.tv.TvContract;
 import android.media.tv.TvInputInfo;
@@ -34,7 +35,9 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.Surface;
+import android.view.SurfaceView;
 import android.view.View;
+import android.widget.LinearLayout;
 
 import com.android.cts.tv.R;
 
@@ -59,6 +62,8 @@
     private TvInputManager mManager;
     private TvInputInfo mStubInfo;
     private final StubCallback mCallback = new StubCallback();
+    private final StubTimeShiftPositionCallback mTimeShiftPositionCallback =
+            new StubTimeShiftPositionCallback();
 
     private static class StubCallback extends TvView.TvInputCallback {
         private int mChannelRetunedCount;
@@ -69,6 +74,7 @@
         private int mVideoSizeChanged;
         private int mContentAllowedCount;
         private int mContentBlockedCount;
+        private int mTimeShiftStatusChangedCount;
 
         @Override
         public void onChannelRetuned(String inputId, Uri channelUri) {
@@ -110,6 +116,11 @@
             mContentBlockedCount++;
         }
 
+        @Override
+        public void onTimeShiftStatusChanged(String inputId, int status) {
+            mTimeShiftStatusChangedCount++;
+        }
+
         public void resetCounts() {
             mChannelRetunedCount = 0;
             mVideoAvailableCount = 0;
@@ -118,6 +129,27 @@
             mTrackChangedCount = 0;
             mContentAllowedCount = 0;
             mContentBlockedCount = 0;
+            mTimeShiftStatusChangedCount = 0;
+        }
+    }
+
+    private static class StubTimeShiftPositionCallback extends TvView.TimeShiftPositionCallback {
+        private int mTimeShiftStartPositionChanged;
+        private int mTimeShiftCurrentPositionChanged;
+
+        @Override
+        public void onTimeShiftStartPositionChanged(String inputId, long timeMs) {
+            mTimeShiftStartPositionChanged++;
+        }
+
+        @Override
+        public void onTimeShiftCurrentPositionChanged(String inputId, long timeMs) {
+            mTimeShiftCurrentPositionChanged++;
+        }
+
+        public void resetCounts() {
+            mTimeShiftStartPositionChanged = 0;
+            mTimeShiftCurrentPositionChanged = 0;
         }
     }
 
@@ -161,6 +193,12 @@
         verifyCommandDispatchTouchEvent();
         verifyCommandDispatchTrackballEvent();
         verifyCommandDispatchGenericMotionEvent();
+        verifyCommandTimeShiftPause();
+        verifyCommandTimeShiftResume();
+        verifyCommandTimeShiftSeekTo();
+        verifyCommandTimeShiftSetPlaybackParams();
+        verifyCommandSetTimeShiftPositionCallback();
+        verifyCommandOverlayViewSizeChanged();
         verifyCallbackChannelRetuned();
         verifyCallbackVideoAvailable();
         verifyCallbackVideoUnavailable();
@@ -168,6 +206,8 @@
         verifyCallbackTrackSelected();
         verifyCallbackContentAllowed();
         verifyCallbackContentBlocked();
+        verifyCallbackTimeShiftStatusChanged();
+        verifyCallbackLayoutSurface();
 
         runTestOnUiThread(new Runnable() {
             @Override
@@ -320,6 +360,89 @@
         }.run();
     }
 
+    public void verifyCommandTimeShiftPause() {
+        resetCounts();
+        mTvView.timeShiftPause();
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mTimeShiftPauseCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandTimeShiftResume() {
+        resetCounts();
+        mTvView.timeShiftResume();
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mTimeShiftResumeCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandTimeShiftSeekTo() {
+        resetCounts();
+        mTvView.timeShiftSeekTo(0);
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mTimeShiftSeekToCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandTimeShiftSetPlaybackParams() {
+        resetCounts();
+        mTvView.timeShiftSetPlaybackParams(new PlaybackParams().setSpeed(2.0f)
+                .setAudioFallbackMode(PlaybackParams.AUDIO_FALLBACK_MODE_DEFAULT));
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mTimeShiftSetPlaybackParamsCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandSetTimeShiftPositionCallback() {
+        resetCounts();
+        mTvView.setTimeShiftPositionCallback(mTimeShiftPositionCallback);
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                return mTimeShiftPositionCallback.mTimeShiftCurrentPositionChanged > 0
+                        && mTimeShiftPositionCallback.mTimeShiftStartPositionChanged > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandOverlayViewSizeChanged() {
+        resetCounts();
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTvView.setLayoutParams(new LinearLayout.LayoutParams(10, 20));
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mOverlayViewSizeChangedCount > 0;
+            }
+        }.run();
+    }
+
     public void verifyCallbackChannelRetuned() {
         resetCounts();
         CountingSession session = CountingTvInputService.sSession;
@@ -431,11 +554,50 @@
         }.run();
     }
 
+    public void verifyCallbackTimeShiftStatusChanged() {
+        resetCounts();
+        CountingSession session = CountingTvInputService.sSession;
+        assertNotNull(session);
+        session.notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE);
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                return mCallback.mTimeShiftStatusChangedCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCallbackLayoutSurface() {
+        resetCounts();
+        final int left = 10;
+        final int top = 20;
+        final int right = 30;
+        final int bottom = 40;
+        CountingSession session = CountingTvInputService.sSession;
+        assertNotNull(session);
+        session.layoutSurface(left, top, right, bottom);
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                int childCount = mTvView.getChildCount();
+                for (int i = 0; i < childCount; ++i) {
+                    View v = mTvView.getChildAt(i);
+                    if (v instanceof SurfaceView) {
+                        return v.getLeft() == left && v.getTop() == top && v.getRight() == right
+                                && v.getBottom() == bottom;
+                    }
+                }
+                return false;
+            }
+        }.run();
+    }
+
     private void resetCounts() {
         if (CountingTvInputService.sSession != null) {
             CountingTvInputService.sSession.resetCounts();
         }
         mCallback.resetCounts();
+        mTimeShiftPositionCallback.resetCounts();
     }
 
     public static class CountingTvInputService extends StubTvInputService {
@@ -461,6 +623,13 @@
             public volatile int mTouchEventCount;
             public volatile int mTrackballEventCount;
             public volatile int mGenricMotionEventCount;
+            public volatile int mOverlayViewSizeChangedCount;
+            public volatile int mTimeShiftPauseCount;
+            public volatile int mTimeShiftResumeCount;
+            public volatile int mTimeShiftSeekToCount;
+            public volatile int mTimeShiftSetPlaybackParamsCount;
+            public volatile long mTimeShiftGetCurrentPositionCount;
+            public volatile long mTimeShiftGetStartPositionCount;
 
             CountingSession(Context context) {
                 super(context);
@@ -479,6 +648,13 @@
                 mTouchEventCount = 0;
                 mTrackballEventCount = 0;
                 mGenricMotionEventCount = 0;
+                mOverlayViewSizeChangedCount = 0;
+                mTimeShiftPauseCount = 0;
+                mTimeShiftResumeCount = 0;
+                mTimeShiftSeekToCount = 0;
+                mTimeShiftSetPlaybackParamsCount = 0;
+                mTimeShiftGetCurrentPositionCount = 0;
+                mTimeShiftGetStartPositionCount = 0;
             }
 
             @Override
@@ -559,6 +735,41 @@
                 mGenricMotionEventCount++;
                 return false;
             }
+
+            @Override
+            public void onTimeShiftPause() {
+                mTimeShiftPauseCount++;
+            }
+
+            @Override
+            public void onTimeShiftResume() {
+                mTimeShiftResumeCount++;
+            }
+
+            @Override
+            public void onTimeShiftSeekTo(long timeMs) {
+                mTimeShiftSeekToCount++;
+            }
+
+            @Override
+            public void onTimeShiftSetPlaybackParams(PlaybackParams param) {
+                mTimeShiftSetPlaybackParamsCount++;
+            }
+
+            @Override
+            public long onTimeShiftGetCurrentPosition() {
+                return ++mTimeShiftGetCurrentPositionCount;
+            }
+
+            @Override
+            public long onTimeShiftGetStartPosition() {
+                return ++mTimeShiftGetStartPositionCount;
+            }
+
+            @Override
+            public void onOverlayViewSizeChanged(int width, int height) {
+                mOverlayViewSizeChangedCount++;
+            }
         }
     }
 }
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java b/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
index 6232861..1c59462 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
@@ -272,6 +272,8 @@
                 case TvTrackInfo.TYPE_VIDEO:
                     assertEquals(track.getVideoHeight(), selectedTrack.getVideoHeight());
                     assertEquals(track.getVideoWidth(), selectedTrack.getVideoWidth());
+                    assertEquals(track.getVideoPixelAspectRatio(),
+                            selectedTrack.getVideoPixelAspectRatio(), 0.001f);
                     break;
                 case TvTrackInfo.TYPE_AUDIO:
                     assertEquals(track.getAudioChannelCount(),
@@ -281,6 +283,7 @@
                     break;
                 case TvTrackInfo.TYPE_SUBTITLE:
                     assertEquals(track.getLanguage(), selectedTrack.getLanguage());
+                    assertEquals(track.getDescription(), selectedTrack.getDescription());
                     break;
                 default:
                     fail("Unrecognized type: " + track.getType());
@@ -295,7 +298,7 @@
         TvTrackInfo videoTrack1 = new TvTrackInfo.Builder(TvTrackInfo.TYPE_VIDEO, "video-HD")
                 .setVideoHeight(1920).setVideoWidth(1080).build();
         TvTrackInfo videoTrack2 = new TvTrackInfo.Builder(TvTrackInfo.TYPE_VIDEO, "video-SD")
-                .setVideoHeight(640).setVideoWidth(360).build();
+                .setVideoHeight(640).setVideoWidth(360).setVideoPixelAspectRatio(1.09f).build();
         TvTrackInfo audioTrack1 =
                 new TvTrackInfo.Builder(TvTrackInfo.TYPE_AUDIO, "audio-stereo-eng")
                 .setLanguage("eng").setAudioChannelCount(2).setAudioSampleRate(48000).build();
@@ -307,13 +310,16 @@
         TvTrackInfo subtitleTrack2 =
                 new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE, "subtitle-esp")
                 .setLanguage("esp").build();
+        TvTrackInfo subtitleTrack3 =
+                new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE, "subtitle-eng2")
+                .setLanguage("eng").setDescription("audio commentary").build();
 
         StubTunerTvInputService.injectTrack(videoTrack1, videoTrack2, audioTrack1, audioTrack2,
                 subtitleTrack1, subtitleTrack2);
 
         final List<TvTrackInfo> tracks = new ArrayList<TvTrackInfo>();
         Collections.addAll(tracks, videoTrack1, videoTrack2, audioTrack1, audioTrack2,
-                subtitleTrack1, subtitleTrack2);
+                subtitleTrack1, subtitleTrack2, subtitleTrack3);
         tryTuneAllChannels(new Runnable() {
             @Override
             public void run() {
diff --git a/tests/tests/uidisolation/Android.mk b/tests/tests/uidisolation/Android.mk
index 8529407..c21b6df 100644
--- a/tests/tests/uidisolation/Android.mk
+++ b/tests/tests/uidisolation/Android.mk
@@ -23,6 +23,8 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner ctstestserver
 
+LOCAL_JAVA_LIBRARIES := org.apache.http.legacy
+
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsUidIsolationTestCases
diff --git a/tests/tests/uidisolation/AndroidManifest.xml b/tests/tests/uidisolation/AndroidManifest.xml
index a8c6848..86efb6f 100644
--- a/tests/tests/uidisolation/AndroidManifest.xml
+++ b/tests/tests/uidisolation/AndroidManifest.xml
@@ -18,6 +18,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.cts.uidisolation">
 
+    <uses-library android:name="org.apache.http.legacy" android:required="false" />
+
     <application android:label="UidIsolationTest">
       <activity android:name="android.uidisolation.cts.ServiceRunnerActivity"
                 android:label="UidIsolationTest"/>
diff --git a/tests/tests/uirendering/AndroidManifest.xml b/tests/tests/uirendering/AndroidManifest.xml
index 413dfba..b8d84a6 100644
--- a/tests/tests/uirendering/AndroidManifest.xml
+++ b/tests/tests/uirendering/AndroidManifest.xml
@@ -26,7 +26,7 @@
         <uses-library android:name="android.test.runner" />
     </application>
 
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.cts.uirendering">
     </instrumentation>
 
diff --git a/tests/tests/uirendering/res/layout/simple_shadow_layout.xml b/tests/tests/uirendering/res/layout/simple_shadow_layout.xml
new file mode 100644
index 0000000..2f21df0
--- /dev/null
+++ b/tests/tests/uirendering/res/layout/simple_shadow_layout.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+       Licensed under the Apache License, Version 2.0 (the "License");
+       you may not use this file except in compliance with the License.
+       You may obtain a copy of the License at
+
+            http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing, software
+       distributed under the License is distributed on an "AS IS" BASIS,
+       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+       See the License for the specific language governing permissions and
+       limitations under the License.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/test_width"
+    android:layout_height="@dimen/test_height">
+    <View android:layout_width="40px"
+        android:layout_height="40px"
+        android:translationX="25px"
+        android:translationY="25px"
+        android:elevation="10dp"
+        android:background="#fff" />
+</FrameLayout>
\ No newline at end of file
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
index 1d5cd16..b324b06 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
@@ -120,6 +120,7 @@
                     canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.FILTER_BITMAP_FLAG, 0));
                 }
                 canvas.drawBitmap(scaleUp ? mSmallGridBitmap : mBigGridBitmap, 0, 0, paint);
+                canvas.setDrawFilter(null);
             }
         };
         createTest()
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java
new file mode 100644
index 0000000..878d5ae
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.uirendering.cts.testclasses;
+
+import android.graphics.Color;
+import android.graphics.Point;
+import android.uirendering.cts.bitmapverifiers.SamplePointVerifier;
+
+import com.android.cts.uirendering.R;
+
+import android.test.suitebuilder.annotation.SmallTest;
+import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+
+public class ShadowTests extends ActivityTestBase {
+    @SmallTest
+    public void testShadowLayout() {
+        createTest()
+                .addLayout(R.layout.simple_shadow_layout, null, true/* HW only */)
+                .runWithVerifier(
+                new SamplePointVerifier(
+                        new Point[] {
+                                // view area
+                                new Point(25, 64),
+                                new Point(64, 64),
+                                // shadow area
+                                new Point(25, 65),
+                                new Point(64, 65)
+                        },
+                        new int[] {
+                                Color.WHITE,
+                                Color.WHITE,
+                                Color.rgb(222, 222, 222),
+                                Color.rgb(222, 222, 222),
+                        }));
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
index e1c09f5..8c5f245 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
@@ -28,6 +28,8 @@
 import android.uirendering.cts.util.BitmapDumper;
 import android.util.Log;
 
+import android.support.test.InstrumentationRegistry;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -78,6 +80,10 @@
      */
     @Override
     public void setUp() {
+        // As the way to access Instrumentation is changed in the new runner, we need to inject it
+        // manually into ActivityInstrumentationTestCase2. ActivityInstrumentationTestCase2 will
+        // be marked as deprecated and replaced with ActivityTestRule.
+        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
         mDifferenceVisualizer = new PassFailVisualizer();
         if (USE_RS) {
             mRenderScript = RenderScript.create(getActivity().getApplicationContext());
diff --git a/tests/tests/util/src/android/util/cts/EventLogTest.java b/tests/tests/util/src/android/util/cts/EventLogTest.java
index 12df64f..e163428 100644
--- a/tests/tests/util/src/android/util/cts/EventLogTest.java
+++ b/tests/tests/util/src/android/util/cts/EventLogTest.java
@@ -37,21 +37,24 @@
         EventLog.writeEvent(ANSWER_TAG, markerData);
         EventLog.writeEvent(ANSWER_TAG, 12345);
         EventLog.writeEvent(ANSWER_TAG, 23456L);
+        EventLog.writeEvent(ANSWER_TAG, 42.4242f);
         EventLog.writeEvent(ANSWER_TAG, "Test");
-        EventLog.writeEvent(ANSWER_TAG, 12345, 23456L, "Test");
+        EventLog.writeEvent(ANSWER_TAG, 12345, 23456L, 42.4242f, "Test");
 
         List<EventLog.Event> events = getEventsAfterMarker(markerData, ANSWER_TAG);
-        assertEquals(4, events.size());
+        assertEquals(5, events.size());
         assertEquals(ANSWER_TAG, events.get(0).getTag());
         assertEquals(12345, events.get(0).getData());
         assertEquals(23456L, events.get(1).getData());
-        assertEquals("Test", events.get(2).getData());
+        assertEquals(42.4242f, events.get(2).getData());
+        assertEquals("Test", events.get(3).getData());
 
-        Object[] arr = (Object[]) events.get(3).getData();
-        assertEquals(3, arr.length);
+        Object[] arr = (Object[]) events.get(4).getData();
+        assertEquals(4, arr.length);
         assertEquals(12345, arr[0]);
         assertEquals(23456L, arr[1]);
-        assertEquals("Test", arr[2]);
+        assertEquals(42.4242f, arr[2]);
+        assertEquals("Test", arr[3]);
     }
 
     public void testWriteEventWithOversizeValue() throws Exception {
@@ -67,12 +70,13 @@
         EventLog.writeEvent(ANSWER_TAG, "hi", longString.toString());
         EventLog.writeEvent(ANSWER_TAG, 12345, longString.toString());
         EventLog.writeEvent(ANSWER_TAG, 12345L, longString.toString());
+        EventLog.writeEvent(ANSWER_TAG, 42.4242f, longString.toString());
         EventLog.writeEvent(ANSWER_TAG, longString.toString(), longString.toString());
         EventLog.writeEvent(ANSWER_TAG, longArray);
         // Give the message some time to show up in the log
         Thread.sleep(10);
         List<Event> events = getEventsAfterMarker(markerData, ANSWER_TAG);
-        assertEquals(6, events.size());
+        assertEquals(7, events.size());
 
         // subtract: log header, type byte, final newline
         final int max = 4096 - 20 - 4 - 1;
@@ -99,15 +103,21 @@
         assertEquals(12345L, arr3[0]);
         assertEquals(max - 2 - 9 - 5, ((String) arr3[1]).length());
 
-        // subtract: array header, string header (second string is dropped entirely)
+        // subtract: array header, float, string header
         Object[] arr4 = (Object[]) events.get(4).getData();
-        assertEquals(1, arr4.length);
-        assertEquals(max - 2 - 5, ((String) arr4[0]).length());
+        assertEquals(2, arr4.length);
+        assertEquals(42.4242f, arr4[0]);
+        assertEquals(max - 2 - 5 - 5, ((String) arr4[1]).length());
 
+        // subtract: array header, string header (second string is dropped entirely)
         Object[] arr5 = (Object[]) events.get(5).getData();
-        assertEquals(255, arr5.length);
-        assertEquals(12345, arr5[0]);
-        assertEquals(12345, arr5[arr5.length - 1]);
+        assertEquals(1, arr5.length);
+        assertEquals(max - 2 - 5, ((String) arr5[0]).length());
+
+        Object[] arr6 = (Object[]) events.get(6).getData();
+        assertEquals(255, arr6.length);
+        assertEquals(12345, arr6[0]);
+        assertEquals(12345, arr6[arr6.length - 1]);
     }
 
     public void testWriteNullEvent() throws Exception {
diff --git a/tests/tests/view/res/layout/inflater_override_theme_layout.xml b/tests/tests/view/res/layout/inflater_override_theme_layout.xml
index 2d2a578..93a765b 100644
--- a/tests/tests/view/res/layout/inflater_override_theme_layout.xml
+++ b/tests/tests/view/res/layout/inflater_override_theme_layout.xml
@@ -43,4 +43,13 @@
             android:theme="?attr/themeOverrideAttr" />
     </LinearLayout>
 
+    <include
+        layout="@layout/single_view_layout"
+        android:id="@+id/view_include"
+        android:theme="@style/Theme_OverrideInclude" />
+
+    <include
+        layout="@layout/single_view_layout"
+        android:id="@+id/view_include_notheme" />
+
 </LinearLayout>
diff --git a/tests/tests/view/res/layout/single_view_layout.xml b/tests/tests/view/res/layout/single_view_layout.xml
new file mode 100644
index 0000000..5f66983
--- /dev/null
+++ b/tests/tests/view/res/layout/single_view_layout.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:theme="@style/Theme_OverrideView" />
diff --git a/tests/tests/view/res/layout/view_layout.xml b/tests/tests/view/res/layout/view_layout.xml
index fa817dc..e6e1550 100644
--- a/tests/tests/view/res/layout/view_layout.xml
+++ b/tests/tests/view/res/layout/view_layout.xml
@@ -34,6 +34,7 @@
         android:layout_height="200px"
         android:scrollbars="horizontal|vertical"
         android:fadingEdge="horizontal|vertical"
+        android:scrollIndicators="top|bottom"
         android:fadingEdgeLength="20px"/>
 
     <android.view.cts.MockView
diff --git a/tests/tests/view/res/values/styles.xml b/tests/tests/view/res/values/styles.xml
index 20c80f8..9de4abd 100644
--- a/tests/tests/view/res/values/styles.xml
+++ b/tests/tests/view/res/values/styles.xml
@@ -150,6 +150,14 @@
     <style name="Theme_OverrideAttr">
         <item name="themeType">3</item>
     </style>
+
+    <style name="Theme_OverrideInclude">
+        <item name="themeType">4</item>
+    </style>
+
+    <style name="Theme_OverrideView">
+        <item name="themeType">5</item>
+    </style>
     
     <style name="Theme_ThemedDrawableTest">
         <item name="themeBoolean">true</item>
diff --git a/tests/tests/view/src/android/view/cts/ActionModeCallback2Test.java b/tests/tests/view/src/android/view/cts/ActionModeCallback2Test.java
new file mode 100644
index 0000000..e75b7ae
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ActionModeCallback2Test.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.graphics.Rect;
+import android.test.AndroidTestCase;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+
+public class ActionModeCallback2Test extends AndroidTestCase {
+    private static final int VIEW_WIDTH = 123;
+    private static final int VIEW_HEIGHT = 456;
+
+    public void testCallbackOnGetContentRectDefaultWithView() {
+        View view = new View(mContext);
+        view.setLeft(0);
+        view.setRight(VIEW_WIDTH);
+        view.setTop(0);
+        view.setBottom(VIEW_HEIGHT);
+
+        Rect outRect = new Rect();
+        MockActionModeCallback2 callback = new MockActionModeCallback2();
+        callback.onGetContentRect(null, view, outRect);
+
+        assertEquals(0, outRect.top);
+        assertEquals(0, outRect.left);
+        assertEquals(VIEW_HEIGHT, outRect.bottom);
+        assertEquals(VIEW_WIDTH, outRect.right);
+    }
+
+    public void testCallbackOnGetContentRectDefaultWithoutView() {
+        Rect outRect = new Rect();
+        MockActionModeCallback2 callback = new MockActionModeCallback2();
+        callback.onGetContentRect(null, null, outRect);
+
+        assertEquals(0, outRect.top);
+        assertEquals(0, outRect.left);
+        assertEquals(0, outRect.bottom);
+        assertEquals(0, outRect.right);
+    }
+
+    private static class MockActionModeCallback2 extends ActionMode.Callback2 {
+        @Override
+        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+            return false;
+        }
+
+        @Override
+        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+            return false;
+        }
+
+        @Override
+        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+            return false;
+        }
+
+        @Override
+        public void onDestroyActionMode(ActionMode mode) {}
+    }
+
+}
diff --git a/tests/tests/view/src/android/view/cts/ActionModeTest.java b/tests/tests/view/src/android/view/cts/ActionModeTest.java
new file mode 100644
index 0000000..61df9fe
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ActionModeTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.test.AndroidTestCase;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.View;
+
+public class ActionModeTest extends AndroidTestCase {
+
+    public void testSetType() {
+        ActionMode actionMode = new MockActionMode();
+        assertEquals(ActionMode.TYPE_PRIMARY, actionMode.getType());
+
+        actionMode.setType(ActionMode.TYPE_FLOATING);
+        assertEquals(ActionMode.TYPE_FLOATING, actionMode.getType());
+
+        actionMode.setType(ActionMode.TYPE_PRIMARY);
+        assertEquals(ActionMode.TYPE_PRIMARY, actionMode.getType());
+    }
+
+    public void testInvalidateContentRectDoesNotInvalidateFull() {
+        MockActionMode actionMode = new MockActionMode();
+
+        actionMode.invalidateContentRect();
+
+        assertFalse(actionMode.mInvalidateWasCalled);
+    }
+
+    private static class MockActionMode extends ActionMode {
+        boolean mInvalidateWasCalled = false;
+
+        @Override
+        public void setTitle(CharSequence title) {}
+
+        @Override
+        public void setTitle(int resId) {}
+
+        @Override
+        public void setSubtitle(CharSequence subtitle) {}
+
+        @Override
+        public void setSubtitle(int resId) {}
+
+        @Override
+        public void setCustomView(View view) {}
+
+        @Override
+        public void invalidate() {
+            mInvalidateWasCalled = true;
+        }
+
+        @Override
+        public void finish() {}
+
+        @Override
+        public Menu getMenu() {
+            return null;
+        }
+
+        @Override
+        public CharSequence getTitle() {
+            return null;
+        }
+
+        @Override
+        public CharSequence getSubtitle() {
+            return null;
+        }
+
+        @Override
+        public View getCustomView() {
+            return null;
+        }
+
+        @Override
+        public MenuInflater getMenuInflater() {
+            return null;
+        }
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java b/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
index bf83086..59eefec 100644
--- a/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
+++ b/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
@@ -370,6 +370,8 @@
         verifyThemeType(container, "view_outer", R.id.view_outer, 1);
         verifyThemeType(container, "view_inner", R.id.view_inner, 2);
         verifyThemeType(container, "view_attr", R.id.view_attr, 3);
+        verifyThemeType(container, "view_include", R.id.view_include, 4);
+        verifyThemeType(container, "view_include_notheme", R.id.view_include_notheme, 5);
     }
 
     private void verifyThemeType(View container, String tag, int id, int type) {
diff --git a/tests/tests/view/src/android/view/cts/ViewGroupTest.java b/tests/tests/view/src/android/view/cts/ViewGroupTest.java
index f1064a7..3fc4087 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroupTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroupTest.java
@@ -36,8 +36,12 @@
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.SparseArray;
+import android.view.ActionMode;
 import android.view.Display;
 import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
@@ -1660,6 +1664,151 @@
         assertFalse(vg.isGetChildStaticTransformationCalled);
     }
 
+    public void testStartActionModeForChildRespectsSubclassMode() {
+        MockViewGroupSubclass vgParent = new MockViewGroupSubclass(mContext);
+        MockViewGroupSubclass vg = new MockViewGroupSubclass(mContext);
+        vg.shouldReturnOwnTypelessActionMode = true;
+        vgParent.addView(vg);
+        MockTextView textView = new MockTextView(mContext);
+        vg.addView(textView);
+
+        textView.startActionMode(NO_OP_ACTION_MODE_CALLBACK, ActionMode.TYPE_FLOATING);
+
+        assertTrue(vg.isStartActionModeForChildTypedCalled);
+        assertTrue(vg.isStartActionModeForChildTypelessCalled);
+        // Call should not bubble up as we have an intercepting implementation.
+        assertFalse(vgParent.isStartActionModeForChildTypedCalled);
+    }
+
+    public void testStartActionModeForChildTypedBubblesUpToParent() {
+        MockViewGroupSubclass vgParent = new MockViewGroupSubclass(mContext);
+        MockViewGroupSubclass vg = new MockViewGroupSubclass(mContext);
+        vgParent.addView(vg);
+        MockTextView textView = new MockTextView(mContext);
+        vg.addView(textView);
+
+        textView.startActionMode(NO_OP_ACTION_MODE_CALLBACK, ActionMode.TYPE_FLOATING);
+
+        assertTrue(vg.isStartActionModeForChildTypedCalled);
+        assertTrue(vg.isStartActionModeForChildTypelessCalled);
+        assertTrue(vgParent.isStartActionModeForChildTypedCalled);
+    }
+
+    public void testStartActionModeForChildTypelessBubblesUpToParent() {
+        MockViewGroupSubclass vgParent = new MockViewGroupSubclass(mContext);
+        MockViewGroupSubclass vg = new MockViewGroupSubclass(mContext);
+        vgParent.addView(vg);
+        MockTextView textView = new MockTextView(mContext);
+        vg.addView(textView);
+
+        textView.startActionMode(NO_OP_ACTION_MODE_CALLBACK);
+
+        assertTrue(vg.isStartActionModeForChildTypedCalled);
+        assertTrue(vg.isStartActionModeForChildTypelessCalled);
+        assertTrue(vgParent.isStartActionModeForChildTypedCalled);
+    }
+
+    private static final ActionMode.Callback NO_OP_ACTION_MODE_CALLBACK =
+            new ActionMode.Callback() {
+                @Override
+                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                    return false;
+                }
+
+                @Override
+                public void onDestroyActionMode(ActionMode mode) {}
+
+                @Override
+                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                    return false;
+                }
+
+                @Override
+                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                    return false;
+                }
+            };
+
+    private static final ActionMode NO_OP_ACTION_MODE =
+            new ActionMode() {
+                @Override
+                public void setTitle(CharSequence title) {}
+
+                @Override
+                public void setTitle(int resId) {}
+
+                @Override
+                public void setSubtitle(CharSequence subtitle) {}
+
+                @Override
+                public void setSubtitle(int resId) {}
+
+                @Override
+                public void setCustomView(View view) {}
+
+                @Override
+                public void invalidate() {}
+
+                @Override
+                public void finish() {}
+
+                @Override
+                public Menu getMenu() {
+                    return null;
+                }
+
+                @Override
+                public CharSequence getTitle() {
+                    return null;
+                }
+
+                @Override
+                public CharSequence getSubtitle() {
+                    return null;
+                }
+
+                @Override
+                public View getCustomView() {
+                    return null;
+                }
+
+                @Override
+                public MenuInflater getMenuInflater() {
+                    return null;
+                }
+            };
+
+    private static class MockViewGroupSubclass extends ViewGroup {
+        boolean isStartActionModeForChildTypedCalled = false;
+        boolean isStartActionModeForChildTypelessCalled = false;
+        boolean shouldReturnOwnTypelessActionMode = false;
+
+        public MockViewGroupSubclass(Context context) {
+            super(context);
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
+            isStartActionModeForChildTypelessCalled = true;
+            if (shouldReturnOwnTypelessActionMode) {
+                return NO_OP_ACTION_MODE;
+            }
+            return super.startActionModeForChild(originalView, callback);
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(
+                View originalView, ActionMode.Callback callback, int type) {
+            isStartActionModeForChildTypedCalled = true;
+            return super.startActionModeForChild(originalView, callback, type);
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {
+            // no-op
+        }
+    }
+
     static public int resetRtlPropertiesCount;
     static public int resetResolvedLayoutDirectionCount;
     static public int resetResolvedTextDirectionCount;
diff --git a/tests/tests/view/src/android/view/cts/ViewStubTest.java b/tests/tests/view/src/android/view/cts/ViewStubTest.java
index 53e251a..cbe498f 100644
--- a/tests/tests/view/src/android/view/cts/ViewStubTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewStubTest.java
@@ -157,13 +157,16 @@
 
     public void testAccessInflatedId() {
         ViewStub viewStub = new ViewStub(mContext);
-        assertEquals(0, viewStub.getInflatedId());
+        assertEquals("Default ViewStub inflated ID is View.NO_ID",
+                View.NO_ID, viewStub.getInflatedId());
 
         viewStub.setInflatedId(R.id.inflated_id);
-        assertEquals(R.id.inflated_id, viewStub.getInflatedId());
+        assertEquals("Set ViewStub inflated ID to package resource ID",
+                R.id.inflated_id, viewStub.getInflatedId());
 
-        viewStub.setInflatedId(-1);
-        assertEquals(-1, viewStub.getInflatedId());
+        viewStub.setInflatedId(View.NO_ID);
+        assertEquals("Set ViewStub inflated ID to View.NO_ID",
+                View.NO_ID, viewStub.getInflatedId());
     }
 
     @UiThreadTest
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index ffbec1e..34e4d09 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -56,6 +56,8 @@
 import android.view.HapticFeedbackConstants;
 import android.view.InputDevice;
 import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MotionEvent;
 import android.view.SoundEffectConstants;
 import android.view.TouchDelegate;
@@ -2077,24 +2079,24 @@
         assertEquals(viewId, container.keyAt(0));
 
         container.clear();
-        container.put(viewId, new BaseSavedState(BaseSavedState.EMPTY_STATE));
+        container.put(viewId, new android.graphics.Rect());
         try {
             view.restoreHierarchyState(container);
-            fail("should throw IllegalArgumentException");
+            fail("Parcelable state must be an AbsSaveState, should throw IllegalArgumentException");
         } catch (IllegalArgumentException e) {
             // expected
         }
 
         try {
             view.restoreHierarchyState(null);
-            fail("should throw NullPointerException");
+            fail("Cannot pass null to restoreHierarchyState(), should throw NullPointerException");
         } catch (NullPointerException e) {
             // expected
         }
 
         try {
             view.saveHierarchyState(null);
-            fail("should throw NullPointerException");
+            fail("Cannot pass null to saveHierarchyState(), should throw NullPointerException");
         } catch (NullPointerException e) {
             // expected
         }
@@ -2434,7 +2436,6 @@
         assertFalse(view.hasCalledDrawableStateChanged());
         view.setPressed(true);
         assertTrue(view.hasCalledDrawableStateChanged());
-        assertFalse(view.hasCalledOnCreateDrawableState());
         assertTrue(Arrays.equals(MockView.getPressedEnabledStateSet(), view.getDrawableState()));
         assertTrue(view.hasCalledOnCreateDrawableState());
 
@@ -2445,7 +2446,6 @@
         view.refreshDrawableState();
         assertTrue(view.hasCalledDrawableStateChanged());
         assertTrue(mMockParent.hasChildDrawableStateChanged());
-        assertFalse(view.hasCalledOnCreateDrawableState());
         assertTrue(Arrays.equals(MockView.getPressedEnabledStateSet(), view.getDrawableState()));
         assertTrue(view.hasCalledOnCreateDrawableState());
     }
@@ -3111,6 +3111,24 @@
         assertEquals(fadingEdgeLength, view.getVerticalFadingEdgeLength());
     }
 
+    @UiThreadTest
+    public void testScrollIndicators() {
+        MockView view = (MockView) mActivity.findViewById(R.id.scroll_view);
+
+        assertEquals("Set indicators match those specified in XML",
+                View.SCROLL_INDICATOR_TOP | View.SCROLL_INDICATOR_BOTTOM,
+                view.getScrollIndicators());
+
+        view.setScrollIndicators(0);
+        assertEquals("Cleared indicators", 0, view.getScrollIndicators());
+
+        view.setScrollIndicators(View.SCROLL_INDICATOR_START | View.SCROLL_INDICATOR_RIGHT);
+        assertEquals("Set start and right indicators",
+                View.SCROLL_INDICATOR_START | View.SCROLL_INDICATOR_RIGHT,
+                view.getScrollIndicators());
+
+    }
+
     public void testOnStartAndFinishTemporaryDetach() throws Throwable {
         final MockListView listView = new MockListView(mActivity);
         List<String> items = Lists.newArrayList("1", "2", "3");
@@ -3367,6 +3385,156 @@
                 bg.hasCalledSetTint());
     }
 
+    public void testStartActionModeWithParent() {
+        View view = new View(mActivity);
+        MockViewGroup parent = new MockViewGroup(mActivity);
+        parent.addView(view);
+
+        ActionMode mode = view.startActionMode(null);
+
+        assertNotNull(mode);
+        assertEquals(NO_OP_ACTION_MODE, mode);
+        assertTrue(parent.isStartActionModeForChildCalled);
+        assertEquals(ActionMode.TYPE_PRIMARY, parent.startActionModeForChildType);
+    }
+
+    public void testStartActionModeWithoutParent() {
+        View view = new View(mActivity);
+
+        ActionMode mode = view.startActionMode(null);
+
+        assertNull(mode);
+    }
+
+    public void testStartActionModeTypedWithParent() {
+        View view = new View(mActivity);
+        MockViewGroup parent = new MockViewGroup(mActivity);
+        parent.addView(view);
+
+        ActionMode mode = view.startActionMode(null, ActionMode.TYPE_FLOATING);
+
+        assertNotNull(mode);
+        assertEquals(NO_OP_ACTION_MODE, mode);
+        assertTrue(parent.isStartActionModeForChildCalled);
+        assertEquals(ActionMode.TYPE_FLOATING, parent.startActionModeForChildType);
+    }
+
+    public void testStartActionModeTypedWithoutParent() {
+        View view = new View(mActivity);
+
+        ActionMode mode = view.startActionMode(null, ActionMode.TYPE_FLOATING);
+
+        assertNull(mode);
+    }
+
+    private static class MockViewGroup extends ViewGroup {
+        boolean isStartActionModeForChildCalled = false;
+        int startActionModeForChildType = ActionMode.TYPE_PRIMARY;
+
+        public MockViewGroup(Context context) {
+            super(context);
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
+            isStartActionModeForChildCalled = true;
+            startActionModeForChildType = ActionMode.TYPE_PRIMARY;
+            return NO_OP_ACTION_MODE;
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(
+                View originalView, ActionMode.Callback callback, int type) {
+            isStartActionModeForChildCalled = true;
+            startActionModeForChildType = type;
+            return NO_OP_ACTION_MODE;
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {
+            // no-op
+        }
+    }
+
+    private static final ActionMode NO_OP_ACTION_MODE =
+            new ActionMode() {
+                @Override
+                public void setTitle(CharSequence title) {}
+
+                @Override
+                public void setTitle(int resId) {}
+
+                @Override
+                public void setSubtitle(CharSequence subtitle) {}
+
+                @Override
+                public void setSubtitle(int resId) {}
+
+                @Override
+                public void setCustomView(View view) {}
+
+                @Override
+                public void invalidate() {}
+
+                @Override
+                public void finish() {}
+
+                @Override
+                public Menu getMenu() {
+                    return null;
+                }
+
+                @Override
+                public CharSequence getTitle() {
+                    return null;
+                }
+
+                @Override
+                public CharSequence getSubtitle() {
+                    return null;
+                }
+
+                @Override
+                public View getCustomView() {
+                    return null;
+                }
+
+                @Override
+                public MenuInflater getMenuInflater() {
+                    return null;
+                }
+            };
+
+    public void testTranslationSetter() {
+        View view = new View(mActivity);
+        float offset = 10.0f;
+        view.setTranslationX(offset);
+        view.setTranslationY(offset);
+        view.setTranslationZ(offset);
+        view.setElevation(offset);
+
+        assertEquals("Incorrect translationX", offset, view.getTranslationX());
+        assertEquals("Incorrect translationY", offset, view.getTranslationY());
+        assertEquals("Incorrect translationZ", offset, view.getTranslationZ());
+        assertEquals("Incorrect elevation", offset, view.getElevation());
+    }
+
+    public void testXYZ() {
+        View view = new View(mActivity);
+        float offset = 10.0f;
+        float start = 15.0f;
+        view.setTranslationX(offset);
+        view.setLeft((int) start);
+        view.setTranslationY(offset);
+        view.setTop((int) start);
+        view.setTranslationZ(offset);
+        view.setElevation(start);
+
+        assertEquals("Incorrect X value", offset + start, view.getX());
+        assertEquals("Incorrect Y value", offset + start, view.getY());
+        assertEquals("Incorrect Z value", offset + start, view.getZ());
+    }
+
     private static class MockDrawable extends Drawable {
         private boolean mCalledSetTint = false;
 
@@ -3582,6 +3750,11 @@
             return null;
         }
 
+        public ActionMode startActionModeForChild(View originalView,
+                ActionMode.Callback callback, int type) {
+            return null;
+        }
+
         public boolean hasShowContextMenuForChild() {
             return mHasShowContextMenuForChild;
         }
diff --git a/tests/tests/view/src/android/view/cts/WindowTest.java b/tests/tests/view/src/android/view/cts/WindowTest.java
index 3c5386d..dcfcfb7 100644
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -49,6 +49,7 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
+import android.view.SearchEvent;
 import android.view.Surface;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
@@ -1105,6 +1106,10 @@
             return mIsOnPanelClosedCalled;
         }
 
+        public boolean onSearchRequested(SearchEvent searchEvent) {
+            return onSearchRequested();
+        }
+
         public boolean onSearchRequested() {
             return false;
         }
@@ -1113,6 +1118,11 @@
             return null;
         }
 
+        public ActionMode onWindowStartingActionMode(
+                ActionMode.Callback callback, int type) {
+            return null;
+        }
+
         public void onActionModeStarted(ActionMode mode) {
         }
 
diff --git a/tests/tests/webkit/Android.mk b/tests/tests/webkit/Android.mk
index c2d8c3c..17a1f27 100644
--- a/tests/tests/webkit/Android.mk
+++ b/tests/tests/webkit/Android.mk
@@ -21,7 +21,7 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := android.test.runner org.apache.http.legacy
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctsdeviceutillegacy ctstestserver ctstestrunner
 
diff --git a/tests/tests/webkit/AndroidManifest.xml b/tests/tests/webkit/AndroidManifest.xml
index a5bc2bb..098acd9 100644
--- a/tests/tests/webkit/AndroidManifest.xml
+++ b/tests/tests/webkit/AndroidManifest.xml
@@ -28,6 +28,7 @@
                   android:exported="true"
                   android:authorities="android.webkit.cts.MockContentProvider" />
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
 
         <activity android:name="android.webkit.cts.CookieSyncManagerCtsActivity"
             android:label="CookieSyncManagerCtsActivity"
diff --git a/tests/tests/webkit/assets/webkit/test_bad_image_url.html b/tests/tests/webkit/assets/webkit/test_bad_image_url.html
new file mode 100644
index 0000000..b9e0054
--- /dev/null
+++ b/tests/tests/webkit/assets/webkit/test_bad_image_url.html
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<html>
+  <body>
+    <img src="invalidscheme://some/resource" />
+  </body>
+</html>
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
index c612886..856b4aa 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
@@ -319,8 +319,6 @@
         assertFalse(anyDeleted.get());
     }
 
-    /*
-    TODO: uncomment when acceptThirdPartyCookies implementation lands
     public void testThirdPartyCookie() throws Throwable {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
@@ -377,7 +375,6 @@
             mOnUiThread.getSettings().setJavaScriptEnabled(false);
         }
     }
-    */
 
     public void testb3167208() throws Exception {
         if (!NullWebViewUtils.isWebViewAvailable()) {
diff --git a/tests/tests/webkit/src/android/webkit/cts/PostMessageTest.java b/tests/tests/webkit/src/android/webkit/cts/PostMessageTest.java
new file mode 100644
index 0000000..2a6af6e
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/PostMessageTest.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit.cts;
+
+import android.cts.util.NullWebViewUtils;
+import android.cts.util.PollingCheck;
+import android.net.Uri;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.webkit.WebMessage;
+import android.webkit.WebMessagePort;
+import android.webkit.WebView;
+
+import java.util.concurrent.CountDownLatch;
+import junit.framework.Assert;
+
+public class PostMessageTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
+    public static final long TIMEOUT = 20000L;
+
+    private WebView mWebView;
+    private WebViewOnUiThread mOnUiThread;
+
+    private static final String WEBVIEW_MESSAGE = "from_webview";
+    private static final String BASE_URI = "http://www.example.com";
+
+    public PostMessageTest() {
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        final WebViewCtsActivity activity = getActivity();
+        mWebView = activity.getWebView();
+        if (mWebView != null) {
+            mOnUiThread = new WebViewOnUiThread(this, mWebView);
+            mOnUiThread.getSettings().setJavaScriptEnabled(true);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mOnUiThread != null) {
+            mOnUiThread.cleanUp();
+        }
+        super.tearDown();
+    }
+
+    private static final String TITLE_FROM_POST_MESSAGE =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        var received = '';"
+            + "        onmessage = function (e) {"
+            + "            received += e.data;"
+            + "            document.title = received; };"
+            + "    </script>"
+            + "</body></html>";
+
+    // Acks each received message from the message channel with a seq number.
+    private static final String CHANNEL_MESSAGE =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        var counter = 0;"
+            + "        onmessage = function (e) {"
+            + "            var myPort = e.ports[0];"
+            + "            myPort.onmessage = function (f) {"
+            + "                myPort.postMessage(f.data + counter++);"
+            + "            }"
+            + "        }"
+            + "   </script>"
+            + "</body></html>";
+
+    private void loadPage(String data) {
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion(BASE_URI, data,
+                "text/html", "UTF-8", null);
+    }
+
+    private void waitForTitle(final String title) {
+        new PollingCheck(TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getTitle().equals(title);
+            }
+        }.run();
+    }
+
+    // Post a string message to main frame and make sure it is received.
+    public void testSimpleMessageToMainFrame() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(TITLE_FROM_POST_MESSAGE);
+        WebMessage message = new WebMessage(WEBVIEW_MESSAGE);
+        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
+        waitForTitle(WEBVIEW_MESSAGE);
+    }
+
+    // Post multiple messages to main frame and make sure they are received in
+    // correct order.
+    public void testMultipleMessagesToMainFrame() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(TITLE_FROM_POST_MESSAGE);
+        for (int i = 0; i < 10; i++) {
+            mOnUiThread.postWebMessage(new WebMessage(Integer.toString(i)),
+                    Uri.parse(BASE_URI));
+        }
+        waitForTitle("0123456789");
+    }
+
+    // Create a message channel and make sure it can be used for data transfer to/from js.
+    public void testMessageChannel() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(CHANNEL_MESSAGE);
+        final WebMessagePort[] channel = mOnUiThread.createWebMessageChannel();
+        WebMessage message = new WebMessage(WEBVIEW_MESSAGE, new WebMessagePort[]{channel[1]});
+        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
+        final int messageCount = 3;
+        final CountDownLatch latch = new CountDownLatch(messageCount);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                for (int i = 0; i < messageCount; i++) {
+                    channel[0].postMessage(new WebMessage(WEBVIEW_MESSAGE + i));
+                }
+                channel[0].setWebMessageCallback(new WebMessagePort.WebMessageCallback() {
+                    @Override
+                    public void onMessage(WebMessagePort port, WebMessage message) {
+                        int i = messageCount - (int)latch.getCount();
+                        assertEquals(WEBVIEW_MESSAGE + i + i, message.getData());
+                        latch.countDown();
+                    }
+                });
+            }
+        });
+        // Wait for all the responses to arrive.
+        boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILLISECONDS);
+    }
+
+    // Test that a message port that is closed cannot used to send a message
+    public void testClose() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(CHANNEL_MESSAGE);
+        final WebMessagePort[] channel = mOnUiThread.createWebMessageChannel();
+        WebMessage message = new WebMessage(WEBVIEW_MESSAGE, new WebMessagePort[]{channel[1]});
+        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    channel[0].close();
+                    channel[0].postMessage(new WebMessage(WEBVIEW_MESSAGE));
+                } catch (IllegalStateException ex) {
+                    // expect to receive an exception
+                    return;
+                }
+                Assert.fail("A closed port cannot be used to transfer messages");
+            }
+         });
+    }
+
+    // Sends a new message channel from JS to Java.
+    private static final String CHANNEL_FROM_JS =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        var counter = 0;"
+            + "        var mc = new MessageChannel();"
+            + "        var received = '';"
+            + "        mc.port1.onmessage = function (e) {"
+            + "               received = e.data;"
+            + "               document.title = e.data;"
+            + "        };"
+            + "        onmessage = function (e) {"
+            + "            var myPort = e.ports[0];"
+            + "            myPort.postMessage('', [mc.port2]);"
+            + "        };"
+            + "   </script>"
+            + "</body></html>";
+
+    // Test a message port created in JS can be received and used for message transfer.
+    public void testReceiveMessagePort() throws Throwable {
+        final String hello = "HELLO";
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(CHANNEL_FROM_JS);
+        final WebMessagePort[] channel = mOnUiThread.createWebMessageChannel();
+        WebMessage message = new WebMessage(WEBVIEW_MESSAGE, new WebMessagePort[]{channel[1]});
+        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                channel[0].setWebMessageCallback(new WebMessagePort.WebMessageCallback() {
+                    @Override
+                    public void onMessage(WebMessagePort port, WebMessage message) {
+                        message.getPorts()[0].postMessage(new WebMessage(hello));
+                    }
+                });
+            }
+        });
+        waitForTitle(hello);
+    }
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
index 30b8210..1ab5e5a 100644
--- a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
+++ b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
@@ -67,6 +67,9 @@
     public static final String STOP_LOADING_URL = "webkit/test_stop_loading.html";
     public static final String BLANK_TAG_URL = "webkit/blank_tag.html";
     public static final String PAGE_WITH_LINK_URL = "webkit/page_with_link.html";
+    // Not a real page, just triggers a 404 response.
+    public static final String NON_EXISTENT_PAGE_URL = "webkit/generate_404.html";
+    public static final String BAD_IMAGE_PAGE_URL = "webkit/test_bad_image_url.html";
 
     // Must match the title of the page at
     // android/frameworks/base/core/res/res/raw/loaderror.html
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index 7a2d394..a52eabe 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -505,6 +505,16 @@
         assertTrue(mSettings.getPluginsEnabled());
     }
 
+    public void testOffscreenPreRaster() {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        assertFalse(mSettings.getOffscreenPreRaster());
+
+        mSettings.setOffscreenPreRaster(true);
+        assertTrue(mSettings.getOffscreenPreRaster());
+    }
+
     public void testAccessPluginsPath() {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 5b906ba..0697429 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -27,6 +27,7 @@
 import android.webkit.HttpAuthHandler;
 import android.webkit.ValueCallback;
 import android.webkit.WebChromeClient;
+import android.webkit.WebResourceError;
 import android.webkit.WebResourceRequest;
 import android.webkit.WebResourceResponse;
 import android.webkit.WebSettings;
@@ -223,6 +224,37 @@
                 webViewClient.hasOnReceivedErrorCode());
     }
 
+    public void testOnReceivedErrorForSubresource() throws Exception {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mOnUiThread.setWebViewClient(webViewClient);
+        mWebServer = new CtsTestServer(getActivity());
+
+        assertEquals(null, webViewClient.hasOnReceivedResourceError());
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.BAD_IMAGE_PAGE_URL);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertTrue(webViewClient.hasOnReceivedResourceError() != null);
+        assertEquals(WebViewClient.ERROR_UNSUPPORTED_SCHEME,
+                webViewClient.hasOnReceivedResourceError().getErrorCode());
+    }
+
+    public void testOnReceivedHttpError() throws Exception {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mOnUiThread.setWebViewClient(webViewClient);
+        mWebServer = new CtsTestServer(getActivity());
+
+        assertEquals(null, webViewClient.hasOnReceivedHttpError());
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.NON_EXISTENT_PAGE_URL);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertTrue(webViewClient.hasOnReceivedHttpError() != null);
+        assertEquals(404, webViewClient.hasOnReceivedHttpError().getStatusCode());
+    }
+
     public void testOnFormResubmission() throws Exception {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
@@ -504,6 +536,8 @@
         private boolean mOnPageFinishedCalled;
         private boolean mOnLoadResourceCalled;
         private int mOnReceivedErrorCode;
+        private WebResourceError mOnReceivedResourceError;
+        private WebResourceResponse mOnReceivedHttpError;
         private boolean mOnFormResubmissionCalled;
         private boolean mDoUpdateVisitedHistoryCalled;
         private boolean mOnReceivedHttpAuthRequestCalled;
@@ -532,6 +566,14 @@
             return mOnReceivedErrorCode;
         }
 
+        public WebResourceError hasOnReceivedResourceError() {
+            return mOnReceivedResourceError;
+        }
+
+        public WebResourceResponse hasOnReceivedHttpError() {
+            return mOnReceivedHttpError;
+        }
+
         public boolean hasOnFormResubmissionCalled() {
             return mOnFormResubmissionCalled;
         }
@@ -589,6 +631,20 @@
         }
 
         @Override
+        public void onReceivedError(WebView view, WebResourceRequest request,
+                WebResourceError error) {
+            super.onReceivedError(view, request, error);
+            mOnReceivedResourceError = error;
+        }
+
+        @Override
+        public void onReceivedHttpError(WebView view,  WebResourceRequest request,
+                WebResourceResponse errorResponse) {
+            super.onReceivedHttpError(view, request, errorResponse);
+            mOnReceivedHttpError = errorResponse;
+        }
+
+        @Override
         public void onFormResubmission(WebView view, Message dontResend, Message resend) {
             mOnFormResubmissionCalled = true;
             dontResend.sendToTarget();
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index b381d72..dba2243 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -65,6 +65,7 @@
 import android.webkit.WebView;
 import android.webkit.WebView.HitTestResult;
 import android.webkit.WebView.PictureListener;
+import android.webkit.WebView.VisualStateCallback;
 import android.webkit.WebViewClient;
 import android.webkit.WebViewDatabase;
 import android.webkit.cts.WebViewOnUiThread.WaitForLoadedClient;
@@ -122,6 +123,11 @@
      */
     private static final long SCROLL_WAIT_INTERVAL_MS = 200;
 
+    /**
+     * Epsilon used in page scale value comparisons.
+     */
+    private static final float PAGE_SCALE_EPSILON = 0.0001f;
+
     private WebView mWebView;
     private CtsTestServer mWebServer;
     private WebViewOnUiThread mOnUiThread;
@@ -219,6 +225,9 @@
         // full address
         assertEquals("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92826",
                 WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92826"));
+        // Zipcode is optional.
+        assertEquals("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA",
+                WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA"));
         // not an address
         assertNull(WebView.findAddress("This is not an address: no town, no state, no zip."));
     }
@@ -330,7 +339,7 @@
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
-        assertEquals(currScale, previousScale);
+        assertEquals(currScale, previousScale, PAGE_SCALE_EPSILON);
 
         assertTrue(mOnUiThread.zoomOut());
         previousScale = currScale;
@@ -354,7 +363,7 @@
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
-        assertEquals(currScale, previousScale);
+        assertEquals(currScale, previousScale, PAGE_SCALE_EPSILON);
 
         mOnUiThread.zoomBy(1.25f);
         previousScale = currScale;
@@ -378,7 +387,7 @@
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
-        assertEquals(currScale, previousScale);
+        assertEquals(currScale, previousScale, PAGE_SCALE_EPSILON);
 
         mOnUiThread.zoomBy(0.8f);
         previousScale = currScale;
@@ -402,7 +411,7 @@
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
-        assertEquals(currScale, previousScale);
+        assertEquals(currScale, previousScale, PAGE_SCALE_EPSILON);
     }
 
     @UiThreadTest
@@ -2446,6 +2455,47 @@
         }
     }
 
+    public void testVisualStateCallbackCalled() throws Exception {
+        // Check that the visual state callback is called correctly.
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+
+        final CountDownLatch callbackLatch = new CountDownLatch(1);
+        final long kRequest = 100;
+
+        mOnUiThread.loadUrl("about:blank");
+
+        mOnUiThread.postVisualStateCallback(kRequest, new VisualStateCallback() {
+            public void onComplete(long requestId) {
+                assertEquals(kRequest, requestId);
+                callbackLatch.countDown();
+            }
+        });
+
+        assertTrue(callbackLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
+    }
+
+    public void testOnPageCommitVisibleCalled() throws Exception {
+        // Check that the onPageCommitVisible callback is called
+        // correctly.
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+
+        final CountDownLatch callbackLatch = new CountDownLatch(1);
+
+        mOnUiThread.setWebViewClient(new WebViewClient() {
+                public void onPageCommitVisible(WebView view, String url) {
+                    assertEquals(url, "about:blank");
+                    callbackLatch.countDown();
+                }
+            });
+
+        mOnUiThread.loadUrl("about:blank");
+        assertTrue(callbackLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
+    }
+
     private void savePrintedPage(final PrintDocumentAdapter adapter,
             final ParcelFileDescriptor descriptor, final FutureTask<Boolean> result) {
         adapter.onWrite(new PageRange[] {PageRange.ALL_PAGES}, descriptor,
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
index 81a1a4b..4fadafc 100644
--- a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
@@ -383,6 +383,34 @@
         assertEquals(1, mAdapterView.getSelectedItemId());
         assertEquals(1, mAdapterView.getSelectedItemPosition());
         assertEquals(FRUIT[1], mAdapterView.getSelectedItem());
+
+        // Ensure getSelectedItemZzz() synchronizes after data set change.
+        ArrayAdapter<String> adapter = new ArrayAdapter<>(
+                getActivity(), android.R.layout.simple_list_item_1);
+        adapter.add(FRUIT[0]);
+        adapter.add(FRUIT[1]);
+
+        ListAdapter previousAdapter = mAdapterView.getAdapter();
+        mAdapterView.setAdapter(adapter);
+        mAdapterView.setSelection(1);
+        assertEquals("Initial getSelectedItemId() is correct",
+                1, mAdapterView.getSelectedItemId());
+        assertEquals("Initial getSelectedItemPosition() is correct",
+                1, mAdapterView.getSelectedItemPosition());
+
+        adapter.remove(FRUIT[0]);
+        assertEquals("Synchronized getSelectedItemId() after data set invalidation",
+                0, mAdapterView.getSelectedItemId());
+        assertEquals("Synchronized getSelectedItemPosition() after data set invalidation",
+                0, mAdapterView.getSelectedItemPosition());
+
+        adapter.clear();
+        assertEquals("Synchronized getSelectedItemId() after data set cleared",
+                AdapterView.INVALID_ROW_ID, mAdapterView.getSelectedItemId());
+        assertEquals("Synchronized getSelectedItemPosition() after data set cleared",
+                AdapterView.INVALID_POSITION, mAdapterView.getSelectedItemPosition());
+
+        mAdapterView.setAdapter(previousAdapter);
     }
 
     /*
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index c14bb03..706ad8d 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -189,8 +189,7 @@
 
     public void testAccessHeight() {
         mPopupWindow = new PopupWindow(mActivity);
-        // default is 0
-        assertEquals(0, mPopupWindow.getHeight());
+        assertEquals(WindowManager.LayoutParams.WRAP_CONTENT, mPopupWindow.getHeight());
 
         int height = getDisplay().getHeight() / 2;
         mPopupWindow.setHeight(height);
@@ -224,7 +223,7 @@
 
     public void testAccessWidth() {
         mPopupWindow = new PopupWindow(mActivity);
-        assertEquals(0, mPopupWindow.getWidth());
+        assertEquals(WindowManager.LayoutParams.WRAP_CONTENT, mPopupWindow.getWidth());
 
         int width = getDisplay().getWidth() / 2;
         mPopupWindow.setWidth(width);
@@ -418,7 +417,7 @@
         mPopupWindow.setOutsideTouchable(true);
 
         WindowManager.LayoutParams p = (WindowManager.LayoutParams)
-                mPopupWindow.getContentView().getLayoutParams();
+                mPopupWindow.getContentView().getRootView().getLayoutParams();
 
         assertEquals(0, WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES & p.flags);
         assertEquals(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
@@ -748,7 +747,7 @@
         mPopupWindow = new PopupWindow(new TextView(mActivity));
         showPopup();
 
-        ViewGroup.LayoutParams p = mPopupWindow.getContentView().getLayoutParams();
+        ViewGroup.LayoutParams p = mPopupWindow.getContentView().getRootView().getLayoutParams();
         assertEquals(0, p.width);
         assertEquals(0, p.height);
 
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index 480e1a6..7d6d33b 100644
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -40,6 +40,7 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Parcelable;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.TouchUtils;
 import android.test.UiThreadTest;
@@ -85,6 +86,7 @@
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.ExtractedText;
 import android.view.inputmethod.ExtractedTextRequest;
+import android.view.inputmethod.InputConnection;
 import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
@@ -94,6 +96,7 @@
 import android.widget.TextView.OnEditorActionListener;
 
 import java.io.IOException;
+import java.util.Locale;
 
 /**
  * Test {@link TextView}.
@@ -128,6 +131,21 @@
         mInstrumentation = getInstrumentation();
     }
 
+    /**
+     * Promotes the TextView to editable and places focus in it to allow simulated typing.
+     */
+    private void initTextViewForTyping() {
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView = findTextView(R.id.textview_text);
+                mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
+                mTextView.setText("", BufferType.EDITABLE);
+                mTextView.requestFocus();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
     public void testConstructor() {
         new TextView(mActivity);
 
@@ -1241,6 +1259,414 @@
         }
     }
 
+    public void testUndo_insert() {
+        initTextViewForTyping();
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Precondition: The cursor is at the end of the text.
+                assertEquals(3, mTextView.getSelectionStart());
+
+                // Undo removes the typed string in one step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+                assertEquals(0, mTextView.getSelectionStart());
+
+                // Redo restores the text and cursor position.
+                mTextView.onTextContextMenuItem(android.R.id.redo);
+                assertEquals("abc", mTextView.getText().toString());
+                assertEquals(3, mTextView.getSelectionStart());
+
+                // Undoing the redo clears the text again.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+
+                // Undo when the undo stack is empty does nothing.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_delete() {
+        initTextViewForTyping();
+
+        // Simulate deleting text and undoing it.
+        mInstrumentation.sendStringSync("xyz");
+        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Precondition: The text was actually deleted.
+                assertEquals("", mTextView.getText().toString());
+                assertEquals(0, mTextView.getSelectionStart());
+
+                // Undo restores the typed string and cursor position in one step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("xyz", mTextView.getText().toString());
+                assertEquals(3, mTextView.getSelectionStart());
+
+                // Redo removes the text in one step.
+                mTextView.onTextContextMenuItem(android.R.id.redo);
+                assertEquals("", mTextView.getText().toString());
+                assertEquals(0, mTextView.getSelectionStart());
+
+                // Undoing the redo restores the text again.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("xyz", mTextView.getText().toString());
+                assertEquals(3, mTextView.getSelectionStart());
+
+                // Undoing again undoes the original typing.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+                assertEquals(0, mTextView.getSelectionStart());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    // Initialize the text view for simulated IME typing. Must be called on UI thread.
+    private InputConnection initTextViewForSimulatedIme() {
+        mTextView = findTextView(R.id.textview_text);
+        mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
+        mTextView.setText("", BufferType.EDITABLE);
+        return mTextView.onCreateInputConnection(new EditorInfo());
+    }
+
+    // Simulates IME composing text behavior.
+    private void setComposingTextInBatch(InputConnection input, CharSequence text) {
+        input.beginBatchEdit();
+        input.setComposingText(text, 1);  // Leave cursor at end.
+        input.endBatchEdit();
+    }
+
+    @UiThreadTest
+    public void testUndo_imeInsertLatin() {
+        InputConnection input = initTextViewForSimulatedIme();
+
+        // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words,
+        // such as "c" -> "ca" -> "cat" -> "cat ".
+        setComposingTextInBatch(input, "c");
+        setComposingTextInBatch(input, "ca");
+
+        // The completion and space are added in the same batch.
+        input.beginBatchEdit();
+        input.commitText("cat", 1);
+        input.commitText(" ", 1);
+        input.endBatchEdit();
+
+        // The repeated replacements undo in a single step.
+        mTextView.onTextContextMenuItem(android.R.id.undo);
+        assertEquals("", mTextView.getText().toString());
+    }
+
+    @UiThreadTest
+    public void testUndo_imeInsertJapanese() {
+        InputConnection input = initTextViewForSimulatedIme();
+
+        // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji.
+        final String HA = "\u306F";  // HIRAGANA LETTER HA
+        final String NA = "\u306A";  // HIRAGANA LETTER NA
+        setComposingTextInBatch(input, "h");
+        setComposingTextInBatch(input, HA);
+        setComposingTextInBatch(input, HA + "n");
+        setComposingTextInBatch(input, HA + NA);
+
+        // The result may be a surrogate pair. The composition ends in the same batch.
+        input.beginBatchEdit();
+        input.commitText("\uD83C\uDF37", 1);  // U+1F337 TULIP
+        input.setComposingText("", 1);
+        input.endBatchEdit();
+
+        // The repeated replacements are a single undo step.
+        mTextView.onTextContextMenuItem(android.R.id.undo);
+        assertEquals("", mTextView.getText().toString());
+    }
+
+    @UiThreadTest
+    public void testUndo_imeCancel() {
+        InputConnection input = initTextViewForSimulatedIme();
+        mTextView.setText("flower");
+
+        // Start typing a composition.
+        final String HA = "\u306F";  // HIRAGANA LETTER HA
+        setComposingTextInBatch(input, "h");
+        setComposingTextInBatch(input, HA);
+        setComposingTextInBatch(input, HA + "n");
+
+        // Cancel the composition.
+        setComposingTextInBatch(input, "");
+
+        // Undo and redo do nothing.
+        mTextView.onTextContextMenuItem(android.R.id.undo);
+        assertEquals("flower", mTextView.getText().toString());
+        mTextView.onTextContextMenuItem(android.R.id.redo);
+        assertEquals("flower", mTextView.getText().toString());
+    }
+
+    @UiThreadTest
+    public void testUndo_imeEmptyBatch() {
+        InputConnection input = initTextViewForSimulatedIme();
+        mTextView.setText("flower");
+
+        // Send an empty batch edit. This happens if the IME is hidden and shown.
+        input.beginBatchEdit();
+        input.endBatchEdit();
+
+        // Undo and redo do nothing.
+        mTextView.onTextContextMenuItem(android.R.id.undo);
+        assertEquals("flower", mTextView.getText().toString());
+        mTextView.onTextContextMenuItem(android.R.id.redo);
+        assertEquals("flower", mTextView.getText().toString());
+    }
+
+    public void testUndo_setText() {
+        initTextViewForTyping();
+
+        // Create two undo operations, an insert and a delete.
+        mInstrumentation.sendStringSync("xyz");
+        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Calling setText() clears both undo operations, so undo doesn't happen.
+                mTextView.setText("Hello", BufferType.EDITABLE);
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("Hello", mTextView.getText().toString());
+
+                // Clearing text programmatically does not undo either.
+                mTextView.setText("", BufferType.EDITABLE);
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testRedo_setText() {
+        initTextViewForTyping();
+
+        // Type some text. This creates an undo entry.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Undo the typing to create a redo entry.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+
+                // Calling setText() clears the redo stack, so redo doesn't happen.
+                mTextView.setText("Hello", BufferType.EDITABLE);
+                mTextView.onTextContextMenuItem(android.R.id.redo);
+                assertEquals("Hello", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_directAppend() {
+        initTextViewForTyping();
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Programmatically append some text.
+                mTextView.append("def");
+                assertEquals("abcdef", mTextView.getText().toString());
+
+                // Undo removes the append as a separate step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("abc", mTextView.getText().toString());
+
+                // Another undo removes the original typing.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_directInsert() {
+        initTextViewForTyping();
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Directly modify the underlying Editable to insert some text.
+                // NOTE: This is a violation of the API of getText() which specifies that the
+                // returned object should not be modified. However, some apps do this anyway and
+                // the framework needs to handle it.
+                Editable text = (Editable) mTextView.getText();
+                text.insert(0, "def");
+                assertEquals("defabc", mTextView.getText().toString());
+
+                // Undo removes the insert as a separate step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("abc", mTextView.getText().toString());
+
+                // Another undo removes the original typing.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_noCursor() {
+        initTextViewForTyping();
+
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Append some text to create an undo operation. There is no cursor present.
+                mTextView.append("cat");
+
+                // Place the cursor at the end of the text so the undo will have to change it.
+                Selection.setSelection((Spannable) mTextView.getText(), 3);
+
+                // Undo the append. This should not crash, despite not having a valid cursor
+                // position in the undo operation.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_textWatcher() {
+        initTextViewForTyping();
+
+        // Add a TextWatcher that converts the text to spaces on each change.
+        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // TextWatcher altered the text.
+                assertEquals("   ", mTextView.getText().toString());
+
+                // Undo reverses both changes in one step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_textWatcherDirectAppend() {
+        initTextViewForTyping();
+
+        // Add a TextWatcher that converts the text to spaces on each change.
+        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
+
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Programmatically append some text. The TextWatcher changes it to spaces.
+                mTextView.append("abc");
+                assertEquals("   ", mTextView.getText().toString());
+
+                // Undo reverses both changes in one step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_shortcuts() {
+        initTextViewForTyping();
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Pressing Control-Z triggers undo.
+                KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0,
+                        KeyEvent.META_CTRL_LEFT_ON);
+                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control));
+                assertEquals("", mTextView.getText().toString());
+
+                // Pressing Control-Shift-Z triggers redo.
+                KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z,
+                        0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
+                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift));
+                assertEquals("abc", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_saveInstanceState() {
+        initTextViewForTyping();
+
+        // Type some text to create an undo operation.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Parcel and unparcel the TextView.
+                Parcelable state = mTextView.onSaveInstanceState();
+                mTextView.onRestoreInstanceState(state);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Delete a character to create a new undo operation.
+        sendKeys(KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                assertEquals("ab", mTextView.getText().toString());
+
+                // Undo the delete.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("abc", mTextView.getText().toString());
+
+                // Undo the typing, which verifies that the original undo operation was parceled
+                // correctly.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+
+                // Parcel and unparcel the undo stack (which is empty but has been used and may
+                // contain other state).
+                Parcelable state = mTextView.onSaveInstanceState();
+                mTextView.onRestoreInstanceState(state);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_saveInstanceStateEmpty() {
+        initTextViewForTyping();
+
+        // Type and delete to create two new undo operations.
+        mInstrumentation.sendStringSync("a");
+        sendKeys(KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Empty the undo stack then parcel and unparcel the TextView. While the undo
+                // stack contains no operations it may contain other state.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                Parcelable state = mTextView.onSaveInstanceState();
+                mTextView.onRestoreInstanceState(state);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Create two more undo operations.
+        mInstrumentation.sendStringSync("b");
+        sendKeys(KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Verify undo still works.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("b", mTextView.getText().toString());
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
     @UiThreadTest
     public void testSetText() {
         TextView tv = findTextView(R.id.textview_text);
@@ -1583,17 +2009,7 @@
     }
 
     public void testPressKey() {
-        final QwertyKeyListener qwertyKeyListener
-                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView = findTextView(R.id.textview_text);
-                mTextView.setKeyListener(qwertyKeyListener);
-                mTextView.setText("", BufferType.EDITABLE);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        initTextViewForTyping();
 
         mInstrumentation.sendStringSync("a");
         assertEquals("a", mTextView.getText().toString());
@@ -3005,6 +3421,39 @@
         assertTrue(mTextView.didTouchFocusSelect());
     }
 
+    public void testSelectAllJustAfterTap() {
+        // Prepare an EditText with focus.
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView = new EditText(mActivity);
+                mActivity.setContentView(mTextView);
+
+                assertFalse(mTextView.didTouchFocusSelect());
+                mTextView.setFocusable(true);
+                mTextView.requestFocus();
+                assertTrue(mTextView.didTouchFocusSelect());
+
+                mTextView.setText("Hello, World.", BufferType.SPANNABLE);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Tap the view to show InsertPointController.
+        TouchUtils.tapView(this, mTextView);
+
+        // Execute SelectAll context menu.
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView.onTextContextMenuItem(android.R.id.selectAll);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // The selection must be whole of the text contents.
+        assertEquals(0, mTextView.getSelectionStart());
+        assertEquals(mTextView.length(), mTextView.getSelectionEnd());
+    }
+
     public void testExtractText() {
         mTextView = new TextView(mActivity);
 
@@ -3022,6 +3471,11 @@
 
         assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
                 outText.text.toString());
+
+        // Tests for invalid arguments.
+        assertFalse(mTextView.extractText(request, null));
+        assertFalse(mTextView.extractText(null, outText));
+        assertFalse(mTextView.extractText(null, null));
     }
 
     @UiThreadTest
@@ -3200,6 +3654,26 @@
         assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
     }
 
+    public void testAllCapsLocalization() {
+        String testString = "abcdefghijklmnopqrstuvwxyz";
+
+        // The capitalized characters of "i" on Turkish and Azerbaijani are different from English.
+        Locale[] testLocales = {
+            new Locale("az", "AZ"),
+            new Locale("tr", "TR"),
+            new Locale("en", "US"),
+        };
+
+        TextView tv = new TextView(mActivity);
+        tv.setAllCaps(true);
+        for (Locale locale: testLocales) {
+            tv.setTextLocale(locale);
+            assertEquals("Locale: " + locale.getDisplayName(),
+                         testString.toUpperCase(locale),
+                         tv.getTransformationMethod().getTransformation(testString, tv).toString());
+        }
+    }
+
     @UiThreadTest
     public void testTextAlignmentDefault() {
         TextView tv = new TextView(getActivity());
@@ -3925,4 +4399,35 @@
             }
         }
     }
+
+    /**
+     * A TextWatcher that converts the text to spaces whenever the text changes.
+     */
+    private static class ConvertToSpacesTextWatcher implements TextWatcher {
+        boolean mChangingText;
+
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            // Avoid infinite recursion.
+            if (mChangingText) {
+                return;
+            }
+            mChangingText = true;
+            // Create a string of s.length() spaces.
+            StringBuilder builder = new StringBuilder(s.length());
+            for (int i = 0; i < s.length(); i++) {
+                builder.append(' ');
+            }
+            s.replace(0, s.length(), builder.toString());
+            mChangingText = false;
+        }
+    }
 }
diff --git a/tests/uiautomator/test-apps/CtsUiAutomatorApp/Android.mk b/tests/uiautomator/test-apps/CtsUiAutomatorApp/Android.mk
index 90bdb61..60a0ba6 100644
--- a/tests/uiautomator/test-apps/CtsUiAutomatorApp/Android.mk
+++ b/tests/uiautomator/test-apps/CtsUiAutomatorApp/Android.mk
@@ -24,10 +24,10 @@
 LOCAL_SDK_VERSION := current
 
 LOCAL_PACKAGE_NAME := CtsUiAutomatorApp
-LOCAL_STATIC_JAVA_LIBRARIES = android-support-v4
+LOCAL_JAVA_LIBRARIES = android-support-v4
 
 LOCAL_PROGUARD_ENABLED := disabled
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/webgl/AndroidManifest.xml b/tests/webgl/AndroidManifest.xml
deleted file mode 100755
index d648032..0000000
--- a/tests/webgl/AndroidManifest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.webgl.cts">
-
-    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <uses-permission android:name="android.permission.INTERNET" />
-
-    <application android:maxRecents="1">
-        <uses-library android:name="android.test.runner" />
-        <activity android:name="android.webgl.WebGLActivity" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-
-    <!--  self-instrumenting test package. -->
-    <instrumentation
-        android:name="android.support.test.runner.AndroidJUnitRunner"
-        android:label="CTS WebGL tests"
-        android:targetPackage="android.webgl.cts" >
-        <meta-data
-            android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener" />
-    </instrumentation>
-</manifest>
-
diff --git a/tests/webgl/res/raw/extract_webgl_tests.py b/tests/webgl/res/raw/extract_webgl_tests.py
deleted file mode 100755
index 1511632..0000000
--- a/tests/webgl/res/raw/extract_webgl_tests.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright (C) 2014 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import sys
-import os
-
-if len(sys.argv) != 3:
-  raise Exception("Usage: extract_webgl_tests.py <webgl_sdk_tests_path> <version>")
-
-top_list = sys.argv[1] + "/00_test_list.txt"
-version = sys.argv[2]
-tests = []
-lists = []
-lists.append(top_list)
-
-def filter_by_version(lines):
-  version_lines = [ line for line in lines if "--min-version" in line ]
-  version_lines.extend([ line for line in lines if "--max-version" in line ])
-  lines = [ line for line in lines if not line in version_lines ]
-  for line in version_lines:
-    assert len(line.split()) == 3
-    min_version = line.split()[1] if line.split()[0] == "--min-version" else "0.0.0"
-    max_version = line.split()[1] if line.split()[0] == "--max-version" else "9.9.9"
-    test = line.split()[2]
-    if (version >= min_version and version <= max_version):
-      lines.append(test)
-  return lines
-
-while not len(lists) == 0:
-  lists2 = lists
-  lists = []
-  for list in lists2:
-    directory = os.path.dirname(os.path.realpath(list))
-    with open(list) as file:
-      # Filter out comments and --min-version
-      lines = [ line.strip() for line in file.readlines()]
-      lines = [ line for line in lines if not "//" in line ]
-      lines = [ line for line in lines if not "#" in line ]
-      lines = [ line.replace("--slow","") for line in lines ]
-      lines = filter_by_version(lines)
-      # Append lists and tests found in this list.
-      lines = [ directory + "/" + line for line in lines ]
-      lists.extend([ line for line in lines if "00_test_list.txt" in line ])
-      tests.extend([ line for line in lines if ".html" in line ])
-
-# Directories for formating test-names/relative-paths.
-name_directory = os.path.dirname(os.path.realpath(top_list))
-path_directory = os.path.realpath(os.path.join(name_directory, os.pardir))
-
-tests = sorted(tests)
-for test in tests:
-  test_path = test.replace(path_directory + "/", "")
-  test_name = test.replace(name_directory + "/", "")
-  test_name = test_name.replace("/","_")
-  test_name = test_name.replace(".","_")
-  test_name = test_name.replace("-","_")
-  print "    public void test_" + test_name + "() throws Exception { doTest(\"" + test_path + "\"); }"
-
diff --git a/tests/webgl/res/raw/harness.html b/tests/webgl/res/raw/harness.html
deleted file mode 100644
index 5ae56ef..0000000
--- a/tests/webgl/res/raw/harness.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<!-- saved from url=(0057)http://www.corp.google.com/~vollick/timing-functions.html -->
-<html>
-<head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-
-<script type="text/javascript">
-    // Check for WebGL Support.
-    function supportsWebGL() {
-        var canvas = document.createElement('canvas');
-        gl = canvas.getContext("webgl");
-        return !!gl;
-    }
-
-    // Pass the WebGL harness calls through to the native app.
-    webglTestHarness = {
-        notifyFinished: function() {
-            WebGLCallback.notifyFinished();
-        },
-        reportResults: function(type, success, msg) {
-            WebGLCallback.reportResults(type, success, msg);
-        }
-    }
-    function navigateToTest() {
-        if (supportsWebGL())
-            window.open(WebGLCallback.getUrlToTest(), "TestFrame");
-        else
-            WebGLCallback.notifyFinished();
-    }
-    window.addEventListener('load', navigateToTest, false);
-</script>
-
-<style type="text/css">
-body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; }
-#content { position:absolute; left: 0; right: 0; bottom: 0; top: 0px; }
-</style>
-
-</head>
-
-<body>
-  <div id="content">
-    <iframe name="TestFrame" width="100%" height="100%" frameborder="0"/>
-  </div>
-</body>
-</html>
diff --git a/tests/webgl/res/raw/webgl_sdk_tests.zip b/tests/webgl/res/raw/webgl_sdk_tests.zip
deleted file mode 100644
index a2086b0..0000000
--- a/tests/webgl/res/raw/webgl_sdk_tests.zip
+++ /dev/null
Binary files differ
diff --git a/tests/webgl/src/android/webgl/WebGLActivity.java b/tests/webgl/src/android/webgl/WebGLActivity.java
deleted file mode 100644
index 3f911c4..0000000
--- a/tests/webgl/src/android/webgl/WebGLActivity.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.webgl;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.res.Resources;
-import android.cts.util.NullWebViewUtils;
-import android.os.Bundle;
-import android.util.Log;
-import android.webgl.cts.R;
-import android.webkit.WebView;
-import android.webkit.JavascriptInterface;
-import android.webkit.WebViewClient;
-import android.widget.Toast;
-import java.lang.Override;
-import java.io.InputStream;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A simple activity for testing WebGL Conformance with WebView.
- */
-public class WebGLActivity extends Activity {
-
-    Semaphore mFinished = new Semaphore(0, false);
-    Semaphore mDestroyed = new Semaphore(0, false);
-    String mWebGlHarnessUrl;
-    WebView mWebView;
-
-    // The following members are synchronized.
-    String mWebGLTestUrl;
-    boolean mPassed = true;
-    StringBuilder mMessage = new StringBuilder("\n");
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        mWebGlHarnessUrl = "file://" + getCacheDir() + "/harness.html";
-        try {
-            mWebView = new WebView(this);
-        } catch (Exception e) {
-            NullWebViewUtils.determineIfWebViewAvailable(this, e);
-        }
-
-        if (mWebView == null) {
-            return;
-        }
-
-        mWebView.getSettings().setJavaScriptEnabled(true);
-        mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
-        mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
-        mWebView.setWebViewClient(new WebViewClient() {
-            @Override
-            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
-                return false;
-            }
-        });
-
-        mWebView.addJavascriptInterface(new Object() {
-            @JavascriptInterface
-            public String getUrlToTest() {
-                synchronized(WebGLActivity.this) {
-                    return mWebGLTestUrl;
-                }
-            }
-
-            @JavascriptInterface
-            public void reportResults(String type, boolean success, String message) {
-                synchronized(WebGLActivity.this) {
-                    mMessage.append((success ? "PASS " : "FAIL ") + message + "\n");
-                    mPassed &= success;
-                }
-            }
-
-            @JavascriptInterface
-            public void notifyFinished() {
-                mFinished.release();
-            }
-
-            @JavascriptInterface
-            public void alert(String string) {
-                Log.i(mWebGLTestUrl, string);
-            }
-        }, "WebGLCallback");
-        setContentView(mWebView);
-    }
-
-    public void navigateToTest(String url) throws Exception {
-        if (!NullWebViewUtils.isWebViewAvailable()) {
-            return;
-        }
-
-        synchronized(WebGLActivity.this) {
-            mWebGLTestUrl = url;
-        }
-
-        // Load harness.html, which will load mWebGLTestUrl in an <iframe>.
-        runOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadUrl(mWebGlHarnessUrl);
-            }
-        });
-
-        // Wait on test completion.
-        boolean finished = mFinished.tryAcquire(60, TimeUnit.SECONDS);
-        String message;
-        synchronized(WebGLActivity.this) {
-            message = mMessage.toString();
-        }
-
-        // Destroy the webview and wait for it.
-        runOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.destroy();
-                finish();
-                mDestroyed.release();
-            }
-        });
-        mDestroyed.acquire();
-
-        if (!finished)
-            throw new Exception("\n" + url + "\n Test timed-out after 60 seconds: " + message);
-        if(!mPassed)
-            throw new Exception("\n" + url + "\n Test failed: " + message);
-    }
-}
diff --git a/tests/webgl/src/android/webgl/cts/WebGLConformanceSuite.java b/tests/webgl/src/android/webgl/cts/WebGLConformanceSuite.java
deleted file mode 100644
index 60f663a..0000000
--- a/tests/webgl/src/android/webgl/cts/WebGLConformanceSuite.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.webgl.cts;
-
-import android.util.Log;
-import android.webgl.cts.R;
-import android.webgl.WebGLActivity;
-import java.lang.Override;
-import java.io.File;
-import java.io.InputStream;
-
-/**
- * A Singleton class to wrap the WebGL Conformance Test Suite.
- */
-public class WebGLConformanceSuite {
-    private final String TAG = "WebGLConformanceSuite";
-    private static volatile WebGLConformanceSuite mInstance = null;
-
-    private WebGLConformanceSuite(WebGLActivity activity) throws Exception {
-        Log.i(TAG, "Unzipping WebGL Conformance Suite: "
-                + activity.getCacheDir().getPath());
-        InputStream suite = activity.getResources().openRawResource(R.raw.webgl_sdk_tests);
-        ZipUtil.unzipToPath(suite, activity.getCacheDir());
-        InputStream harness = activity.getResources().openRawResource(R.raw.harness);
-        ZipUtil.streamToPath(harness, activity.getCacheDir(), "harness.html");
-    }
-
-    public static WebGLConformanceSuite init(WebGLActivity activity)
-            throws Exception {
-        if (mInstance == null) {
-            synchronized (WebGLConformanceSuite.class) {
-                mInstance = new WebGLConformanceSuite(activity);
-            }
-        }
-        return mInstance;
-    }
-}
diff --git a/tests/webgl/src/android/webgl/cts/WebGLTest.java b/tests/webgl/src/android/webgl/cts/WebGLTest.java
deleted file mode 100644
index d45c190..0000000
--- a/tests/webgl/src/android/webgl/cts/WebGLTest.java
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.webgl.cts;
-
-import android.webgl.WebGLActivity;
-import android.webgl.cts.R;
-import android.test.ActivityInstrumentationTestCase2;
-import java.io.InputStream;
-
-/**
- * A simple wrapper to load each WebGL conformance test in WebView.
- *
- * This test uses {@link android.test.ActivityInstrumentationTestCase2} to instrument the
- * {@link android.webgl.WebGLActivity}.
- */
-public class WebGLTest extends ActivityInstrumentationTestCase2<WebGLActivity> {
-
-    /**
-     * A reference to the activity whose shared preferences are being tested.
-     */
-    private WebGLActivity mActivity;
-    private WebGLConformanceSuite mWebGL_1_0_1;
-
-    public WebGLTest() {
-        super(WebGLActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        // Start the activity and get a reference to it.
-        mActivity = getActivity();
-        // Wait for the UI Thread to become idle.
-        getInstrumentation().waitForIdleSync();
-        mWebGL_1_0_1 = WebGLConformanceSuite.init(mActivity);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        // Scrub the activity so it can be freed. The next time the setUp will create a new activity
-        // rather than reusing the old one.
-        mActivity = null;
-        super.tearDown();
-    }
-
-    protected void doTest(String testPage) throws Exception {
-        mActivity.navigateToTest(testPage);
-    }
-
-    /**
-     * The remainder of this file is generated using this command:
-     * extract_webgl_tests.py tests 1.0.1
-     */
-    public void test_conformance_attribs_gl_enable_vertex_attrib_html() throws Exception { doTest("tests/conformance/attribs/gl-enable-vertex-attrib.html"); }
-    public void test_conformance_attribs_gl_vertex_attrib_zero_issues_html() throws Exception { doTest("tests/conformance/attribs/gl-vertex-attrib-zero-issues.html"); }
-    public void test_conformance_attribs_gl_vertex_attrib_html() throws Exception { doTest("tests/conformance/attribs/gl-vertex-attrib.html"); }
-    public void test_conformance_attribs_gl_vertexattribpointer_offsets_html() throws Exception { doTest("tests/conformance/attribs/gl-vertexattribpointer-offsets.html"); }
-    public void test_conformance_attribs_gl_vertexattribpointer_html() throws Exception { doTest("tests/conformance/attribs/gl-vertexattribpointer.html"); }
-    public void test_conformance_buffers_buffer_bind_test_html() throws Exception { doTest("tests/conformance/buffers/buffer-bind-test.html"); }
-    public void test_conformance_buffers_buffer_data_array_buffer_html() throws Exception { doTest("tests/conformance/buffers/buffer-data-array-buffer.html"); }
-    public void test_conformance_buffers_index_validation_copies_indices_html() throws Exception { doTest("tests/conformance/buffers/index-validation-copies-indices.html"); }
-    public void test_conformance_buffers_index_validation_crash_with_buffer_sub_data_html() throws Exception { doTest("tests/conformance/buffers/index-validation-crash-with-buffer-sub-data.html"); }
-    public void test_conformance_buffers_index_validation_verifies_too_many_indices_html() throws Exception { doTest("tests/conformance/buffers/index-validation-verifies-too-many-indices.html"); }
-    public void test_conformance_buffers_index_validation_with_resized_buffer_html() throws Exception { doTest("tests/conformance/buffers/index-validation-with-resized-buffer.html"); }
-    public void test_conformance_buffers_index_validation_html() throws Exception { doTest("tests/conformance/buffers/index-validation.html"); }
-    public void test_conformance_canvas_buffer_offscreen_test_html() throws Exception { doTest("tests/conformance/canvas/buffer-offscreen-test.html"); }
-    public void test_conformance_canvas_buffer_preserve_test_html() throws Exception { doTest("tests/conformance/canvas/buffer-preserve-test.html"); }
-    public void test_conformance_canvas_canvas_test_html() throws Exception { doTest("tests/conformance/canvas/canvas-test.html"); }
-    public void test_conformance_canvas_canvas_zero_size_html() throws Exception { doTest("tests/conformance/canvas/canvas-zero-size.html"); }
-    public void test_conformance_canvas_drawingbuffer_static_canvas_test_html() throws Exception { doTest("tests/conformance/canvas/drawingbuffer-static-canvas-test.html"); }
-    public void test_conformance_canvas_drawingbuffer_test_html() throws Exception { doTest("tests/conformance/canvas/drawingbuffer-test.html"); }
-    public void test_conformance_canvas_viewport_unchanged_upon_resize_html() throws Exception { doTest("tests/conformance/canvas/viewport-unchanged-upon-resize.html"); }
-    public void test_conformance_context_constants_and_properties_html() throws Exception { doTest("tests/conformance/context/constants-and-properties.html"); }
-    public void test_conformance_context_context_attributes_alpha_depth_stencil_antialias_html() throws Exception { doTest("tests/conformance/context/context-attributes-alpha-depth-stencil-antialias.html"); }
-    public void test_conformance_context_context_lost_restored_html() throws Exception { doTest("tests/conformance/context/context-lost-restored.html"); }
-    public void test_conformance_context_context_lost_html() throws Exception { doTest("tests/conformance/context/context-lost.html"); }
-    public void test_conformance_context_context_type_test_html() throws Exception { doTest("tests/conformance/context/context-type-test.html"); }
-    public void test_conformance_context_incorrect_context_object_behaviour_html() throws Exception { doTest("tests/conformance/context/incorrect-context-object-behaviour.html"); }
-    public void test_conformance_context_methods_html() throws Exception { doTest("tests/conformance/context/methods.html"); }
-    public void test_conformance_context_premultiplyalpha_test_html() throws Exception { doTest("tests/conformance/context/premultiplyalpha-test.html"); }
-    public void test_conformance_context_resource_sharing_test_html() throws Exception { doTest("tests/conformance/context/resource-sharing-test.html"); }
-    public void test_conformance_extensions_oes_standard_derivatives_html() throws Exception { doTest("tests/conformance/extensions/oes-standard-derivatives.html"); }
-    public void test_conformance_extensions_oes_texture_float_with_canvas_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float-with-canvas.html"); }
-    public void test_conformance_extensions_oes_texture_float_with_image_data_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float-with-image-data.html"); }
-    public void test_conformance_extensions_oes_texture_float_with_image_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float-with-image.html"); }
-    public void test_conformance_extensions_oes_texture_float_with_video_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float-with-video.html"); }
-    public void test_conformance_extensions_oes_texture_float_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float.html"); }
-    public void test_conformance_extensions_oes_vertex_array_object_html() throws Exception { doTest("tests/conformance/extensions/oes-vertex-array-object.html"); }
-    public void test_conformance_extensions_webgl_debug_renderer_info_html() throws Exception { doTest("tests/conformance/extensions/webgl-debug-renderer-info.html"); }
-    public void test_conformance_extensions_webgl_debug_shaders_html() throws Exception { doTest("tests/conformance/extensions/webgl-debug-shaders.html"); }
-    public void test_conformance_glsl_functions_glsl_function_abs_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-abs.html"); }
-    public void test_conformance_glsl_functions_glsl_function_acos_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-acos.html"); }
-    public void test_conformance_glsl_functions_glsl_function_asin_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-asin.html"); }
-    public void test_conformance_glsl_functions_glsl_function_atan_xy_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-atan-xy.html"); }
-    public void test_conformance_glsl_functions_glsl_function_atan_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-atan.html"); }
-    public void test_conformance_glsl_functions_glsl_function_ceil_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-ceil.html"); }
-    public void test_conformance_glsl_functions_glsl_function_clamp_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-clamp-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_clamp_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-clamp-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_cos_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-cos.html"); }
-    public void test_conformance_glsl_functions_glsl_function_cross_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-cross.html"); }
-    public void test_conformance_glsl_functions_glsl_function_distance_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-distance.html"); }
-    public void test_conformance_glsl_functions_glsl_function_dot_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-dot.html"); }
-    public void test_conformance_glsl_functions_glsl_function_faceforward_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-faceforward.html"); }
-    public void test_conformance_glsl_functions_glsl_function_floor_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-floor.html"); }
-    public void test_conformance_glsl_functions_glsl_function_fract_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-fract.html"); }
-    public void test_conformance_glsl_functions_glsl_function_length_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-length.html"); }
-    public void test_conformance_glsl_functions_glsl_function_max_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-max-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_max_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-max-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_min_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-min-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_min_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-min-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_mix_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-mix-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_mix_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-mix-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_mod_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-mod-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_mod_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-mod-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_normalize_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-normalize.html"); }
-    public void test_conformance_glsl_functions_glsl_function_reflect_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-reflect.html"); }
-    public void test_conformance_glsl_functions_glsl_function_sign_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-sign.html"); }
-    public void test_conformance_glsl_functions_glsl_function_sin_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-sin.html"); }
-    public void test_conformance_glsl_functions_glsl_function_smoothstep_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-smoothstep-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_smoothstep_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-smoothstep-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_step_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-step-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_step_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-step-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function.html"); }
-    public void test_conformance_glsl_implicit_add_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_mat2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_mat2.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_mat3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_mat3.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_mat4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_mat4.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_add_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_add_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_add_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_assign_int_to_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/assign_int_to_float.vert.html"); }
-    public void test_conformance_glsl_implicit_assign_ivec2_to_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/assign_ivec2_to_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_assign_ivec3_to_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/assign_ivec3_to_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_assign_ivec4_to_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/assign_ivec4_to_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_construct_struct_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/construct_struct.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_mat2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_mat2.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_mat3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_mat3.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_mat4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_mat4.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_equal_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/equal_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_equal_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/equal_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_equal_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/equal_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_equal_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/equal_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_function_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/function_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_function_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/function_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_function_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/function_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_function_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/function_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_greater_than_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/greater_than.vert.html"); }
-    public void test_conformance_glsl_implicit_greater_than_equal_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/greater_than_equal.vert.html"); }
-    public void test_conformance_glsl_implicit_less_than_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/less_than.vert.html"); }
-    public void test_conformance_glsl_implicit_less_than_equal_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/less_than_equal.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_mat2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_mat2.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_mat3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_mat3.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_mat4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_mat4.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_not_equal_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/not_equal_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_not_equal_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/not_equal_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_not_equal_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/not_equal_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_not_equal_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/not_equal_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_mat2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_mat2.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_mat3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_mat3.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_mat4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_mat4.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_ternary_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/ternary_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_ternary_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/ternary_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_ternary_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/ternary_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_ternary_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/ternary_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_misc_attrib_location_length_limits_html() throws Exception { doTest("tests/conformance/glsl/misc/attrib-location-length-limits.html"); }
-    public void test_conformance_glsl_misc_embedded_struct_definitions_forbidden_html() throws Exception { doTest("tests/conformance/glsl/misc/embedded-struct-definitions-forbidden.html"); }
-    public void test_conformance_glsl_misc_empty_main_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/empty_main.vert.html"); }
-    public void test_conformance_glsl_misc_gl_position_unset_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/gl_position_unset.vert.html"); }
-    public void test_conformance_glsl_misc_glsl_function_nodes_html() throws Exception { doTest("tests/conformance/glsl/misc/glsl-function-nodes.html"); }
-    public void test_conformance_glsl_misc_glsl_long_variable_names_html() throws Exception { doTest("tests/conformance/glsl/misc/glsl-long-variable-names.html"); }
-    public void test_conformance_glsl_misc_non_ascii_comments_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/non-ascii-comments.vert.html"); }
-    public void test_conformance_glsl_misc_non_ascii_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/non-ascii.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_256_character_identifier_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-256-character-identifier.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_257_character_identifier_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-257-character-identifier.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with__webgl_identifier_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-_webgl-identifier.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_arbitrary_indexing_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-arbitrary-indexing.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_arbitrary_indexing_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-arbitrary-indexing.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_attrib_array_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-attrib-array.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_attrib_struct_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-attrib-struct.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_clipvertex_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-clipvertex.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_default_precision_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-default-precision.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_default_precision_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-default-precision.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_define_line_continuation_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-define-line-continuation.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_dfdx_no_ext_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-dfdx-no-ext.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_dfdx_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-dfdx.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_error_directive_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-error-directive.html"); }
-    public void test_conformance_glsl_misc_shader_with_explicit_int_cast_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-explicit-int-cast.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_float_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-float-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_frag_depth_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-frag-depth.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_function_recursion_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-function-recursion.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_glcolor_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-glcolor.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_gles_1_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-gles-1.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_gles_symbol_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-gles-symbol.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_glprojectionmatrix_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-glprojectionmatrix.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_implicit_vec3_to_vec4_cast_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-implicit-vec3-to-vec4-cast.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_include_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-include.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_int_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-int-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_invalid_identifier_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-invalid-identifier.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_ivec2_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-ivec2-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_ivec3_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-ivec3-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_ivec4_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-ivec4-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_limited_indexing_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-limited-indexing.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_long_line_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-long-line.html"); }
-    public void test_conformance_glsl_misc_shader_with_non_ascii_error_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-non-ascii-error.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_precision_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-precision.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_quoted_error_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-quoted-error.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_undefined_preprocessor_symbol_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-undefined-preprocessor-symbol.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_uniform_in_loop_condition_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-uniform-in-loop-condition.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_vec2_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-vec2-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_vec3_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-vec3-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_vec4_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-vec4-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_version_100_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-version-100.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_version_100_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-version-100.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_version_120_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-version-120.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_version_130_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-version-130.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_webgl_identifier_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-webgl-identifier.vert.html"); }
-    public void test_conformance_glsl_misc_shader_without_precision_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-without-precision.frag.html"); }
-    public void test_conformance_glsl_misc_shared_html() throws Exception { doTest("tests/conformance/glsl/misc/shared.html"); }
-    public void test_conformance_glsl_misc_struct_nesting_exceeds_maximum_html() throws Exception { doTest("tests/conformance/glsl/misc/struct-nesting-exceeds-maximum.html"); }
-    public void test_conformance_glsl_misc_struct_nesting_under_maximum_html() throws Exception { doTest("tests/conformance/glsl/misc/struct-nesting-under-maximum.html"); }
-    public void test_conformance_glsl_misc_uniform_location_length_limits_html() throws Exception { doTest("tests/conformance/glsl/misc/uniform-location-length-limits.html"); }
-    public void test_conformance_glsl_reserved__webgl_field_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/_webgl_field.vert.html"); }
-    public void test_conformance_glsl_reserved__webgl_function_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/_webgl_function.vert.html"); }
-    public void test_conformance_glsl_reserved__webgl_struct_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/_webgl_struct.vert.html"); }
-    public void test_conformance_glsl_reserved__webgl_variable_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/_webgl_variable.vert.html"); }
-    public void test_conformance_glsl_reserved_webgl_field_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/webgl_field.vert.html"); }
-    public void test_conformance_glsl_reserved_webgl_function_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/webgl_function.vert.html"); }
-    public void test_conformance_glsl_reserved_webgl_struct_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/webgl_struct.vert.html"); }
-    public void test_conformance_glsl_reserved_webgl_variable_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/webgl_variable.vert.html"); }
-    public void test_conformance_glsl_variables_gl_fragcoord_html() throws Exception { doTest("tests/conformance/glsl/variables/gl-fragcoord.html"); }
-    public void test_conformance_glsl_variables_gl_frontfacing_html() throws Exception { doTest("tests/conformance/glsl/variables/gl-frontfacing.html"); }
-    public void test_conformance_glsl_variables_gl_pointcoord_html() throws Exception { doTest("tests/conformance/glsl/variables/gl-pointcoord.html"); }
-    public void test_conformance_limits_gl_max_texture_dimensions_html() throws Exception { doTest("tests/conformance/limits/gl-max-texture-dimensions.html"); }
-    public void test_conformance_limits_gl_min_attribs_html() throws Exception { doTest("tests/conformance/limits/gl-min-attribs.html"); }
-    public void test_conformance_limits_gl_min_textures_html() throws Exception { doTest("tests/conformance/limits/gl-min-textures.html"); }
-    public void test_conformance_limits_gl_min_uniforms_html() throws Exception { doTest("tests/conformance/limits/gl-min-uniforms.html"); }
-    public void test_conformance_misc_bad_arguments_test_html() throws Exception { doTest("tests/conformance/misc/bad-arguments-test.html"); }
-    public void test_conformance_misc_error_reporting_html() throws Exception { doTest("tests/conformance/misc/error-reporting.html"); }
-    public void test_conformance_misc_functions_returning_strings_html() throws Exception { doTest("tests/conformance/misc/functions-returning-strings.html"); }
-    public void test_conformance_misc_instanceof_test_html() throws Exception { doTest("tests/conformance/misc/instanceof-test.html"); }
-    public void test_conformance_misc_invalid_passed_params_html() throws Exception { doTest("tests/conformance/misc/invalid-passed-params.html"); }
-    public void test_conformance_misc_is_object_html() throws Exception { doTest("tests/conformance/misc/is-object.html"); }
-    public void test_conformance_misc_null_object_behaviour_html() throws Exception { doTest("tests/conformance/misc/null-object-behaviour.html"); }
-    public void test_conformance_misc_object_deletion_behaviour_html() throws Exception { doTest("tests/conformance/misc/object-deletion-behaviour.html"); }
-    public void test_conformance_misc_shader_precision_format_html() throws Exception { doTest("tests/conformance/misc/shader-precision-format.html"); }
-    public void test_conformance_misc_type_conversion_test_html() throws Exception { doTest("tests/conformance/misc/type-conversion-test.html"); }
-    public void test_conformance_misc_uninitialized_test_html() throws Exception { doTest("tests/conformance/misc/uninitialized-test.html"); }
-    public void test_conformance_misc_webgl_specific_html() throws Exception { doTest("tests/conformance/misc/webgl-specific.html"); }
-    public void test_conformance_more_conformance_constants_html() throws Exception { doTest("tests/conformance/more/conformance/constants.html"); }
-    public void test_conformance_more_conformance_getContext_html() throws Exception { doTest("tests/conformance/more/conformance/getContext.html"); }
-    public void test_conformance_more_conformance_methods_html() throws Exception { doTest("tests/conformance/more/conformance/methods.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_A_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-A.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_B1_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-B1.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_B2_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-B2.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_B3_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-B3.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_B4_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-B4.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_C_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-C.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_D_G_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-D_G.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_G_I_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-G_I.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_L_S_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-L_S.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_S_V_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-S_V.html"); }
-    public void test_conformance_more_conformance_webGLArrays_html() throws Exception { doTest("tests/conformance/more/conformance/webGLArrays.html"); }
-    public void test_conformance_more_functions_bindBuffer_html() throws Exception { doTest("tests/conformance/more/functions/bindBuffer.html"); }
-    public void test_conformance_more_functions_bindBufferBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/bindBufferBadArgs.html"); }
-    public void test_conformance_more_functions_bindFramebufferLeaveNonZero_html() throws Exception { doTest("tests/conformance/more/functions/bindFramebufferLeaveNonZero.html"); }
-    public void test_conformance_more_functions_bufferData_html() throws Exception { doTest("tests/conformance/more/functions/bufferData.html"); }
-    public void test_conformance_more_functions_bufferDataBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/bufferDataBadArgs.html"); }
-    public void test_conformance_more_functions_bufferSubData_html() throws Exception { doTest("tests/conformance/more/functions/bufferSubData.html"); }
-    public void test_conformance_more_functions_bufferSubDataBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/bufferSubDataBadArgs.html"); }
-    public void test_conformance_more_functions_copyTexImage2D_html() throws Exception { doTest("tests/conformance/more/functions/copyTexImage2D.html"); }
-    public void test_conformance_more_functions_copyTexImage2DBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/copyTexImage2DBadArgs.html"); }
-    public void test_conformance_more_functions_copyTexSubImage2D_html() throws Exception { doTest("tests/conformance/more/functions/copyTexSubImage2D.html"); }
-    public void test_conformance_more_functions_copyTexSubImage2DBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/copyTexSubImage2DBadArgs.html"); }
-    public void test_conformance_more_functions_deleteBufferBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/deleteBufferBadArgs.html"); }
-    public void test_conformance_more_functions_drawArrays_html() throws Exception { doTest("tests/conformance/more/functions/drawArrays.html"); }
-    public void test_conformance_more_functions_drawArraysOutOfBounds_html() throws Exception { doTest("tests/conformance/more/functions/drawArraysOutOfBounds.html"); }
-    public void test_conformance_more_functions_drawElements_html() throws Exception { doTest("tests/conformance/more/functions/drawElements.html"); }
-    public void test_conformance_more_functions_drawElementsBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/drawElementsBadArgs.html"); }
-    public void test_conformance_more_functions_isTests_html() throws Exception { doTest("tests/conformance/more/functions/isTests.html"); }
-    public void test_conformance_more_functions_readPixels_html() throws Exception { doTest("tests/conformance/more/functions/readPixels.html"); }
-    public void test_conformance_more_functions_readPixelsBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/readPixelsBadArgs.html"); }
-    public void test_conformance_more_functions_texImage2D_html() throws Exception { doTest("tests/conformance/more/functions/texImage2D.html"); }
-    public void test_conformance_more_functions_texImage2DBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/texImage2DBadArgs.html"); }
-    public void test_conformance_more_functions_texImage2DHTML_html() throws Exception { doTest("tests/conformance/more/functions/texImage2DHTML.html"); }
-    public void test_conformance_more_functions_texImage2DHTMLBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/texImage2DHTMLBadArgs.html"); }
-    public void test_conformance_more_functions_texSubImage2D_html() throws Exception { doTest("tests/conformance/more/functions/texSubImage2D.html"); }
-    public void test_conformance_more_functions_texSubImage2DBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/texSubImage2DBadArgs.html"); }
-    public void test_conformance_more_functions_texSubImage2DHTML_html() throws Exception { doTest("tests/conformance/more/functions/texSubImage2DHTML.html"); }
-    public void test_conformance_more_functions_texSubImage2DHTMLBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/texSubImage2DHTMLBadArgs.html"); }
-    public void test_conformance_more_functions_uniformMatrix_html() throws Exception { doTest("tests/conformance/more/functions/uniformMatrix.html"); }
-    public void test_conformance_more_functions_uniformMatrixBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/uniformMatrixBadArgs.html"); }
-    public void test_conformance_more_functions_uniformf_html() throws Exception { doTest("tests/conformance/more/functions/uniformf.html"); }
-    public void test_conformance_more_functions_uniformfArrayLen1_html() throws Exception { doTest("tests/conformance/more/functions/uniformfArrayLen1.html"); }
-    public void test_conformance_more_functions_uniformfBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/uniformfBadArgs.html"); }
-    public void test_conformance_more_functions_uniformi_html() throws Exception { doTest("tests/conformance/more/functions/uniformi.html"); }
-    public void test_conformance_more_functions_uniformiBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/uniformiBadArgs.html"); }
-    public void test_conformance_more_functions_vertexAttrib_html() throws Exception { doTest("tests/conformance/more/functions/vertexAttrib.html"); }
-    public void test_conformance_more_functions_vertexAttribBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/vertexAttribBadArgs.html"); }
-    public void test_conformance_more_functions_vertexAttribPointer_html() throws Exception { doTest("tests/conformance/more/functions/vertexAttribPointer.html"); }
-    public void test_conformance_more_functions_vertexAttribPointerBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/vertexAttribPointerBadArgs.html"); }
-    public void test_conformance_more_glsl_arrayOutOfBounds_html() throws Exception { doTest("tests/conformance/more/glsl/arrayOutOfBounds.html"); }
-    public void test_conformance_more_glsl_uniformOutOfBounds_html() throws Exception { doTest("tests/conformance/more/glsl/uniformOutOfBounds.html"); }
-    public void test_conformance_programs_get_active_test_html() throws Exception { doTest("tests/conformance/programs/get-active-test.html"); }
-    public void test_conformance_programs_gl_bind_attrib_location_test_html() throws Exception { doTest("tests/conformance/programs/gl-bind-attrib-location-test.html"); }
-    public void test_conformance_programs_gl_get_active_attribute_html() throws Exception { doTest("tests/conformance/programs/gl-get-active-attribute.html"); }
-    public void test_conformance_programs_gl_get_active_uniform_html() throws Exception { doTest("tests/conformance/programs/gl-get-active-uniform.html"); }
-    public void test_conformance_programs_gl_getshadersource_html() throws Exception { doTest("tests/conformance/programs/gl-getshadersource.html"); }
-    public void test_conformance_programs_gl_shader_test_html() throws Exception { doTest("tests/conformance/programs/gl-shader-test.html"); }
-    public void test_conformance_programs_invalid_UTF_16_html() throws Exception { doTest("tests/conformance/programs/invalid-UTF-16.html"); }
-    public void test_conformance_programs_program_test_html() throws Exception { doTest("tests/conformance/programs/program-test.html"); }
-    public void test_conformance_reading_read_pixels_pack_alignment_html() throws Exception { doTest("tests/conformance/reading/read-pixels-pack-alignment.html"); }
-    public void test_conformance_reading_read_pixels_test_html() throws Exception { doTest("tests/conformance/reading/read-pixels-test.html"); }
-    public void test_conformance_renderbuffers_framebuffer_object_attachment_html() throws Exception { doTest("tests/conformance/renderbuffers/framebuffer-object-attachment.html"); }
-    public void test_conformance_renderbuffers_framebuffer_test_html() throws Exception { doTest("tests/conformance/renderbuffers/framebuffer-test.html"); }
-    public void test_conformance_renderbuffers_renderbuffer_initialization_html() throws Exception { doTest("tests/conformance/renderbuffers/renderbuffer-initialization.html"); }
-    public void test_conformance_rendering_draw_arrays_out_of_bounds_html() throws Exception { doTest("tests/conformance/rendering/draw-arrays-out-of-bounds.html"); }
-    public void test_conformance_rendering_draw_elements_out_of_bounds_html() throws Exception { doTest("tests/conformance/rendering/draw-elements-out-of-bounds.html"); }
-    public void test_conformance_rendering_gl_clear_html() throws Exception { doTest("tests/conformance/rendering/gl-clear.html"); }
-    public void test_conformance_rendering_gl_drawelements_html() throws Exception { doTest("tests/conformance/rendering/gl-drawelements.html"); }
-    public void test_conformance_rendering_gl_scissor_test_html() throws Exception { doTest("tests/conformance/rendering/gl-scissor-test.html"); }
-    public void test_conformance_rendering_line_loop_tri_fan_html() throws Exception { doTest("tests/conformance/rendering/line-loop-tri-fan.html"); }
-    public void test_conformance_rendering_more_than_65536_indices_html() throws Exception { doTest("tests/conformance/rendering/more-than-65536-indices.html"); }
-    public void test_conformance_rendering_multisample_corruption_html() throws Exception { doTest("tests/conformance/rendering/multisample-corruption.html"); }
-    public void test_conformance_rendering_point_size_html() throws Exception { doTest("tests/conformance/rendering/point-size.html"); }
-    public void test_conformance_rendering_triangle_html() throws Exception { doTest("tests/conformance/rendering/triangle.html"); }
-    public void test_conformance_state_gl_enable_enum_test_html() throws Exception { doTest("tests/conformance/state/gl-enable-enum-test.html"); }
-    public void test_conformance_state_gl_enum_tests_html() throws Exception { doTest("tests/conformance/state/gl-enum-tests.html"); }
-    public void test_conformance_state_gl_get_calls_html() throws Exception { doTest("tests/conformance/state/gl-get-calls.html"); }
-    public void test_conformance_state_gl_geterror_html() throws Exception { doTest("tests/conformance/state/gl-geterror.html"); }
-    public void test_conformance_state_gl_getstring_html() throws Exception { doTest("tests/conformance/state/gl-getstring.html"); }
-    public void test_conformance_state_gl_object_get_calls_html() throws Exception { doTest("tests/conformance/state/gl-object-get-calls.html"); }
-    public void test_conformance_textures_compressed_tex_image_html() throws Exception { doTest("tests/conformance/textures/compressed-tex-image.html"); }
-    public void test_conformance_textures_copy_tex_image_and_sub_image_2d_html() throws Exception { doTest("tests/conformance/textures/copy-tex-image-and-sub-image-2d.html"); }
-    public void test_conformance_textures_gl_pixelstorei_html() throws Exception { doTest("tests/conformance/textures/gl-pixelstorei.html"); }
-    public void test_conformance_textures_gl_teximage_html() throws Exception { doTest("tests/conformance/textures/gl-teximage.html"); }
-    public void test_conformance_textures_origin_clean_conformance_html() throws Exception { doTest("tests/conformance/textures/origin-clean-conformance.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_array_buffer_view_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-array-buffer-view.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_canvas_rgb565_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgb565.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_canvas_rgba4444_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgba4444.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_canvas_rgba5551_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgba5551.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_canvas_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-canvas.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_data_rgb565_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-data-rgb565.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_data_rgba4444_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-data-rgba4444.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_data_rgba5551_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-data-rgba5551.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_data_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-data.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_rgb565_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-rgb565.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_rgba4444_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-rgba4444.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_rgba5551_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-rgba5551.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_video_rgb565_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-video-rgb565.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_video_rgba4444_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-video-rgba4444.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_video_rgba5551_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-video-rgba5551.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_video_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-video.html"); }
-    public void test_conformance_textures_tex_image_and_uniform_binding_bugs_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-uniform-binding-bugs.html"); }
-    public void test_conformance_textures_tex_image_with_format_and_type_html() throws Exception { doTest("tests/conformance/textures/tex-image-with-format-and-type.html"); }
-    public void test_conformance_textures_tex_image_with_invalid_data_html() throws Exception { doTest("tests/conformance/textures/tex-image-with-invalid-data.html"); }
-    public void test_conformance_textures_tex_input_validation_html() throws Exception { doTest("tests/conformance/textures/tex-input-validation.html"); }
-    public void test_conformance_textures_tex_sub_image_2d_bad_args_html() throws Exception { doTest("tests/conformance/textures/tex-sub-image-2d-bad-args.html"); }
-    public void test_conformance_textures_tex_sub_image_2d_html() throws Exception { doTest("tests/conformance/textures/tex-sub-image-2d.html"); }
-    public void test_conformance_textures_texparameter_test_html() throws Exception { doTest("tests/conformance/textures/texparameter-test.html"); }
-    public void test_conformance_textures_texture_active_bind_2_html() throws Exception { doTest("tests/conformance/textures/texture-active-bind-2.html"); }
-    public void test_conformance_textures_texture_active_bind_html() throws Exception { doTest("tests/conformance/textures/texture-active-bind.html"); }
-    public void test_conformance_textures_texture_complete_html() throws Exception { doTest("tests/conformance/textures/texture-complete.html"); }
-    public void test_conformance_textures_texture_mips_html() throws Exception { doTest("tests/conformance/textures/texture-mips.html"); }
-    public void test_conformance_textures_texture_npot_video_html() throws Exception { doTest("tests/conformance/textures/texture-npot-video.html"); }
-    public void test_conformance_textures_texture_npot_html() throws Exception { doTest("tests/conformance/textures/texture-npot.html"); }
-    public void test_conformance_textures_texture_size_cube_maps_html() throws Exception { doTest("tests/conformance/textures/texture-size-cube-maps.html"); }
-    public void test_conformance_textures_texture_size_html() throws Exception { doTest("tests/conformance/textures/texture-size.html"); }
-    public void test_conformance_textures_texture_transparent_pixels_initialized_html() throws Exception { doTest("tests/conformance/textures/texture-transparent-pixels-initialized.html"); }
-    public void test_conformance_typedarrays_array_buffer_crash_html() throws Exception { doTest("tests/conformance/typedarrays/array-buffer-crash.html"); }
-    public void test_conformance_typedarrays_array_buffer_view_crash_html() throws Exception { doTest("tests/conformance/typedarrays/array-buffer-view-crash.html"); }
-    public void test_conformance_typedarrays_array_unit_tests_html() throws Exception { doTest("tests/conformance/typedarrays/array-unit-tests.html"); }
-    public void test_conformance_typedarrays_data_view_crash_html() throws Exception { doTest("tests/conformance/typedarrays/data-view-crash.html"); }
-    public void test_conformance_typedarrays_data_view_test_html() throws Exception { doTest("tests/conformance/typedarrays/data-view-test.html"); }
-    public void test_conformance_uniforms_gl_uniform_arrays_html() throws Exception { doTest("tests/conformance/uniforms/gl-uniform-arrays.html"); }
-    public void test_conformance_uniforms_gl_uniform_bool_html() throws Exception { doTest("tests/conformance/uniforms/gl-uniform-bool.html"); }
-    public void test_conformance_uniforms_gl_uniformmatrix4fv_html() throws Exception { doTest("tests/conformance/uniforms/gl-uniformmatrix4fv.html"); }
-    public void test_conformance_uniforms_gl_unknown_uniform_html() throws Exception { doTest("tests/conformance/uniforms/gl-unknown-uniform.html"); }
-    public void test_conformance_uniforms_null_uniform_location_html() throws Exception { doTest("tests/conformance/uniforms/null-uniform-location.html"); }
-    public void test_conformance_uniforms_uniform_location_html() throws Exception { doTest("tests/conformance/uniforms/uniform-location.html"); }
-    public void test_conformance_uniforms_uniform_samplers_test_html() throws Exception { doTest("tests/conformance/uniforms/uniform-samplers-test.html"); }
-}
diff --git a/tests/webgl/src/android/webgl/cts/ZipUtil.java b/tests/webgl/src/android/webgl/cts/ZipUtil.java
deleted file mode 100644
index 4b28e63..0000000
--- a/tests/webgl/src/android/webgl/cts/ZipUtil.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.webgl.cts;
-
-import android.util.Log;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.String;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-
-/**
- * Some boilerplate code to unzip files.
- */
-public class ZipUtil {
-    private final static String TAG = "ZipUtil";
-
-    /**
-     * Stream to a file.
-     */
-    public static void streamToPath(InputStream is,
-                                  File directory,
-                                  String name) throws Exception {
-        File file = new File(directory, name);
-        streamToPath(is, file);
-    }
-
-    public static void streamToPath(InputStream is,
-                                  File file) throws Exception {
-        Log.i(TAG, "Streaming to path " + file.getPath());
-        OutputStream os = null;
-        os = new FileOutputStream(file);
-        int count = -1;
-        byte[] buffer = new byte[10 * 1024];
-        while ((count = is.read(buffer)) != -1) {
-            os.write(buffer, 0, count);
-        }
-        os.close();
-    }
-
-    /**
-     * Unzip to a directory.
-     */
-    public static void unzipToPath(InputStream is,
-                                   File filePath) throws Exception {
-        ZipInputStream zis = new ZipInputStream(is);
-        unzipToPath(zis, filePath.getPath());
-    }
-
-    public static void unzipToPath(ZipInputStream zis,
-                                   String path) throws Exception {
-        Log.i(TAG, "Unzipping to path " + path);
-        byte[] buffer = new byte[10 * 1024];
-        ZipEntry entry;
-        while ((entry = zis.getNextEntry()) != null) {
-            File entryFile = new File(path, entry.getName());
-            if (entry.isDirectory()) {
-                if (!entryFile.exists()) {
-                   entryFile.mkdirs();
-                }
-                continue;
-            }
-            if (entryFile.getParentFile() != null &&
-                    !entryFile.getParentFile().exists()) {
-                entryFile.getParentFile().mkdirs();
-            }
-            if (!entryFile.exists()) {
-                entryFile.createNewFile();
-                entryFile.setReadable(true);
-                entryFile.setExecutable(true);
-            }
-            streamToPath(zis, entryFile);
-        }
-        zis.close();
-    }
-
-    /**
-     * Cleanup a directory.
-     */
-    static public boolean deleteDirectory(String directoryPath) {
-        File path = new File(directoryPath);
-        return deleteDirectory(path);
-    }
-
-    static public boolean deleteDirectory(File path) {
-        if (path.exists()) {
-            File[] files = path.listFiles();
-            for(int i = 0; i < files.length; i++) {
-                if(files[i].isDirectory()) {
-                    deleteDirectory(files[i]);
-                } else {
-                    files[i].delete();
-                }
-            }
-            return path.delete();
-        }
-        return false;
-    }
-}
diff --git a/tools/Android.mk b/tools/Android.mk
index 0a05aed..8377036 100644
--- a/tools/Android.mk
+++ b/tools/Android.mk
@@ -12,4 +12,31 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# Build the CTS harness
+
+JUNIT_HOST_JAR := $(HOST_OUT_JAVA_LIBRARIES)/junit.jar
+HOSTTESTLIB_JAR := $(HOST_OUT_JAVA_LIBRARIES)/hosttestlib.jar
+TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
+CTS_TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/cts-tradefed.jar
+CTS_TF_EXEC_PATH ?= $(HOST_OUT_EXECUTABLES)/cts-tradefed
+
+cts_prebuilt_jar := $(HOST_OUT)/cts/android-cts/tools/cts-prebuilt.jar
+$(cts_prebuilt_jar): PRIVATE_TESTS_DIR := $(HOST_OUT)/cts/android-cts/repository/testcases
+$(cts_prebuilt_jar): PRIVATE_PLANS_DIR := $(HOST_OUT)/cts/android-cts/repository/plans
+$(cts_prebuilt_jar): PRIVATE_TOOLS_DIR := $(HOST_OUT)/cts/android-cts/tools
+$(cts_prebuilt_jar): $(JUNIT_HOST_JAR) $(HOSTTESTLIB_JAR) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(ADDITIONAL_TF_JARS) | $(ACP) $(HOST_OUT_EXECUTABLES)/adb
+	mkdir -p $(PRIVATE_TESTS_DIR)
+	mkdir -p $(PRIVATE_PLANS_DIR)
+	mkdir -p $(PRIVATE_TOOLS_DIR)
+	$(ACP) -fp $(JUNIT_HOST_JAR) $(HOSTTESTLIB_JAR) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(ADDITIONAL_TF_JARS) $(PRIVATE_TOOLS_DIR)
+
+.PHONY: cts-harness
+cts-harness : $(cts_prebuilt_jar)
+
+# Put the test coverage report in the dist dir if "cts" is among the build goals.
+ifneq ($(filter cts, $(MAKECMDGOALS)),)
+  $(call dist-for-goals,cts,$(CTS_TF_JAR))
+  $(call dist-for-goals,cts,$(HOSTTESTLIB_JAR))
+endif
+
 include $(call all-subdir-makefiles)
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
index 2a62aa0..31e1f8d 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
@@ -121,4 +121,9 @@
             return (float) getNumCoveredMethods() / getTotalMethods() * 100;
         }
     }
+
+    @Override
+    public int getMemberSize() {
+        return getTotalMethods();
+    }
 }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
index c83256c..e0bf73f 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
@@ -72,6 +72,11 @@
         return (float) getNumCoveredMethods() / getTotalMethods() * 100;
     }
 
+    @Override
+    public int getMemberSize() {
+        return getTotalMethods();
+    }
+
     public void removeEmptyAbstractClasses() {
         Iterator<Entry<String, ApiClass>> it = mApiClassMap.entrySet().iterator();
         while (it.hasNext()) {
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
index d596cba..05cb4e1 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
@@ -71,8 +71,7 @@
         int format = FORMAT_TXT;
         String dexDeps = "dexDeps";
         String apiXmlPath = "";
-        // By default only care about packages starting with "android"
-        String packageFilter = "android";
+        PackageFilter packageFilter = new PackageFilter();
         String reportTitle = "CTS API Coverage";
 
         for (int i = 0; i < args.length; i++) {
@@ -95,7 +94,7 @@
                 } else if ("-a".equals(args[i])) {
                     apiXmlPath = getExpectedArg(args, ++i);
                 } else if ("-p".equals(args[i])) {
-                    packageFilter = getExpectedArg(args, ++i);
+                    packageFilter.addPrefixToFilter(getExpectedArg(args, ++i));
                 } else if ("-t".equals(args[i])) {
                     reportTitle = getExpectedArg(args, ++i);
                 } else {
@@ -188,7 +187,7 @@
     }
 
     private static void outputCoverageReport(ApiCoverage apiCoverage, List<File> testApks,
-            File outputFile, int format, String packageFilter, String reportTitle)
+            File outputFile, int format, PackageFilter packageFilter, String reportTitle)
                 throws IOException, TransformerException, InterruptedException {
 
         OutputStream out = outputFile != null
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HasCoverage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HasCoverage.java
index 3b369bb..f8d8054 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HasCoverage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HasCoverage.java
@@ -20,13 +20,33 @@
 
 interface HasCoverage {
     float getCoveragePercentage();
+    int getMemberSize();
     String getName();
 }
 
 class CoverageComparator implements Comparator<HasCoverage> {
     public int compare(HasCoverage entity, HasCoverage otherEntity) {
-        int diff = Math.round(entity.getCoveragePercentage())
-                - Math.round(otherEntity.getCoveragePercentage());
-        return diff != 0 ? diff : entity.getName().compareTo(otherEntity.getName());
+        int lhsPct = Math.round(entity.getCoveragePercentage());
+        int rhsPct = Math.round(otherEntity.getCoveragePercentage());
+        int diff = Integer.compare(getCoveragePercentageSegment(lhsPct),
+                getCoveragePercentageSegment(rhsPct));
+        return diff != 0 ? diff :
+            Integer.compare(otherEntity.getMemberSize(), entity.getMemberSize());
+    }
+
+    /**
+     * Distill coverage percentage down to 3 major segments
+     * @param coveragePercentage
+     * @return
+     */
+    private int getCoveragePercentageSegment(int coveragePercentage) {
+        // note that this segmentation logic is duplicated in api-coverage.xsl
+        if (coveragePercentage <= 50) {
+            return 0;
+        } else if (coveragePercentage <= 80) {
+            return 1;
+        } else {
+            return 2;
+        }
     }
 }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
index dfe609d..0e6b54a 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
@@ -37,7 +37,7 @@
 class HtmlReport {
 
     public static void printHtmlReport(final List<File> testApks, final ApiCoverage apiCoverage,
-            final String packageFilter, final String reportTitle, final OutputStream out)
+            final PackageFilter packageFilter, final String reportTitle, final OutputStream out)
                 throws IOException, TransformerException {
         final PipedOutputStream xmlOut = new PipedOutputStream();
         final PipedInputStream xmlIn = new PipedInputStream(xmlOut);
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/PackageFilter.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/PackageFilter.java
new file mode 100644
index 0000000..b196d8f
--- /dev/null
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/PackageFilter.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.apicoverage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Util class to support package filtering logic
+ * <p>
+ * A list of package prefixes can be added to the filter, and {{@link #accept(String)} method will
+ * decide if the provided package name matches any of the prefixes.
+ */
+public class PackageFilter {
+
+    private List<String> mFilters = new ArrayList<>();
+
+    /**
+     * Check if a particular package name matches any of the package prefixes configured in filter.
+     * If no filters are configured, any package names will be accepted
+     * @param packageName
+     * @return
+     */
+    public boolean accept(String packageName) {
+        if (mFilters.isEmpty()) {
+            return true;
+        }
+        for (String filter : mFilters) {
+            if (packageName.startsWith(filter)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void addPrefixToFilter(String prefix) {
+        mFilters.add(prefix);
+    }
+
+    public void clearFilter() {
+        mFilters.clear();
+    }
+}
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
index 23b44c3..e3e2e7c 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
@@ -27,7 +27,8 @@
  */
 class TextReport {
 
-    public static void printTextReport(ApiCoverage api, String packageFilter, OutputStream outputStream) {
+    public static void printTextReport(ApiCoverage api, PackageFilter packageFilter,
+            OutputStream outputStream) {
         PrintStream out = new PrintStream(outputStream);
 
         CoverageComparator comparator = new CoverageComparator();
@@ -35,8 +36,7 @@
         Collections.sort(packages, comparator);
 
         for (ApiPackage apiPackage : packages) {
-            if (apiPackage.getName().startsWith(packageFilter)
-                    && apiPackage.getTotalMethods() > 0) {
+            if (packageFilter.accept(apiPackage.getName()) && apiPackage.getTotalMethods() > 0) {
                 printPackage(apiPackage, out);
             }
         }
@@ -45,7 +45,7 @@
         out.println();
 
         for (ApiPackage apiPackage : packages) {
-            if (apiPackage.getName().startsWith(packageFilter)) {
+            if (packageFilter.accept(apiPackage.getName())) {
                 printPackage(apiPackage, out);
 
                 List<ApiClass> classes = new ArrayList<ApiClass>(apiPackage.getClasses());
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
index df10fa4..570b316 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
@@ -32,7 +32,7 @@
 class XmlReport {
 
     public static void printXmlReport(List<File> testApks, ApiCoverage apiCoverage,
-            String packageFilter, String reportTitle, OutputStream outputStream) {
+            PackageFilter packageFilter, String reportTitle, OutputStream outputStream) {
         PrintStream out = new PrintStream(outputStream);
         out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
         out.println("<?xml-stylesheet type=\"text/xsl\"  href=\"api-coverage.xsl\"?>");
@@ -57,8 +57,7 @@
         int totalMethods = 0;
         int totalCoveredMethods = 0;
         for (ApiPackage pkg : packages) {
-            if (pkg.getName().startsWith(packageFilter)
-                   && pkg.getTotalMethods() > 0) {
+            if (packageFilter.accept(pkg.getName()) && pkg.getTotalMethods() > 0) {
                 int pkgTotal = pkg.getTotalMethods();
                 totalMethods += pkgTotal;
                 int pkgTotalCovered = pkg.getNumCoveredMethods();
diff --git a/tools/cts-api-coverage/src/res/api-coverage.xsl b/tools/cts-api-coverage/src/res/api-coverage.xsl
index 1ac3402..b11a8c4 100644
--- a/tools/cts-api-coverage/src/res/api-coverage.xsl
+++ b/tools/cts-api-coverage/src/res/api-coverage.xsl
@@ -21,6 +21,7 @@
     <xsl:template match="/">
         <html>
             <head>
+                <title><xsl:value-of select="api-coverage/@title" /></title>
                 <script type="text/javascript">
                     function toggleVisibility(id) {
                         element = document.getElementById(id); 
@@ -87,7 +88,7 @@
                 &nbsp;(<xsl:value-of select="api-coverage/total/@numCovered" />/<xsl:value-of select="api-coverage/total/@numTotal" />)
                 </div>
                 <div class="apks" onclick="toggleVisibility('sourceApks')">
-                    Source APKs (<xsl:value-of select="count(api-coverage/debug/sources/apk)" />)
+                    Source Modules (<xsl:value-of select="count(api-coverage/debug/sources/apk)" />)
                 </div>
                 <div id="sourceApks" style="display: none">
                     <ul>
diff --git a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
index 94761fb..fb6691d 100644
--- a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
+++ b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
@@ -89,6 +89,7 @@
         List<String> classPath = new ArrayList<String>();
         classPath.add("./prebuilts/misc/common/tradefed/tradefed-prebuilt.jar");
         classPath.add("./prebuilts/misc/common/ub-uiautomator/ub-uiautomator.jar");
+        classPath.add("./prebuilts/misc/common/ub-janktesthelper/ub-janktesthelper.jar");
         return join(classPath, ":");
     }
 
diff --git a/tools/cts-media/copy_media.sh b/tools/cts-media/copy_media.sh
new file mode 100755
index 0000000..3998dc3
--- /dev/null
+++ b/tools/cts-media/copy_media.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+adb_options=" "
+max_resolution=3
+if [ $# -eq 0 ]; then
+  echo "assuming default resolution"
+elif [ "$1" == "-s" ]; then
+  adb_options=""$1" "$2""
+elif [ "$1" == "720x480" ]; then
+  max_resolution=1
+elif [ "$1" == "1280x720" ]; then
+  max_resolution=2
+elif [ "$1" == "1920x1080" ]; then
+  max_resolution=3
+elif [ "$1" == "all" ]; then
+  max_resolution=3
+else
+  echo "Usage: copy_media.sh [720x480|1280x720|1920x1080] [-s serial]"
+  echo "  for testing up to 1280x720, copy_media.sh 1280x720"
+  echo "  default resolution, when no argument is specified, is 1920x1080"
+  echo "  copy_media.sh all will copy all the files."
+  exit
+fi
+
+if [ $# -gt 2 ]; then
+  echo "adb option exists"
+  adb_options=""$2" "$3""
+fi
+
+echo "max resolution is $1"
+echo "adb options "$adb_options""
+
+if [ $max_resolution -ge 3 ]; then
+  echo "copying 1920x1080"
+  adb $adb_options push bbb_short/1920x1080 /mnt/sdcard/test/bbb_short/1920x1080
+  adb $adb_options push bbb_full/1920x1080 /mnt/sdcard/test/bbb_full/1920x1080
+fi
+
+if [ $max_resolution -ge 2 ]; then
+  echo "copying 1280x720"
+  adb $adb_options push bbb_short/1280x720 /mnt/sdcard/test/bbb_short/1280x720
+  adb $adb_options push bbb_full/1280x720 /mnt/sdcard/test/bbb_full/1280x720
+fi
+
+if [ $max_resolution -ge 1 ]; then
+  echo "copying 720x480"
+  adb $adb_options push bbb_short/720x480 /mnt/sdcard/test/bbb_short/720x480
+  adb $adb_options push bbb_full/720x480 /mnt/sdcard/test/bbb_full/720x480
+fi
+
+echo "copying all others"
+adb $adb_options push bbb_short/176x144 /mnt/sdcard/test/bbb_short/176x144
+adb $adb_options push bbb_full/176x144 /mnt/sdcard/test/bbb_full/176x144
+adb $adb_options push bbb_short/480x360 /mnt/sdcard/test/bbb_short/480x360
+adb $adb_options push bbb_full/480x360 /mnt/sdcard/test/bbb_full/480x360
diff --git a/tools/device-setup/TestDeviceSetup/Android.mk b/tools/device-setup/TestDeviceSetup/Android.mk
index 44e66bb..02c20d4 100644
--- a/tools/device-setup/TestDeviceSetup/Android.mk
+++ b/tools/device-setup/TestDeviceSetup/Android.mk
@@ -29,7 +29,7 @@
 
 LOCAL_PACKAGE_NAME := TestDeviceSetup
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 # ======================================================
 # also build a static host library for the device info constants
diff --git a/tools/junit/Android.mk b/tools/junit/Android.mk
index b581149..90e6924 100644
--- a/tools/junit/Android.mk
+++ b/tools/junit/Android.mk
@@ -21,3 +21,7 @@
 LOCAL_STATIC_JAVA_LIBRARIES := junit4-target
 LOCAL_DEX_PREOPT := false
 include $(BUILD_JAVA_LIBRARY)
+
+cts_library_jar := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar
+$(cts_library_jar): $(LOCAL_BUILT_MODULE)
+	$(copy-file-to-target)
diff --git a/tools/tradefed-host/Android.mk b/tools/tradefed-host/Android.mk
index bd28575..1f73e95 100644
--- a/tools/tradefed-host/Android.mk
+++ b/tools/tradefed-host/Android.mk
@@ -27,6 +27,8 @@
 LOCAL_JAVA_LIBRARIES := tradefed-prebuilt hosttestlib
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceinfolib
 
+LOCAL_JAR_MANIFEST := MANIFEST.mf
+
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/tradefed-host/MANIFEST.mf b/tools/tradefed-host/MANIFEST.mf
new file mode 100644
index 0000000..5528c06
--- /dev/null
+++ b/tools/tradefed-host/MANIFEST.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: com.android.cts.tradefed.testtype
+Implementation-Version: %BUILD_NUMBER%
diff --git a/tools/tradefed-host/res/config/common-config.xml b/tools/tradefed-host/res/config/common-config.xml
new file mode 100644
index 0000000..e1ac66d
--- /dev/null
+++ b/tools/tradefed-host/res/config/common-config.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Common base configuration for CTS module">
+    <!--
+      This common base configuration contains some commonly used preparers
+      -->
+    <target_preparer class="com.android.cts.tradefed.targetprep.CtsFilePusher">
+        <option name="cleanup" value="true" />
+    </target_preparer>
+    <target_preparer class="com.android.cts.tradefed.targetprep.CtsApkInstaller">
+        <option name="cleanup-apks" value="true" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer" />
+</configuration>
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
index 16860d5..a33fc01 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
@@ -31,7 +31,8 @@
     @Option(name="cts-install-path", description="the path to the cts installation to use")
     private String mCtsRootDirPath = System.getProperty("CTS_ROOT");
 
-    public static final String CTS_BUILD_VERSION = "5.1_r1";
+    public static final String CTS_BUILD_VERSION = "5.0_r1.91";
+    public static final String CTS_PACKAGE = "com.android.cts.tradefed.testtype";
 
     /**
      * {@inheritDoc}
@@ -46,6 +47,10 @@
         return ctsBuild;
     }
 
+    public static String getBuildNumber() {
+        return Package.getPackage(CTS_PACKAGE).getImplementationVersion();
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
index ca4e050..2d6d8f2 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
@@ -56,7 +56,9 @@
 
     @Override
     public void run() {
-        printLine(String.format("Android CTS %s", CtsBuildProvider.CTS_BUILD_VERSION));
+        printLine(String.format("Android CTS %s build:%s",
+                CtsBuildProvider.CTS_BUILD_VERSION,
+                CtsBuildProvider.getBuildNumber()));
         super.run();
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
index 903ac74..733eb4f 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
@@ -59,6 +59,7 @@
         File apkFile = new File(testApkDir, String.format("%s.apk", APK_NAME));
         if (!apkFile.exists()) {
             Log.e(LOG_TAG, String.format("Could not find %s", apkFile.getAbsolutePath()));
+            return;
         }
         // collect the instrumentation bundle results using instrumentation test
         // should work even though no tests will actually be run
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
index 8c1a5bd..68cd1c0 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
@@ -143,6 +143,7 @@
 
         serializer.startTag(ns, "Cts");
         serializer.attribute(ns, "version", CtsBuildProvider.CTS_BUILD_VERSION);
+        serializer.attribute(ns, "build", CtsBuildProvider.getBuildNumber());
         // TODO: consider outputting other tradefed options here
         serializer.startTag(ns, "IntValue");
         serializer.attribute(ns, "name", "testStatusTimeoutMs");
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsApkInstaller.java b/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsApkInstaller.java
new file mode 100644
index 0000000..08061b1
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsApkInstaller.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.tradefed.targetprep;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.config.OptionClass;
+import com.android.tradefed.targetprep.TargetSetupError;
+import com.android.tradefed.targetprep.TestAppInstallSetup;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+/**
+ * Installs specified apks from CTS test case repository
+ */
+@OptionClass(alias="cts-apk-installer")
+public class CtsApkInstaller extends TestAppInstallSetup {
+
+    private CtsBuildHelper mBuildHelper = null;
+
+    protected CtsBuildHelper getCtsBuildHelper(IBuildInfo buildInfo) {
+        if (mBuildHelper == null) {
+            mBuildHelper = CtsBuildHelper.createBuildHelper(buildInfo);
+        }
+        return mBuildHelper;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected File getLocalPathForFilename(IBuildInfo buildInfo, String apkFileName)
+            throws TargetSetupError {
+        try {
+            return getCtsBuildHelper(buildInfo).getTestApp(apkFileName);
+        } catch (FileNotFoundException e) {
+            throw new TargetSetupError(String.format("apk not found: %s", apkFileName), e);
+        }
+    }
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsFilePusher.java b/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsFilePusher.java
new file mode 100644
index 0000000..c6ae2e1
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsFilePusher.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.tradefed.targetprep;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.config.OptionClass;
+import com.android.tradefed.targetprep.PushFilePreparer;
+
+import java.io.File;
+
+/**
+ * Pushes specified testing artifacts from CTS test case repository
+ */
+@OptionClass(alias="cts-file-pusher")
+public class CtsFilePusher extends PushFilePreparer {
+
+    private CtsBuildHelper mBuildHelper;
+
+    protected CtsBuildHelper getCtsBuildHelper(IBuildInfo buildInfo) {
+        if (mBuildHelper == null) {
+            mBuildHelper = CtsBuildHelper.createBuildHelper(buildInfo);
+        }
+        return mBuildHelper;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File resolveRelativeFilePath(IBuildInfo buildInfo, String fileName) {
+        return new File(getCtsBuildHelper(buildInfo).getTestCasesDir(), fileName);
+    }
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
deleted file mode 100644
index eafd608..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.tradefed.testtype;
-
-import com.android.cts.util.AbiUtils;
-import com.android.ddmlib.Log;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.util.FileUtil;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-
-/**
- * Running the accessibility tests requires modification of secure
- * settings. Secure settings cannot be changed from device CTS tests
- * since system signature permission is required. Such settings can
- * be modified by the shell user, so a host side test is used for
- * installing a package with a delegating accessibility service, enabling
- * this service, running these tests, disabling the service, and removing
- * the delegating accessibility service package.
- *
- * @deprecated This class is not required in current CTS builds. Still
- * maintained so cts-tradefed can run against older CTS builds that still
- * require this class.
- */
-@Deprecated
-public class AccessibilityServiceTestRunner extends CtsInstrumentationApkTest {
-
-    private static final String LOG_TAG = AccessibilityServiceTestRunner.class.getSimpleName();
-
-    private static final String DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME =
-        "android.accessibilityservice.delegate";
-
-    private static final String DELEGATING_ACCESSIBLITY_SERVICE_NAME =
-        "android.accessibilityservice.delegate.DelegatingAccessibilityService";
-
-    private static final String DELEGATING_ACCESSIBLITY_SERVICE_APK =
-        "CtsDelegatingAccessibilityService.apk";
-
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        beforeTest();
-        super.run(listener);
-        afterTest();
-    }
-
-    private void beforeTest() throws DeviceNotAvailableException {
-        installApkAndAssert(DELEGATING_ACCESSIBLITY_SERVICE_APK);
-        enableAccessibilityAndDelegatingService();
-    }
-
-    private void afterTest() throws DeviceNotAvailableException {
-        AccessibilityTestRunner.disableAccessibilityAndServices(getDevice());
-        uninstallAndAssert(DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME);
-    }
-
-    private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
-        File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
-        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-        String errorMessage = getDevice().installPackage(file, true, options);
-        TestCase.assertNull("Error installing: " + apkName, errorMessage);
-    }
-
-    private void uninstallAndAssert(String packageName) throws DeviceNotAvailableException {
-        String errorMessage = getDevice().uninstallPackage(packageName);
-        TestCase.assertNull("Error uninstalling: " + packageName, errorMessage);
-    }
-
-    private void enableAccessibilityAndDelegatingService() throws DeviceNotAvailableException {
-        String componentName = DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME + "/"
-            + DELEGATING_ACCESSIBLITY_SERVICE_NAME;
-        AccessibilityTestRunner.enableAccessibilityAndServices(getDevice(),
-                componentName);
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
deleted file mode 100644
index 9ba4109..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.tradefed.testtype;
-
-import com.android.cts.tradefed.targetprep.SettingsToggler;
-import com.android.cts.util.AbiUtils;
-import com.android.ddmlib.Log;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.util.FileUtil;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-
-/**
- * Running the accessibility tests requires modification of secure
- * settings. Secure settings cannot be changed from device CTS tests
- * since system signature permission is required. Such settings can
- * be modified by the shell user, so a host side test is used for
- * installing a package with some accessibility services, enabling
- * these services, running the tests, disabling the services, and removing
- * the accessibility services package.
- */
-public class AccessibilityTestRunner extends CtsInstrumentationApkTest {
-
-    private static final String LOG_TAG = AccessibilityTestRunner.class.getSimpleName();
-
-    private static final String SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME =
-        "android.view.accessibility.services";
-
-    private static final String SPEAKING_ACCESSIBLITY_SERVICE_NAME =
-        "android.view.accessibility.services.SpeakingAccessibilityService";
-
-    private static final String VIBRATING_ACCESSIBLITY_SERVICE_NAME =
-        "android.view.accessibility.services.VibratingAccessibilityService";
-
-    private static final String SOME_ACCESSIBLITY_SERVICES_APK =
-        "CtsSomeAccessibilityServices.apk";
-
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        beforeTest();
-        super.run(listener);
-        afterTest();
-    }
-
-    private void beforeTest() throws DeviceNotAvailableException {
-        installApkAndAssert(SOME_ACCESSIBLITY_SERVICES_APK);
-        enableAccessibilityAndServices();
-    }
-
-    private void afterTest() throws DeviceNotAvailableException {
-        disableAccessibilityAndServices(getDevice());
-        uninstallAndAssert(SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME);
-    }
-
-    private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
-        File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
-        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-        String errorMessage = getDevice().installPackage(file, true, options);
-        TestCase.assertNull("Error installing: " + apkName, errorMessage);
-    }
-
-    private void uninstallAndAssert(String packageName) throws DeviceNotAvailableException {
-        String errorMessage = getDevice().uninstallPackage(packageName);
-        TestCase.assertNull("Error uninstalling: " + packageName, errorMessage);
-    }
-
-    private void enableAccessibilityAndServices() throws DeviceNotAvailableException {
-        String enabledServicesValue =
-              SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME + "/" + SPEAKING_ACCESSIBLITY_SERVICE_NAME
-            + ":"
-            + SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME + "/" + VIBRATING_ACCESSIBLITY_SERVICE_NAME;
-        enableAccessibilityAndServices(getDevice(), enabledServicesValue);
-    }
-
-    static void enableAccessibilityAndServices(ITestDevice device, String value)
-            throws DeviceNotAvailableException {
-        SettingsToggler.setSecureString(device, "enabled_accessibility_services", value);
-        SettingsToggler.setSecureString(device,
-                "touch_exploration_granted_accessibility_services", value);
-        SettingsToggler.setSecureInt(device, "accessibility_enabled", 1);
-    }
-
-    static void disableAccessibilityAndServices(ITestDevice device)
-            throws DeviceNotAvailableException {
-        SettingsToggler.updateSecureString(device, "enabled_accessibility_services", "");
-        SettingsToggler.updateSecureString(device,
-                "touch_exploration_granted_accessibility_services", "");
-        SettingsToggler.updateSecureInt(device, "accessibility_enabled", 0);
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
index c2c2a10..b3bc7da 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
@@ -37,12 +37,18 @@
 import com.android.tradefed.result.InputStreamSource;
 import com.android.tradefed.result.LogDataType;
 import com.android.tradefed.result.ResultForwarder;
+import com.android.tradefed.targetprep.BuildError;
+import com.android.tradefed.targetprep.ITargetCleaner;
+import com.android.tradefed.targetprep.ITargetPreparer;
+import com.android.tradefed.targetprep.TargetSetupError;
 import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.testtype.IResumableTest;
 import com.android.tradefed.testtype.IShardableTest;
+import com.android.tradefed.testtype.InstrumentationTest;
 import com.android.tradefed.util.AbiFormatter;
 import com.android.tradefed.util.RunUtil;
 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
@@ -63,6 +69,7 @@
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
 
@@ -82,6 +89,8 @@
     private static final String TEST_OPTION = "test";
     public static final String CONTINUE_OPTION = "continue-session";
     public static final String RUN_KNOWN_FAILURES_OPTION = "run-known-failures";
+    private static final String INCLUDE_FILTERS_OPTION = "include";
+    private static final String EXCLUDE_FILTERS_OPTION = "exclude";
 
     public static final String PACKAGE_NAME_METRIC = "packageName";
     public static final String PACKAGE_ABI_METRIC = "packageAbi";
@@ -180,9 +189,14 @@
             "Collect dEQP logs from the device.")
     private boolean mCollectDeqpLogs = false;
 
+    @Option(name = INCLUDE_FILTERS_OPTION, description = "Positive filters to pass to tests.")
+    private List<String> mPositiveFilters = new ArrayList<> ();
+
+    @Option(name = EXCLUDE_FILTERS_OPTION, description = "Negative filters to pass to tests.")
+    private List<String> mNegativeFilters = new ArrayList<> ();
+
     @Option(name = "min-pre-reboot-package-count", description =
             "The minimum number of packages to require a pre test reboot")
-
     private int mMinPreRebootPackageCount = 2;
     private final int mShardAssignment;
     private final int mTotalShards;
@@ -525,9 +539,33 @@
                 if (test instanceof DeqpTestRunner) {
                     ((DeqpTestRunner)test).setCollectLogs(mCollectDeqpLogs);
                 }
+                if (test instanceof GeeTest) {
+                    if (!mPositiveFilters.isEmpty()) {
+                        String positivePatterns = join(mPositiveFilters, ":");
+                        ((GeeTest)test).setPositiveFilters(positivePatterns);
+                    }
+                    if (!mNegativeFilters.isEmpty()) {
+                        String negativePatterns = join(mNegativeFilters, ":");
+                        ((GeeTest)test).setPositiveFilters(negativePatterns);
+                    }
+                }
+                if (test instanceof InstrumentationTest) {
+                    if (!mPositiveFilters.isEmpty()) {
+                        String annotation = join(mPositiveFilters, ",");
+                        ((InstrumentationTest)test).addInstrumentationArg(
+                                "annotation", annotation);
+                    }
+                    if (!mNegativeFilters.isEmpty()) {
+                        String notAnnotation = join(mNegativeFilters, ",");
+                        ((InstrumentationTest)test).addInstrumentationArg(
+                                "notAnnotation", notAnnotation);
+                    }
+                }
 
                 forwardPackageDetails(testPackage.getPackageDef(), listener);
+                performPackagePrepareSetup(testPackage.getPackageDef());
                 test.run(filterMap.get(testPackage.getPackageDef().getId()));
+                performPackagePreparerTearDown(testPackage.getPackageDef());
                 if (i < mTestPackageList.size() - 1) {
                     TestPackage nextPackage = mTestPackageList.get(i + 1);
                     rebootIfNecessary(testPackage, nextPackage);
@@ -562,6 +600,79 @@
     }
 
     /**
+     * Invokes {@link ITargetPreparer}s configured for the test package. {@link TargetSetupError}s
+     * thrown by any preparer will be rethrown as {@link RuntimeException} so that the entire test
+     * package will be skipped for execution. Note that preparers will be invoked in the same order
+     * as they are defined in the module test config.
+     * @param packageDef definition for the test package
+     * @throws DeviceNotAvailableException
+     */
+    private void performPackagePrepareSetup(ITestPackageDef packageDef)
+            throws DeviceNotAvailableException {
+        List<ITargetPreparer> preparers = packageDef.getPackagePreparers();
+        if (preparers != null) {
+            for (ITargetPreparer preparer : preparers) {
+                if (preparer instanceof IAbiReceiver) {
+                    ((IAbiReceiver) preparer).setAbi(packageDef.getAbi());
+                }
+                try {
+                    preparer.setUp(getDevice(), mBuildInfo);
+                } catch (BuildError e) {
+                    // This should only happen for flashing new build
+                    CLog.e("Unexpected BuildError from preparer: %s",
+                        preparer.getClass().getCanonicalName());
+                } catch (TargetSetupError e) {
+                    // log preparer class then rethrow & let caller handle
+                    CLog.e("TargetSetupError in preparer: %s",
+                        preparer.getClass().getCanonicalName());
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Invokes clean up step for {@link ITargetCleaner}s configured for the test package. Note that
+     * the cleaners will be invoked in the reverse order as they are defined in module test config.
+     * @param packageDef definition for the test package
+     * @throws DeviceNotAvailableException
+     */
+    private void performPackagePreparerTearDown(ITestPackageDef packageDef)
+            throws DeviceNotAvailableException {
+        List<ITargetPreparer> preparers = packageDef.getPackagePreparers();
+        if (preparers != null) {
+            ListIterator<ITargetPreparer> itr = preparers.listIterator(preparers.size());
+            // do teardown in reverse order
+            while (itr.hasPrevious()) {
+                ITargetPreparer preparer = itr.previous();
+                if (preparer instanceof ITargetCleaner) {
+                    ((ITargetCleaner) preparer).tearDown(getDevice(), mBuildInfo, null);
+                }
+            }
+        }
+    }
+
+    /**
+     * Helper method to join strings. Exposed for unit tests
+     * @param input
+     * @param conjunction
+     * @return string with elements of the input list with interleaved conjunction.
+     */
+    protected static String join(List<String> input, String conjunction) {
+        StringBuilder sb = new StringBuilder();
+        boolean first = true;
+        for (String item : input) {
+            if (first) {
+                first = false;
+            } else {
+                sb.append(conjunction);
+            }
+            sb.append(item);
+        }
+        return sb.toString();
+    }
+
+    /**
      * @param allTestPackageDefList The package list to filter
      * @param deviceAbiSet The ABIs supported by the device being tested
      * @return A {@link List} of {@link ITestPackageDef}s that should be tested
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
index 8eb1621..43aaf98 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
@@ -2,7 +2,11 @@
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.AdbCommandRejectedException;
+import com.android.ddmlib.IShellOutputReceiver;
 import com.android.ddmlib.MultiLineReceiver;
+import com.android.ddmlib.ShellCommandUnresponsiveException;
+import com.android.ddmlib.TimeoutException;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
@@ -15,15 +19,28 @@
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
+import com.android.tradefed.util.IRunUtil;
+import com.android.tradefed.util.RunInterruptedException;
+import com.android.tradefed.util.RunUtil;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Test runner for dEQP tests
@@ -35,30 +52,45 @@
     private static final String DEQP_ONDEVICE_APK = "com.drawelements.deqp.apk";
     private static final String DEQP_ONDEVICE_PKG = "com.drawelements.deqp";
     private static final String INCOMPLETE_LOG_MESSAGE = "Crash: Incomplete test log";
+    private static final String SKIPPED_INSTANCE_LOG_MESSAGE = "Configuration skipped";
+    private static final String NOT_EXECUTABLE_LOG_MESSAGE = "Abort: Test cannot be executed";
+    private static final String CASE_LIST_FILE_NAME = "/sdcard/dEQP-TestCaseList.txt";
+    private static final String LOG_FILE_NAME = "/sdcard/TestLog.qpa";
+    public static final String FEATURE_LANDSCAPE = "android.hardware.screen.landscape";
+    public static final String FEATURE_PORTRAIT = "android.hardware.screen.portrait";
 
-    private final int TESTCASE_BATCH_LIMIT = 1000;
+    private static final int TESTCASE_BATCH_LIMIT = 1000;
+    private static final BatchRunConfiguration DEFAULT_CONFIG =
+        new BatchRunConfiguration("rgba8888d24s8", "unspecified", "window");
 
-    private boolean mLogData;
-
-    private ITestDevice mDevice;
+    private static final int UNRESPOSIVE_CMD_TIMEOUT_MS = 60000; // one minute
 
     private final String mPackageName;
     private final String mName;
-    private Collection<TestIdentifier> mTests;
+    private final Collection<TestIdentifier> mRemainingTests;
+    private final Map<TestIdentifier, Set<BatchRunConfiguration>> mTestInstances;
+    private final TestInstanceResultListener mInstanceListerner = new TestInstanceResultListener();
+    private final Map<TestIdentifier, Integer> mTestInstabilityRatings;
     private IAbi mAbi;
     private CtsBuildHelper mCtsBuild;
+    private boolean mLogData = false;
+    private ITestDevice mDevice;
+    private Set<String> mDeviceFeatures;
+    private Map<String, Boolean> mConfigQuerySupportCache = new HashMap<>();
+    private IRunUtil mRunUtil = RunUtil.getDefault();
 
-    private TestIdentifier mCurrentTestId;
-    private boolean mGotTestResult;
-    private String mCurrentTestLog;
+    private IRecovery mDeviceRecovery = new Recovery();
+    {
+        mDeviceRecovery.setSleepProvider(new SleepProvider());
+    }
 
-    private ITestInvocationListener mListener;
-
-    public DeqpTestRunner(String packageName, String name, Collection<TestIdentifier> tests) {
+    public DeqpTestRunner(String packageName, String name, Collection<TestIdentifier> tests,
+            Map<TestIdentifier, List<Map<String,String>>> testInstances) {
         mPackageName = packageName;
         mName = name;
-        mTests = tests;
-        mLogData = false;
+        mRemainingTests = new LinkedList<>(tests); // avoid modifying arguments
+        mTestInstances = parseTestInstances(tests, testInstances);
+        mTestInstabilityRatings = new HashMap<>();
     }
 
     /**
@@ -95,18 +127,450 @@
     }
 
     /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setDevice(ITestDevice device) {
+        mDevice = device;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ITestDevice getDevice() {
+        return mDevice;
+    }
+
+    /**
+     * Set recovery handler.
+     *
+     * Exposed for unit testing.
+     */
+    public void setRecovery(IRecovery deviceRecovery) {
+        mDeviceRecovery = deviceRecovery;
+    }
+
+    /**
+     * Set IRunUtil.
+     *
+     * Exposed for unit testing.
+     */
+    public void setRunUtil(IRunUtil runUtil) {
+        mRunUtil = runUtil;
+    }
+
+    private static final class CapabilityQueryFailureException extends Exception {
+    };
+
+    /**
+     * Test configuration of dEPQ test instance execution.
+     * Exposed for unit testing
+     */
+    public static final class BatchRunConfiguration {
+        public static final String ROTATION_UNSPECIFIED = "unspecified";
+        public static final String ROTATION_PORTRAIT = "0";
+        public static final String ROTATION_LANDSCAPE = "90";
+        public static final String ROTATION_REVERSE_PORTRAIT = "180";
+        public static final String ROTATION_REVERSE_LANDSCAPE = "270";
+
+        private final String mGlConfig;
+        private final String mRotation;
+        private final String mSurfaceType;
+
+        public BatchRunConfiguration(String glConfig, String rotation, String surfaceType) {
+            mGlConfig = glConfig;
+            mRotation = rotation;
+            mSurfaceType = surfaceType;
+        }
+
+        /**
+         * Get string that uniquely identifies this config
+         */
+        public String getId() {
+            return String.format("{glformat=%s,rotation=%s,surfacetype=%s}",
+                    mGlConfig, mRotation, mSurfaceType);
+        }
+
+        /**
+         * Get the GL config used in this configuration.
+         */
+        public String getGlConfig() {
+            return mGlConfig;
+        }
+
+        /**
+         * Get the screen rotation used in this configuration.
+         */
+        public String getRotation() {
+            return mRotation;
+        }
+
+        /**
+         * Get the surface type used in this configuration.
+         */
+        public String getSurfaceType() {
+            return mSurfaceType;
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (other == null) {
+                return false;
+            } else if (!(other instanceof BatchRunConfiguration)) {
+                return false;
+            } else {
+                return getId().equals(((BatchRunConfiguration)other).getId());
+            }
+        }
+
+        @Override
+        public int hashCode() {
+            return getId().hashCode();
+        }
+    }
+
+    /**
+     * dEQP test instance listerer and invocation result forwarded
+     */
+    private class TestInstanceResultListener {
+        private ITestInvocationListener mSink;
+        private BatchRunConfiguration mRunConfig;
+
+        private TestIdentifier mCurrentTestId;
+        private boolean mGotTestResult;
+        private String mCurrentTestLog;
+
+        private class PendingResult
+        {
+            boolean allInstancesPassed;
+            Map<BatchRunConfiguration, String> testLogs;
+            Map<BatchRunConfiguration, String> errorMessages;
+            Set<BatchRunConfiguration> remainingConfigs;
+        };
+        private final Map<TestIdentifier, PendingResult> mPendingResults = new HashMap<>();
+
+        public void setSink(ITestInvocationListener sink) {
+            mSink = sink;
+        }
+
+        public void setCurrentConfig(BatchRunConfiguration runConfig) {
+            mRunConfig = runConfig;
+        }
+
+        /**
+         * Get currently processed test id, or null if not currently processing a test case
+         */
+        public TestIdentifier getCurrentTestId() {
+            return mCurrentTestId;
+        }
+
+        /**
+         * Forward result to sink
+         */
+        private void forwardFinalizedPendingResult(TestIdentifier testId) {
+            if (mRemainingTests.contains(testId)) {
+                final PendingResult result = mPendingResults.get(testId);
+
+                mPendingResults.remove(testId);
+                mRemainingTests.remove(testId);
+
+                // Forward results to the sink
+                mSink.testStarted(testId);
+
+                // Test Log
+                if (mLogData) {
+                    for (Map.Entry<BatchRunConfiguration, String> entry :
+                            result.testLogs.entrySet()) {
+                        final ByteArrayInputStreamSource source
+                                = new ByteArrayInputStreamSource(entry.getValue().getBytes());
+
+                        mSink.testLog(testId.getClassName() + "." + testId.getTestName() + "@"
+                                + entry.getKey().getId(), LogDataType.XML, source);
+
+                        source.cancel();
+                    }
+                }
+
+                // Error message
+                if (!result.allInstancesPassed) {
+                    final StringBuilder errorLog = new StringBuilder();
+
+                    for (Map.Entry<BatchRunConfiguration, String> entry :
+                            result.errorMessages.entrySet()) {
+                        if (errorLog.length() > 0) {
+                            errorLog.append('\n');
+                        }
+                        errorLog.append(String.format("=== with config %s ===\n",
+                                entry.getKey().getId()));
+                        errorLog.append(entry.getValue());
+                    }
+
+                    mSink.testFailed(testId, errorLog.toString());
+                }
+
+                final Map<String, String> emptyMap = Collections.emptyMap();
+                mSink.testEnded(testId, emptyMap);
+            }
+        }
+
+        /**
+         * Declare existence of a test and instances
+         */
+        public void setTestInstances(TestIdentifier testId, Set<BatchRunConfiguration> configs) {
+            // Test instances cannot change at runtime, ignore if we have already set this
+            if (!mPendingResults.containsKey(testId)) {
+                final PendingResult pendingResult = new PendingResult();
+                pendingResult.allInstancesPassed = true;
+                pendingResult.testLogs = new LinkedHashMap<>();
+                pendingResult.errorMessages = new LinkedHashMap<>();
+                pendingResult.remainingConfigs = new HashSet<>(configs); // avoid mutating argument
+                mPendingResults.put(testId, pendingResult);
+            }
+        }
+
+        /**
+         * Query if test instance has not yet been executed
+         */
+        public boolean isPendingTestInstance(TestIdentifier testId,
+                BatchRunConfiguration config) {
+            final PendingResult result = mPendingResults.get(testId);
+            if (result == null) {
+                // test is not in the current working batch of the runner, i.e. it cannot be
+                // "partially" completed.
+                if (!mRemainingTests.contains(testId)) {
+                    // The test has been fully executed. Not pending.
+                    return false;
+                } else {
+                    // Test has not yet been executed. Check if such instance exists
+                    return mTestInstances.get(testId).contains(config);
+                }
+            } else {
+                // could be partially completed, check this particular config
+                return result.remainingConfigs.contains(config);
+            }
+        }
+
+        /**
+         * Fake execution of an instance with current config
+         */
+        public void skipTest(TestIdentifier testId) {
+            final PendingResult result = mPendingResults.get(testId);
+
+            result.errorMessages.put(mRunConfig, SKIPPED_INSTANCE_LOG_MESSAGE);
+            result.remainingConfigs.remove(mRunConfig);
+
+            // Pending result finished, report result
+            if (result.remainingConfigs.isEmpty()) {
+                forwardFinalizedPendingResult(testId);
+            }
+        }
+
+        /**
+         * Fake failure of an instance with current config
+         */
+        public void abortTest(TestIdentifier testId, String errorMessage) {
+            final PendingResult result = mPendingResults.get(testId);
+
+            // Mark as executed
+            result.allInstancesPassed = false;
+            result.errorMessages.put(mRunConfig, errorMessage);
+            result.remainingConfigs.remove(mRunConfig);
+
+            // Pending result finished, report result
+            if (result.remainingConfigs.isEmpty()) {
+                forwardFinalizedPendingResult(testId);
+            }
+
+            if (testId.equals(mCurrentTestId)) {
+                mCurrentTestId = null;
+            }
+        }
+
+        /**
+         * Handles beginning of dEQP session.
+         */
+        private void handleBeginSession(Map<String, String> values) {
+            // ignore
+        }
+
+        /**
+         * Handles end of dEQP session.
+         */
+        private void handleEndSession(Map<String, String> values) {
+            // ignore
+        }
+
+        /**
+         * Handles beginning of dEQP testcase.
+         */
+        private void handleBeginTestCase(Map<String, String> values) {
+            mCurrentTestId = pathToIdentifier(values.get("dEQP-BeginTestCase-TestCasePath"));
+            mCurrentTestLog = "";
+            mGotTestResult = false;
+
+            // mark instance as started
+            if (mPendingResults.get(mCurrentTestId) != null) {
+                mPendingResults.get(mCurrentTestId).remainingConfigs.remove(mRunConfig);
+            } else {
+                CLog.w("Got unexpected start of %s", mCurrentTestId);
+            }
+        }
+
+        /**
+         * Handles end of dEQP testcase.
+         */
+        private void handleEndTestCase(Map<String, String> values) {
+            final PendingResult result = mPendingResults.get(mCurrentTestId);
+
+            if (result != null) {
+                if (!mGotTestResult) {
+                    result.allInstancesPassed = false;
+                    result.errorMessages.put(mRunConfig, INCOMPLETE_LOG_MESSAGE);
+                }
+
+                if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
+                    result.testLogs.put(mRunConfig, mCurrentTestLog);
+                }
+
+                // Pending result finished, report result
+                if (result.remainingConfigs.isEmpty()) {
+                    forwardFinalizedPendingResult(mCurrentTestId);
+                }
+            } else {
+                CLog.w("Got unexpected end of %s", mCurrentTestId);
+            }
+            mCurrentTestId = null;
+        }
+
+        /**
+         * Handles dEQP testcase result.
+         */
+        private void handleTestCaseResult(Map<String, String> values) {
+            String code = values.get("dEQP-TestCaseResult-Code");
+            String details = values.get("dEQP-TestCaseResult-Details");
+
+            if (mPendingResults.get(mCurrentTestId) == null) {
+                CLog.w("Got unexpected result for %s", mCurrentTestId);
+                mGotTestResult = true;
+                return;
+            }
+
+            if (code.compareTo("Pass") == 0) {
+                mGotTestResult = true;
+            } else if (code.compareTo("NotSupported") == 0) {
+                mGotTestResult = true;
+            } else if (code.compareTo("QualityWarning") == 0) {
+                mGotTestResult = true;
+            } else if (code.compareTo("CompatibilityWarning") == 0) {
+                mGotTestResult = true;
+            } else if (code.compareTo("Fail") == 0 || code.compareTo("ResourceError") == 0
+                    || code.compareTo("InternalError") == 0 || code.compareTo("Crash") == 0
+                    || code.compareTo("Timeout") == 0) {
+                mPendingResults.get(mCurrentTestId).allInstancesPassed = false;
+                mPendingResults.get(mCurrentTestId)
+                        .errorMessages.put(mRunConfig, code + ": " + details);
+                mGotTestResult = true;
+            } else {
+                String codeError = "Unknown result code: " + code;
+                mPendingResults.get(mCurrentTestId).allInstancesPassed = false;
+                mPendingResults.get(mCurrentTestId)
+                        .errorMessages.put(mRunConfig, codeError + ": " + details);
+                mGotTestResult = true;
+            }
+        }
+
+        /**
+         * Handles terminated dEQP testcase.
+         */
+        private void handleTestCaseTerminate(Map<String, String> values) {
+            final PendingResult result = mPendingResults.get(mCurrentTestId);
+
+            if (result != null) {
+                String reason = values.get("dEQP-TerminateTestCase-Reason");
+                mPendingResults.get(mCurrentTestId).allInstancesPassed = false;
+                mPendingResults.get(mCurrentTestId)
+                        .errorMessages.put(mRunConfig, "Terminated: " + reason);
+
+                // Pending result finished, report result
+                if (result.remainingConfigs.isEmpty()) {
+                    forwardFinalizedPendingResult(mCurrentTestId);
+                }
+            } else {
+                CLog.w("Got unexpected termination of %s", mCurrentTestId);
+            }
+
+            mCurrentTestId = null;
+            mGotTestResult = true;
+        }
+
+        /**
+         * Handles dEQP testlog data.
+         */
+        private void handleTestLogData(Map<String, String> values) {
+            mCurrentTestLog = mCurrentTestLog + values.get("dEQP-TestLogData-Log");
+        }
+
+        /**
+         * Handles new instrumentation status message.
+         */
+        public void handleStatus(Map<String, String> values) {
+            String eventType = values.get("dEQP-EventType");
+
+            if (eventType == null) {
+                return;
+            }
+
+            if (eventType.compareTo("BeginSession") == 0) {
+                handleBeginSession(values);
+            } else if (eventType.compareTo("EndSession") == 0) {
+                handleEndSession(values);
+            } else if (eventType.compareTo("BeginTestCase") == 0) {
+                handleBeginTestCase(values);
+            } else if (eventType.compareTo("EndTestCase") == 0) {
+                handleEndTestCase(values);
+            } else if (eventType.compareTo("TestCaseResult") == 0) {
+                handleTestCaseResult(values);
+            } else if (eventType.compareTo("TerminateTestCase") == 0) {
+                handleTestCaseTerminate(values);
+            } else if (eventType.compareTo("TestLogData") == 0) {
+                handleTestLogData(values);
+            }
+        }
+
+        /**
+         * Signal listener that batch ended and forget incomplete results.
+         */
+        public void endBatch() {
+            // end open test if when stream ends
+            if (mCurrentTestId != null) {
+                // Current instance was removed from remainingConfigs when case
+                // started. Mark current instance as pending.
+                if (mPendingResults.get(mCurrentTestId) != null) {
+                    mPendingResults.get(mCurrentTestId).remainingConfigs.add(mRunConfig);
+                } else {
+                    CLog.w("Got unexpected internal state of %s", mCurrentTestId);
+                }
+            }
+            mCurrentTestId = null;
+        }
+    }
+
+    /**
      * dEQP instrumentation parser
      */
-    class InstrumentationParser extends MultiLineReceiver {
-        private DeqpTestRunner mDeqpTests;
+    private static class InstrumentationParser extends MultiLineReceiver {
+        private TestInstanceResultListener mListener;
 
         private Map<String, String> mValues;
         private String mCurrentName;
         private String mCurrentValue;
+        private int mResultCode;
+        private boolean mGotExitValue = false;
 
 
-        public InstrumentationParser(DeqpTestRunner tests) {
-            mDeqpTests = tests;
+        public InstrumentationParser(TestInstanceResultListener listener) {
+            mListener = listener;
         }
 
         /**
@@ -125,7 +589,7 @@
                         mCurrentValue = null;
                     }
 
-                    mDeqpTests.handleStatus(mValues);
+                    mListener.handleStatus(mValues);
                     mValues = null;
                 } else if (line.startsWith("INSTRUMENTATION_STATUS: dEQP-")) {
                     if (mCurrentName != null) {
@@ -142,6 +606,13 @@
 
                     mCurrentName = line.substring(nameBegin, nameEnd);
                     mCurrentValue = line.substring(valueBegin);
+                } else if (line.startsWith("INSTRUMENTATION_CODE: ")) {
+                    try {
+                        mResultCode = Integer.parseInt(line.substring(22));
+                        mGotExitValue = true;
+                    } catch (NumberFormatException ex) {
+                        CLog.w("Instrumentation code format unexpected");
+                    }
                 } else if (mCurrentValue != null) {
                     mCurrentValue = mCurrentValue + line;
                 }
@@ -161,7 +632,7 @@
             }
 
             if (mValues != null) {
-                mDeqpTests.handleStatus(mValues);
+                mListener.handleStatus(mValues);
                 mValues = null;
             }
         }
@@ -173,12 +644,411 @@
         public boolean isCancelled() {
             return false;
         }
+
+        /**
+         * Returns whether target instrumentation exited normally.
+         */
+        public boolean wasSuccessful() {
+            return mGotExitValue;
+        }
+
+        /**
+         * Returns Instrumentation return code
+         */
+        public int getResultCode() {
+            return mResultCode;
+        }
+    }
+
+    /**
+     * dEQP platfom query instrumentation parser
+     */
+    private static class PlatformQueryInstrumentationParser extends MultiLineReceiver {
+        private Map<String,String> mResultMap = new LinkedHashMap<>();
+        private int mResultCode;
+        private boolean mGotExitValue = false;
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void processNewLines(String[] lines) {
+            for (String line : lines) {
+                if (line.startsWith("INSTRUMENTATION_RESULT: ")) {
+                    final String parts[] = line.substring(24).split("=",2);
+                    if (parts.length == 2) {
+                        mResultMap.put(parts[0], parts[1]);
+                    } else {
+                        CLog.w("Instrumentation status format unexpected");
+                    }
+                } else if (line.startsWith("INSTRUMENTATION_CODE: ")) {
+                    try {
+                        mResultCode = Integer.parseInt(line.substring(22));
+                        mGotExitValue = true;
+                    } catch (NumberFormatException ex) {
+                        CLog.w("Instrumentation code format unexpected");
+                    }
+                }
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isCancelled() {
+            return false;
+        }
+
+        /**
+         * Returns whether target instrumentation exited normally.
+         */
+        public boolean wasSuccessful() {
+            return mGotExitValue;
+        }
+
+        /**
+         * Returns Instrumentation return code
+         */
+        public int getResultCode() {
+            return mResultCode;
+        }
+
+        public Map<String,String> getResultMap() {
+            return mResultMap;
+        }
+    }
+
+    /**
+     * Interface for sleeping.
+     *
+     * Exposed for unit testing
+     */
+    public static interface ISleepProvider {
+        public void sleep(int milliseconds);
+    };
+
+    private static class SleepProvider implements ISleepProvider {
+        public void sleep(int milliseconds) {
+            try {
+                Thread.sleep(milliseconds);
+            } catch (InterruptedException ex) {
+            }
+        }
+    };
+
+    /**
+     * Interface for failure recovery.
+     *
+     * Exposed for unit testing
+     */
+    public static interface IRecovery {
+        /**
+         * Sets the sleep provider IRecovery works on
+         */
+        public void setSleepProvider(ISleepProvider sleepProvider);
+
+        /**
+         * Sets the device IRecovery works on
+         */
+        public void setDevice(ITestDevice device);
+
+        /**
+         * Informs Recovery that test execution has progressed since the last recovery
+         */
+        public void onExecutionProgressed();
+
+        /**
+         * Tries to recover device after failed refused connection.
+         *
+         * @throws DeviceNotAvailableException if recovery did not succeed
+         */
+        public void recoverConnectionRefused() throws DeviceNotAvailableException;
+
+        /**
+         * Tries to recover device after abnormal execution termination or link failure.
+         *
+         * @param progressedSinceLastCall true if test execution has progressed since last call
+         * @throws DeviceNotAvailableException if recovery did not succeed
+         */
+        public void recoverComLinkKilled() throws DeviceNotAvailableException;
+    };
+
+    /**
+     * State machine for execution failure recovery.
+     *
+     * Exposed for unit testing
+     */
+    public static class Recovery implements IRecovery {
+        private int RETRY_COOLDOWN_MS = 6000; // 6 seconds
+        private int PROCESS_KILL_WAIT_MS = 1000; // 1 second
+
+        private static enum MachineState {
+            WAIT, // recover by waiting
+            RECOVER, // recover by calling recover()
+            REBOOT, // recover by rebooting
+            FAIL, // cannot recover
+        };
+
+        private MachineState mState = MachineState.WAIT;
+        private ITestDevice mDevice;
+        private ISleepProvider mSleepProvider;
+
+        private static class ProcessKillFailureException extends Exception {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void setSleepProvider(ISleepProvider sleepProvider) {
+            mSleepProvider = sleepProvider;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void setDevice(ITestDevice device) {
+            mDevice = device;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void onExecutionProgressed() {
+            mState = MachineState.WAIT;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void recoverConnectionRefused() throws DeviceNotAvailableException {
+            switch (mState) {
+                case WAIT: // not a valid stratedy for connection refusal, fallthrough
+                case RECOVER:
+                    // First failure, just try to recover
+                    CLog.w("ADB connection failed, trying to recover");
+                    mState = MachineState.REBOOT; // the next step is to reboot
+
+                    try {
+                        recoverDevice();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverConnectionRefused();
+                    }
+                    break;
+
+                case REBOOT:
+                    // Second failure in a row, try to reboot
+                    CLog.w("ADB connection failed after recovery, rebooting device");
+                    mState = MachineState.FAIL; // the next step is to fail
+
+                    try {
+                        rebootDevice();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverConnectionRefused();
+                    }
+                    break;
+
+                case FAIL:
+                    // Third failure in a row, just fail
+                    CLog.w("Cannot recover ADB connection");
+                    throw new DeviceNotAvailableException("failed to connect after reboot");
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void recoverComLinkKilled() throws DeviceNotAvailableException {
+            switch (mState) {
+                case WAIT:
+                    // First failure, just try to wait and try again
+                    CLog.w("ADB link failed, retrying after a cooldown period");
+                    mState = MachineState.RECOVER; // the next step is to recover the device
+
+                    waitCooldown();
+
+                    // even if the link to deqp on-device process was killed, the process might
+                    // still be alive. Locate and terminate such unwanted processes.
+                    try {
+                        killDeqpProcess();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    } catch (ProcessKillFailureException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    }
+                    break;
+
+                case RECOVER:
+                    // Second failure, just try to recover
+                    CLog.w("ADB link failed, trying to recover");
+                    mState = MachineState.REBOOT; // the next step is to reboot
+
+                    try {
+                        recoverDevice();
+                        killDeqpProcess();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    } catch (ProcessKillFailureException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    }
+                    break;
+
+                case REBOOT:
+                    // Third failure in a row, try to reboot
+                    CLog.w("ADB link failed after recovery, rebooting device");
+                    mState = MachineState.FAIL; // the next step is to fail
+
+                    try {
+                        rebootDevice();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    }
+                    break;
+
+                case FAIL:
+                    // Fourth failure in a row, just fail
+                    CLog.w("Cannot recover ADB connection");
+                    throw new DeviceNotAvailableException("link killed after reboot");
+            }
+        }
+
+        private void waitCooldown() {
+            mSleepProvider.sleep(RETRY_COOLDOWN_MS);
+        }
+
+        private Iterable<Integer> getDeqpProcessPids() throws DeviceNotAvailableException {
+            final List<Integer> pids = new ArrayList<Integer>(2);
+            final String processes = mDevice.executeShellCommand("ps | grep com.drawelements");
+            final String[] lines = processes.split("(\\r|\\n)+");
+            for (String line : lines) {
+                final String[] fields = line.split("\\s+");
+                if (fields.length < 2) {
+                    continue;
+                }
+
+                try {
+                    final int processId = Integer.parseInt(fields[1], 10);
+                    pids.add(processId);
+                } catch (NumberFormatException ex) {
+                    continue;
+                }
+            }
+            return pids;
+        }
+
+        private void killDeqpProcess() throws DeviceNotAvailableException,
+                ProcessKillFailureException {
+            for (Integer processId : getDeqpProcessPids()) {
+                mDevice.executeShellCommand(String.format("kill -9 %d", processId));
+            }
+
+            mSleepProvider.sleep(PROCESS_KILL_WAIT_MS);
+
+            // check that processes actually died
+            if (getDeqpProcessPids().iterator().hasNext()) {
+                // a process is still alive, killing failed
+                throw new ProcessKillFailureException();
+            }
+        }
+
+        public void recoverDevice() throws DeviceNotAvailableException {
+            // Work around the API. We need to call recoverDevice() on the test device and
+            // we know that mDevice is a TestDevice. However even though the recoverDevice()
+            // method is public suggesting it should be publicly accessible, the class itself
+            // and its super-interface (IManagedTestDevice) are package-private.
+            final Method recoverDeviceMethod;
+            try {
+                recoverDeviceMethod = mDevice.getClass().getMethod("recoverDevice");
+                recoverDeviceMethod.setAccessible(true);
+            } catch (NoSuchMethodException ex) {
+                throw new AssertionError("Test device must have recoverDevice()");
+            }
+
+            try {
+                recoverDeviceMethod.invoke(mDevice);
+            } catch (InvocationTargetException ex) {
+                if (ex.getCause() instanceof DeviceNotAvailableException) {
+                    throw (DeviceNotAvailableException)ex.getCause();
+                } else if (ex.getCause() instanceof RuntimeException) {
+                    throw (RuntimeException)ex.getCause();
+                } else {
+                    throw new AssertionError("unexpected throw", ex);
+                }
+            } catch (IllegalAccessException ex) {
+                throw new AssertionError("unexpected throw", ex);
+            }
+        }
+
+        private void rebootDevice() throws DeviceNotAvailableException {
+            mDevice.reboot();
+        }
+    };
+
+    /**
+     * Parse map of instance arguments to map of BatchRunConfigurations
+     */
+    private static Map<TestIdentifier, Set<BatchRunConfiguration>> parseTestInstances(
+            Collection<TestIdentifier> tests,
+            Map<TestIdentifier, List<Map<String,String>>> testInstances) {
+        final Map<TestIdentifier, Set<BatchRunConfiguration>> instances = new HashMap<>();
+        for (final TestIdentifier test : tests) {
+            final Set<BatchRunConfiguration> testInstanceSet = new LinkedHashSet<>();
+            if (testInstances.get(test).isEmpty()) {
+                // no instances defined, use default
+                testInstanceSet.add(DEFAULT_CONFIG);
+            } else {
+                for (Map<String, String> instanceArgs : testInstances.get(test)) {
+                    testInstanceSet.add(parseRunConfig(instanceArgs));
+                }
+            }
+            instances.put(test, testInstanceSet);
+        }
+        return instances;
+    }
+
+    private static BatchRunConfiguration parseRunConfig(Map<String,String> instanceArguments) {
+        final String glConfig;
+        final String rotation;
+        final String surfaceType;
+
+        if (instanceArguments.containsKey("glconfig")) {
+            glConfig = instanceArguments.get("glconfig");
+        } else {
+            glConfig = DEFAULT_CONFIG.getGlConfig();
+        }
+        if (instanceArguments.containsKey("rotation")) {
+            rotation = instanceArguments.get("rotation");
+        } else {
+            rotation = DEFAULT_CONFIG.getRotation();
+        }
+        if (instanceArguments.containsKey("surfaceType")) {
+            surfaceType = instanceArguments.get("surfaceType");
+        } else {
+            surfaceType = DEFAULT_CONFIG.getSurfaceType();
+        }
+
+        return new BatchRunConfiguration(glConfig, rotation, surfaceType);
+    }
+
+    private Set<BatchRunConfiguration> getTestRunConfigs (TestIdentifier testId) {
+        return mTestInstances.get(testId);
     }
 
     /**
      * Converts dEQP testcase path to TestIdentifier.
      */
-    private TestIdentifier pathToIdentifier(String testPath) {
+    private static TestIdentifier pathToIdentifier(String testPath) {
         String[] components = testPath.split("\\.");
         String name = components[components.length - 1];
         String className = null;
@@ -194,150 +1064,14 @@
         return new TestIdentifier(className, name);
     }
 
-    /**
-     * Handles beginning of dEQP session.
-     */
-    private void handleBeginSession(Map<String, String> values) {
-        String id = AbiUtils.createId(mAbi.getName(), mPackageName);
-        mListener.testRunStarted(id, mTests.size());
-    }
-
-    /**
-     * Handles end of dEQP session.
-     */
-    private void handleEndSession(Map<String, String> values) {
-        Map <String, String> emptyMap = Collections.emptyMap();
-        mListener.testRunEnded(0, emptyMap);
-    }
-
-    /**
-     * Handles beginning of dEQP testcase.
-     */
-    private void handleBeginTestCase(Map<String, String> values) {
-        mCurrentTestId = pathToIdentifier(values.get("dEQP-BeginTestCase-TestCasePath"));
-        mCurrentTestLog = "";
-        mGotTestResult = false;
-
-        mListener.testStarted(mCurrentTestId);
-        mTests.remove(mCurrentTestId);
-    }
-
-    /**
-     * Handles end of dEQP testcase.
-     */
-    private void handleEndTestCase(Map<String, String> values) {
-        Map <String, String> emptyMap = Collections.emptyMap();
-
-        if (!mGotTestResult) {
-            mListener.testFailed(mCurrentTestId,
-                    INCOMPLETE_LOG_MESSAGE);
-        }
-
-        if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
-            ByteArrayInputStreamSource source
-                    = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
-
-            mListener.testLog(mCurrentTestId.getClassName() + "."
-                    + mCurrentTestId.getTestName(), LogDataType.XML, source);
-
-            source.cancel();
-        }
-
-        mListener.testEnded(mCurrentTestId, emptyMap);
-        mCurrentTestId = null;
-    }
-
-    /**
-     * Handles dEQP testcase result.
-     */
-    private void handleTestCaseResult(Map<String, String> values) {
-        String code = values.get("dEQP-TestCaseResult-Code");
-        String details = values.get("dEQP-TestCaseResult-Details");
-
-        if (code.compareTo("Pass") == 0) {
-            mGotTestResult = true;
-        } else if (code.compareTo("NotSupported") == 0) {
-            mGotTestResult = true;
-        } else if (code.compareTo("QualityWarning") == 0) {
-            mGotTestResult = true;
-        } else if (code.compareTo("CompatibilityWarning") == 0) {
-            mGotTestResult = true;
-        } else if (code.compareTo("Fail") == 0 || code.compareTo("ResourceError") == 0
-                || code.compareTo("InternalError") == 0 || code.compareTo("Crash") == 0
-                || code.compareTo("Timeout") == 0) {
-            mListener.testFailed(mCurrentTestId,
-                    code + ": " + details);
-            mGotTestResult = true;
-        } else {
-            mListener.testFailed(mCurrentTestId,
-                    "Unknown result code: " + code + ": " + details);
-            mGotTestResult = true;
-        }
-    }
-
-    /**
-     * Handles terminated dEQP testcase.
-     */
-    private void handleTestCaseTerminate(Map<String, String> values) {
-        Map <String, String> emptyMap = Collections.emptyMap();
-
-        String reason = values.get("dEQP-TerminateTestCase-Reason");
-        mListener.testFailed(mCurrentTestId,
-                "Terminated: " + reason);
-        mListener.testEnded(mCurrentTestId, emptyMap);
-
-        if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
-            ByteArrayInputStreamSource source
-                    = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
-
-            mListener.testLog(mCurrentTestId.getClassName() + "."
-                    + mCurrentTestId.getTestName(), LogDataType.XML, source);
-
-            source.cancel();
-        }
-
-        mCurrentTestId = null;
-        mGotTestResult = true;
-    }
-
-    /**
-     * Handles dEQP testlog data.
-     */
-    private void handleTestLogData(Map<String, String> values) {
-        mCurrentTestLog = mCurrentTestLog + values.get("dEQP-TestLogData-Log");
-    }
-
-    /**
-     * Handles new instrumentation status message.
-     */
-    public void handleStatus(Map<String, String> values) {
-        String eventType = values.get("dEQP-EventType");
-
-        if (eventType == null) {
-            return;
-        }
-
-        if (eventType.compareTo("BeginSession") == 0) {
-            handleBeginSession(values);
-        } else if (eventType.compareTo("EndSession") == 0) {
-            handleEndSession(values);
-        } else if (eventType.compareTo("BeginTestCase") == 0) {
-            handleBeginTestCase(values);
-        } else if (eventType.compareTo("EndTestCase") == 0) {
-            handleEndTestCase(values);
-        } else if (eventType.compareTo("TestCaseResult") == 0) {
-            handleTestCaseResult(values);
-        } else if (eventType.compareTo("TerminateTestCase") == 0) {
-            handleTestCaseTerminate(values);
-        } else if (eventType.compareTo("TestLogData") == 0) {
-            handleTestLogData(values);
-        }
+    private String getId() {
+        return AbiUtils.createId(mAbi.getName(), mPackageName);
     }
 
     /**
      * Generates tescase trie from dEQP testcase paths. Used to define which testcases to execute.
      */
-    private String generateTestCaseTrieFromPaths(Collection<String> tests) {
+    private static String generateTestCaseTrieFromPaths(Collection<String> tests) {
         String result = "{";
         boolean first = true;
 
@@ -390,51 +1124,492 @@
     /**
      * Generates testcase trie from TestIdentifiers.
      */
-    private String generateTestCaseTrie(Collection<TestIdentifier> tests) {
+    private static String generateTestCaseTrie(Collection<TestIdentifier> tests) {
         ArrayList<String> testPaths = new ArrayList<String>();
 
         for (TestIdentifier test : tests) {
             testPaths.add(test.getClassName() + "." + test.getTestName());
-
-            // Limit number of testcases for each run
-            if (testPaths.size() > TESTCASE_BATCH_LIMIT)
-                break;
         }
 
         return generateTestCaseTrieFromPaths(testPaths);
     }
 
+    private static class TestBatch {
+        public BatchRunConfiguration config;
+        public List<TestIdentifier> tests;
+    }
+
+    private TestBatch selectRunBatch() {
+        return selectRunBatch(mRemainingTests, null);
+    }
+
     /**
-     * Executes tests on the device.
+     * Creates a TestBatch from the given tests or null if not tests remaining.
+     *
+     *  @param pool List of tests to select from
+     *  @param requiredConfig Select only instances with pending requiredConfig, or null to select
+     *         any run configuration.
      */
-    private void executeTests(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        InstrumentationParser parser = new InstrumentationParser(this);
-        String caseListFileName = "/sdcard/dEQP-TestCaseList.txt";
-        String logFileName = "/sdcard/TestLog.qpa";
-        String testCases = generateTestCaseTrie(mTests);
+    private TestBatch selectRunBatch(Collection<TestIdentifier> pool,
+            BatchRunConfiguration requiredConfig) {
+        // select one test (leading test) that is going to be executed and then pack along as many
+        // other compatible instances as possible.
 
-        mDevice.executeShellCommand("rm " + caseListFileName);
-        mDevice.executeShellCommand("rm " + logFileName);
-        mDevice.pushString(testCases + "\n", caseListFileName);
+        TestIdentifier leadingTest = null;
+        for (TestIdentifier test : pool) {
+            if (!mRemainingTests.contains(test)) {
+                continue;
+            }
+            if (requiredConfig != null &&
+                    !mInstanceListerner.isPendingTestInstance(test, requiredConfig)) {
+                continue;
+            }
+            leadingTest = test;
+            break;
+        }
 
-        String instrumentationName =
+        // no remaining tests?
+        if (leadingTest == null) {
+            return null;
+        }
+
+        BatchRunConfiguration leadingTestConfig = null;
+        if (requiredConfig != null) {
+            leadingTestConfig = requiredConfig;
+        } else {
+            for (BatchRunConfiguration runConfig : getTestRunConfigs(leadingTest)) {
+                if (mInstanceListerner.isPendingTestInstance(leadingTest, runConfig)) {
+                    leadingTestConfig = runConfig;
+                    break;
+                }
+            }
+        }
+
+        // test pending <=> test has a pending config
+        if (leadingTestConfig == null) {
+            throw new AssertionError("search postcondition failed");
+        }
+
+        final int leadingInstability = getTestInstabilityRating(leadingTest);
+
+        final TestBatch runBatch = new TestBatch();
+        runBatch.config = leadingTestConfig;
+        runBatch.tests = new ArrayList<>();
+        runBatch.tests.add(leadingTest);
+
+        for (TestIdentifier test : pool) {
+            if (test == leadingTest) {
+                // do not re-select the leading tests
+                continue;
+            }
+            if (!mInstanceListerner.isPendingTestInstance(test, leadingTestConfig)) {
+                // select only compatible
+                continue;
+            }
+            if (getTestInstabilityRating(test) != leadingInstability) {
+                // pack along only cases in the same stability category. Packing more dangerous
+                // tests along jeopardizes the stability of this run. Packing more stable tests
+                // along jeopardizes their stability rating.
+                continue;
+            }
+            if (runBatch.tests.size() >= getBatchSizeLimitForInstability(leadingInstability)) {
+                // batch size is limited.
+                break;
+            }
+            runBatch.tests.add(test);
+        }
+
+        return runBatch;
+    }
+
+    private int getBatchNumPendingCases(TestBatch batch) {
+        int numPending = 0;
+        for (TestIdentifier test : batch.tests) {
+            if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
+                ++numPending;
+            }
+        }
+        return numPending;
+    }
+
+    private int getBatchSizeLimitForInstability(int batchInstabilityRating) {
+        // reduce group size exponentially down to one
+        return Math.max(1, TESTCASE_BATCH_LIMIT / (1 << batchInstabilityRating));
+    }
+
+    private int getTestInstabilityRating(TestIdentifier testId) {
+        if (mTestInstabilityRatings.containsKey(testId)) {
+            return mTestInstabilityRatings.get(testId);
+        } else {
+            return 0;
+        }
+    }
+
+    private void recordTestInstability(TestIdentifier testId) {
+        mTestInstabilityRatings.put(testId, getTestInstabilityRating(testId) + 1);
+    }
+
+    private void clearTestInstability(TestIdentifier testId) {
+        mTestInstabilityRatings.put(testId, 0);
+    }
+
+    /**
+     * Executes all tests on the device.
+     */
+    private void runTests() throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        for (;;) {
+            TestBatch batch = selectRunBatch();
+
+            if (batch == null) {
+                break;
+            }
+
+            runTestRunBatch(batch);
+        }
+    }
+
+    /**
+     * Runs a TestBatch by either faking it or executing it on a device.
+     */
+    private void runTestRunBatch(TestBatch batch) throws DeviceNotAvailableException,
+            CapabilityQueryFailureException {
+        // prepare instance listener
+        mInstanceListerner.setCurrentConfig(batch.config);
+        for (TestIdentifier test : batch.tests) {
+            mInstanceListerner.setTestInstances(test, getTestRunConfigs(test));
+        }
+
+        // execute only if config is executable, else fake results
+        if (isSupportedRunConfiguration(batch.config)) {
+            executeTestRunBatch(batch);
+        } else {
+            fakePassTestRunBatch(batch);
+        }
+    }
+
+    private boolean isSupportedRunConfiguration(BatchRunConfiguration runConfig)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        // orientation support
+        if (!BatchRunConfiguration.ROTATION_UNSPECIFIED.equals(runConfig.getRotation())) {
+            final Set<String> features = getDeviceFeatures(mDevice);
+
+            if (isPortraitClassRotation(runConfig.getRotation()) &&
+                    !features.contains(FEATURE_PORTRAIT)) {
+                return false;
+            }
+            if (isLandscapeClassRotation(runConfig.getRotation()) &&
+                    !features.contains(FEATURE_LANDSCAPE)) {
+                return false;
+            }
+        }
+
+        if (isOpenGlEsPackage()) {
+            // renderability support for OpenGL ES tests
+            return isSupportedGlesRenderConfig(runConfig);
+        } else {
+            return true;
+        }
+    }
+
+    private static final class AdbComLinkOpenError extends Exception {
+        public AdbComLinkOpenError(String description, Throwable inner) {
+            super(description, inner);
+        }
+    };
+    private static final class AdbComLinkKilledError extends Exception {
+        public AdbComLinkKilledError(String description, Throwable inner) {
+            super(description, inner);
+        }
+    };
+
+    /**
+     * Executes a given command in adb shell
+     *
+     * @throws AdbComLinkOpenError if connection cannot be established.
+     * @throws AdbComLinkKilledError if established connection is killed prematurely.
+     */
+    private void executeShellCommandAndReadOutput(final String command,
+            final IShellOutputReceiver receiver)
+            throws AdbComLinkOpenError, AdbComLinkKilledError {
+        try {
+            mDevice.getIDevice().executeShellCommand(command, receiver,
+                    UNRESPOSIVE_CMD_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        } catch (TimeoutException ex) {
+            // Opening connection timed out
+            throw new AdbComLinkOpenError("opening connection timed out", ex);
+        } catch (AdbCommandRejectedException ex) {
+            // Command rejected
+            throw new AdbComLinkOpenError("command rejected", ex);
+        } catch (IOException ex) {
+            // shell command channel killed
+            throw new AdbComLinkKilledError("command link killed", ex);
+        } catch (ShellCommandUnresponsiveException ex) {
+            // shell command halted
+            throw new AdbComLinkKilledError("command link hung", ex);
+        }
+    }
+
+    /**
+     * Executes given test batch on a device
+     */
+    private void executeTestRunBatch(TestBatch batch) throws DeviceNotAvailableException {
+        // attempt full run once
+        executeTestRunBatchRun(batch);
+
+        // split remaining tests to two sub batches and execute both. This will terminate
+        // since executeTestRunBatchRun will always progress for a batch of size 1.
+        final ArrayList<TestIdentifier> pendingTests = new ArrayList<>();
+
+        for (TestIdentifier test : batch.tests) {
+            if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
+                pendingTests.add(test);
+            }
+        }
+
+        final int divisorNdx = pendingTests.size() / 2;
+        final List<TestIdentifier> headList = pendingTests.subList(0, divisorNdx);
+        final List<TestIdentifier> tailList = pendingTests.subList(divisorNdx, pendingTests.size());
+
+        // head
+        for (;;) {
+            TestBatch subBatch = selectRunBatch(headList, batch.config);
+
+            if (subBatch == null) {
+                break;
+            }
+
+            executeTestRunBatch(subBatch);
+        }
+
+        // tail
+        for (;;) {
+            TestBatch subBatch = selectRunBatch(tailList, batch.config);
+
+            if (subBatch == null) {
+                break;
+            }
+
+            executeTestRunBatch(subBatch);
+        }
+
+        if (getBatchNumPendingCases(batch) != 0) {
+            throw new AssertionError("executeTestRunBatch postcondition failed");
+        }
+    }
+
+    /**
+     * Runs one execution pass over the given batch.
+     *
+     * Tries to run the batch. Always makes progress (executes instances or modifies stability
+     * scores).
+     */
+    private void executeTestRunBatchRun(TestBatch batch) throws DeviceNotAvailableException {
+        if (getBatchNumPendingCases(batch) != batch.tests.size()) {
+            throw new AssertionError("executeTestRunBatchRun precondition failed");
+        }
+
+        checkInterrupted(); // throws if interrupted
+
+        final String testCases = generateTestCaseTrie(batch.tests);
+
+        mDevice.executeShellCommand("rm " + CASE_LIST_FILE_NAME);
+        mDevice.executeShellCommand("rm " + LOG_FILE_NAME);
+        mDevice.pushString(testCases + "\n", CASE_LIST_FILE_NAME);
+
+        final String instrumentationName =
                 "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
 
-        String command = String.format(
-                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
-                    + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\""
-                    + " -e deqpLogData \"%s\" %s",
-                AbiUtils.createAbiFlag(mAbi.getName()), logFileName, caseListFileName, mLogData,
-                instrumentationName);
+        final StringBuilder deqpCmdLine = new StringBuilder();
+        deqpCmdLine.append("--deqp-caselist-file=");
+        deqpCmdLine.append(CASE_LIST_FILE_NAME);
+        deqpCmdLine.append(" ");
+        deqpCmdLine.append(getRunConfigDisplayCmdLine(batch.config));
 
-        mDevice.executeShellCommand(command, parser);
-        parser.flush();
+        // If we are not logging data, do not bother outputting the images from the test exe.
+        if (!mLogData) {
+            deqpCmdLine.append(" --deqp-log-images=disable");
+        }
+
+        deqpCmdLine.append(" --deqp-watchdog=enable");
+
+        final String command = String.format(
+                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \"%s\""
+                    + " -e deqpLogData \"%s\" %s",
+                AbiUtils.createAbiFlag(mAbi.getName()), LOG_FILE_NAME, deqpCmdLine.toString(),
+                mLogData, instrumentationName);
+
+        final int numRemainingInstancesBefore = getNumRemainingInstances();
+        final InstrumentationParser parser = new InstrumentationParser(mInstanceListerner);
+        Throwable interruptingError = null;
+
+        try {
+            executeShellCommandAndReadOutput(command, parser);
+        } catch (Throwable ex) {
+            interruptingError = ex;
+        } finally {
+            parser.flush();
+        }
+
+        final boolean progressedSinceLastCall = mInstanceListerner.getCurrentTestId() != null ||
+                getNumRemainingInstances() < numRemainingInstancesBefore;
+
+        if (progressedSinceLastCall) {
+            mDeviceRecovery.onExecutionProgressed();
+        }
+
+        // interrupted, try to recover
+        if (interruptingError != null) {
+            if (interruptingError instanceof AdbComLinkOpenError) {
+                mDeviceRecovery.recoverConnectionRefused();
+            } else if (interruptingError instanceof AdbComLinkKilledError) {
+                mDeviceRecovery.recoverComLinkKilled();
+            } else if (interruptingError instanceof RunInterruptedException) {
+                // external run interruption request. Terminate immediately.
+                throw (RunInterruptedException)interruptingError;
+            } else {
+                CLog.e(interruptingError);
+                throw new RuntimeException(interruptingError);
+            }
+
+            // recoverXXX did not throw => recovery succeeded
+        } else if (!parser.wasSuccessful()) {
+            mDeviceRecovery.recoverComLinkKilled();
+            // recoverXXX did not throw => recovery succeeded
+        }
+
+        // Progress guarantees.
+        if (batch.tests.size() == 1) {
+            final TestIdentifier onlyTest = batch.tests.iterator().next();
+            final boolean wasTestExecuted =
+                    !mInstanceListerner.isPendingTestInstance(onlyTest, batch.config) &&
+                    mInstanceListerner.getCurrentTestId() == null;
+            final boolean wasLinkFailure = !parser.wasSuccessful() || interruptingError != null;
+
+            // Link failures can be caused by external events, require at least two observations
+            // until bailing.
+            if (!wasTestExecuted && (!wasLinkFailure || getTestInstabilityRating(onlyTest) > 0)) {
+                recordTestInstability(onlyTest);
+                // If we cannot finish the test, mark the case as a crash.
+                //
+                // If we couldn't even start the test, fail the test instance as non-executable.
+                // This is required so that a consistently crashing or non-existent tests will
+                // not cause futile (non-terminating) re-execution attempts.
+                if (mInstanceListerner.getCurrentTestId() != null) {
+                    mInstanceListerner.abortTest(onlyTest, INCOMPLETE_LOG_MESSAGE);
+                } else {
+                    mInstanceListerner.abortTest(onlyTest, NOT_EXECUTABLE_LOG_MESSAGE);
+                }
+            } else if (wasTestExecuted) {
+                clearTestInstability(onlyTest);
+            }
+        }
+        else
+        {
+            // Analyze results to update test stability ratings. If there is no interrupting test
+            // logged, increase instability rating of all remaining tests. If there is a
+            // interrupting test logged, increase only its instability rating.
+            //
+            // A successful run of tests clears instability rating.
+            if (mInstanceListerner.getCurrentTestId() == null) {
+                for (TestIdentifier test : batch.tests) {
+                    if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
+                        recordTestInstability(test);
+                    } else {
+                        clearTestInstability(test);
+                    }
+                }
+            } else {
+                recordTestInstability(mInstanceListerner.getCurrentTestId());
+                for (TestIdentifier test : batch.tests) {
+                    // \note: isPendingTestInstance is false for getCurrentTestId. Current ID is
+                    // considered 'running' and will be restored to 'pending' in endBatch().
+                    if (!test.equals(mInstanceListerner.getCurrentTestId()) &&
+                            !mInstanceListerner.isPendingTestInstance(test, batch.config)) {
+                        clearTestInstability(test);
+                    }
+                }
+            }
+        }
+
+        mInstanceListerner.endBatch();
+    }
+
+    private static String getRunConfigDisplayCmdLine(BatchRunConfiguration runConfig) {
+        final StringBuilder deqpCmdLine = new StringBuilder();
+        if (!runConfig.getGlConfig().isEmpty()) {
+            deqpCmdLine.append("--deqp-gl-config-name=");
+            deqpCmdLine.append(runConfig.getGlConfig());
+        }
+        if (!runConfig.getRotation().isEmpty()) {
+            if (deqpCmdLine.length() != 0) {
+                deqpCmdLine.append(" ");
+            }
+            deqpCmdLine.append("--deqp-screen-rotation=");
+            deqpCmdLine.append(runConfig.getRotation());
+        }
+        if (!runConfig.getSurfaceType().isEmpty()) {
+            if (deqpCmdLine.length() != 0) {
+                deqpCmdLine.append(" ");
+            }
+            deqpCmdLine.append("--deqp-surface-type=");
+            deqpCmdLine.append(runConfig.getSurfaceType());
+        }
+        return deqpCmdLine.toString();
+    }
+
+    private int getNumRemainingInstances() {
+        int retVal = 0;
+        for (TestIdentifier testId : mRemainingTests) {
+            // If case is in current working set, sum only not yet executed instances.
+            // If case is not in current working set, sum all instances (since they are not yet
+            // executed).
+            if (mInstanceListerner.mPendingResults.containsKey(testId)) {
+                retVal += mInstanceListerner.mPendingResults.get(testId).remainingConfigs.size();
+            } else {
+                retVal += mTestInstances.get(testId).size();
+            }
+        }
+        return retVal;
+    }
+
+    /**
+     * Checks if this execution has been marked as interrupted and throws if it has.
+     */
+    private void checkInterrupted() throws RunInterruptedException {
+        // Work around the API. RunUtil::checkInterrupted is private but we can call it indirectly
+        // by sleeping a value <= 0.
+        mRunUtil.sleep(0);
+    }
+
+    /**
+     * Pass given batch tests without running it
+     */
+    private void fakePassTestRunBatch(TestBatch batch) {
+        for (TestIdentifier test : batch.tests) {
+            CLog.d("Skipping test '%s' invocation in config '%s'", test.toString(),
+                    batch.config.getId());
+            mInstanceListerner.skipTest(test);
+        }
+    }
+
+    /**
+     * Pass all remaining tests without running them
+     */
+    private void fakePassTests(ITestInvocationListener listener) {
+        Map <String, String> emptyMap = Collections.emptyMap();
+        for (TestIdentifier test : mRemainingTests) {
+            CLog.d("Skipping test '%s', Opengl ES version not supported", test.toString());
+            listener.testStarted(test);
+            listener.testEnded(test, emptyMap);
+        }
+        mRemainingTests.clear();
     }
 
     /**
      * Check if device supports OpenGL ES version.
      */
-    static boolean isSupportedGles(ITestDevice device, int requiredMajorVersion, int requiredMinorVersion) throws DeviceNotAvailableException {
+    private static boolean isSupportedGles(ITestDevice device, int requiredMajorVersion,
+            int requiredMinorVersion) throws DeviceNotAvailableException {
         String roOpenglesVersion = device.getProperty("ro.opengles.version");
 
         if (roOpenglesVersion == null)
@@ -450,6 +1625,112 @@
     }
 
     /**
+     * Query if rendertarget is supported
+     */
+    private boolean isSupportedGlesRenderConfig(BatchRunConfiguration runConfig)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        // query if configuration is supported
+        final StringBuilder configCommandLine =
+                new StringBuilder(getRunConfigDisplayCmdLine(runConfig));
+        if (configCommandLine.length() != 0) {
+            configCommandLine.append(" ");
+        }
+        configCommandLine.append("--deqp-gl-major-version=");
+        configCommandLine.append(getGlesMajorVersion());
+        configCommandLine.append(" --deqp-gl-minor-version=");
+        configCommandLine.append(getGlesMinorVersion());
+
+        final String commandLine = configCommandLine.toString();
+
+        // check for cached result first
+        if (mConfigQuerySupportCache.containsKey(commandLine)) {
+            return mConfigQuerySupportCache.get(commandLine);
+        }
+
+        final boolean supported = queryIsSupportedConfigCommandLine(commandLine);
+        mConfigQuerySupportCache.put(commandLine, supported);
+        return supported;
+    }
+
+    private boolean queryIsSupportedConfigCommandLine(String deqpCommandLine)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        final String instrumentationName =
+                "com.drawelements.deqp/com.drawelements.deqp.platformutil.DeqpPlatformCapabilityQueryInstrumentation";
+        final String command = String.format(
+                "am instrument %s -w -e deqpQueryType renderConfigSupported -e deqpCmdLine \"%s\""
+                    + " %s",
+                AbiUtils.createAbiFlag(mAbi.getName()), deqpCommandLine, instrumentationName);
+
+        final PlatformQueryInstrumentationParser parser = new PlatformQueryInstrumentationParser();
+        mDevice.executeShellCommand(command, parser);
+        parser.flush();
+
+        if (parser.wasSuccessful() && parser.getResultCode() == 0 &&
+                parser.getResultMap().containsKey("Supported")) {
+            if ("Yes".equals(parser.getResultMap().get("Supported"))) {
+                return true;
+            } else if ("No".equals(parser.getResultMap().get("Supported"))) {
+                return false;
+            } else {
+                CLog.e("Capability query did not return a result");
+                throw new CapabilityQueryFailureException();
+            }
+        } else if (parser.wasSuccessful()) {
+            CLog.e("Failed to run capability query. Code: %d, Result: %s",
+                    parser.getResultCode(), parser.getResultMap().toString());
+            throw new CapabilityQueryFailureException();
+        } else {
+            CLog.e("Failed to run capability query");
+            throw new CapabilityQueryFailureException();
+        }
+    }
+
+    /**
+     * Return feature set supported by the device
+     */
+    private Set<String> getDeviceFeatures(ITestDevice device)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        if (mDeviceFeatures == null) {
+            mDeviceFeatures = queryDeviceFeatures(device);
+        }
+        return mDeviceFeatures;
+    }
+
+    /**
+     * Query feature set supported by the device
+     */
+    private static Set<String> queryDeviceFeatures(ITestDevice device)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        // NOTE: Almost identical code in BaseDevicePolicyTest#hasDeviceFeatures
+        // TODO: Move this logic to ITestDevice.
+        String command = "pm list features";
+        String commandOutput = device.executeShellCommand(command);
+
+        // Extract the id of the new user.
+        HashSet<String> availableFeatures = new HashSet<>();
+        for (String feature: commandOutput.split("\\s+")) {
+            // Each line in the output of the command has the format "feature:{FEATURE_VALUE}".
+            String[] tokens = feature.split(":");
+            if (tokens.length < 2 || !"feature".equals(tokens[0])) {
+                CLog.e("Failed parse features. Unexpect format on line \"%s\"", tokens[0]);
+                throw new CapabilityQueryFailureException();
+            }
+            availableFeatures.add(tokens[1]);
+        }
+        return availableFeatures;
+    }
+
+    private boolean isPortraitClassRotation(String rotation) {
+        return BatchRunConfiguration.ROTATION_PORTRAIT.equals(rotation) ||
+                BatchRunConfiguration.ROTATION_REVERSE_PORTRAIT.equals(rotation);
+    }
+
+    private boolean isLandscapeClassRotation(String rotation) {
+        return BatchRunConfiguration.ROTATION_LANDSCAPE.equals(rotation) ||
+                BatchRunConfiguration.ROTATION_REVERSE_LANDSCAPE.equals(rotation);
+    }
+
+    /**
      * Install dEQP OnDevice Package
      */
     private void installTestApk() throws DeviceNotAvailableException {
@@ -473,60 +1754,53 @@
     }
 
     /**
-     * {@inheritDoc}
+     * Parse gl nature from package name
      */
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        mListener = listener;
-
-        if ((mName.equals( "dEQP-GLES3") && isSupportedGles(mDevice, 3, 0))
-            || (mName.equals("dEQP-GLES31") && isSupportedGles(mDevice, 3, 1))) {
-
-            // Make sure there is no pre-existing package form earlier interrupted test run.
-            uninstallTestApk();
-            installTestApk();
-
-            while (!mTests.isEmpty()) {
-                executeTests(listener);
-
-                // Set test to failed if it didn't receive test result
-                if (mCurrentTestId != null) {
-                    Map <String, String> emptyMap = Collections.emptyMap();
-
-                    if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
-                        ByteArrayInputStreamSource source
-                                = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
-
-                        mListener.testLog(mCurrentTestId.getClassName() + "."
-                                + mCurrentTestId.getTestName(), LogDataType.XML, source);
-
-                        source.cancel();
-                    }
-                    if (!mGotTestResult) {
-                        mListener.testFailed(mCurrentTestId,
-                            INCOMPLETE_LOG_MESSAGE);
-                    }
-
-                    mListener.testEnded(mCurrentTestId, emptyMap);
-                    mCurrentTestId = null;
-                    mListener.testRunEnded(0, emptyMap);
-                }
-            }
-
-            uninstallTestApk();
+    private boolean isOpenGlEsPackage() {
+        if ("dEQP-GLES2".equals(mName) || "dEQP-GLES3".equals(mName) ||
+                "dEQP-GLES31".equals(mName)) {
+            return true;
+        } else if ("dEQP-EGL".equals(mName)) {
+            return false;
         } else {
-            /* Pass all tests if OpenGL ES version is not supported */
-            Map <String, String> emptyMap = Collections.emptyMap();
-            String id = AbiUtils.createId(mAbi.getName(), mPackageName);
-            mListener.testRunStarted(id, mTests.size());
+            throw new IllegalStateException("dEQP runner was created with illegal name");
+        }
+    }
 
-            for (TestIdentifier test : mTests) {
-                CLog.d("Skipping test '%s', Opengl ES version not supported", test.toString());
-                mListener.testStarted(test);
-                mListener.testEnded(test, emptyMap);
-            }
+    /**
+     * Check GL support (based on package name)
+     */
+    private boolean isSupportedGles() throws DeviceNotAvailableException {
+        return isSupportedGles(mDevice, getGlesMajorVersion(), getGlesMinorVersion());
+    }
 
-            mListener.testRunEnded(0, emptyMap);
+    /**
+     * Get GL major version (based on package name)
+     */
+    private int getGlesMajorVersion() throws DeviceNotAvailableException {
+        if ("dEQP-GLES2".equals(mName)) {
+            return 2;
+        } else if ("dEQP-GLES3".equals(mName)) {
+            return 3;
+        } else if ("dEQP-GLES31".equals(mName)) {
+            return 3;
+        } else {
+            throw new IllegalStateException("getGlesMajorVersion called for non gles pkg");
+        }
+    }
+
+    /**
+     * Get GL minor version (based on package name)
+     */
+    private int getGlesMinorVersion() throws DeviceNotAvailableException {
+        if ("dEQP-GLES2".equals(mName)) {
+            return 0;
+        } else if ("dEQP-GLES3".equals(mName)) {
+            return 0;
+        } else if ("dEQP-GLES31".equals(mName)) {
+            return 1;
+        } else {
+            throw new IllegalStateException("getGlesMinorVersion called for non gles pkg");
         }
     }
 
@@ -534,15 +1808,34 @@
      * {@inheritDoc}
      */
     @Override
-    public void setDevice(ITestDevice device) {
-        mDevice = device;
-    }
+    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
+        final Map<String, String> emptyMap = Collections.emptyMap();
+        final boolean isSupportedApi = !isOpenGlEsPackage() || isSupportedGles();
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ITestDevice getDevice() {
-        return mDevice;
+        listener.testRunStarted(getId(), mRemainingTests.size());
+
+        try {
+            if (isSupportedApi) {
+                // Make sure there is no pre-existing package form earlier interrupted test run.
+                uninstallTestApk();
+                installTestApk();
+
+                mInstanceListerner.setSink(listener);
+                mDeviceRecovery.setDevice(mDevice);
+                runTests();
+
+                uninstallTestApk();
+            } else {
+                // Pass all tests if OpenGL ES version is not supported
+                fakePassTests(listener);
+            }
+        } catch (CapabilityQueryFailureException ex) {
+            // Platform is not behaving correctly, for example crashing when trying to create
+            // a window. Instead of silenty failing, signal failure by leaving the rest of the
+            // test cases in "NotExecuted" state
+            uninstallTestApk();
+        }
+
+        listener.testRunEnded(0, emptyMap);
     }
 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
deleted file mode 100644
index 3dee99e..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.tradefed.testtype;
-
-import com.android.cts.tradefed.targetprep.SettingsToggler;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.result.ITestInvocationListener;
-
-/**
- * Running the display tests requires modification of secure settings to create an overlay display.
- * Secure settings cannot be changed from device CTS tests since system signature permission is
- * required. Such settings can be modified by the shell user, so a host side test is used.
- */
-public class DisplayTestRunner extends CtsInstrumentationApkTest {
-    private static final String OVERLAY_DISPLAY_DEVICES_SETTING_NAME = "overlay_display_devices";
-
-    // Use a non-standard pattern, must match values in tests/tests/display/.../DisplayTest.java
-    private static final String OVERLAY_DISPLAY_DEVICES_SETTING_VALUE = "181x161/214";
-
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        // CLog.e("run: About to enable overlay display.");
-        SettingsToggler.setGlobalString(getDevice(), OVERLAY_DISPLAY_DEVICES_SETTING_NAME,
-                OVERLAY_DISPLAY_DEVICES_SETTING_VALUE);
-
-        super.run(listener);
-
-        // Tear down overlay display.
-        // CLog.e("run: About to disable overlay display.");
-        SettingsToggler.setGlobalString(getDevice(), OVERLAY_DISPLAY_DEVICES_SETTING_NAME,
-                "");
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
index 6c2ed65..2e4420d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
@@ -29,6 +29,8 @@
 import com.android.tradefed.testtype.IRemoteTest;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Test runner for native gTests.
@@ -43,6 +45,7 @@
     private static final String NATIVE_TESTS_DIRECTORY = "/data/local/tmp/cts-native-tests";
     private static final String NATIVE_TESTS_DIRECTORY_TMP = "/data/local/tmp";
     private static final String ANDROID_PATH_SEPARATOR = "/";
+    private static final String GTEST_FLAG_FILTER = "--gtest_filter=";
 
     private int mMaxTestTimeMs = 1 * 60 * 1000;
 
@@ -53,11 +56,48 @@
 
     private final String mPackageName;
 
+    private String mPositiveFilters = "";
+    private String mNegativeFilters = "";
+
     public GeeTest(String packageName, String exeName) {
         mPackageName = packageName;
         mExeName = exeName;
     }
 
+    public void setPositiveFilters(String positiveFilters) {
+        mPositiveFilters = positiveFilters;
+    }
+
+    public void setNegativeFilters(String negativeFilters) {
+        mNegativeFilters = negativeFilters;
+    }
+
+    protected String getGTestFilters() {
+        // If both filters are empty or null return empty string.
+        if (mPositiveFilters == null && mNegativeFilters == null) {
+            return "";
+        }
+        if (mPositiveFilters.isEmpty() && mNegativeFilters.isEmpty()) {
+            return "";
+        }
+        // Build filter string.
+        StringBuilder sb = new StringBuilder();
+        sb.append(GTEST_FLAG_FILTER);
+        boolean hasPositiveFilters = false;
+        if (mPositiveFilters != null && !mPositiveFilters.isEmpty()) {
+            sb.append(mPositiveFilters);
+            hasPositiveFilters = true;
+        }
+        if (mNegativeFilters != null && ! mNegativeFilters.isEmpty()) {
+            if (hasPositiveFilters) {
+                sb.append(":");
+            }
+            sb.append("-");
+            sb.append(mNegativeFilters);
+        }
+        return sb.toString();
+    }
+
     /**
      * @param abi The ABI to run the test on
      */
@@ -113,7 +153,7 @@
         resultParser.setFakePackagePrefix(mPackageName + ".");
 
         String fullPath = NATIVE_TESTS_DIRECTORY + ANDROID_PATH_SEPARATOR + mExeName;
-        String flags = "";
+        String flags = getGTestFilters();
         CLog.v("Running gtest %s %s on %s", fullPath, flags, mDevice.getSerialNumber());
         // force file to be executable
         CLog.v("%s", mDevice.executeShellCommand(String.format("chmod 755 %s", fullPath)));
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
index 8a5c822..13f3572 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
@@ -17,11 +17,13 @@
 package com.android.cts.tradefed.testtype;
 
 import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.targetprep.ITargetPreparer;
 import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IRemoteTest;
 
 import java.io.File;
 import java.util.Collection;
+import java.util.List;
 
 /**
  * Container for CTS test info.
@@ -98,4 +100,9 @@
      */
     public String getTargetPackageName();
 
+    /**
+     * Return a list of preparers used for setup or teardown of test cases in this package
+     * @return
+     */
+    public List<ITargetPreparer> getPackagePreparers();
 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRemoteTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRemoteTestRunner.java
deleted file mode 100644
index 72dccd4..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRemoteTestRunner.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.tradefed.testtype;
-
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.IShellEnabledDevice;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.ShellCommandUnresponsiveException;
-import com.android.ddmlib.TimeoutException;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner;
-import com.android.ddmlib.testrunner.ITestRunListener;
-import com.android.ddmlib.testrunner.InstrumentationResultParser;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.TimeUnit;
-
-public class PrintTestRemoteTestRunner implements IRemoteAndroidTestRunner {
-
-    private final String mPackageName;
-    private final String mRunnerName;
-    private IShellEnabledDevice mRemoteDevice;
-    // default to no timeout
-    private long mMaxTimeToOutputResponse = 0;
-    private TimeUnit mMaxTimeUnits = TimeUnit.MILLISECONDS;
-    private String mRunName = null;
-
-    /** map of name-value instrumentation argument pairs */
-    private Map<String, String> mArgMap;
-    private InstrumentationResultParser mParser;
-
-    private static final String LOG_TAG = "RemoteAndroidTest";
-    private static final String DEFAULT_RUNNER_NAME = "android.test.InstrumentationTestRunner";
-
-    private static final char CLASS_SEPARATOR = ',';
-    private static final char METHOD_SEPARATOR = '#';
-    private static final char RUNNER_SEPARATOR = '/';
-
-    // defined instrumentation argument names
-    private static final String CLASS_ARG_NAME = "class";
-    private static final String LOG_ARG_NAME = "log";
-    private static final String DEBUG_ARG_NAME = "debug";
-    private static final String COVERAGE_ARG_NAME = "coverage";
-    private static final String PACKAGE_ARG_NAME = "package";
-    private static final String SIZE_ARG_NAME = "size";
-
-    // This command starts a shell Java program (installed by this class)
-    // in the folder owned by the shell user. This app creates a proxy
-    // which does privileged operations such as wiping a package's user
-    // data and then starts the tests passing the proxy. This enables
-    // the tests to clear the print spooler data.
-    private static final String INSTRUMENTATION_COMMAND =
-            "chmod 755 /data/local/tmp/print-instrument && "
-            + "/data/local/tmp/print-instrument instrument -w -r %1$s %2$s";
-
-    /**
-     * Creates a remote Android test runner.
-     *
-     * @param packageName the Android application package that contains the
-     *            tests to run
-     * @param runnerName the instrumentation test runner to execute. If null,
-     *            will use default runner
-     * @param remoteDevice the Android device to execute tests on
-     */
-    public PrintTestRemoteTestRunner(String packageName, String runnerName,
-            IShellEnabledDevice remoteDevice) {
-
-        mPackageName = packageName;
-        mRunnerName = runnerName;
-        mRemoteDevice = remoteDevice;
-        mArgMap = new Hashtable<String, String>();
-    }
-
-    /**
-     * Alternate constructor. Uses default instrumentation runner.
-     *
-     * @param packageName the Android application package that contains the
-     *            tests to run
-     * @param remoteDevice the Android device to execute tests on
-     */
-    public PrintTestRemoteTestRunner(String packageName, IShellEnabledDevice remoteDevice) {
-        this(packageName, null, remoteDevice);
-    }
-
-    @Override
-    public String getPackageName() {
-        return mPackageName;
-    }
-
-    @Override
-    public String getRunnerName() {
-        if (mRunnerName == null) {
-            return DEFAULT_RUNNER_NAME;
-        }
-        return mRunnerName;
-    }
-
-    /**
-     * Returns the complete instrumentation component path.
-     */
-    private String getRunnerPath() {
-        return getPackageName() + RUNNER_SEPARATOR + getRunnerName();
-    }
-
-    @Override
-    public void setClassName(String className) {
-        addInstrumentationArg(CLASS_ARG_NAME, className);
-    }
-
-    @Override
-    public void setClassNames(String[] classNames) {
-        StringBuilder classArgBuilder = new StringBuilder();
-
-        for (int i = 0; i < classNames.length; i++) {
-            if (i != 0) {
-                classArgBuilder.append(CLASS_SEPARATOR);
-            }
-            classArgBuilder.append(classNames[i]);
-        }
-        setClassName(classArgBuilder.toString());
-    }
-
-    @Override
-    public void setMethodName(String className, String testName) {
-        setClassName(className + METHOD_SEPARATOR + testName);
-    }
-
-    @Override
-    public void setTestPackageName(String packageName) {
-        addInstrumentationArg(PACKAGE_ARG_NAME, packageName);
-    }
-
-    @Override
-    public void addInstrumentationArg(String name, String value) {
-        if (name == null || value == null) {
-            throw new IllegalArgumentException("name or value arguments cannot be null");
-        }
-        mArgMap.put(name, value);
-    }
-
-    @Override
-    public void removeInstrumentationArg(String name) {
-        if (name == null) {
-            throw new IllegalArgumentException("name argument cannot be null");
-        }
-        mArgMap.remove(name);
-    }
-
-    @Override
-    public void addBooleanArg(String name, boolean value) {
-        addInstrumentationArg(name, Boolean.toString(value));
-    }
-
-    @Override
-    public void setLogOnly(boolean logOnly) {
-        addBooleanArg(LOG_ARG_NAME, logOnly);
-    }
-
-    @Override
-    public void setDebug(boolean debug) {
-        addBooleanArg(DEBUG_ARG_NAME, debug);
-    }
-
-    @Override
-    public void setCoverage(boolean coverage) {
-        addBooleanArg(COVERAGE_ARG_NAME, coverage);
-    }
-
-    @Override
-    public void setTestCollection(boolean b) {
-        throw new UnsupportedOperationException("Test Collection mode is not supported");
-    }
-
-    @Override
-    public void setTestSize(TestSize size) {
-        addInstrumentationArg(SIZE_ARG_NAME, ""/*size.getRunnerValue()*/);
-    }
-
-    @Override
-    public void setMaxtimeToOutputResponse(int maxTimeToOutputResponse) {
-        setMaxTimeToOutputResponse(maxTimeToOutputResponse, TimeUnit.MILLISECONDS);
-    }
-
-    @Override
-    public void setMaxTimeToOutputResponse(long maxTimeToOutputResponse, TimeUnit maxTimeUnits) {
-        mMaxTimeToOutputResponse = maxTimeToOutputResponse;
-        mMaxTimeUnits = maxTimeUnits;
-    }
-
-    @Override
-    public void setRunName(String runName) {
-        mRunName = runName;
-    }
-
-    @Override
-    public void run(ITestRunListener... listeners) throws TimeoutException,
-            AdbCommandRejectedException, ShellCommandUnresponsiveException, IOException {
-        run(Arrays.asList(listeners));
-    }
-
-    @Override
-    public void run(Collection<ITestRunListener> listeners) throws TimeoutException,
-            AdbCommandRejectedException, ShellCommandUnresponsiveException, IOException {
-        final String runCaseCommandStr = String.format(INSTRUMENTATION_COMMAND,
-              getArgsCommand(), getRunnerPath());
-        Log.i(LOG_TAG,
-                String.format("Running %1$s on %2$s", runCaseCommandStr, mRemoteDevice.getName()));
-        String runName = mRunName == null ? mPackageName : mRunName;
-        mParser = new InstrumentationResultParser(runName, listeners);
-
-        try {
-            mRemoteDevice.executeShellCommand(runCaseCommandStr, mParser, mMaxTimeToOutputResponse,
-                    mMaxTimeUnits);
-        } catch (IOException e) {
-            Log.w(LOG_TAG, String.format("IOException %1$s when running tests %2$s on %3$s",
-                    e.toString(), getPackageName(), mRemoteDevice.getName()));
-            // rely on parser to communicate results to listeners
-            mParser.handleTestRunFailed(e.toString());
-            throw e;
-        } catch (ShellCommandUnresponsiveException e) {
-            Log.w(LOG_TAG, String.format(
-                    "ShellCommandUnresponsiveException %1$s when running tests %2$s on %3$s",
-                    e.toString(), getPackageName(), mRemoteDevice.getName()));
-            mParser.handleTestRunFailed(String
-                    .format("Failed to receive adb shell test output within %1$d ms. "
-                            + "Test may have timed out, or adb connection to device became"
-                            + "unresponsive", mMaxTimeToOutputResponse));
-            throw e;
-        } catch (TimeoutException e) {
-            Log.w(LOG_TAG, String.format("TimeoutException when running tests %1$s on %2$s",
-                    getPackageName(), mRemoteDevice.getName()));
-            mParser.handleTestRunFailed(e.toString());
-            throw e;
-        } catch (AdbCommandRejectedException e) {
-            Log.w(LOG_TAG, String.format(
-                    "AdbCommandRejectedException %1$s when running tests %2$s on %3$s",
-                    e.toString(), getPackageName(), mRemoteDevice.getName()));
-            mParser.handleTestRunFailed(e.toString());
-            throw e;
-        }
-    }
-
-    @Override
-    public void cancel() {
-        if (mParser != null) {
-            mParser.cancel();
-        }
-    }
-
-    /**
-     * Returns the full instrumentation command line syntax for the provided
-     * instrumentation arguments. Returns an empty string if no arguments were
-     * specified.
-     */
-    private String getArgsCommand() {
-        StringBuilder commandBuilder = new StringBuilder();
-        for (Entry<String, String> argPair : mArgMap.entrySet()) {
-            final String argCmd = String.format(" -e %1$s %2$s", argPair.getKey(),
-                    argPair.getValue());
-            commandBuilder.append(argCmd);
-        }
-        return commandBuilder.toString();
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
deleted file mode 100644
index 44d2d3a..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.tradefed.testtype;
-
-import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.cts.tradefed.targetprep.SettingsToggler;
-import com.android.cts.util.AbiUtils;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner.TestSize;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.IDeviceTest;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.util.StringEscapeUtils;
-
-import java.io.FileNotFoundException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Running the print tests requires modification of secure settings. Secure
- * settings cannot be changed from device CTS tests since system signature
- * permission is required. Such settings can be modified by the shell user,
- * so a host side test driver is used for enabling these services, running
- * the tests, and disabling the services.
- */
-public class PrintTestRunner implements IBuildReceiver, IRemoteTest, IDeviceTest  {
-
-    private static final String PRINT_TEST_AND_SERVICES_APP_NAME =
-            "CtsPrintTestCases.apk";
-
-    private static final String PRINT_TESTS_PACKAGE_NAME =
-            "com.android.cts.print";
-
-    private static final String FIRST_PRINT_SERVICE_NAME =
-            "android.print.cts.services.FirstPrintService";
-
-    private static final String SECOND_PRINT_SERVICE_NAME =
-            "android.print.cts.services.SecondPrintService";
-
-    private static final String SHELL_USER_FOLDER = "data/local/tmp";
-
-    private static final String PRINT_INSTRUMENT_JAR = "CtsPrintInstrument.jar";
-
-    private static final String PRINT_INSTRUMENT_SCRIPT = "print-instrument";
-
-    private ITestDevice mDevice;
-
-    private CtsBuildHelper mCtsBuild;
-
-    private IAbi mAbi;
-    private String mPackageName;
-    private String mRunnerName = "android.test.InstrumentationTestRunner";
-    private String mTestClassName;
-    private String mTestMethodName;
-    private String mTestPackageName;
-    private int mTestTimeout = 10 * 60 * 1000;  // 10 minutes
-    private String mTestSize;
-    private String mRunName = null;
-    private Map<String, String> mInstrArgMap = new HashMap<String, String>();
-
-    /**
-     * @param abi The ABI to run the test on
-     */
-    public void setAbi(IAbi abi) {
-        mAbi = abi;
-    }
-
-    @Override
-    public void setBuild(IBuildInfo buildInfo) {
-        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
-    }
-
-    @Override
-    public void setDevice(ITestDevice device) {
-        mDevice = device;
-    }
-
-    @Override
-    public ITestDevice getDevice() {
-        return mDevice;
-    }
-
-    public void setPackageName(String packageName) {
-        mPackageName = packageName;
-    }
-
-    public void setRunnerName(String runnerName) {
-        mRunnerName = runnerName;
-    }
-
-    public void setClassName(String testClassName) {
-        mTestClassName = testClassName;
-    }
-
-    public void setMethodName(String testMethodName) {
-        mTestMethodName = StringEscapeUtils.escapeShell(testMethodName);
-    }
-
-    public void setTestPackageName(String testPackageName) {
-        mTestPackageName = testPackageName;
-    }
-
-    public void setTestSize(String size) {
-        mTestSize = size;
-    }
-
-    public void setRunName(String runName) {
-        mRunName = runName;
-    }
-
-    @Override
-    public void run(final ITestInvocationListener listener) throws DeviceNotAvailableException {
-        installShellProgramAndScriptFiles();
-        installTestsAndServicesApk();
-        enablePrintServices();
-        doRunTests(listener);
-        disablePrintServices();
-        uninstallTestsAndServicesApk();
-        uninstallShellProgramAndScriptFiles();
-    }
-
-    private void doRunTests(ITestInvocationListener listener)
-            throws DeviceNotAvailableException {
-        if (mPackageName == null) {
-            throw new IllegalArgumentException("package name has not been set");
-        }
-        if (mDevice == null) {
-            throw new IllegalArgumentException("Device has not been set");
-        }
-
-        IRemoteAndroidTestRunner runner =  new PrintTestRemoteTestRunner(mPackageName,
-                mRunnerName, mDevice.getIDevice());
-
-        if (mTestClassName != null) {
-            if (mTestMethodName != null) {
-                runner.setMethodName(mTestClassName, mTestMethodName);
-            } else {
-                runner.setClassName(mTestClassName);
-            }
-        } else if (mTestPackageName != null) {
-            runner.setTestPackageName(mTestPackageName);
-        }
-        if (mTestSize != null) {
-            runner.setTestSize(TestSize.getTestSize(mTestSize));
-        }
-        runner.setMaxTimeToOutputResponse(mTestTimeout, TimeUnit.MILLISECONDS);
-        if (mRunName != null) {
-            runner.setRunName(mRunName);
-        }
-        for (Map.Entry<String, String> argEntry : mInstrArgMap.entrySet()) {
-            runner.addInstrumentationArg(argEntry.getKey(), argEntry.getValue());
-        }
-
-        mDevice.runInstrumentationTests(runner, listener);
-    }
-
-    private void installShellProgramAndScriptFiles() throws DeviceNotAvailableException {
-        installFile(PRINT_INSTRUMENT_JAR);
-        installFile(PRINT_INSTRUMENT_SCRIPT);
-    }
-
-    private void installFile(String fileName) throws DeviceNotAvailableException {
-        try {
-            final boolean success = getDevice().pushFile(mCtsBuild.getTestApp(
-                    fileName), SHELL_USER_FOLDER + "/" + fileName);
-            if (!success) {
-                throw new IllegalArgumentException("Failed to install "
-                        + fileName + " on " + getDevice().getSerialNumber());
-           }
-        } catch (FileNotFoundException fnfe) {
-            throw new IllegalArgumentException("Cannot find file: " + fileName);
-        }
-    }
-
-    private void uninstallShellProgramAndScriptFiles() throws DeviceNotAvailableException {
-        getDevice().executeShellCommand("rm " + SHELL_USER_FOLDER + "/"
-                + PRINT_INSTRUMENT_JAR);
-        getDevice().executeShellCommand("rm " + SHELL_USER_FOLDER + "/"
-                + PRINT_INSTRUMENT_SCRIPT);
-    }
-
-    private void installTestsAndServicesApk() throws DeviceNotAvailableException {
-        try {
-            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-            String installCode = getDevice().installPackage(mCtsBuild.getTestApp(
-                    PRINT_TEST_AND_SERVICES_APP_NAME), true, options);
-            if (installCode != null) {
-                throw new IllegalArgumentException("Failed to install "
-                        + PRINT_TEST_AND_SERVICES_APP_NAME + " on " + getDevice().getSerialNumber()
-                        + ". Reason: " + installCode);
-           }
-        } catch (FileNotFoundException fnfe) {
-            throw new IllegalArgumentException("Cannot find file: "
-                    + PRINT_TEST_AND_SERVICES_APP_NAME);
-        }
-    }
-
-    private void uninstallTestsAndServicesApk() throws DeviceNotAvailableException {
-        getDevice().uninstallPackage(PRINT_TESTS_PACKAGE_NAME);
-    }
-
-    private void enablePrintServices() throws DeviceNotAvailableException {
-        String enabledServicesValue = PRINT_TESTS_PACKAGE_NAME + "/" + FIRST_PRINT_SERVICE_NAME
-                + ":" + PRINT_TESTS_PACKAGE_NAME + "/" + SECOND_PRINT_SERVICE_NAME;
-        SettingsToggler.setSecureString(getDevice(), "enabled_print_services",
-                enabledServicesValue);
-    }
-
-    private void disablePrintServices() throws DeviceNotAvailableException {
-        SettingsToggler.setSecureString(getDevice(), "enabled_print_services", "");
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
index 9ef6257..f276f1d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
@@ -20,6 +20,7 @@
 import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.targetprep.ITargetPreparer;
 import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.testtype.InstrumentationTest;
@@ -35,7 +36,11 @@
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Container for CTS test info.
@@ -49,14 +54,6 @@
     public static final String WRAPPED_NATIVE_TEST = "wrappednative";
     public static final String VM_HOST_TEST = "vmHostTest";
     public static final String DEQP_TEST = "deqpTest";
-    public static final String ACCESSIBILITY_TEST =
-            "com.android.cts.tradefed.testtype.AccessibilityTestRunner";
-    public static final String ACCESSIBILITY_SERVICE_TEST =
-            "com.android.cts.tradefed.testtype.AccessibilityServiceTestRunner";
-    public static final String PRINT_TEST =
-            "com.android.cts.tradefed.testtype.PrintTestRunner";
-    public static final String DISPLAY_TEST =
-            "com.android.cts.tradefed.testtype.DisplayTestRunner";
     public static final String UIAUTOMATOR_TEST = "uiAutomator";
     public static final String JUNIT_DEVICE_TEST = "jUnitDeviceTest";
 
@@ -70,12 +67,16 @@
     private String mTestPackageName = null;
     private String mDigest = null;
     private IAbi mAbi = null;
+    private List<ITargetPreparer> mPreparers = null;
 
     // use a LinkedHashSet for predictable iteration insertion-order, and fast
     // lookups
     private Collection<TestIdentifier> mTests = new LinkedHashSet<TestIdentifier>();
     // also maintain an index of known test classes
     private Collection<String> mTestClasses = new LinkedHashSet<String>();
+    // store instance arguments in order too for consistency
+    private Map<TestIdentifier, List<Map<String, String>>> mTestInstanceArguments =
+            new LinkedHashMap<>();
 
     // dynamic options, not parsed from package xml
     private String mClassName;
@@ -210,6 +211,22 @@
     }
 
     /**
+     * Setter for injecting a list of {@link ITargetPreparer}s as configured in module test config.
+     * @param preparers
+     */
+    void setPackagePreparers(List<ITargetPreparer> preparers) {
+        mPreparers = preparers;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<ITargetPreparer> getPackagePreparers() {
+        return mPreparers;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -240,7 +257,8 @@
             mDigest = generateDigest(testCaseDir, mJarPath);
             return vmHostTest;
         } else if (DEQP_TEST.equals(mTestType)) {
-            DeqpTestRunner deqpTest = new DeqpTestRunner(mAppPackageName, mName, mTests);
+            DeqpTestRunner deqpTest =
+                    new DeqpTestRunner(mAppPackageName, mName, mTests, mTestInstanceArguments);
             deqpTest.setAbi(mAbi);
             return deqpTest;
         } else if (NATIVE_TEST.equals(mTestType)) {
@@ -252,19 +270,6 @@
             WrappedGTest wrappedGeeTest = new WrappedGTest(mAppNameSpace, mAppPackageName, mName, mRunner);
             wrappedGeeTest.setAbi(mAbi);
             return wrappedGeeTest;
-        } else if (ACCESSIBILITY_TEST.equals(mTestType)) {
-            AccessibilityTestRunner test = new AccessibilityTestRunner();
-            return setInstrumentationTest(test, testCaseDir);
-        } else if (PRINT_TEST.equals(mTestType)) {
-            PrintTestRunner test = new PrintTestRunner();
-            return setPrintTest(test, testCaseDir);
-        } else if (ACCESSIBILITY_SERVICE_TEST.equals(mTestType)) {
-            @SuppressWarnings("deprecation")
-            AccessibilityServiceTestRunner test = new AccessibilityServiceTestRunner();
-            return setInstrumentationTest(test, testCaseDir);
-        } else if (DISPLAY_TEST.equals(mTestType)) {
-            DisplayTestRunner test = new DisplayTestRunner();
-            return setInstrumentationTest(test, testCaseDir);
         } else if (UIAUTOMATOR_TEST.equals(mTestType)) {
             UiAutomatorJarTest uiautomatorTest = new UiAutomatorJarTest();
             return setUiAutomatorTest(uiautomatorTest);
@@ -291,19 +296,6 @@
         }
     }
 
-    private PrintTestRunner setPrintTest(PrintTestRunner printTest,
-            File testCaseDir) {
-        printTest.setRunName(mAppPackageName);
-        printTest.setPackageName(mAppNameSpace);
-        printTest.setRunnerName(mRunner);
-        printTest.setTestPackageName(mTestPackageName);
-        printTest.setClassName(mClassName);
-        printTest.setMethodName(mMethodName);
-        printTest.setAbi(mAbi);
-        mDigest = generateDigest(testCaseDir, String.format("%s.apk", mName));
-        return printTest;
-    }
-
     /**
      * Populates given {@link CtsInstrumentationApkTest} with data from the package xml.
      *
@@ -379,6 +371,7 @@
     void addTest(TestIdentifier testDef, int timeout) {
         mTests.add(testDef);
         mTestClasses.add(testDef.getClassName());
+        mTestInstanceArguments.put(testDef, new LinkedList<Map<String, String>>());
         // 0 means no timeout, so keep 0 if already is.
         if ((timeout > mTimeoutInMins) && (mTimeoutInMins != 0)) {
             mTimeoutInMins = timeout;
@@ -386,6 +379,16 @@
     }
 
     /**
+     * Add a test instance to an existing {@link TestIdentifier}.
+     */
+    void addTestInstance(TestIdentifier testDef, Map<String, String> instanceArguments) {
+        if (!mTestInstanceArguments.containsKey(testDef)) {
+            throw new IllegalStateException("test id does not name an existing test");
+        }
+        mTestInstanceArguments.get(testDef).add(instanceArguments);
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -394,6 +397,15 @@
     }
 
     /**
+     * Get the instance argument map for tests.
+     * <p/>
+     * Exposed for unit testing.
+     */
+    public Map<TestIdentifier, List<Map<String, String>>> getTestInstanceArguments() {
+        return mTestInstanceArguments;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -427,8 +439,8 @@
         } catch (IOException e) {
             CLog.e(e);
         } finally {
-            StreamUtil.closeStream(d);
-            StreamUtil.closeStream(fileStream);
+            StreamUtil.close(d);
+            StreamUtil.close(fileStream);
         }
         return "failed to generate digest";
     }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
index aea6613..7e16170 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
@@ -17,6 +17,9 @@
 
 import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.Log;
+import com.android.tradefed.config.ConfigurationException;
+import com.android.tradefed.config.ConfigurationFactory;
+import com.android.tradefed.config.IConfiguration;
 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
 
 import java.io.BufferedInputStream;
@@ -27,8 +30,8 @@
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -63,22 +66,68 @@
     private void parse(File dir) {
         File[] xmlFiles = dir.listFiles(new XmlFilter());
         for (File xmlFile : xmlFiles) {
-            parseTestFromXml(xmlFile);
+            parseModuleTestConfigs(xmlFile);
         }
     }
 
-    private void parseTestFromXml(File xmlFile)  {
+    /**
+     * Infer package preparer config from package XML definition file and return if exists
+     * @param pkgXml {@link File} instance referencing the package XML definition
+     * @return the matching package preparer if exists, <code>null</code> otherwise
+     */
+    private File getPreparerDefForPackage(File pkgXml) {
+        String fullPath = pkgXml.getAbsolutePath();
+        int lastDot = fullPath.lastIndexOf('.');
+        if (lastDot == -1) {
+            // huh?
+            return null;
+        }
+        File preparer = new File(fullPath.substring(0, lastDot) + ".config");
+        if (preparer.exists()) {
+            return preparer;
+        }
+        return null;
+    }
+
+    /**
+     * Processes test module definition XML file, and stores parsed data structure in class member
+     * variable. Parsed config objects will be associated with each applicable ABI type so multiple
+     * {@link TestPackageDef}s will be generated accordingly. In addition, based on
+     * &lt;module name&gt;.config file naming convention, this method also looks for the optional
+     * module test config, and attaches defined configuration objects to the {@link TestPackageDef}
+     * representing the module accordingly.
+     * @param xmlFile the module definition XML
+     */
+    private void parseModuleTestConfigs(File xmlFile)  {
         TestPackageXmlParser parser = new TestPackageXmlParser(mIncludeKnownFailures);
         try {
             parser.parse(createStreamFromFile(xmlFile));
+            // based on test module XML file path, and the <module name>.config naming convention,
+            // infers the module test config file, and parses it
+            File preparer = getPreparerDefForPackage(xmlFile);
+            IConfiguration config = null;
+            if (preparer != null) {
+                try {
+                    // invokes parser to process the test module config file
+                    config = ConfigurationFactory.getInstance().createConfigurationFromArgs(
+                            new String[]{preparer.getAbsolutePath()});
+                } catch (ConfigurationException e) {
+                    throw new RuntimeException(
+                            String.format("error parsing config file: %s", xmlFile.getName()), e);
+                }
+            }
             Set<TestPackageDef> defs = parser.getTestPackageDefs();
             if (defs.isEmpty()) {
                 Log.w(LOG_TAG, String.format("Could not find test package info in xml file %s",
                         xmlFile.getAbsolutePath()));
             }
+            // loops over multiple package defs defined for each ABI type
             for (TestPackageDef def : defs) {
                 String name = def.getAppPackageName();
                 String abi = def.getAbi().getName();
+                if (config != null) {
+                    def.setPackagePreparers(config.getTargetPreparers());
+                }
                 if (!mTestMap.containsKey(abi)) {
                     mTestMap.put(abi, new HashMap<String, TestPackageDef>());
                 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
index baceb8b..649dd9e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
@@ -59,6 +59,7 @@
      *     <TestSuite ...>
      *        <TestCase>
      *           <Test>
+     *             <TestInstance> (optional)
      */
     private class TestPackageHandler extends DefaultHandler {
 
@@ -66,9 +67,11 @@
         private static final String TEST_SUITE_TAG = "TestSuite";
         private static final String TEST_CASE_TAG = "TestCase";
         private static final String TEST_TAG = "Test";
+        private static final String TEST_INSTANCE_TAG = "TestInstance";
 
         // holds current class name segments
         private Stack<String> mClassNameStack = new Stack<String>();
+        private TestIdentifier mTestId;
 
         @Override
         public void startElement(String uri, String localName, String name, Attributes attributes) {
@@ -139,6 +142,7 @@
                             classNameBuilder.append(".");
                         }
                     }
+                    mTestId = new TestIdentifier(classNameBuilder.toString(), methodName);
                     int timeout = -1;
                     String timeoutStr = attributes.getValue("timeout");
                     if (timeoutStr != null) {
@@ -158,14 +162,24 @@
                             }
                         }
                         for (String abi : abis) {
-                            TestIdentifier testId = new TestIdentifier(
-                                    classNameBuilder.toString(), methodName);
-                            mPackageDefs.get(abi).addTest(testId, timeout);
+                            mPackageDefs.get(abi).addTest(mTestId, timeout);
                         }
                     }
                 }
+            } else if (TEST_INSTANCE_TAG.equals(localName)) {
+                if (mTestId != null) {
+                    final Map<String, String> instanceArguments = genAttributeMap(attributes);
+                    for (TestPackageDef packageDef : mPackageDefs.values()) {
+                        if (packageDef.getTests().contains(mTestId)) {
+                            packageDef.addTestInstance(mTestId, instanceArguments);
+                        }
+                    }
+                } else {
+                    Log.e(LOG_TAG, String.format(
+                            "Invalid XML: encountered a '%s' tag not enclosed within a '%s' tag",
+                            TEST_INSTANCE_TAG, TEST_TAG));
+                }
             }
-
         }
 
         private String getTestType(Attributes attributes) {
@@ -182,6 +196,8 @@
         public void endElement (String uri, String localName, String qName) {
             if (TEST_SUITE_TAG.equals(localName) || TEST_CASE_TAG.equals(localName)) {
                 mClassNameStack.pop();
+            } else if (TEST_TAG.equals(localName)) {
+                mTestId = null;
             }
         }
 
@@ -192,6 +208,19 @@
             return stringValue != null &&
                     Boolean.parseBoolean(stringValue);
         }
+
+        private Map<String, String> genAttributeMap(Attributes attributes) {
+            final Map<String, String> attribMap = new HashMap<String, String>();
+            for (int i = 0; i < attributes.getLength(); ++i) {
+                final String localName = attributes.getLocalName(i);
+                final String namespace = attributes.getURI(i);
+                final String fullyQualifiedName =
+                        (namespace.isEmpty()) ? (localName) : (namespace + ":" + localName);
+
+                attribMap.put(fullyQualifiedName, attributes.getValue(i));
+            }
+            return attribMap;
+        }
     }
 
     @Override
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
index ad1430e..29c1324 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
@@ -25,6 +25,7 @@
 import com.android.cts.tradefed.testtype.Abi;
 import com.android.cts.tradefed.testtype.CtsTestTest;
 import com.android.cts.tradefed.testtype.DeqpTestRunnerTest;
+import com.android.cts.tradefed.testtype.GeeTestTest;
 import com.android.cts.tradefed.testtype.JarHostTestTest;
 import com.android.cts.tradefed.testtype.TestFilterTest;
 import com.android.cts.tradefed.testtype.TestPackageDefTest;
@@ -60,13 +61,14 @@
 
         // testtype package
         addTestSuite(CtsTestTest.class);
+        addTestSuite(DeqpTestRunnerTest.class);
+        addTestSuite(GeeTestTest.class);
         addTestSuite(JarHostTestTest.class);
         addTestSuite(TestFilterTest.class);
         addTestSuite(TestPackageDefTest.class);
         addTestSuite(TestPackageXmlParserTest.class);
         addTestSuite(TestPlanTest.class);
         addTestSuite(WrappedGTestResultParserTest.class);
-        addTestSuite(DeqpTestRunnerTest.class);
     }
 
     public static Test suite() {
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
index 30e2ba8..5dc2e5a 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
@@ -34,6 +34,7 @@
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
+import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -377,6 +378,34 @@
         }
     }
 
+    /**
+     * Test {@link CtsTestTest#join} works.
+     * @throws DeviceNotAvailableException
+     */
+    public void testJoin() throws DeviceNotAvailableException {
+        String expected = "a@b@c";
+        String actual = mCtsTest.join(new ArrayList<String>(Arrays.asList("a", "b", "c")), "@");
+        assertEquals(expected, actual);
+    }
+
+    /**
+     * Test {@link CtsTestTest#join} for a single element list.
+     * @throws DeviceNotAvailableException
+     */
+    public void testSingleJoin() throws DeviceNotAvailableException {
+        String actual = mCtsTest.join(new ArrayList<String>(Arrays.asList("foo")), "@");
+        assertEquals("foo", actual);
+    }
+
+    /**
+     * Test {@link CtsTestTest#join} for an empty list.
+     * @throws DeviceNotAvailableException
+     */
+    public void testEmptyJoin() throws DeviceNotAvailableException {
+        String actual = mCtsTest.join(new ArrayList<String>(), "@");
+        assertEquals("", actual);
+    }
+
     private void replayMocks(Object... mocks) {
         EasyMock.replay(mMockRepo, mMockPlan, mMockDevice, mMockPackageDef, mMockListener, mMockTest);
         EasyMock.replay(mocks);
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
index c41793f..7ec09c9 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
@@ -18,22 +18,32 @@
 import com.android.cts.tradefed.build.StubCtsBuildHelper;
 import com.android.cts.tradefed.UnitTests;
 import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.IDevice;
 import com.android.ddmlib.IShellOutputReceiver;
+import com.android.ddmlib.ShellCommandUnresponsiveException;
 import com.android.ddmlib.testrunner.ITestRunListener;
 import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.util.IRunUtil;
+import com.android.tradefed.util.RunInterruptedException;
 
 import junit.framework.TestCase;
 
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
+import org.easymock.IMocksControl;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Unit tests for {@link DeqpTestRunner}.
@@ -45,8 +55,60 @@
     private static final String LOG_FILE_NAME = "/sdcard/TestLog.qpa";
     private static final String INSTRUMENTATION_NAME =
             "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
+    private static final String QUERY_INSTRUMENTATION_NAME =
+            "com.drawelements.deqp/com.drawelements.deqp.platformutil.DeqpPlatformCapabilityQueryInstrumentation";
     private static final String DEQP_ONDEVICE_APK = "com.drawelements.deqp.apk";
     private static final String DEQP_ONDEVICE_PKG = "com.drawelements.deqp";
+    private static final String ONLY_LANDSCAPE_FEATURES =
+            "feature:"+DeqpTestRunner.FEATURE_LANDSCAPE;
+    private static final String ALL_FEATURES =
+            ONLY_LANDSCAPE_FEATURES + "\nfeature:"+DeqpTestRunner.FEATURE_PORTRAIT;
+    private static List<Map<String,String>> DEFAULT_INSTANCE_ARGS;
+
+    static {
+        DEFAULT_INSTANCE_ARGS = new ArrayList<>(1);
+        DEFAULT_INSTANCE_ARGS.add(new HashMap<String,String>());
+        DEFAULT_INSTANCE_ARGS.iterator().next().put("glconfig", "rgba8888d24s8");
+        DEFAULT_INSTANCE_ARGS.iterator().next().put("rotation", "unspecified");
+        DEFAULT_INSTANCE_ARGS.iterator().next().put("surfacetype", "window");
+    }
+
+    private static class StubRecovery implements DeqpTestRunner.IRecovery {
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void setSleepProvider(DeqpTestRunner.ISleepProvider sleepProvider) {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void setDevice(ITestDevice device) {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void onExecutionProgressed() {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void recoverConnectionRefused() throws DeviceNotAvailableException {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void recoverComLinkKilled() throws DeviceNotAvailableException {
+        }
+    };
 
     /**
      * {@inheritDoc}
@@ -105,14 +167,17 @@
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
         Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
-
         tests.add(testId);
 
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, DEFAULT_INSTANCE_ARGS);
+
         DeqpTestRunner deqpTest = new DeqpTestRunner(NAME,
                 "dEQP-GLES" + Integer.toString(requiredMajorVersion)
                 + (requiredMinorVersion > 0 ? Integer.toString(requiredMinorVersion) : ""),
-                tests);
+                tests, instance);
         deqpTest.setAbi(UnitTests.ABI);
 
         int version = (majorVersion << 16) | minorVersion;
@@ -129,37 +194,19 @@
                     EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName()))))
                     .andReturn(null).once();
 
-            EasyMock.expect(mockDevice.executeShellCommand(
-                    EasyMock.eq("rm " + CASE_LIST_FILE_NAME))).andReturn("").once();
+            expectRenderConfigQuery(mockDevice, requiredMajorVersion,
+                    requiredMinorVersion);
 
-            EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
-                    .andReturn("").once();
+            String commandLine = String.format(
+                    "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=unspecified "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-log-images=disable "
+                    + "--deqp-watchdog=enable",
+                    CASE_LIST_FILE_NAME);
 
-            EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME))
-                    .andReturn(true).once();
-
-            String command = String.format(
-                    "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
-                        + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" "
-                        + "-e deqpLogData \"%s\" %s",
-                    AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME,
-                    CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME);
-
-            mockDevice.executeShellCommand(EasyMock.eq(command),
-                    EasyMock.<IShellOutputReceiver>notNull());
-
-            EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-                @Override
-                public Object answer() {
-                    IShellOutputReceiver receiver
-                            = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
-
-                    receiver.addOutput(output.getBytes(), 0, output.length());
-                    receiver.flush();
-
-                    return null;
-                }
-            });
+            runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine,
+                    output);
 
             EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
                     .andReturn("").once();
@@ -177,7 +224,7 @@
         mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
         EasyMock.expectLastCall().once();
 
-        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockDevice, mockIDevice);
         EasyMock.replay(mockListener);
 
         deqpTest.setDevice(mockDevice);
@@ -185,7 +232,49 @@
         deqpTest.run(mockListener);
 
         EasyMock.verify(mockListener);
-        EasyMock.verify(mockDevice);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    private void expectRenderConfigQuery(ITestDevice mockDevice, int majorVersion,
+            int minorVersion) throws Exception {
+        expectRenderConfigQuery(mockDevice,
+                String.format("--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=%d "
+                + "--deqp-gl-minor-version=%d", majorVersion, minorVersion));
+    }
+
+    private void expectRenderConfigQuery(ITestDevice mockDevice, String commandLine)
+            throws Exception {
+        expectRenderConfigQueryAndReturn(mockDevice, commandLine, "Yes");
+    }
+
+    private void expectRenderConfigQueryAndReturn(ITestDevice mockDevice, String commandLine,
+            String output) throws Exception {
+        final String queryOutput = "INSTRUMENTATION_RESULT: Supported=" + output + "\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String command = String.format(
+                "am instrument %s -w -e deqpQueryType renderConfigSupported -e deqpCmdLine "
+                    + "\"%s\" %s",
+                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), commandLine,
+                QUERY_INSTRUMENTATION_NAME);
+
+        mockDevice.executeShellCommand(EasyMock.eq(command),
+                EasyMock.<IShellOutputReceiver>notNull());
+
+        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+            @Override
+            public Object answer() {
+                IShellOutputReceiver receiver
+                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
+
+                receiver.addOutput(queryOutput.getBytes(), 0, queryOutput.length());
+                receiver.flush();
+
+                return null;
+            }
+        });
     }
 
     /**
@@ -227,11 +316,15 @@
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
 
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
         tests.add(testId);
 
-        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests);
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, DEFAULT_INSTANCE_ARGS);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
         deqpTest.setAbi(UnitTests.ABI);
 
         int version = 3 << 16;
@@ -245,37 +338,17 @@
                 EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName()))))
                 .andReturn(null).once();
 
-        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
-                .andReturn("").once();
+        expectRenderConfigQuery(mockDevice, 3, 0);
 
-        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
-                .andReturn("").once();
+        String commandLine = String.format(
+                "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable",
+                CASE_LIST_FILE_NAME);
 
-        EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME)).andReturn(true)
-                .once();
-
-        String command = String.format(
-                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
-                    + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" "
-                    + "-e deqpLogData \"%s\" %s",
-                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME,
-                CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME);
-
-        mockDevice.executeShellCommand(EasyMock.eq(command),
-                EasyMock.<IShellOutputReceiver>notNull());
-
-        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-            @Override
-            public Object answer() {
-                IShellOutputReceiver receiver
-                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
-
-                receiver.addOutput(output.getBytes(), 0, output.length());
-                receiver.flush();
-
-                return null;
-            }
-        });
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine, output);
 
         mockListener.testRunStarted(ID, 1);
         EasyMock.expectLastCall().once();
@@ -285,7 +358,8 @@
 
         if (!pass) {
             mockListener.testFailed(testId,
-                    resultCode + ": Detail" + resultCode);
+                    "=== with config {glformat=rgba8888d24s8,rotation=unspecified,surfacetype=window} ===\n"
+                    + resultCode + ": Detail" + resultCode);
 
             EasyMock.expectLastCall().once();
         }
@@ -299,7 +373,7 @@
         EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("")
                 .once();
 
-        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockDevice, mockIDevice);
         EasyMock.replay(mockListener);
 
         deqpTest.setDevice(mockDevice);
@@ -307,7 +381,7 @@
         deqpTest.run(mockListener);
 
         EasyMock.verify(mockListener);
-        EasyMock.verify(mockDevice);
+        EasyMock.verify(mockDevice, mockIDevice);
     }
 
     /**
@@ -411,13 +485,17 @@
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+
         Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
 
         for (TestIdentifier id : testIds) {
             tests.add(id);
+            instances.put(id, DEFAULT_INSTANCE_ARGS);
         }
 
-        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests);
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
         deqpTest.setAbi(UnitTests.ABI);
 
         int version = 3 << 16;
@@ -430,37 +508,17 @@
                 EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName()))))
                 .andReturn(null).once();
 
-        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
-                .andReturn("").once();
+        expectRenderConfigQuery(mockDevice, 3, 0);
 
-        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
-                .andReturn("").once();
+        String commandLine = String.format(
+                "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable",
+                CASE_LIST_FILE_NAME);
 
-        EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME))
-                .andReturn(true).once();
-
-        String command = String.format(
-                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
-                    + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" "
-                    + "-e deqpLogData \"%s\" %s",
-                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME,
-                CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME);
-
-        mockDevice.executeShellCommand(EasyMock.eq(command),
-                EasyMock.<IShellOutputReceiver>notNull());
-
-        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-            @Override
-            public Object answer() {
-                IShellOutputReceiver receiver
-                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
-
-                receiver.addOutput(output.getBytes(), 0, output.length());
-                receiver.flush();
-
-                return null;
-            }
-        });
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine, output);
 
         mockListener.testRunStarted(ID, testPaths.length);
         EasyMock.expectLastCall().once();
@@ -481,7 +539,7 @@
         EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("")
                 .once();
 
-        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockDevice, mockIDevice);
         EasyMock.replay(mockListener);
 
         deqpTest.setDevice(mockDevice);
@@ -489,10 +547,371 @@
         deqpTest.run(mockListener);
 
         EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
+     * Test running a unexecutable test.
+     */
+    public void testRun_unexecutableTests() throws Exception {
+        final String instrumentationAnswerNoExecs =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        final TestIdentifier[] testIds = {
+                new TestIdentifier("dEQP-GLES3.missing", "no"),
+                new TestIdentifier("dEQP-GLES3.missing", "nope"),
+                new TestIdentifier("dEQP-GLES3.missing", "donotwant"),
+        };
+
+        final String[] testPaths = {
+                "dEQP-GLES3.missing.no",
+                "dEQP-GLES3.missing.nope",
+                "dEQP-GLES3.missing.donotwant",
+        };
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
+
+        for (TestIdentifier id : testIds) {
+            tests.add(id);
+            instances.put(id, DEFAULT_INSTANCE_ARGS);
+        }
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
+        deqpTest.setAbi(UnitTests.ABI);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("")
+                .once();
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName()))))
+                .andReturn(null).once();
+
+        expectRenderConfigQuery(mockDevice, 3, 0);
+
+        String commandLine = String.format(
+                "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable",
+                CASE_LIST_FILE_NAME);
+
+        // first try
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{no,nope,donotwant}}}", commandLine, instrumentationAnswerNoExecs);
+
+        // splitting begins
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{no}}}", commandLine, instrumentationAnswerNoExecs);
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{nope,donotwant}}}", commandLine, instrumentationAnswerNoExecs);
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{nope}}}", commandLine, instrumentationAnswerNoExecs);
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{donotwant}}}", commandLine, instrumentationAnswerNoExecs);
+
+        mockListener.testRunStarted(ID, testPaths.length);
+        EasyMock.expectLastCall().once();
+
+        for (int i = 0; i < testPaths.length; i++) {
+            mockListener.testStarted(EasyMock.eq(testIds[i]));
+            EasyMock.expectLastCall().once();
+
+            mockListener.testFailed(EasyMock.eq(testIds[i]),
+                    EasyMock.eq("=== with config {glformat=rgba8888d24s8,rotation=unspecified,surfacetype=window} ===\n"
+                    + "Abort: Test cannot be executed"));
+            EasyMock.expectLastCall().once();
+
+            mockListener.testEnded(EasyMock.eq(testIds[i]),
+                    EasyMock.<Map<String, String>>notNull());
+            EasyMock.expectLastCall().once();
+        }
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("")
+                .once();
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+        deqpTest.run(mockListener);
+
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
+     * Test that test are left unexecuted if pm list query fails
+     */
+    public void testRun_queryPmListFailure()
+            throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>(1));
+        instance.get(testId).add(new HashMap<String,String>());
+        instance.get(testId).iterator().next().put("glconfig", "rgba8888d24s8");
+        instance.get(testId).iterator().next().put("rotation", "90");
+        instance.get(testId).iterator().next().put("surfacetype", "window");
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.executeShellCommand("pm list features"))
+                .andReturn("not a valid format");
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockListener);
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
         EasyMock.verify(mockDevice);
     }
 
     /**
+     * Test that test are left unexecuted if renderablity query fails
+     */
+    public void testRun_queryRenderabilityFailure()
+            throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>(1));
+        instance.get(testId).add(new HashMap<String,String>());
+        instance.get(testId).iterator().next().put("glconfig", "rgba8888d24s8");
+        instance.get(testId).iterator().next().put("rotation", "unspecified");
+        instance.get(testId).iterator().next().put("surfacetype", "window");
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Maybe?");
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockListener);
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice);
+    }
+
+    /**
+     * Test that orientation is supplied to runner correctly
+     */
+    private void testOrientation(final String rotation, final String featureString)
+            throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+        final String testPath = "dEQP-GLES3.orientation.test";
+        final String testTrie = "{dEQP-GLES3{orientation{test}}}";
+        final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>(1));
+        instance.get(testId).add(new HashMap<String,String>());
+        instance.get(testId).iterator().next().put("glconfig", "rgba8888d24s8");
+        instance.get(testId).iterator().next().put("rotation", rotation);
+        instance.get(testId).iterator().next().put("surfacetype", "window");
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        if (!rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_UNSPECIFIED)) {
+            EasyMock.expect(mockDevice.executeShellCommand("pm list features"))
+                    .andReturn(featureString);
+        }
+
+        final boolean isPortraitOrientation =
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_PORTRAIT) ||
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_REVERSE_PORTRAIT);
+        final boolean isLandscapeOrientation =
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_LANDSCAPE) ||
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_REVERSE_LANDSCAPE);
+        final boolean executable =
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_UNSPECIFIED) ||
+                (isPortraitOrientation &&
+                featureString.contains(DeqpTestRunner.FEATURE_PORTRAIT)) ||
+                (isLandscapeOrientation &&
+                featureString.contains(DeqpTestRunner.FEATURE_LANDSCAPE));
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        if (executable) {
+            expectRenderConfigQuery(mockDevice, String.format(
+                    "--deqp-gl-config-name=rgba8888d24s8 --deqp-screen-rotation=%s "
+                    + "--deqp-surface-type=window --deqp-gl-major-version=3 "
+                    + "--deqp-gl-minor-version=0", rotation));
+
+            String commandLine = String.format(
+                    "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=%s "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-log-images=disable "
+                    + "--deqp-watchdog=enable",
+                    CASE_LIST_FILE_NAME, rotation);
+
+            runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine,
+                    output);
+        }
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testStarted(EasyMock.eq(testId));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
      * Test OpeGL ES3 tests on device with OpenGL ES2.
      */
     public void testRun_require30DeviceVersion20() throws Exception {
@@ -596,4 +1015,1336 @@
     public void testRun_resultTimeout() throws Exception {
         testResultCode("Timeout", false);
     }
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationLandscape() throws Exception {
+        testOrientation("90", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationPortrait() throws Exception {
+        testOrientation("0", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationReverseLandscape() throws Exception {
+        testOrientation("270", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationReversePortrait() throws Exception {
+        testOrientation("180", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationUnspecified() throws Exception {
+        testOrientation("unspecified", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation with limited features
+     */
+    public void testRun_orientationUnspecifiedLimitedFeatures() throws Exception {
+        testOrientation("unspecified", ONLY_LANDSCAPE_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation with limited features
+     */
+    public void testRun_orientationLandscapeLimitedFeatures() throws Exception {
+        testOrientation("90", ONLY_LANDSCAPE_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation with limited features
+     */
+    public void testRun_orientationPortraitLimitedFeatures() throws Exception {
+        testOrientation("0", ONLY_LANDSCAPE_FEATURES);
+    }
+
+    /**
+     * Test dEQP unsupported pixel format
+     */
+    public void testRun_unsupportedPixelFormat() throws Exception {
+        final String pixelFormat = "rgba5658d16m4";
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.pixelformat", "test");
+        final String testPath = "dEQP-GLES3.pixelformat.test";
+        final String testTrie = "{dEQP-GLES3{pixelformat{test}}}";
+        final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>(1));
+        instance.get(testId).add(new HashMap<String,String>());
+        instance.get(testId).iterator().next().put("glconfig", pixelFormat);
+        instance.get(testId).iterator().next().put("rotation", "unspecified");
+        instance.get(testId).iterator().next().put("surfacetype", "window");
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        expectRenderConfigQueryAndReturn(mockDevice, String.format(
+                "--deqp-gl-config-name=%s --deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", pixelFormat), "No");
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testStarted(EasyMock.eq(testId));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockListener);
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice);
+    }
+
+    /**
+     * Test dEQP with multiple instances
+     */
+    public void testRun_multipleInstances() throws Exception {
+        final String instrumentationAnswerConfigAPass1 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.passall\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.failone\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.crashtwo\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"; // early eof
+        final String instrumentationAnswerConfigAPass2 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.crashtwo\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"; // early eof
+        final String instrumentationAnswerConfigBPass1 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.passall\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.skipone\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String instrumentationAnswerConfigBPass2 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.crashtwo\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TerminateTestCase-Reason=Magic\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TerminateTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String instrumentationAnswerConfigCPass1 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.failone\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Fail\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Fail\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String instrumentationAnswerConfigCPass2 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.crashtwo\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        final TestIdentifier[] testIds = {
+                new TestIdentifier("dEQP-GLES3.instances", "passall"),
+                new TestIdentifier("dEQP-GLES3.instances", "failone"),
+                new TestIdentifier("dEQP-GLES3.instances", "crashtwo"),
+                new TestIdentifier("dEQP-GLES3.instances", "skipone"),
+        };
+
+        final String[] testPaths = {
+                "dEQP-GLES3.instances.passall",
+                "dEQP-GLES3.instances.failone",
+                "dEQP-GLES3.instances.crashtwo",
+                "dEQP-GLES3.instances.skipone",
+        };
+
+        Map<String,String> supportedConfigA = new HashMap<>();
+        supportedConfigA.put("glconfig", "rgba8888d24s8");
+        supportedConfigA.put("rotation", "unspecified");
+        supportedConfigA.put("surfacetype", "window");
+
+        Map<String,String> supportedConfigB = new HashMap<>();
+        supportedConfigB.put("glconfig", "rgba8888d24s8");
+        supportedConfigB.put("rotation", "90");
+        supportedConfigB.put("surfacetype", "window");
+
+        Map<String,String> supportedConfigC = new HashMap<>();
+        supportedConfigC.put("glconfig", "rgba8888d24s8");
+        supportedConfigC.put("rotation", "180");
+        supportedConfigC.put("surfacetype", "window");
+
+        Map<String,String> unsupportedConfig = new HashMap<>();
+        unsupportedConfig.put("glconfig", "rgb565d16s0");
+        unsupportedConfig.put("rotation", "unspecified");
+        unsupportedConfig.put("surfacetype", "window");
+
+        Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
+
+        // pass all
+        instances.put(testIds[0], new ArrayList<Map<String,String>>());
+        instances.get(testIds[0]).add(supportedConfigA);
+        instances.get(testIds[0]).add(supportedConfigB);
+
+        // fail one
+        instances.put(testIds[1], new ArrayList<Map<String,String>>());
+        instances.get(testIds[1]).add(supportedConfigA);
+        instances.get(testIds[1]).add(supportedConfigC);
+
+        // crash two
+        instances.put(testIds[2], new ArrayList<Map<String,String>>());
+        instances.get(testIds[2]).add(supportedConfigA);
+        instances.get(testIds[2]).add(supportedConfigC);
+        instances.get(testIds[2]).add(supportedConfigB);
+
+        // skip one
+        instances.put(testIds[3], new ArrayList<Map<String,String>>());
+        instances.get(testIds[3]).add(supportedConfigB);
+        instances.get(testIds[3]).add(unsupportedConfig);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        for (TestIdentifier id : testIds) {
+            tests.add(id);
+        }
+
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IMocksControl orderedControl = EasyMock.createStrictControl();
+        ITestDevice mockDevice = orderedControl.createMock(ITestDevice.class);
+        IDevice mockIDevice = orderedControl.createMock(IDevice.class);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        // query config A
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run config A - first pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{passall,failone,crashtwo}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigAPass1);
+
+        // run config A - second pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{crashtwo}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigAPass2);
+
+        // query for config B
+
+        EasyMock.expect(mockDevice.executeShellCommand("pm list features")).andReturn(ALL_FEATURES)
+                .once();
+
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run for config B - first pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{passall,skipone}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigBPass1);
+
+        // query for config C
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=180 "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run for config C - first pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{failone}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=180 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigCPass1);
+
+        // run for config C - second pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{crashtwo}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=180 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigCPass2);
+
+        // run for config B - second pass (crashtwo has been deferred due to its instability)
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{crashtwo}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigBPass2);
+
+        // query for unsupported config
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgb565d16s0 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "No");
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 4);
+        EasyMock.expectLastCall().once();
+
+        // pass all
+        mockListener.testStarted(EasyMock.eq(testIds[0]));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testIds[0]), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        // fail one
+        mockListener.testStarted(EasyMock.eq(testIds[1]));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testFailed(testIds[1],
+                "=== with config {glformat=rgba8888d24s8,rotation=180,surfacetype=window} ===\n"
+                + "Fail: Fail");
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testIds[1]), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        // crash two
+        mockListener.testStarted(EasyMock.eq(testIds[2]));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testFailed(testIds[2],
+                "=== with config {glformat=rgba8888d24s8,rotation=unspecified,surfacetype=window} ===\n"
+                + "Crash: Incomplete test log\n"
+                + "=== with config {glformat=rgba8888d24s8,rotation=90,surfacetype=window} ===\n"
+                + "Terminated: Magic");
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testIds[2]), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        // skip one
+        mockListener.testStarted(EasyMock.eq(testIds[3]));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testIds[3]), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        orderedControl.replay();
+        EasyMock.replay(mockListener);
+        deqpTest.setRecovery(new StubRecovery());
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
+        orderedControl.verify();
+    }
+
+    private void testMultipleInstancesLossOfDeviceMidInstance(final boolean recoverySuccessful)
+            throws Exception {
+        final String instrumentationAnswerFine =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.loss.instance\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String instrumentationAnswerCrash =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.loss.instance\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"; // early <EOF>
+
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.loss", "instance");
+
+        Map<String,String> supportedConfigA = new HashMap<>();
+        supportedConfigA.put("glconfig", "rgba8888d24s8");
+        supportedConfigA.put("rotation", "unspecified");
+        supportedConfigA.put("surfacetype", "window");
+
+        Map<String,String> supportedConfigB = new HashMap<>();
+        supportedConfigB.put("glconfig", "rgba8888d24s8");
+        supportedConfigB.put("rotation", "90");
+        supportedConfigB.put("surfacetype", "window");
+
+        Map<String,String> supportedConfigC = new HashMap<>();
+        supportedConfigC.put("glconfig", "rgba8888d24s8");
+        supportedConfigC.put("rotation", "180");
+        supportedConfigC.put("surfacetype", "window");
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>());
+        instance.get(testId).add(supportedConfigA);
+        instance.get(testId).add(supportedConfigB);
+        instance.get(testId).add(supportedConfigC);
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+        DeqpTestRunner.IRecovery mockRecovery = EasyMock.createMock(DeqpTestRunner.IRecovery.class);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+        deqpTest.setRecovery(mockRecovery);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+        EasyMock.expect(mockDevice.executeShellCommand("pm list features")).andReturn(ALL_FEATURES)
+                .anyTimes();
+
+        mockRecovery.onExecutionProgressed();
+        EasyMock.expectLastCall().atLeastOnce();
+
+        mockRecovery.setDevice(mockDevice);
+        EasyMock.expectLastCall().atLeastOnce();
+
+        if (!recoverySuccessful) {
+            EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+                andReturn("").once();
+        } else {
+            EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+                andReturn("").times(2);
+        }
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        // query config A
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run config A
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{loss{instance}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerFine);
+
+        // query config B
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run config B
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
+                .andReturn("").once();
+
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
+                .andReturn("").once();
+
+        EasyMock.expect(mockDevice.pushString("{dEQP-GLES3{loss{instance}}}\n", CASE_LIST_FILE_NAME))
+                .andReturn(true).once();
+
+        String command = String.format(
+                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
+                + "--deqp-caselist-file=%s"
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable\" "
+                + "-e deqpLogData \"%s\" %s",
+                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME,
+                CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME);
+
+        EasyMock.expect(mockDevice.getIDevice()).andReturn(mockIDevice);
+        mockIDevice.executeShellCommand(EasyMock.eq(command),
+                EasyMock.<IShellOutputReceiver>notNull(), EasyMock.anyLong(),
+                EasyMock.isA(TimeUnit.class));
+
+        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+            @Override
+            public Object answer() throws ShellCommandUnresponsiveException {
+                IShellOutputReceiver receiver
+                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
+
+                receiver.addOutput(instrumentationAnswerCrash.getBytes(), 0,
+                        instrumentationAnswerCrash.length());
+                throw new ShellCommandUnresponsiveException();
+            }
+        });
+
+        if (!recoverySuccessful) {
+            mockRecovery.recoverComLinkKilled();
+            EasyMock.expectLastCall().andThrow(new DeviceNotAvailableException()).once();
+        } else {
+            mockRecovery.recoverComLinkKilled();
+            EasyMock.expectLastCall().once();
+
+            // retry running config B
+            runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                    "{dEQP-GLES3{loss{instance}}}",
+                    "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                    + " --deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=90 "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-log-images=disable "
+                    + "--deqp-watchdog=enable", instrumentationAnswerFine);
+
+            // query config C
+            expectRenderConfigQueryAndReturn(mockDevice,
+                    "--deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=180 "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-gl-major-version=3 "
+                    + "--deqp-gl-minor-version=0", "Yes");
+
+            // run config C
+            runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                    "{dEQP-GLES3{loss{instance}}}",
+                    "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                    + " --deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=180 "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-log-images=disable "
+                    + "--deqp-watchdog=enable", instrumentationAnswerFine);
+        }
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        // result is reported only if device is available
+        if (recoverySuccessful) {
+            mockListener.testStarted(EasyMock.eq(testId));
+            EasyMock.expectLastCall().once();
+
+            mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull());
+            EasyMock.expectLastCall().once();
+
+            mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+            EasyMock.expectLastCall().once();
+        }
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+        EasyMock.replay(mockRecovery);
+
+        try {
+            deqpTest.run(mockListener);
+
+            if (!recoverySuccessful) {
+                fail("did not get DeviceNotAvailableException");
+            }
+        } catch (DeviceNotAvailableException ex) {
+            if (recoverySuccessful) {
+                fail("got DeviceNotAvailableException");
+            }
+        }
+
+        EasyMock.verify(mockRecovery);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
+     * Test dEQP with runner if device is lost during one of multiple instances.
+     */
+    public void testRun_multipleInstancesLossOfDeviceMidInstance() throws Exception {
+        testMultipleInstancesLossOfDeviceMidInstance(false);
+    }
+
+    /**
+     * Test dEQP with runner if device is lost during one of multiple instances but recovery
+     * is successful.
+     */
+    public void testRun_multipleInstancesLossOfDeviceMidInstanceAndRecovery() throws Exception {
+        testMultipleInstancesLossOfDeviceMidInstance(true);
+    }
+
+    public static interface RecoverableTestDevice extends ITestDevice {
+        public void recoverDevice() throws DeviceNotAvailableException;
+    }
+
+    private static enum RecoveryEvent {
+        PROGRESS,
+        FAIL_CONNECTION_REFUSED,
+        FAIL_LINK_KILLED,
+    };
+
+    private void runRecoveryWithPattern(DeqpTestRunner.Recovery recovery, RecoveryEvent[] events)
+            throws DeviceNotAvailableException {
+        for (RecoveryEvent event : events) {
+            switch (event) {
+                case PROGRESS:
+                    recovery.onExecutionProgressed();
+                    break;
+                case FAIL_CONNECTION_REFUSED:
+                    recovery.recoverConnectionRefused();
+                    break;
+                case FAIL_LINK_KILLED:
+                    recovery.recoverComLinkKilled();
+                    break;
+            }
+        }
+    }
+
+    private void setRecoveryExpectationWait(DeqpTestRunner.ISleepProvider mockSleepProvider) {
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expectLastCall().once();
+    }
+
+    private void setRecoveryExpectationKillProcess(RecoverableTestDevice mockDevice,
+            DeqpTestRunner.ISleepProvider mockSleepProvider) throws DeviceNotAvailableException {
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("kill -9 1234"))).
+                andReturn("").once();
+
+        // Recovery checks if kill failed
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expectLastCall().once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("").once();
+    }
+
+    private void setRecoveryExpectationRecovery(RecoverableTestDevice mockDevice)
+            throws DeviceNotAvailableException {
+        mockDevice.recoverDevice();
+        EasyMock.expectLastCall().once();
+    }
+
+    private void setRecoveryExpectationReboot(RecoverableTestDevice mockDevice)
+            throws DeviceNotAvailableException {
+        mockDevice.reboot();
+        EasyMock.expectLastCall().once();
+    }
+
+    private int setRecoveryExpectationOfAConnFailure(RecoverableTestDevice mockDevice,
+            DeqpTestRunner.ISleepProvider mockSleepProvider, int numConsecutiveErrors)
+            throws DeviceNotAvailableException {
+        switch (numConsecutiveErrors) {
+            case 0:
+            case 1:
+                setRecoveryExpectationRecovery(mockDevice);
+                return 2;
+            case 2:
+                setRecoveryExpectationReboot(mockDevice);
+                return 3;
+            default:
+                return 4;
+        }
+    }
+
+    private int setRecoveryExpectationOfAComKilled(RecoverableTestDevice mockDevice,
+            DeqpTestRunner.ISleepProvider mockSleepProvider, int numConsecutiveErrors)
+            throws DeviceNotAvailableException {
+        switch (numConsecutiveErrors) {
+            case 0:
+                setRecoveryExpectationWait(mockSleepProvider);
+                setRecoveryExpectationKillProcess(mockDevice, mockSleepProvider);
+                return 1;
+            case 1:
+                setRecoveryExpectationRecovery(mockDevice);
+                setRecoveryExpectationKillProcess(mockDevice, mockSleepProvider);
+                return 2;
+            case 2:
+                setRecoveryExpectationReboot(mockDevice);
+                return 3;
+            default:
+                return 4;
+        }
+    }
+
+    private void setRecoveryExpectationsOfAPattern(RecoverableTestDevice mockDevice,
+            DeqpTestRunner.ISleepProvider mockSleepProvider, RecoveryEvent[] events)
+            throws DeviceNotAvailableException {
+        int numConsecutiveErrors = 0;
+        for (RecoveryEvent event : events) {
+            switch (event) {
+                case PROGRESS:
+                    numConsecutiveErrors = 0;
+                    break;
+                case FAIL_CONNECTION_REFUSED:
+                    numConsecutiveErrors = setRecoveryExpectationOfAConnFailure(mockDevice,
+                            mockSleepProvider, numConsecutiveErrors);
+                    break;
+                case FAIL_LINK_KILLED:
+                    numConsecutiveErrors = setRecoveryExpectationOfAComKilled(mockDevice,
+                            mockSleepProvider, numConsecutiveErrors);
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Test dEQP runner recovery state machine.
+     */
+    private void testRecoveryWithPattern(boolean expectSuccess, RecoveryEvent...pattern)
+            throws Exception {
+        DeqpTestRunner.Recovery recovery = new DeqpTestRunner.Recovery();
+        IMocksControl orderedControl = EasyMock.createStrictControl();
+        RecoverableTestDevice mockDevice = orderedControl.createMock(RecoverableTestDevice.class);
+        DeqpTestRunner.ISleepProvider mockSleepProvider =
+                orderedControl.createMock(DeqpTestRunner.ISleepProvider.class);
+
+        setRecoveryExpectationsOfAPattern(mockDevice, mockSleepProvider, pattern);
+
+        orderedControl.replay();
+
+        recovery.setDevice(mockDevice);
+        recovery.setSleepProvider(mockSleepProvider);
+        try {
+            runRecoveryWithPattern(recovery, pattern);
+            if (!expectSuccess) {
+                fail("Expected DeviceNotAvailableException");
+            }
+        } catch (DeviceNotAvailableException ex) {
+            if (expectSuccess) {
+                fail("Did not expect DeviceNotAvailableException");
+            }
+        }
+
+        orderedControl.verify();
+    }
+
+    // basic patterns
+
+    public void testRecovery_NoEvents() throws Exception {
+        testRecoveryWithPattern(true);
+    }
+
+    public void testRecovery_AllOk() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS, RecoveryEvent.PROGRESS);
+    }
+
+    // conn fail patterns
+
+    public void testRecovery_OneConnectionFailureBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_TwoConnectionFailuresBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_ThreeConnectionFailuresBegin() throws Exception {
+        testRecoveryWithPattern(false, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.FAIL_CONNECTION_REFUSED);
+    }
+
+    public void testRecovery_OneConnectionFailureMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_TwoConnectionFailuresMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_ThreeConnectionFailuresMid() throws Exception {
+        testRecoveryWithPattern(false, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED);
+    }
+
+    // link fail patterns
+
+    public void testRecovery_OneLinkFailureBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_TwoLinkFailuresBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_ThreeLinkFailuresBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_FourLinkFailuresBegin() throws Exception {
+        testRecoveryWithPattern(false, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED);
+    }
+
+    public void testRecovery_OneLinkFailureMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_TwoLinkFailuresMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_ThreeLinkFailuresMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_FourLinkFailuresMid() throws Exception {
+        testRecoveryWithPattern(false, RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED);
+    }
+
+    // mixed patterns
+
+    public void testRecovery_MixedFailuresProgressBetween() throws Exception {
+        testRecoveryWithPattern(true,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_MixedFailuresNoProgressBetween() throws Exception {
+        testRecoveryWithPattern(true,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    /**
+     * Test recovery if process cannot be killed
+     */
+    public void testRecovery_unkillableProcess () throws Exception {
+        DeqpTestRunner.Recovery recovery = new DeqpTestRunner.Recovery();
+        IMocksControl orderedControl = EasyMock.createStrictControl();
+        RecoverableTestDevice mockDevice = orderedControl.createMock(RecoverableTestDevice.class);
+        DeqpTestRunner.ISleepProvider mockSleepProvider =
+                orderedControl.createMock(DeqpTestRunner.ISleepProvider.class);
+
+        // recovery attempts to kill the process after a timeout
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("kill -9 1234"))).
+                andReturn("").once();
+
+        // Recovery checks if kill failed
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expectLastCall().once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+
+        // Recovery resets the connection
+        mockDevice.recoverDevice();
+        EasyMock.expectLastCall().once();
+
+        // and attempts to kill the process again
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("kill -9 1234"))).
+                andReturn("").once();
+
+        // Recovery checks if kill failed
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expectLastCall().once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+
+        // recovery reboots the device
+        mockDevice.reboot();
+        EasyMock.expectLastCall().once();
+
+        orderedControl.replay();
+        recovery.setDevice(mockDevice);
+        recovery.setSleepProvider(mockSleepProvider);
+        recovery.recoverComLinkKilled();
+        orderedControl.verify();
+    }
+
+    /**
+     * Test external interruption before batch run.
+     */
+    public void testInterrupt_killBeforeBatch() throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.interrupt", "test");
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, DEFAULT_INSTANCE_ARGS);
+
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+        IRunUtil mockRunUtil = EasyMock.createMock(IRunUtil.class);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+        deqpTest.setRunUtil(mockRunUtil);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        expectRenderConfigQuery(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 --deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window --deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0");
+
+        mockRunUtil.sleep(0);
+        EasyMock.expectLastCall().andThrow(new RunInterruptedException());
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+        EasyMock.replay(mockRunUtil);
+        try {
+            deqpTest.run(mockListener);
+            fail("expected RunInterruptedException");
+        } catch (RunInterruptedException ex) {
+            // expected
+        }
+        EasyMock.verify(mockRunUtil);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
+     * Test external interruption in testFailed().
+     */
+    public void testInterrupt_killReportTestFailed() throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.interrupt", "test");
+        final String testPath = "dEQP-GLES3.interrupt.test";
+        final String testTrie = "{dEQP-GLES3{interrupt{test}}}";
+        final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Fail\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Fail\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, DEFAULT_INSTANCE_ARGS);
+
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+        IRunUtil mockRunUtil = EasyMock.createMock(IRunUtil.class);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+        deqpTest.setRunUtil(mockRunUtil);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        expectRenderConfigQuery(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 --deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window --deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0");
+
+        mockRunUtil.sleep(0);
+        EasyMock.expectLastCall().once();
+
+        String commandLine = String.format(
+                "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable",
+                CASE_LIST_FILE_NAME);
+
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine,
+                output);
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testStarted(EasyMock.eq(testId));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testFailed(EasyMock.eq(testId), EasyMock.<String>notNull());
+        EasyMock.expectLastCall().andThrow(new RunInterruptedException());
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+        EasyMock.replay(mockRunUtil);
+        try {
+            deqpTest.run(mockListener);
+            fail("expected RunInterruptedException");
+        } catch (RunInterruptedException ex) {
+            // expected
+        }
+        EasyMock.verify(mockRunUtil);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    private void runInstrumentationLineAndAnswer(ITestDevice mockDevice, IDevice mockIDevice,
+            final String testTrie, final String cmd, final String output) throws Exception {
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
+                .andReturn("").once();
+
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
+                .andReturn("").once();
+
+        EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME))
+                .andReturn(true).once();
+
+        String command = String.format(
+                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \"%s\" "
+                    + "-e deqpLogData \"%s\" %s",
+                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME, cmd, false,
+                INSTRUMENTATION_NAME);
+
+        EasyMock.expect(mockDevice.getIDevice()).andReturn(mockIDevice);
+        mockIDevice.executeShellCommand(EasyMock.eq(command),
+                EasyMock.<IShellOutputReceiver>notNull(), EasyMock.anyLong(),
+                EasyMock.isA(TimeUnit.class));
+
+        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+            @Override
+            public Object answer() {
+                IShellOutputReceiver receiver
+                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
+
+                receiver.addOutput(output.getBytes(), 0, output.length());
+                receiver.flush();
+
+                return null;
+            }
+        });
+    }
 }
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/GeeTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/GeeTestTest.java
new file mode 100644
index 0000000..93272be
--- /dev/null
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/GeeTestTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.tradefed.testtype;
+
+import com.android.cts.tradefed.UnitTests;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit tests for {@link GeeTest}.
+ */
+public class GeeTestTest extends TestCase {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+     /**
+     * Test {@link GeeTestTest#getGTestFilters}
+     * @throws DeviceNotAvailableException
+     */
+    public void testGetGTestFilters() {
+        GeeTest test = new GeeTest("package_foo", "exe_foo");
+        test.setPositiveFilters("a");
+        test.setNegativeFilters("b");
+        String actual = test.getGTestFilters();
+        assertEquals("--gtest_filter=a:-b", actual);
+    }
+
+    /**
+     * Test {@link GeeTestTest#getGTestFilters} with only positive filters
+     * @throws DeviceNotAvailableException
+     */
+    public void testGetGTestFiltersPositiveOnly() {
+        GeeTest test = new GeeTest("package_foo", "exe_foo");
+        test.setPositiveFilters("a");
+        String actual = test.getGTestFilters();
+        assertEquals("--gtest_filter=a", actual);
+    }
+
+    /**
+     * Test {@link GeeTestTest#getGTestFilters} with only negative filters
+     * @throws DeviceNotAvailableException
+     */
+    public void testGetGTestFiltersNegativeOnly() {
+        GeeTest test = new GeeTest("package_foo", "exe_foo");
+        test.setNegativeFilters("b");
+        String actual = test.getGTestFilters();
+        assertEquals("--gtest_filter=-b", actual);
+    }
+
+    /**
+     * Test {@link GeeTestTest#getGTestFilters} with empty filters
+     * @throws DeviceNotAvailableException
+     */
+    public void testGetGTestFiltersWithNoFilters() {
+        GeeTest test = new GeeTest("package_foo", "exe_foo");
+        String actual = test.getGTestFilters();
+        assertEquals("", actual);
+    }
+}
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
index 6d87a61..bd48c51 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
@@ -25,6 +25,8 @@
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Unit tests for {@link TestPackageXmlParser}.
@@ -65,6 +67,29 @@
 
     private static final String NO_TEST_DATA = "<invalid />";
 
+    private static final String INSTANCED_TEST_DATA =
+        "<TestPackage>\n" +
+        "    <TestSuite name=\"com\" >\n" +
+        "        <TestSuite name=\"example\" >\n" +
+        "            <TestCase name=\"ExampleTest\" >\n" +
+        "                <Test name=\"testMultiInstanced\" >\n" +
+        "                    <TestInstance foo=\"bar\" />\n" +
+        "                    <TestInstance foo=\"baz\" foo2=\"baz2\"/>\n" +
+        "                </Test>\n" +
+        "                <Test name=\"testSingleInstanced\" >\n" +
+        "                    <TestInstance foo=\"bar\" />\n" +
+        "                </Test>\n" +
+        "                <Test name=\"testEmptyInstances\" >\n" +
+        "                    <TestInstance />\n" +
+        "                    <TestInstance />\n" +
+        "                </Test>\n" +
+        "                <Test name=\"testNotInstanced\" >\n" +
+        "                </Test>\n" +
+        "            </TestCase>\n" +
+        "        </TestSuite>\n" +
+        "    </TestSuite>\n" +
+        "</TestPackage>";
+
     /**
      * Test parsing test case xml containing an instrumentation test definition.
      */
@@ -162,6 +187,90 @@
         assertTrue(parser.getTestPackageDefs().isEmpty());
     }
 
+    /**
+     * Test parsing a test case xml with multiple test instances
+     */
+    public void testParse_instancedMultiple() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
+        for (TestPackageDef def : parser.getTestPackageDefs()) {
+            final TestIdentifier testId =
+                    new TestIdentifier("com.example.ExampleTest", "testMultiInstanced");
+            final List<Map<String, String>> targetInstances =
+                    def.getTestInstanceArguments().get(testId);
+            assertNotNull(targetInstances);
+            assertEquals(2, targetInstances.size());
+
+            final Iterator<Map<String, String>> iterator = targetInstances.iterator();
+            final Map<String, String> firstInstance = iterator.next();
+            final Map<String, String> secondInstance = iterator.next();
+
+            assertEquals("bar", firstInstance.get("foo"));
+            assertEquals("baz", secondInstance.get("foo"));
+            assertEquals("baz2", secondInstance.get("foo2"));
+        }
+    }
+
+    /**
+     * Test parsing a test case xml with single test instance
+     */
+    public void testParse_instancedSingle() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
+        for (TestPackageDef def : parser.getTestPackageDefs()) {
+            final TestIdentifier testId =
+                    new TestIdentifier("com.example.ExampleTest", "testSingleInstanced");
+            final List<Map<String, String>> targetInstances =
+                    def.getTestInstanceArguments().get(testId);
+            assertNotNull(targetInstances);
+            assertEquals(1, targetInstances.size());
+
+            final Iterator<Map<String, String>> iterator = targetInstances.iterator();
+            final Map<String, String> firstInstance = iterator.next();
+
+            assertEquals("bar", firstInstance.get("foo"));
+        }
+    }
+
+    /**
+     * Test parsing a test case xml with multiple test instances with no data
+     */
+    public void testParse_instancedEmptys() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
+        for (TestPackageDef def : parser.getTestPackageDefs()) {
+            final TestIdentifier testId =
+                    new TestIdentifier("com.example.ExampleTest", "testEmptyInstances");
+            final List<Map<String, String>> targetInstances =
+                    def.getTestInstanceArguments().get(testId);
+            assertNotNull(targetInstances);
+            assertEquals(2, targetInstances.size());
+
+            final Iterator<Map<String, String>> iterator = targetInstances.iterator();
+            final Map<String, String> firstInstance = iterator.next();
+            final Map<String, String> secondInstance = iterator.next();
+
+            assertTrue(firstInstance.isEmpty());
+            assertTrue(secondInstance.isEmpty());
+        }
+    }
+
+    /**
+     * Test parsing a test case xml with no test instances
+     */
+    public void testParse_instancedNoInstances() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
+        for (TestPackageDef def : parser.getTestPackageDefs()) {
+            final TestIdentifier testId =
+                    new TestIdentifier("com.example.ExampleTest", "testNotInstanced");
+            final List<Map<String, String>> targetInstances =
+                    def.getTestInstanceArguments().get(testId);
+            assertNotNull(targetInstances);
+            assertTrue(targetInstances.isEmpty());
+        }
+    }
+
     private InputStream getStringAsStream(String input) {
         return new ByteArrayInputStream(input.getBytes());
     }
diff --git a/tools/utils/CollectAllTests.java b/tools/utils/CollectAllTests.java
index ed74824..95b77f2 100644
--- a/tools/utils/CollectAllTests.java
+++ b/tools/utils/CollectAllTests.java
@@ -78,16 +78,26 @@
         final String outputPathPrefix = args[0];
         File manifestFile = new File(args[1]);
         String jarFileName = args[2];
-        final String javaPackageFilter = args[3];
-        // Validate the javaPackageFilter value if non null.
-        if (javaPackageFilter.length() != 0) {
-            if (!isValidJavaPackage(javaPackageFilter)) {
-                System.err.println("Invalid " + ATTRIBUTE_JAVA_PACKAGE_FILTER + ": " +
-                        javaPackageFilter);
-                System.exit(1);
-                return;
+        final String javaPackageFilterArg = args[3] != null ? args[3].replaceAll("\\s+", "") : "";
+        final String[] javaPackagePrefixes;
+        // Validate the javaPackageFilter value if non-empty.
+        if (!javaPackageFilterArg.isEmpty()) {
+            javaPackagePrefixes = javaPackageFilterArg.split(":");
+            for (int i = 0; i < javaPackagePrefixes.length; ++i) {
+                final String javaPackageFilter = javaPackagePrefixes[i];
+                if (!isValidJavaPackage(javaPackageFilter)) {
+                    System.err.println("Invalid " + ATTRIBUTE_JAVA_PACKAGE_FILTER + ": " +
+                           javaPackageFilter);
+                    System.exit(1);
+                    return;
+                } else {
+                    javaPackagePrefixes[i] = javaPackageFilter.trim() + ".";
+                }
             }
+        } else {
+            javaPackagePrefixes = new String[0];
         }
+
         String architecture = args[4];
         if (architecture == null || architecture.equals("")) {
             System.err.println("Invalid architecture");
@@ -132,7 +142,7 @@
                     setAttribute(testPackageElem, ATTRIBUTE_RUNNER, runner);
                     setAttribute(testPackageElem, ATTRIBUTE_PACKAGE, packageName);
                     setAttribute(testPackageElem, ATTRIBUTE_NS, packageName);
-                    setAttribute(testPackageElem, ATTRIBUTE_JAVA_PACKAGE_FILTER, javaPackageFilter);
+                    setAttribute(testPackageElem, ATTRIBUTE_JAVA_PACKAGE_FILTER, javaPackageFilterArg);
 
                     if (testType.type == TestType.HOST_SIDE_ONLY) {
                         setAttribute(testPackageElem, ATTRIBUTE_HOST_SIDE_ONLY, "true");
@@ -185,8 +195,6 @@
 
         Map<String,TestClass> testCases = new LinkedHashMap<String, TestClass>();
 
-        String javaPackagePrefix = javaPackageFilter.isEmpty() ? "" : (javaPackageFilter + ".");
-
         Enumeration<JarEntry> jarEntries = jarFile.entries();
         while (jarEntries.hasMoreElements()) {
             JarEntry jarEntry = jarEntries.nextElement();
@@ -196,9 +204,22 @@
             }
             String className
                     = name.substring(0, name.length() - ".class".length()).replace('/', '.');
-            if (!className.startsWith(javaPackagePrefix)) {
+
+            boolean matchesPrefix = false;
+            if (javaPackagePrefixes.length > 0) {
+                for (String javaPackagePrefix : javaPackagePrefixes) {
+                    if (className.startsWith(javaPackagePrefix)) {
+                        matchesPrefix = true;
+                    }
+                }
+            } else {
+                matchesPrefix = true;
+            }
+
+            if (!matchesPrefix) {
                 continue;
             }
+
             try {
                 Class<?> klass = Class.forName(className,
                                                false,
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 4d04e1a..6b74608 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -30,6 +30,12 @@
   """Return all directories under the given root directory."""
   return [x for x in os.listdir(root) if os.path.isdir(os.path.join(root, x))]
 
+def ReadFileLines(filePath):
+  """Reads a file and returns its contents as a line list."""
+  f = open(filePath, 'r');
+  lines = [line.strip() for line in f.readlines()]
+  f.close()
+  return lines
 
 def GetMakeFileVars(makefile_path):
   """Extracts variable definitions from the given make file.
@@ -153,13 +159,17 @@
     plan.Include('com\.android\.cts\..*')#TODO(stuartscott): Should PDK have all these?
     self.__WritePlan(plan, 'PDK')
 
+    temporarily_known_failure_tests = BuildCtsTemporarilyKnownFailureList();
     flaky_tests = BuildCtsFlakyTestList()
+    releasekey_tests = BuildListForReleaseBuildTest()
 
     # CTS Stable plan
     plan = tools.TestPlan(packages)
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-stable')
 
     # CTS Flaky plan - list of tests known to be flaky in lab environment
@@ -181,9 +191,14 @@
     for package, test_list in small_tests.iteritems():
       plan.Include(package+'$')
     plan.Exclude(r'com\.android\.cts\.browserbench')
+    for package, test_list in temporarily_known_failure_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-kitkat-small')
+    self.__WritePlan(plan, 'CTS-public-small')
 
     # CTS - sub plan for public, medium size tests
     plan = tools.TestPlan(packages)
@@ -193,7 +208,10 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-kitkat-medium')
+    self.__WritePlan(plan, 'CTS-public-medium')
 
     # CTS - sub plan for hardware tests which is public, large
     plan = tools.TestPlan(packages)
@@ -202,6 +220,8 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-hardware')
 
     # CTS - sub plan for media tests which is public, large
@@ -212,6 +232,8 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-media')
 
     # CTS - sub plan for mediastress tests which is public, large
@@ -221,6 +243,8 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-mediastress')
 
     # CTS - sub plan for new tests that is vetted for L launch
@@ -231,9 +255,22 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-l-tests')
 
-    #CTS - sub plan for new test packages added for staging
+    # CTS - sub plan for tests in drawelement packages
+    plan = tools.TestPlan(packages)
+    plan.Exclude('.*')
+    plan.Include(r'com\.drawelements\.')
+    # STOPSHIP(jpoyry): Do not ship with reduced test plan to avoid confusion of having multiple
+    #                   different deqp sets in different plans.
+    plan.ExcludeTests('com.drawelements.deqp.gles3', ReadFileLines(os.path.join(self.test_root, 'deqp/gles3-temporary-failures.txt')))
+    plan.ExcludeTests('com.drawelements.deqp.gles31', ReadFileLines(os.path.join(self.test_root, 'deqp/gles31-temporary-failures.txt')))
+    plan.ExcludeTests('com.drawelements.deqp.egl', ReadFileLines(os.path.join(self.test_root, 'deqp/egl-temporary-failures.txt')))
+    self.__WritePlan(plan, 'CTS-DEQP')
+
+    # CTS - sub plan for new test packages added for staging
     plan = tools.TestPlan(packages)
     for package, test_list in small_tests.iteritems():
       plan.Exclude(package+'$')
@@ -241,6 +278,10 @@
       plan.Exclude(package+'$')
     for package, tests_list in new_test_packages.iteritems():
       plan.Exclude(package+'$')
+    for package, test_list in temporarily_known_failure_tests.iteritems():
+      plan.Include(package+'$')
+      plan.IncludeTests(package, test_list)
+    plan.Exclude(r'com\.drawelements\.')
     plan.Exclude(r'android\.hardware$')
     plan.Exclude(r'android\.media$')
     plan.Exclude(r'android\.view$')
@@ -248,16 +289,12 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-staging')
 
     plan = tools.TestPlan(packages)
     plan.Exclude('.*')
-    plan.Include(r'com\.drawelements\.')
-    self.__WritePlan(plan, 'CTS-DEQP')
-
-    plan = tools.TestPlan(packages)
-    plan.Exclude('.*')
-    plan.Include(r'android\.webgl')
     self.__WritePlan(plan, 'CTS-webview')
 
 
@@ -281,7 +318,7 @@
       'com.android.cts.browserbench' : []}
 
 def BuildAospSmallSizeTestList():
-  """ Construct a defaultdict that lists packages names of small tests
+  """ Construct a default dict that lists packages names of small tests
       already published to aosp. """
   return {
       'android.aadb' : [],
@@ -335,6 +372,7 @@
       'com.android.cts.dram' : [],
       'com.android.cts.filesystemperf' : [],
       'com.android.cts.jank' : [],
+      'com.android.cts.jank2' : [],
       'com.android.cts.opengl' : [],
       'com.android.cts.simplecpu' : [],
       'com.android.cts.ui' : [],
@@ -370,52 +408,93 @@
       'android.signature' : [],
       'android.tv' : [],
       'android.uiautomation' : [],
-      'android.uirendering' : [],
-      'android.webgl' : [],
-      'com.drawelements.deqp.gles3' : [],
-      'com.drawelements.deqp.gles31' : []}
+      'android.uirendering' : []}
+
+def BuildListForReleaseBuildTest():
+  """ Construct a defaultdict that maps package name to a list of tests
+      that are expected to pass only when running against a user/release-key build. """
+  return {
+      'android.app' : [
+          'android.app.cts.ActivityManagerTest#testIsRunningInTestHarness',],
+      'android.dpi' : [
+          'android.dpi.cts.DefaultManifestAttributesSdkTest#testPackageHasExpectedSdkVersion',],
+      'android.host.security' : [
+          'android.cts.security.SELinuxHostTest#testAllEnforcing',
+          'android.cts.security.SELinuxHostTest#testSuDomain',],
+      'android.os' : [
+          'android.os.cts.BuildVersionTest#testReleaseVersion',
+          'android.os.cts.BuildTest#testIsSecureUserBuild',],
+      'android.security' : [
+          'android.security.cts.BannedFilesTest#testNoSu',
+          'android.security.cts.BannedFilesTest#testNoSuInPath',
+          'android.security.cts.PackageSignatureTest#testPackageSignatures',
+          'android.security.cts.SELinuxDomainTest#testSuDomain',],
+      '' : []}
 
 def BuildCtsFlakyTestList():
   """ Construct a defaultdict that maps package name to a list of tests
-      that are known to be flaky in the lab or not passing on userdebug builds. """
+      that flaky during dev cycle and cause other subsequent tests to fail. """
   return {
-      'android.app' : [
-          'cts.ActivityManagerTest#testIsRunningInTestHarness',],
-      'android.dpi' : [
-          'cts.DefaultManifestAttributesSdkTest#testPackageHasExpectedSdkVersion',],
       'android.hardware' : [
-          'cts.CameraTest#testVideoSnapshot',
-          'cts.CameraGLTest#testCameraToSurfaceTextureMetadata',
-          'cts.CameraGLTest#testSetPreviewTextureBothCallbacks',
-          'cts.CameraGLTest#testSetPreviewTexturePreviewCallback',],
+          'android.hardware.cts.CameraTest#testVideoSnapshot',
+          'android.hardware.cts.CameraGLTest#testCameraToSurfaceTextureMetadata',
+          'android.hardware.cts.CameraGLTest#testSetPreviewTextureBothCallbacks',
+          'android.hardware.cts.CameraGLTest#testSetPreviewTexturePreviewCallback',],
       'android.media' : [
-          'cts.DecoderTest#testCodecResetsH264WithSurface',
-          'cts.StreamingMediaPlayerTest#testHLS',],
+          'android.media.cts.DecoderTest#testCodecResetsH264WithSurface',
+          'android.media.cts.StreamingMediaPlayerTest#testHLS',],
       'android.net' : [
-          'cts.ConnectivityManagerTest#testStartUsingNetworkFeature_enableHipri',
-          'cts.DnsTest#testDnsWorks',
-          'cts.SSLCertificateSocketFactoryTest#testCreateSocket',
-          'cts.SSLCertificateSocketFactoryTest#test_createSocket_bind',
-          'cts.SSLCertificateSocketFactoryTest#test_createSocket_simple',
-          'cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping',
-          'cts.TrafficStatsTest#testTrafficStatsForLocalhost',
-          'wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly',],
-      'android.os' : [
-          'cts.BuildVersionTest#testReleaseVersion',
-          'cts.BuildTest#testIsSecureUserBuild',],
+          'android.net.cts.ConnectivityManagerTest#testStartUsingNetworkFeature_enableHipri',
+          'android.net.cts.DnsTest#testDnsWorks',
+          'android.net.cts.SSLCertificateSocketFactoryTest#testCreateSocket',
+          'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_bind',
+          'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_simple',
+          'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping',
+          'android.net.cts.TrafficStatsTest#testTrafficStatsForLocalhost',
+          'android.net.wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly',],
       'android.security' : [
-          'cts.BannedFilesTest#testNoSu',
-          'cts.BannedFilesTest#testNoSuInPath',
-          'cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdp6Ports',
-          'cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdpPorts',
-          'cts.PackageSignatureTest#testPackageSignatures',
-          'cts.SELinuxDomainTest#testSuDomain',
-          'cts.SELinuxHostTest#testAllEnforcing',],
+          'android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdp6Ports',
+          'android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdpPorts',],
       'android.webkit' : [
-          'cts.WebViewClientTest#testOnUnhandledKeyEvent',],
+          'android.webkit.cts.WebViewClientTest#testOnUnhandledKeyEvent',],
       'com.android.cts.filesystemperf' : [
-          'RandomRWTest#testRandomRead',
-          'RandomRWTest#testRandomUpdate',],
+          'com.android.cts.filesystemperf.RandomRWTest#testRandomRead',
+          'com.android.cts.filesystemperf.RandomRWTest#testRandomUpdate',],
+      '' : []}
+
+def BuildCtsTemporarilyKnownFailureList():
+  """ Construct a defaultdict that maps package name to a list of tests
+      that are known failures during dev cycle but expected to be fixed before launch """
+  return {
+      'android.content' : [
+          'android.content.cts.ContentResolverTest#testAndroidTestCaseSetupProperly',
+          'android.content.cts.ContentResolverTest#testBulkInsert',
+          'android.content.cts.ContentResolverTest#testCancelableQuery_WhenCanceledBeforeQuery_ThrowsImmediately',
+          'android.content.cts.ContentResolverTest#testCancelableQuery_WhenCanceledDuringLongRunningQuery_CancelsQueryAndThrows',
+          'android.content.cts.ContentResolverTest#testCancelableQuery_WhenNotCanceled_ReturnsResultSet',
+          'android.content.cts.ContentResolverTest#testConstructor',
+          'android.content.cts.ContentResolverTest#testCrashOnLaunch',
+          'android.content.cts.ContentResolverTest#testCrashingOpenAssetFileDescriptor',
+          'android.content.cts.ContentResolverTest#testCrashingOpenTypedAssetFileDescriptor',
+          'android.content.cts.ContentResolverTest#testCrashingQuery',
+          'android.content.cts.ContentResolverTest#testDelete',
+          'android.content.cts.ContentResolverTest#testGetType',
+          'android.content.cts.ContentResolverTest#testInsert',
+          'android.content.cts.ContentResolverTest#testNotifyChange1',
+          'android.content.cts.ContentResolverTest#testNotifyChange2',
+          'android.content.cts.ContentResolverTest#testOpenAssetFileDescriptor',
+          'android.content.cts.ContentResolverTest#testOpenFileDescriptor',
+          'android.content.cts.ContentResolverTest#testOpenInputStream',
+          'android.content.cts.ContentResolverTest#testOpenOutputStream',
+          'android.content.cts.ContentResolverTest#testQuery',
+          'android.content.cts.ContentResolverTest#testRegisterContentObserver',
+          'android.content.cts.ContentResolverTest#testStableToUnstableRefs',
+          'android.content.cts.ContentResolverTest#testStartCancelSync',
+          'android.content.cts.ContentResolverTest#testStartSyncFailure',
+          'android.content.cts.ContentResolverTest#testUnstableGetType',
+          'android.content.cts.ContentResolverTest#testUnstableToStableRefs',
+          'android.content.cts.ContentResolverTest#testUpdate',
+          'android.content.cts.ContentResolverTest#testValidateSyncExtrasBundle',],
       '' : []}
 
 def LogGenerateDescription(name):
diff --git a/tools/utils/cts/tools.py b/tools/utils/cts/tools.py
index 649e4d7..832e1f2 100644
--- a/tools/utils/cts/tools.py
+++ b/tools/utils/cts/tools.py
@@ -134,7 +134,7 @@
     """
     packaged_test_list = []
     for test in test_list:
-      packaged_test_list.append(package + '.' + test)
+      packaged_test_list.append(test)
 
     if package in self.includedTestsMap:
       self.includedTestsMap[package] += packaged_test_list
@@ -152,7 +152,7 @@
     """
     packaged_test_list = []
     for test in test_list:
-      packaged_test_list.append(package + '.' + test)
+      packaged_test_list.append(test)
     if package in self.excludedTestsMap:
       self.excludedTestsMap[package] += packaged_test_list
     else:
diff --git a/tools/vm-tests-tf/Android.mk b/tools/vm-tests-tf/Android.mk
index 88f2a53..b1cbe37 100644
--- a/tools/vm-tests-tf/Android.mk
+++ b/tools/vm-tests-tf/Android.mk
@@ -14,6 +14,28 @@
 
 LOCAL_PATH := $(call my-dir)
 
+# test dex library
+# ============================================================
+include $(CLEAR_VARS)
+
+# custom variables used to generate test description. do not touch!
+LOCAL_SRC_FILES := $(call all-java-files-under, src/dot)
+
+LOCAL_MODULE := cts-tf-dalvik-lib
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LIBRARIES := junit-targetdex
+
+include $(BUILD_JAVA_LIBRARY)
+
+cts-tf-dalvik-lib.jack := $(full_classes_jack)
+
+private_jill_jarjar_asm := $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/,jill-jarjar-asm.jar)
+$(private_jill_jarjar_asm) : PRIVATE_JARJAR_RULES := $(LOCAL_PATH)/jill-jarjar-rules.txt
+$(private_jill_jarjar_asm) : $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/,jill.jar) | $(JARJAR)
+	@echo JarJar: $@
+	$(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@
+
 # buildutil java library
 # ============================================================
 include $(CLEAR_VARS)
@@ -29,31 +51,46 @@
 LOCAL_MODULE_TAGS := optional
 
 LOCAL_JAVA_LIBRARIES := dx dasm cfassembler junit
-LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
+LOCAL_JAVA_LIBRARIES += jack
+
+LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR) $(private_jill_jarjar_asm)
 
 include $(BUILD_HOST_JAVA_LIBRARY)
 
 # Buid android.core.vm-tests-tf.jar
 # ============================================================
 #
+include $(CLEAR_VARS)
+
+LOCAL_JACK_ENABLED := $(strip $(LOCAL_JACK_ENABLED))
 intermediates := $(call intermediates-dir-for,JAVA_LIBRARIES,vm-tests-tf,HOST)
 vmteststf_jar := $(intermediates)/android.core.vm-tests-tf.jar
 vmteststf_dep_jars := $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/, cts-tf-dalvik-buildutil.jar dasm.jar dx.jar cfassembler.jar junit.jar)
+vmteststf_dep_jars += $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/, jack.jar)
+vmteststf_dep_jars += $(private_jill_jarjar_asm)
+
+$(vmteststf_jar): PRIVATE_JACK_VM_ARGS := $(LOCAL_JACK_VM_ARGS)
+$(vmteststf_jar): PRIVATE_JACK_EXTRA_ARGS := $(LOCAL_JACK_EXTRA_ARGS)
+
+ifdef LOCAL_JACK_ENABLED
+    vmteststf_dep_jars += $(cts-tf-dalvik-lib.jack)
+endif
+
 $(vmteststf_jar): PRIVATE_SRC_FOLDER := $(LOCAL_PATH)/src
-$(vmteststf_jar): PRIVATE_LIB_FOLDER := $(LOCAL_PATH)/lib
 $(vmteststf_jar): PRIVATE_INTERMEDIATES_CLASSES := $(call intermediates-dir-for,JAVA_LIBRARIES,cts-tf-dalvik-buildutil,HOST)/classes
 $(vmteststf_jar): PRIVATE_INTERMEDIATES := $(intermediates)/tests
 $(vmteststf_jar): PRIVATE_INTERMEDIATES_DEXCORE_JAR := $(intermediates)/tests/dot/junit/dexcore.jar
 $(vmteststf_jar): PRIVATE_INTERMEDIATES_MAIN_FILES := $(intermediates)/main_files
 $(vmteststf_jar): PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES := $(intermediates)/hostjunit_files
 $(vmteststf_jar): PRIVATE_CLASS_PATH := $(subst $(space),:,$(vmteststf_dep_jars)):$(HOST_JDK_TOOLS_JAR)
-$(vmteststf_jar) : $(vmteststf_dep_jars) $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
+ifndef LOCAL_JACK_ENABLED
+$(vmteststf_jar) : $(vmteststf_dep_jars) $(JACK_JAR) $(JILL_JAR) $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
 	$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
 	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit $(dir $(PRIVATE_INTERMEDIATES_DEXCORE_JAR))
 	# generated and compile the host side junit tests
 	@echo "Write generated Main_*.java files to $(PRIVATE_INTERMEDIATES_MAIN_FILES)"
 	$(hide) java -cp $(PRIVATE_CLASS_PATH) util.build.BuildDalvikSuite $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) \
-		$(HOST_OUT_JAVA_LIBRARIES)/cts-tf-dalvik-buildutil.jar:$(PRIVATE_LIB_FOLDER)/junit.jar:$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar \
+		$(HOST_OUT_JAVA_LIBRARIES)/cts-tf-dalvik-buildutil.jar:$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar \
 		$(PRIVATE_INTERMEDIATES_MAIN_FILES) $(PRIVATE_INTERMEDIATES_CLASSES) $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES) $$RUN_VM_TESTS_RTO
 	@echo "Generate $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)"
 	$(hide) jar -cf $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar \
@@ -62,6 +99,26 @@
 		$(if $(NO_OPTIMIZE_DX), --no-optimize) $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar && rm -f $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar
 	$(hide) cd $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/classes && zip -q -r ../../android.core.vm-tests-tf.jar .
 	$(hide) cd $(dir $@) && zip -q -r android.core.vm-tests-tf.jar tests
+else # LOCAL_JACK_ENABLED
+$(vmteststf_jar) : $(vmteststf_dep_jars) $(JACK_JAR) $(JILL_JAR) $(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON)/classes.jack $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
+	$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
+	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit $(dir $(PRIVATE_INTERMEDIATES_DEXCORE_JAR))
+	# generated and compile the host side junit tests
+	@echo "Write generated Main_*.java files to $(PRIVATE_INTERMEDIATES_MAIN_FILES)"
+	$(hide) java -cp $(PRIVATE_CLASS_PATH) util.build.JackBuildDalvikSuite $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) \
+		$(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON)/classes.jack:$(cts-tf-dalvik-lib.jack):$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar \
+		$(PRIVATE_INTERMEDIATES_MAIN_FILES) $(PRIVATE_INTERMEDIATES_CLASSES) $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES) $$RUN_VM_TESTS_RTO
+	@echo "Generate $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)"
+	$(hide) jar -cf $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar \
+		$(addprefix -C $(PRIVATE_INTERMEDIATES_CLASSES) , dot/junit/DxUtil.class dot/junit/DxAbstractMain.class)
+	$(hide) $(JILL) --output $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar
+	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp
+	$(hide) $(call call-jack,$(PRIVATE_JACK_VM_ARGS),$(PRIVATE_JACK_EXTRA_ARGS)) --output-dex $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp \
+		$(if $(NO_OPTIMIZE_DX), -D jack.dex.optimize "false") --import $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack && rm -f $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack
+	$(hide) cd $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp && zip -q -r $(abspath $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)) .
+	$(hide) cd $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/classes && zip -q -r ../../android.core.vm-tests-tf.jar .
+	$(hide) cd $(dir $@) && zip -q -r android.core.vm-tests-tf.jar tests
+endif # LOCAL_JACK_ENABLED
 
 # Clean up temp vars
 intermediates :=
diff --git a/tools/vm-tests-tf/jill-jarjar-rules.txt b/tools/vm-tests-tf/jill-jarjar-rules.txt
new file mode 100644
index 0000000..ee6f403
--- /dev/null
+++ b/tools/vm-tests-tf/jill-jarjar-rules.txt
@@ -0,0 +1 @@
+rule org.objectweb.** com.android.jill.@0
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
index 63794df..0e31884 100644
--- a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
+++ b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
@@ -78,6 +78,7 @@
 
     private int testClassCnt = 0;
     private int testMethodsCnt = 0;
+    private boolean useJack;
 
     /*
      * using a linked hashmap to keep the insertion order for iterators.
@@ -101,39 +102,47 @@
      */
     public static void main(String[] args) throws IOException {
 
-        if (args.length > 5) {
-            JAVASRC_FOLDER = args[0];
-            OUTPUT_FOLDER = args[1];
-            CLASS_PATH = args[2];
-            MAIN_SRC_OUTPUT_FOLDER = args[3];
-            CLASSES_OUTPUT_FOLDER = MAIN_SRC_OUTPUT_FOLDER + "/classes";
-
-            COMPILED_CLASSES_FOLDER = args[4];
-
-            HOSTJUNIT_SRC_OUTPUT_FOLDER = args[5];
-            HOSTJUNIT_CLASSES_OUTPUT_FOLDER = HOSTJUNIT_SRC_OUTPUT_FOLDER + "/classes";
-
-            if (args.length > 6) {
-                // optional: restrict to e.g. "opcodes.add_double"
-                restrictTo = args[6];
-                System.out.println("restricting build to: " + restrictTo);
-            }
-
-        } else {
-            System.out.println("usage: java-src-folder output-folder classpath " +
-                    "generated-main-files compiled_output generated-main-files " +
-            "[restrict-to-opcode]");
-            System.exit(-1);
-        }
+        parseArgs(args);
 
         long start = System.currentTimeMillis();
-        BuildDalvikSuite cat = new BuildDalvikSuite();
+        BuildDalvikSuite cat = new BuildDalvikSuite(false);
         cat.compose();
         long end = System.currentTimeMillis();
 
         System.out.println("elapsed seconds: " + (end - start) / 1000);
     }
 
+    public static void parseArgs(String[] args) {
+      if (args.length > 5) {
+          JAVASRC_FOLDER = args[0];
+          OUTPUT_FOLDER = args[1];
+          CLASS_PATH = args[2];
+          MAIN_SRC_OUTPUT_FOLDER = args[3];
+          CLASSES_OUTPUT_FOLDER = MAIN_SRC_OUTPUT_FOLDER + "/classes";
+
+          COMPILED_CLASSES_FOLDER = args[4];
+
+          HOSTJUNIT_SRC_OUTPUT_FOLDER = args[5];
+          HOSTJUNIT_CLASSES_OUTPUT_FOLDER = HOSTJUNIT_SRC_OUTPUT_FOLDER + "/classes";
+
+          if (args.length > 6) {
+              // optional: restrict to e.g. "opcodes.add_double"
+              restrictTo = args[6];
+              System.out.println("restricting build to: " + restrictTo);
+          }
+
+      } else {
+          System.out.println("usage: java-src-folder output-folder classpath " +
+                  "generated-main-files compiled_output generated-main-files " +
+          "[restrict-to-opcode]");
+          System.exit(-1);
+      }
+    }
+
+    public BuildDalvikSuite(boolean useJack) {
+      this.useJack = useJack;
+    }
+
     public void compose() throws IOException {
         System.out.println("Collecting all junit tests...");
         new TestRunner() {
@@ -182,19 +191,21 @@
         li.add(method);
     }
     private String curJunitFileName = null;
+    private String curJunitName = null;
     private String curJunitFileData = "";
 
-    private JavacBuildStep javacHostJunitBuildStep;
+    private SourceBuildStep hostJunitBuildStep;
 
     private void flushHostJunitFile() {
         if (curJunitFileName != null) {
             File toWrite = new File(curJunitFileName);
             String absPath = toWrite.getAbsolutePath();
             // add to java source files for later compilation
-            javacHostJunitBuildStep.addSourceFile(absPath);
+            hostJunitBuildStep.addSourceFile(absPath);
             // write file
             curJunitFileData += "\n}\n";
             writeToFileMkdir(toWrite, curJunitFileData);
+
             curJunitFileName = null;
             curJunitFileData = "";
         }
@@ -274,11 +285,11 @@
         String datafileContent = "";
         Set<BuildStep> targets = new TreeSet<BuildStep>();
 
-        javacHostJunitBuildStep = new JavacBuildStep(HOSTJUNIT_CLASSES_OUTPUT_FOLDER, CLASS_PATH);
+        SourceBuildStep srcBuildStep;
+        hostJunitBuildStep = new JavacBuildStep(
+            HOSTJUNIT_CLASSES_OUTPUT_FOLDER, CLASS_PATH);
 
-
-        JavacBuildStep javacBuildStep = new JavacBuildStep(
-                CLASSES_OUTPUT_FOLDER, CLASS_PATH);
+        srcBuildStep = new JavacBuildStep(CLASSES_OUTPUT_FOLDER, CLASS_PATH);
 
         for (Entry<String, List<String>> entry : map.entrySet()) {
 
@@ -341,19 +352,25 @@
                 "    public static void main(String[] args) throws Exception {" +
                 methodContent + "\n}\n";
 
-                String fileName = getFileName(pName, method, ".java");
                 File sourceFile = getFileFromPackage(pName, method);
 
-                File classFile = new File(CLASSES_OUTPUT_FOLDER + "/" +
-                        getFileName(pName, method, ".class"));
-                // if (sourceFile.lastModified() > classFile.lastModified()) {
                 writeToFile(sourceFile, content);
-                javacBuildStep.addSourceFile(sourceFile.getAbsolutePath());
+                if (useJack) {
+                    File jackFile = new File(CLASSES_OUTPUT_FOLDER + "/" +
+                            getFileName(pName, method, ".jack"));
+                    JackBuildStep step = new JackBuildStep(jackFile.getAbsolutePath(), CLASS_PATH);
+                    step.addSourceFile(sourceFile.getAbsolutePath());
+                    if (!step.build()) {
+                        System.out.println("main src dalvik-cts-buildutil build step failed");
+                        System.exit(1);
+                    }
+                } else {
+                    srcBuildStep.addSourceFile(sourceFile.getAbsolutePath());
+                }
 
                 BuildStep dexBuildStep = generateDexBuildStep(
-                        CLASSES_OUTPUT_FOLDER, getFileName(pName, method, ""));
+                        CLASSES_OUTPUT_FOLDER, getFileName(pName, method, ""), null);
                 targets.add(dexBuildStep);
-                // }
 
 
                 // prepare the entry in the data file for the bash script.
@@ -449,22 +466,23 @@
         scriptDataDir.mkdirs();
         writeToFile(new File(scriptDataDir, "scriptdata"), datafileContent);
 
-        if (!javacHostJunitBuildStep.build()) {
+        if (!hostJunitBuildStep.build()) {
             System.out.println("main javac cts-host-hostjunit-classes build step failed");
             System.exit(1);
         }
 
-        if (javacBuildStep.build()) {
-            for (BuildStep buildStep : targets) {
-                if (!buildStep.build()) {
-                    System.out.println("building failed. buildStep: " +
-                            buildStep.getClass().getName() + ", " + buildStep);
-                    System.exit(1);
-                }
+        if (!useJack) {
+            if (!srcBuildStep.build()) {
+                System.out.println("main src dalvik-cts-buildutil build step failed");
+                System.exit(1);
             }
-        } else {
-            System.out.println("main javac dalvik-cts-buildutil build step failed");
-            System.exit(1);
+        }
+        for (BuildStep buildStep : targets) {
+            if (!buildStep.build()) {
+                System.out.println("building failed. buildStep: " +
+                        buildStep.getClass().getName() + ", " + buildStep);
+                System.exit(1);
+            }
         }
     }
 
@@ -521,19 +539,37 @@
             return;
         }
 
-        if (new File(sourceFolder, fileName + ".java").exists()) {
-
+        File srcFile = new File(sourceFolder, fileName + ".java");
+        if (srcFile.exists()) {
+            JackBuildStep jackBuildStep = null;
+            if (useJack) {
+                jackBuildStep = new JackBuildStep(
+                        COMPILED_CLASSES_FOLDER + File.separator + fileName + ".jack",
+                        CLASS_PATH);
+                jackBuildStep.addSourceFile(srcFile.getAbsolutePath());
+            }
             BuildStep dexBuildStep = generateDexBuildStep(
-                    COMPILED_CLASSES_FOLDER, fileName);
+                COMPILED_CLASSES_FOLDER, fileName, jackBuildStep);
             targets.add(dexBuildStep);
             return;
         }
 
         try {
             if (Class.forName(dependentTestClassName) != null) {
+                JillBuildStep jillBuildStep = null;
+                if (useJack) {
+                    BuildStep.BuildFile classFile = new BuildStep.BuildFile(
+                        COMPILED_CLASSES_FOLDER, fileName + ".class");
 
+                    BuildStep.BuildFile jackFile = new BuildStep.BuildFile(
+                        COMPILED_CLASSES_FOLDER,
+                        fileName + ".jack");
+
+                    jillBuildStep = new JillBuildStep(classFile,
+                        jackFile);
+                }
                 BuildStep dexBuildStep = generateDexBuildStep(
-                        COMPILED_CLASSES_FOLDER, fileName);
+                    COMPILED_CLASSES_FOLDER, fileName, jillBuildStep);
                 targets.add(dexBuildStep);
                 return;
             }
@@ -546,24 +582,50 @@
     }
 
     private BuildStep generateDexBuildStep(String classFileFolder,
-            String classFileName) {
-        BuildStep.BuildFile classFile = new BuildStep.BuildFile(
-                classFileFolder, classFileName + ".class");
+            String classFileName, BuildStep dependency) {
+        if (!useJack) {
+            BuildStep.BuildFile classFile = new BuildStep.BuildFile(
+                    classFileFolder, classFileName + ".class");
 
-        BuildStep.BuildFile tmpJarFile = new BuildStep.BuildFile(OUTPUT_FOLDER,
-                classFileName + "_tmp.jar");
+            BuildStep.BuildFile tmpJarFile = new BuildStep.BuildFile(
+                    OUTPUT_FOLDER,
+                    classFileName + "_tmp.jar");
 
-        JarBuildStep jarBuildStep = new JarBuildStep(classFile, classFileName +
-                ".class", tmpJarFile, false);
+            JarBuildStep jarBuildStep = new JarBuildStep(classFile,
+                    classFileName + ".class", tmpJarFile, false);
 
-        BuildStep.BuildFile outputFile = new BuildStep.BuildFile(OUTPUT_FOLDER,
-                classFileName + ".jar");
+            if (dependency != null) {
+                jarBuildStep.addChild(dependency);
+            }
 
-        DexBuildStep dexBuildStep = new DexBuildStep(tmpJarFile, outputFile,
-                true);
+            BuildStep.BuildFile outputFile = new BuildStep.BuildFile(
+                    OUTPUT_FOLDER,
+                    classFileName + ".jar");
 
-        dexBuildStep.addChild(jarBuildStep);
-        return dexBuildStep;
+            DxBuildStep dexBuildStep = new DxBuildStep(tmpJarFile,
+                    outputFile,
+                    true);
+
+            dexBuildStep.addChild(jarBuildStep);
+            return dexBuildStep;
+        } else {
+          BuildStep.BuildFile jackFile = new BuildStep.BuildFile(
+              classFileFolder, classFileName + ".jack");
+
+          BuildStep.BuildFile outputFile = new BuildStep.BuildFile(
+                  OUTPUT_FOLDER,
+                  classFileName + ".jar");
+
+          JackDexBuildStep dexBuildStep = new JackDexBuildStep(jackFile,
+                  outputFile,
+                  true);
+
+          if (dependency != null) {
+              dexBuildStep.addChild(dependency);
+          }
+          return dexBuildStep;
+
+        }
 
     }
 
@@ -754,7 +816,7 @@
 
     private void writeToFile(File file, String content) {
         try {
-            if (file.length() == content.length()) {
+            if (file.exists() && file.length() == content.length()) {
                 FileReader reader = new FileReader(file);
                 char[] charContents = new char[(int) file.length()];
                 reader.read(charContents);
diff --git a/tools/vm-tests-tf/src/util/build/DexBuildStep.java b/tools/vm-tests-tf/src/util/build/DxBuildStep.java
similarity index 93%
rename from tools/vm-tests-tf/src/util/build/DexBuildStep.java
rename to tools/vm-tests-tf/src/util/build/DxBuildStep.java
index 6aba51c..6e347b2 100644
--- a/tools/vm-tests-tf/src/util/build/DexBuildStep.java
+++ b/tools/vm-tests-tf/src/util/build/DxBuildStep.java
@@ -19,11 +19,11 @@
 import com.android.dx.command.dexer.Main;
 import java.io.IOException;
 
-public class DexBuildStep extends BuildStep {
+public class DxBuildStep extends BuildStep {
 
     private final boolean deleteInputFileAfterBuild;
 
-    DexBuildStep(BuildFile inputFile, BuildFile outputFile,
+    DxBuildStep(BuildFile inputFile, BuildFile outputFile,
             boolean deleteInputFileAfterBuild) {
         super(inputFile, outputFile);
         this.deleteInputFileAfterBuild = deleteInputFileAfterBuild;
@@ -71,7 +71,7 @@
     @Override
     public boolean equals(Object obj) {
         if (super.equals(obj)) {
-            DexBuildStep other = (DexBuildStep) obj;
+            DxBuildStep other = (DxBuildStep) obj;
 
             return inputFile.equals(other.inputFile)
                     && outputFile.equals(other.outputFile);
diff --git a/tools/vm-tests-tf/src/util/build/JackBuildDalvikSuite.java b/tools/vm-tests-tf/src/util/build/JackBuildDalvikSuite.java
new file mode 100644
index 0000000..a508e5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JackBuildDalvikSuite.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package util.build;
+
+import java.io.IOException;
+
+public class JackBuildDalvikSuite {
+
+    public static void main(String[] args) throws IOException {
+
+        BuildDalvikSuite.parseArgs(args);
+
+        long start = System.currentTimeMillis();
+        BuildDalvikSuite cat = new BuildDalvikSuite(true);
+        cat.compose();
+        long end = System.currentTimeMillis();
+
+        System.out.println("elapsed seconds: " + (end - start) / 1000);
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/JackBuildStep.java b/tools/vm-tests-tf/src/util/build/JackBuildStep.java
new file mode 100644
index 0000000..1e1ede6
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JackBuildStep.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package util.build;
+
+import com.android.jack.Jack;
+import com.android.jack.Main;
+import com.android.jack.Options;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class JackBuildStep extends SourceBuildStep {
+
+    private final String destPath;
+    private final String classPath;
+    private final Set<String> sourceFiles = new HashSet<String>();
+
+    public JackBuildStep(String destPath, String classPath) {
+        this.destPath = destPath;
+        this.classPath = classPath;
+    }
+
+    @Override
+    public void addSourceFile(String sourceFile) {
+        sourceFiles.add(sourceFile);
+    }
+
+    @Override
+    boolean build() {
+        if (super.build()) {
+            if (sourceFiles.isEmpty()) {
+                return true;
+            }
+
+            File outDir = new File(destPath).getParentFile();
+            if (!outDir.exists() && !outDir.mkdirs()) {
+                System.err.println("failed to create output dir: "
+                        + outDir.getAbsolutePath());
+                return false;
+            }
+            List<String> commandLine = new ArrayList(4 + sourceFiles.size());
+            commandLine.add("--verbose");
+            commandLine.add("error");
+            commandLine.add("--classpath");
+            commandLine.add(classPath);
+            commandLine.add("--output-jack");
+            commandLine.add(destPath);
+            commandLine.addAll(sourceFiles);
+
+            try {
+                Options options = Main.parseCommandLine(commandLine);
+                Jack.checkAndRun(options);
+            } catch (Throwable ex) {
+                ex.printStackTrace();
+                return false;
+            }
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            JackBuildStep other = (JackBuildStep) obj;
+            return destPath.equals(other.destPath) && classPath.equals(other.classPath)
+                    && sourceFiles.equals(other.sourceFiles);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return destPath.hashCode() ^ classPath.hashCode() ^ sourceFiles.hashCode();
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/JackDexBuildStep.java b/tools/vm-tests-tf/src/util/build/JackDexBuildStep.java
new file mode 100644
index 0000000..304eaa0
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JackDexBuildStep.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package util.build;
+
+import com.android.jack.Jack;
+import com.android.jack.Main;
+import com.android.jack.Options;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class JackDexBuildStep extends BuildStep {
+
+    private final boolean deleteInputFileAfterBuild;
+
+    JackDexBuildStep(BuildFile inputFile, BuildFile outputFile,
+            boolean deleteInputFileAfterBuild) {
+        super(inputFile, outputFile);
+        this.deleteInputFileAfterBuild = deleteInputFileAfterBuild;
+    }
+
+    @Override
+    boolean build() {
+
+        if (super.build()) {
+            String outputFilePath = outputFile.fileName.getAbsolutePath();
+            if (outputFilePath.endsWith(".dex")) {
+              throw new AssertionError(
+                  "DexBuildStep does not support dex output outside of an archive");
+            }
+
+            File outDir = outputFile.fileName.getParentFile();
+            if (!outDir.exists() && !outDir.mkdirs()) {
+                System.err.println("failed to create output dir: "
+                        + outDir.getAbsolutePath());
+                return false;
+            }
+
+            List<String> commandLine = new ArrayList<String>(4);
+            commandLine.add("--verbose");
+            commandLine.add("error");
+            commandLine.add("--output-dex-zip");
+            commandLine.add(outputFilePath);
+            commandLine.add("--import");
+            commandLine.add(inputFile.fileName.getAbsolutePath());
+
+            try {
+               Options options = Main.parseCommandLine(commandLine);
+               Jack.checkAndRun(options);
+                if (deleteInputFileAfterBuild) {
+                    inputFile.fileName.delete();
+                }
+                return true;
+            } catch (Throwable ex) {
+                System.err.println("exception while dexing "
+                        + inputFile.fileName.getAbsolutePath() + " to "
+                        + outputFile.fileName.getAbsolutePath());
+                ex.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return inputFile.hashCode() ^ outputFile.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            JackDexBuildStep other = (JackDexBuildStep) obj;
+
+            return inputFile.equals(other.inputFile)
+                    && outputFile.equals(other.outputFile);
+        }
+        return false;
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/util/build/JavacBuildStep.java b/tools/vm-tests-tf/src/util/build/JavacBuildStep.java
index 7d7033f..d08a2c6 100644
--- a/tools/vm-tests-tf/src/util/build/JavacBuildStep.java
+++ b/tools/vm-tests-tf/src/util/build/JavacBuildStep.java
@@ -23,7 +23,7 @@
 import java.util.HashSet;
 import java.util.Set;
 
-public class JavacBuildStep extends BuildStep {
+public class JavacBuildStep extends SourceBuildStep {
 
     private final String destPath;
     private final String classPath;
@@ -32,12 +32,13 @@
         this.destPath = destPath;
         this.classPath = classPath;
     }
-    
+
+    @Override
     public void addSourceFile(String sourceFile)
     {
         sourceFiles.add(sourceFile);
     }
-    
+
     @Override
     boolean build() {
         if (super.build())
@@ -46,7 +47,7 @@
             {
                 return true;
             }
-            
+
             File destFile = new File(destPath);
             if (!destFile.exists() && !destFile.mkdirs())
             {
@@ -59,13 +60,12 @@
             commandLine[1] = classPath;
             commandLine[2] = "-d";
             commandLine[3] = destPath;
-             
+
             String[] files = new String[sourceFiles.size()];
             sourceFiles.toArray(files);
-            
+
             System.arraycopy(files, 0, commandLine, args, files.length);
-            
-            
+
             return Main.compile(commandLine, new PrintWriter(System.err)) == 0;
         }
         return false;
@@ -73,17 +73,16 @@
 
     @Override
     public boolean equals(Object obj) {
-        // TODO Auto-generated method stub
         if (super.equals(obj))
         {
             JavacBuildStep other = (JavacBuildStep) obj;
-            return destPath.equals(other.destPath) 
+            return destPath.equals(other.destPath)
                 && classPath.equals(other.classPath)
                 && sourceFiles.equals(other.sourceFiles);
         }
         return false;
     }
-    
+
     @Override
     public int hashCode() {
         return destPath.hashCode() ^ classPath.hashCode() ^ sourceFiles.hashCode();
diff --git a/tools/vm-tests-tf/src/util/build/JillBuildStep.java b/tools/vm-tests-tf/src/util/build/JillBuildStep.java
new file mode 100644
index 0000000..d2e435e
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JillBuildStep.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package util.build;
+
+import com.android.jill.Jill;
+import com.android.jill.Main;
+import com.android.jill.Options;
+
+import java.io.File;
+
+public class JillBuildStep extends BuildStep {
+
+    JillBuildStep(BuildFile inputFile, BuildFile outputFile) {
+        super(inputFile, outputFile);
+    }
+
+    @Override
+    boolean build() {
+        if (super.build()) {
+
+            File outDir = outputFile.fileName.getParentFile();
+            if (!outDir.exists() && !outDir.mkdirs()) {
+                System.err.println("failed to create output dir: "
+                        + outDir.getAbsolutePath());
+                return false;
+            }
+
+            int args = 3;
+            String[] commandLine = new String[args];
+            commandLine[0] = "--output";
+            commandLine[1] = outputFile.fileName.getAbsolutePath();
+            commandLine[2] = inputFile.fileName.getAbsolutePath();
+
+            try {
+                Options options = Main.getOptions(commandLine);
+                Jill.process(options);
+            } catch (Throwable ex) {
+                ex.printStackTrace();
+                return false;
+            }
+
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            JillBuildStep other = (JillBuildStep) obj;
+
+            return inputFile.equals(other.inputFile) && outputFile.equals(other.outputFile);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return inputFile.hashCode() ^ outputFile.hashCode();
+    }
+}
diff --git a/tests/print/src/android/print/cts/IPrivilegedOperations.aidl b/tools/vm-tests-tf/src/util/build/SourceBuildStep.java
similarity index 74%
rename from tests/print/src/android/print/cts/IPrivilegedOperations.aidl
rename to tools/vm-tests-tf/src/util/build/SourceBuildStep.java
index 93c8c3e..4a68a05 100644
--- a/tests/print/src/android/print/cts/IPrivilegedOperations.aidl
+++ b/tools/vm-tests-tf/src/util/build/SourceBuildStep.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2008 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,10 @@
  * limitations under the License.
  */
 
-package android.print.cts;
+package util.build;
 
-interface IPrivilegedOperations {
-    boolean clearApplicationUserData(String packageName);
+public abstract class SourceBuildStep extends BuildStep {
+
+  public abstract void addSourceFile(String sourceFile);
+
 }